Copyright | (c) Masahiro Sakai 2021 |
---|---|
License | BSD-style |
Maintainer | masahiro.sakai@gmail.com |
Stability | unstable |
Portability | non-portable |
Safe Haskell | None |
Language | Haskell2010 |
Data.DecisionDiagram.ZDD
Description
Zero-Suppressed binary decision diagram.
References:
- S. Minato, "Zero-Suppressed BDDs for Set Manipulation in Combinatorial Problems," 30th ACM/IEEE Design Automation Conference, 1993, pp. 272-277, doi: 10.1145/157485.164890. https://www.researchgate.net/publication/221062015_Zero-Suppressed_BDDs_for_Set_Manipulation_in_Combinatorial_Problems
Synopsis
- data ZDD a where
- class ItemOrder a where
- compareItem :: proxy a -> Int -> Int -> Ordering
- data AscOrder
- data DescOrder
- withDefaultOrder :: forall r. (forall a. ItemOrder a => Proxy a -> r) -> r
- withAscOrder :: forall r. (Proxy AscOrder -> r) -> r
- withDescOrder :: forall r. (Proxy DescOrder -> r) -> r
- withCustomOrder :: forall r. (Int -> Int -> Ordering) -> (forall a. ItemOrder a => Proxy a -> r) -> r
- empty :: ZDD a
- base :: ZDD a
- singleton :: forall a. ItemOrder a => IntSet -> ZDD a
- subsets :: forall a. ItemOrder a => IntSet -> ZDD a
- fromListOfIntSets :: forall a. ItemOrder a => [IntSet] -> ZDD a
- fromSetOfIntSets :: forall a. ItemOrder a => Set IntSet -> ZDD a
- insert :: forall a. ItemOrder a => IntSet -> ZDD a -> ZDD a
- delete :: forall a. ItemOrder a => IntSet -> ZDD a -> ZDD a
- member :: forall a. ItemOrder a => IntSet -> ZDD a -> Bool
- notMember :: forall a. ItemOrder a => IntSet -> ZDD a -> Bool
- null :: ZDD a -> Bool
- size :: Integral b => ZDD a -> b
- isSubsetOf :: ItemOrder a => ZDD a -> ZDD a -> Bool
- isProperSubsetOf :: ItemOrder a => ZDD a -> ZDD a -> Bool
- disjoint :: ItemOrder a => ZDD a -> ZDD a -> Bool
- union :: forall a. ItemOrder a => ZDD a -> ZDD a -> ZDD a
- unions :: forall f a. (Foldable f, ItemOrder a) => f (ZDD a) -> ZDD a
- intersection :: forall a. ItemOrder a => ZDD a -> ZDD a -> ZDD a
- difference :: forall a. ItemOrder a => ZDD a -> ZDD a -> ZDD a
- (\\) :: forall a. ItemOrder a => ZDD a -> ZDD a -> ZDD a
- nonSuperset :: forall a. ItemOrder a => ZDD a -> ZDD a -> ZDD a
- subset1 :: forall a. ItemOrder a => Int -> ZDD a -> ZDD a
- subset0 :: forall a. ItemOrder a => Int -> ZDD a -> ZDD a
- mapInsert :: forall a. ItemOrder a => Int -> ZDD a -> ZDD a
- mapDelete :: forall a. ItemOrder a => Int -> ZDD a -> ZDD a
- change :: forall a. ItemOrder a => Int -> ZDD a -> ZDD a
- fold :: b -> b -> (Int -> b -> b -> b) -> ZDD a -> b
- fold' :: b -> b -> (Int -> b -> b -> b) -> ZDD a -> b
- minimalHittingSets :: forall a. ItemOrder a => ZDD a -> ZDD a
- minimalHittingSetsToda :: forall a. ItemOrder a => ZDD a -> ZDD a
- minimalHittingSetsKnuth :: forall a. ItemOrder a => ZDD a -> ZDD a
- minimalHittingSetsImai :: forall a. ItemOrder a => ZDD a -> ZDD a
- uniformM :: forall a g m. (ItemOrder a, StatefulGen g m) => ZDD a -> g -> m IntSet
- findMinSum :: forall a w. (ItemOrder a, Num w, Ord w) => (Int -> w) -> ZDD a -> (w, IntSet)
- findMaxSum :: forall a w. (ItemOrder a, Num w, Ord w) => (Int -> w) -> ZDD a -> (w, IntSet)
- flatten :: ItemOrder a => ZDD a -> IntSet
- toListOfIntSets :: ZDD a -> [IntSet]
- toSetOfIntSets :: ZDD a -> Set IntSet
- type Graph = IntMap Node
- data Node
- toGraph :: ZDD a -> (Graph, Int)
- toGraph' :: Traversable t => t (ZDD a) -> (Graph, t Int)
- fromGraph :: (Graph, Int) -> ZDD a
- fromGraph' :: Graph -> IntMap (ZDD a)
ZDD type
Zero-suppressed binary decision diagram representing family of sets
Bundled Patterns
pattern Empty :: ZDD a | |
pattern Base :: ZDD a | |
pattern Branch :: Int -> ZDD a -> ZDD a -> ZDD a | Smart constructor that takes the ZDD reduction rules into account |
Item ordering
class ItemOrder a where Source #
Instances
withDefaultOrder :: forall r. (forall a. ItemOrder a => Proxy a -> r) -> r Source #
Currently the default order is AscOrder
withAscOrder :: forall r. (Proxy AscOrder -> r) -> r Source #
withDescOrder :: forall r. (Proxy DescOrder -> r) -> r Source #
withCustomOrder :: forall r. (Int -> Int -> Ordering) -> (forall a. ItemOrder a => Proxy a -> r) -> r Source #
Construction
singleton :: forall a. ItemOrder a => IntSet -> ZDD a Source #
Create a ZDD that contains only a given set.
fromListOfIntSets :: forall a. ItemOrder a => [IntSet] -> ZDD a Source #
Create a ZDD from a list of IntSet
fromSetOfIntSets :: forall a. ItemOrder a => Set IntSet -> ZDD a Source #
Create a ZDD from a set of IntSet
Insertion
Deletion
Query
member :: forall a. ItemOrder a => IntSet -> ZDD a -> Bool Source #
Is the set a member of the family?
isSubsetOf :: ItemOrder a => ZDD a -> ZDD a -> Bool Source #
(s1
indicates whether isSubsetOf
s2)s1
is a subset of s2
.
isProperSubsetOf :: ItemOrder a => ZDD a -> ZDD a -> Bool Source #
(s1
indicates whether isProperSubsetOf
s2)s1
is a proper subset of s2
.
disjoint :: ItemOrder a => ZDD a -> ZDD a -> Bool Source #
Check whether two sets are disjoint (i.e., their intersection is empty).
Combine
unions :: forall f a. (Foldable f, ItemOrder a) => f (ZDD a) -> ZDD a Source #
Unions of a list of ZDDs.
intersection :: forall a. ItemOrder a => ZDD a -> ZDD a -> ZDD a Source #
Intersection of two family of sets.
difference :: forall a. ItemOrder a => ZDD a -> ZDD a -> ZDD a Source #
Difference of two family of sets.
nonSuperset :: forall a. ItemOrder a => ZDD a -> ZDD a -> ZDD a Source #
Given a family P and Q, it computes {S∈P | ∀X∈Q. X⊈S}
Sometimes it is denoted as P ↘ Q.
Filter
subset1 :: forall a. ItemOrder a => Int -> ZDD a -> ZDD a Source #
Select subsets that contain a particular element and then remove the element from them
subset0 :: forall a. ItemOrder a => Int -> ZDD a -> ZDD a Source #
Subsets that does not contain a particular element
Map
mapInsert :: forall a. ItemOrder a => Int -> ZDD a -> ZDD a Source #
Insert an item into each element set of ZDD.
mapDelete :: forall a. ItemOrder a => Int -> ZDD a -> ZDD a Source #
Delete an item from each element set of ZDD.
change :: forall a. ItemOrder a => Int -> ZDD a -> ZDD a Source #
change x p
returns {if x∈s then s∖{x} else s∪{x} | s∈P}
Fold
Minimal hitting sets
minimalHittingSetsToda :: forall a. ItemOrder a => ZDD a -> ZDD a Source #
Minimal hitting sets.
- T. Toda, “Hypergraph Transversal Computation with Binary Decision Diagrams,” SEA 2013: Experimental Algorithms. Available: http://dx.doi.org/10.1007/978-3-642-38527-8_10.
- HTC-BDD: Hypergraph Transversal Computation with Binary Decision Diagrams https://www.disc.lab.uec.ac.jp/toda/htcbdd.html
minimalHittingSetsKnuth :: forall a. ItemOrder a => ZDD a -> ZDD a Source #
Minimal hitting sets.
D. E. Knuth, "The Art of Computer Programming, Volume 4A: Combinatorial Algorithms, Part 1," Addison-Wesley Professional, 2011.
minimalHittingSetsImai :: forall a. ItemOrder a => ZDD a -> ZDD a Source #
Minimal hitting sets.
T. Imai, "One-line hack of knuth's algorithm for minimal hitting set computation with ZDDs," vol. 2015-AL-155, no. 15, Nov. 2015, pp. 1-3. [Online]. Available: http://id.nii.ac.jp/1001/00145799/.
Random sampling
uniformM :: forall a g m. (ItemOrder a, StatefulGen g m) => ZDD a -> g -> m IntSet Source #
Sample a set from uniform distribution over elements of the ZDD.
The function constructs a table internally and the table is shared across
multiple use of the resulting action (m IntSet
).
Therefore, the code
let g = uniformM zdd gen s1 <- g s2 <- g
is more efficient than
s1 <- uniformM zdd gen s2 <- uniformM zdd gen
.
Min/Max
findMinSum :: forall a w. (ItemOrder a, Num w, Ord w) => (Int -> w) -> ZDD a -> (w, IntSet) Source #
Find a minimum element set with respect to given weight function
\[ \min_{X\in S} \sum_{x\in X} w(x) \]
findMaxSum :: forall a w. (ItemOrder a, Num w, Ord w) => (Int -> w) -> ZDD a -> (w, IntSet) Source #
Find a maximum element set with respect to given weight function
\[ \max_{X\in S} \sum_{x\in X} w(x) \]