3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-06-21 21:33:39 +00:00

levels/crit

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2021-09-10 16:03:38 +02:00
parent af0e4d402b
commit d514464e30
6 changed files with 14 additions and 13 deletions

View file

@ -17,9 +17,8 @@ Author:
namespace polysat { namespace polysat {
clause_ref clause::from_unit(signed_constraint c, p_dependency_ref d) { clause_ref clause::from_unit(unsigned lvl, signed_constraint c, p_dependency_ref d) {
SASSERT(c->has_bvar()); SASSERT(c->has_bvar());
unsigned const lvl = 0; // level from literal?
sat::literal_vector lits; sat::literal_vector lits;
lits.push_back(c.blit()); lits.push_back(c.blit());
return clause::from_literals(lvl, std::move(d), std::move(lits)); return clause::from_literals(lvl, std::move(d), std::move(lits));

View file

@ -56,7 +56,7 @@ namespace polysat {
void inc_ref() { m_ref_count++; } void inc_ref() { m_ref_count++; }
void dec_ref() { SASSERT(m_ref_count > 0); m_ref_count--; if (!m_ref_count) dealloc(this); } void dec_ref() { SASSERT(m_ref_count > 0); m_ref_count--; if (!m_ref_count) dealloc(this); }
static clause_ref from_unit(signed_constraint c, p_dependency_ref d); static clause_ref from_unit(unsigned lvl, signed_constraint c, p_dependency_ref d);
static clause_ref from_literals(unsigned lvl, p_dependency_ref d, sat::literal_vector literals); static clause_ref from_literals(unsigned lvl, p_dependency_ref d, sat::literal_vector literals);
p_dependency* dep() const { return m_dep; } p_dependency* dep() const { return m_dep; }

View file

@ -53,6 +53,7 @@ namespace polysat {
SASSERT(c->has_bvar()); SASSERT(c->has_bvar());
if (c->unit_clause()) { if (c->unit_clause()) {
add_dependency(c->unit_dep()); add_dependency(c->unit_dep());
m_level = std::max(m_level, c->unit_clause()->level());
return; return;
} }
m_literals.push_back(c.blit()); m_literals.push_back(c.blit());

View file

@ -62,18 +62,19 @@ namespace polysat {
* Propagate c. It is added to reason and core all other literals in reason are false in current stack. * Propagate c. It is added to reason and core all other literals in reason are false in current stack.
* The lemmas outlines in the rules are valid and therefore c is implied. * The lemmas outlines in the rules are valid and therefore c is implied.
*/ */
bool inf_saturate::propagate(conflict_core& core, signed_constraint& c, clause_builder& reason) { bool inf_saturate::propagate(conflict_core& core, inequality const& crit, signed_constraint& c, clause_builder& reason) {
if (c.is_currently_true(s())) if (c.is_currently_true(s()))
return false; return false;
core.insert(c); core.insert(c);
reason.push(c); reason.push(c);
// TODO core.erase(crit.as_signed_constraint());
s().propagate_bool(c.blit(), reason.build().get()); s().propagate_bool(c.blit(), reason.build().get());
return true; return true;
} }
bool inf_saturate::propagate(conflict_core& core, bool is_strict, pdd const& lhs, pdd const& rhs, clause_builder& reason) { bool inf_saturate::propagate(conflict_core& core, inequality const& crit, bool is_strict, pdd const& lhs, pdd const& rhs, clause_builder& reason) {
signed_constraint c = ineq(is_strict, lhs, rhs); signed_constraint c = ineq(is_strict, lhs, rhs);
return propagate(core, c, reason); return propagate(core, crit, c, reason);
} }
/// Add premises for Ω*(x, y) /// Add premises for Ω*(x, y)
@ -267,7 +268,7 @@ namespace polysat {
reason.push(cm().eq(x - x.manager().mk_val(rational(0)))); reason.push(cm().eq(x - x.manager().mk_val(rational(0))));
reason.push(~c.as_signed_constraint()); reason.push(~c.as_signed_constraint());
push_omega(reason, x, y); push_omega(reason, x, y);
return propagate(core, c.is_strict, y, z, reason); return propagate(core, c, c.is_strict, y, z, reason);
} }
/// [y] z' <= y /\ zx > yx ==> Ω*(x,y) \/ zx > z'x /// [y] z' <= y /\ zx > yx ==> Ω*(x,y) \/ zx > z'x
@ -287,7 +288,7 @@ namespace polysat {
reason.push(~yx_l_zx.as_signed_constraint()); reason.push(~yx_l_zx.as_signed_constraint());
push_omega(reason, x, y); push_omega(reason, x, y);
// z'x <= zx // z'x <= zx
return propagate(core, yx_l_zx.is_strict || le_y.is_strict, z_prime * x, z * x, reason); return propagate(core, yx_l_zx, yx_l_zx.is_strict || le_y.is_strict, z_prime * x, z * x, reason);
} }
bool inf_saturate::try_ugt_y(pvar v, conflict_core& core, inequality const& c) { bool inf_saturate::try_ugt_y(pvar v, conflict_core& core, inequality const& c) {
@ -330,7 +331,7 @@ namespace polysat {
reason.push(~x_l_z.as_signed_constraint()); reason.push(~x_l_z.as_signed_constraint());
reason.push(~y_l_ax.as_signed_constraint()); reason.push(~y_l_ax.as_signed_constraint());
push_omega(reason, a, z); push_omega(reason, a, z);
return propagate(core, x_l_z.is_strict || y_l_ax.is_strict, y, a * z, reason); return propagate(core, y_l_ax, x_l_z.is_strict || y_l_ax.is_strict, y, a * z, reason);
} }
@ -360,7 +361,7 @@ namespace polysat {
reason.push(~d.as_signed_constraint()); reason.push(~d.as_signed_constraint());
push_omega(reason, x, y_prime); push_omega(reason, x, y_prime);
// yx <= y'x // yx <= y'x
return propagate(core, c.is_strict || d.is_strict, y * x, y_prime * x, reason); return propagate(core, d, c.is_strict || d.is_strict, y * x, y_prime * x, reason);
} }

View file

@ -41,8 +41,8 @@ namespace polysat {
void push_omega(clause_builder& reason, pdd const& x, pdd const& y); void push_omega(clause_builder& reason, pdd const& x, pdd const& y);
void push_omega_bisect(clause_builder& reason, pdd const& x, rational x_max, pdd const& y, rational y_max); void push_omega_bisect(clause_builder& reason, pdd const& x, rational x_max, pdd const& y, rational y_max);
signed_constraint ineq(bool strict, pdd const& lhs, pdd const& rhs); signed_constraint ineq(bool strict, pdd const& lhs, pdd const& rhs);
bool propagate(conflict_core& core, signed_constraint& c, clause_builder& reason); bool propagate(conflict_core& core, inequality const& crit, signed_constraint& c, clause_builder& reason);
bool propagate(conflict_core& core, bool strict, pdd const& lhs, pdd const& rhs, clause_builder& reason); bool propagate(conflict_core& core, inequality const& crit, bool strict, pdd const& lhs, pdd const& rhs, clause_builder& reason);
bool try_ugt_x(pvar v, conflict_core& core, inequality const& c); bool try_ugt_x(pvar v, conflict_core& core, inequality const& c);

View file

@ -145,7 +145,7 @@ namespace polysat {
SASSERT(c); SASSERT(c);
SASSERT(activate || dep != null_dependency); // if we don't activate the constraint, we need the dependency to access it again later. SASSERT(activate || dep != null_dependency); // if we don't activate the constraint, we need the dependency to access it again later.
m_constraints.ensure_bvar(c.get()); m_constraints.ensure_bvar(c.get());
clause* unit = m_constraints.store(clause::from_unit(c, mk_dep_ref(dep))); clause* unit = m_constraints.store(clause::from_unit(m_level, c, mk_dep_ref(dep)));
c->set_unit_clause(unit); c->set_unit_clause(unit);
if (dep != null_dependency) if (dep != null_dependency)
m_constraints.register_external(c.get()); m_constraints.register_external(c.get());