mirror of
https://github.com/Z3Prover/z3
synced 2026-03-18 02:53:46 +00:00
enable concurrent sls with new solver core
allow using sls engine (for bit-vectors) with the new core. Examples z3 sat.smt=true tactic.default_tactic=smt /v:1 smt.sls.enable=true smt.bv.solver=0 /st C:\QF_BV_SAT\bench_10.smt2 z3 sat.smt=true tactic.default_tactic=smt /v:1 smt.sls.enable=true smt.bv.solver=2 /st C:\QF_BV_SAT\bench_10.smt2 z3 C:\QF_BV_SAT\bench_11100.smt2 sat.smt=true tactic.default_tactic=smt /v:1 smt.sls.enable=true smt.bv.solver=2 /st
This commit is contained in:
parent
510534dbd4
commit
c0bdc7cdd6
19 changed files with 206 additions and 83 deletions
|
|
@ -23,38 +23,79 @@ Author:
|
|||
namespace sls {
|
||||
|
||||
solver::solver(euf::solver& ctx):
|
||||
th_euf_solver(ctx, symbol("sls"), ctx.get_manager().mk_family_id("sls")) {}
|
||||
th_euf_solver(ctx, symbol("sls"), ctx.get_manager().mk_family_id("sls")),
|
||||
m_units(m) {}
|
||||
|
||||
solver::~solver() {
|
||||
if (m_bvsls) {
|
||||
m_bvsls->cancel();
|
||||
finalize();
|
||||
}
|
||||
|
||||
void solver::finalize() {
|
||||
if (!m_completed && m_bvsls) {
|
||||
m_bvsls->cancel();
|
||||
m_thread.join();
|
||||
m_bvsls->collect_statistics(m_st);
|
||||
m_bvsls = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
void solver::push_core() {
|
||||
if (s().scope_lvl() == s().search_lvl() + 1)
|
||||
init_local_search();
|
||||
}
|
||||
|
||||
void solver::pop_core(unsigned n) {
|
||||
if (s().scope_lvl() - n <= s().search_lvl())
|
||||
sample_local_search();
|
||||
sat::check_result solver::check() {
|
||||
|
||||
return sat::check_result::CR_DONE;
|
||||
}
|
||||
|
||||
void solver::simplify() {
|
||||
|
||||
void solver::simplify() {
|
||||
}
|
||||
|
||||
bool solver::unit_propagate() {
|
||||
force_push();
|
||||
sample_local_search();
|
||||
return false;
|
||||
}
|
||||
|
||||
bool solver::is_unit(expr* e) {
|
||||
if (!e)
|
||||
return false;
|
||||
m.is_not(e, e);
|
||||
if (is_uninterp_const(e))
|
||||
return true;
|
||||
bv_util bu(m);
|
||||
expr* s;
|
||||
if (bu.is_bit2bool(e, s))
|
||||
return is_uninterp_const(s);
|
||||
return false;
|
||||
}
|
||||
|
||||
void solver::push_core() {
|
||||
|
||||
}
|
||||
|
||||
void solver::pop_core(unsigned n) {
|
||||
for (; m_trail_lim < s().init_trail_size(); ++m_trail_lim) {
|
||||
auto lit = s().trail_literal(m_trail_lim);
|
||||
auto e = ctx.literal2expr(lit);
|
||||
if (is_unit(e)) {
|
||||
// IF_VERBOSE(1, verbose_stream() << "add unit " << mk_pp(e, m) << "\n");
|
||||
std::lock_guard<std::mutex> lock(m_mutex);
|
||||
m_units.push_back(e);
|
||||
m_has_units = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void solver::init_search() {
|
||||
init_local_search();
|
||||
}
|
||||
|
||||
void solver::init_local_search() {
|
||||
if (m_bvsls) {
|
||||
m_bvsls->cancel();
|
||||
m_thread.join();
|
||||
if (m_result == l_true) {
|
||||
verbose_stream() << "Found model using local search - INIT\n";
|
||||
exit(1);
|
||||
}
|
||||
m_result = l_undef;
|
||||
m_completed = false;
|
||||
m_has_units = false;
|
||||
m_model = nullptr;
|
||||
m_units.reset();
|
||||
}
|
||||
// set up state for local search solver here
|
||||
|
||||
|
|
@ -64,43 +105,12 @@ namespace sls {
|
|||
params_ref p;
|
||||
m_completed = false;
|
||||
m_result = l_undef;
|
||||
m_model = nullptr;
|
||||
m_bvsls = alloc(bv::sls, *m_m, p);
|
||||
// walk clauses, add them
|
||||
// walk trail stack until search level, add units
|
||||
// encapsulate bvsls within the arguments of run-local-search.
|
||||
// ensure bvsls does not touch ast-manager.
|
||||
|
||||
for (expr* a : ctx.get_assertions())
|
||||
m_bvsls->assert_expr(tr(a));
|
||||
|
||||
unsigned trail_sz = s().trail_size();
|
||||
for (unsigned i = 0; i < trail_sz; ++i) {
|
||||
auto lit = s().trail_literal(i);
|
||||
if (s().lvl(lit) > s().search_lvl())
|
||||
break;
|
||||
expr_ref fml = literal2expr(lit);
|
||||
m_bvsls->assert_expr(tr(fml.get()));
|
||||
}
|
||||
unsigned num_vars = s().num_vars();
|
||||
for (unsigned i = 0; i < 2*num_vars; ++i) {
|
||||
auto l1 = ~sat::to_literal(i);
|
||||
auto const& wlist = s().get_wlist(l1);
|
||||
for (sat::watched const& w : wlist) {
|
||||
if (!w.is_binary_non_learned_clause())
|
||||
continue;
|
||||
sat::literal l2 = w.get_literal();
|
||||
if (l1.index() > l2.index())
|
||||
continue;
|
||||
expr_ref fml(m.mk_or(literal2expr(l1), literal2expr(l2)), m);
|
||||
m_bvsls->assert_expr(tr(fml.get()));
|
||||
}
|
||||
}
|
||||
for (auto clause : s().clauses()) {
|
||||
expr_ref_vector cls(m);
|
||||
for (auto lit : *clause)
|
||||
cls.push_back(literal2expr(lit));
|
||||
expr_ref fml(m.mk_or(cls), m);
|
||||
m_bvsls->assert_expr(tr(fml.get()));
|
||||
}
|
||||
|
||||
// use phase assignment from literals?
|
||||
std::function<bool(expr*, unsigned)> eval = [&](expr* e, unsigned r) {
|
||||
return false;
|
||||
};
|
||||
|
|
@ -108,23 +118,42 @@ namespace sls {
|
|||
m_bvsls->init();
|
||||
m_bvsls->init_eval(eval);
|
||||
m_bvsls->updt_params(s().params());
|
||||
|
||||
m_bvsls->init_unit([&]() {
|
||||
if (!m_has_units)
|
||||
return expr_ref(*m_m);
|
||||
expr_ref e(m);
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_mutex);
|
||||
if (m_units.empty())
|
||||
return expr_ref(*m_m);
|
||||
e = m_units.back();
|
||||
m_units.pop_back();
|
||||
}
|
||||
ast_translation tr(m, *m_m);
|
||||
return expr_ref(tr(e.get()), *m_m);
|
||||
});
|
||||
|
||||
m_thread = std::thread([this]() { run_local_search(); });
|
||||
}
|
||||
|
||||
void solver::sample_local_search() {
|
||||
if (m_completed) {
|
||||
m_thread.join();
|
||||
if (m_result == l_true) {
|
||||
verbose_stream() << "Found model using local search\n";
|
||||
exit(1);
|
||||
}
|
||||
if (!m_completed)
|
||||
return;
|
||||
m_thread.join();
|
||||
m_completed = false;
|
||||
m_bvsls->collect_statistics(m_st);
|
||||
if (m_result == l_true) {
|
||||
IF_VERBOSE(2, verbose_stream() << "(sat.sls :model-completed)\n";);
|
||||
auto mdl = m_bvsls->get_model();
|
||||
ast_translation tr(*m_m, m);
|
||||
m_model = mdl->translate(tr);
|
||||
s().set_canceled();
|
||||
}
|
||||
m_bvsls = nullptr;
|
||||
}
|
||||
|
||||
void solver::run_local_search() {
|
||||
lbool r = (*m_bvsls)();
|
||||
m_result = r;
|
||||
m_result = (*m_bvsls)();
|
||||
m_completed = true;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue