mirror of
https://github.com/Z3Prover/z3
synced 2025-04-23 17:15:31 +00:00
move arithmetical mbp functionality to model_based_opt
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
628a6378c2
commit
7fc294d329
8 changed files with 909 additions and 849 deletions
|
@ -287,9 +287,76 @@ static void test7() {
|
|||
mbo.display(std::cout);
|
||||
}
|
||||
|
||||
static void test8() {
|
||||
opt::model_based_opt mbo;
|
||||
unsigned x0 = mbo.add_var(rational(2));
|
||||
unsigned x = mbo.add_var(rational(1));
|
||||
unsigned y = mbo.add_var(rational(3));
|
||||
unsigned z = mbo.add_var(rational(4));
|
||||
unsigned u = mbo.add_var(rational(5));
|
||||
unsigned v = mbo.add_var(rational(6));
|
||||
unsigned w = mbo.add_var(rational(6));
|
||||
|
||||
add_ineq(mbo, x0, 1, y, -1, 0, opt::t_le);
|
||||
add_ineq(mbo, x, 1, y, -1, 0, opt::t_lt);
|
||||
add_ineq(mbo, y, 1, u, -1, 0, opt::t_le);
|
||||
add_ineq(mbo, y, 1, z, -1, 1, opt::t_le);
|
||||
add_ineq(mbo, y, 1, v, -1, 1, opt::t_le);
|
||||
|
||||
mbo.display(std::cout);
|
||||
mbo.project(1, &y);
|
||||
mbo.display(std::cout);
|
||||
}
|
||||
|
||||
|
||||
static void test9() {
|
||||
opt::model_based_opt mbo;
|
||||
unsigned x0 = mbo.add_var(rational(2), true);
|
||||
unsigned x = mbo.add_var(rational(1), true);
|
||||
unsigned y = mbo.add_var(rational(3), true);
|
||||
unsigned z = mbo.add_var(rational(4), true);
|
||||
unsigned u = mbo.add_var(rational(5), true);
|
||||
unsigned v = mbo.add_var(rational(6), true);
|
||||
|
||||
add_ineq(mbo, x0, 1, y, -1, 0, opt::t_le);
|
||||
add_ineq(mbo, x, 1, y, -1, 0, opt::t_lt);
|
||||
add_ineq(mbo, y, 1, u, -1, 0, opt::t_le);
|
||||
add_ineq(mbo, y, 1, z, -1, 1, opt::t_le);
|
||||
add_ineq(mbo, y, 1, v, -1, 1, opt::t_le);
|
||||
|
||||
mbo.display(std::cout);
|
||||
mbo.project(1, &y);
|
||||
mbo.display(std::cout);
|
||||
}
|
||||
|
||||
|
||||
static void test10() {
|
||||
opt::model_based_opt mbo;
|
||||
unsigned x0 = mbo.add_var(rational(2), true);
|
||||
unsigned x = mbo.add_var(rational(1), true);
|
||||
unsigned y = mbo.add_var(rational(3), true);
|
||||
unsigned z = mbo.add_var(rational(4), true);
|
||||
unsigned u = mbo.add_var(rational(5), true);
|
||||
unsigned v = mbo.add_var(rational(6), true);
|
||||
|
||||
add_ineq(mbo, x0, 1, y, -2, 0, opt::t_le);
|
||||
add_ineq(mbo, x, 1, y, -2, 0, opt::t_lt);
|
||||
add_ineq(mbo, y, 3, u, -4, 0, opt::t_le);
|
||||
add_ineq(mbo, y, 3, z, -5, 1, opt::t_le);
|
||||
add_ineq(mbo, y, 3, v, -6, 1, opt::t_le);
|
||||
|
||||
mbo.display(std::cout);
|
||||
mbo.project(1, &y);
|
||||
mbo.display(std::cout);
|
||||
mbo.project(1, &x0);
|
||||
mbo.display(std::cout);
|
||||
}
|
||||
|
||||
// test with mix of upper and lower bounds
|
||||
|
||||
void tst_model_based_opt() {
|
||||
test10();
|
||||
return;
|
||||
check_random_ineqs();
|
||||
test1();
|
||||
test2();
|
||||
|
@ -298,5 +365,6 @@ void tst_model_based_opt() {
|
|||
test5();
|
||||
test6();
|
||||
test7();
|
||||
|
||||
test8();
|
||||
test9();
|
||||
}
|
||||
|
|
|
@ -438,10 +438,158 @@ static void check_random_ineqs() {
|
|||
}
|
||||
}
|
||||
|
||||
static void test_project() {
|
||||
ast_manager m;
|
||||
reg_decl_plugins(m);
|
||||
qe::arith_project_plugin plugin(m);
|
||||
arith_util a(m);
|
||||
app_ref_vector vars(m);
|
||||
expr_ref_vector lits(m), ds(m);
|
||||
model mdl(m);
|
||||
app_ref x(m), y(m), z(m), u(m);
|
||||
x = m.mk_const(symbol("x"), a.mk_int());
|
||||
y = m.mk_const(symbol("y"), a.mk_int());
|
||||
z = m.mk_const(symbol("z"), a.mk_int());
|
||||
u = m.mk_const(symbol("u"), a.mk_int());
|
||||
func_decl_ref f(m);
|
||||
sort* int_sort = a.mk_int();
|
||||
f = m.mk_func_decl(symbol("f"), 1, &int_sort, int_sort);
|
||||
|
||||
// test non-projection
|
||||
mdl.register_decl(x->get_decl(), a.mk_int(0));
|
||||
mdl.register_decl(y->get_decl(), a.mk_int(1));
|
||||
mdl.register_decl(z->get_decl(), a.mk_int(2));
|
||||
mdl.register_decl(u->get_decl(), a.mk_int(3));
|
||||
func_interp* fi = alloc(func_interp, m, 1);
|
||||
expr_ref_vector nums(m);
|
||||
nums.push_back(a.mk_int(0));
|
||||
nums.push_back(a.mk_int(1));
|
||||
nums.push_back(a.mk_int(2));
|
||||
fi->insert_new_entry(nums.c_ptr(), a.mk_int(1));
|
||||
fi->insert_new_entry(nums.c_ptr()+1, a.mk_int(2));
|
||||
fi->insert_new_entry(nums.c_ptr()+2, a.mk_int(3));
|
||||
fi->set_else(a.mk_int(10));
|
||||
mdl.register_decl(f, fi);
|
||||
vars.reset();
|
||||
lits.reset();
|
||||
vars.push_back(x);
|
||||
lits.push_back(x <= app_ref(m.mk_app(f, (expr*)x), m));
|
||||
lits.push_back(x < y);
|
||||
plugin(mdl, vars, lits);
|
||||
std::cout << lits << "\n";
|
||||
|
||||
// test not-equals
|
||||
vars.reset();
|
||||
lits.reset();
|
||||
vars.push_back(x);
|
||||
lits.push_back(m.mk_not(m.mk_eq(x, y)));
|
||||
plugin(mdl, vars, lits);
|
||||
std::cout << lits << "\n";
|
||||
|
||||
// test negation of distinct using bound variables
|
||||
mdl.register_decl(x->get_decl(), a.mk_int(0));
|
||||
mdl.register_decl(y->get_decl(), a.mk_int(1));
|
||||
mdl.register_decl(z->get_decl(), a.mk_int(0));
|
||||
mdl.register_decl(u->get_decl(), a.mk_int(6));
|
||||
vars.reset();
|
||||
lits.reset();
|
||||
ds.reset();
|
||||
vars.push_back(x);
|
||||
vars.push_back(y);
|
||||
ds.push_back(x);
|
||||
ds.push_back(y);
|
||||
ds.push_back(z + 2);
|
||||
ds.push_back(u);
|
||||
ds.push_back(z);
|
||||
lits.push_back(m.mk_not(m.mk_distinct(ds.size(), ds.c_ptr())));
|
||||
plugin(mdl, vars, lits);
|
||||
std::cout << lits << "\n";
|
||||
|
||||
// test negation of distinct, not using bound variables
|
||||
mdl.register_decl(x->get_decl(), a.mk_int(0));
|
||||
mdl.register_decl(y->get_decl(), a.mk_int(1));
|
||||
mdl.register_decl(z->get_decl(), a.mk_int(0));
|
||||
mdl.register_decl(u->get_decl(), a.mk_int(6));
|
||||
vars.reset();
|
||||
lits.reset();
|
||||
ds.reset();
|
||||
vars.push_back(x);
|
||||
vars.push_back(y);
|
||||
ds.push_back(x);
|
||||
ds.push_back(y);
|
||||
ds.push_back(z + 2);
|
||||
ds.push_back(u);
|
||||
ds.push_back(z + 10);
|
||||
ds.push_back(u + 4);
|
||||
lits.push_back(m.mk_not(m.mk_distinct(ds.size(), ds.c_ptr())));
|
||||
plugin(mdl, vars, lits);
|
||||
std::cout << lits << "\n";
|
||||
|
||||
|
||||
// test distinct
|
||||
mdl.register_decl(x->get_decl(), a.mk_int(0));
|
||||
mdl.register_decl(y->get_decl(), a.mk_int(1));
|
||||
mdl.register_decl(z->get_decl(), a.mk_int(0));
|
||||
mdl.register_decl(u->get_decl(), a.mk_int(6));
|
||||
vars.reset();
|
||||
lits.reset();
|
||||
ds.reset();
|
||||
vars.push_back(x);
|
||||
vars.push_back(y);
|
||||
ds.push_back(x);
|
||||
ds.push_back(y);
|
||||
ds.push_back(z + 2);
|
||||
ds.push_back(u);
|
||||
lits.push_back(m.mk_distinct(ds.size(), ds.c_ptr()));
|
||||
plugin(mdl, vars, lits);
|
||||
std::cout << lits << "\n";
|
||||
|
||||
// equality over modulus
|
||||
mdl.register_decl(y->get_decl(), a.mk_int(4));
|
||||
mdl.register_decl(z->get_decl(), a.mk_int(8));
|
||||
lits.reset();
|
||||
vars.reset();
|
||||
vars.push_back(y);
|
||||
lits.push_back(m.mk_eq(a.mk_mod(y, a.mk_int(3)), a.mk_int(1)));
|
||||
lits.push_back(m.mk_eq(2*y, z));
|
||||
plugin(mdl, vars, lits);
|
||||
std::cout << lits << "\n";
|
||||
|
||||
// inequality test
|
||||
mdl.register_decl(x->get_decl(), a.mk_int(0));
|
||||
mdl.register_decl(y->get_decl(), a.mk_int(1));
|
||||
mdl.register_decl(z->get_decl(), a.mk_int(0));
|
||||
mdl.register_decl(u->get_decl(), a.mk_int(6));
|
||||
vars.reset();
|
||||
lits.reset();
|
||||
vars.push_back(x);
|
||||
vars.push_back(y);
|
||||
lits.push_back(z <= (x + (2*y)));
|
||||
lits.push_back(2*x < u + 3);
|
||||
lits.push_back(2*y <= u);
|
||||
plugin(mdl, vars, lits);
|
||||
std::cout << lits << "\n";
|
||||
|
||||
// non-unit equalities
|
||||
mdl.register_decl(x->get_decl(), a.mk_int(1));
|
||||
mdl.register_decl(z->get_decl(), a.mk_int(2));
|
||||
mdl.register_decl(u->get_decl(), a.mk_int(3));
|
||||
mdl.register_decl(y->get_decl(), a.mk_int(4));
|
||||
lits.reset();
|
||||
vars.reset();
|
||||
vars.push_back(x);
|
||||
lits.push_back(m.mk_eq(2*x, z));
|
||||
lits.push_back(m.mk_eq(3*x, u));
|
||||
plugin(mdl, vars, lits);
|
||||
std::cout << lits << "\n";
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
void tst_qe_arith() {
|
||||
test_project();
|
||||
return;
|
||||
check_random_ineqs();
|
||||
return;
|
||||
// enable_trace("qe");
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue