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

Codeplex issue 191: inconsistent results from PDR engine. The report exposed bugs in the implementation of the priority queue leaving unexplored leaves durin search. The priority queue has now been revised to address the exposed bugs

Signed-off-by: Nikolaj Bjorner <nbjorner@hotmail.com>
This commit is contained in:
Nikolaj Bjorner 2015-04-01 16:27:15 -07:00
parent f8d04118d8
commit 9978cba5a8
4 changed files with 339 additions and 68 deletions

View file

@ -224,6 +224,7 @@ int main(int argc, char ** argv) {
TST(theory_pb);
TST(simplex);
TST(sat_user_scope);
TST(pdr);
//TST_ARGV(hs);
}

116
src/test/pdr.cpp Normal file
View file

@ -0,0 +1,116 @@
#include "pdr_context.h"
#include "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 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(smt_params, fp_params, m),
pm(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);
if (level > 0 && (force_goal || parent->is_goal())) {
search.remove_goal(*parent);
add_tree(alloc(model_node, parent, mk_state(states, rand), pt, level-1), false);
add_tree(alloc(model_node, parent, mk_state(states, rand), 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) {
model_node* root = alloc(model_node, 0, mk_state(states, rand), 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();
}