mirror of
https://github.com/Z3Prover/z3
synced 2025-08-23 11:37:54 +00:00
debug nl2lin
Signed-off-by: Lev Nachmanson <levnach@hotmail.com>
This commit is contained in:
parent
5d08ebdffd
commit
6ef8a0b7bb
3 changed files with 24 additions and 11 deletions
|
@ -1,4 +1,4 @@
|
||||||
/*++
|
/*++
|
||||||
Copyright (c) 2017 Microsoft Corporation
|
Copyright (c) 2017 Microsoft Corporation
|
||||||
|
|
||||||
Module Name:
|
Module Name:
|
||||||
|
@ -88,6 +88,13 @@ lpvar core::map_to_root(lpvar j) const {
|
||||||
return m_evars.find(j).var();
|
return m_evars.find(j).var();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Reduce a single variable to its root and provide the reduction sign.
|
||||||
|
lpvar core::reduce_var_to_rooted(lpvar j, rational & sign) const {
|
||||||
|
auto root = m_evars.find(j);
|
||||||
|
sign = rational(root.sign() ? -1 : 1);
|
||||||
|
return root.var();
|
||||||
|
}
|
||||||
|
|
||||||
svector<lpvar> core::sorted_rvars(const factor& f) const {
|
svector<lpvar> core::sorted_rvars(const factor& f) const {
|
||||||
if (f.is_var()) {
|
if (f.is_var()) {
|
||||||
svector<lpvar> r; r.push_back(map_to_root(f.var()));
|
svector<lpvar> r; r.push_back(map_to_root(f.var()));
|
||||||
|
|
|
@ -281,6 +281,10 @@ public:
|
||||||
|
|
||||||
svector<lpvar> reduce_monic_to_rooted(const svector<lpvar> & vars, rational & sign) const;
|
svector<lpvar> reduce_monic_to_rooted(const svector<lpvar> & vars, rational & sign) const;
|
||||||
|
|
||||||
|
// Reduce a single variable to its canonical root under current equalities
|
||||||
|
// and return the convertion sign as either 1 or -1
|
||||||
|
lpvar reduce_var_to_rooted(lpvar v, rational & sign) const;
|
||||||
|
|
||||||
monic_coeff canonize_monic(monic const& m) const;
|
monic_coeff canonize_monic(monic const& m) const;
|
||||||
|
|
||||||
int vars_sign(const svector<lpvar>& v);
|
int vars_sign(const svector<lpvar>& v);
|
||||||
|
@ -357,10 +361,6 @@ public:
|
||||||
template <typename T>
|
template <typename T>
|
||||||
bool vars_are_roots(const T& v) const;
|
bool vars_are_roots(const T& v) const;
|
||||||
|
|
||||||
void register_monic_in_tables(unsigned i_mon);
|
|
||||||
|
|
||||||
void register_monics_in_tables();
|
|
||||||
|
|
||||||
void clear();
|
void clear();
|
||||||
|
|
||||||
void init_search();
|
void init_search();
|
||||||
|
|
|
@ -280,6 +280,7 @@ struct solver::imp {
|
||||||
TRACE(nra,
|
TRACE(nra,
|
||||||
m_nlsat->display(tout << r << "\n");
|
m_nlsat->display(tout << r << "\n");
|
||||||
display(tout);
|
display(tout);
|
||||||
|
tout << "m_lp2nl:\n";
|
||||||
for (auto [j, x] : m_lp2nl) tout << "j" << j << " := x" << x << "\n";);
|
for (auto [j, x] : m_lp2nl) tout << "j" << j << " := x" << x << "\n";);
|
||||||
switch (r) {
|
switch (r) {
|
||||||
case l_true:
|
case l_true:
|
||||||
|
@ -317,14 +318,19 @@ struct solver::imp {
|
||||||
case 0:
|
case 0:
|
||||||
bound -= coeff;
|
bound -= coeff;
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1: {
|
||||||
v = nl2lp[pm.get_var(m, 0)];
|
v = nl2lp[pm.get_var(m, 0)];
|
||||||
t.add_monomial(coeff, v);
|
rational s;
|
||||||
|
v = m_nla_core.reduce_var_to_rooted(v, s);
|
||||||
|
t.add_monomial(s * coeff, v);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default: {
|
default: {
|
||||||
svector<lp::lpvar> vars;
|
svector<lp::lpvar> vars;
|
||||||
for (unsigned j = 0; j < num_vars; ++j)
|
for (unsigned j = 0; j < num_vars; ++j)
|
||||||
vars.push_back(nl2lp[pm.get_var(m, j)]);
|
vars.push_back(nl2lp[pm.get_var(m, j)]);
|
||||||
|
rational s(1);
|
||||||
|
vars = m_nla_core.reduce_monic_to_rooted(vars, s);
|
||||||
auto mon = m_nla_core.emons().find_canonical(vars);
|
auto mon = m_nla_core.emons().find_canonical(vars);
|
||||||
if (mon)
|
if (mon)
|
||||||
v = mon->var();
|
v = mon->var();
|
||||||
|
@ -339,12 +345,12 @@ struct solver::imp {
|
||||||
// polynomials so punt for now.
|
// polynomials so punt for now.
|
||||||
m_nla_core.add_monic(v, vars.size(), vars.data());
|
m_nla_core.add_monic(v, vars.size(), vars.data());
|
||||||
}
|
}
|
||||||
t.add_monomial(coeff, v);
|
t.add_monomial(s * coeff, v);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
TRACE(nra, this->lra.print_term(t, tout << "t:") << std::endl;);
|
||||||
switch (a->get_kind()) {
|
switch (a->get_kind()) {
|
||||||
case nlsat::atom::EQ:
|
case nlsat::atom::EQ:
|
||||||
lemma |= nla::ineq(lp::lconstraint_kind::EQ, t, bound);
|
lemma |= nla::ineq(lp::lconstraint_kind::EQ, t, bound);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue