diff --git a/src/ast/sls/sat_ddfw.cpp b/src/ast/sls/sat_ddfw.cpp index 410326aa2..e30e62399 100644 --- a/src/ast/sls/sat_ddfw.cpp +++ b/src/ast/sls/sat_ddfw.cpp @@ -564,6 +564,7 @@ namespace sat { double w = calculate_transfer_weight(cn.m_weight); transfer_weight(from_idx, to_idx, w); } + //verbose_stream() << m_shifts << " " << m_flips << " " << shifted << "\n"; if (!shifted) m_reinit_next = m_flips; // DEBUG_CODE(invariant();); diff --git a/src/ast/sls/sat_ddfw.h b/src/ast/sls/sat_ddfw.h index 7dff55a7b..58a05d364 100644 --- a/src/ast/sls/sat_ddfw.h +++ b/src/ast/sls/sat_ddfw.h @@ -88,7 +88,6 @@ namespace sat { svector m_scores; // reward -> score svector m_model; // var -> best assignment unsigned m_init_weight = 2; - vector m_use_list; unsigned_vector m_flat_use_list; unsigned_vector m_use_list_index; @@ -96,6 +95,7 @@ namespace sat { indexed_uint_set m_unsat; indexed_uint_set m_unsat_vars; // set of variables that are in unsat clauses random_gen m_rand; + uint64_t m_last_flips_for_shift = 0; unsigned m_num_non_binary_clauses = 0; unsigned m_restart_count = 0, m_reinit_count = 0; uint64_t m_restart_next = 0, m_reinit_next = 0; diff --git a/src/ast/sls/sls_euf_plugin.cpp b/src/ast/sls/sls_euf_plugin.cpp index 29a301739..5e07f4f4c 100644 --- a/src/ast/sls/sls_euf_plugin.cpp +++ b/src/ast/sls/sls_euf_plugin.cpp @@ -39,12 +39,14 @@ namespace sls { void euf_plugin::initialize() { sls_params sp(ctx.get_params()); - m_incremental = sp.euf_incremental(); + m_incremental_mode = sp.euf_incremental(); + m_incremental = 1 == m_incremental_mode; IF_VERBOSE(2, verbose_stream() << "sls.euf: incremental " << m_incremental << "\n"); } void euf_plugin::start_propagation() { - m_incremental = !m_incremental; + if (m_incremental_mode == 2) + m_incremental = !m_incremental; m_g = alloc(euf::egraph, m); std::function dj = [&](std::ostream& out, void* j) { out << "lit " << to_literal(reinterpret_cast(j)); @@ -100,6 +102,7 @@ namespace sls { g.explain(explain, nullptr); g.end_explain(); double reward = -1; + bool has_flipped = false; TRACE("enf", for (auto p : explain) { sat::literal l = to_literal(p); @@ -115,6 +118,7 @@ namespace sls { if (!lits.contains(~l)) lits.push_back(~l); + if (ctx.reward(l.var()) > reward) n = 0, reward = ctx.reward(l.var()); @@ -122,7 +126,6 @@ namespace sls { flit = l; } - ctx.add_clause(lits); if (flit == sat::null_literal) return; @@ -166,9 +169,7 @@ namespace sls { if (lit.sign()) g.new_diseq(g.find(e), to_ptr(lit)); else - g.merge(g.find(x), g.find(y), to_ptr(lit)); - - // g.merge(g.find(e), g.find(!lit.sign()), to_ptr(lit)); + g.merge(g.find(x), g.find(y), to_ptr(lit)); } else if (!lit.sign() && m.is_distinct(e)) { auto n = to_app(e)->get_num_args(); diff --git a/src/ast/sls/sls_euf_plugin.h b/src/ast/sls/sls_euf_plugin.h index ce0afa529..2e421bec8 100644 --- a/src/ast/sls/sls_euf_plugin.h +++ b/src/ast/sls/sls_euf_plugin.h @@ -43,6 +43,7 @@ namespace sls { bool m_incremental = false; + unsigned m_incremental_mode = 0; stats m_stats; scoped_ptr m_g; diff --git a/src/params/sls_params.pyg b/src/params/sls_params.pyg index 708041db0..356d9f746 100644 --- a/src/params/sls_params.pyg +++ b/src/params/sls_params.pyg @@ -22,7 +22,7 @@ def_module_params('sls', ('early_prune', BOOL, 1, 'use early pruning for score prediction'), ('random_offset', BOOL, 1, 'use random offset for candidate evaluation'), ('rescore', BOOL, 1, 'rescore/normalize top-level score every base restart interval'), - ('euf_incremental', BOOL, False, 'use incremental EUF resolver'), + ('euf_incremental', UINT, 0, '0 non-incremental, 1 incremental, 2 alternating EUF resolver'), ('track_unsat', BOOL, 0, 'keep a list of unsat assertions as done in SAT - currently disabled internally'), ('random_seed', UINT, 0, 'random seed') ))