mirror of
https://github.com/Z3Prover/z3
synced 2025-07-21 20:02:05 +00:00
add code review and replacement for mk_int
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
572197aede
commit
4b35c75712
4 changed files with 38 additions and 2 deletions
|
@ -896,6 +896,9 @@ namespace dd {
|
||||||
std::ostream& operator<<(std::ostream& out, bdd const& b) { return b.display(out); }
|
std::ostream& operator<<(std::ostream& out, bdd const& b) { return b.display(out); }
|
||||||
|
|
||||||
|
|
||||||
|
// NSB code review:
|
||||||
|
// this function should be removed and replaced by functionality where the
|
||||||
|
// client maintains what are the variables.
|
||||||
bdd bdd_manager::mk_int(rational const& val, unsigned w) {
|
bdd bdd_manager::mk_int(rational const& val, unsigned w) {
|
||||||
bdd b = mk_true();
|
bdd b = mk_true();
|
||||||
for (unsigned k = w; k-- > 0;)
|
for (unsigned k = w; k-- > 0;)
|
||||||
|
@ -981,6 +984,22 @@ namespace dd {
|
||||||
return eq;
|
return eq;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bdd bdd_manager::mk_eq(bddv const& a, rational const& n) {
|
||||||
|
SASSERT(n.is_int() && n >= 0 && n < rational(2).expt(a.size()));
|
||||||
|
bdd b = mk_true();
|
||||||
|
for (unsigned i = a.size(); i-- > 0; )
|
||||||
|
b &= n.get_bit(i) ? a[i] : !a[i];
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
|
||||||
|
bdd bdd_manager::mk_eq(unsigned_vector const& vars, rational const& n) {
|
||||||
|
SASSERT(n.is_int() && n >= 0 && n < rational(2).expt(vars.size()));
|
||||||
|
bdd b = mk_true();
|
||||||
|
for (unsigned i = vars.size(); i-- > 0; )
|
||||||
|
b &= n.get_bit(i) ? mk_var(vars[i]) : mk_nvar(vars[i]);
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
|
||||||
bdd bdd_manager::mk_ule(bddv const& a, bddv const& b) {
|
bdd bdd_manager::mk_ule(bddv const& a, bddv const& b) {
|
||||||
SASSERT(a.size() == b.size());
|
SASSERT(a.size() == b.size());
|
||||||
bdd lt = mk_false();
|
bdd lt = mk_false();
|
||||||
|
|
|
@ -236,6 +236,8 @@ namespace dd {
|
||||||
bdd mk_slt(bddv const& a, bddv const& b); // { return mk_sle(a, b) && !mk_eq(a, b); }
|
bdd mk_slt(bddv const& a, bddv const& b); // { return mk_sle(a, b) && !mk_eq(a, b); }
|
||||||
bdd mk_sgt(bddv const& a, bddv const& b); // { return mk_slt(b, a); }
|
bdd mk_sgt(bddv const& a, bddv const& b); // { return mk_slt(b, a); }
|
||||||
bdd mk_eq(bddv const& a, bddv const& b);
|
bdd mk_eq(bddv const& a, bddv const& b);
|
||||||
|
bdd mk_eq(bddv const& a, rational const& v);
|
||||||
|
bdd mk_eq(unsigned_vector const& vars, rational const& v);
|
||||||
bddv mk_num(rational const& n, unsigned num_bits);
|
bddv mk_num(rational const& n, unsigned num_bits);
|
||||||
bddv mk_ones(unsigned num_bits);
|
bddv mk_ones(unsigned num_bits);
|
||||||
bddv mk_zero(unsigned num_bits);
|
bddv mk_zero(unsigned num_bits);
|
||||||
|
|
|
@ -29,6 +29,18 @@ namespace polysat {
|
||||||
return *m_pdd[sz];
|
return *m_pdd[sz];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vector<bdd>& solver::sz2bits(unsigned sz) {
|
||||||
|
m_bits.reserve(sz + 1);
|
||||||
|
auto* bits = m_bits[sz];
|
||||||
|
if (!bits) {
|
||||||
|
m_bits.set(sz, alloc(vector<bdd>));
|
||||||
|
bits = m_bits[sz];
|
||||||
|
for (unsigned i = 0; i < sz; ++i)
|
||||||
|
bits->push_back(m_bdd.mk_var(i));
|
||||||
|
}
|
||||||
|
return *bits;
|
||||||
|
}
|
||||||
|
|
||||||
bool solver::is_viable(pvar v, rational const& val) {
|
bool solver::is_viable(pvar v, rational const& val) {
|
||||||
return m_viable[v].contains_int(val, size(v));
|
return m_viable[v].contains_int(val, size(v));
|
||||||
}
|
}
|
||||||
|
@ -37,7 +49,8 @@ namespace polysat {
|
||||||
LOG("pvar " << v << " /= " << val);
|
LOG("pvar " << v << " /= " << val);
|
||||||
TRACE("polysat", tout << "v" << v << " /= " << val << "\n";);
|
TRACE("polysat", tout << "v" << v << " /= " << val << "\n";);
|
||||||
SASSERT(is_viable(v, val));
|
SASSERT(is_viable(v, val));
|
||||||
intersect_viable(v, !m_bdd.mk_int(val, size(v)));
|
auto& bits = sz2bits(size(v));
|
||||||
|
intersect_viable(v, !m_bdd.mk_eq(bits, val));
|
||||||
}
|
}
|
||||||
|
|
||||||
void solver::intersect_viable(pvar v, bdd vals) {
|
void solver::intersect_viable(pvar v, bdd vals) {
|
||||||
|
|
|
@ -44,6 +44,7 @@ namespace polysat {
|
||||||
|
|
||||||
reslimit& m_lim;
|
reslimit& m_lim;
|
||||||
scoped_ptr_vector<dd::pdd_manager> m_pdd;
|
scoped_ptr_vector<dd::pdd_manager> m_pdd;
|
||||||
|
scoped_ptr_vector<vector<bdd>> m_bits;
|
||||||
dd::bdd_manager m_bdd;
|
dd::bdd_manager m_bdd;
|
||||||
dep_value_manager m_value_manager;
|
dep_value_manager m_value_manager;
|
||||||
small_object_allocator m_alloc;
|
small_object_allocator m_alloc;
|
||||||
|
@ -142,6 +143,7 @@ namespace polysat {
|
||||||
void del_var();
|
void del_var();
|
||||||
|
|
||||||
dd::pdd_manager& sz2pdd(unsigned sz);
|
dd::pdd_manager& sz2pdd(unsigned sz);
|
||||||
|
vector<bdd>& sz2bits(unsigned sz);
|
||||||
|
|
||||||
void push_level();
|
void push_level();
|
||||||
void pop_levels(unsigned num_levels);
|
void pop_levels(unsigned num_levels);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue