3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2026-02-20 07:24:40 +00:00

use union_find in emonomials

Signed-off-by: Lev Nachmanson <levnach@hotmail.com>
This commit is contained in:
Lev Nachmanson 2019-05-14 17:20:08 -07:00
parent d78cc4975a
commit 45b72d7790
5 changed files with 123 additions and 84 deletions

View file

@ -133,7 +133,8 @@ void core::push() {
void core::pop(unsigned n) {
TRACE("nla_solver", tout << "n = " << n << "\n";);
m_emons.pop(n);
m_emons.pop(n);
SASSERT(elists_are_consistent(false));
}
rational core::product_value(const unsigned_vector & m) const {
@ -811,11 +812,7 @@ bool core::find_canonical_monomial_of_vars(const svector<lpvar>& vars, lpvar & i
}
bool core::is_canonical_monomial(lpvar j) const {
const monomial & m = m_emons[j];
unsigned k;
SASSERT(find_canonical_monomial_of_vars(m.rvars(), k));
find_canonical_monomial_of_vars(m.rvars(), k);
return j == k;
return m_emons.is_canonical_monomial(j);
}
@ -1366,6 +1363,7 @@ void core::clear() {
void core::init_search() {
clear();
init_vars_equivalence();
SASSERT(elists_are_consistent(false));
}
void core::init_to_refine() {
@ -1866,7 +1864,7 @@ lbool core:: inner_check(bool derived) {
}
if (derived) continue;
TRACE("nla_solver", tout << "passed derived and basic lemmas\n";);
SASSERT(elists_are_consistent());
SASSERT(elists_are_consistent(true));
if (search_level == 1) {
m_order.order_lemma();
} else { // search_level == 2
@ -1877,12 +1875,6 @@ lbool core:: inner_check(bool derived) {
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;
@ -1897,29 +1889,13 @@ bool core::elist_is_consistent(const std::unordered_set<lpvar> & list) const {
return true;
}
bool core::elists_are_consistent() const {
bool core::elists_are_consistent(bool check_in_model) const {
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);
}
if (!m_emons.elists_are_consistent(lists))
return false;
if (!check_in_model)
return true;
for (const auto & p : lists) {
if (! elist_is_consistent(p.second))
return false;