mirror of
https://github.com/Z3Prover/z3
synced 2025-04-23 00:55:31 +00:00
remove min/max, use qmax; disable cancellation during model evaluation
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
d2622da747
commit
1aa3fdab8a
12 changed files with 19 additions and 234 deletions
|
@ -24,9 +24,9 @@ Revision History:
|
|||
#include "ast_util.h"
|
||||
#include "arith_decl_plugin.h"
|
||||
#include "ast_pp.h"
|
||||
#include "model_v2_pp.h"
|
||||
#include "th_rewriter.h"
|
||||
#include "expr_functors.h"
|
||||
#include "model_v2_pp.h"
|
||||
#include "expr_safe_replace.h"
|
||||
#include "model_based_opt.h"
|
||||
|
||||
|
@ -103,19 +103,19 @@ namespace qe {
|
|||
expr_ref t(m);
|
||||
opt::ineq_type ty = opt::t_le;
|
||||
expr* e1, *e2;
|
||||
DEBUG_CODE(expr_ref val(m); VERIFY(model.eval(lit, val) && m.is_true(val)););
|
||||
|
||||
bool is_not = m.is_not(lit, lit);
|
||||
if (is_not) {
|
||||
mul.neg();
|
||||
}
|
||||
SASSERT(!m.is_not(lit));
|
||||
if (a.is_le(lit, e1, e2) || a.is_ge(lit, e2, e1)) {
|
||||
if (is_not) mul.neg();
|
||||
linearize(mbo, model, mul, e1, c, ts, tids);
|
||||
linearize(mbo, model, -mul, e2, c, ts, tids);
|
||||
ty = is_not ? opt::t_lt : opt::t_le;
|
||||
}
|
||||
else if (a.is_lt(lit, e1, e2) || a.is_gt(lit, e2, e1)) {
|
||||
if (is_not) mul.neg();
|
||||
linearize(mbo, model, mul, e1, c, ts, tids);
|
||||
linearize(mbo, model, -mul, e2, c, ts, tids);
|
||||
ty = is_not ? opt::t_le: opt::t_lt;
|
||||
|
|
138
src/qe/qsat.cpp
138
src/qe/qsat.cpp
|
@ -618,7 +618,7 @@ namespace qe {
|
|||
}
|
||||
|
||||
kernel& get_kernel(unsigned j) {
|
||||
if (m_kernel_ex || is_exists(j)) {
|
||||
if (is_exists(j)) {
|
||||
return m_ex;
|
||||
}
|
||||
else {
|
||||
|
@ -735,11 +735,7 @@ namespace qe {
|
|||
void display(std::ostream& out) const {
|
||||
out << "level: " << m_level << "\n";
|
||||
for (unsigned i = 0; i < m_vars.size(); ++i) {
|
||||
for (unsigned j = 0; j < m_vars[i].size(); ++j) {
|
||||
expr* v = m_vars[i][j];
|
||||
out << mk_pp(v, m) << " ";
|
||||
}
|
||||
out << "\n";
|
||||
out << m_vars[i] << "\n";
|
||||
}
|
||||
m_pred_abs.display(out);
|
||||
}
|
||||
|
@ -1070,8 +1066,7 @@ namespace qe {
|
|||
m_level(0),
|
||||
m_mode(mode),
|
||||
m_avars(m),
|
||||
m_free_vars(m),
|
||||
m_kernel_ex(false)
|
||||
m_free_vars(m)
|
||||
{
|
||||
reset();
|
||||
}
|
||||
|
@ -1238,90 +1233,6 @@ namespace qe {
|
|||
}
|
||||
|
||||
|
||||
bool m_kernel_ex;
|
||||
|
||||
lbool max_min(expr_ref_vector const& fmls, svector<bool> const& is_max, app_ref_vector const& vars, app* t) {
|
||||
m_kernel_ex = true;
|
||||
// Assume this is the only call to check.
|
||||
expr_ref_vector defs(m);
|
||||
app_ref_vector free_vars(m), vars1(m);
|
||||
expr_ref fml = mk_and(fmls);
|
||||
m_pred_abs.get_free_vars(fml, free_vars);
|
||||
m_pred_abs.abstract_atoms(fml, defs);
|
||||
fml = m_pred_abs.mk_abstract(fml);
|
||||
get_kernel(0).k().assert_expr(mk_and(defs));
|
||||
get_kernel(0).k().assert_expr(fml);
|
||||
obj_hashtable<app> var_set;
|
||||
for (unsigned i = 0; i < vars.size(); ++i) {
|
||||
var_set.insert(vars[i]);
|
||||
}
|
||||
for (unsigned i = 0; i < free_vars.size(); ++i) {
|
||||
app* v = free_vars[i].get();
|
||||
if (!var_set.contains(v)) {
|
||||
vars1.push_back(v);
|
||||
}
|
||||
}
|
||||
//
|
||||
// Insert all variables in alternating list of max/min objectives.
|
||||
// By convention, the outer-most level is max.
|
||||
//
|
||||
bool is_m = true;
|
||||
for (unsigned i = 0; i < vars.size(); ++i) {
|
||||
if (is_m != is_max[i]) {
|
||||
m_vars.push_back(vars1);
|
||||
vars1.reset();
|
||||
is_m = is_max[i];
|
||||
}
|
||||
vars1.push_back(vars[i]);
|
||||
}
|
||||
m_vars.push_back(vars1);
|
||||
|
||||
return max_min();
|
||||
}
|
||||
|
||||
lbool max_min() {
|
||||
while (true) {
|
||||
++m_stats.m_num_rounds;
|
||||
check_cancel();
|
||||
expr_ref_vector asms(m_asms);
|
||||
m_pred_abs.get_assumptions(m_model.get(), asms);
|
||||
//
|
||||
// TBD: add bound to asms.
|
||||
//
|
||||
smt::kernel& k = get_kernel(m_level).k();
|
||||
lbool res = k.check(asms);
|
||||
switch (res) {
|
||||
case l_true:
|
||||
k.get_model(m_model);
|
||||
SASSERT(validate_model(asms));
|
||||
TRACE("qe", k.display(tout); display(tout << "\n", *m_model.get()); display(tout, asms); );
|
||||
//
|
||||
// TBD: compute new bound on objective.
|
||||
//
|
||||
push();
|
||||
break;
|
||||
case l_false:
|
||||
switch (m_level) {
|
||||
case 0: return l_false;
|
||||
case 1:
|
||||
// TBD
|
||||
break;
|
||||
default:
|
||||
if (m_model.get()) {
|
||||
project(asms);
|
||||
}
|
||||
else {
|
||||
pop(1);
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case l_undef:
|
||||
return res;
|
||||
}
|
||||
}
|
||||
return l_undef;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
@ -1331,49 +1242,6 @@ namespace qe {
|
|||
return qs.maximize(fmls, t, mdl, value);
|
||||
}
|
||||
|
||||
|
||||
struct max_min_opt::imp {
|
||||
|
||||
expr_ref_vector m_fmls;
|
||||
qsat m_qsat;
|
||||
|
||||
imp(ast_manager& m, params_ref const& p):
|
||||
m_fmls(m),
|
||||
m_qsat(m, p, qsat_maximize)
|
||||
{}
|
||||
|
||||
void add(expr* e) {
|
||||
m_fmls.push_back(e);
|
||||
}
|
||||
|
||||
lbool check(svector<bool> const& is_max, app_ref_vector const& vars, app* t) {
|
||||
return m_qsat.max_min(m_fmls, is_max, vars, t);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
max_min_opt::max_min_opt(ast_manager& m, params_ref const& p) {
|
||||
m_imp = alloc(imp, m, p);
|
||||
}
|
||||
|
||||
max_min_opt::~max_min_opt() {
|
||||
dealloc(m_imp);
|
||||
}
|
||||
|
||||
void max_min_opt::add(expr* e) {
|
||||
m_imp->add(e);
|
||||
}
|
||||
|
||||
void max_min_opt::add(expr_ref_vector const& fmls) {
|
||||
for (unsigned i = 0; i < fmls.size(); ++i) {
|
||||
add(fmls[i]);
|
||||
}
|
||||
}
|
||||
|
||||
lbool max_min_opt::check(svector<bool> const& is_max, app_ref_vector const& vars, app* t) {
|
||||
return m_imp->check(is_max, vars, t);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
tactic * mk_qsat_tactic(ast_manager& m, params_ref const& p) {
|
||||
|
|
|
@ -114,17 +114,6 @@ namespace qe {
|
|||
void collect_statistics(statistics& st) const;
|
||||
};
|
||||
|
||||
class max_min_opt {
|
||||
struct imp;
|
||||
imp* m_imp;
|
||||
public:
|
||||
max_min_opt(ast_manager& m, params_ref const& p = params_ref());
|
||||
~max_min_opt();
|
||||
void add(expr* e);
|
||||
void add(expr_ref_vector const& fmls);
|
||||
lbool check(svector<bool> const& is_max, app_ref_vector const& vars, app* t);
|
||||
};
|
||||
|
||||
lbool maximize(expr_ref_vector const& fmls, app* t, opt::inf_eps& value, model_ref& mdl, params_ref const& p);
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue