mirror of
https://github.com/Z3Prover/z3
synced 2025-06-06 14:13:23 +00:00
finished code
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
adce20119f
commit
cb8ad76677
1 changed files with 43 additions and 12 deletions
|
@ -325,6 +325,7 @@ namespace datalog {
|
||||||
virtual relation_base * operator()(const relation_base & _r1, const relation_base & _r2) {
|
virtual relation_base * operator()(const relation_base & _r1, const relation_base & _r2) {
|
||||||
udoc_relation const& r1 = get(_r1);
|
udoc_relation const& r1 = get(_r1);
|
||||||
udoc_relation const& r2 = get(_r2);
|
udoc_relation const& r2 = get(_r2);
|
||||||
|
TRACE("dl", r1.display(tout << "r1:\n"); r2.display(tout << "r2:\n"););
|
||||||
udoc_plugin& p = r1.get_plugin();
|
udoc_plugin& p = r1.get_plugin();
|
||||||
relation_signature const& sig = get_result_signature();
|
relation_signature const& sig = get_result_signature();
|
||||||
udoc_relation * result = alloc(udoc_relation, p, sig);
|
udoc_relation * result = alloc(udoc_relation, p, sig);
|
||||||
|
@ -336,6 +337,7 @@ namespace datalog {
|
||||||
join(d1[i], d2[j], r);
|
join(d1[i], d2[j], r);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
TRACE("dl", result->display(tout << "result:\n"););
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -361,6 +363,7 @@ namespace datalog {
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual relation_base * operator()(const relation_base & tb) {
|
virtual relation_base * operator()(const relation_base & tb) {
|
||||||
|
TRACE("dl", tb.display(tout << "src:\n"););
|
||||||
udoc_relation const& t = get(tb);
|
udoc_relation const& t = get(tb);
|
||||||
udoc_plugin& p = t.get_plugin();
|
udoc_plugin& p = t.get_plugin();
|
||||||
udoc_relation* r = udoc_plugin::get(p.mk_empty(get_result_signature()));
|
udoc_relation* r = udoc_plugin::get(p.mk_empty(get_result_signature()));
|
||||||
|
@ -373,7 +376,7 @@ namespace datalog {
|
||||||
d2 = dm1.project(dm2, m_to_delete.size(), m_to_delete.c_ptr(), ud1[i]);
|
d2 = dm1.project(dm2, m_to_delete.size(), m_to_delete.c_ptr(), ud1[i]);
|
||||||
ud2.push_back(d2.detach());
|
ud2.push_back(d2.detach());
|
||||||
}
|
}
|
||||||
TRACE("dl_hassel", tout << "final size: " << r->get_size_estimate_rows() << '\n';);
|
TRACE("dl", tout << "final size: " << r->get_size_estimate_rows() << '\n';);
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -412,6 +415,7 @@ namespace datalog {
|
||||||
|
|
||||||
virtual relation_base * operator()(const relation_base & _r) {
|
virtual relation_base * operator()(const relation_base & _r) {
|
||||||
udoc_relation const& r = get(_r);
|
udoc_relation const& r = get(_r);
|
||||||
|
TRACE("dl", r.display(tout << "r:\n"););
|
||||||
udoc_plugin& p = r.get_plugin();
|
udoc_plugin& p = r.get_plugin();
|
||||||
relation_signature const& sig = get_result_signature();
|
relation_signature const& sig = get_result_signature();
|
||||||
udoc_relation* result = alloc(udoc_relation, p, sig);
|
udoc_relation* result = alloc(udoc_relation, p, sig);
|
||||||
|
@ -421,6 +425,7 @@ namespace datalog {
|
||||||
for (unsigned i = 0; i < src.size(); ++i) {
|
for (unsigned i = 0; i < src.size(); ++i) {
|
||||||
dst.push_back(dm.allocate(src[i], m_permutation.c_ptr()));
|
dst.push_back(dm.allocate(src[i], m_permutation.c_ptr()));
|
||||||
}
|
}
|
||||||
|
TRACE("dl", result->display(tout << "result:\n"););
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -439,15 +444,14 @@ namespace datalog {
|
||||||
union_fn() {}
|
union_fn() {}
|
||||||
|
|
||||||
virtual void operator()(relation_base & _r, const relation_base & _src, relation_base * _delta) {
|
virtual void operator()(relation_base & _r, const relation_base & _src, relation_base * _delta) {
|
||||||
|
|
||||||
TRACE("dl", _r.display(tout << "dst:\n"); _src.display(tout << "src:\n"););
|
TRACE("dl", _r.display(tout << "dst:\n"); _src.display(tout << "src:\n"););
|
||||||
|
|
||||||
udoc_relation& r = get(_r);
|
udoc_relation& r = get(_r);
|
||||||
udoc_relation const& src = get(_src);
|
udoc_relation const& src = get(_src);
|
||||||
udoc_relation* d = get(_delta);
|
udoc_relation* d = get(_delta);
|
||||||
udoc* d1 = 0;
|
udoc* d1 = 0;
|
||||||
if (d) d1 = &d->get_udoc();
|
if (d) d1 = &d->get_udoc();
|
||||||
r.get_plugin().mk_union(r.get_dm(), r.get_udoc(), src.get_udoc(), d1);
|
r.get_plugin().mk_union(r.get_dm(), r.get_udoc(), src.get_udoc(), d1);
|
||||||
|
TRACE("dl", _r.display(tout << "dst':\n"););
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
void udoc_plugin::mk_union(doc_manager& dm, udoc& dst, udoc const& src, udoc* delta) {
|
void udoc_plugin::mk_union(doc_manager& dm, udoc& dst, udoc const& src, udoc* delta) {
|
||||||
|
@ -717,6 +721,9 @@ namespace datalog {
|
||||||
if (m.is_true(m_condition)) {
|
if (m.is_true(m_condition)) {
|
||||||
m_condition = 0;
|
m_condition = 0;
|
||||||
}
|
}
|
||||||
|
TRACE("dl",
|
||||||
|
tout << "condition: " << mk_pp(condition, m) << "\n";
|
||||||
|
tout << m_condition << "\n"; m_udoc.display(dm, tout) << "\n";);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual ~filter_interpreted_fn() {
|
virtual ~filter_interpreted_fn() {
|
||||||
|
@ -749,9 +756,9 @@ 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& negt = get(negb);
|
udoc_relation const& n = get(negb);
|
||||||
udoc & dst = t.get_udoc();
|
udoc & dst = t.get_udoc();
|
||||||
udoc const & neg = negt.get_udoc();
|
udoc const & neg = n.get_udoc();
|
||||||
doc_manager& dm = t.get_dm();
|
doc_manager& dm = t.get_dm();
|
||||||
udoc result;
|
udoc result;
|
||||||
for (unsigned i = 0; i < dst.size(); ++i) {
|
for (unsigned i = 0; i < dst.size(); ++i) {
|
||||||
|
@ -761,11 +768,16 @@ namespace datalog {
|
||||||
for (unsigned c = 0; !done_i && !done_j && c < m_t_cols.size(); ++c) {
|
for (unsigned c = 0; !done_i && !done_j && c < m_t_cols.size(); ++c) {
|
||||||
unsigned t_col = m_t_cols[c];
|
unsigned t_col = m_t_cols[c];
|
||||||
unsigned n_col = m_neg_cols[c];
|
unsigned n_col = m_neg_cols[c];
|
||||||
SASSERT(t.column_num_bits(t_col) == negt.column_num_bits(n_col));
|
unsigned num_bits = t.column_num_bits(t_col);
|
||||||
NOT_IMPLEMENTED_YET();
|
SASSERT(num_bits == n.column_num_bits(n_col));
|
||||||
//if (!neg[j].contains(negt.column_idx(n_col), dst[i], t.column_idx(t_col), t.column_num_bits(t_col))) {
|
unsigned t_idx = t.column_idx(t_col);
|
||||||
// done_j = true;
|
unsigned n_idx = n.column_idx(n_col);
|
||||||
//}
|
for (unsigned k = 0; !done_j && k < num_bits; ++k) {
|
||||||
|
tbit n_bit = neg[j][n_idx + k];
|
||||||
|
tbit d_bit = dst[i][t_idx + k];
|
||||||
|
// neg does not contain dst.
|
||||||
|
done_j = (n_bit != BIT_x && n_bit != d_bit);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (done_j) {
|
if (done_j) {
|
||||||
result.push_back(&dst[i]);
|
result.push_back(&dst[i]);
|
||||||
|
@ -783,10 +795,29 @@ namespace datalog {
|
||||||
|
|
||||||
// slow case
|
// slow case
|
||||||
udoc renamed_neg;
|
udoc renamed_neg;
|
||||||
NOT_IMPLEMENTED_YET();
|
for (unsigned i = 0; i < neg.size(); ++i) {
|
||||||
// neg.rename(m_neg_cols, negt, m_t_cols, t, renamed_neg);
|
doc_ref newD(dm, dm.allocateX());
|
||||||
|
for (unsigned j = 0; j < m_neg_cols.size(); ++j) {
|
||||||
|
copy_column(*newD, neg[i], m_t_cols[j], m_neg_cols[j], t, n);
|
||||||
|
}
|
||||||
|
renamed_neg.push_back(newD.detach());
|
||||||
|
}
|
||||||
dst.subtract(t.get_dm(), renamed_neg);
|
dst.subtract(t.get_dm(), renamed_neg);
|
||||||
}
|
}
|
||||||
|
void copy_column(
|
||||||
|
doc& dst, doc const& src,
|
||||||
|
unsigned col_dst, unsigned col_src,
|
||||||
|
udoc_relation const& dstt,
|
||||||
|
udoc_relation const& srct) {
|
||||||
|
doc_manager& dm = dstt.get_dm();
|
||||||
|
unsigned idx_dst = dstt.column_idx(col_dst);
|
||||||
|
unsigned idx_src = srct.column_idx(col_src);
|
||||||
|
unsigned num_bits = dstt.column_num_bits(col_dst);
|
||||||
|
SASSERT(num_bits == srct.column_num_bits(col_src));
|
||||||
|
for (unsigned i = 0; i < num_bits; ++i) {
|
||||||
|
dm.set(dst, idx_dst+i, src[idx_src+i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
relation_intersection_filter_fn * udoc_plugin::mk_filter_by_negation_fn(
|
relation_intersection_filter_fn * udoc_plugin::mk_filter_by_negation_fn(
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue