3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-07-03 03:15:41 +00:00

cleanup and adding an assert in emons

Signed-off-by: Lev Nachmanson <levnach@hotmail.com>
This commit is contained in:
Lev Nachmanson 2019-05-12 14:27:05 -07:00
parent 2b5e8e9652
commit 821886b94b
7 changed files with 59 additions and 9 deletions

View file

@ -30,7 +30,6 @@ namespace nla {
class core; class core;
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.
@ -75,6 +74,7 @@ class emonomials : public var_eqs_merge_handler {
} }
}; };
mutable svector<lpvar> m_find_key; // the key used when looking for a monomial with the specific variables
var_eqs& m_ve; var_eqs& m_ve;
mutable vector<monomial> m_monomials; // set of monomials mutable vector<monomial> m_monomials; // set of monomials
mutable unsigned_vector m_var2index; // var_mIndex -> mIndex mutable unsigned_vector m_var2index; // var_mIndex -> mIndex
@ -266,16 +266,16 @@ public:
}; };
class sign_equiv_monomials { class sign_equiv_monomials {
emonomials& em; const emonomials& em;
monomial const& m; monomial const& m;
unsigned index() const { return em.m_var2index[m.var()]; } unsigned index() const { return em.m_var2index[m.var()]; }
public: public:
sign_equiv_monomials(emonomials & em, monomial const& m): em(em), m(m) {} sign_equiv_monomials(const emonomials & em, monomial const& m): em(em), m(m) {}
sign_equiv_monomials_it begin() { return sign_equiv_monomials_it(em, index(), false); } sign_equiv_monomials_it begin() { return sign_equiv_monomials_it(em, index(), false); }
sign_equiv_monomials_it end() { return sign_equiv_monomials_it(em, index(), true); } sign_equiv_monomials_it end() { return sign_equiv_monomials_it(em, index(), true); }
}; };
sign_equiv_monomials enum_sign_equiv_monomials(monomial const& m) { return sign_equiv_monomials(*this, m); } sign_equiv_monomials enum_sign_equiv_monomials(monomial const& m) const { return sign_equiv_monomials(*this, m); }
sign_equiv_monomials enum_sign_equiv_monomials(lpvar v) { return enum_sign_equiv_monomials((*this)[v]); } sign_equiv_monomials enum_sign_equiv_monomials(lpvar v) { return enum_sign_equiv_monomials((*this)[v]); }
/** /**
\brief display state of emonomials \brief display state of emonomials

View file

@ -19,7 +19,6 @@
--*/ --*/
#pragma once #pragma once
#include "util/lp/monomial.h" #include "util/lp/monomial.h"
#include "util/lp/rooted_mons.h"
#include "util/lp/factorization.h" #include "util/lp/factorization.h"
#include "util/lp/nla_common.h" #include "util/lp/nla_common.h"

View file

@ -1866,6 +1866,7 @@ lbool core:: inner_check(bool derived) {
} }
if (derived) continue; if (derived) continue;
TRACE("nla_solver", tout << "passed derived and basic lemmas\n";); TRACE("nla_solver", tout << "passed derived and basic lemmas\n";);
SASSERT(elists_are_consistent());
if (search_level == 1) { if (search_level == 1) {
m_order.order_lemma(); m_order.order_lemma();
} else { // search_level == 2 } else { // search_level == 2
@ -1875,8 +1876,58 @@ lbool core:: inner_check(bool derived) {
} }
return m_lemma_vec->empty()? l_undef : l_false; return m_lemma_vec->empty()? l_undef : l_false;
} }
struct hash_svector {
size_t operator()(const unsigned_vector & v) const {
return svector_hash<unsigned_hash>()(v);
}
};
bool core::elist_is_consistent(const std::unordered_set<lpvar> & list) const {
bool first = true;
bool p;
for (lpvar j : list) {
if (first) {
p = check_monomial(m_emons[j]);
first = false;
} else
if (check_monomial(m_emons[j]) != p)
return false;
}
return true;
}
bool core::elists_are_consistent() const {
lbool core:: check(vector<lemma>& l_vec) { std::unordered_map<unsigned_vector, std::unordered_set<lpvar>, hash_svector> lists;
for (auto const & m : m_emons) {
auto it = lists.find(m.rvars());
if (it == lists.end()) {
std::unordered_set<lpvar> v;
v.insert(m.var());
lists[m.rvars()] = v;
} else {
it->second.insert(m.var());
}
}
for (auto const & m : m_emons) {
if (!is_canonical_monomial(m.var()))
continue;
std::unordered_set<lpvar> c;
for (const monomial& e : m_emons.enum_sign_equiv_monomials(m))
c.insert(e.var());
auto it = lists.find(m.rvars());
SASSERT(it->second == c);
}
for (const auto & p : lists) {
if (! elist_is_consistent(p.second))
return false;
}
return true;
}
lbool core::check(vector<lemma>& l_vec) {
settings().st().m_nla_calls++; settings().st().m_nla_calls++;
TRACE("nla_solver", tout << "calls = " << settings().st().m_nla_calls << "\n";); TRACE("nla_solver", tout << "calls = " << settings().st().m_nla_calls << "\n";);
m_lemma_vec = &l_vec; m_lemma_vec = &l_vec;

View file

@ -241,7 +241,8 @@ public:
bool find_canonical_monomial_of_vars(const svector<lpvar>& vars, lpvar & i) const; bool find_canonical_monomial_of_vars(const svector<lpvar>& vars, lpvar & i) const;
bool is_canonical_monomial(lpvar) const; bool is_canonical_monomial(lpvar) const;
bool elists_are_consistent() const;
bool elist_is_consistent(const std::unordered_set<lpvar>&) const;
bool var_has_positive_lower_bound(lpvar j) const; bool var_has_positive_lower_bound(lpvar j) const;
bool var_has_negative_upper_bound(lpvar j) const; bool var_has_negative_upper_bound(lpvar j) const;

View file

@ -18,7 +18,6 @@
--*/ --*/
#pragma once #pragma once
#include "util/lp/rooted_mons.h"
#include "util/lp/factorization.h" #include "util/lp/factorization.h"
#include "util/lp/nla_common.h" #include "util/lp/nla_common.h"

View file

@ -19,7 +19,6 @@
--*/ --*/
#pragma once #pragma once
#include "util/rational.h" #include "util/rational.h"
#include "util/lp/rooted_mons.h"
#include "util/lp/factorization.h" #include "util/lp/factorization.h"
#include "util/lp/nla_common.h" #include "util/lp/nla_common.h"

View file

@ -154,6 +154,7 @@ public:
return explain(find(s), s, e); return explain(find(s), s, e);
} }
// iterates over the class of signed_var(m_idx)
class iterator { class iterator {
var_eqs& m_ve; // context. var_eqs& m_ve; // context.
unsigned m_idx; // index into a signed variable, same as union-find index unsigned m_idx; // index into a signed variable, same as union-find index