3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-15 05:18:44 +00:00

remove m_mons_to_rehash, fix a bug in emonomials::after_merge_eh(), generate order and tangent lemmas on any monomial

Signed-off-by: Lev Nachmanson <levnach@hotmail.com>
This commit is contained in:
Lev Nachmanson 2019-05-15 15:34:57 -07:00
parent 45b72d7790
commit d3bd55d0cf
5 changed files with 5 additions and 15 deletions

View file

@ -64,12 +64,7 @@ void emonomials::pop(unsigned n) {
m_region.pop_scope(n);
m_lim.shrink(m_lim.size() - n);
SASSERT(monomials_are_canonized());
m_mons_to_rehash.clear();
m_u_f_stack.pop_scope(n);
for (unsigned j : m_mons_to_rehash) {
remove_cg_mon(m_monomials[j]);
insert_cg_mon(m_monomials[j]);
}
}
void emonomials::remove_cell(head_tail& v, unsigned mIndex) {
@ -384,8 +379,8 @@ void emonomials::after_merge_eh(signed_var r2, signed_var r1, signed_var v2, sig
if (m_ve.find(~r1) == m_ve.find(~r2)) { // the other sign has also been merged
m_use_lists.reserve(std::max(r2.var(), r1.var()) + 1);
TRACE("nla_solver", tout << "rehasing " << r1.var() << "\n";);
rehash_cg(r1.var());
merge_cells(m_use_lists[r2.var()], m_use_lists[r1.var()]);
rehash_cg(r1.var());
}
}

View file

@ -82,7 +82,6 @@ class emonomials {
union_find<emonomials> m_u_f;
trail_stack<emonomials> m_u_f_stack;
std::unordered_set<unsigned> m_mons_to_rehash;
mutable svector<lpvar> m_find_key; // the key used when looking for a monomial with the specific variables
var_eqs<emonomials>& m_ve;
mutable vector<monomial> m_monomials; // set of monomials
@ -133,8 +132,6 @@ public:
void unmerge_eh(unsigned i, unsigned j) {
TRACE("nla_solver", tout << "unmerged " << i << " and " << j << "\n";);
m_mons_to_rehash.insert(i);
m_mons_to_rehash.insert(j);
}
void merge_eh(unsigned r2, unsigned r1, unsigned v2, unsigned v1) {}

View file

@ -1599,13 +1599,12 @@ bool core::find_bfc_to_refine_on_monomial(const monomial& m, factorization & bf)
return false;
}
// finds a canonical monomial with its binary factorization
// finds a monomial to refine with its binary factorization
bool core::find_bfc_to_refine(const monomial* & m, factorization & bf){
m = nullptr;
unsigned r = random(), sz = m_to_refine.size();
for (unsigned k = 0; k < sz; k++) {
lpvar i = m_to_refine[(k + r) % sz];
if (!is_canonical_monomial(i)) continue;
m = &m_emons[i];
SASSERT (!check_monomial(*m));
if (m->size() == 2) {

View file

@ -38,8 +38,7 @@ void order::order_lemma() {
unsigned sz = to_ref.size();
for (unsigned i = 0; i < sz && !done(); ++i) {
lpvar j = to_ref[(i + r) % sz];
if (c().is_canonical_monomial(j))
order_lemma_on_canonical_monomial(c().emons()[j]);
order_lemma_on_monomial(c().emons()[j]);
}
}
@ -47,7 +46,7 @@ void order::order_lemma() {
// a > b && c > 0 => ac > bc
// Consider here some binary factorizations of m=ac and
// try create order lemmas with either factor playing the role of c.
void order::order_lemma_on_canonical_monomial(const monomial& m) {
void order::order_lemma_on_monomial(const monomial& m) {
TRACE("nla_solver_details",
tout << "m = " << pp_mon(c(), m););

View file

@ -67,7 +67,7 @@ private:
void order_lemma_on_binomial_ac_bd(const monomial& ac, bool k, const monomial& bd, const factor& b, lpvar d);
void order_lemma_on_binomial_sign(const monomial& ac, lpvar x, lpvar y, int sign);
void order_lemma_on_binomial(const monomial& ac);
void order_lemma_on_canonical_monomial(const monomial& rm);
void order_lemma_on_monomial(const monomial& rm);
// |c_sign| = 1, and c*c_sign > 0
// ac > bc => ac/|c| > bc/|c| => a*c_sign > b*c_sign
void generate_ol(const monomial& ac,