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:
parent
2362e01a9f
commit
d038c7bf89
8 changed files with 74 additions and 34 deletions
|
@ -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");
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue