3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-29 20:05:51 +00:00

add elimination stack for model reconstruction

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2017-10-17 04:52:06 -07:00
parent da4e8118b2
commit 42e9a0156b
4 changed files with 145 additions and 59 deletions

View file

@ -239,9 +239,53 @@ namespace sat {
// TBD
}
void bdd_manager::sift_up(unsigned level) {
void bdd_manager::sift_up(unsigned lvl) {
// exchange level and level + 1.
#if 0
m_relevel.reset(); // nodes to be re-leveled.
for (unsigned n : m_level2nodes[lvl + 1]) {
BDD l = lo(n);
BDD h = hi(n);
if (l == 0 && h == 0) continue;
BDD a, b, c, d;
if (level(l) == lvl) {
a = lo(l);
b = hi(l);
}
else {
a = b = l;
}
if (level(h) == lvl) {
c = lo(h);
d = hi(h);
}
else {
c = d = h;
}
push(make_node(lvl, a, c));
push(make_node(lvl, b, d));
m_node_table.remove(m_nodes[n]);
m_nodes[n].m_lo = read(2);
m_nodes[n].m_hi = read(1);
m_relevel.push_back(l);
m_relevel.push_back(r);
// TBD: read(2); read(1); should be inserted into m_level2nodes[lvl];
pop(2);
m_node_table.insert(m_nodes[n]);
}
unsigned v = m_level2var[lvl];
unsigned w = m_level2var[lvl+1];
std::swap(m_level2var[lvl], m_level2var[lvl+1]);
std::swap(m_var2level[v], m_var2level[w]);
for (unsigned n : m_relevel) {
if (level(n) == lvl) {
// whoever points to n uses it as if it is level lvl + 1.
m_level2nodes[m_node2levelpos[n]];
}
}
#endif
}
bdd bdd_manager::mk_var(unsigned i) {
@ -454,9 +498,14 @@ namespace sat {
}
for (unsigned i = m_nodes.size(); i-- > 2; ) {
if (!reachable[i]) {
m_nodes[i].m_lo = m_nodes[i].m_hi = 0;
m_free_nodes.push_back(i);
}
}
// sort free nodes so that adjacent nodes are picked in order of use
std::sort(m_free_nodes.begin(), m_free_nodes.end());
m_free_nodes.reverse();
for (auto* e : m_op_cache) {
m_alloc.deallocate(sizeof(*e), e);
}