3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-08-11 05:30:51 +00:00

Test and memoize pdd factoring (#5163)

* Test and fix pdd_manager::factor

* Memoize pdd_manager::factor

* Fix Windows build (maybe)
This commit is contained in:
Jakob Rath 2021-04-09 19:13:39 +02:00 committed by Nikolaj Bjorner
parent f8562380d6
commit 75c87a2869
3 changed files with 102 additions and 6 deletions

View file

@ -381,6 +381,52 @@ public :
}
}
static void factor() {
std::cout << "factor\n";
pdd_manager m(4, pdd_manager::mod2N_e, 3);
unsigned const va = 0;
unsigned const vb = 1;
unsigned const vc = 2;
unsigned const vd = 3;
pdd const a = m.mk_var(va);
pdd const b = m.mk_var(vb);
pdd const c = m.mk_var(vc);
pdd const d = m.mk_var(vd);
auto test_one = [&m](pdd const& p, unsigned v, unsigned d) {
pdd lc = m.zero();
pdd rest = m.zero();
std::cout << "Factoring p = " << p << " by v" << v << "^" << d << "\n";
p.factor(v, d, lc, rest);
std::cout << " lc = " << lc << "\n";
std::cout << " rest = " << rest << "\n";
pdd x = m.mk_var(v);
pdd x_pow_d = m.one();
for (unsigned i = 0; i < d; ++i) {
x_pow_d *= x;
}
SASSERT( p == lc * x_pow_d + rest );
SASSERT( d == 0 || rest.degree(v) < d );
SASSERT( d != 0 || rest.is_zero() );
};
auto test_multiple = [=](pdd const& p) {
for (auto v : {va, vb, vc, vd}) {
for (unsigned d = 0; d <= 5; ++d) {
test_one(p, v, d);
}
}
};
test_multiple( b );
test_multiple( b*b*b );
test_multiple( b + c );
test_multiple( a*a*a*a*a + a*a*a*b + a*a*b*b + c );
test_multiple( c*c*c*c*c + b*b*b*c + 3*b*c*c + a );
test_multiple( (a + b) * (b + c) * (c + d) * (d + a) );
}
};
}
@ -396,4 +442,5 @@ void tst_pdd() {
dd::test::order_lm();
dd::test::mod4_operations();
dd::test::degree_of_variables();
dd::test::factor();
}