3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-24 01:25:31 +00:00
This commit is contained in:
Nikolaj Bjorner 2018-10-04 13:43:04 -07:00
commit b540868cd7
13 changed files with 155 additions and 32 deletions

View file

@ -130,6 +130,7 @@ namespace opt {
m_fm(alloc(generic_model_converter, m, "opt")),
m_model_fixed(),
m_objective_refs(m),
m_core(m),
m_enable_sat(false),
m_is_clausal(false),
m_pp_neat(false),
@ -173,10 +174,9 @@ namespace opt {
}
void context::get_unsat_core(expr_ref_vector & r) {
throw default_exception("Unsat cores are not supported with optimization");
r.append(m_core);
}
void context::set_hard_constraints(ptr_vector<expr>& fmls) {
if (m_scoped_state.set(fmls)) {
clear_state();
@ -253,7 +253,7 @@ namespace opt {
m_hard_constraints.append(s.m_hard);
}
lbool context::optimize() {
lbool context::optimize(expr_ref_vector const& asms) {
if (m_pareto) {
return execute_pareto();
}
@ -263,7 +263,10 @@ namespace opt {
clear_state();
init_solver();
import_scoped_state();
normalize();
normalize(asms);
if (m_hard_constraints.size() == 1 && m.is_false(m_hard_constraints.get(0))) {
return l_false;
}
internalize();
update_solver();
if (contains_quantifiers()) {
@ -281,7 +284,7 @@ namespace opt {
symbol pri = optp.priority();
IF_VERBOSE(1, verbose_stream() << "(optimize:check-sat)\n");
lbool is_sat = s.check_sat(0,nullptr);
lbool is_sat = s.check_sat(asms.size(),asms.c_ptr());
TRACE("opt", s.display(tout << "initial search result: " << is_sat << "\n"););
if (is_sat != l_false) {
s.get_model(m_model);
@ -290,6 +293,9 @@ namespace opt {
}
if (is_sat != l_true) {
TRACE("opt", tout << m_hard_constraints << "\n";);
if (!asms.empty()) {
s.get_unsat_core(m_core);
}
return is_sat;
}
IF_VERBOSE(1, verbose_stream() << "(optimize:sat)\n");
@ -749,22 +755,25 @@ namespace opt {
return m_arith.is_numeral(e, n) || m_bv.is_numeral(e, n, sz);
}
void context::normalize() {
void context::normalize(expr_ref_vector const& asms) {
expr_ref_vector fmls(m);
to_fmls(fmls);
simplify_fmls(fmls);
simplify_fmls(fmls, asms);
from_fmls(fmls);
}
void context::simplify_fmls(expr_ref_vector& fmls) {
void context::simplify_fmls(expr_ref_vector& fmls, expr_ref_vector const& asms) {
if (m_is_clausal) {
return;
}
goal_ref g(alloc(goal, m, true, false));
goal_ref g(alloc(goal, m, true, !asms.empty()));
for (expr* fml : fmls) {
g->assert_expr(fml);
}
for (expr * a : asms) {
g->assert_expr(a, a);
}
tactic_ref tac0 =
and_then(mk_simplify_tactic(m, m_params),
mk_propagate_values_tactic(m),
@ -786,6 +795,7 @@ namespace opt {
set_simplify(tac0.get());
}
goal_ref_buffer result;
TRACE("opt", g->display(tout););
(*m_simplify)(g, result);
SASSERT(result.size() == 1);
goal* r = result[0];
@ -795,6 +805,12 @@ namespace opt {
for (unsigned i = 0; i < r->size(); ++i) {
fmls.push_back(r->form(i));
}
if (r->inconsistent()) {
ptr_vector<expr> core_elems;
expr_dependency_ref core(r->dep(0), m);
m.linearize(core, core_elems);
m_core.append(core_elems.size(), core_elems.c_ptr());
}
}
bool context::is_maximize(expr* fml, app_ref& term, expr_ref& orig_term, unsigned& index) {
@ -1393,6 +1409,7 @@ namespace opt {
m_box_index = UINT_MAX;
m_model.reset();
m_model_fixed.reset();
m_core.reset();
}
void context::set_pareto(pareto_base* p) {

View file

@ -164,6 +164,7 @@ namespace opt {
obj_map<func_decl, unsigned> m_objective_fns;
obj_map<func_decl, expr*> m_objective_orig;
func_decl_ref_vector m_objective_refs;
expr_ref_vector m_core;
tactic_ref m_simplify;
bool m_enable_sat;
bool m_enable_sls;
@ -187,7 +188,7 @@ namespace opt {
void pop(unsigned n) override;
bool empty() override { return m_scoped_state.m_objectives.empty(); }
void set_hard_constraints(ptr_vector<expr> & hard) override;
lbool optimize() override;
lbool optimize(expr_ref_vector const& asms) override;
void set_model(model_ref& _m) override { m_model = _m; }
void get_model_core(model_ref& _m) override;
void get_box_model(model_ref& _m, unsigned index) override;
@ -254,7 +255,7 @@ namespace opt {
void reset_maxsmts();
void import_scoped_state();
void normalize();
void normalize(expr_ref_vector const& asms);
void internalize();
bool is_maximize(expr* fml, app_ref& term, expr_ref& orig_term, unsigned& index);
bool is_minimize(expr* fml, app_ref& term, expr_ref& orig_term, unsigned& index);
@ -270,7 +271,7 @@ namespace opt {
expr* mk_objective_fn(unsigned index, objective_t ty, unsigned sz, expr*const* args);
void to_fmls(expr_ref_vector& fmls);
void from_fmls(expr_ref_vector const& fmls);
void simplify_fmls(expr_ref_vector& fmls);
void simplify_fmls(expr_ref_vector& fmls, expr_ref_vector const& asms);
void mk_atomic(expr_ref_vector& terms);
void update_lower() { update_bound(true); }