mirror of
https://github.com/Z3Prover/z3
synced 2025-06-22 05:43:39 +00:00
add two failing test cases
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
2c70e8d79f
commit
93a757f45b
3 changed files with 53 additions and 15 deletions
|
@ -221,7 +221,8 @@ namespace datalog {
|
||||||
relation_plugin(udoc_plugin::get_name(), rm),
|
relation_plugin(udoc_plugin::get_name(), rm),
|
||||||
m(rm.get_context().get_manager()),
|
m(rm.get_context().get_manager()),
|
||||||
bv(m),
|
bv(m),
|
||||||
dl(m) {
|
dl(m),
|
||||||
|
m_disable_fast_pass(false) {
|
||||||
}
|
}
|
||||||
udoc_plugin::~udoc_plugin() {
|
udoc_plugin::~udoc_plugin() {
|
||||||
u_map<doc_manager*>::iterator it = m_dms.begin(), end = m_dms.end();
|
u_map<doc_manager*>::iterator it = m_dms.begin(), end = m_dms.end();
|
||||||
|
@ -1079,13 +1080,22 @@ namespace datalog {
|
||||||
virtual void operator()(relation_base& tb, const relation_base& negb) {
|
virtual void operator()(relation_base& tb, const relation_base& negb) {
|
||||||
udoc_relation& t = get(tb);
|
udoc_relation& t = get(tb);
|
||||||
udoc_relation const& n = get(negb);
|
udoc_relation const& n = get(negb);
|
||||||
|
udoc_plugin& p = t.get_plugin();
|
||||||
|
IF_VERBOSE(3, t.display(verbose_stream() << "dst:"););
|
||||||
|
IF_VERBOSE(3, n.display(verbose_stream() << "neg:"););
|
||||||
|
if (!t.fast_empty() && !n.fast_empty() && !p.m_disable_fast_pass) {
|
||||||
|
fast_pass(t, n);
|
||||||
|
}
|
||||||
|
if (!t.fast_empty() && !n.fast_empty()) {
|
||||||
|
slow_pass(t, n);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void fast_pass(udoc_relation& t, const udoc_relation& n) {
|
||||||
udoc & dst = t.get_udoc();
|
udoc & dst = t.get_udoc();
|
||||||
udoc const & neg = n.get_udoc();
|
udoc const & neg = n.get_udoc();
|
||||||
doc_manager& dmt = t.get_dm();
|
doc_manager& dmt = t.get_dm();
|
||||||
doc_manager& dmn = n.get_dm();
|
doc_manager& dmn = n.get_dm();
|
||||||
IF_VERBOSE(3, t.display(verbose_stream() << "dst:"););
|
|
||||||
IF_VERBOSE(3, n.display(verbose_stream() << "neg:"););
|
|
||||||
|
|
||||||
udoc result;
|
udoc result;
|
||||||
for (unsigned i = 0; i < dst.size(); ++i) {
|
for (unsigned i = 0; i < dst.size(); ++i) {
|
||||||
bool subsumed = false;
|
bool subsumed = false;
|
||||||
|
@ -1100,12 +1110,13 @@ namespace datalog {
|
||||||
result.push_back(&dst[i]);
|
result.push_back(&dst[i]);
|
||||||
}
|
}
|
||||||
std::swap(dst, result);
|
std::swap(dst, result);
|
||||||
if (dst.is_empty()) {
|
|
||||||
IF_VERBOSE(3, tb.display(verbose_stream() << "fast empty"););
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// slow case
|
void slow_pass(udoc_relation& t, udoc_relation const& n) {
|
||||||
|
udoc & dst = t.get_udoc();
|
||||||
|
udoc const & neg = n.get_udoc();
|
||||||
|
doc_manager& dmt = t.get_dm();
|
||||||
|
doc_manager& dmn = n.get_dm();
|
||||||
udoc renamed_neg;
|
udoc renamed_neg;
|
||||||
for (unsigned i = 0; i < neg.size(); ++i) {
|
for (unsigned i = 0; i < neg.size(); ++i) {
|
||||||
doc& neg_i = neg[i];
|
doc& neg_i = neg[i];
|
||||||
|
@ -1142,8 +1153,9 @@ namespace datalog {
|
||||||
TRACE("doc", dst.display(dmt, tout) << "\n";);
|
TRACE("doc", dst.display(dmt, tout) << "\n";);
|
||||||
SASSERT(dst.well_formed(dmt));
|
SASSERT(dst.well_formed(dmt));
|
||||||
renamed_neg.reset(dmt);
|
renamed_neg.reset(dmt);
|
||||||
IF_VERBOSE(3, tb.display(verbose_stream() << "slow case:"););
|
IF_VERBOSE(3, t.display(verbose_stream() << "slow case:"););
|
||||||
}
|
}
|
||||||
|
|
||||||
bool copy_columns(
|
bool copy_columns(
|
||||||
tbv& dst, tbv const& src,
|
tbv& dst, tbv const& src,
|
||||||
udoc_relation const& dstt,
|
udoc_relation const& dstt,
|
||||||
|
|
|
@ -95,6 +95,8 @@ namespace datalog {
|
||||||
bv_util bv;
|
bv_util bv;
|
||||||
dl_decl_util dl;
|
dl_decl_util dl;
|
||||||
u_map<doc_manager*> m_dms;
|
u_map<doc_manager*> m_dms;
|
||||||
|
bool m_disable_fast_pass;
|
||||||
|
|
||||||
doc_manager& dm(unsigned sz);
|
doc_manager& dm(unsigned sz);
|
||||||
doc_manager& dm(relation_signature const& sig);
|
doc_manager& dm(relation_signature const& sig);
|
||||||
static udoc_relation& get(relation_base& r);
|
static udoc_relation& get(relation_base& r);
|
||||||
|
@ -136,6 +138,7 @@ namespace datalog {
|
||||||
virtual relation_transformer_fn * mk_filter_interpreted_and_project_fn(
|
virtual relation_transformer_fn * mk_filter_interpreted_and_project_fn(
|
||||||
const relation_base & t, app * condition,
|
const relation_base & t, app * condition,
|
||||||
unsigned removed_col_cnt, const unsigned * removed_cols);
|
unsigned removed_col_cnt, const unsigned * removed_cols);
|
||||||
|
void disable_fast_pass() { m_disable_fast_pass = true; }
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -144,13 +144,17 @@ public:
|
||||||
udoc_relation* t1, *t2, *t3;
|
udoc_relation* t1, *t2, *t3;
|
||||||
expr_ref fml(m);
|
expr_ref fml(m);
|
||||||
|
|
||||||
test_join(1000);
|
test_filter_neg4(false);
|
||||||
|
test_filter_neg4(true);
|
||||||
|
|
||||||
test_rename();
|
|
||||||
test_filter_neg();
|
test_filter_neg();
|
||||||
test_filter_neg2();
|
test_filter_neg2();
|
||||||
test_filter_neg3();
|
test_filter_neg3();
|
||||||
|
|
||||||
|
test_join(1000);
|
||||||
|
|
||||||
|
test_rename();
|
||||||
|
|
||||||
|
|
||||||
// empty
|
// empty
|
||||||
{
|
{
|
||||||
|
@ -635,6 +639,25 @@ public:
|
||||||
t2->deallocate();
|
t2->deallocate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void test_filter_neg4(bool disable_fast) {
|
||||||
|
relation_signature sig1, sig2;
|
||||||
|
sig1.push_back(bv.mk_sort(2));
|
||||||
|
sig1.push_back(bv.mk_sort(2));
|
||||||
|
sig2.push_back(bv.mk_sort(2));
|
||||||
|
unsigned_vector cols1, cols2;
|
||||||
|
|
||||||
|
cols1.push_back(0);
|
||||||
|
cols1.push_back(1);
|
||||||
|
cols2.push_back(0);
|
||||||
|
cols2.push_back(0);
|
||||||
|
udoc_relation* tgt = mk_full(sig1);
|
||||||
|
udoc_relation* neg = mk_full(sig2);
|
||||||
|
if (disable_fast) p.disable_fast_pass();
|
||||||
|
apply_filter_neg(*tgt, *neg, cols1, cols2);
|
||||||
|
tgt->deallocate();
|
||||||
|
neg->deallocate();
|
||||||
|
}
|
||||||
|
|
||||||
void set_random(udoc_relation& r, unsigned num_vals) {
|
void set_random(udoc_relation& r, unsigned num_vals) {
|
||||||
unsigned num_bits = r.get_dm().num_tbits();
|
unsigned num_bits = r.get_dm().num_tbits();
|
||||||
udoc_relation* full = mk_full(r.get_signature());
|
udoc_relation* full = mk_full(r.get_signature());
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue