3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-12 12:08:18 +00:00
This commit is contained in:
Nikolaj Bjorner 2022-02-20 10:30:52 +02:00
parent 91045d3e4a
commit 10b611b3ba

View file

@ -70,7 +70,7 @@ namespace pb {
SASSERT(s().at_base_lvl()); SASSERT(s().at_base_lvl());
if (p.lit() != sat::null_literal && value(p.lit()) == l_false) { if (p.lit() != sat::null_literal && value(p.lit()) == l_false) {
TRACE("ba", tout << "pb: flip sign " << p << "\n";); TRACE("ba", tout << "pb: flip sign " << p << "\n";);
IF_VERBOSE(1, verbose_stream() << "sign is flipped " << p << "\n";); IF_VERBOSE(2, verbose_stream() << "sign is flipped " << p << "\n";);
return; return;
} }
bool nullify = p.lit() != sat::null_literal && value(p.lit()) == l_true; bool nullify = p.lit() != sat::null_literal && value(p.lit()) == l_true;
@ -110,22 +110,21 @@ namespace pb {
} }
} }
else if (true_val >= p.k()) { else if (true_val >= p.k()) {
if (p.lit() != sat::null_literal) { IF_VERBOSE(100, display(verbose_stream() << "assign true literal ", p, true););
IF_VERBOSE(100, display(verbose_stream() << "assign true literal ", p, true);); if (p.lit() != sat::null_literal)
s().assign_scoped(p.lit()); s().assign_scoped(p.lit());
} else
remove_constraint(p, "is true"); remove_constraint(p, "is true");
} }
else if (slack + true_val < p.k()) { else if (slack + true_val < p.k()) {
if (p.lit() != sat::null_literal) { if (p.lit() != sat::null_literal) {
IF_VERBOSE(100, display(verbose_stream() << "assign false literal ", p, true);); IF_VERBOSE(3, display(verbose_stream() << "assign false literal ", p, true););
s().assign_scoped(~p.lit()); s().assign_scoped(~p.lit());
} }
else { else {
IF_VERBOSE(1, verbose_stream() << "unsat during simplification\n";); IF_VERBOSE(1, verbose_stream() << "unsat during simplification\n");
s().set_conflict(sat::justification(0)); s().set_conflict(sat::justification(0));
} }
remove_constraint(p, "is false");
} }
else if (slack + true_val == p.k()) { else if (slack + true_val == p.k()) {
literal_vector lits(p.literals()); literal_vector lits(p.literals());
@ -133,14 +132,16 @@ namespace pb {
remove_constraint(p, "is tight"); remove_constraint(p, "is tight");
} }
else { else {
unsigned sz = p.size(); unsigned sz = p.size();
clear_watch(p); clear_watch(p);
unsigned j = 0; unsigned j = 0;
for (unsigned i = 0; i < sz; ++i) { for (unsigned i = 0; i < sz; ++i) {
literal l = p.get_lit(i); literal l = p.get_lit(i);
if (value(l) == l_undef) { if (value(l) == l_undef) {
if (i != j) p.swap(i, j); if (i != j)
++j; p.swap(i, j);
++j;
} }
} }
sz = j; sz = j;
@ -168,6 +169,7 @@ namespace pb {
_bad_id = 11111111; _bad_id = 11111111;
SASSERT(p.well_formed()); SASSERT(p.well_formed());
m_simplify_change = true; m_simplify_change = true;
} }
} }
@ -2036,7 +2038,7 @@ namespace pb {
m_constraint_to_reinit.shrink(sz); m_constraint_to_reinit.shrink(sz);
} }
void solver::simplify() { void solver::simplify() {
if (!s().at_base_lvl()) if (!s().at_base_lvl())
s().pop_to_base_level(); s().pop_to_base_level();
if (s().inconsistent()) if (s().inconsistent())
@ -2193,7 +2195,7 @@ namespace pb {
} }
} }
bool solver::set_root(literal l, literal r) { bool solver::set_root(literal l, literal r) {
if (s().is_assumption(l.var())) if (s().is_assumption(l.var()))
return false; return false;
reserve_roots(); reserve_roots();
@ -2206,17 +2208,18 @@ namespace pb {
} }
void solver::flush_roots() { void solver::flush_roots() {
if (m_roots.empty()) return; if (m_roots.empty())
return;
reserve_roots(); reserve_roots();
// validate(); DEBUG_CODE(validate(););
m_constraint_removed = false; m_constraint_removed = false;
for (unsigned sz = m_constraints.size(), i = 0; i < sz; ++i) for (unsigned sz = m_constraints.size(), i = 0; i < sz; ++i)
flush_roots(*m_constraints[i]); flush_roots(*m_constraints[i]);
for (unsigned sz = m_learned.size(), i = 0; i < sz; ++i) for (unsigned sz = m_learned.size(), i = 0; i < sz; ++i)
flush_roots(*m_learned[i]); flush_roots(*m_learned[i]);
cleanup_constraints(); cleanup_constraints();
// validate(); DEBUG_CODE(validate(););
// validate_eliminated(); DEBUG_CODE(validate_eliminated(););
} }
void solver::validate_eliminated() { void solver::validate_eliminated() {
@ -2765,7 +2768,7 @@ namespace pb {
ptr_vector<constraint>::iterator it2 = it; ptr_vector<constraint>::iterator it2 = it;
ptr_vector<constraint>::iterator end = cs.end(); ptr_vector<constraint>::iterator end = cs.end();
for (; it != end; ++it) { for (; it != end; ++it) {
constraint& c = *(*it); constraint& c = *(*it);
if (c.was_removed()) { if (c.was_removed()) {
clear_watch(c); clear_watch(c);
c.nullify_tracking_literal(*this); c.nullify_tracking_literal(*this);
@ -3228,9 +3231,6 @@ namespace pb {
display(verbose_stream(), p, true);); display(verbose_stream(), p, true););
return false; return false;
} }
// if (value(alit) == l_true && lvl(l) == lvl(alit)) {
// std::cout << "same level " << alit << " " << l << "\n";
// }
} }
// the sum of elements not in r or alit add up to less than k. // the sum of elements not in r or alit add up to less than k.
unsigned sum = 0; unsigned sum = 0;
@ -3425,19 +3425,11 @@ namespace pb {
++num_max_level; ++num_max_level;
} }
} }
if (m_overflow) { if (m_overflow)
return nullptr; return nullptr;
}
if (slack >= k) { if (slack >= k)
#if 0
return active2constraint();
active2pb(m_A);
std::cout << "not asserting\n";
display(std::cout, m_A, true);
#endif
return nullptr; return nullptr;
}
// produce asserting cardinality constraint // produce asserting cardinality constraint
literal_vector lits; literal_vector lits;