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:
parent
8303d8c9ae
commit
bdabd52fb9
3 changed files with 17 additions and 23 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -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)) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue