|  | 
| | Data.Relation.SetOfPairs | | Portability | portable |  | Stability | experimental |  | Maintainer | joost.visser@di.uminho.pt | 
 | 
 | 
|  | 
|  | 
|  | 
| Description | 
| An implementation of relations as sets of pairs. | 
|  | 
| Synopsis | 
|  | 
| | type Rel a b = Set (a, b) |  |  |  | type Gph a = Rel a a |  |  |  | type Graph a = (Set a, Gph a) |  |  |  | emptyRel :: Rel a b |  |  |  | mkRel :: (Ord a, Ord b) => [(a, b)] -> Rel a b |  |  |  | mkRelNeighbors :: (Ord a, Ord b) => a -> [b] -> Rel a b |  |  |  | identityRel :: Ord a => Set a -> Rel a a |  |  |  | totalRel :: Ord a => Set a -> Rel a a |  |  |  | chainRel :: (Enum n, Num n, Ord n) => n -> Rel n n |  |  |  | dom :: Ord a => Rel a b -> Set a |  |  |  | rng :: Ord b => Rel a b -> Set b |  |  |  | ent :: Ord a => Rel a a -> Set a |  |  |  | pairs :: (Ord a, Ord b) => Rel a b -> [(a, b)] |  |  |  | inv :: (Ord a, Ord b) => Rel a b -> Rel b a |  |  |  | comp :: (Ord a, Eq b, Ord c) => Rel b c -> Rel a b -> Rel a c |  |  |  | reflClose :: Ord a => Rel a a -> Rel a a |  |  |  | symmClose :: Ord a => Rel a a -> Rel a a |  |  |  | transClose :: Ord a => Rel a a -> Rel a a |  |  |  | reflTransClose :: Ord a => Rel a a -> Rel a a |  |  |  | equiv :: Ord b => Rel b b -> Rel b b |  |  |  | reflReduc :: Ord a => Gph a -> Gph a |  |  |  | topNodes :: Ord a => Gph a -> Set a |  |  |  | bottomNodes :: Ord a => Gph a -> Set a |  |  |  | internalNodes :: Ord a => Gph a -> Set a |  |  |  | domWith :: (Ord a, Ord b) => Set b -> Rel a b -> Set a |  |  |  | rngWith :: (Ord a, Ord b) => Set a -> Rel a b -> Set b |  |  |  | entWith :: Ord a => Set a -> Rel a a -> Set a |  |  |  | removeSelfEdges :: Ord a => Gph a -> Gph a |  |  |  | projectWith :: (Ord a, Ord b) => (a -> b -> Bool) -> Rel a b -> Rel a b |  |  |  | project :: (Ord a, Ord b) => Set a -> Rel a b -> Rel a b |  |  |  | projectBackward :: (Ord a, Ord b) => Set b -> Rel a b -> Rel a b |  |  |  | slice :: Ord a => Set a -> Rel a a -> Rel a a |  |  |  | sliceUntil :: Ord a => Set a -> Set a -> Rel a a -> Rel a a |  |  |  | sliceBackward :: Ord a => Set a -> Rel a a -> Rel a a |  |  |  | chop :: Ord a => Set a -> Set a -> Rel a a -> Rel a a |  |  |  | slicesUnion :: Ord a => Set a -> Set a -> Rel a a -> Rel a a |  |  |  | slicesIntersect :: Ord a => Set a -> Set a -> Rel a a -> Rel a a |  |  |  | slicesWith :: Ord a => (Rel a a -> Rel a a -> Rel a a) -> Set a -> Set a -> Rel a a -> Rel a a |  |  |  | sliceOrChopWith :: Ord a => (Rel a a -> Rel a a -> Rel a a) -> [a] -> [a] -> Rel a a -> Rel a a |  |  |  | gobbleUntil :: Ord a => Set a -> Set a -> Rel a a -> Rel a a |  |  |  | weakComponents :: Ord a => Gph a -> [Gph a] |  |  |  | strongComponent :: Ord a => a -> Gph a -> Set a |  |  |  | strongComponentSet :: (Ord a, Ord (Set a)) => Gph a -> Set (Set a) |  |  |  | type Component a = Graph a |  |  |  | strongComponent' :: Ord a => a -> Rel a a -> Component a |  |  |  | strongComponentRel :: (Ord a, Ord (Set a)) => Gph a -> Gph (Set a) |  |  |  | strongComponentGraph :: (Ord a, Ord (Set a)) => Gph a -> Graph (Set a) |  |  |  | strongComponentRel' :: (Ord a, Ord (Set a)) => Gph a -> Gph (Component a) |  |  |  | strongNonSingletonComponentSet :: (Ord a, Ord (Set a)) => Gph a -> Set (Set a) |  |  |  | integrate :: Ord a => Rel a a -> Rel a a -> Rel a a -> (Rel a a, Bool) |  |  |  | affectedPoints :: Ord a => Rel a a -> Rel a a -> Set a |  |  |  | preservedPoints :: Ord a => Rel a a -> Rel a a -> Rel a a -> Set a |  |  |  | treeImpurity :: Ord a => Gph a -> Float |  |  |  | data StrongComponentMetrics  = StrongComponentMetrics {} |  |  |  | calculateStrongComponentMetrics :: Ord a => Gph a -> StrongComponentMetrics |  |  |  | countOfLevels :: Ord a => Gph a -> Int |  |  |  | normalizedCountOfLevels :: Ord a => Gph a -> Float |  |  |  | numberOfNonSingletonLevels :: Ord a => Gph a -> Int |  |  |  | sizeOfLargestLevel :: Ord a => Gph a -> Int |  |  |  | height :: Ord a => Gph a -> Int |  |  |  | heightDag :: Ord a => Gph a -> Int |  |  |  | heightFrom :: Ord a => Gph a -> Set a -> Set a -> Int |  |  |  | fanInOut :: Ord a => Gph a -> (Bag a, Bag a) |  |  |  | asPercentageOf :: Int -> Int -> Float | 
 | 
|  | 
|  | 
| Representation | 
|  | 
| type Rel a b = Set (a, b) | 
| Type of relations | 
|  | 
| type Gph a = Rel a a | 
| Type of graphs: relations with domain and range of the same type. | 
|  | 
| type Graph a = (Set a, Gph a) | 
| Type of graphs, with explicit entity set. | 
|  | 
| Building relations | 
|  | 
| emptyRel :: Rel a b | 
| Build an empty relation. | 
|  | 
| mkRel :: (Ord a, Ord b) => [(a, b)] -> Rel a b | 
| Build a relation from a list of pairs. | 
|  | 
| mkRelNeighbors :: (Ord a, Ord b) => a -> [b] -> Rel a b | 
| Build a relation from distributing an element to a set of elements | 
|  | 
| identityRel :: Ord a => Set a -> Rel a a | 
| Build identity relation, which contains an edge from each node to itself. | 
|  | 
| totalRel :: Ord a => Set a -> Rel a a | 
| Build total relation, which contains an edge from each node to 
each other node and to itself. | 
|  | 
| chainRel :: (Enum n, Num n, Ord n) => n -> Rel n n | 
| Build a chain relation of given number of numerals. | 
|  | 
| Basic operations | 
|  | 
| dom :: Ord a => Rel a b -> Set a | 
| Obtain the domain of a relation | 
|  | 
| rng :: Ord b => Rel a b -> Set b | 
| Obtain the range of a relation | 
|  | 
| ent :: Ord a => Rel a a -> Set a | 
| Obtain all entities in a relation (union of domain and range) | 
|  | 
| pairs :: (Ord a, Ord b) => Rel a b -> [(a, b)] | 
| Convert relation to a list of pairs. | 
|  | 
| inv :: (Ord a, Ord b) => Rel a b -> Rel b a | 
| Take the inverse of a relation | 
|  | 
| comp :: (Ord a, Eq b, Ord c) => Rel b c -> Rel a b -> Rel a c | 
| Compose two relations | 
|  | 
| Closures | 
|  | 
| reflClose :: Ord a => Rel a a -> Rel a a | 
| Compute the reflective closure | 
|  | 
| symmClose :: Ord a => Rel a a -> Rel a a | 
| Compute the symmetric closure | 
|  | 
| transClose :: Ord a => Rel a a -> Rel a a | 
| Compute the transitive closure | 
|  | 
| reflTransClose :: Ord a => Rel a a -> Rel a a | 
| Compute the reflexive, transitive closure | 
|  | 
| equiv :: Ord b => Rel b b -> Rel b b | 
| Compute the reflexive, transitive, symmetric closure, i.e. the
induced equivalence relation. | 
|  | 
| Reductions | 
|  | 
| reflReduc :: Ord a => Gph a -> Gph a | 
| Reflexive reduction, i.e remove self-edges. | 
|  | 
| Basic graph queries | 
|  | 
| topNodes :: Ord a => Gph a -> Set a | 
| Find top nodes of a graph. Those nodes that have outgoing but no
incoming edges. | 
|  | 
| bottomNodes :: Ord a => Gph a -> Set a | 
| Find bottom nodes of a graph. Those nodes that have incoming but no
outgoing edges. | 
|  | 
| internalNodes :: Ord a => Gph a -> Set a | 
| Find internal nodes of a graph. Those nodes that have both 
incoming and outgoing edges. | 
|  | 
| Selections (project, slice, chop) | 
|  | 
| domWith :: (Ord a, Ord b) => Set b -> Rel a b -> Set a | 
| Obtain the subdomain of a relation given a subrange. | 
|  | 
| rngWith :: (Ord a, Ord b) => Set a -> Rel a b -> Set b | 
| Obtain the subrange of a relation given a subdomain. | 
|  | 
| entWith :: Ord a => Set a -> Rel a a -> Set a | 
| Obtain the subrange and subdomain of a relation given a subdomain. | 
|  | 
| removeSelfEdges :: Ord a => Gph a -> Gph a | 
| Remove all edges of the form (x,x). | 
|  | 
| projectWith :: (Ord a, Ord b) => (a -> b -> Bool) -> Rel a b -> Rel a b | 
| Retrieve a subrelation given predicates on domain and range. | 
|  | 
| project :: (Ord a, Ord b) => Set a -> Rel a b -> Rel a b | 
| Projection of set through relation | 
|  | 
| projectBackward :: (Ord a, Ord b) => Set b -> Rel a b -> Rel a b | 
| Projection of set backward through relation | 
|  | 
| slice :: Ord a => Set a -> Rel a a -> Rel a a | 
| Compute forward slice starting from seeds. | 
|  | 
| sliceUntil :: Ord a => Set a -> Set a -> Rel a a -> Rel a a | 
| Compute forward slice starting from seeds, stopping at stoppers. | 
|  | 
| sliceBackward :: Ord a => Set a -> Rel a a -> Rel a a | 
| Compute backward slice starting from seeds. | 
|  | 
| chop :: Ord a => Set a -> Set a -> Rel a a -> Rel a a | 
| Compute chop between seeds and sinks. | 
|  | 
| slicesUnion :: Ord a => Set a -> Set a -> Rel a a -> Rel a a | 
| Compute union of backward and forward slice. | 
|  | 
| slicesIntersect :: Ord a => Set a -> Set a -> Rel a a -> Rel a a | 
| Compute intersection of backward and forward slice.
This is the same as the computing the chop between seeds and sinks. | 
|  | 
| slicesWith :: Ord a => (Rel a a -> Rel a a -> Rel a a) -> Set a -> Set a -> Rel a a -> Rel a a | 
| Compute combination of backward and forward slice, where
a binary operator is supplied to specify the kind of combination. | 
|  | 
| sliceOrChopWith | 
| | :: Ord a |  |  | => (Rel a a -> Rel a a -> Rel a a) | binary graph operation |  | -> [a] | sources |  | -> [a] | sinks |  | -> Rel a a | input relation |  | -> Rel a a | output relation |  | Compute slice or chop, depending on whether the source or sink set or both 
are empty. | 
 | 
|  | 
| Partitions | 
|  | 
| gobbleUntil :: Ord a => Set a -> Set a -> Rel a a -> Rel a a | 
| Compute subrelation connected to seeds, stopping at stoppers. | 
|  | 
| weakComponents :: Ord a => Gph a -> [Gph a] | 
| Compute weakly connected components. | 
|  | 
| strongComponent :: Ord a => a -> Gph a -> Set a | 
| Compute a single strong component (set of nodes). | 
|  | 
| strongComponentSet :: (Ord a, Ord (Set a)) => Gph a -> Set (Set a) | 
| Compute the set of strong components (sets of nodes). | 
|  | 
| type Component a = Graph a | 
| Type of components: node set tupled with subgraph. | 
|  | 
| strongComponent' :: Ord a => a -> Rel a a -> Component a | 
| Compute a single strong component (node set tupled with subrelation). | 
|  | 
| strongComponentRel :: (Ord a, Ord (Set a)) => Gph a -> Gph (Set a) | 
| Compute the graph of strong components (node sets).
Note: strong components that have no relations to other components
will not be present in the graph! | 
|  | 
| strongComponentGraph :: (Ord a, Ord (Set a)) => Gph a -> Graph (Set a) | 
| Compute the graph of strong components (node sets). | 
|  | 
| strongComponentRel' :: (Ord a, Ord (Set a)) => Gph a -> Gph (Component a) | 
| Compute the graph of stong components (node sets tupled with subrelations). | 
|  | 
| strongNonSingletonComponentSet :: (Ord a, Ord (Set a)) => Gph a -> Set (Set a) | 
| Compute the set of strong components that have more than a single node | 
|  | 
| Integration | 
|  | 
| integrate :: Ord a => Rel a a -> Rel a a -> Rel a a -> (Rel a a, Bool) | 
| Integrate two graphs with respect to a base graph into a
new graph that contains the differences of each input graph with
respect to the base graph. The boolean value indicates whether the
graphs are interference-free, i.e. whether the integration is valid. | 
|  | 
| affectedPoints :: Ord a => Rel a a -> Rel a a -> Set a | 
| Points in the first graph that are affected by changes with respect
to the base graph. | 
|  | 
| preservedPoints :: Ord a => Rel a a -> Rel a a -> Rel a a -> Set a | 
| Points in the base graph that are not affected by changes in either
input graph. | 
|  | 
| Structure metrics | 
|  | 
| treeImpurity :: Ord a => Gph a -> Float | 
| Tree impurity (TIMP): 
how much does the graph resemble a tree, expressed as
a percentage. A tree has tree impurity of 0 percent. A fully connected
graph has tree impurity of 100 percent. Fenton and Pfleeger only
defined tree impurity for non-directed graphs without self-edges. This
implementation therefore does not count self-edges, and counts 2 directed
edges between the same nodes only once. | 
|  | 
| data StrongComponentMetrics | 
| | A record type to hold metrics about strong components. |  | Constructors |  | | StrongComponentMetrics |  |  | | componentCount :: Int | Count of strong components |  | componentCountNormalized :: Float | Normalized count of strong components |  | nonSingletonComponentCount :: Int | Count of non-singleton components |  | componentSizeMax :: Int | Size of largest component |  | heightOfComponentGraph :: Int | Height of component DAG | 
 | 
 | 
 | 
