mirror of
https://github.com/Z3Prover/z3
synced 2025-04-26 18:45:33 +00:00
remove propagate_bool_at, it is technically not propagating but assigning
This commit is contained in:
parent
16d48c17dd
commit
58c66ffee8
4 changed files with 43 additions and 49 deletions
|
@ -212,7 +212,7 @@ namespace polysat {
|
||||||
if (lemma->size() == 1)
|
if (lemma->size() == 1)
|
||||||
c->set_unit_clause(lemma.get());
|
c->set_unit_clause(lemma.get());
|
||||||
if (s().m_bvars.value(c.blit()) == l_undef)
|
if (s().m_bvars.value(c.blit()) == l_undef)
|
||||||
s().propagate_bool_at(s().level(*lemma), c.blit(), lemma.get());
|
s().assign_bool(s().level(*lemma), c.blit(), lemma.get(), nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
clause_builder conflict_core::build_core_lemma() {
|
clause_builder conflict_core::build_core_lemma() {
|
||||||
|
|
|
@ -124,7 +124,7 @@ namespace polysat {
|
||||||
if (first)
|
if (first)
|
||||||
s.set_conflict(cl);
|
s.set_conflict(cl);
|
||||||
else
|
else
|
||||||
s.propagate_bool_at(s.level(cl), cl[0], &cl);
|
s.assign_bool(s.level(cl), cl[0], &cl, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void constraint_manager::unwatch(clause& cl) {
|
void constraint_manager::unwatch(clause& cl) {
|
||||||
|
|
|
@ -155,7 +155,7 @@ namespace polysat {
|
||||||
else if (c.is_always_false())
|
else if (c.is_always_false())
|
||||||
m_conflict.set(c);
|
m_conflict.set(c);
|
||||||
else
|
else
|
||||||
propagate_bool_at(m_level, c.blit(), c->unit_clause());
|
assign_bool(m_level, c.blit(), c->unit_clause(), nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool solver::can_propagate() {
|
bool solver::can_propagate() {
|
||||||
|
@ -178,38 +178,6 @@ namespace polysat {
|
||||||
SASSERT(assignment_invariant());
|
SASSERT(assignment_invariant());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool solver::propagate(sat::literal lit, clause& cl) {
|
|
||||||
SASSERT(cl.size() >= 2);
|
|
||||||
unsigned idx = cl[0] == ~lit ? 1 : 0;
|
|
||||||
SASSERT(cl[1 - idx] == ~lit);
|
|
||||||
if (m_bvars.is_true(cl[idx]))
|
|
||||||
return true;
|
|
||||||
unsigned i = 2;
|
|
||||||
for (; i < cl.size() && m_bvars.is_false(cl[i]); ++i);
|
|
||||||
if (i < cl.size()) {
|
|
||||||
m_bvars.watch(cl[i]).push_back(&cl);
|
|
||||||
std::swap(cl[1 - idx], cl[i]);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (m_bvars.is_false(cl[idx]))
|
|
||||||
set_conflict(cl);
|
|
||||||
else
|
|
||||||
assign_bool(level(cl), cl[idx], &cl, nullptr);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void solver::linear_propagate() {
|
|
||||||
#if ENABLE_LINEAR_SOLVER
|
|
||||||
switch (m_linear_solver.check()) {
|
|
||||||
case l_false:
|
|
||||||
// TODO extract conflict
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Propagate assignment to a Boolean variable
|
* Propagate assignment to a Boolean variable
|
||||||
*/
|
*/
|
||||||
|
@ -243,6 +211,38 @@ namespace polysat {
|
||||||
wlist.shrink(j);
|
wlist.shrink(j);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool solver::propagate(sat::literal lit, clause& cl) {
|
||||||
|
SASSERT(cl.size() >= 2);
|
||||||
|
unsigned idx = cl[0] == ~lit ? 1 : 0;
|
||||||
|
SASSERT(cl[1 - idx] == ~lit);
|
||||||
|
if (m_bvars.is_true(cl[idx]))
|
||||||
|
return true;
|
||||||
|
unsigned i = 2;
|
||||||
|
for (; i < cl.size() && m_bvars.is_false(cl[i]); ++i);
|
||||||
|
if (i < cl.size()) {
|
||||||
|
m_bvars.watch(cl[i]).push_back(&cl);
|
||||||
|
std::swap(cl[1 - idx], cl[i]);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (m_bvars.is_false(cl[idx]))
|
||||||
|
set_conflict(cl);
|
||||||
|
else
|
||||||
|
assign_bool(level(cl), cl[idx], &cl, nullptr);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void solver::linear_propagate() {
|
||||||
|
#if ENABLE_LINEAR_SOLVER
|
||||||
|
switch (m_linear_solver.check()) {
|
||||||
|
case l_false:
|
||||||
|
// TODO extract conflict
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
void solver::propagate(pvar v, rational const& val, signed_constraint c) {
|
void solver::propagate(pvar v, rational const& val, signed_constraint c) {
|
||||||
LOG("Propagation: " << assignment_pp(*this, v, val) << ", due to " << c);
|
LOG("Propagation: " << assignment_pp(*this, v, val) << ", due to " << c);
|
||||||
if (m_viable.is_viable(v, val)) {
|
if (m_viable.is_viable(v, val)) {
|
||||||
|
@ -587,7 +587,7 @@ namespace polysat {
|
||||||
push_cjust(lemma.justified_var(), c);
|
push_cjust(lemma.justified_var(), c);
|
||||||
|
|
||||||
if (num_choices == 1)
|
if (num_choices == 1)
|
||||||
propagate_bool_at(level(lemma), choice, &lemma);
|
assign_bool(level(lemma), choice, &lemma, nullptr);
|
||||||
else
|
else
|
||||||
decide_bool(choice, &lemma);
|
decide_bool(choice, &lemma);
|
||||||
}
|
}
|
||||||
|
@ -682,18 +682,9 @@ namespace polysat {
|
||||||
SASSERT(!can_propagate());
|
SASSERT(!can_propagate());
|
||||||
SASSERT(!is_conflict());
|
SASSERT(!is_conflict());
|
||||||
push_level();
|
push_level();
|
||||||
LOG_H2("Decide boolean literal " << lit << " @ " << m_level);
|
|
||||||
assign_bool(m_level, lit, nullptr, lemma);
|
assign_bool(m_level, lit, nullptr, lemma);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void solver::propagate_bool_at(unsigned level, sat::literal lit, clause* reason) {
|
|
||||||
LOG("Propagate boolean literal " << lit << " @ " << level << " by " << show_deref(reason));
|
|
||||||
SASSERT(reason);
|
|
||||||
SASSERT(level <= m_level);
|
|
||||||
assign_bool(level, lit, reason, nullptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned solver::level(clause const& cl) {
|
unsigned solver::level(clause const& cl) {
|
||||||
unsigned lvl = 0;
|
unsigned lvl = 0;
|
||||||
for (auto lit : cl) {
|
for (auto lit : cl) {
|
||||||
|
@ -707,7 +698,11 @@ namespace polysat {
|
||||||
/// Assign a boolean literal and put it on the search stack
|
/// Assign a boolean literal and put it on the search stack
|
||||||
void solver::assign_bool(unsigned level, sat::literal lit, clause* reason, clause* lemma) {
|
void solver::assign_bool(unsigned level, sat::literal lit, clause* reason, clause* lemma) {
|
||||||
SASSERT(!m_bvars.is_true(lit));
|
SASSERT(!m_bvars.is_true(lit));
|
||||||
LOG("Assigning boolean literal: " << lit);
|
if (reason)
|
||||||
|
LOG("Propagate literal " << lit << " @ " << level << " by " << *reason);
|
||||||
|
else
|
||||||
|
LOG("Decide literal " << lit << " @ " << m_level);
|
||||||
|
|
||||||
m_bvars.assign(lit, level, reason, lemma);
|
m_bvars.assign(lit, level, reason, lemma);
|
||||||
m_trail.push_back(trail_instr_t::assign_bool_i);
|
m_trail.push_back(trail_instr_t::assign_bool_i);
|
||||||
m_search.push_boolean(lit);
|
m_search.push_boolean(lit);
|
||||||
|
|
|
@ -153,7 +153,6 @@ namespace polysat {
|
||||||
void deactivate_constraint(signed_constraint c);
|
void deactivate_constraint(signed_constraint c);
|
||||||
void decide_bool(clause& lemma);
|
void decide_bool(clause& lemma);
|
||||||
void decide_bool(sat::literal lit, clause* lemma);
|
void decide_bool(sat::literal lit, clause* lemma);
|
||||||
void propagate_bool_at(unsigned level, sat::literal lit, clause* reason);
|
|
||||||
unsigned level(clause const& cl);
|
unsigned level(clause const& cl);
|
||||||
|
|
||||||
void assign_core(pvar v, rational const& val, justification const& j);
|
void assign_core(pvar v, rational const& val, justification const& j);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue