3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-11-08 07:15:07 +00:00
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2019-10-06 19:00:14 -07:00
parent f9b6e4e247
commit 7c10fb83a0
4 changed files with 90 additions and 76 deletions

View file

@ -1375,7 +1375,7 @@ namespace upolynomial {
}
return sign_changes(Q.size(), Q.c_ptr());
#endif
int prev_sign = 0;
polynomial::sign prev_sign = polynomial::sign_zero;
unsigned num_vars = 0;
// a0 a1 a2 a3
// a0 a0+a1 a0+a1+a2 a0+a1+a2+a3
@ -1388,10 +1388,10 @@ namespace upolynomial {
for (k = 1; k < sz - i; k++) {
m().add(Q[k], Q[k-1], Q[k]);
}
int sign = sign_of(Q[k-1]);
if (sign == 0)
auto sign = sign_of(Q[k-1]);
if (polynomial::is_zero(sign))
continue;
if (sign != prev_sign && prev_sign != 0) {
if (sign != prev_sign && !polynomial::is_zero(prev_sign)) {
num_vars++;
if (num_vars > 1)
return num_vars;
@ -2342,7 +2342,6 @@ namespace upolynomial {
#else
scoped_numeral U(m());
root_upper_bound(p1.size(), p1.c_ptr(), U);
std::cout << "U: " << U << "\n";
unsigned pos_k = m().log2(U) + 1;
unsigned neg_k = pos_k;
#endif
@ -2752,18 +2751,15 @@ namespace upolynomial {
The arguments sign_a and sign_b must contain the values returned by
eval_sign_at(sz, p, a) and eval_sign_at(sz, p, b).
*/
bool manager::refine_core(unsigned sz, numeral const * p, int sign_a, mpbq_manager & bqm, mpbq & a, mpbq & b) {
bool manager::refine_core(unsigned sz, numeral const * p, polynomial::sign sign_a, mpbq_manager & bqm, mpbq & a, mpbq & b) {
SASSERT(sign_a == eval_sign_at(sz, p, a));
int sign_b = -sign_a;
(void)sign_b;
SASSERT(sign_b == eval_sign_at(sz, p, b));
SASSERT(sign_a == -sign_b);
SASSERT(sign_a != 0 && sign_b != 0);
SASSERT(-sign_a == eval_sign_at(sz, p, b));
SASSERT(sign_a != 0);
scoped_mpbq mid(bqm);
bqm.add(a, b, mid);
bqm.div2(mid);
int sign_mid = eval_sign_at(sz, p, mid);
if (sign_mid == 0) {
auto sign_mid = eval_sign_at(sz, p, mid);
if (polynomial::is_zero(sign_mid)) {
swap(mid, a);
return false;
}
@ -2771,15 +2767,15 @@ namespace upolynomial {
swap(mid, a);
return true;
}
SASSERT(sign_mid == sign_b);
SASSERT(sign_mid == -sign_a);
swap(mid, b);
return true;
}
// See refine_core
bool manager::refine(unsigned sz, numeral const * p, mpbq_manager & bqm, mpbq & a, mpbq & b) {
int sign_a = eval_sign_at(sz, p, a);
SASSERT(sign_a != 0);
polynomial::sign sign_a = eval_sign_at(sz, p, a);
SASSERT(!polynomial::is_zero(sign_a));
return refine_core(sz, p, sign_a, bqm, a, b);
}
@ -2788,8 +2784,8 @@ namespace upolynomial {
//
// Return TRUE, if interval was squeezed, and new interval is stored in (a,b).
// Return FALSE, if the actual root was found, it is stored in a.
bool manager::refine_core(unsigned sz, numeral const * p, int sign_a, mpbq_manager & bqm, mpbq & a, mpbq & b, unsigned prec_k) {
SASSERT(sign_a != 0);
bool manager::refine_core(unsigned sz, numeral const * p, polynomial::sign sign_a, mpbq_manager & bqm, mpbq & a, mpbq & b, unsigned prec_k) {
SASSERT(sign_a != polynomial::sign_zero);
SASSERT(sign_a == eval_sign_at(sz, p, a));
SASSERT(-sign_a == eval_sign_at(sz, p, b));
scoped_mpbq w(bqm);
@ -2806,16 +2802,16 @@ namespace upolynomial {
}
bool manager::refine(unsigned sz, numeral const * p, mpbq_manager & bqm, mpbq & a, mpbq & b, unsigned prec_k) {
int sign_a = eval_sign_at(sz, p, a);
polynomial::sign sign_a = eval_sign_at(sz, p, a);
SASSERT(eval_sign_at(sz, p, b) == -sign_a);
SASSERT(sign_a != 0);
return refine_core(sz, p, sign_a, bqm, a, b, prec_k);
}
bool manager::convert_q2bq_interval(unsigned sz, numeral const * p, mpq const & a, mpq const & b, mpbq_manager & bqm, mpbq & c, mpbq & d) {
int sign_a = eval_sign_at(sz, p, a);
int sign_b = eval_sign_at(sz, p, b);
SASSERT(sign_a != 0 && sign_b != 0);
polynomial::sign sign_a = eval_sign_at(sz, p, a);
polynomial::sign sign_b = eval_sign_at(sz, p, b);
SASSERT(!polynomial::is_zero(sign_a) && !polynomial::is_zero(sign_b));
SASSERT(sign_a == -sign_b);
bool found_d = false;
TRACE("convert_bug",
@ -2846,8 +2842,8 @@ namespace upolynomial {
}
SASSERT(bqm.lt(upper, b));
while (true) {
int sign_upper = eval_sign_at(sz, p, upper);
if (sign_upper == 0) {
auto sign_upper = eval_sign_at(sz, p, upper);
if (polynomial::is_zero(sign_upper)) {
// found root
bqm.swap(c, upper);
bqm.del(lower); bqm.del(upper);
@ -2891,8 +2887,8 @@ namespace upolynomial {
SASSERT(bqm.lt(lower, upper));
SASSERT(bqm.lt(lower, b));
while (true) {
int sign_lower = eval_sign_at(sz, p, lower);
if (sign_lower == 0) {
polynomial::sign sign_lower = eval_sign_at(sz, p, lower);
if (polynomial::is_zero(sign_lower)) {
// found root
bqm.swap(c, lower);
bqm.del(lower); bqm.del(upper);
@ -2923,14 +2919,12 @@ namespace upolynomial {
else {
SASSERT(sign_a == eval_sign_at(sz, p, a));
}
int sign_b = -sign_a;
(void) sign_b;
SASSERT(sign_b == eval_sign_at(sz, p, b));
SASSERT(sign_a != 0 && sign_b != 0);
SASSERT(-sign_a == eval_sign_at(sz, p, b));
SASSERT(sign_a != 0);
if (has_zero_roots(sz, p)) {
return false; // zero is the root
}
int sign_zero = eval_sign_at_zero(sz, p);
auto sign_zero = eval_sign_at_zero(sz, p);
if (sign_a == sign_zero) {
m.reset(a);
}