mirror of
https://github.com/Z3Prover/z3
synced 2025-06-19 12:23:38 +00:00
allow tracking values of constraints
This commit is contained in:
parent
0dd4f0cf71
commit
75e83b8c1e
4 changed files with 27 additions and 12 deletions
|
@ -67,13 +67,13 @@ namespace polysat {
|
||||||
public:
|
public:
|
||||||
mk_add_watch(core& c) : c(c) {}
|
mk_add_watch(core& c) : c(c) {}
|
||||||
void undo() override {
|
void undo() override {
|
||||||
auto& [sc, lit] = c.m_constraint_trail.back();
|
auto& [sc, lit, val] = c.m_constraint_index.back();
|
||||||
auto& vars = sc.vars();
|
auto& vars = sc.vars();
|
||||||
if (vars.size() > 0)
|
if (vars.size() > 0)
|
||||||
c.m_watch[vars[0]].pop_back();
|
c.m_watch[vars[0]].pop_back();
|
||||||
if (vars.size() > 1)
|
if (vars.size() > 1)
|
||||||
c.m_watch[vars[1]].pop_back();
|
c.m_watch[vars[1]].pop_back();
|
||||||
c.m_constraint_trail.pop_back();
|
c.m_constraint_index.pop_back();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -121,8 +121,8 @@ namespace polysat {
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned core::register_constraint(signed_constraint& sc, dependency d) {
|
unsigned core::register_constraint(signed_constraint& sc, dependency d) {
|
||||||
unsigned idx = m_constraint_trail.size();
|
unsigned idx = m_constraint_index.size();
|
||||||
m_constraint_trail.push_back({ sc, d });
|
m_constraint_index.push_back({ sc, d, l_undef });
|
||||||
auto& vars = sc.vars();
|
auto& vars = sc.vars();
|
||||||
unsigned i = 0, j = 0, sz = vars.size();
|
unsigned i = 0, j = 0, sz = vars.size();
|
||||||
for (; i < sz && j < 2; ++i)
|
for (; i < sz && j < 2; ++i)
|
||||||
|
@ -177,7 +177,7 @@ namespace polysat {
|
||||||
}
|
}
|
||||||
|
|
||||||
signed_constraint core::get_constraint(unsigned idx, bool sign) {
|
signed_constraint core::get_constraint(unsigned idx, bool sign) {
|
||||||
auto sc = m_constraint_trail[idx].sc;
|
auto sc = m_constraint_index[idx].sc;
|
||||||
if (sign)
|
if (sign)
|
||||||
sc = ~sc;
|
sc = ~sc;
|
||||||
return sc;
|
return sc;
|
||||||
|
@ -212,7 +212,7 @@ namespace polysat {
|
||||||
// for entries where there is only one free variable left add to viable set
|
// for entries where there is only one free variable left add to viable set
|
||||||
unsigned j = 0;
|
unsigned j = 0;
|
||||||
for (auto idx : m_watch[v]) {
|
for (auto idx : m_watch[v]) {
|
||||||
auto [sc, as] = m_constraint_trail[idx];
|
auto [sc, as, value] = m_constraint_index[idx];
|
||||||
auto& vars = sc.vars();
|
auto& vars = sc.vars();
|
||||||
if (vars[0] != v)
|
if (vars[0] != v)
|
||||||
std::swap(vars[0], vars[1]);
|
std::swap(vars[0], vars[1]);
|
||||||
|
@ -263,7 +263,7 @@ namespace polysat {
|
||||||
for (auto idx1 : m_watch[m_var]) {
|
for (auto idx1 : m_watch[m_var]) {
|
||||||
if (idx == idx1)
|
if (idx == idx1)
|
||||||
continue;
|
continue;
|
||||||
auto [sc, d] = m_constraint_trail[idx1];
|
auto [sc, d, value] = m_constraint_index[idx1];
|
||||||
switch (eval(sc)) {
|
switch (eval(sc)) {
|
||||||
case l_false:
|
case l_false:
|
||||||
s.propagate(d, true, explain_eval(sc));
|
s.propagate(d, true, explain_eval(sc));
|
||||||
|
@ -298,8 +298,18 @@ namespace polysat {
|
||||||
}
|
}
|
||||||
|
|
||||||
void core::assign_eh(unsigned index, bool sign, dependency const& dep) {
|
void core::assign_eh(unsigned index, bool sign, dependency const& dep) {
|
||||||
|
struct unassign : public trail {
|
||||||
|
core& c;
|
||||||
|
unsigned m_index;
|
||||||
|
unassign(core& c, unsigned index): c(c), m_index(index) {}
|
||||||
|
void undo() override {
|
||||||
|
c.m_constraint_index[m_index].value = l_undef;
|
||||||
|
c.m_prop_queue.pop_back();
|
||||||
|
}
|
||||||
|
};
|
||||||
m_prop_queue.push_back({ index, sign, dep });
|
m_prop_queue.push_back({ index, sign, dep });
|
||||||
s.trail().push(push_back_vector(m_prop_queue));
|
m_constraint_index[index].value = to_lbool(!sign);
|
||||||
|
s.trail().push(unassign(*this, index));
|
||||||
}
|
}
|
||||||
|
|
||||||
dependency_vector core::explain_eval(signed_constraint const& sc) {
|
dependency_vector core::explain_eval(signed_constraint const& sc) {
|
||||||
|
|
|
@ -42,8 +42,9 @@ namespace polysat {
|
||||||
friend class assignment;
|
friend class assignment;
|
||||||
|
|
||||||
struct constraint_info {
|
struct constraint_info {
|
||||||
signed_constraint sc;
|
signed_constraint sc; // signed constraint representation
|
||||||
dependency d;
|
dependency d; // justification for constraint
|
||||||
|
lbool value; // value assigned by solver
|
||||||
};
|
};
|
||||||
solver_interface& s;
|
solver_interface& s;
|
||||||
viable m_viable;
|
viable m_viable;
|
||||||
|
@ -51,7 +52,7 @@ namespace polysat {
|
||||||
assignment m_assignment;
|
assignment m_assignment;
|
||||||
unsigned m_qhead = 0, m_vqhead = 0;
|
unsigned m_qhead = 0, m_vqhead = 0;
|
||||||
svector<prop_item> m_prop_queue;
|
svector<prop_item> m_prop_queue;
|
||||||
svector<constraint_info> m_constraint_trail; // index of constraints
|
svector<constraint_info> m_constraint_index; // index of constraints
|
||||||
mutable scoped_ptr_vector<dd::pdd_manager> m_pdd;
|
mutable scoped_ptr_vector<dd::pdd_manager> m_pdd;
|
||||||
dependency_vector m_unsat_core;
|
dependency_vector m_unsat_core;
|
||||||
|
|
||||||
|
|
|
@ -89,6 +89,10 @@ namespace polysat {
|
||||||
|
|
||||||
class signed_constraint;
|
class signed_constraint;
|
||||||
|
|
||||||
|
//
|
||||||
|
// The interface that PolySAT uses to the SAT/SMT solver.
|
||||||
|
//
|
||||||
|
|
||||||
class solver_interface {
|
class solver_interface {
|
||||||
public:
|
public:
|
||||||
virtual void add_eq_literal(pvar v, rational const& val) = 0;
|
virtual void add_eq_literal(pvar v, rational const& val) = 0;
|
||||||
|
|
|
@ -636,7 +636,7 @@ namespace polysat {
|
||||||
|
|
||||||
if (c.is_assigned(v))
|
if (c.is_assigned(v))
|
||||||
return;
|
return;
|
||||||
auto [sc, d] = c.m_constraint_trail[idx];
|
auto [sc, d, value] = c.m_constraint_index[idx];
|
||||||
// fixme: constraint must be assigned a value l_true or l_false at this point.
|
// fixme: constraint must be assigned a value l_true or l_false at this point.
|
||||||
// adjust sc to the truth value of the constraint when passed to forbidden intervals.
|
// adjust sc to the truth value of the constraint when passed to forbidden intervals.
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue