3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-25 10:05:32 +00:00

pdd::subst_get

This commit is contained in:
Jakob Rath 2022-11-18 15:14:38 +01:00
parent adc9f7abe4
commit 022c06f75d
3 changed files with 51 additions and 3 deletions

View file

@ -185,7 +185,20 @@ namespace dd {
pdd v_val = mk_var(v) + val;
return pdd(apply(s.root, v_val.root, pdd_subst_add_op), this);
}
bool pdd_manager::subst_get(pdd const& s, unsigned v, rational& out_val) {
unsigned level_v = m_var2level[v];
PDD p = s.root;
while (/* !is_val(p) && */ level(p) > level_v) {
SASSERT(is_val(lo(p)));
p = hi(p);
}
if (!is_val(p) && level(p) == level_v) {
out_val = val(lo(p));
return true;
}
return false;
}
pdd_manager::PDD pdd_manager::apply(PDD arg1, PDD arg2, pdd_op op) {
bool first = true;

View file

@ -10,7 +10,7 @@ Abstract:
Poly DD package
It is a mild variant of ZDDs.
In PDDs arithmetic is either standard or using mod 2 (over GF2).
In PDDs arithmetic is either standard or using mod 2^n.
Non-leaf nodes are of the form x*hi + lo
where
@ -343,6 +343,7 @@ namespace dd {
pdd subst_val(pdd const& a, unsigned v, rational const& val);
pdd subst_val(pdd const& a, pdd const& s);
pdd subst_add(pdd const& s, unsigned v, rational const& val);
bool subst_get(pdd const& s, unsigned v, rational& out_val);
bool resolve(unsigned v, pdd const& p, pdd const& q, pdd& r);
pdd reduce(unsigned v, pdd const& a, pdd const& b);
void quot_rem(pdd const& a, pdd const& b, pdd& q, pdd& r);
@ -459,7 +460,8 @@ namespace dd {
pdd subst_val0(vector<std::pair<unsigned, rational>> const& s) const { return m.subst_val0(*this, s); }
pdd subst_val(pdd const& s) const { return m.subst_val(*this, s); }
pdd subst_val(unsigned v, rational const& val) const { return m.subst_val(*this, v, val); }
pdd subst_add(unsigned var, rational const& val) { return m.subst_add(*this, var, val); }
pdd subst_add(unsigned var, rational const& val) const { return m.subst_add(*this, var, val); }
bool subst_get(unsigned var, rational& out_val) const { return m.subst_get(*this, var, out_val); }
/**
* \brief substitute variable v by r.