Function biodivine_lib_bdd::_impl_bdd::_impl_boolean_ops::apply_with_flip
source · [−]fn apply_with_flip<T>(
left: &Bdd,
right: &Bdd,
flip_left_if: Option<BddVariable>,
flip_right_if: Option<BddVariable>,
flip_out_if: Option<BddVariable>,
terminal_lookup: T
) -> Bdd where
T: Fn(Option<bool>, Option<bool>) -> Option<bool>,
Expand description
(internal) Universal function to implement standard logical operators.
The terminal_lookup
function takes the two currently considered terminal BDD nodes (none
if the node is not terminal) and returns a boolean if these two nodes can be evaluated
by the function being implemented. For example, if one of the nodes is false
and we are
implementing and
, we can immediately evaluate to false
.
Additionally, you can provide flip_left_if
, flip_right_if
and flip_out_if
BddVariables
which will, given the corresponding node has the given decision variable, flip the low/high
link of the node. This is used to implement faster state-space generators for asynchronous
systems.
The reason why we allow this behaviour in apply, is that flipping the pointers in a BDD is cheap, but breaks the DFS order, which may result in unexpected behaviour. Furthermore, since the function is generic, in most performance intensive paths, it should be optimized anyway.