mirror of
https://github.com/Z3Prover/z3
synced 2026-07-19 13:35:48 +00:00
Centralize and document TRACE tags using X-macros (#7657)
* Introduce X-macro-based trace tag definition - Created trace_tags.def to centralize TRACE tag definitions - Each tag includes a symbolic name and description - Set up enum class TraceTag for type-safe usage in TRACE macros * Add script to generate Markdown documentation from trace_tags.def - Python script parses trace_tags.def and outputs trace_tags.md * Refactor TRACE_NEW to prepend TraceTag and pass enum to is_trace_enabled * trace: improve trace tag handling system with hierarchical tagging - Introduce hierarchical tag-class structure: enabling a tag class activates all child tags - Unify TRACE, STRACE, SCTRACE, and CTRACE under enum TraceTag - Implement initial version of trace_tag.def using X(tag, tag_class, description) (class names and descriptions to be refined in a future update) * trace: replace all string-based TRACE tags with enum TraceTag - Migrated all TRACE, STRACE, SCTRACE, and CTRACE macros to use enum TraceTag values instead of raw string literals * trace : add cstring header * trace : Add Markdown documentation generation from trace_tags.def via mk_api_doc.py * trace : rename macro parameter 'class' to 'tag_class' and remove Unicode comment in trace_tags.h. * trace : Add TODO comment for future implementation of tag_class activation * trace : Disable code related to tag_class until implementation is ready (#7663).
This commit is contained in:
parent
d766292dab
commit
0a93ff515d
583 changed files with 8698 additions and 7299 deletions
|
|
@ -386,7 +386,7 @@ namespace upolynomial {
|
|||
#ifdef Z3DEBUG
|
||||
scoped_numeral tmp(m());
|
||||
m().mul(g, p[i], tmp);
|
||||
CTRACE("div_bug", !m().eq(tmp, old_p_i), tout << "old(p[i]): " << m().to_string(old_p_i) << ", g: " << m().to_string(g) << ", p[i]: " <<
|
||||
CTRACE(div_bug, !m().eq(tmp, old_p_i), tout << "old(p[i]): " << m().to_string(old_p_i) << ", g: " << m().to_string(g) << ", p[i]: " <<
|
||||
m().to_string(p[i]) << ", tmp: " << m().to_string(tmp) << "\n";);
|
||||
SASSERT(tmp == old_p_i);
|
||||
#endif
|
||||
|
|
@ -403,7 +403,7 @@ namespace upolynomial {
|
|||
if (m().is_one(b))
|
||||
return;
|
||||
for (unsigned i = 0; i < sz; i++) {
|
||||
CTRACE("upolynomial", !m().divides(b, p[i]), tout << "b: " << m().to_string(b) << ", p[i]: " << m().to_string(p[i]) << "\n";);
|
||||
CTRACE(upolynomial, !m().divides(b, p[i]), tout << "b: " << m().to_string(b) << ", p[i]: " << m().to_string(p[i]) << "\n";);
|
||||
SASSERT(m().divides(b, p[i]));
|
||||
m().div(p[i], b, p[i]);
|
||||
}
|
||||
|
|
@ -527,10 +527,10 @@ namespace upolynomial {
|
|||
SASSERT(!m().is_zero(b_n));
|
||||
scoped_numeral a_m(m());
|
||||
while (m_limit.inc()) {
|
||||
TRACE("rem_bug", tout << "rem loop, p2:\n"; display(tout, sz2, p2); tout << "\nbuffer:\n"; display(tout, buffer); tout << "\n";);
|
||||
TRACE(rem_bug, tout << "rem loop, p2:\n"; display(tout, sz2, p2); tout << "\nbuffer:\n"; display(tout, buffer); tout << "\n";);
|
||||
sz1 = buffer.size();
|
||||
if (sz1 < sz2) {
|
||||
TRACE("rem_bug", tout << "finished\n";);
|
||||
TRACE(rem_bug, tout << "finished\n";);
|
||||
return;
|
||||
}
|
||||
unsigned m_n = sz1 - sz2;
|
||||
|
|
@ -546,7 +546,7 @@ namespace upolynomial {
|
|||
// p2: b_n * x^n + b_{n-1} * x^{n-1} + ... + b_0
|
||||
d++;
|
||||
m().set(a_m, buffer[sz1 - 1]);
|
||||
TRACE("rem_bug", tout << "a_m: " << m().to_string(a_m) << ", b_n: " << m().to_string(b_n) << "\n";);
|
||||
TRACE(rem_bug, tout << "a_m: " << m().to_string(a_m) << ", b_n: " << m().to_string(b_n) << "\n";);
|
||||
// don't need to update position sz1 - 1, since it will become 0
|
||||
for (unsigned i = 0; i < sz1 - 1; i++) {
|
||||
m().mul(buffer[i], b_n, buffer[i]);
|
||||
|
|
@ -619,11 +619,11 @@ namespace upolynomial {
|
|||
_r.reserve(deg+1);
|
||||
numeral_vector & _p1 = m_div_tmp1;
|
||||
// std::cerr << "dividing with "; display(std::cerr, _p1); std::cerr << std::endl;
|
||||
TRACE("factor_bug", tout << "sz1: " << sz1 << " p1: " << p1 << ", _p1.c_ptr(): " << _p1.data() << ", _p1.size(): " << _p1.size() << "\n";);
|
||||
TRACE(factor_bug, tout << "sz1: " << sz1 << " p1: " << p1 << ", _p1.c_ptr(): " << _p1.data() << ", _p1.size(): " << _p1.size() << "\n";);
|
||||
set(sz1, p1, _p1);
|
||||
SASSERT(_p1.size() == sz1);
|
||||
while (true) {
|
||||
TRACE("upolynomial", tout << "exact_div loop...\n"; display(tout, _p1); tout << "\n"; display(tout, _r); tout << "\n";);
|
||||
TRACE(upolynomial, tout << "exact_div loop...\n"; display(tout, _p1); tout << "\n"; display(tout, _r); tout << "\n";);
|
||||
// std::cerr << "dividing with "; display(std::cerr, _p1); std::cerr << std::endl;
|
||||
if (sz1 == 0) {
|
||||
set_size(deg+1, _r);
|
||||
|
|
@ -672,12 +672,12 @@ namespace upolynomial {
|
|||
// inv2 is the inverse of b2 mod b1
|
||||
m().m().mod(inv1, b2, inv1);
|
||||
m().m().mod(inv2, b1, inv2);
|
||||
TRACE("CRA", tout << "inv1: " << inv1 << ", inv2: " << inv2 << "\n";);
|
||||
TRACE(CRA, tout << "inv1: " << inv1 << ", inv2: " << inv2 << "\n";);
|
||||
scoped_numeral a1(m());
|
||||
scoped_numeral a2(m());
|
||||
m().mul(b2, inv2, a1); // a1 is the multiplicator for coefficients of C1
|
||||
m().mul(b1, inv1, a2); // a2 is the multiplicator for coefficients of C2
|
||||
TRACE("CRA", tout << "a1: " << a1 << ", a2: " << a2 << "\n";);
|
||||
TRACE(CRA, tout << "a1: " << a1 << ", a2: " << a2 << "\n";);
|
||||
// new bound
|
||||
scoped_numeral new_bound(m());
|
||||
m().mul(b1, b2, new_bound);
|
||||
|
|
@ -687,7 +687,7 @@ namespace upolynomial {
|
|||
m().div(new_bound, 2, upper);
|
||||
m().set(lower, upper);
|
||||
m().neg(lower);
|
||||
TRACE("CRA", tout << "lower: " << lower << ", upper: " << upper << "\n";);
|
||||
TRACE(CRA, tout << "lower: " << lower << ", upper: " << upper << "\n";);
|
||||
|
||||
#define ADD(A1, A2) { \
|
||||
m().mul(A1, a1, tmp1); \
|
||||
|
|
@ -721,7 +721,7 @@ namespace upolynomial {
|
|||
void core_manager::mod_gcd(unsigned sz_u, numeral const * u,
|
||||
unsigned sz_v, numeral const * v,
|
||||
numeral_vector & result) {
|
||||
TRACE("mgcd", tout << "u: "; display_star(tout, sz_u, u); tout << "\nv: "; display_star(tout, sz_v, v); tout << "\n";);
|
||||
TRACE(mgcd, tout << "u: "; display_star(tout, sz_u, u); tout << "\nv: "; display_star(tout, sz_v, v); tout << "\n";);
|
||||
SASSERT(sz_u > 0 && sz_v > 0);
|
||||
SASSERT(!m().modular());
|
||||
scoped_numeral c_u(m()), c_v(m());
|
||||
|
|
@ -747,17 +747,17 @@ namespace upolynomial {
|
|||
|
||||
for (unsigned i = 0; i < NUM_BIG_PRIMES; i++) {
|
||||
m().set(p, polynomial::g_big_primes[i]);
|
||||
TRACE("mgcd", tout << "trying prime: " << p << "\n";);
|
||||
TRACE(mgcd, tout << "trying prime: " << p << "\n";);
|
||||
{
|
||||
scoped_set_zp setZp(*this, p);
|
||||
set(pp_u.size(), pp_u.data(), u_Zp);
|
||||
set(pp_v.size(), pp_v.data(), v_Zp);
|
||||
if (degree(u_Zp) < d_u) {
|
||||
TRACE("mgcd", tout << "bad prime, leading coefficient vanished\n";);
|
||||
TRACE(mgcd, tout << "bad prime, leading coefficient vanished\n";);
|
||||
continue; // bad prime
|
||||
}
|
||||
if (degree(v_Zp) < d_v) {
|
||||
TRACE("mgcd", tout << "bad prime, leading coefficient vanished\n";);
|
||||
TRACE(mgcd, tout << "bad prime, leading coefficient vanished\n";);
|
||||
continue; // bad prime
|
||||
}
|
||||
euclid_gcd(u_Zp.size(), u_Zp.data(), v_Zp.size(), v_Zp.data(), q);
|
||||
|
|
@ -767,9 +767,9 @@ namespace upolynomial {
|
|||
m().set(c, lc_g);
|
||||
mul(q, c);
|
||||
}
|
||||
TRACE("mgcd", tout << "new q:\n"; display_star(tout, q); tout << "\n";);
|
||||
TRACE(mgcd, tout << "new q:\n"; display_star(tout, q); tout << "\n";);
|
||||
if (is_const(q)) {
|
||||
TRACE("mgcd", tout << "done, modular gcd is one\n";);
|
||||
TRACE(mgcd, tout << "done, modular gcd is one\n";);
|
||||
reset(result);
|
||||
result.push_back(numeral());
|
||||
m().set(result.back(), c_g);
|
||||
|
|
@ -781,27 +781,27 @@ namespace upolynomial {
|
|||
}
|
||||
else if (q.size() < C.size() || m().m().is_even(p) || m().m().is_even(bound)) {
|
||||
// discard accumulated image, it was affected by unlucky primes
|
||||
TRACE("mgcd", tout << "discarding image\n";);
|
||||
TRACE(mgcd, tout << "discarding image\n";);
|
||||
set(q.size(), q.data(), C);
|
||||
m().set(bound, p);
|
||||
}
|
||||
else {
|
||||
CRA_combine_images(q, p, C, bound);
|
||||
TRACE("mgcd", tout << "new combined:\n"; display_star(tout, C); tout << "\n";);
|
||||
TRACE(mgcd, tout << "new combined:\n"; display_star(tout, C); tout << "\n";);
|
||||
}
|
||||
numeral_vector & candidate = q;
|
||||
get_primitive(C, candidate);
|
||||
TRACE("mgcd", tout << "candidate:\n"; display_star(tout, candidate); tout << "\n";);
|
||||
TRACE(mgcd, tout << "candidate:\n"; display_star(tout, candidate); tout << "\n";);
|
||||
SASSERT(candidate.size() > 0);
|
||||
numeral const & lc_candidate = candidate[candidate.size() - 1];
|
||||
if (m().divides(lc_candidate, lc_g) &&
|
||||
divides(pp_u, candidate) &&
|
||||
divides(pp_v, candidate)) {
|
||||
TRACE("mgcd", tout << "found GCD\n";);
|
||||
TRACE(mgcd, tout << "found GCD\n";);
|
||||
mul(candidate, c_g);
|
||||
flip_sign_if_lm_neg(candidate);
|
||||
candidate.swap(result);
|
||||
TRACE("mgcd", tout << "r: "; display_star(tout, result); tout << "\n";);
|
||||
TRACE(mgcd, tout << "r: "; display_star(tout, result); tout << "\n";);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
@ -828,10 +828,10 @@ namespace upolynomial {
|
|||
numeral_vector & R = buffer;
|
||||
set(sz1, p1, A);
|
||||
set(sz2, p2, B);
|
||||
TRACE("upolynomial", tout << "sz1: " << sz1 << ", p1: " << p1 << ", sz2: " << sz2 << ", p2: " << p2 << "\nB.size(): " << B.size() <<
|
||||
TRACE(upolynomial, tout << "sz1: " << sz1 << ", p1: " << p1 << ", sz2: " << sz2 << ", p2: " << p2 << "\nB.size(): " << B.size() <<
|
||||
", B.c_ptr(): " << B.data() << "\n";);
|
||||
while (m_limit.inc()) {
|
||||
TRACE("upolynomial", tout << "A: "; display(tout, A); tout <<"\nB: "; display(tout, B); tout << "\n";);
|
||||
TRACE(upolynomial, tout << "A: "; display(tout, A); tout <<"\nB: "; display(tout, B); tout << "\n";);
|
||||
if (B.empty()) {
|
||||
normalize(A);
|
||||
buffer.swap(A);
|
||||
|
|
@ -842,7 +842,7 @@ namespace upolynomial {
|
|||
else {
|
||||
flip_sign_if_lm_neg(buffer);
|
||||
}
|
||||
TRACE("upolynomial", tout << "GCD\n"; display(tout, sz1, p1); tout << "\n"; display(tout, sz2, p2); tout << "\n--->\n";
|
||||
TRACE(upolynomial, tout << "GCD\n"; display(tout, sz1, p1); tout << "\n"; display(tout, sz2, p2); tout << "\n--->\n";
|
||||
display(tout, buffer); tout << "\n";);
|
||||
return;
|
||||
}
|
||||
|
|
@ -899,7 +899,7 @@ namespace upolynomial {
|
|||
A.swap(B);
|
||||
while (true) {
|
||||
SASSERT(A.size() >= B.size());
|
||||
TRACE("upolynomial", tout << "A: "; display(tout, A); tout <<"\nB: "; display(tout, B); tout << "\n";
|
||||
TRACE(upolynomial, tout << "A: "; display(tout, A); tout <<"\nB: "; display(tout, B); tout << "\n";
|
||||
tout << "g: " << m().to_string(g) << ", h: " << m().to_string(h) << "\n";);
|
||||
if (B.empty()) {
|
||||
normalize(A);
|
||||
|
|
@ -911,7 +911,7 @@ namespace upolynomial {
|
|||
else {
|
||||
flip_sign_if_lm_neg(buffer);
|
||||
}
|
||||
TRACE("upolynomial", tout << "subresultant GCD\n"; display(tout, sz1, p1); tout << "\n"; display(tout, sz2, p2); tout << "\n--->\n";
|
||||
TRACE(upolynomial, tout << "subresultant GCD\n"; display(tout, sz1, p1); tout << "\n"; display(tout, sz2, p2); tout << "\n--->\n";
|
||||
display(tout, buffer); tout << "\n";);
|
||||
return;
|
||||
}
|
||||
|
|
@ -927,7 +927,7 @@ namespace upolynomial {
|
|||
mul(R, aux);
|
||||
}
|
||||
d = pseudo_div_d;
|
||||
TRACE("upolynomial", tout << "R: "; display(tout, R); tout << "\nd: " << d << "\n";);
|
||||
TRACE(upolynomial, tout << "R: "; display(tout, R); tout << "\nd: " << d << "\n";);
|
||||
// aux <- g*h^d
|
||||
m().power(h, d, aux);
|
||||
m().mul(g, aux, aux);
|
||||
|
|
@ -1407,14 +1407,14 @@ namespace upolynomial {
|
|||
// Basic idea: apply descartes_bound_0_1 to p2(x) where
|
||||
// p1(x) = p(x+a)
|
||||
// p2(x) = p1((b-a)*x)
|
||||
TRACE("upolynomial", tout << "pos interval... " << bqm.to_string(a) << ", " << bqm.to_string(b) << "\n"; display(tout, sz, p); tout << "\n";);
|
||||
TRACE(upolynomial, tout << "pos interval... " << bqm.to_string(a) << ", " << bqm.to_string(b) << "\n"; display(tout, sz, p); tout << "\n";);
|
||||
numeral_vector & p_aux = m_dbab_tmp1;
|
||||
translate_bq(sz, p, a, p_aux);
|
||||
TRACE("upolynomial", tout << "after translation\n"; display(tout, p_aux); tout << "\n";);
|
||||
TRACE(upolynomial, tout << "after translation\n"; display(tout, p_aux); tout << "\n";);
|
||||
scoped_mpbq b_a(bqm);
|
||||
bqm.sub(b, a, b_a);
|
||||
compose_p_b_x(p_aux.size(), p_aux.data(), b_a);
|
||||
TRACE("upolynomial", tout << "after composition: " << bqm.to_string(b_a) << "\n"; display(tout, p_aux); tout << "\n";);
|
||||
TRACE(upolynomial, tout << "after composition: " << bqm.to_string(b_a) << "\n"; display(tout, p_aux); tout << "\n";);
|
||||
unsigned result = descartes_bound_0_1(p_aux.size(), p_aux.data());
|
||||
return result;
|
||||
}
|
||||
|
|
@ -1538,7 +1538,7 @@ namespace upolynomial {
|
|||
return;
|
||||
// Step 1
|
||||
compose_2kn_p_x_div_2k(sz, p, b.k());
|
||||
TRACE("upolynomial", tout << "after compose 2kn_p_x_div_2k\n"; display(tout, sz, p); tout << "\n";);
|
||||
TRACE(upolynomial, tout << "after compose 2kn_p_x_div_2k\n"; display(tout, sz, p); tout << "\n";);
|
||||
// Step 2
|
||||
numeral const & c = b.numerator();
|
||||
unsigned n = sz - 1;
|
||||
|
|
@ -1551,7 +1551,7 @@ namespace upolynomial {
|
|||
}
|
||||
m().mul2k(p[n], b.k());
|
||||
}
|
||||
TRACE("upolynomial", tout << "after special translation\n"; display(tout, sz, p); tout << "\n";);
|
||||
TRACE(upolynomial, tout << "after special translation\n"; display(tout, sz, p); tout << "\n";);
|
||||
}
|
||||
|
||||
// Similar to translate_bq but for rationals
|
||||
|
|
@ -1560,7 +1560,7 @@ namespace upolynomial {
|
|||
return;
|
||||
// Step 1
|
||||
compose_an_p_x_div_a(sz, p, b.denominator());
|
||||
TRACE("upolynomial", tout << "after compose_an_p_x_div_a\n"; display(tout, sz, p); tout << "\n";);
|
||||
TRACE(upolynomial, tout << "after compose_an_p_x_div_a\n"; display(tout, sz, p); tout << "\n";);
|
||||
// Step 2
|
||||
numeral const & c = b.numerator();
|
||||
unsigned n = sz - 1;
|
||||
|
|
@ -1573,7 +1573,7 @@ namespace upolynomial {
|
|||
}
|
||||
m().mul(p[n], b.denominator(), p[n]);
|
||||
}
|
||||
TRACE("upolynomial", tout << "after special translation\n"; display(tout, sz, p); tout << "\n";);
|
||||
TRACE(upolynomial, tout << "after special translation\n"; display(tout, sz, p); tout << "\n";);
|
||||
}
|
||||
|
||||
// p(x) := 2^n*p(x/2) where n = sz-1
|
||||
|
|
@ -2146,7 +2146,7 @@ namespace upolynomial {
|
|||
unsigned idx = frame_stack.size() - 1;
|
||||
while (idx != UINT_MAX) {
|
||||
drs_frame const & fr = frame_stack[idx];
|
||||
TRACE("upolynomial",
|
||||
TRACE(upolynomial,
|
||||
tout << "normalizing...\n";
|
||||
tout << "idx: " << idx << ", left: " << fr.m_left << ", l: " << bqm.to_string(l) << ", u: " << bqm.to_string(u) << "\n";);
|
||||
if (fr.m_left) {
|
||||
|
|
@ -2161,7 +2161,7 @@ namespace upolynomial {
|
|||
}
|
||||
idx = fr.m_parent_idx;
|
||||
}
|
||||
TRACE("upolynomial", tout << "adding normalized interval (" << bqm.to_string(l) << ", " << bqm.to_string(u) << ")\n";);
|
||||
TRACE(upolynomial, tout << "adding normalized interval (" << bqm.to_string(l) << ", " << bqm.to_string(u) << ")\n";);
|
||||
lowers.push_back(mpbq());
|
||||
uppers.push_back(mpbq());
|
||||
swap(lowers.back(), l);
|
||||
|
|
@ -2187,32 +2187,32 @@ namespace upolynomial {
|
|||
}
|
||||
idx = fr.m_parent_idx;
|
||||
}
|
||||
TRACE("upolynomial", tout << "adding normalized root: " << bqm.to_string(u) << "\n";);
|
||||
TRACE(upolynomial, tout << "adding normalized root: " << bqm.to_string(u) << "\n";);
|
||||
roots.push_back(mpbq());
|
||||
swap(roots.back(), u);
|
||||
}
|
||||
|
||||
// Isolate roots in the interval (0, 1)
|
||||
void manager::drs_isolate_0_1_roots(unsigned sz, numeral const * p, mpbq_manager & bqm, mpbq_vector & roots, mpbq_vector & lowers, mpbq_vector & uppers) {
|
||||
TRACE("upolynomial", tout << "isolating (0,1) roots of:\n"; display(tout, sz, p); tout << "\n";);
|
||||
TRACE(upolynomial, tout << "isolating (0,1) roots of:\n"; display(tout, sz, p); tout << "\n";);
|
||||
unsigned k = descartes_bound_0_1(sz, p);
|
||||
// easy cases...
|
||||
if (k == 0) {
|
||||
TRACE("upolynomial", tout << "polynomial does not have any roots\n";);
|
||||
TRACE(upolynomial, tout << "polynomial does not have any roots\n";);
|
||||
return;
|
||||
}
|
||||
if (k == 1) {
|
||||
TRACE("upolynomial", tout << "polynomial has one root in (0, 1)\n";);
|
||||
TRACE(upolynomial, tout << "polynomial has one root in (0, 1)\n";);
|
||||
lowers.push_back(mpbq(0));
|
||||
uppers.push_back(mpbq(1));
|
||||
return;
|
||||
}
|
||||
TRACE("upolynomial", tout << "polynomial has more than one root in (0, 1), starting search...\n";);
|
||||
TRACE(upolynomial, tout << "polynomial has more than one root in (0, 1), starting search...\n";);
|
||||
scoped_numeral_vector q(m());
|
||||
scoped_numeral_vector p_stack(m());
|
||||
svector<drs_frame> frame_stack;
|
||||
if (has_one_half_root(sz, p)) {
|
||||
TRACE("upolynomial", tout << "polynomial has a 1/2 root\n";);
|
||||
TRACE(upolynomial, tout << "polynomial has a 1/2 root\n";);
|
||||
roots.push_back(mpbq(1, 1));
|
||||
remove_one_half_root(sz, p, q);
|
||||
push_child_frames(q.size(), q.data(), p_stack, frame_stack);
|
||||
|
|
@ -2227,7 +2227,7 @@ namespace upolynomial {
|
|||
unsigned sz = fr.m_size;
|
||||
SASSERT(sz <= p_stack.size());
|
||||
numeral const * p = p_stack.data() + p_stack.size() - sz;
|
||||
TRACE("upolynomial", tout << "processing frame #" << frame_stack.size() - 1 << "\n"
|
||||
TRACE(upolynomial, tout << "processing frame #" << frame_stack.size() - 1 << "\n"
|
||||
<< "first: " << fr.m_first << ", left: " << fr.m_left << ", sz: " << fr.m_size << ", parent_idx: ";
|
||||
if (fr.m_parent_idx == UINT_MAX) tout << "<null>"; else tout << fr.m_parent_idx;
|
||||
tout << "\np: "; display(tout, sz, p); tout << "\n";);
|
||||
|
|
@ -2238,19 +2238,19 @@ namespace upolynomial {
|
|||
fr.m_first = false;
|
||||
unsigned k = descartes_bound_0_1(sz, p);
|
||||
if (k == 0) {
|
||||
TRACE("upolynomial", tout << "(0, 1) does not have roots\n";);
|
||||
TRACE(upolynomial, tout << "(0, 1) does not have roots\n";);
|
||||
pop_top_frame(p_stack, frame_stack);
|
||||
continue;
|
||||
}
|
||||
if (k == 1) {
|
||||
TRACE("upolynomial", tout << "(0, 1) is isolating interval\n";);
|
||||
TRACE(upolynomial, tout << "(0, 1) is isolating interval\n";);
|
||||
add_isolating_interval(frame_stack, bqm, lowers, uppers);
|
||||
pop_top_frame(p_stack, frame_stack);
|
||||
continue;
|
||||
}
|
||||
TRACE("upolynomial", tout << "polynomial has more than one root in (0, 1) creating child frames...\n";);
|
||||
TRACE(upolynomial, tout << "polynomial has more than one root in (0, 1) creating child frames...\n";);
|
||||
if (has_one_half_root(sz, p)) {
|
||||
TRACE("upolynomial", tout << "1/2 is a root\n";);
|
||||
TRACE(upolynomial, tout << "1/2 is a root\n";);
|
||||
add_root(frame_stack, bqm, roots);
|
||||
remove_one_half_root(sz, p, q);
|
||||
push_child_frames(q.size(), q.data(), p_stack, frame_stack);
|
||||
|
|
@ -2295,7 +2295,7 @@ namespace upolynomial {
|
|||
|
||||
// p(x) := p(2^{pos_k} * x)
|
||||
// Since the desired positive roots of p(x) are in (0, 2^pos_k),
|
||||
TRACE("upolynomial", tout << "searching at (0, 1)\n";);
|
||||
TRACE(upolynomial, tout << "searching at (0, 1)\n";);
|
||||
unsigned old_roots_sz = roots.size();
|
||||
unsigned old_lowers_sz = lowers.size();
|
||||
drs_isolate_0_1_roots(sz, aux_p.data(), bqm, roots, lowers, uppers);
|
||||
|
|
@ -2308,7 +2308,7 @@ namespace upolynomial {
|
|||
// p(x) := p(-x)
|
||||
p_minus_x(sz, p);
|
||||
compose_p_2k_x(sz, p, neg_k);
|
||||
TRACE("upolynomial", tout << "searching at (-1, 0) using:\n"; display(tout, sz, p); tout << "\n";);
|
||||
TRACE(upolynomial, tout << "searching at (-1, 0) using:\n"; display(tout, sz, p); tout << "\n";);
|
||||
old_roots_sz = roots.size();
|
||||
old_lowers_sz = lowers.size();
|
||||
drs_isolate_0_1_roots(sz, p, bqm, roots, lowers, uppers);
|
||||
|
|
@ -2328,7 +2328,7 @@ namespace upolynomial {
|
|||
set(sz, p, p1);
|
||||
normalize(p1);
|
||||
|
||||
TRACE("upolynomial",
|
||||
TRACE(upolynomial,
|
||||
scoped_numeral U(m());
|
||||
root_upper_bound(p1.size(), p1.data(), U);
|
||||
unsigned U_k = m().log2(U) + 1;
|
||||
|
|
@ -2395,7 +2395,7 @@ namespace upolynomial {
|
|||
scoped_mpbq curr_upper(bqm);
|
||||
sturm_seq(sz, p, seq);
|
||||
ss_frame_stack s(bqm);
|
||||
TRACE("upolynomial", tout << "p: "; display(tout, sz, p); tout << "\nSturm seq:\n"; display(tout, seq); tout << "\n";);
|
||||
TRACE(upolynomial, tout << "p: "; display(tout, sz, p); tout << "\nSturm seq:\n"; display(tout, seq); tout << "\n";);
|
||||
|
||||
unsigned lower_sv = sign_variations_at_minus_inf(seq);
|
||||
unsigned zero_sv = sign_variations_at_zero(seq);
|
||||
|
|
@ -2449,7 +2449,7 @@ namespace upolynomial {
|
|||
SASSERT(lower_sv > upper_sv + 1);
|
||||
bqm.add(curr_lower, curr_upper, mid);
|
||||
bqm.div2(mid);
|
||||
TRACE("upolynomial",
|
||||
TRACE(upolynomial,
|
||||
tout << "depth: " << s.size() << "\n";
|
||||
tout << "lower_sv: " << lower_sv << "\n";
|
||||
tout << "upper_sv: " << upper_sv << "\n";
|
||||
|
|
@ -2495,7 +2495,7 @@ namespace upolynomial {
|
|||
roots.push_back(mpbq(0));
|
||||
scoped_numeral_vector nz_p(m());
|
||||
remove_zero_roots(sz, p, nz_p);
|
||||
TRACE("upolynomial", tout << "after removing zero root:\n"; display(tout, nz_p); tout << "\n";);
|
||||
TRACE(upolynomial, tout << "after removing zero root:\n"; display(tout, nz_p); tout << "\n";);
|
||||
SASSERT(!has_zero_roots(nz_p.size(), nz_p.data()));
|
||||
sqf_nz_isolate_roots(nz_p.size(), nz_p.data(), bqm, roots, lowers, uppers);
|
||||
}
|
||||
|
|
@ -2506,10 +2506,10 @@ namespace upolynomial {
|
|||
|
||||
void manager::isolate_roots(unsigned sz, numeral const * p, mpbq_manager & bqm, mpbq_vector & roots, mpbq_vector & lowers, mpbq_vector & uppers) {
|
||||
SASSERT(sz > 0);
|
||||
TRACE("upolynomial", tout << "isolating roots of:\n"; display(tout, sz, p); tout << "\n";);
|
||||
TRACE(upolynomial, tout << "isolating roots of:\n"; display(tout, sz, p); tout << "\n";);
|
||||
scoped_numeral_vector sqf_p(m());
|
||||
square_free(sz, p, sqf_p);
|
||||
TRACE("upolynomial", tout << "square free part:\n"; display(tout, sqf_p); tout << "\n";);
|
||||
TRACE(upolynomial, tout << "square free part:\n"; display(tout, sqf_p); tout << "\n";);
|
||||
sqf_isolate_roots(sqf_p.size(), sqf_p.data(), bqm, roots, lowers, uppers);
|
||||
}
|
||||
|
||||
|
|
@ -2596,7 +2596,7 @@ namespace upolynomial {
|
|||
bool manager::isolating2refinable(unsigned sz, numeral const * p, mpbq_manager & bqm, mpbq & a, mpbq & b) {
|
||||
int sign_a = eval_sign_at(sz, p, a);
|
||||
int sign_b = eval_sign_at(sz, p, b);
|
||||
TRACE("upolynomial", tout << "sign_a: " << sign_a << ", sign_b: " << sign_b << "\n";);
|
||||
TRACE(upolynomial, tout << "sign_a: " << sign_a << ", sign_b: " << sign_b << "\n";);
|
||||
if (sign_a != 0 && sign_b != 0) {
|
||||
// CASE 1
|
||||
SASSERT(sign_a == -sign_b); // p is square free
|
||||
|
|
@ -2609,7 +2609,7 @@ namespace upolynomial {
|
|||
bqm.add(a, b, new_a);
|
||||
bqm.div2(new_a);
|
||||
while (true) {
|
||||
TRACE("upolynomial", tout << "CASE 2, a: " << bqm.to_string(a) << ", b: " << bqm.to_string(b) << ", new_a: " << bqm.to_string(new_a) << "\n";);
|
||||
TRACE(upolynomial, tout << "CASE 2, a: " << bqm.to_string(a) << ", b: " << bqm.to_string(b) << ", new_a: " << bqm.to_string(new_a) << "\n";);
|
||||
int sign_new_a = eval_sign_at(sz, p, new_a);
|
||||
if (sign_new_a != sign_b) {
|
||||
swap(new_a, a);
|
||||
|
|
@ -2634,7 +2634,7 @@ namespace upolynomial {
|
|||
bqm.add(a, b, new_b);
|
||||
bqm.div2(new_b);
|
||||
while (true) {
|
||||
TRACE("upolynomial", tout << "CASE 3, a: " << bqm.to_string(a) << ", b: " << bqm.to_string(b) << ", new_b: " << bqm.to_string(new_b) << "\n";);
|
||||
TRACE(upolynomial, tout << "CASE 3, a: " << bqm.to_string(a) << ", b: " << bqm.to_string(b) << ", new_b: " << bqm.to_string(new_b) << "\n";);
|
||||
int sign_new_b = eval_sign_at(sz, p, new_b);
|
||||
if (sign_new_b != sign_a) {
|
||||
SASSERT(sign_new_b == 0 || // found the actual root
|
||||
|
|
@ -2687,7 +2687,7 @@ namespace upolynomial {
|
|||
bqm.div2(new_b2);
|
||||
|
||||
while (true) {
|
||||
TRACE("upolynomial",
|
||||
TRACE(upolynomial,
|
||||
tout << "CASE 4\na1: " << bqm.to_string(a1) << ", b1: " << bqm.to_string(b1) << ", new_a1: " << bqm.to_string(new_a1) << "\n";
|
||||
tout << "a2: " << bqm.to_string(a2) << ", b2: " << bqm.to_string(b2) << ", new_b2: " << bqm.to_string(new_b2) << "\n";);
|
||||
int sign_new_a1 = eval_sign_at(sz, p, new_a1);
|
||||
|
|
@ -2814,14 +2814,14 @@ namespace upolynomial {
|
|||
SASSERT(!::is_zero(sign_a) && !::is_zero(sign_b));
|
||||
SASSERT(sign_a == -sign_b);
|
||||
bool found_d = false;
|
||||
TRACE("convert_bug",
|
||||
TRACE(convert_bug,
|
||||
tout << "a: " << m().to_string(a.numerator()) << "/" << m().to_string(a.denominator()) << "\n";
|
||||
tout << "b: " << m().to_string(b.numerator()) << "/" << m().to_string(b.denominator()) << "\n";
|
||||
tout << "sign_a: " << sign_a << "\n";
|
||||
tout << "sign_b: " << sign_b << "\n";);
|
||||
scoped_mpbq lower(bqm), upper(bqm);
|
||||
if (bqm.to_mpbq(a, lower)) {
|
||||
TRACE("convert_bug", tout << "found c: " << lower << "\n";);
|
||||
TRACE(convert_bug, tout << "found c: " << lower << "\n";);
|
||||
// found c
|
||||
swap(c, lower);
|
||||
SASSERT(bqm.eq(c, a));
|
||||
|
|
@ -2832,7 +2832,7 @@ namespace upolynomial {
|
|||
bqm.mul2(upper);
|
||||
if (m_manager.is_neg(a.numerator()))
|
||||
::swap(lower, upper);
|
||||
TRACE("convert_bug",
|
||||
TRACE(convert_bug,
|
||||
tout << "a: "; m().display(tout, a.numerator()); tout << "/"; m().display(tout, a.denominator()); tout << "\n";
|
||||
tout << "lower: "; bqm.display(tout, lower); tout << ", upper: "; bqm.display(tout, upper); tout << "\n";);
|
||||
SASSERT(bqm.lt(lower, a));
|
||||
|
|
@ -2958,12 +2958,12 @@ namespace upolynomial {
|
|||
|
||||
void manager::factor_2_sqf_pp(numeral_vector & p, factors & r, unsigned k) {
|
||||
SASSERT(p.size() == 3); // p has degree 2
|
||||
TRACE("factor", tout << "factor square free (degree == 2):\n"; display(tout, p); tout << "\n";);
|
||||
TRACE(factor, tout << "factor square free (degree == 2):\n"; display(tout, p); tout << "\n";);
|
||||
|
||||
numeral const & a = p[2];
|
||||
numeral const & b = p[1];
|
||||
numeral const & c = p[0];
|
||||
TRACE("factor", tout << "a: " << m().to_string(a) << "\nb: " << m().to_string(b) << "\nc: " << m().to_string(c) << "\n";);
|
||||
TRACE(factor, tout << "a: " << m().to_string(a) << "\nb: " << m().to_string(b) << "\nc: " << m().to_string(c) << "\n";);
|
||||
// Create the discriminant: b^2 - 4*a*c
|
||||
scoped_numeral b2(m());
|
||||
scoped_numeral ac(m());
|
||||
|
|
@ -2979,7 +2979,7 @@ namespace upolynomial {
|
|||
r.push_back(p, k);
|
||||
return;
|
||||
}
|
||||
TRACE("factor", tout << "disc_sqrt: " << m().to_string(disc_sqrt) << "\n";);
|
||||
TRACE(factor, tout << "disc_sqrt: " << m().to_string(disc_sqrt) << "\n";);
|
||||
// p = cont*(2*a*x + b - disc_sqrt)*(2*a*x + b + disc_sqrt)
|
||||
scoped_numeral_vector f1(m());
|
||||
scoped_numeral_vector f2(m());
|
||||
|
|
@ -2992,7 +2992,7 @@ namespace upolynomial {
|
|||
set_size(2, f2);
|
||||
normalize(f1);
|
||||
normalize(f2);
|
||||
TRACE("factor", tout << "f1: "; display(tout, f1); tout << "\nf2: "; display(tout, f2); tout << "\n";);
|
||||
TRACE(factor, tout << "f1: "; display(tout, f1); tout << "\nf2: "; display(tout, f2); tout << "\n";);
|
||||
DEBUG_CODE({
|
||||
scoped_numeral_vector f1f2(m());
|
||||
mul(f1, f2, f1f2);
|
||||
|
|
@ -3064,12 +3064,12 @@ namespace upolynomial {
|
|||
else {
|
||||
// B is of the form P_2 * P_3^2 * ... * P_k^{k-1}
|
||||
VERIFY(exact_div(C, B, A));
|
||||
TRACE("factor_bug", tout << "C: "; display(tout, C); tout << "\nB: "; display(tout, B); tout << "\nA: "; display(tout, A); tout << "\n";);
|
||||
TRACE(factor_bug, tout << "C: "; display(tout, C); tout << "\nB: "; display(tout, B); tout << "\nA: "; display(tout, A); tout << "\n";);
|
||||
// A is of the form P_1 * P_2 * ... * P_k
|
||||
unsigned j = 1;
|
||||
while (!is_const(A)) {
|
||||
checkpoint();
|
||||
TRACE("factor", tout << "factor_core main loop j: " << j << "\nA: "; display(tout, A); tout << "\nB: "; display(tout, B); tout << "\n";);
|
||||
TRACE(factor, tout << "factor_core main loop j: " << j << "\nA: "; display(tout, A); tout << "\nB: "; display(tout, B); tout << "\n";);
|
||||
// A is of the form P_j * P_{j+1} * P_{j+2} * ... * P_k
|
||||
// B is of the form P_{j+1} * P_{j+2}^2 * ... * P_k^{k - j - 2}
|
||||
gcd(A, B, D);
|
||||
|
|
@ -3082,20 +3082,20 @@ namespace upolynomial {
|
|||
result = false;
|
||||
}
|
||||
else {
|
||||
TRACE("factor", tout << "const C: "; display(tout, C); tout << "\n";);
|
||||
TRACE(factor, tout << "const C: "; display(tout, C); tout << "\n";);
|
||||
SASSERT(C.size() == 1);
|
||||
SASSERT(m().is_one(C[0]) || m().is_minus_one(C[0]));
|
||||
if (m().is_minus_one(C[0]) && j % 2 == 1)
|
||||
flip_sign(r);
|
||||
}
|
||||
TRACE("factor_bug", tout << "B: "; display(tout, B); tout << "\nD: "; display(tout, D); tout << "\n";);
|
||||
TRACE(factor_bug, tout << "B: "; display(tout, B); tout << "\nD: "; display(tout, D); tout << "\n";);
|
||||
VERIFY(exact_div(B, D, B));
|
||||
// B is of the form P_{j+2} * ... * P_k^{k - j - 3}
|
||||
A.swap(D);
|
||||
// D is of the form P_{j+1} * P_{j+2} * ... * P_k
|
||||
j++;
|
||||
}
|
||||
TRACE("factor_bug", tout << "A: "; display(tout, A); tout << "\n";);
|
||||
TRACE(factor_bug, tout << "A: "; display(tout, A); tout << "\n";);
|
||||
SASSERT(A.size() == 1 && m().is_one(A[0]));
|
||||
}
|
||||
return result;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue