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

fixing udoc/adding tuned join_project

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2014-10-08 22:07:19 -07:00
parent 2362e01a9f
commit d038c7bf89
8 changed files with 74 additions and 34 deletions

View file

@ -78,19 +78,19 @@ static void tst_doc1(unsigned n) {
to_delete.set(1);
to_delete.set(3);
doc_manager m1(n-2);
doc_ref d1_1(m1, m.project(m1, n, to_delete, *d1));
doc_ref d1_1(m1, m.project(m1, to_delete, *d1));
doc_ref d1_2(m1, m1.allocate1());
m.display(std::cout, *d1) << " -> ";
m1.display(std::cout, *d1_1) << "\n";
SASSERT(m1.equals(*d1_1,*d1_2));
m.set(*d1,2,BIT_x);
m.set(*d1,4,BIT_x);
d1_1 = m.project(m1, n, to_delete, *d1);
d1_1 = m.project(m1, to_delete, *d1);
m.display(std::cout, *d1) << " -> ";
m1.display(std::cout, *d1_1) << "\n";
d1->neg().push_back(m.tbvm().allocate1());
SASSERT(m.well_formed(*d1));
d1_1 = m.project(m1, n, to_delete, *d1);
d1_1 = m.project(m1, to_delete, *d1);
m.display(std::cout, *d1) << " -> ";
m1.display(std::cout, *d1_1) << "\n";
}
@ -218,7 +218,7 @@ class test_doc_cls {
}
void project(doc const& d, doc_manager& m2, const bit_vector& to_delete, doc_ref& result) {
result = dm.project(m2, m_vars.size(), to_delete, d);
result = dm.project(m2, to_delete, d);
TRACE("doc",
for (unsigned i = 0; i < m_vars.size(); ++i) {
tout << (to_delete.get(i)?"0":"1");

View file

@ -32,7 +32,7 @@ static void tst1(unsigned num_bits) {
to_delete.set(3);
m.set(*b1, 2, BIT_0);
m.set(*b1, 4, BIT_x);
tbv_ref b2(m2, m2.project(num_bits, to_delete, *b1));
tbv_ref b2(m2, m2.project(to_delete, *b1));
m.display(std::cout, *b1) << " -> ";
m2.display(std::cout, *b2) << "\n";
m.deallocate(b0);

View file

@ -76,20 +76,32 @@ class udoc_tester {
doc* mk_rand_doc(doc_manager& dm, unsigned num_diff) {
tbv_ref t(dm.tbvm());
doc_ref result(dm);
t = mk_rand_tbv(dm);
doc* result = dm.allocate(*t);
result = dm.allocate(*t);
SASSERT(dm.tbvm().equals(*t, result->pos()));
for (unsigned i = 0; i < num_diff; ++i) {
result->neg().push_back(mk_rand_tbv(dm, result->pos()));
t = mk_rand_tbv(dm, result->pos());
if (dm.tbvm().equals(*t, result->pos())) {
return 0;
}
if (!result->neg().is_empty() &&
dm.tbvm().equals(*t, result->neg()[0])) {
continue;
}
result->neg().push_back(t.detach());
}
SASSERT(dm.well_formed(*result));
return result;
return result.detach();
}
void mk_rand_udoc(doc_manager& dm, unsigned num_elems, unsigned num_diff, udoc& result) {
result.reset(dm);
for (unsigned i = 0; i < num_elems; ++i) {
result.push_back(mk_rand_doc(dm, num_diff));
doc* d = mk_rand_doc(dm, num_diff);
if (d) {
result.push_back(d);
}
}
}
@ -144,6 +156,8 @@ public:
udoc_relation* t1, *t2, *t3;
expr_ref fml(m);
test_filter_neg2();
test_join_project();
test_filter_neg4(false);
@ -152,7 +166,6 @@ public:
test_filter_neg5(true);
test_filter_neg();
test_filter_neg2();
test_filter_neg3();
test_join(1000);
@ -408,27 +421,34 @@ public:
}
// {11xx \ {111x}, x011 \ {x011}, 0111}
// {xx11 \ {0011, 1111, x111}}
// 0111
// {1x1x \ {1x1x}, 1111 \ {1111}, x1x1 \ {x1x1}}
void test_join_project()
{
datalog::relation_signature sig;
sig.push_back(bv.mk_sort(3));
sig.push_back(bv.mk_sort(3));
sig.push_back(bv.mk_sort(3));
sig.push_back(bv.mk_sort(2));
sig.push_back(bv.mk_sort(2));
//sig.push_back(bv.mk_sort(3));
unsigned_vector jc1, jc2, pc;
jc1.push_back(0);
jc2.push_back(0);
pc.push_back(1);
pc.push_back(3);
pc.push_back(4);
//pc.push_back(4);
udoc_relation* t1, *t2;
relation_base* t;
scoped_ptr<datalog::relation_join_fn> join_project_fn;
for (unsigned i = 0; i < 20; ++i) {
for (unsigned i = 0; i < 200; ++i) {
t1 = mk_rand(sig);
t2 = mk_rand(sig);
t1->display(std::cout);
t2->display(std::cout);
join_project_fn = p.mk_join_project_fn(*t1, *t2, jc1.size(), jc1.c_ptr(), jc2.c_ptr(), pc.size(), pc.c_ptr());
t = (*join_project_fn)(*t1, *t2);
t->display(std::cout);
@ -612,6 +632,8 @@ public:
apply_filter_neg(*t2, *neg, allcols, allcols);
neg->deallocate();
}
t1->display(std::cout);
t2->display(std::cout);
apply_filter_neg(*t2, *t1, cols, cols);
t1->deallocate();