@@ -257,7 +257,7 @@ namespace algebraic_numbers {
257
257
258
258
SASSERT (bqm ().ge (upper (c), candidate));
259
259
260
- if (bqm ().lt (lower (c), candidate) && upm ().eval_sign_at (c->m_p_sz , c->m_p , candidate) == 0 ) {
260
+ if (bqm ().lt (lower (c), candidate) && upm ().eval_sign_at (c->m_p_sz , c->m_p , candidate) == polynomial::sign_zero ) {
261
261
m_wrapper.set (a, candidate);
262
262
return true ;
263
263
}
@@ -320,7 +320,7 @@ namespace algebraic_numbers {
320
320
SASSERT (bqm ().ge (upper (c), candidate));
321
321
322
322
// Find if candidate is an actual root
323
- if (bqm ().lt (lower (c), candidate) && upm ().eval_sign_at (c->m_p_sz , c->m_p , candidate) == 0 ) {
323
+ if (bqm ().lt (lower (c), candidate) && upm ().eval_sign_at (c->m_p_sz , c->m_p , candidate) == polynomial::sign_zero ) {
324
324
saved_a.restore_if_too_small ();
325
325
set (a, candidate);
326
326
return true ;
@@ -379,11 +379,11 @@ namespace algebraic_numbers {
379
379
}
380
380
381
381
void update_sign_lower (algebraic_cell * c) {
382
- int sl = upm ().eval_sign_at (c->m_p_sz , c->m_p , lower (c));
382
+ polynomial::sign sl = upm ().eval_sign_at (c->m_p_sz , c->m_p , lower (c));
383
383
// The isolating intervals are refinable. Thus, the polynomial has opposite signs at lower and upper.
384
- SASSERT (sl != 0 );
384
+ SASSERT (sl != polynomial::sign_zero );
385
385
SASSERT (upm ().eval_sign_at (c->m_p_sz , c->m_p , upper (c)) == -sl);
386
- c->m_sign_lower = sl < 0 ;
386
+ c->m_sign_lower = sl == polynomial::sign_neg ;
387
387
}
388
388
389
389
// Make sure the GCD of the coefficients is one and the leading coefficient is positive
@@ -1594,8 +1594,8 @@ namespace algebraic_numbers {
1594
1594
#define REFINE_LOOP (BOUND, TARGET_SIGN ) \
1595
1595
while (true ) { \
1596
1596
bqm ().div2 (BOUND); \
1597
- int new_sign = upm ().eval_sign_at (cell_a->m_p_sz , cell_a->m_p , BOUND); \
1598
- if (new_sign == 0 ) { \
1597
+ polynomial::sign new_sign = upm ().eval_sign_at (cell_a->m_p_sz , cell_a->m_p , BOUND); \
1598
+ if (new_sign == polynomial::sign_zero ) { \
1599
1599
/* found actual root */ \
1600
1600
scoped_mpq r (qm ()); \
1601
1601
to_mpq (qm (), BOUND, r); \
@@ -1695,8 +1695,8 @@ namespace algebraic_numbers {
1695
1695
if (bqm ().ge (l, b))
1696
1696
return 1 ;
1697
1697
// b is in the isolating interval (l, u)
1698
- int sign_b = upm ().eval_sign_at (c->m_p_sz , c->m_p , b);
1699
- if (sign_b == 0 )
1698
+ auto sign_b = upm ().eval_sign_at (c->m_p_sz , c->m_p , b);
1699
+ if (sign_b == polynomial::sign_zero )
1700
1700
return 0 ;
1701
1701
return sign_b == sign_lower (c) ? 1 : -1 ;
1702
1702
}
@@ -1979,7 +1979,7 @@ namespace algebraic_numbers {
1979
1979
};
1980
1980
1981
1981
polynomial::var_vector m_eval_sign_vars;
1982
- int eval_sign_at (polynomial_ref const & p, polynomial::var2anum const & x2v) {
1982
+ polynomial::sign eval_sign_at (polynomial_ref const & p, polynomial::var2anum const & x2v) {
1983
1983
polynomial::manager & ext_pm = p.m ();
1984
1984
TRACE (" anum_eval_sign" , tout << " evaluating sign of: " << p << " \n " ;);
1985
1985
while (true ) {
@@ -1990,7 +1990,7 @@ namespace algebraic_numbers {
1990
1990
scoped_mpq r (qm ());
1991
1991
ext_pm.eval (p, x2v_basic, r);
1992
1992
TRACE (" anum_eval_sign" , tout << " all variables are assigned to rationals, value of p: " << r << " \n " ;);
1993
- return qm ().sign (r);
1993
+ return polynomial::to_sign ( qm ().sign (r) );
1994
1994
}
1995
1995
catch (const opt_var2basic::failed &) {
1996
1996
// continue
@@ -2004,13 +2004,13 @@ namespace algebraic_numbers {
2004
2004
2005
2005
if (ext_pm.is_zero (p_prime)) {
2006
2006
// polynomial vanished after substituting rational values.
2007
- return 0 ;
2007
+ return polynomial::sign_zero ;
2008
2008
}
2009
2009
2010
2010
if (is_const (p_prime)) {
2011
2011
// polynomial became the constant polynomial after substitution.
2012
2012
SASSERT (size (p_prime) == 1 );
2013
- return ext_pm.m ().sign (ext_pm.coeff (p_prime, 0 ));
2013
+ return polynomial::to_sign ( ext_pm.m ().sign (ext_pm.coeff (p_prime, 0 ) ));
2014
2014
}
2015
2015
2016
2016
// Try to find sign using intervals
@@ -2026,7 +2026,7 @@ namespace algebraic_numbers {
2026
2026
ext_pm.eval (p_prime, x2v_interval, ri);
2027
2027
TRACE (" anum_eval_sign" , tout << " evaluating using intervals: " << ri << " \n " ;);
2028
2028
if (!bqim ().contains_zero (ri)) {
2029
- return bqim ().is_pos (ri) ? 1 : - 1 ;
2029
+ return bqim ().is_pos (ri) ? polynomial::sign_pos : polynomial::sign_neg ;
2030
2030
}
2031
2031
// refine intervals if magnitude > m_min_magnitude
2032
2032
bool refined = false ;
@@ -2067,7 +2067,7 @@ namespace algebraic_numbers {
2067
2067
// Remark: m_zero_accuracy == 0 means use precise computation.
2068
2068
if (m_zero_accuracy > 0 ) {
2069
2069
// assuming the value is 0, since the result is in (-1/2^k, 1/2^k), where m_zero_accuracy = k
2070
- return 0 ;
2070
+ return polynomial::sign_zero ;
2071
2071
}
2072
2072
#if 0
2073
2073
// Evaluating sign using algebraic arithmetic
@@ -2143,7 +2143,7 @@ namespace algebraic_numbers {
2143
2143
bqm ().div2k (mL , k);
2144
2144
bqm ().div2k (L, k);
2145
2145
if (bqm ().lt (mL , ri.lower ()) && bqm ().lt (ri.upper (), L))
2146
- return 0 ;
2146
+ return polynomial::sign_zero ;
2147
2147
// keep refining ri until ri is inside (-L, L) or
2148
2148
// ri does not contain zero.
2149
2149
@@ -2166,14 +2166,13 @@ namespace algebraic_numbers {
2166
2166
TRACE (" anum_eval_sign" , tout << " evaluating using intervals: " << ri << " \n " ;
2167
2167
tout << " zero lower bound is: " << L << " \n " ;);
2168
2168
if (!bqim ().contains_zero (ri)) {
2169
- return bqim ().is_pos (ri) ? 1 : - 1 ;
2169
+ return bqim ().is_pos (ri) ? polynomial::sign_pos : polynomial::sign_neg ;
2170
2170
}
2171
2171
2172
2172
if (bqm ().lt (mL , ri.lower ()) && bqm ().lt (ri.upper (), L))
2173
- return 0 ;
2173
+ return polynomial::sign_zero ;
2174
2174
2175
- for (unsigned i = 0 ; i < xs.size (); i++) {
2176
- polynomial::var x = xs[i];
2175
+ for (auto x : xs) {
2177
2176
SASSERT (x2v.contains (x));
2178
2177
anum const & v = x2v (x);
2179
2178
SASSERT (!v.is_basic ());
@@ -2242,18 +2241,14 @@ namespace algebraic_numbers {
2242
2241
2243
2242
unsigned sz = roots.size ();
2244
2243
unsigned j = 0 ;
2245
- // std::cout << "p: " << p << "\n";
2246
- // std::cout << "sz: " << sz << "\n";
2247
2244
for (unsigned i = 0 ; i < sz; i++) {
2248
2245
checkpoint ();
2249
- // display_root(std::cout, roots[i]); std::cout << std::endl;
2250
2246
ext_var2num ext_x2v (m_wrapper, x2v, x, roots[i]);
2251
2247
TRACE (" isolate_roots" , tout << " filter_roots i: " << i << " , ext_x2v: x" << x << " -> " ; display_root (tout, roots[i]); tout << " \n " ;);
2252
- int sign = eval_sign_at (p, ext_x2v);
2248
+ polynomial::sign sign = eval_sign_at (p, ext_x2v);
2253
2249
TRACE (" isolate_roots" , tout << " filter_roots i: " << i << " , result sign: " << sign << " \n " ;);
2254
2250
if (sign != 0 )
2255
2251
continue ;
2256
- // display_decimal(std::cout, roots[i], 10); std::cout << " is root" << std::endl;
2257
2252
if (i != j)
2258
2253
set (roots[j], roots[i]);
2259
2254
j++;
@@ -2453,7 +2448,7 @@ namespace algebraic_numbers {
2453
2448
}
2454
2449
}
2455
2450
2456
- int eval_at_mpbq (polynomial_ref const & p, polynomial::var2anum const & x2v, polynomial::var x, mpbq const & v) {
2451
+ polynomial::sign eval_at_mpbq (polynomial_ref const & p, polynomial::var2anum const & x2v, polynomial::var x, mpbq const & v) {
2457
2452
scoped_mpq qv (qm ());
2458
2453
to_mpq (qm (), v, qv);
2459
2454
scoped_anum av (m_wrapper);
@@ -2568,13 +2563,13 @@ namespace algebraic_numbers {
2568
2563
2569
2564
#define DEFAULT_PRECISION 2
2570
2565
2571
- void isolate_roots (polynomial_ref const & p, polynomial::var2anum const & x2v, numeral_vector & roots, svector<int > & signs) {
2566
+ void isolate_roots (polynomial_ref const & p, polynomial::var2anum const & x2v, numeral_vector & roots, svector<polynomial::sign > & signs) {
2572
2567
isolate_roots (p, x2v, roots);
2573
2568
unsigned num_roots = roots.size ();
2574
2569
if (num_roots == 0 ) {
2575
2570
anum zero;
2576
2571
ext2_var2num ext_x2v (m_wrapper, x2v, zero);
2577
- int s = eval_sign_at (p, ext_x2v);
2572
+ polynomial::sign s = eval_sign_at (p, ext_x2v);
2578
2573
signs.push_back (s);
2579
2574
}
2580
2575
else {
@@ -2601,8 +2596,8 @@ namespace algebraic_numbers {
2601
2596
TRACE (" isolate_roots_bug" , tout << " w: " ; display_root (tout, w); tout << " \n " ;);
2602
2597
{
2603
2598
ext2_var2num ext_x2v (m_wrapper, x2v, w);
2604
- int s = eval_sign_at (p, ext_x2v);
2605
- SASSERT (s != 0 );
2599
+ auto s = eval_sign_at (p, ext_x2v);
2600
+ SASSERT (s != polynomial::sign_zero );
2606
2601
signs.push_back (s);
2607
2602
}
2608
2603
@@ -2611,16 +2606,16 @@ namespace algebraic_numbers {
2611
2606
numeral & curr = roots[i];
2612
2607
select (prev, curr, w);
2613
2608
ext2_var2num ext_x2v (m_wrapper, x2v, w);
2614
- int s = eval_sign_at (p, ext_x2v);
2615
- SASSERT (s != 0 );
2609
+ auto s = eval_sign_at (p, ext_x2v);
2610
+ SASSERT (s != polynomial::sign_zero );
2616
2611
signs.push_back (s);
2617
2612
}
2618
2613
2619
2614
int_gt (roots[num_roots - 1 ], w);
2620
2615
{
2621
2616
ext2_var2num ext_x2v (m_wrapper, x2v, w);
2622
- int s = eval_sign_at (p, ext_x2v);
2623
- SASSERT (s != 0 );
2617
+ auto s = eval_sign_at (p, ext_x2v);
2618
+ SASSERT (s != polynomial::sign_zero );
2624
2619
signs.push_back (s);
2625
2620
}
2626
2621
}
@@ -2879,7 +2874,7 @@ namespace algebraic_numbers {
2879
2874
m_imp->isolate_roots (p, x2v, roots);
2880
2875
}
2881
2876
2882
- void manager::isolate_roots (polynomial_ref const & p, polynomial::var2anum const & x2v, numeral_vector & roots, svector<int > & signs) {
2877
+ void manager::isolate_roots (polynomial_ref const & p, polynomial::var2anum const & x2v, numeral_vector & roots, svector<polynomial::sign > & signs) {
2883
2878
m_imp->isolate_roots (p, x2v, roots, signs);
2884
2879
}
2885
2880
@@ -3037,7 +3032,7 @@ namespace algebraic_numbers {
3037
3032
l = rational (_l);
3038
3033
}
3039
3034
3040
- int manager::eval_sign_at (polynomial_ref const & p, polynomial::var2anum const & x2v) {
3035
+ polynomial::sign manager::eval_sign_at (polynomial_ref const & p, polynomial::var2anum const & x2v) {
3041
3036
SASSERT (&(x2v.m ()) == this );
3042
3037
return m_imp->eval_sign_at (p, x2v);
3043
3038
}
0 commit comments