mirror of
https://github.com/Z3Prover/z3
synced 2025-08-10 21:20:52 +00:00
Fix PDD factor cache in case GC happens while factoring (#5170)
* Add method to find largest power of two that is a divisor * Binary resolve on PDDs * Add unit tests for binary resolve * Fix factor cache access in case GC happens while factoring * Coding conventions * Change to gc_generation
This commit is contained in:
parent
75c87a2869
commit
0e9fc4762a
3 changed files with 192 additions and 9 deletions
|
@ -408,7 +408,7 @@ public :
|
|||
}
|
||||
SASSERT( p == lc * x_pow_d + rest );
|
||||
SASSERT( d == 0 || rest.degree(v) < d );
|
||||
SASSERT( d != 0 || rest.is_zero() );
|
||||
SASSERT( d != 0 || lc.is_zero() );
|
||||
};
|
||||
|
||||
auto test_multiple = [=](pdd const& p) {
|
||||
|
@ -427,6 +427,71 @@ public :
|
|||
test_multiple( (a + b) * (b + c) * (c + d) * (d + a) );
|
||||
}
|
||||
|
||||
static void max_pow2_divisor() {
|
||||
std::cout << "max_pow2_divisor\n";
|
||||
pdd_manager m(4, pdd_manager::mod2N_e, 256);
|
||||
|
||||
unsigned const va = 0;
|
||||
unsigned const vb = 1;
|
||||
pdd const a = m.mk_var(va);
|
||||
pdd const b = m.mk_var(vb);
|
||||
|
||||
SASSERT(m.zero().max_pow2_divisor() == UINT_MAX);
|
||||
SASSERT(m.one().max_pow2_divisor() == 0);
|
||||
pdd p = (1 << 20) * a * b + 1024 * b * b * b;
|
||||
std::cout << p << " divided by 2^" << p.max_pow2_divisor() << "\n";
|
||||
SASSERT(p.max_pow2_divisor() == 10);
|
||||
SASSERT((p + p).max_pow2_divisor() == 11);
|
||||
SASSERT((p * p).max_pow2_divisor() == 20);
|
||||
SASSERT((p + 2*b).max_pow2_divisor() == 1);
|
||||
SASSERT((p + b*b*b).max_pow2_divisor() == 0);
|
||||
}
|
||||
|
||||
static void binary_resolve() {
|
||||
std::cout << "binary resolve\n";
|
||||
pdd_manager m(4, pdd_manager::mod2N_e, 4);
|
||||
|
||||
unsigned const va = 0;
|
||||
unsigned const vb = 1;
|
||||
unsigned const vc = 2;
|
||||
pdd const a = m.mk_var(va);
|
||||
pdd const b = m.mk_var(vb);
|
||||
pdd const c = m.mk_var(vc);
|
||||
|
||||
pdd r = m.zero();
|
||||
|
||||
pdd p = a*a*b - a*a;
|
||||
pdd q = a*b*b - b*b;
|
||||
SASSERT(m.resolve(va, p, q, r));
|
||||
SASSERT(r == a*b*b*b - a*b*b);
|
||||
SASSERT(!m.resolve(va, q, p, r));
|
||||
SASSERT(!m.resolve(vb, p, q, r));
|
||||
SASSERT(m.resolve(vb, q, p, r));
|
||||
SASSERT(r == a*a*a*b - a*a*b);
|
||||
SASSERT(!m.resolve(vc, p, q, r));
|
||||
|
||||
p = 2*a*a*b + 13*a*a;
|
||||
q = 6*a*b*b*b + 14*b*b*b;
|
||||
SASSERT(m.resolve(va, p, q, r));
|
||||
SASSERT(r == (2*b+13)*2*b*b*b*a);
|
||||
SASSERT(!m.resolve(va, q, p, r));
|
||||
SASSERT(!m.resolve(vb, p, q, r));
|
||||
SASSERT(m.resolve(vb, q, p, r));
|
||||
SASSERT(r == 9*a*a*a*b*b + 5*a*a*b*b);
|
||||
|
||||
p = a*a*b - a*a + 4*a*c + 2;
|
||||
q = 3*b*b - b*b*b + 8*b*c;
|
||||
SASSERT(!m.resolve(va, p, q, r));
|
||||
SASSERT(!m.resolve(va, q, p, r));
|
||||
SASSERT(!m.resolve(vb, p, q, r));
|
||||
SASSERT(m.resolve(vb, q, p, r));
|
||||
SASSERT(r == 2*a*a*b*b + 8*a*a*b*c + 4*a*b*b*c + 2*b*b);
|
||||
SASSERT(m.resolve(vc, p, q, r));
|
||||
SASSERT(r == 2*a*a*b*b - 2*a*a*b - 3*a*b*b + a*b*b*b + 4*b);
|
||||
SASSERT(m.resolve(vc, q, p, r));
|
||||
SASSERT(r == -(2*a*a*b*b - 2*a*a*b - 3*a*b*b + a*b*b*b + 4*b));
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -443,4 +508,6 @@ void tst_pdd() {
|
|||
dd::test::mod4_operations();
|
||||
dd::test::degree_of_variables();
|
||||
dd::test::factor();
|
||||
dd::test::max_pow2_divisor();
|
||||
dd::test::binary_resolve();
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue