3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-08-22 11:07:51 +00:00

move to get_sort as method, add opt_lns pass, disable xor simplification unless configured, fix perf bug in model converter update trail

This commit is contained in:
Nikolaj Bjorner 2021-02-02 03:58:19 -08:00
parent c623e2db28
commit 4455f6caf8
36 changed files with 391 additions and 90 deletions

View file

@ -198,7 +198,7 @@ namespace sat {
s.m_mc.stackv().reset(); // TBD: brittle code
s.add_ate(~u, v);
if (find_binary_watch(wlist, ~v)) {
IF_VERBOSE(10, verbose_stream() << "binary: " << ~u << "\n");
IF_VERBOSE(20, verbose_stream() << "binary: " << ~u << "\n");
s.assign_unit(~u);
}
// could turn non-learned non-binary tautology into learned binary.

View file

@ -60,6 +60,8 @@ namespace sat {
m_phase = PS_SAT_CACHING;
else if (s == symbol("random"))
m_phase = PS_RANDOM;
else if (s == symbol("frozen"))
m_phase = PS_FROZEN;
else
throw sat_param_exception("invalid phase selection strategy: always_false, always_true, basic_caching, caching, random");

View file

@ -28,6 +28,7 @@ namespace sat {
PS_ALWAYS_FALSE,
PS_BASIC_CACHING,
PS_SAT_CACHING,
PS_FROZEN,
PS_RANDOM
};

View file

@ -222,7 +222,6 @@ namespace sat {
e.m_clause.append(c.size(), c.begin());
}
void model_converter::insert(entry & e, clause const & c) {
SASSERT(c.contains(e.var()));
SASSERT(m_entries.begin() <= &e);
@ -345,7 +344,7 @@ namespace sat {
void model_converter::flush(model_converter & src) {
VERIFY(this != &src);
m_entries.append(src.m_entries);
m_exposed_lim = src.m_exposed_lim;
m_exposed_lim += src.m_exposed_lim;
src.m_entries.reset();
src.m_exposed_lim = 0;
}

View file

@ -1682,6 +1682,9 @@ namespace sat {
case PS_BASIC_CACHING:
phase = m_phase[next];
break;
case PS_FROZEN:
phase = m_best_phase[next];
break;
case PS_SAT_CACHING:
if (m_search_state == s_unsat) {
phase = m_phase[next];
@ -2071,6 +2074,7 @@ namespace sat {
if (!was_eliminated(v)) {
m_model[v] = value(v);
m_phase[v] = value(v) == l_true;
m_best_phase[v] = value(v) == l_true;
}
}
TRACE("sat_mc_bug", m_mc.display(tout););
@ -2847,6 +2851,8 @@ namespace sat {
}
void solver::updt_phase_of_vars() {
if (m_config.m_phase == PS_FROZEN)
return;
unsigned from_lvl = m_conflict_lvl;
unsigned head = from_lvl == 0 ? 0 : m_scopes[from_lvl - 1].m_trail_lim;
unsigned sz = m_trail.size();
@ -2912,6 +2918,8 @@ namespace sat {
case PS_ALWAYS_FALSE:
for (auto& p : m_phase) p = false;
break;
case PS_FROZEN:
break;
case PS_BASIC_CACHING:
switch (m_rephase_lim % 4) {
case 0:

View file

@ -1437,6 +1437,10 @@ namespace sat {
bool ba_solver::init_watch(constraint& c) {
if (c.is_xr()) {
std::cout << c.is_xr() << "\n";
}
return !inconsistent() && c.init_watch(*this);
}
@ -2064,8 +2068,10 @@ namespace sat {
for (unsigned sz = m_constraints.size(), i = 0; i < sz; ++i) subsumption(*m_constraints[i]);
for (unsigned sz = m_learned.size(), i = 0; i < sz; ++i) subsumption(*m_learned[i]);
unit_strengthen();
extract_xor();
merge_xor();
if (s().get_config().m_xor_solver) {
extract_xor();
merge_xor();
}
cleanup_clauses();
cleanup_constraints();
update_pure();
@ -2073,6 +2079,8 @@ namespace sat {
}
while (count < 10 && (m_simplify_change || trail_sz < s().init_trail_size()));
gc();
// validate_eliminated();
IF_VERBOSE(1,

View file

@ -72,7 +72,7 @@ struct goal2sat::imp : public sat::sat_internalizer {
expr_ref_vector m_trail;
func_decl_ref_vector m_unhandled_funs;
bool m_default_external;
bool m_xor_solver;
bool m_xor_solver { false };
bool m_euf { false };
bool m_drat { false };
bool m_is_redundant { false };
@ -1020,6 +1020,7 @@ void sat2goal::mc::flush_gmc() {
expr_ref_vector tail(m);
expr_ref def(m);
auto is_literal = [&](expr* e) { expr* r; return is_uninterp_const(e) || (m.is_not(e, r) && is_uninterp_const(r)); };
for (unsigned i = 0; i < updates.size(); ++i) {
sat::literal l = updates[i];
if (l == sat::null_literal) {