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:
parent
5fce4a1d1a
commit
0ae246ad2b
14 changed files with 326 additions and 225 deletions
|
@ -81,7 +81,6 @@ add_executable(test-z3
|
|||
optional.cpp
|
||||
parray.cpp
|
||||
pb2bv.cpp
|
||||
pdr.cpp
|
||||
permutation.cpp
|
||||
polynomial.cpp
|
||||
polynorm.cpp
|
||||
|
|
|
@ -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";
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
|
|
128
src/test/pdr.cpp
128
src/test/pdr.cpp
|
@ -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();
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue