mirror of
https://github.com/Z3Prover/z3
synced 2025-08-26 04:56:03 +00:00
use new display functions
This commit is contained in:
parent
45ca98e8fe
commit
1dc3670a57
1 changed files with 48 additions and 65 deletions
|
@ -21,6 +21,7 @@ Revision History:
|
|||
#include "nlsat/nlsat_assignment.h"
|
||||
#include "nlsat/nlsat_evaluator.h"
|
||||
#include "math/polynomial/algebraic_numbers.h"
|
||||
#include "nlsat/nlsat_pp.h"
|
||||
#include "util/ref_buffer.h"
|
||||
|
||||
namespace nlsat {
|
||||
|
@ -158,25 +159,7 @@ namespace nlsat {
|
|||
m_signed_project = false;
|
||||
}
|
||||
|
||||
std::ostream& display(std::ostream & out, polynomial_ref const & p) const {
|
||||
m_pm.display(out, p, m_solver.display_proc());
|
||||
return out;
|
||||
}
|
||||
|
||||
std::ostream& display(std::ostream & out, polynomial_ref_vector const & ps, char const * delim = "\n") const {
|
||||
for (unsigned i = 0; i < ps.size(); i++) {
|
||||
if (i > 0)
|
||||
out << delim;
|
||||
m_pm.display(out, ps.get(i), m_solver.display_proc());
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
std::ostream& display(std::ostream & out, literal l) const { return m_solver.display(out, l); }
|
||||
std::ostream& display_var(std::ostream & out, var x) const { return m_solver.display(out, x); }
|
||||
std::ostream& display(std::ostream & out, unsigned sz, literal const * ls) const { return m_solver.display(out, sz, ls); }
|
||||
std::ostream& display(std::ostream & out, literal_vector const & ls) const { return display(out, ls.size(), ls.data()); }
|
||||
std::ostream& display(std::ostream & out, scoped_literal_vector const & ls) const { return display(out, ls.size(), ls.data()); }
|
||||
// display helpers moved to free functions in nlsat_pp.h
|
||||
|
||||
/**
|
||||
\brief Add literal to the result vector.
|
||||
|
@ -301,7 +284,7 @@ namespace nlsat {
|
|||
SASSERT(!m_zero_fs.empty()); // one of the factors must be zero in the current interpretation, since p is zero in it.
|
||||
literal l = m_solver.mk_ineq_literal(atom::EQ, m_zero_fs.size(), m_zero_fs.data(), m_is_even.data());
|
||||
l.neg();
|
||||
TRACE(nlsat_explain, tout << "adding (zero assumption) literal:\n"; display(tout, l); tout << "\n";);
|
||||
TRACE(nlsat_explain, tout << "adding (zero assumption) literal:\n"; display(tout, m_solver, l); tout << "\n";);
|
||||
add_literal(l);
|
||||
}
|
||||
|
||||
|
@ -358,7 +341,7 @@ namespace nlsat {
|
|||
|
||||
// lc is not the zero polynomial, but it vanished in the current interpretation.
|
||||
// so we keep searching...
|
||||
TRACE(nlsat_explain, tout << "adding zero assumption for var:"; m_solver.display_var(tout, x); tout << ", degree k:" << k << ", p:" ; display(tout, p) << "\n";);
|
||||
TRACE(nlsat_explain, tout << "adding zero assumption for var:"; m_solver.display_var(tout, x); tout << ", degree k:" << k << ", p:" ; display(tout, m_solver, p) << "\n";);
|
||||
|
||||
add_zero_assumption(lc);
|
||||
}
|
||||
|
@ -603,13 +586,13 @@ namespace nlsat {
|
|||
if (m_factor) {
|
||||
restore_factors _restore(m_factors, m_factors_save);
|
||||
factor(p, m_factors);
|
||||
TRACE(nlsat_explain, display(tout << "adding factors of\n", p); tout << "\n" << m_factors << "\n";);
|
||||
TRACE(nlsat_explain, display(tout << "adding factors of\n", m_solver, p); tout << "\n" << m_factors << "\n";);
|
||||
polynomial_ref f(m_pm);
|
||||
for (unsigned i = 0; i < m_factors.size(); i++) {
|
||||
f = m_factors.get(i);
|
||||
elim_vanishing(f);
|
||||
if (!is_const(f)) {
|
||||
TRACE(nlsat_explain, tout << "adding factor:\n"; display(tout, f); tout << "\n";);
|
||||
TRACE(nlsat_explain, tout << "adding factor:\n"; display(tout, m_solver, f); tout << "\n";);
|
||||
m_todo.insert(f);
|
||||
}
|
||||
}
|
||||
|
@ -635,8 +618,8 @@ namespace nlsat {
|
|||
// p depends on x
|
||||
disc_poly = discriminant(p, x); // Use global helper
|
||||
if (sign(disc_poly) == 0) { // Discriminant is zero
|
||||
TRACE(nlsat_explain, tout << "p is not square free:\n ";
|
||||
display(tout, p); tout << "\ndiscriminant: "; display(tout, disc_poly) << "\n";
|
||||
TRACE(nlsat_explain, tout << "p is not square free:\n ";
|
||||
display(tout, m_solver, p); tout << "\ndiscriminant: "; display(tout, m_solver, disc_poly) << "\n";
|
||||
m_solver.display_assignment(tout) << '\n';
|
||||
m_solver.display_var(tout << "x:", x) << '\n';
|
||||
);
|
||||
|
@ -660,10 +643,10 @@ namespace nlsat {
|
|||
unsigned k_deg = m_pm.degree(p, x);
|
||||
if (k_deg == 0) continue;
|
||||
// p depends on x
|
||||
TRACE(nlsat_explain, tout << "processing poly of degree " << k_deg << " w.r.t x" << x << ": "; display(tout, p) << "\n";);
|
||||
TRACE(nlsat_explain, tout << "processing poly of degree " << k_deg << " w.r.t x" << x << ": "; display(tout, m_solver, p) << "\n";);
|
||||
for (unsigned j_coeff_deg = k_deg; j_coeff_deg >= 1; j_coeff_deg--) {
|
||||
coeff = m_pm.coeff(p, x, j_coeff_deg);
|
||||
TRACE(nlsat_explain, tout << " coeff deg " << j_coeff_deg << ": "; display(tout, coeff) << "\n";);
|
||||
TRACE(nlsat_explain, tout << " coeff deg " << j_coeff_deg << ": "; display(tout, m_solver, coeff) << "\n";);
|
||||
insert_fresh_factors_in_todo(coeff);
|
||||
if (sqf)
|
||||
break;
|
||||
|
@ -688,7 +671,7 @@ namespace nlsat {
|
|||
}
|
||||
|
||||
void add_zero_assumption_on_factor(polynomial_ref& f) {
|
||||
display(std::cout << "zero factors \n", f);
|
||||
display(std::cout << "zero factors \n", m_solver, f);
|
||||
}
|
||||
// this function also explains the value 0, if met
|
||||
bool coeffs_are_zeroes(polynomial_ref &s) {
|
||||
|
@ -741,7 +724,7 @@ namespace nlsat {
|
|||
|
||||
psc_chain(p, q, x, S);
|
||||
unsigned sz = S.size();
|
||||
TRACE(nlsat_explain, tout << "computing psc of\n"; display(tout, p); tout << "\n"; display(tout, q); tout << "\n";
|
||||
TRACE(nlsat_explain, tout << "computing psc of\n"; display(tout, m_solver, p); tout << "\n"; display(tout, m_solver, q); tout << "\n";
|
||||
for (unsigned i = 0; i < sz; ++i) {
|
||||
s = S.get(i);
|
||||
tout << "psc: " << s << "\n";
|
||||
|
@ -749,7 +732,7 @@ namespace nlsat {
|
|||
|
||||
for (unsigned i = 0; i < sz; i++) {
|
||||
s = S.get(i);
|
||||
TRACE(nlsat_explain, display(tout << "processing psc(" << i << ")\n", s) << "\n";);
|
||||
TRACE(nlsat_explain, display(tout << "processing psc(" << i << ")\n", m_solver, s) << "\n";);
|
||||
if (is_zero(s)) {
|
||||
TRACE(nlsat_explain, tout << "skipping psc is the zero polynomial\n";);
|
||||
continue;
|
||||
|
@ -765,11 +748,11 @@ namespace nlsat {
|
|||
}
|
||||
TRACE(nlsat_explain,
|
||||
tout << "adding v-psc of\n";
|
||||
display(tout, p);
|
||||
display(tout, m_solver, p);
|
||||
tout << "\n";
|
||||
display(tout, q);
|
||||
display(tout, m_solver, q);
|
||||
tout << "\n---->\n";
|
||||
display(tout, s);
|
||||
display(tout, m_solver, s);
|
||||
tout << "\n";);
|
||||
// s did not vanish completely, but its leading coefficient may have vanished
|
||||
insert_fresh_factors_in_todo(s);
|
||||
|
@ -829,14 +812,14 @@ namespace nlsat {
|
|||
|
||||
void add_root_literal(atom::kind k, var y, unsigned i, poly * p) {
|
||||
polynomial_ref pr(p, m_pm);
|
||||
TRACE(nlsat_explain,
|
||||
display(tout << "x" << y << " " << k << "[" << i << "](", pr); tout << ")\n";);
|
||||
TRACE(nlsat_explain,
|
||||
display(tout << "x" << y << " " << k << "[" << i << "](", m_solver, pr); tout << ")\n";);
|
||||
|
||||
if (!mk_linear_root(k, y, i, p) &&
|
||||
!mk_quadratic_root(k, y, i, p)) {
|
||||
bool_var b = m_solver.mk_root_atom(k, y, i, p);
|
||||
literal l(b, true);
|
||||
TRACE(nlsat_explain, tout << "adding literal\n"; display(tout, l); tout << "\n";);
|
||||
TRACE(nlsat_explain, tout << "adding literal\n"; display(tout, m_solver, l); tout << "\n";);
|
||||
add_literal(l);
|
||||
}
|
||||
}
|
||||
|
@ -964,7 +947,7 @@ namespace nlsat {
|
|||
|
||||
*/
|
||||
void mk_linear_root(atom::kind k, var y, unsigned i, poly * p, bool mk_neg) {
|
||||
TRACE(nlsat_explain, display_var(tout, y); m_pm.display(tout << ": ", p, m_solver.display_proc()); tout << "\n");
|
||||
TRACE(nlsat_explain, display_var(tout, m_solver, y); m_pm.display(tout << ": ", p, m_solver.display_proc()); tout << "\n");
|
||||
polynomial_ref p_prime(m_pm);
|
||||
p_prime = p;
|
||||
bool lsign = false;
|
||||
|
@ -993,7 +976,7 @@ namespace nlsat {
|
|||
scoped_anum lower(m_am);
|
||||
scoped_anum upper(m_am);
|
||||
anum const & y_val = m_assignment.value(y);
|
||||
TRACE(nlsat_explain, tout << "adding literals for "; display_var(tout, y); tout << " -> ";
|
||||
TRACE(nlsat_explain, tout << "adding literals for "; display_var(tout, m_solver, y); tout << " -> ";
|
||||
m_am.display_decimal(tout, y_val); tout << "\n";);
|
||||
polynomial_ref p_lower(m_pm);
|
||||
unsigned i_lower = UINT_MAX;
|
||||
|
@ -1096,7 +1079,7 @@ namespace nlsat {
|
|||
scoped_anum lower(m_am);
|
||||
scoped_anum upper(m_am);
|
||||
anum const & y_val = m_assignment.value(y);
|
||||
TRACE(nlsat_explain, tout << "adding literals for "; display_var(tout, y); tout << " -> ";
|
||||
TRACE(nlsat_explain, tout << "adding literals for "; display_var(tout, m_solver, y); tout << " -> ";
|
||||
m_am.display_decimal(tout, y_val); tout << "\n";);
|
||||
polynomial_ref p_lower(m_pm);
|
||||
unsigned i_lower = UINT_MAX;
|
||||
|
@ -1206,9 +1189,9 @@ namespace nlsat {
|
|||
m_todo.reset();
|
||||
break;
|
||||
}
|
||||
TRACE(nlsat_explain, tout << "project loop, processing var "; display_var(tout, x);
|
||||
tout << "\npolynomials\n";
|
||||
display(tout, ps); tout << "\n";);
|
||||
TRACE(nlsat_explain, tout << "project loop, processing var "; display_var(tout, m_solver, x);
|
||||
tout << "\npolynomials\n";
|
||||
display(tout, m_solver, ps); tout << "\n";);
|
||||
add_lcs(ps, x);
|
||||
psc_discriminant(ps, x);
|
||||
psc_resultant(ps, x);
|
||||
|
@ -1255,8 +1238,8 @@ namespace nlsat {
|
|||
m_todo.reset();
|
||||
break;
|
||||
}
|
||||
TRACE(nlsat_explain, tout << "project loop, processing var "; display_var(tout, x); tout << "\npolynomials\n";
|
||||
display(tout, ps); tout << "\n";);
|
||||
TRACE(nlsat_explain, tout << "project loop, processing var "; display_var(tout, m_solver, x); tout << "\npolynomials\n";
|
||||
display(tout, m_solver, ps); tout << "\n";);
|
||||
add_lcs(ps, x);
|
||||
psc_discriminant(ps, x);
|
||||
psc_resultant(ps, x);
|
||||
|
@ -1369,7 +1352,7 @@ namespace nlsat {
|
|||
new_lit = l;
|
||||
return;
|
||||
}
|
||||
TRACE(nlsat_simplify_core, display(tout << "trying to simplify literal\n", l) << "\nusing equation\n";
|
||||
TRACE(nlsat_simplify_core, display(tout << "trying to simplify literal\n", m_solver, l) << "\nusing equation\n";
|
||||
m_pm.display(tout, info.m_eq, m_solver.display_proc()); tout << "\n";);
|
||||
int atom_sign = 1;
|
||||
bool modified_lit = false;
|
||||
|
@ -1452,7 +1435,7 @@ namespace nlsat {
|
|||
new_lit = m_solver.mk_ineq_literal(new_k, new_factors.size(), new_factors.data(), new_factors_even.data());
|
||||
if (l.sign())
|
||||
new_lit.neg();
|
||||
TRACE(nlsat_simplify_core, tout << "simplified literal:\n"; display(tout, new_lit) << " " << m_solver.value(new_lit) << "\n";);
|
||||
TRACE(nlsat_simplify_core, tout << "simplified literal:\n"; display(tout, m_solver, new_lit) << " " << m_solver.value(new_lit) << "\n";);
|
||||
|
||||
if (max_var(new_lit) < max) {
|
||||
if (m_solver.value(new_lit) == l_true) {
|
||||
|
@ -1465,7 +1448,7 @@ namespace nlsat {
|
|||
}
|
||||
else {
|
||||
new_lit = normalize(new_lit, max);
|
||||
TRACE(nlsat_simplify_core, tout << "simplified literal after normalization:\n"; display(tout, new_lit); tout << " " << m_solver.value(new_lit) << "\n";);
|
||||
TRACE(nlsat_simplify_core, tout << "simplified literal after normalization:\n"; display(tout, m_solver, new_lit); tout << " " << m_solver.value(new_lit) << "\n";);
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
@ -1622,7 +1605,7 @@ namespace nlsat {
|
|||
poly * eq_p = eq->p(0);
|
||||
VERIFY(simplify(C, eq_p, max));
|
||||
// add equation as an assumption
|
||||
TRACE(nlsat_simpilfy_core, display(tout << "adding equality as assumption ", literal(eq->bvar(), true)); tout << "\n";);
|
||||
TRACE(nlsat_simpilfy_core, display(tout << "adding equality as assumption ", m_solver, literal(eq->bvar(), true)); tout << "\n";);
|
||||
add_literal(literal(eq->bvar(), true));
|
||||
}
|
||||
}
|
||||
|
@ -1635,11 +1618,11 @@ namespace nlsat {
|
|||
return;
|
||||
collect_polys(num, ls, m_ps);
|
||||
var max_x = max_var(m_ps);
|
||||
TRACE(nlsat_explain, tout << "polynomials in the conflict:\n"; display(tout, m_ps); tout << "\n";);
|
||||
TRACE(nlsat_explain, tout << "polynomials in the conflict:\n"; display(tout, m_solver, m_ps); tout << "\n";);
|
||||
elim_vanishing(m_ps);
|
||||
TRACE(nlsat_explain, tout << "elim vanishing\n"; display(tout, m_ps); tout << "\n";);
|
||||
TRACE(nlsat_explain, tout << "elim vanishing\n"; display(tout, m_solver, m_ps); tout << "\n";);
|
||||
project(m_ps, max_x);
|
||||
TRACE(nlsat_explain, tout << "after projection\n"; display(tout, m_ps); tout << "\n";);
|
||||
TRACE(nlsat_explain, tout << "after projection\n"; display(tout, m_solver, m_ps); tout << "\n";);
|
||||
}
|
||||
|
||||
void process2(unsigned num, literal const * ls) {
|
||||
|
@ -1649,9 +1632,9 @@ namespace nlsat {
|
|||
var max = max_var(num, ls);
|
||||
SASSERT(max != null_var);
|
||||
normalize(m_core2, max);
|
||||
TRACE(nlsat_explain, display(tout << "core after normalization\n", m_core2) << "\n";);
|
||||
TRACE(nlsat_explain, display(tout << "core after normalization\n", m_solver, m_core2) << "\n";);
|
||||
simplify(m_core2, max);
|
||||
TRACE(nlsat_explain, display(tout << "core after simplify\n", m_core2) << "\n";);
|
||||
TRACE(nlsat_explain, display(tout << "core after simplify\n", m_solver, m_core2) << "\n";);
|
||||
main(m_core2.size(), m_core2.data());
|
||||
m_core2.reset();
|
||||
}
|
||||
|
@ -1717,15 +1700,15 @@ namespace nlsat {
|
|||
todo.reset(); core.reset();
|
||||
todo.append(num, ls);
|
||||
while (true) {
|
||||
TRACE(nlsat_minimize, tout << "core minimization:\n"; display(tout, todo); tout << "\nCORE:\n"; display(tout, core) << "\n";);
|
||||
TRACE(nlsat_minimize, tout << "core minimization:\n"; display(tout, m_solver, todo); tout << "\nCORE:\n"; display(tout, m_solver, core) << "\n";);
|
||||
if (!minimize_core(todo, core))
|
||||
break;
|
||||
std::reverse(todo.begin(), todo.end());
|
||||
TRACE(nlsat_minimize, tout << "core minimization:\n"; display(tout, todo); tout << "\nCORE:\n"; display(tout, core) << "\n";);
|
||||
TRACE(nlsat_minimize, tout << "core minimization:\n"; display(tout, m_solver, todo); tout << "\nCORE:\n"; display(tout, m_solver, core) << "\n";);
|
||||
if (!minimize_core(todo, core))
|
||||
break;
|
||||
}
|
||||
TRACE(nlsat_minimize, tout << "core:\n"; display(tout, core););
|
||||
TRACE(nlsat_minimize, tout << "core:\n"; display(tout, m_solver, core););
|
||||
r.append(core.size(), core.data());
|
||||
}
|
||||
|
||||
|
@ -1746,14 +1729,14 @@ namespace nlsat {
|
|||
SASSERT(num > 0);
|
||||
TRACE(nlsat_explain,
|
||||
tout << "[explain] set of literals is infeasible in the current interpretation\n";
|
||||
display(tout, num, ls) << "\n";
|
||||
display(tout, m_solver, num, ls) << "\n";
|
||||
m_solver.display_assignment(tout);
|
||||
);
|
||||
m_result = &result;
|
||||
process(num, ls);
|
||||
reset_already_added();
|
||||
m_result = nullptr;
|
||||
TRACE(nlsat_explain, display(tout << "[explain] result\n", result) << "\n";);
|
||||
TRACE(nlsat_explain, display(tout << "[explain] result\n", m_solver, result) << "\n";);
|
||||
CASSERT("nlsat", check_already_added());
|
||||
}
|
||||
|
||||
|
@ -2152,29 +2135,29 @@ namespace nlsat {
|
|||
#ifdef Z3DEBUG
|
||||
#include <iostream>
|
||||
void pp(nlsat::explain::imp & ex, unsigned num, nlsat::literal const * ls) {
|
||||
ex.display(std::cout, num, ls);
|
||||
display(std::cout, ex.m_solver, num, ls);
|
||||
}
|
||||
void pp(nlsat::explain::imp & ex, nlsat::scoped_literal_vector & ls) {
|
||||
ex.display(std::cout, ls);
|
||||
display(std::cout, ex.m_solver, ls);
|
||||
}
|
||||
void pp(nlsat::explain::imp & ex, polynomial_ref const & p) {
|
||||
ex.display(std::cout, p);
|
||||
display(std::cout, ex.m_solver, p);
|
||||
std::cout << std::endl;
|
||||
}
|
||||
void pp(nlsat::explain::imp & ex, polynomial::polynomial * p) {
|
||||
polynomial_ref _p(p, ex.m_pm);
|
||||
ex.display(std::cout, _p);
|
||||
display(std::cout, ex.m_solver, _p);
|
||||
std::cout << std::endl;
|
||||
}
|
||||
void pp(nlsat::explain::imp & ex, polynomial_ref_vector const & ps) {
|
||||
ex.display(std::cout, ps);
|
||||
display(std::cout, ex.m_solver, ps);
|
||||
}
|
||||
void pp_var(nlsat::explain::imp & ex, nlsat::var x) {
|
||||
ex.display(std::cout, x);
|
||||
display_var(std::cout, ex.m_solver, x);
|
||||
std::cout << std::endl;
|
||||
}
|
||||
void pp_lit(nlsat::explain::imp & ex, nlsat::literal l) {
|
||||
ex.display(std::cout, l);
|
||||
display(std::cout, ex.m_solver, l);
|
||||
std::cout << std::endl;
|
||||
}
|
||||
#endif
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue