3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-06-24 23:03:41 +00:00

Actually revert boolean decisions

This commit is contained in:
Jakob Rath 2023-01-04 11:59:14 +01:00
parent db1be0f247
commit 0daf444cec
2 changed files with 9 additions and 6 deletions

View file

@ -603,6 +603,9 @@ namespace polysat {
size_t undefs = count_if(cl, [&](sat::literal lit) { return !m_bvars.is_assigned(lit); }); size_t undefs = count_if(cl, [&](sat::literal lit) { return !m_bvars.is_assigned(lit); });
if (undefs >= 2) if (undefs >= 2)
m_lemmas.push_back(&cl); m_lemmas.push_back(&cl);
else {
SASSERT_EQ(undefs, 0); // if !is_true && undefs == 1 then we missed a propagation.
}
} }
} }
#endif #endif
@ -883,12 +886,13 @@ namespace polysat {
void solver::revert_decision(pvar v) { void solver::revert_decision(pvar v) {
unsigned max_jump_level = get_level(v) - 1; unsigned max_jump_level = get_level(v) - 1;
backjump_and_learn(max_jump_level); backjump_and_learn(max_jump_level, false);
} }
void solver::revert_bool_decision(sat::literal const lit) { void solver::revert_bool_decision(sat::literal const lit) {
unsigned max_jump_level = m_bvars.level(lit) - 1; unsigned max_jump_level = m_bvars.level(lit) - 1;
backjump_and_learn(max_jump_level); backjump_and_learn(max_jump_level, true);
SASSERT(m_level < max_jump_level || m_bvars.is_false(lit));
} }
std::optional<lemma_score> solver::compute_lemma_score(clause const& lemma) { std::optional<lemma_score> solver::compute_lemma_score(clause const& lemma) {
@ -938,7 +942,7 @@ namespace polysat {
return {{jump_level, branching_factor}}; return {{jump_level, branching_factor}};
} }
void solver::backjump_and_learn(unsigned max_jump_level) { void solver::backjump_and_learn(unsigned max_jump_level, bool force_fallback_lemma) {
sat::literal_vector narrow_queue = m_conflict.take_narrow_queue(); sat::literal_vector narrow_queue = m_conflict.take_narrow_queue();
clause_ref_vector lemmas = m_conflict.take_lemmas(); clause_ref_vector lemmas = m_conflict.take_lemmas();
@ -963,7 +967,7 @@ namespace polysat {
for (clause* lemma : lemmas) for (clause* lemma : lemmas)
appraise_lemma(lemma); appraise_lemma(lemma);
if (!best_lemma || best_score.jump_level() > max_jump_level) { if (force_fallback_lemma || !best_lemma || best_score.jump_level() > max_jump_level) {
// No (good) lemma has been found, so build the fallback lemma from the conflict state. // No (good) lemma has been found, so build the fallback lemma from the conflict state.
lemmas.push_back(m_conflict.build_lemma()); lemmas.push_back(m_conflict.build_lemma());
appraise_lemma(lemmas.back()); appraise_lemma(lemmas.back());

View file

@ -275,8 +275,7 @@ namespace polysat {
void resolve_conflict(); void resolve_conflict();
void revert_decision(pvar v); void revert_decision(pvar v);
void revert_bool_decision(sat::literal lit); void revert_bool_decision(sat::literal lit);
void backjump_and_learn(unsigned jump_level, clause& lemma); void backjump_and_learn(unsigned max_jump_level, bool force_fallback_lemma);
void backjump_and_learn(unsigned max_jump_level);
std::optional<lemma_score> compute_lemma_score(clause const& lemma); std::optional<lemma_score> compute_lemma_score(clause const& lemma);
// activity of variables based on standard VSIDS // activity of variables based on standard VSIDS