mirror of
https://github.com/Z3Prover/z3
synced 2025-06-06 14:13:23 +00:00
parent
a71b4fab23
commit
e5892e5e97
4 changed files with 25 additions and 3 deletions
|
@ -93,8 +93,16 @@ namespace bv {
|
||||||
} while (curr != v);
|
} while (curr != v);
|
||||||
|
|
||||||
zero_one_bits const& _bits = m_zero_one_bits[v];
|
zero_one_bits const& _bits = m_zero_one_bits[v];
|
||||||
if (_bits.size() != num_bits)
|
if (_bits.size() != num_bits) {
|
||||||
std::cout << v << " " << _bits.size() << " " << num_bits << "\n";
|
std::cout << "v" << v << " " << _bits.size() << " " << num_bits << "\n";
|
||||||
|
std::cout << "true: " << mk_true() << "\n";
|
||||||
|
do {
|
||||||
|
std::cout << "v" << curr << ": " << m_bits[curr] << "\n";
|
||||||
|
curr = m_find.next(curr);
|
||||||
|
}
|
||||||
|
while (curr != v);
|
||||||
|
}
|
||||||
|
SASSERT(_bits.size() == num_bits);
|
||||||
VERIFY(_bits.size() == num_bits);
|
VERIFY(_bits.size() == num_bits);
|
||||||
bool_vector already_found;
|
bool_vector already_found;
|
||||||
already_found.resize(bv_sz, false);
|
already_found.resize(bv_sz, false);
|
||||||
|
|
|
@ -664,7 +664,7 @@ namespace bv {
|
||||||
result->set_solver(&ctx.s());
|
result->set_solver(&ctx.s());
|
||||||
for (theory_var i = 0; i < static_cast<theory_var>(get_num_vars()); ++i)
|
for (theory_var i = 0; i < static_cast<theory_var>(get_num_vars()); ++i)
|
||||||
if (find(i) != i)
|
if (find(i) != i)
|
||||||
result->m_find.merge(i, find(i));
|
result->m_find.set_root(i, find(i));
|
||||||
result->m_prop_queue.append(m_prop_queue);
|
result->m_prop_queue.append(m_prop_queue);
|
||||||
for (unsigned i = 0; i < m_bool_var2atom.size(); ++i) {
|
for (unsigned i = 0; i < m_bool_var2atom.size(); ++i) {
|
||||||
atom* a = m_bool_var2atom[i];
|
atom* a = m_bool_var2atom[i];
|
||||||
|
|
|
@ -102,6 +102,9 @@ namespace bv {
|
||||||
unsigned m_is_true:1;
|
unsigned m_is_true:1;
|
||||||
zero_one_bit(theory_var v = euf::null_theory_var, unsigned idx = UINT_MAX, bool is_true = false):
|
zero_one_bit(theory_var v = euf::null_theory_var, unsigned idx = UINT_MAX, bool is_true = false):
|
||||||
m_owner(v), m_idx(idx), m_is_true(is_true) {}
|
m_owner(v), m_idx(idx), m_is_true(is_true) {}
|
||||||
|
std::ostream& display(std::ostream& out) const {
|
||||||
|
return out << "v" << m_owner << " @ " << m_idx << " " << (m_is_true?"T":"F");
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef svector<zero_one_bit> zero_one_bits;
|
typedef svector<zero_one_bit> zero_one_bits;
|
||||||
|
@ -367,9 +370,12 @@ namespace bv {
|
||||||
typedef std::pair<solver const*, theory_var> pp_var;
|
typedef std::pair<solver const*, theory_var> pp_var;
|
||||||
pp_var pp(theory_var v) const { return pp_var(this, v); }
|
pp_var pp(theory_var v) const { return pp_var(this, v); }
|
||||||
|
|
||||||
|
friend std::ostream& operator<<(std::ostream& out, solver::zero_one_bit const& zo) { return zo.display(out); }
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
inline std::ostream& operator<<(std::ostream& out, solver::pp_var const& p) { return p.first->display(out, p.second); }
|
inline std::ostream& operator<<(std::ostream& out, solver::pp_var const& p) { return p.first->display(out, p.second); }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -134,6 +134,14 @@ public:
|
||||||
CASSERT("union_find", check_invariant());
|
CASSERT("union_find", check_invariant());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void set_root(unsigned v, unsigned root) {
|
||||||
|
TRACE("union_find", tout << "merging " << v << " " << root << "\n";);
|
||||||
|
SASSERT(v != root);
|
||||||
|
m_find[v] = root;
|
||||||
|
m_size[root] += m_size[v];
|
||||||
|
std::swap(m_next[root], m_next[v]);
|
||||||
|
}
|
||||||
|
|
||||||
// dissolve equivalence class of v
|
// dissolve equivalence class of v
|
||||||
// this method cannot be used with backtracking.
|
// this method cannot be used with backtracking.
|
||||||
void dissolve(unsigned v) {
|
void dissolve(unsigned v) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue