3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-23 17:15:31 +00:00

add defs to arith solver

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2018-06-12 12:41:01 -07:00 committed by Arie Gurfinkel
parent 5fce4a1d1a
commit 0ae246ad2b
14 changed files with 326 additions and 225 deletions

View file

@ -81,7 +81,6 @@ add_executable(test-z3
optional.cpp
parray.cpp
pb2bv.cpp
pdr.cpp
permutation.cpp
polynomial.cpp
polynorm.cpp

View file

@ -10,7 +10,6 @@ Copyright (c) 2015 Microsoft Corporation
#include "ast/reg_decl_plugins.h"
#include "ast/rewriter/th_rewriter.h"
#include "model/model.h"
#include "muz/pdr/pdr_util.h"
#include "parsers/smt2/smt2parser.h"
@ -53,13 +52,9 @@ void tst_arith_rewriter() {
expr_ref fml = parse_fml(m, example1);
rw(fml);
std::cout << mk_pp(fml, m) << "\n";
pdr::normalize_arithmetic(fml);
std::cout << mk_pp(fml, m) << "\n";
fml = parse_fml(m, example2);
rw(fml);
std::cout << mk_pp(fml, m) << "\n";
pdr::normalize_arithmetic(fml);
std::cout << mk_pp(fml, m) << "\n";
}

View file

@ -239,7 +239,6 @@ int main(int argc, char ** argv) {
TST(theory_pb);
TST(simplex);
TST(sat_user_scope);
TST(pdr);
TST_ARGV(ddnf);
TST(ddnf1);
TST(model_evaluator);

View file

@ -218,6 +218,12 @@ static void test4() {
std::cout << "u: " << mbo.get_value(u) << "\n";
}
static void display_project(vector<opt::model_based_opt::def> const& defs) {
for (auto const& d : defs) {
std::cout << d << "\n";
}
}
static void test5() {
opt::model_based_opt mbo;
unsigned x = mbo.add_var(rational(2));
@ -231,13 +237,13 @@ static void test5() {
add_ineq(mbo, z, 1, u, -1, 1, opt::t_le);
unsigned vars[2] = { y, z };
mbo.project(1, vars);
display_project(mbo.project(1, vars, true));
mbo.display(std::cout);
mbo.project(1, vars);
display_project(mbo.project(1, vars, true));
mbo.display(std::cout);
mbo.project(1, vars+1);
display_project(mbo.project(1, vars+1, true));
mbo.display(std::cout);
vector<opt::model_based_opt::row> rows;
@ -263,7 +269,7 @@ static void test6() {
add_ineq(mbo, y, 1, w, -1, 1, opt::t_le);
mbo.display(std::cout);
mbo.project(1, &y);
display_project(mbo.project(1, &y, true));
mbo.display(std::cout);
}
@ -285,7 +291,7 @@ static void test7() {
add_ineq(mbo, y, 1, w, -1, 1, opt::t_lt);
mbo.display(std::cout);
mbo.project(1, &y);
display_project(mbo.project(1, &y, true));
mbo.display(std::cout);
}
@ -306,7 +312,7 @@ static void test8() {
add_ineq(mbo, y, 1, v, -1, 1, opt::t_le);
mbo.display(std::cout);
mbo.project(1, &y);
display_project(mbo.project(1, &y, true));
mbo.display(std::cout);
}
@ -327,7 +333,7 @@ static void test9() {
add_ineq(mbo, y, 1, v, -1, 1, opt::t_le);
mbo.display(std::cout);
mbo.project(1, &y);
display_project(mbo.project(1, &y, true));
mbo.display(std::cout);
}
@ -348,9 +354,9 @@ static void test10() {
add_ineq(mbo, y, 3, v, -6, 1, opt::t_le);
mbo.display(std::cout);
mbo.project(1, &y);
display_project(mbo.project(1, &y, true));
mbo.display(std::cout);
mbo.project(1, &x0);
display_project(mbo.project(1, &x0, true));
mbo.display(std::cout);
}
@ -358,7 +364,6 @@ static void test10() {
void tst_model_based_opt() {
test10();
return;
check_random_ineqs();
test1();
test2();

View file

@ -1,128 +0,0 @@
/*++
Copyright (c) 2015 Microsoft Corporation
--*/
#include "muz/pdr/pdr_context.h"
#include "ast/reg_decl_plugins.h"
using namespace pdr;
static expr_ref mk_state(expr_ref_vector const& states, random_gen& rand) {
expr_ref result(states.get_manager());
result = states[rand(states.size())];
return result;
}
struct test_model_search {
struct init_test {
init_test(func_decl_ref& fn) {
ast_manager& m = fn.get_manager();
reg_decl_plugins(m);
fn = m.mk_const_decl(symbol("f"), m.mk_bool_sort());
}
};
ast_manager m;
smt_params m_smt_params;
fixedpoint_params fp_params;
context ctx;
manager pm;
func_decl_ref fn;
init_test initt;
pred_transformer pt;
random_gen rand;
model_search search;
expr_ref_vector states;
test_model_search():
ctx(m_smt_params, fp_params, m),
pm(m_smt_params, 10, m),
fn(m),
initt(fn),
pt(ctx, pm, fn),
rand(10),
search(true),
states(m) {
}
void add_tree(model_node* parent, bool force_goal) {
unsigned level = parent->level();
search.add_leaf(*parent);
expr_ref state(m);
if (level > 0 && (force_goal || parent->is_goal())) {
search.remove_goal(*parent);
state = mk_state(states, rand);
add_tree(alloc(model_node, parent, state, pt, level-1), false);
state = mk_state(states, rand);
add_tree(alloc(model_node, parent, state, pt, level-1), false);
parent->check_pre_closed();
}
}
bool mutate() {
model_node* leaf = search.next();
if (!leaf) return false;
unsigned level = leaf->level();
if (level == 0) {
if (rand(2) == 0) {
leaf->display(std::cout << "backtrack to grandparent\n", 1);
search.backtrack_level(false, *leaf->parent());
}
else {
leaf->display(std::cout << "backtrack to parent\n", 1);
search.backtrack_level(false, *leaf);
}
}
else {
leaf->display(std::cout << "grow tree\n", 1);
add_tree(leaf, true);
}
return true;
}
void init() {
std::cout << "pdr state-hash search tree\n";
expr_ref state(m);
func_decl_ref fn(m);
for (unsigned i = 0; i < 10; ++i) {
std::ostringstream strm;
strm << "s" << i;
state = m.mk_const(symbol(strm.str().c_str()), m.mk_bool_sort());
fn = to_app(state)->get_decl();
states.push_back(state);
}
state = states[0].get();
unsigned level = 4;
for(unsigned n = 0; n < 100; ++n) {
state = mk_state(states, rand);
model_node* root = alloc(model_node, nullptr, state, pt, level);
search.set_root(root);
add_tree(root, false);
search.display(std::cout);
while (true) {
search.well_formed();
if (!mutate()) break;
search.display(std::cout);
}
search.reset();
//++level;
}
search.reset();
}
};
void tst_pdr() {
test_model_search test;
test.init();
}