mirror of
https://github.com/Z3Prover/z3
synced 2025-04-24 01:25:31 +00:00
fix model conversion bugs
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
b129ee764f
commit
ece5ad90e0
11 changed files with 68 additions and 88 deletions
|
@ -347,6 +347,17 @@ namespace sat {
|
|||
return result;
|
||||
}
|
||||
|
||||
void model_converter::swap(bool_var v, unsigned sz, literal_vector& clause) {
|
||||
for (unsigned j = 0; j < sz; ++j) {
|
||||
if (v == clause[j].var()) {
|
||||
std::swap(clause[0], clause[j]);
|
||||
return;
|
||||
}
|
||||
}
|
||||
IF_VERBOSE(0, verbose_stream() << "not found: v" << v << " " << clause << "\n";);
|
||||
UNREACHABLE();
|
||||
}
|
||||
|
||||
void model_converter::expand(literal_vector& update_stack) {
|
||||
sat::literal_vector clause;
|
||||
for (entry const& e : m_entries) {
|
||||
|
@ -357,34 +368,23 @@ namespace sat {
|
|||
if (l == null_literal) {
|
||||
elim_stack* st = e.m_elim_stack[index];
|
||||
if (st) {
|
||||
// clause sizes increase
|
||||
elim_stackv const& stack = st->stack();
|
||||
unsigned sz = stack.size();
|
||||
for (unsigned i = 0; i < sz; ++i) {
|
||||
unsigned csz = stack[i].first;
|
||||
literal lit = stack[i].second;
|
||||
BOOL found = false;
|
||||
unsigned j = 0;
|
||||
for (j = 0; j < csz; ++j) {
|
||||
if (clause[j] == lit) {
|
||||
std::swap(clause[j], clause[0]);
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
SASSERT(found);
|
||||
// clause sizes increase, so we can always swap
|
||||
// the blocked literal to the front from the prefix.
|
||||
for (auto const& p : st->stack()) {
|
||||
unsigned csz = p.first;
|
||||
literal lit = p.second;
|
||||
swap(lit.var(), csz, clause);
|
||||
update_stack.append(csz, clause.c_ptr());
|
||||
update_stack.push_back(null_literal);
|
||||
}
|
||||
}
|
||||
swap(e.var(), clause.size(), clause);
|
||||
update_stack.append(clause);
|
||||
update_stack.push_back(null_literal);
|
||||
clause.reset();
|
||||
continue;
|
||||
}
|
||||
clause.push_back(l);
|
||||
if (l.var() == e.var()) {
|
||||
std::swap(clause[0], clause.back());
|
||||
else {
|
||||
clause.push_back(l);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -94,6 +94,8 @@ namespace sat {
|
|||
|
||||
bool legal_to_flip(bool_var v) const;
|
||||
|
||||
void swap(bool_var v, unsigned sz, literal_vector& clause);
|
||||
|
||||
public:
|
||||
model_converter();
|
||||
~model_converter();
|
||||
|
|
|
@ -231,7 +231,7 @@ namespace sat {
|
|||
if (bce_enabled() || abce_enabled() || bca_enabled()) {
|
||||
elim_blocked_clauses();
|
||||
}
|
||||
si.check_watches();
|
||||
if (!m_need_cleanup) si.check_watches();
|
||||
|
||||
if (!learned) {
|
||||
m_num_calls++;
|
||||
|
@ -680,7 +680,7 @@ namespace sat {
|
|||
}
|
||||
|
||||
void simplifier::elim_lit(clause & c, literal l) {
|
||||
TRACE("elim_lit", tout << "processing: " << c << "\n";);
|
||||
TRACE("elim_lit", tout << "processing: " << l << " @ " << c << "\n";);
|
||||
m_need_cleanup = true;
|
||||
m_num_elim_lits++;
|
||||
insert_elim_todo(l.var());
|
||||
|
@ -979,23 +979,23 @@ namespace sat {
|
|||
|
||||
void operator()() {
|
||||
integrity_checker si(s.s);
|
||||
si.check_watches();
|
||||
//si.check_watches();
|
||||
if (s.bce_enabled()) {
|
||||
block_clauses();
|
||||
}
|
||||
si.check_watches();
|
||||
//si.check_watches();
|
||||
if (s.abce_enabled()) {
|
||||
cce<false>();
|
||||
}
|
||||
si.check_watches();
|
||||
//si.check_watches();
|
||||
if (s.cce_enabled()) {
|
||||
cce<true>();
|
||||
}
|
||||
si.check_watches();
|
||||
//si.check_watches();
|
||||
if (s.bca_enabled()) {
|
||||
bca();
|
||||
}
|
||||
si.check_watches();
|
||||
//si.check_watches();
|
||||
}
|
||||
|
||||
void block_clauses() {
|
||||
|
@ -1829,7 +1829,6 @@ namespace sat {
|
|||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -54,7 +54,6 @@ class inc_sat_solver : public solver {
|
|||
unsigned m_fmls_head;
|
||||
expr_ref_vector m_core;
|
||||
atom2bool_var m_map;
|
||||
model_ref m_model;
|
||||
scoped_ptr<bit_blaster_rewriter> m_bb_rewriter;
|
||||
tactic_ref m_preprocess;
|
||||
unsigned m_num_scopes;
|
||||
|
@ -183,7 +182,6 @@ public:
|
|||
|
||||
TRACE("sat", tout << _assumptions << "\n";);
|
||||
dep2asm_t dep2asm;
|
||||
m_model = 0;
|
||||
lbool r = internalize_formulas();
|
||||
if (r != l_true) return r;
|
||||
r = internalize_assumptions(sz, _assumptions.c_ptr(), dep2asm);
|
||||
|
@ -289,12 +287,6 @@ public:
|
|||
r.reset();
|
||||
r.append(m_core.size(), m_core.c_ptr());
|
||||
}
|
||||
virtual void get_model_core(model_ref & mdl) {
|
||||
if (!m_model.get()) {
|
||||
extract_model();
|
||||
}
|
||||
mdl = m_model;
|
||||
}
|
||||
virtual proof * get_proof() {
|
||||
UNREACHABLE();
|
||||
return 0;
|
||||
|
@ -302,7 +294,6 @@ public:
|
|||
|
||||
virtual expr_ref_vector cube(expr_ref_vector& vs, unsigned backtrack_level) {
|
||||
if (!is_internalized()) {
|
||||
m_model = 0;
|
||||
lbool r = internalize_formulas();
|
||||
if (r != l_true) return expr_ref_vector(m);
|
||||
}
|
||||
|
@ -789,14 +780,14 @@ private:
|
|||
}
|
||||
}
|
||||
|
||||
void extract_model() {
|
||||
virtual void get_model_core(model_ref & mdl) {
|
||||
TRACE("sat", tout << "retrieve model " << (m_solver.model_is_current()?"present":"absent") << "\n";);
|
||||
if (!m_solver.model_is_current()) {
|
||||
m_model = 0;
|
||||
mdl = nullptr;
|
||||
return;
|
||||
}
|
||||
sat::model const & ll_m = m_solver.get_model();
|
||||
model_ref md = alloc(model, m);
|
||||
mdl = alloc(model, m);
|
||||
for (auto const& kv : m_map) {
|
||||
expr * n = kv.m_key;
|
||||
if (is_app(n) && to_app(n)->get_num_args() > 0) {
|
||||
|
@ -805,40 +796,39 @@ private:
|
|||
sat::bool_var v = kv.m_value;
|
||||
switch (sat::value_at(v, ll_m)) {
|
||||
case l_true:
|
||||
md->register_decl(to_app(n)->get_decl(), m.mk_true());
|
||||
mdl->register_decl(to_app(n)->get_decl(), m.mk_true());
|
||||
break;
|
||||
case l_false:
|
||||
md->register_decl(to_app(n)->get_decl(), m.mk_false());
|
||||
mdl->register_decl(to_app(n)->get_decl(), m.mk_false());
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
m_model = md;
|
||||
//IF_VERBOSE(0, model_v2_pp(verbose_stream(), *m_model, true););
|
||||
//IF_VERBOSE(0, model_v2_pp(verbose_stream(), *mdl, true););
|
||||
|
||||
if (m_sat_mc) {
|
||||
// IF_VERBOSE(0, m_sat_mc->display(verbose_stream() << "satmc\n"););
|
||||
(*m_sat_mc)(m_model);
|
||||
//IF_VERBOSE(0, m_sat_mc->display(verbose_stream() << "satmc\n"););
|
||||
(*m_sat_mc)(mdl);
|
||||
}
|
||||
insert_const2bits();
|
||||
if (m_mc0) {
|
||||
// IF_VERBOSE(0, m_mc0->display(verbose_stream() << "mc0\n"););
|
||||
(*m_mc0)(m_model);
|
||||
//IF_VERBOSE(0, m_mc0->display(verbose_stream() << "mc0\n"););
|
||||
(*m_mc0)(mdl);
|
||||
}
|
||||
TRACE("sat", model_smt2_pp(tout, m, *m_model, 0););
|
||||
TRACE("sat", model_smt2_pp(tout, m, *mdl, 0););
|
||||
|
||||
// IF_VERBOSE(0, model_smt2_pp(verbose_stream() << "after\n", m, *mdl, 0););
|
||||
|
||||
// IF_VERBOSE(0, m_sat_mc->display(verbose_stream() << "after\n"););
|
||||
|
||||
#if 1
|
||||
#if 0
|
||||
IF_VERBOSE(0, verbose_stream() << "Verifying solution\n";);
|
||||
model_evaluator eval(*m_model);
|
||||
model_evaluator eval(*mdl);
|
||||
for (expr * f : m_fmls) {
|
||||
expr_ref tmp(m);
|
||||
eval(f, tmp);
|
||||
CTRACE("sat", !m.is_true(tmp),
|
||||
tout << "Evaluation failed: " << mk_pp(f, m) << " to " << mk_pp(f, m) << "\n";
|
||||
model_smt2_pp(tout, m, *(m_model.get()), 0););
|
||||
model_smt2_pp(tout, m, *(mdl.get()), 0););
|
||||
if (!m.is_true(tmp)) {
|
||||
IF_VERBOSE(0, verbose_stream() << "failed to verify: " << mk_pp(f, m) << "\n";);
|
||||
IF_VERBOSE(0, verbose_stream() << m_params << "\n";);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue