mirror of
https://github.com/Z3Prover/z3
synced 2025-04-29 03:45:51 +00:00
fix partial model tracking over cancellation/exceptions, reported by August Shi. Fix regression test for fp-to-real, reset the pre-processor in inc_sat_solver on exceptions
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
4cd1efc50e
commit
5994c5a948
19 changed files with 239 additions and 193 deletions
|
@ -69,13 +69,13 @@ namespace opt {
|
|||
s().assert_expr(tmp);
|
||||
}
|
||||
|
||||
void maxsmt_solver_base::init() {
|
||||
bool maxsmt_solver_base::init() {
|
||||
m_lower.reset();
|
||||
m_upper.reset();
|
||||
m_assignment.reset();
|
||||
for (unsigned i = 0; i < m_weights.size(); ++i) {
|
||||
expr_ref val(m);
|
||||
VERIFY(m_model->eval(m_soft[i], val));
|
||||
if (!m_model->eval(m_soft[i], val)) return false;
|
||||
m_assignment.push_back(m.is_true(val));
|
||||
if (!m_assignment.back()) {
|
||||
m_upper += m_weights[i];
|
||||
|
@ -88,6 +88,7 @@ namespace opt {
|
|||
tout << (m_assignment[i]?"T":"F");
|
||||
}
|
||||
tout << "\n";);
|
||||
return true;
|
||||
}
|
||||
|
||||
void maxsmt_solver_base::set_mus(bool f) {
|
||||
|
@ -137,7 +138,8 @@ namespace opt {
|
|||
//m_wth->reset_local();
|
||||
}
|
||||
smt::theory_wmaxsat& maxsmt_solver_base::scoped_ensure_theory::operator()() { return *m_wth; }
|
||||
|
||||
|
||||
|
||||
void maxsmt_solver_base::trace_bounds(char const * solver) {
|
||||
IF_VERBOSE(1,
|
||||
rational l = m_adjust_value(m_lower);
|
||||
|
@ -148,8 +150,8 @@ namespace opt {
|
|||
|
||||
|
||||
|
||||
maxsmt::maxsmt(maxsat_context& c):
|
||||
m(c.get_manager()), m_c(c),
|
||||
maxsmt::maxsmt(maxsat_context& c, unsigned index):
|
||||
m(c.get_manager()), m_c(c), m_index(index),
|
||||
m_soft_constraints(m), m_answer(m) {}
|
||||
|
||||
lbool maxsmt::operator()() {
|
||||
|
@ -159,10 +161,10 @@ namespace opt {
|
|||
IF_VERBOSE(1, verbose_stream() << "(maxsmt)\n";);
|
||||
TRACE("opt", tout << "maxsmt\n";);
|
||||
if (m_soft_constraints.empty() || maxsat_engine == symbol("maxres")) {
|
||||
m_msolver = mk_maxres(m_c, m_weights, m_soft_constraints);
|
||||
m_msolver = mk_maxres(m_c, m_index, m_weights, m_soft_constraints);
|
||||
}
|
||||
else if (maxsat_engine == symbol("pd-maxres")) {
|
||||
m_msolver = mk_primal_dual_maxres(m_c, m_weights, m_soft_constraints);
|
||||
m_msolver = mk_primal_dual_maxres(m_c, m_index, m_weights, m_soft_constraints);
|
||||
}
|
||||
else if (maxsat_engine == symbol("bcd2")) {
|
||||
m_msolver = mk_bcd2(m_c, m_weights, m_soft_constraints);
|
||||
|
@ -188,7 +190,13 @@ namespace opt {
|
|||
if (m_msolver) {
|
||||
m_msolver->updt_params(m_params);
|
||||
m_msolver->set_adjust_value(m_adjust_value);
|
||||
is_sat = (*m_msolver)();
|
||||
is_sat = l_undef;
|
||||
try {
|
||||
is_sat = (*m_msolver)();
|
||||
}
|
||||
catch (z3_exception&) {
|
||||
is_sat = l_undef;
|
||||
}
|
||||
if (is_sat != l_false) {
|
||||
m_msolver->get_model(m_model, m_labels);
|
||||
}
|
||||
|
@ -205,6 +213,14 @@ namespace opt {
|
|||
return is_sat;
|
||||
}
|
||||
|
||||
void maxsmt::set_adjust_value(adjust_value& adj) {
|
||||
m_adjust_value = adj;
|
||||
if (m_msolver) {
|
||||
m_msolver->set_adjust_value(m_adjust_value);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void maxsmt::verify_assignment() {
|
||||
// TBD: have to use a different solver
|
||||
// because we don't push local scope any longer.
|
||||
|
@ -233,7 +249,7 @@ namespace opt {
|
|||
rational r = m_upper;
|
||||
if (m_msolver) {
|
||||
rational q = m_msolver->get_upper();
|
||||
if (q < r) r = q;
|
||||
if (q < r) r = q;
|
||||
}
|
||||
return m_adjust_value(r);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue