3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-06-27 00:18:45 +00:00

fix drat output for elim_eqs

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2019-01-10 15:25:10 -08:00
parent b12c1b1cba
commit 6e60926cc3
4 changed files with 60 additions and 27 deletions

View file

@ -23,9 +23,15 @@ Revision History:
namespace sat { namespace sat {
elim_eqs::elim_eqs(solver & s): elim_eqs::elim_eqs(solver & s):
m_solver(s) { m_solver(s),
m_to_delete(nullptr) {
} }
elim_eqs::~elim_eqs() {
dealloc(m_to_delete);
}
inline literal norm(literal_vector const & roots, literal l) { inline literal norm(literal_vector const & roots, literal l) {
if (l.sign()) if (l.sign())
return ~roots[l.var()]; return ~roots[l.var()];
@ -86,6 +92,12 @@ namespace sat {
m_new_bin.reset(); m_new_bin.reset();
} }
void elim_eqs::drat_delete_clause() {
if (m_solver.m_config.m_drat) {
m_solver.m_drat.del(*m_to_delete->get());
}
}
void elim_eqs::cleanup_clauses(literal_vector const & roots, clause_vector & cs) { void elim_eqs::cleanup_clauses(literal_vector const & roots, clause_vector & cs) {
clause_vector::iterator it = cs.begin(); clause_vector::iterator it = cs.begin();
clause_vector::iterator it2 = it; clause_vector::iterator it2 = it;
@ -107,8 +119,16 @@ namespace sat {
it2++; it2++;
continue; continue;
} }
if (!c.frozen()) if (!c.frozen()) {
m_solver.detach_clause(c); m_solver.detach_clause(c);
}
// save clause to be deleted for drat
if (m_solver.m_config.m_drat) {
if (!m_to_delete) m_to_delete = alloc(tmp_clause);
m_to_delete->set(sz, c.begin(), c.is_learned());
}
// apply substitution // apply substitution
for (i = 0; i < sz; i++) { for (i = 0; i < sz; i++) {
literal lit = c[i]; literal lit = c[i];
@ -124,60 +144,69 @@ namespace sat {
CTRACE("sat", l != norm(roots, l), tout << l << " " << norm(roots, l) << "\n"; tout.flush();); CTRACE("sat", l != norm(roots, l), tout << l << " " << norm(roots, l) << "\n"; tout.flush(););
SASSERT(l == norm(roots, l)); SASSERT(l == norm(roots, l));
} }); } });
// remove duplicates, and check if it is a tautology // remove duplicates, and check if it is a tautology
literal l_prev = null_literal;
unsigned j = 0; unsigned j = 0;
literal l_prev = null_literal;
for (i = 0; i < sz; i++) { for (i = 0; i < sz; i++) {
literal l = c[i]; literal l = c[i];
if (l == l_prev) if (l == ~l_prev) {
continue;
if (l == ~l_prev)
break; break;
}
if (l == l_prev) {
continue;
}
SASSERT(l != ~l_prev);
l_prev = l; l_prev = l;
lbool val = m_solver.value(l); lbool val = m_solver.value(l);
if (val == l_true) if (val == l_true) {
break; // clause was satisfied break;
if (val == l_false) }
if (val == l_false) {
continue; // skip continue; // skip
}
c[j] = l; c[j] = l;
j++; j++;
} }
TRACE("elim_eqs", tout << "after removing duplicates: " << c << " j: " << j << "\n";);
if (i < sz) { if (i < sz) {
// clause is a tautology or was simplified to true drat_delete_clause();
m_solver.del_clause(c); m_solver.del_clause(c, false);
continue; continue;
} }
if (j == 0) {
// empty clause switch (j) {
case 0:
m_solver.set_conflict(justification()); m_solver.set_conflict(justification());
for (; it != end; ++it) { for (; it != end; ++it) {
*it2 = *it; *it2 = *it;
it2++; it2++;
} }
cs.set_end(it2); cs.set_end(it2);
return; return;
}
TRACE("elim_eqs", tout << "after removing duplicates: " << c << " j: " << j << "\n";);
SASSERT(j >= 1);
switch (j) {
case 1: case 1:
m_solver.assign(c[0], justification()); m_solver.assign(c[0], justification());
m_solver.del_clause(c); m_solver.del_clause(c, false);
drat_delete_clause();
break; break;
case 2: case 2:
m_solver.mk_bin_clause(c[0], c[1], c.is_learned()); m_solver.mk_bin_clause(c[0], c[1], c.is_learned());
m_solver.del_clause(c); m_solver.del_clause(c, false);
drat_delete_clause();
break; break;
default: default:
SASSERT(*it == &c); SASSERT(*it == &c);
if (j < sz) { if (j < sz) {
if (m_solver.m_config.m_drat) m_solver.m_drat.del(c);
c.shrink(j); c.shrink(j);
if (m_solver.m_config.m_drat) m_solver.m_drat.add(c, true);
} }
else else {
c.update_approx(); c.update_approx();
}
if (m_solver.m_config.m_drat) {
m_solver.m_drat.add(c, true);
drat_delete_clause();
}
DEBUG_CODE(for (literal l : c) VERIFY(l == norm(roots, l));); DEBUG_CODE(for (literal l : c) VERIFY(l == norm(roots, l)););

View file

@ -23,6 +23,7 @@ Revision History:
namespace sat { namespace sat {
class solver; class solver;
class tmp_clause;
class elim_eqs { class elim_eqs {
struct bin { struct bin {
@ -32,6 +33,8 @@ namespace sat {
}; };
svector<bin> m_new_bin; svector<bin> m_new_bin;
solver & m_solver; solver & m_solver;
tmp_clause* m_to_delete;
void drat_delete_clause();
void save_elim(literal_vector const & roots, bool_var_vector const & to_elim); void save_elim(literal_vector const & roots, bool_var_vector const & to_elim);
void cleanup_clauses(literal_vector const & roots, clause_vector & cs); void cleanup_clauses(literal_vector const & roots, clause_vector & cs);
void cleanup_bin_watches(literal_vector const & roots); void cleanup_bin_watches(literal_vector const & roots);
@ -39,6 +42,7 @@ namespace sat {
bool check_clause(clause const& c, literal_vector const& roots) const; bool check_clause(clause const& c, literal_vector const& roots) const;
public: public:
elim_eqs(solver & s); elim_eqs(solver & s);
~elim_eqs();
void operator()(literal_vector const & roots, bool_var_vector const & to_elim); void operator()(literal_vector const & roots, bool_var_vector const & to_elim);
}; };

View file

@ -298,14 +298,14 @@ namespace sat {
mk_clause(3, ls, learned); mk_clause(3, ls, learned);
} }
void solver::del_clause(clause& c) { void solver::del_clause(clause& c, bool enable_drat) {
if (!c.is_learned()) { if (!c.is_learned()) {
m_stats.m_non_learned_generation++; m_stats.m_non_learned_generation++;
} }
if (c.frozen()) { if (c.frozen()) {
--m_num_frozen; --m_num_frozen;
} }
if (m_config.m_drat && !m_drat.is_cleaned(c)) { if (enable_drat && m_config.m_drat && !m_drat.is_cleaned(c)) {
m_drat.del(c); m_drat.del(c);
} }
dealloc_clause(&c); dealloc_clause(&c);

View file

@ -232,7 +232,7 @@ namespace sat {
void defrag_clauses(); void defrag_clauses();
bool should_defrag(); bool should_defrag();
bool memory_pressure(); bool memory_pressure();
void del_clause(clause & c); void del_clause(clause & c, bool enable_drat = true);
clause * mk_clause_core(unsigned num_lits, literal * lits, bool learned); clause * mk_clause_core(unsigned num_lits, literal * lits, bool learned);
clause * mk_clause_core(literal_vector const& lits) { return mk_clause_core(lits.size(), lits.c_ptr()); } clause * mk_clause_core(literal_vector const& lits) { return mk_clause_core(lits.size(), lits.c_ptr()); }
clause * mk_clause_core(unsigned num_lits, literal * lits) { return mk_clause_core(num_lits, lits, false); } clause * mk_clause_core(unsigned num_lits, literal * lits) { return mk_clause_core(num_lits, lits, false); }