mirror of
https://github.com/Z3Prover/z3
synced 2025-06-04 05:11:21 +00:00
basic primal/dual
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
5fdb58348e
commit
b45b2872d8
2 changed files with 28 additions and 17 deletions
|
@ -78,7 +78,7 @@ private:
|
||||||
expr_ref_vector m_B;
|
expr_ref_vector m_B;
|
||||||
expr_ref_vector m_asms;
|
expr_ref_vector m_asms;
|
||||||
obj_map<expr, rational> m_asm2weight;
|
obj_map<expr, rational> m_asm2weight;
|
||||||
obj_map<expr, lbool> m_asm2value;
|
obj_map<expr, bool> m_asm2value;
|
||||||
ptr_vector<expr> m_new_core;
|
ptr_vector<expr> m_new_core;
|
||||||
mus m_mus;
|
mus m_mus;
|
||||||
mss m_mss;
|
mss m_mss;
|
||||||
|
@ -284,8 +284,8 @@ public:
|
||||||
|
|
||||||
*/
|
*/
|
||||||
lbool mus_mss2_solver() {
|
lbool mus_mss2_solver() {
|
||||||
m_all_cores = true;
|
// m_all_cores = true;
|
||||||
//m_add_upper_bound_block = true;
|
// m_add_upper_bound_block = true;
|
||||||
bool maximize_assignment = false;
|
bool maximize_assignment = false;
|
||||||
init();
|
init();
|
||||||
init_local();
|
init_local();
|
||||||
|
@ -333,10 +333,11 @@ public:
|
||||||
// Extend the current model to a (maximal)
|
// Extend the current model to a (maximal)
|
||||||
// assignment extracting the ss and cs.
|
// assignment extracting the ss and cs.
|
||||||
// ss - satisfying subset
|
// ss - satisfying subset
|
||||||
// cs - correction set (complement of it).
|
// cs - correction set (complement of ss).
|
||||||
//
|
//
|
||||||
if (maximize_assignment) {
|
if (maximize_assignment) {
|
||||||
exprs ss, cs;
|
exprs ss, cs;
|
||||||
|
// TBD: current model has to evaluate all auxiliary predicates.
|
||||||
is_sat = get_mss(cores, ss, cs);
|
is_sat = get_mss(cores, ss, cs);
|
||||||
if (is_sat != l_true) return is_sat;
|
if (is_sat != l_true) return is_sat;
|
||||||
update_mss_model();
|
update_mss_model();
|
||||||
|
@ -364,15 +365,13 @@ public:
|
||||||
|
|
||||||
void found_optimum() {
|
void found_optimum() {
|
||||||
s().get_model(m_model);
|
s().get_model(m_model);
|
||||||
expr_ref tmp(m);
|
m_asm2value.reset();
|
||||||
DEBUG_CODE(
|
DEBUG_CODE(
|
||||||
for (unsigned i = 0; i < m_asms.size(); ++i) {
|
for (unsigned i = 0; i < m_asms.size(); ++i) {
|
||||||
VERIFY(m_model->eval(m_asms[i].get(), tmp));
|
SASSERT(is_true(m_asms[i].get()));
|
||||||
SASSERT(m.is_true(tmp));
|
|
||||||
});
|
});
|
||||||
for (unsigned i = 0; i < m_soft.size(); ++i) {
|
for (unsigned i = 0; i < m_soft.size(); ++i) {
|
||||||
VERIFY(m_model->eval(m_soft[i].get(), tmp));
|
m_assignment[i] = is_true(m_soft[i].get());
|
||||||
m_assignment[i] = m.is_true(tmp);
|
|
||||||
}
|
}
|
||||||
m_upper = m_lower;
|
m_upper = m_lower;
|
||||||
}
|
}
|
||||||
|
@ -445,10 +444,8 @@ public:
|
||||||
void get_current_correction_set(exprs& cs) {
|
void get_current_correction_set(exprs& cs) {
|
||||||
TRACE("opt", display_vec(tout << "old correction set: ", cs.size(), cs.c_ptr()););
|
TRACE("opt", display_vec(tout << "old correction set: ", cs.size(), cs.c_ptr()););
|
||||||
cs.reset();
|
cs.reset();
|
||||||
expr_ref tmp(m);
|
|
||||||
for (unsigned i = 0; i < m_asms.size(); ++i) {
|
for (unsigned i = 0; i < m_asms.size(); ++i) {
|
||||||
VERIFY(m_model->eval(m_asms[i].get(), tmp));
|
if (!is_true(m_asms[i].get())) {
|
||||||
if (!m.is_true(tmp)) {
|
|
||||||
cs.push_back(m_asms[i].get());
|
cs.push_back(m_asms[i].get());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -653,12 +650,17 @@ public:
|
||||||
s().assert_expr(fml);
|
s().assert_expr(fml);
|
||||||
fml = m.mk_implies(dd, b_i);
|
fml = m.mk_implies(dd, b_i);
|
||||||
s().assert_expr(fml);
|
s().assert_expr(fml);
|
||||||
|
m_asm2value.insert(dd, is_true(d) && is_true(b_i));
|
||||||
d = dd;
|
d = dd;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
d = m.mk_and(b_i, d);
|
dd = m.mk_and(b_i, d);
|
||||||
|
m_asm2value.insert(dd, is_true(d) && is_true(b_i));
|
||||||
|
m_trail.push_back(dd);
|
||||||
|
d = dd;
|
||||||
}
|
}
|
||||||
asum = mk_fresh_bool("a");
|
asum = mk_fresh_bool("a");
|
||||||
|
m_asm2value.insert(asum, is_true(b_i1) || is_true(d));
|
||||||
cls = m.mk_or(b_i1, d);
|
cls = m.mk_or(b_i1, d);
|
||||||
fml = m.mk_implies(asum, cls);
|
fml = m.mk_implies(asum, cls);
|
||||||
new_assumption(asum, w);
|
new_assumption(asum, w);
|
||||||
|
@ -792,11 +794,10 @@ public:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
m_model = mdl;
|
m_model = mdl;
|
||||||
|
m_asm2value.reset();
|
||||||
|
|
||||||
for (unsigned i = 0; i < m_soft.size(); ++i) {
|
for (unsigned i = 0; i < m_soft.size(); ++i) {
|
||||||
expr* n = m_soft[i].get();
|
m_assignment[i] = is_true(m_soft[i].get());
|
||||||
VERIFY(m_model->eval(n, tmp));
|
|
||||||
m_assignment[i] = m.is_true(tmp);
|
|
||||||
}
|
}
|
||||||
m_upper = upper;
|
m_upper = upper;
|
||||||
// verify_assignment();
|
// verify_assignment();
|
||||||
|
@ -815,6 +816,16 @@ public:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool is_true(expr* e) {
|
||||||
|
bool truth_value;
|
||||||
|
if (m_asm2value.find(e, truth_value)) {
|
||||||
|
return truth_value;
|
||||||
|
}
|
||||||
|
expr_ref tmp(m);
|
||||||
|
VERIFY(m_model->eval(e, tmp));
|
||||||
|
return m.is_true(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
void remove_soft(exprs const& core, expr_ref_vector& asms) {
|
void remove_soft(exprs const& core, expr_ref_vector& asms) {
|
||||||
for (unsigned i = 0; i < asms.size(); ++i) {
|
for (unsigned i = 0; i < asms.size(); ++i) {
|
||||||
if (core.contains(asms[i].get())) {
|
if (core.contains(asms[i].get())) {
|
||||||
|
|
|
@ -35,7 +35,7 @@ namespace opt {
|
||||||
bool mss::check_result() {
|
bool mss::check_result() {
|
||||||
lbool is_sat = m_s.check_sat(m_mss.size(), m_mss.c_ptr());
|
lbool is_sat = m_s.check_sat(m_mss.size(), m_mss.c_ptr());
|
||||||
if (is_sat == l_undef) return true;
|
if (is_sat == l_undef) return true;
|
||||||
SASSERT(is_sat == l_true);
|
SASSERT(m_mss.empty() || is_sat == l_true);
|
||||||
if (is_sat == l_false) return false;
|
if (is_sat == l_false) return false;
|
||||||
expr_set::iterator it = m_mcs.begin(), end = m_mcs.end();
|
expr_set::iterator it = m_mcs.begin(), end = m_mcs.end();
|
||||||
for (; it != end; ++it) {
|
for (; it != end; ++it) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue