|
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 |