3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-06-20 12:53:38 +00:00

fix another recompilation bug

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2018-02-09 13:47:55 -08:00
parent 4f7b6a2f18
commit f28b158d57
2 changed files with 50 additions and 19 deletions

View file

@ -2615,8 +2615,9 @@ namespace sat {
// pre-condition is that the literals, except c.lit(), in c are unwatched. // pre-condition is that the literals, except c.lit(), in c are unwatched.
if (c.id() == _bad_id) std::cout << "recompile: " << c << "\n"; if (c.id() == _bad_id) std::cout << "recompile: " << c << "\n";
// IF_VERBOSE(0, verbose_stream() << c << "\n";);
m_weights.resize(2*s().num_vars(), 0); m_weights.resize(2*s().num_vars(), 0);
// for (unsigned w : m_weights) VERIFY(w == 0);
for (literal l : c) { for (literal l : c) {
++m_weights[l.index()]; ++m_weights[l.index()];
} }
@ -2673,6 +2674,36 @@ namespace sat {
return; return;
} }
if (sz == 0) {
if (c.lit() == null_literal) {
if (k > 0) {
s().mk_clause(0, nullptr, true);
}
}
else if (k > 0) {
literal lit = ~c.lit();
s().mk_clause(1, &lit, c.learned());
}
else {
literal lit = c.lit();
s().mk_clause(1, &lit, c.learned());
}
remove_constraint(c, "recompiled to clause");
return;
}
if (all_units && sz < k) {
// IF_VERBOSE(0, verbose_stream() << "all units " << sz << " " << k << "\n");
if (c.lit() == null_literal) {
s().mk_clause(0, nullptr, true);
}
else {
literal lit = ~c.lit();
s().mk_clause(1, &lit, c.learned());
}
remove_constraint(c, "recompiled to clause");
return;
}
// IF_VERBOSE(0, verbose_stream() << "csz: " << c.size() << " ck:" << c.k() << " sz:" << sz << " k:" << k << "\n");
VERIFY(!all_units || c.size() - c.k() >= sz - k); VERIFY(!all_units || c.size() - c.k() >= sz - k);
c.set_size(sz); c.set_size(sz);
c.set_k(k); c.set_k(k);

View file

@ -29,24 +29,24 @@ static unsigned_vector g_handles;
static void display_results() { static void display_results() {
if (g_opt) { IF_VERBOSE(1,
model_ref mdl; if (g_opt) {
g_opt->get_model(mdl); model_ref mdl;
if (mdl) { g_opt->get_model(mdl);
model_smt2_pp(std::cout, g_opt->get_manager(), *mdl, 0); if (mdl) {
} model_smt2_pp(verbose_stream(), g_opt->get_manager(), *mdl, 0);
}
for (unsigned h : g_handles) { for (unsigned h : g_handles) {
expr_ref lo = g_opt->get_lower(h); expr_ref lo = g_opt->get_lower(h);
expr_ref hi = g_opt->get_upper(h); expr_ref hi = g_opt->get_upper(h);
if (lo == hi) { if (lo == hi) {
std::cout << " " << lo << "\n"; std::cout << " " << lo << "\n";
} }
else { else {
std::cout << " [" << lo << ":" << hi << "]\n"; std::cout << " [" << lo << ":" << hi << "]\n";
} }
} }
} });
} }
static void display_statistics() { static void display_statistics() {