3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-23 09:05:31 +00:00
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2014-10-04 19:50:42 -07:00
parent 2bf0b5f33f
commit db20b2502d
11 changed files with 338 additions and 92 deletions

View file

@ -316,6 +316,7 @@ private:
for (; it != end; ++it) {
asms.push_back(it->m_value);
}
//IF_VERBOSE(0, verbose_stream() << asms << "\n";);
}
void extract_core(dep2asm_t& dep2asm) {
@ -341,7 +342,7 @@ private:
m_core.reset();
for (unsigned i = 0; i < core.size(); ++i) {
expr* e;
VERIFY (asm2dep.find(core[i].index(), e));
VERIFY(asm2dep.find(core[i].index(), e));
m_core.push_back(e);
}
@ -397,6 +398,14 @@ private:
SASSERT(m_model);
// IF_VERBOSE(0, model_smt2_pp(verbose_stream(), m, *(m_model.get()), 0););
DEBUG_CODE(
for (unsigned i = 0; i < m_fmls.size(); ++i) {
expr_ref tmp(m);
VERIFY(m_model->eval(m_fmls[i].get(), tmp));
CTRACE("opt", !m.is_true(tmp),
tout << "Evaluation failed: " << mk_pp(m_fmls[i].get(), m) << "\n";);
SASSERT(m.is_true(tmp));
});
}
};

View file

@ -64,6 +64,7 @@ Notes:
#include "pb_decl_plugin.h"
#include "opt_params.hpp"
#include "ast_util.h"
#include "smt_solver.h"
using namespace opt;
@ -150,6 +151,7 @@ public:
}
void new_assumption(expr* e, rational const& w) {
IF_VERBOSE(3, verbose_stream() << "new assumption " << mk_pp(e, m) << " " << w << "\n";);
TRACE("opt", tout << "insert: " << mk_pp(e, m) << " : " << w << "\n";);
m_asm2weight.insert(e, w);
m_asms.push_back(e);
@ -171,7 +173,6 @@ public:
if (m_cancel) {
return l_undef;
}
model_ref mdl;
switch (is_sat) {
case l_true:
found_optimum();
@ -179,7 +180,6 @@ public:
case l_false:
is_sat = process_unsat();
if (is_sat != l_true) return is_sat;
get_mus_model(mdl);
break;
case l_undef:
return l_undef;
@ -187,6 +187,7 @@ public:
break;
}
}
trace_bounds("maxres");
return l_true;
}
@ -370,6 +371,7 @@ public:
}
void found_optimum() {
IF_VERBOSE(1, verbose_stream() << "found optimum\n";);
s().get_model(m_model);
DEBUG_CODE(
for (unsigned i = 0; i < m_asms.size(); ++i) {
@ -404,6 +406,9 @@ public:
while (is_sat == l_false) {
core.reset();
s().get_unsat_core(core);
//verify_core(core);
model_ref mdl;
get_mus_model(mdl);
is_sat = minimize_core(core);
if (is_sat != l_true) {
break;
@ -420,18 +425,12 @@ public:
break;
}
remove_soft(core, asms);
TRACE("opt",
display_vec(tout << "core: ", core.size(), core.c_ptr());
display_vec(tout << "assumptions: ", asms.size(), asms.c_ptr()););
is_sat = check_sat_hill_climb(asms);
}
TRACE("opt",
tout << "num cores: " << cores.size() << "\n";
for (unsigned i = 0; i < cores.size(); ++i) {
for (unsigned j = 0; j < cores[i].size(); ++j) {
tout << mk_pp(cores[i][j], m) << " ";
}
tout << "\n";
display_vec(tout, cores[i].size(), cores[i].c_ptr());
}
tout << "num satisfying: " << asms.size() << "\n";);
@ -535,6 +534,7 @@ public:
if (m_c.sat_enabled()) {
// SAT solver core extracts some model
// during unsat core computation.
mdl = 0;
s().get_model(mdl);
}
else {
@ -601,10 +601,7 @@ public:
// find the minimal weight:
rational w = get_weight(core[0]);
for (unsigned i = 1; i < core.size(); ++i) {
rational w2 = get_weight(core[i]);
if (w2 < w) {
w = w2;
}
w = std::min(w, get_weight(core[i]));
}
// add fresh soft clauses for weights that are above w.
for (unsigned i = 0; i < core.size(); ++i) {
@ -614,6 +611,7 @@ public:
new_assumption(core[i], w3);
}
}
return w;
}
@ -754,6 +752,7 @@ public:
case l_false:
core.reset();
s().get_unsat_core(core);
DEBUG_CODE(verify_core(core););
is_sat = minimize_core(core);
if (is_sat != l_true) {
break;
@ -786,14 +785,9 @@ public:
rational upper(0);
expr_ref tmp(m);
for (unsigned i = 0; i < m_soft.size(); ++i) {
expr* n = m_soft[i];
VERIFY(mdl->eval(n, tmp));
if (!m.is_true(tmp)) {
if (!is_true(mdl, m_soft[i])) {
upper += m_weights[i];
}
TRACE("opt", tout << mk_pp(n, m) << " |-> " << mk_pp(tmp, m) << "\n";);
CTRACE("opt", !m.is_true(tmp) && !m.is_false(tmp),
tout << mk_pp(n, m) << " |-> " << mk_pp(tmp, m) << "\n";);
}
if (upper >= m_upper) {
return;
@ -804,7 +798,7 @@ public:
m_assignment[i] = is_true(m_soft[i]);
}
m_upper = upper;
// verify_assignment();
DEBUG_CODE(verify_assignment(););
trace_bounds("maxres");
add_upper_bound_block();
@ -888,6 +882,38 @@ public:
}
}
void verify_core(exprs const& core) {
IF_VERBOSE(3, verbose_stream() << "verify core\n";);
ref<solver> sat_solver = mk_inc_sat_solver(m, m_params);
for (unsigned i = 0; i < s().get_num_assertions(); ++i) {
sat_solver->assert_expr(s().get_assertion(i));
}
expr_ref n(m);
for (unsigned i = 0; i < core.size(); ++i) {
IF_VERBOSE(1, verbose_stream() << mk_pp(core[i],m) << " ";);
sat_solver->assert_expr(core[i]);
}
IF_VERBOSE(1, verbose_stream() << "\n";);
lbool is_sat = sat_solver->check_sat(0, 0);
if (is_sat != l_false) {
IF_VERBOSE(0, verbose_stream() << "!!!not a core\n";);
}
sat_solver = mk_smt_solver(m, m_params, symbol());
for (unsigned i = 0; i < s().get_num_assertions(); ++i) {
sat_solver->assert_expr(s().get_assertion(i));
}
for (unsigned i = 0; i < core.size(); ++i) {
sat_solver->assert_expr(core[i]);
}
is_sat = sat_solver->check_sat(0, 0);
if (is_sat == l_true) {
IF_VERBOSE(0, verbose_stream() << "not a core\n";);
}
}
void verify_assignment() {
IF_VERBOSE(0, verbose_stream() << "verify assignment\n";);
ref<solver> sat_solver = mk_inc_sat_solver(m, m_params);