mirror of
https://github.com/Z3Prover/z3
synced 2025-06-07 14:43:23 +00:00
Merge remote-tracking branch 'origin/polysat' into polysat
This commit is contained in:
commit
5ee02ec5df
4 changed files with 30 additions and 26 deletions
|
@ -85,8 +85,8 @@ namespace polysat {
|
||||||
|
|
||||||
void bool_var_manager::asserted(sat::literal lit, unsigned lvl, dependency dep) {
|
void bool_var_manager::asserted(sat::literal lit, unsigned lvl, dependency dep) {
|
||||||
LOG("Asserted " << lit << " @ " << lvl);
|
LOG("Asserted " << lit << " @ " << lvl);
|
||||||
assign(kind_t::decision, lit, lvl, nullptr, dep);
|
assign(dep == null_dependency ? kind_t::decision : kind_t::assumption, lit, lvl, nullptr, dep);
|
||||||
SASSERT(is_decision(lit));
|
SASSERT(is_decision(lit) || is_assumption(lit));
|
||||||
}
|
}
|
||||||
|
|
||||||
void bool_var_manager::assign(kind_t k, sat::literal lit, unsigned lvl, clause* reason, dependency dep) {
|
void bool_var_manager::assign(kind_t k, sat::literal lit, unsigned lvl, clause* reason, dependency dep) {
|
||||||
|
|
|
@ -24,6 +24,7 @@ namespace polysat {
|
||||||
unassigned,
|
unassigned,
|
||||||
bool_propagation,
|
bool_propagation,
|
||||||
value_propagation,
|
value_propagation,
|
||||||
|
assumption,
|
||||||
decision,
|
decision,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -57,6 +58,8 @@ namespace polysat {
|
||||||
bool is_assigned(sat::literal lit) const { return value(lit) != l_undef; }
|
bool is_assigned(sat::literal lit) const { return value(lit) != l_undef; }
|
||||||
bool is_decision(sat::bool_var var) const { return is_assigned(var) && m_kind[var] == kind_t::decision; }
|
bool is_decision(sat::bool_var var) const { return is_assigned(var) && m_kind[var] == kind_t::decision; }
|
||||||
bool is_decision(sat::literal lit) const { return is_decision(lit.var()); }
|
bool is_decision(sat::literal lit) const { return is_decision(lit.var()); }
|
||||||
|
bool is_assumption(sat::bool_var var) const { return is_assigned(var) && m_kind[var] == kind_t::assumption; }
|
||||||
|
bool is_assumption(sat::literal lit) const { return is_assumption(lit.var()); }
|
||||||
bool is_bool_propagation(sat::bool_var var) const { return is_assigned(var) && m_kind[var] == kind_t::bool_propagation; }
|
bool is_bool_propagation(sat::bool_var var) const { return is_assigned(var) && m_kind[var] == kind_t::bool_propagation; }
|
||||||
bool is_bool_propagation(sat::literal lit) const { return is_bool_propagation(lit.var()); }
|
bool is_bool_propagation(sat::literal lit) const { return is_bool_propagation(lit.var()); }
|
||||||
bool is_value_propagation(sat::bool_var var) const { return is_assigned(var) && m_kind[var] == kind_t::value_propagation; }
|
bool is_value_propagation(sat::bool_var var) const { return is_assigned(var) && m_kind[var] == kind_t::value_propagation; }
|
||||||
|
|
|
@ -50,6 +50,7 @@ namespace polysat {
|
||||||
if (!m_vars.empty())
|
if (!m_vars.empty())
|
||||||
out << " vars";
|
out << " vars";
|
||||||
for (auto v : m_vars)
|
for (auto v : m_vars)
|
||||||
|
if (is_pmarked(v))
|
||||||
out << " v" << v;
|
out << " v" << v;
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
@ -329,6 +330,13 @@ namespace polysat {
|
||||||
|
|
||||||
s.inc_activity(v);
|
s.inc_activity(v);
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
if (j.is_decision() && m_vars.contains(v)) {
|
||||||
|
set_bailout();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
m_vars.remove(v);
|
m_vars.remove(v);
|
||||||
|
|
||||||
if (j.is_propagation()) {
|
if (j.is_propagation()) {
|
||||||
|
@ -343,17 +351,20 @@ namespace polysat {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LOG("try-explain v" << v);
|
||||||
if (try_explain(v))
|
if (try_explain(v))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
// No value resolution method was successful => fall back to saturation and variable elimination
|
// No value resolution method was successful => fall back to saturation and variable elimination
|
||||||
while (s.inc()) {
|
while (s.inc()) {
|
||||||
|
LOG("try-eliminate v" << v);
|
||||||
// TODO: as a last resort, substitute v by m_value[v]?
|
// TODO: as a last resort, substitute v by m_value[v]?
|
||||||
if (try_eliminate(v))
|
if (try_eliminate(v))
|
||||||
return true;
|
return true;
|
||||||
if (!try_saturate(v))
|
if (!try_saturate(v))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
LOG("bailout v" << v);
|
||||||
set_bailout();
|
set_bailout();
|
||||||
if (s.is_assigned(v) && j.is_decision())
|
if (s.is_assigned(v) && j.is_decision())
|
||||||
m_vars.insert(v);
|
m_vars.insert(v);
|
||||||
|
@ -361,9 +372,12 @@ namespace polysat {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool conflict::try_eliminate(pvar v) {
|
bool conflict::try_eliminate(pvar v) {
|
||||||
|
LOG("try v" << v << " contains " << m_vars.contains(v));
|
||||||
|
if (m_vars.contains(v))
|
||||||
|
return false;
|
||||||
bool has_v = false;
|
bool has_v = false;
|
||||||
for (auto c : *this)
|
for (auto c : *this)
|
||||||
has_v |= c->is_var_dependent() && c->contains_var(v);
|
has_v |= c->contains_var(v);
|
||||||
if (!has_v)
|
if (!has_v)
|
||||||
return true;
|
return true;
|
||||||
for (auto* engine : ve_engines)
|
for (auto* engine : ve_engines)
|
||||||
|
|
|
@ -557,14 +557,14 @@ namespace polysat {
|
||||||
LOG("Literal " << lit << " is " << lit2cnstr(lit));
|
LOG("Literal " << lit << " is " << lit2cnstr(lit));
|
||||||
if (!m_conflict.is_bmarked(var))
|
if (!m_conflict.is_bmarked(var))
|
||||||
continue;
|
continue;
|
||||||
if (m_bvars.level(var) <= base_level())
|
|
||||||
continue;
|
|
||||||
LOG("Conflict: " << m_conflict);
|
LOG("Conflict: " << m_conflict);
|
||||||
if (m_bvars.is_decision(var)) {
|
if (m_bvars.is_assumption(var))
|
||||||
|
continue;
|
||||||
|
else if (m_bvars.is_decision(var)) {
|
||||||
revert_bool_decision(lit);
|
revert_bool_decision(lit);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (m_bvars.is_bool_propagation(var))
|
else if (m_bvars.is_bool_propagation(var))
|
||||||
m_conflict.resolve(lit, *m_bvars.reason(lit));
|
m_conflict.resolve(lit, *m_bvars.reason(lit));
|
||||||
else
|
else
|
||||||
m_conflict.resolve_with_assignment(lit, m_bvars.level(lit));
|
m_conflict.resolve_with_assignment(lit, m_bvars.level(lit));
|
||||||
|
@ -604,19 +604,6 @@ namespace polysat {
|
||||||
m_activity_inc >>= 14;
|
m_activity_inc >>= 14;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
/** Conflict resolution case where boolean literal 'lit' is on top of the stack
|
|
||||||
* NOTE: boolean resolution should work normally even in bailout mode.
|
|
||||||
*/
|
|
||||||
void solver::resolve_bool(sat::literal lit) {
|
|
||||||
SASSERT(m_bvars.is_bool_propagation(lit));
|
|
||||||
clause const& other = *m_bvars.reason(lit);
|
|
||||||
LOG_H3("resolve_bool: " << lit << " " << show_deref(&other));
|
|
||||||
m_conflict.resolve(lit, *other);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void solver::report_unsat() {
|
void solver::report_unsat() {
|
||||||
backjump(base_level());
|
backjump(base_level());
|
||||||
SASSERT(!m_conflict.empty());
|
SASSERT(!m_conflict.empty());
|
||||||
|
@ -785,7 +772,7 @@ namespace polysat {
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned solver::level(sat::literal lit0, clause const& cl) {
|
unsigned solver::level(sat::literal lit0, clause const& cl) {
|
||||||
unsigned lvl = base_level();
|
unsigned lvl = 0;
|
||||||
for (auto lit : cl) {
|
for (auto lit : cl) {
|
||||||
if (lit == lit0)
|
if (lit == lit0)
|
||||||
continue;
|
continue;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue