mirror of
https://github.com/Z3Prover/z3
synced 2025-04-23 00:55:31 +00:00
Try to evaluate constraints whenever one of its variables is changed
This commit is contained in:
parent
f82f18efda
commit
526a55f116
2 changed files with 40 additions and 1 deletions
|
@ -219,6 +219,7 @@ namespace polysat {
|
|||
flet<bool> save_(m_is_propagating, true);
|
||||
#endif
|
||||
push_qhead();
|
||||
unsigned const qhead_init = m_qhead;
|
||||
unsigned bool_qhead = m_qhead;
|
||||
unsigned eval_qhead = m_qhead;
|
||||
while (can_propagate_search()) {
|
||||
|
@ -245,7 +246,27 @@ namespace polysat {
|
|||
auto const& item = m_search[eval_qhead++];
|
||||
if (item.is_assignment()) {
|
||||
// LOG_H1("P2: eval pvar v" << item.var());
|
||||
propagate(item.var(), false);
|
||||
// propagate(item.var(), false);
|
||||
for (int i = 0; i < qhead_init; ++i) {
|
||||
if (!m_search[i].is_boolean())
|
||||
continue;
|
||||
sat::literal lit = m_search[i].lit();
|
||||
if (m_ptrue_lits.contains(lit))
|
||||
continue;
|
||||
signed_constraint c = lit2cnstr(lit);
|
||||
if (!c.contains_var(item.var()))
|
||||
continue;
|
||||
SASSERT(m_bvars.is_true(lit));
|
||||
lbool const pvalue = c.eval(*this);
|
||||
if (pvalue == l_true) {
|
||||
m_ptrue_lits.insert(lit);
|
||||
m_ptrue_lits_trail.push_back(lit);
|
||||
}
|
||||
else if (pvalue == l_false) {
|
||||
set_conflict(c);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
SASSERT(item.is_boolean());
|
||||
|
|
|
@ -196,14 +196,32 @@ namespace polysat {
|
|||
|
||||
unsigned_vector m_base_levels; // External clients can push/pop scope.
|
||||
|
||||
// Cache literals that evaluate to true in the current assignment.
|
||||
// TODO: convert to proper pvalue caching. decouple trail from qhead. push size on trail when a pvar is assigned, because that's the point where evaluations can change.
|
||||
sat::literal_set m_ptrue_lits;
|
||||
sat::literal_vector m_ptrue_lits_trail;
|
||||
unsigned_vector m_ptrue_lits_size_trail;
|
||||
|
||||
void push_qhead() {
|
||||
m_trail.push_back(trail_instr_t::qhead_i);
|
||||
m_qhead_trail.push_back(m_qhead);
|
||||
//
|
||||
SASSERT(m_ptrue_lits.size() == m_ptrue_lits_trail.size());
|
||||
m_ptrue_lits_size_trail.push_back(m_ptrue_lits_trail.size());
|
||||
}
|
||||
|
||||
void pop_qhead() {
|
||||
m_qhead = m_qhead_trail.back();
|
||||
m_qhead_trail.pop_back();
|
||||
//
|
||||
unsigned sz = m_ptrue_lits_size_trail.back();
|
||||
m_ptrue_lits_size_trail.pop_back();
|
||||
while (m_ptrue_lits_trail.size() > sz) {
|
||||
sat::literal lit = m_ptrue_lits_trail.back();
|
||||
m_ptrue_lits.remove(lit);
|
||||
m_ptrue_lits_trail.pop_back();
|
||||
}
|
||||
SASSERT(m_ptrue_lits.size() == m_ptrue_lits_trail.size());
|
||||
}
|
||||
|
||||
unsigned size(pvar v) const { return m_size[v]; }
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue