mirror of
https://github.com/Z3Prover/z3
synced 2025-04-23 09:05:31 +00:00
Fix pdd_manager::degree(PDD, unsigned) and add unit tests (#5155)
* Fix pdd_manager::degree(PDD, unsigned) and add unit tests * Another marking opportunity
This commit is contained in:
parent
276756dce9
commit
c85db571ab
2 changed files with 71 additions and 7 deletions
|
@ -1005,28 +1005,32 @@ namespace dd {
|
|||
|
||||
unsigned pdd_manager::degree(PDD p, unsigned v) {
|
||||
init_mark();
|
||||
unsigned level_v = level(v);
|
||||
unsigned level_v = m_var2level[v];
|
||||
unsigned max_d = 0, d = 0;
|
||||
m_todo.push_back(p);
|
||||
while (!m_todo.empty()) {
|
||||
PDD r = m_todo.back();
|
||||
if (is_marked(r))
|
||||
if (is_marked(r))
|
||||
m_todo.pop_back();
|
||||
else if (is_val(r))
|
||||
m_todo.pop_back();
|
||||
else if (level(r) < level_v)
|
||||
m_todo.pop_back();
|
||||
else if (level(r) == level_v) {
|
||||
d = 1;
|
||||
while (!is_val(hi(r)) && level(hi(r)) == level_v) {
|
||||
d = 0;
|
||||
do {
|
||||
++d;
|
||||
set_mark(r);
|
||||
r = hi(r);
|
||||
}
|
||||
} while (!is_val(r) && level(r) == level_v);
|
||||
max_d = std::max(d, max_d);
|
||||
m_todo.pop_back();
|
||||
}
|
||||
else
|
||||
m_todo.push_back(lo(r)).push_back(hi(r));
|
||||
else {
|
||||
set_mark(r);
|
||||
m_todo.pop_back();
|
||||
m_todo.push_back(lo(r)).push_back(hi(r));
|
||||
}
|
||||
}
|
||||
return max_d;
|
||||
}
|
||||
|
|
|
@ -322,6 +322,65 @@ public :
|
|||
SASSERT(!(2*a*b + 3*b + 2).is_never_zero());
|
||||
}
|
||||
|
||||
static void degree_of_variables() {
|
||||
std::cout << "degree of variables\n";
|
||||
pdd_manager m(4, pdd_manager::mod2N_e, 3);
|
||||
unsigned va = 0;
|
||||
unsigned vb = 1;
|
||||
unsigned vc = 2;
|
||||
pdd a = m.mk_var(va);
|
||||
pdd b = m.mk_var(vb);
|
||||
pdd c = m.mk_var(vc);
|
||||
|
||||
SASSERT(a.var() == va);
|
||||
SASSERT(b.var() == vb);
|
||||
|
||||
SASSERT(a.degree(va) == 1);
|
||||
SASSERT(a.degree(vb) == 0);
|
||||
SASSERT(a.degree(vc) == 0);
|
||||
SASSERT(c.degree(vc) == 1);
|
||||
SASSERT(c.degree(vb) == 0);
|
||||
SASSERT(c.degree(va) == 0);
|
||||
|
||||
{
|
||||
pdd p = a * a * a;
|
||||
SASSERT(p.degree(va) == 3);
|
||||
SASSERT(p.degree(vb) == 0);
|
||||
}
|
||||
|
||||
{
|
||||
pdd p = b * a;
|
||||
SASSERT(p.degree(va) == 1);
|
||||
SASSERT(p.degree(vb) == 1);
|
||||
SASSERT(p.degree(vc) == 0);
|
||||
}
|
||||
|
||||
{
|
||||
pdd p = (a*a*b + b*a*b + b + a*c)*a + b*b*c;
|
||||
SASSERT(p.degree(va) == 3);
|
||||
SASSERT(p.degree(vb) == 2);
|
||||
SASSERT(p.degree(vc) == 1);
|
||||
}
|
||||
|
||||
{
|
||||
// check that skipping marked nodes works (1)
|
||||
pdd p = b*a + c*a*a*a;
|
||||
SASSERT(p.degree(va) == 3);
|
||||
}
|
||||
|
||||
{
|
||||
// check that skipping marked nodes works (2)
|
||||
pdd p = (b+c)*(a*a*a);
|
||||
SASSERT(p.degree(va) == 3);
|
||||
}
|
||||
|
||||
{
|
||||
// check that skipping marked nodes works (3)
|
||||
pdd p = a*a*a*b*b*b*c + a*a*a*b*b*b;
|
||||
SASSERT(p.degree(va) == 3);
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -336,4 +395,5 @@ void tst_pdd() {
|
|||
dd::test::order();
|
||||
dd::test::order_lm();
|
||||
dd::test::mod4_operations();
|
||||
dd::test::degree_of_variables();
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue