mirror of
https://github.com/Z3Prover/z3
synced 2025-06-27 08:28:44 +00:00
fix drat output for elim_eqs
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
b12c1b1cba
commit
6e60926cc3
4 changed files with 60 additions and 27 deletions
|
@ -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,31 +144,40 @@ 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;
|
||||||
|
@ -156,28 +185,28 @@ namespace sat {
|
||||||
}
|
}
|
||||||
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)););
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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); }
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue