pub struct BDD<T>{ /* private fields */ }Expand description
A BDD is a Binary Decision Diagram, an efficient way to represent a
Boolean function in a canonical way. (It is actually a “Reduced Ordered
Binary Decision Diagram”, which gives it its canonicity assuming terminals
are ordered consistently.)
A BDD is built up from terminals (free variables) and constants, combined with the logical combinators AND, OR, and NOT. It may be evaluated with certain terminal assignments.
The major advantage of a BDD is that its logical operations are performed,
it will “self-simplify”: i.e., taking the OR of And(a, b) and And(a, Not(b)) will produce a without any further simplification step. Furthermore,
the BDDFunc representing this value is canonical: if two different
expressions are produced within the same BDD and they both result in
(simplify down to) a, then the BDDFunc values will be equal. The
tradeoff is that logical operations may be expensive: they are linear in
BDD size, but BDDs may have exponential size (relative to terminal count)
in the worst case.
Implementations§
Source§impl<T> BDD<T>
impl<T> BDD<T>
Sourcepub fn terminal(&mut self, t: T) -> BDDFunc
pub fn terminal(&mut self, t: T) -> BDDFunc
Produce a function within the BDD representing the terminal t. If
this terminal has been used in the BDD before, the same BDDFunc will be
returned.
Sourcepub fn constant(&mut self, val: bool) -> BDDFunc
pub fn constant(&mut self, val: bool) -> BDDFunc
Produce a function within the BDD representing the constant value val.
Sourcepub fn ite(&mut self, i: BDDFunc, t: BDDFunc, e: BDDFunc) -> BDDFunc
pub fn ite(&mut self, i: BDDFunc, t: BDDFunc, e: BDDFunc) -> BDDFunc
Produce a function within the BDD representing the logical if-then-else
of the functions i, t, and e
Sourcepub fn not(&mut self, n: BDDFunc) -> BDDFunc
pub fn not(&mut self, n: BDDFunc) -> BDDFunc
Produce a function within the BDD representing the logical complement
of the function n.
Sourcepub fn and(&mut self, a: BDDFunc, b: BDDFunc) -> BDDFunc
pub fn and(&mut self, a: BDDFunc, b: BDDFunc) -> BDDFunc
Produce a function within the BDD representing the logical AND of the
functions a and b.
Sourcepub fn or(&mut self, a: BDDFunc, b: BDDFunc) -> BDDFunc
pub fn or(&mut self, a: BDDFunc, b: BDDFunc) -> BDDFunc
Produce a function within the BDD representing the logical OR of the
functions a and b.
Sourcepub fn xor(&mut self, a: BDDFunc, b: BDDFunc) -> BDDFunc
pub fn xor(&mut self, a: BDDFunc, b: BDDFunc) -> BDDFunc
Produce a function within the BDD representing the logical XOR of the
functions a and b.
Sourcepub fn implies(&mut self, a: BDDFunc, b: BDDFunc) -> BDDFunc
pub fn implies(&mut self, a: BDDFunc, b: BDDFunc) -> BDDFunc
Produce a function within the BDD representing the logical implication a -> b.
Sourcepub fn sat(&self, f: BDDFunc) -> bool
pub fn sat(&self, f: BDDFunc) -> bool
Check whether the function f within the BDD is satisfiable.
Sourcepub fn restrict(&mut self, f: BDDFunc, t: T, val: bool) -> BDDFunc
pub fn restrict(&mut self, f: BDDFunc, t: T, val: bool) -> BDDFunc
Return a new function based on f but with the given label forced to the given value.
Sourcepub fn from_expr(&mut self, e: &Expr<T>) -> BDDFunc
pub fn from_expr(&mut self, e: &Expr<T>) -> BDDFunc
Produce a function within the BDD representing the given expression
e, which may contain ANDs, ORs, NOTs, terminals, and constants.
Sourcepub fn evaluate(&self, f: BDDFunc, values: &HashMap<T, bool>) -> bool
pub fn evaluate(&self, f: BDDFunc, values: &HashMap<T, bool>) -> bool
Evaluate the function f in the BDD with the given terminal
assignments. Any terminals not specified in values default to false.
Sourcepub fn sat_one(&self, f: BDDFunc) -> Option<HashMap<T, bool>>
pub fn sat_one(&self, f: BDDFunc) -> Option<HashMap<T, bool>>
Compute an assignment for terminals which satisfies ‘f’. If satisfiable, this function returns a HashMap with the assignments (true, false) for terminals unless a terminal’s assignment does not matter for satisfiability. If ‘f’ is not satisfiable, returns None.
Example: for the boolean function “a or b”, this function could return one of the following two HashMaps: {“a” -> true} or {“b” -> true}.
Sourcepub fn to_expr(&self, f: BDDFunc) -> Expr<T>
pub fn to_expr(&self, f: BDDFunc) -> Expr<T>
Convert the BDD to a minimized sum-of-products expression.
Sourcepub fn to_dot(&self, f: BDDFunc) -> String
pub fn to_dot(&self, f: BDDFunc) -> String
Export BDD to dot format (from the graphviz package) to enable visualization.
Trait Implementations§
Auto Trait Implementations§
impl<T> Freeze for BDD<T>
impl<T> RefUnwindSafe for BDD<T>where
T: RefUnwindSafe,
impl<T> Send for BDD<T>where
T: Send,
impl<T> Sync for BDD<T>where
T: Sync,
impl<T> Unpin for BDD<T>where
T: Unpin,
impl<T> UnwindSafe for BDD<T>where
T: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more