3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-06-06 06:03:23 +00:00

fix in m_cg_table.find()

Signed-off-by: Lev Nachmanson <levnach@hotmail.com>
This commit is contained in:
Lev Nachmanson 2019-04-25 17:50:06 -07:00
parent 8303d8c9ae
commit bdabd52fb9
3 changed files with 17 additions and 23 deletions

View file

@ -134,26 +134,13 @@ namespace nla {
monomial const* emonomials::find_canonical(svector<lpvar> const& vars) const { monomial const* emonomials::find_canonical(svector<lpvar> const& vars) const {
SASSERT(m_ve.is_root(vars)); SASSERT(m_ve.is_root(vars));
// find a unique key for dummy monomial m_find_key = vars;
lpvar v = m_var2index.size(); std::sort(m_find_key.begin(), m_find_key.end());
for (unsigned i = 0; i < m_var2index.size(); ++i) {
if (m_var2index[i] == UINT_MAX) {
v = i;
break;
}
}
unsigned idx = m_monomials.size();
m_monomials.push_back(monomial(v, vars, idx));
m_var2index.setx(v, idx, UINT_MAX);
do_canonize(m_monomials[idx]);
monomial const* result = nullptr; monomial const* result = nullptr;
lpvar w; lpvar w;
if (m_cg_table.find(v, w)) { if (m_cg_table.find(UINT_MAX, w)) {
SASSERT(w != v);
result = &m_monomials[m_var2index[w]]; result = &m_monomials[m_var2index[w]];
} }
m_var2index[v] = UINT_MAX;
m_monomials.pop_back();
return result; return result;
} }

View file

@ -28,7 +28,7 @@
namespace nla { namespace nla {
class emonomials : public var_eqs_merge_handler { class emonomials : public var_eqs_merge_handler {
mutable svector<lpvar> m_find_key;
/** /**
\brief singly-lined cyclic list of monomial indices where variable occurs. \brief singly-lined cyclic list of monomial indices where variable occurs.
Each variable points to the head and tail of the cyclic list. Each variable points to the head and tail of the cyclic list.
@ -52,7 +52,7 @@ class emonomials : public var_eqs_merge_handler {
hash_canonical(emonomials& em): em(em) {} hash_canonical(emonomials& em): em(em) {}
unsigned operator()(lpvar v) const { unsigned operator()(lpvar v) const {
auto const& vec = em.m_monomials[em.m_var2index[v]].rvars(); auto const& vec = v != UINT_MAX? em.m_monomials[em.m_var2index[v]].rvars() : em.m_find_key;
return string_hash(reinterpret_cast<char const*>(vec.c_ptr()), sizeof(lpvar)*vec.size(), 10); return string_hash(reinterpret_cast<char const*>(vec.c_ptr()), sizeof(lpvar)*vec.size(), 10);
} }
}; };
@ -67,8 +67,8 @@ class emonomials : public var_eqs_merge_handler {
emonomials& em; emonomials& em;
eq_canonical(emonomials& em): em(em) {} eq_canonical(emonomials& em): em(em) {}
bool operator()(lpvar u, lpvar v) const { bool operator()(lpvar u, lpvar v) const {
auto const& uvec = em.m_monomials[em.m_var2index[u]].rvars(); auto const& uvec = u != UINT_MAX? em.m_monomials[em.m_var2index[u]].rvars(): em.m_find_key;
auto const& vvec = em.m_monomials[em.m_var2index[v]].rvars(); auto const& vvec = v != UINT_MAX? em.m_monomials[em.m_var2index[v]].rvars(): em.m_find_key;
return uvec == vvec; return uvec == vvec;
} }
}; };

View file

@ -96,9 +96,12 @@ void order::order_lemma_on_binomial_sign(const monomial& xy, lpvar x, lpvar y, i
// We look for monomials e = m.rvars()[k]*d and see if we can create an order lemma for m and e // We look for monomials e = m.rvars()[k]*d and see if we can create an order lemma for m and e
void order::order_lemma_on_factor_binomial_explore(const monomial& m, bool k) { void order::order_lemma_on_factor_binomial_explore(const monomial& m, bool k) {
TRACE("nla_solver", tout << "m = " << pp_rmon(c(), m););
SASSERT(m.size() == 2); SASSERT(m.size() == 2);
lpvar c = m.vars()[k]; lpvar c = m.vars()[k];
for (monomial const& m2 : _().m_emons.get_products_of(c)) { for (monomial const& m2 : _().m_emons.get_products_of(c)) {
TRACE("nla_solver", tout << "m2 = " << pp_rmon(_(), m2););
order_lemma_on_factor_binomial_rm(m, k, m2); order_lemma_on_factor_binomial_rm(m, k, m2);
if (done()) { if (done()) {
break; break;
@ -109,7 +112,11 @@ void order::order_lemma_on_factor_binomial_explore(const monomial& m, bool k) {
// ac is a binomial // ac is a binomial
// create order lemma on monomials bd where d is equivalent to ac[k] // create order lemma on monomials bd where d is equivalent to ac[k]
void order::order_lemma_on_factor_binomial_rm(const monomial& ac, bool k, const monomial& bd) { void order::order_lemma_on_factor_binomial_rm(const monomial& ac, bool k, const monomial& bd) {
TRACE("nla_solver", tout << "bd=" << pp_rmon(_(), bd) << "\n";); TRACE("nla_solver",
tout << "ac=" << pp_rmon(_(), ac) << "\n";
tout << "k=" << k << "\n";
tout << "bd=" << pp_rmon(_(), bd) << "\n";
);
factor d(_().m_evars.find(ac.vars()[k]).var(), factor_type::VAR); factor d(_().m_evars.find(ac.vars()[k]).var(), factor_type::VAR);
factor b; factor b;
if (c().divide(bd, d, b)) { if (c().divide(bd, d, b)) {