|  | 
| calculateStrongComponentMetrics :: Ord a => Gph a -> StrongComponentMetrics | 
| Calculate the strong component metrics for a given graph. | 
|  | 
| countOfLevels :: Ord a => Gph a -> Int | 
| Count of levels (LEV): | 
|  | 
| normalizedCountOfLevels :: Ord a => Gph a -> Float | 
| Normalized count of levels (CLEV): | 
|  | 
| numberOfNonSingletonLevels :: Ord a => Gph a -> Int | 
| Number of non-singleton levels (NSLEV) | 
|  | 
| sizeOfLargestLevel :: Ord a => Gph a -> Int | 
| Size of largest level (DEP): | 
|  | 
| height :: Ord a => Gph a -> Int | 
| Height (works also in the presence of cycles) | 
|  | 
| heightDag :: Ord a => Gph a -> Int | 
| Height (does not work in the presence of cycles) | 
|  | 
| heightFrom | 
| | :: Ord a |  |  | => Gph a | Graph |  | -> Set a | Already visited nodes |  | -> Set a | Nodes still to visit |  | -> Int | Result |  | Compute graph height starting from a given set of nodes. | 
 | 
|  | 
| fanInOut :: Ord a => Gph a -> (Bag a, Bag a) | 
| Compute fan-in and fan-out of a given graph. Both are represented
with a bags of nodes. The arity of each node in the bag is its
fanout or fanin, repectively. | 
|  | 
| asPercentageOf :: Int -> Int -> Float | 
| Helper for math. | 
|  | 
| Produced by Haddock version 0.6 |