mirror of
https://github.com/Z3Prover/z3
synced 2025-08-23 19:47:52 +00:00
parent
211a6c8752
commit
b8a437bd8a
8 changed files with 60 additions and 36 deletions
|
@ -28,15 +28,28 @@ namespace sat {
|
|||
SASSERT(!m_solver.get_config().m_drat);
|
||||
}
|
||||
|
||||
void dual_solver::push() {
|
||||
m_solver.user_push();
|
||||
m_roots.push_scope();
|
||||
m_tracked_vars.push_scope();
|
||||
m_units.push_scope();
|
||||
m_vars.push_scope();
|
||||
void dual_solver::flush() {
|
||||
while (m_num_scopes > 0) {
|
||||
m_solver.user_push();
|
||||
m_roots.push_scope();
|
||||
m_tracked_vars.push_scope();
|
||||
m_units.push_scope();
|
||||
m_vars.push_scope();
|
||||
--m_num_scopes;
|
||||
}
|
||||
}
|
||||
|
||||
void dual_solver::pop(unsigned num_scopes) {
|
||||
void dual_solver::push() {
|
||||
++m_num_scopes;
|
||||
}
|
||||
|
||||
void dual_solver::pop(unsigned num_scopes) {
|
||||
if (m_num_scopes >= num_scopes) {
|
||||
m_num_scopes -= num_scopes;
|
||||
return;
|
||||
}
|
||||
num_scopes -= m_num_scopes;
|
||||
m_num_scopes = 0;
|
||||
m_solver.user_pop(num_scopes);
|
||||
unsigned old_sz = m_tracked_vars.old_size(num_scopes);
|
||||
for (unsigned i = m_tracked_vars.size(); i-- > old_sz; )
|
||||
|
@ -66,6 +79,7 @@ namespace sat {
|
|||
}
|
||||
|
||||
void dual_solver::track_relevancy(bool_var w) {
|
||||
flush();
|
||||
bool_var v = ext2var(w);
|
||||
if (!m_is_tracked.get(v, false)) {
|
||||
m_is_tracked.setx(v, true, false);
|
||||
|
@ -81,7 +95,8 @@ namespace sat {
|
|||
return literal(m_var2ext[lit.var()], lit.sign());
|
||||
}
|
||||
|
||||
void dual_solver::add_root(unsigned sz, literal const* clause) {
|
||||
void dual_solver::add_root(unsigned sz, literal const* clause) {
|
||||
flush();
|
||||
if (sz == 1) {
|
||||
TRACE("dual", tout << "unit: " << clause[0] << "\n";);
|
||||
m_units.push_back(clause[0]);
|
||||
|
@ -95,6 +110,7 @@ namespace sat {
|
|||
}
|
||||
|
||||
void dual_solver::add_aux(unsigned sz, literal const* clause) {
|
||||
flush();
|
||||
TRACE("dual", tout << "aux: " << literal_vector(sz, clause) << "\n";);
|
||||
m_lits.reset();
|
||||
for (unsigned i = 0; i < sz; ++i)
|
||||
|
@ -103,6 +119,7 @@ namespace sat {
|
|||
}
|
||||
|
||||
void dual_solver::add_assumptions(solver const& s) {
|
||||
flush();
|
||||
m_lits.reset();
|
||||
for (bool_var v : m_tracked_vars)
|
||||
m_lits.push_back(literal(v, l_false == s.value(m_var2ext[v])));
|
||||
|
@ -113,7 +130,7 @@ namespace sat {
|
|||
}
|
||||
}
|
||||
|
||||
bool dual_solver::operator()(solver const& s) {
|
||||
bool dual_solver::operator()(solver const& s) {
|
||||
m_core.reset();
|
||||
m_core.append(m_units);
|
||||
if (m_roots.empty())
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue