-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Graph library using unordered-containers -- -- Simple graph library allowing any Hashable instance to be a node type. @package unordered-graphs @version 0.1.0 module Data.Graph.Unordered.Internal data Graph et n nl el Gr :: !(NodeMap n nl) -> !(EdgeMap et n el) -> !Edge -> Graph et n nl el [nodeMap] :: Graph et n nl el -> !(NodeMap n nl) [edgeMap] :: Graph et n nl el -> !(EdgeMap et n el) [nextEdge] :: Graph et n nl el -> !Edge type NodeMap n nl = HashMap n (Adj, nl) type EdgeMap et n el = HashMap Edge (et n, el) newtype Edge Edge :: Word -> Edge [unEdge] :: Edge -> Word type Set n = HashMap n () mkSet :: (Eq n, Hashable n) => [n] -> Set n type Adj = HashMap Edge Int adjCount :: (Eq n) => n -> n -> Int type ValidGraph et n = (Hashable n, Eq n, EdgeType et) -- | Assumes all nodes are in the node list. mkGraph :: (ValidGraph et n) => [(n, nl)] -> [(n, n, el)] -> Graph et n nl el class (Functor et, NodeFrom (AdjType et)) => EdgeType et where type family AdjType et :: * -> * mkEdge :: EdgeType et => n -> n -> et n -- | Assumes n is one of the end points of this edge. otherN :: (EdgeType et, Eq n) => n -> et n -> AdjType et n toEdge :: EdgeType et => n -> AdjType et n -> et n -- | Returns a list of length 2. edgeNodes :: EdgeType et => et n -> [n] edgeTriple :: EdgeType et => (et n, el) -> (n, n, el) class NodeFrom at getNode :: NodeFrom at => at n -> n nodeDetails :: Graph et n nl el -> [(n, ([Edge], nl))] lnodes :: Graph et n nl el -> [(n, nl)] edges :: Graph et n nl el -> [Edge] edgeDetails :: Graph et n nl el -> [(Edge, (et n, el))] ledges :: Graph et n nl el -> [(Edge, el)] edgePairs :: (EdgeType et) => Graph et n nl el -> [(n, n)] ledgePairs :: (EdgeType et) => Graph et n nl el -> [(n, n, el)] degNM :: (Eq n, Hashable n) => NodeMap n nl -> n -> Int withNodeMap :: (NodeMap n nl -> NodeMap n nl') -> Graph et n nl el -> Graph et n nl' el withEdgeMap :: (EdgeMap et n el -> EdgeMap et n el') -> Graph et n nl el -> Graph et n nl el' instance Control.DeepSeq.NFData Data.Graph.Unordered.Internal.Edge instance GHC.Enum.Bounded Data.Graph.Unordered.Internal.Edge instance GHC.Enum.Enum Data.Graph.Unordered.Internal.Edge instance Data.Hashable.Class.Hashable Data.Graph.Unordered.Internal.Edge instance GHC.Read.Read Data.Graph.Unordered.Internal.Edge instance GHC.Show.Show Data.Graph.Unordered.Internal.Edge instance GHC.Classes.Ord Data.Graph.Unordered.Internal.Edge instance GHC.Classes.Eq Data.Graph.Unordered.Internal.Edge instance (GHC.Classes.Eq (et n), GHC.Classes.Eq n, GHC.Classes.Eq nl, GHC.Classes.Eq el) => GHC.Classes.Eq (Data.Graph.Unordered.Internal.Graph et n nl el) instance (Data.Graph.Unordered.Internal.EdgeType et, GHC.Show.Show n, GHC.Show.Show nl, GHC.Show.Show el) => GHC.Show.Show (Data.Graph.Unordered.Internal.Graph et n nl el) instance (Data.Graph.Unordered.Internal.ValidGraph et n, GHC.Read.Read n, GHC.Read.Read nl, GHC.Read.Read el) => GHC.Read.Read (Data.Graph.Unordered.Internal.Graph et n nl el) instance (Control.DeepSeq.NFData n, Control.DeepSeq.NFData (et n), Control.DeepSeq.NFData nl, Control.DeepSeq.NFData el) => Control.DeepSeq.NFData (Data.Graph.Unordered.Internal.Graph et n nl el) instance Data.Graph.Unordered.Internal.NodeFrom Data.Functor.Identity.Identity module Data.Graph.Unordered.Algorithms.Subgraphs subgraph :: (ValidGraph et n) => Graph et n nl el -> [n] -> Graph et n nl el isSubGraphOf :: (ValidGraph et n, Eq (et n), Eq nl, Eq el) => Graph et n nl el -> Graph et n nl el -> Bool -- | Known limitations: -- -- module Data.Graph.Unordered data Graph et n nl el type DirGraph = Graph DirEdge type UndirGraph = Graph UndirEdge type ValidGraph et n = (Hashable n, Eq n, EdgeType et) newtype Edge Edge :: Word -> Edge [unEdge] :: Edge -> Word data DirEdge n DE :: !n -> !n -> DirEdge n [fromNode] :: DirEdge n -> !n [toNode] :: DirEdge n -> !n newtype UndirEdge n UE :: [n] -> UndirEdge n [ueElem] :: UndirEdge n -> [n] class (Functor et, NodeFrom (AdjType et)) => EdgeType et where type family AdjType et :: * -> * mkEdge :: EdgeType et => n -> n -> et n -- | Assumes n is one of the end points of this edge. otherN :: (EdgeType et, Eq n) => n -> et n -> AdjType et n toEdge :: EdgeType et => n -> AdjType et n -> et n -- | Returns a list of length 2. edgeNodes :: EdgeType et => et n -> [n] edgeTriple :: EdgeType et => (et n, el) -> (n, n, el) class NodeFrom at getNode :: NodeFrom at => at n -> n data DirAdj n ToNode :: n -> DirAdj n FromNode :: n -> DirAdj n -- | Identity functor and monad. (a non-strict monad) newtype Identity a :: * -> * Identity :: a -> Identity a [runIdentity] :: Identity a -> a data Context at n nl el Ctxt :: !n -> !nl -> !(AdjLookup (at n) el) -> Context at n nl el [cNode] :: Context at n nl el -> !n [cLabel] :: Context at n nl el -> !nl [cAdj] :: Context at n nl el -> !(AdjLookup (at n) el) type AdjLookup n el = HashMap Edge (n, el) class Contextual ctxt where type family CNode ctxt :: * type family CAType ctxt :: * -> * type family CNLabel ctxt :: * type family CELabel ctxt :: * type ValidContext et n nl el ctxt = (Contextual ctxt, n ~ CNode ctxt, AdjType et ~ CAType ctxt, nl ~ CNLabel ctxt, el ~ CELabel ctxt) class (Contextual ctxt) => FromContext ctxt fromContext :: FromContext ctxt => Context (CAType ctxt) (CNode ctxt) (CNLabel ctxt) (CELabel ctxt) -> ctxt class (Contextual ctxt) => ToContext ctxt toContext :: ToContext ctxt => ctxt -> Context (CAType ctxt) (CNode ctxt) (CNLabel ctxt) (CELabel ctxt) isEmpty :: Graph et n nl el -> Bool -- | Number of nodes order :: Graph et n nl el -> Int hasNode :: (ValidGraph et n) => Graph et n nl el -> n -> Bool ninfo :: (ValidGraph et n) => Graph et n nl el -> n -> Maybe ([Edge], nl) nodes :: Graph et n nl el -> [n] nodeDetails :: Graph et n nl el -> [(n, ([Edge], nl))] lnodes :: Graph et n nl el -> [(n, nl)] nlab :: (ValidGraph et n) => Graph et n nl el -> n -> Maybe nl neighbours :: (ValidGraph et n) => Graph et n nl el -> n -> [n] -- | Number of edges size :: Graph et n nl el -> Int hasEdge :: (ValidGraph et n) => Graph et n nl el -> Edge -> Bool einfo :: (ValidGraph et n) => Graph et n nl el -> Edge -> Maybe (et n, el) edges :: Graph et n nl el -> [Edge] edgeDetails :: Graph et n nl el -> [(Edge, (et n, el))] ledges :: Graph et n nl el -> [(Edge, el)] elab :: (ValidGraph et n) => Graph et n nl el -> Edge -> Maybe el edgePairs :: (EdgeType et) => Graph et n nl el -> [(n, n)] ledgePairs :: (EdgeType et) => Graph et n nl el -> [(n, n, el)] empty :: Graph et n nl el -- | Assumes all nodes are in the node list. mkGraph :: (ValidGraph et n) => [(n, nl)] -> [(n, n, el)] -> Graph et n nl el -- | Assumes the Contexts describe a graph in total, with the outermost one -- first (i.e. buildGr (c:cs) == c merge buildGr cs). buildGr :: (ValidGraph et n) => [Context (AdjType et) n nl el] -> Graph et n nl el insNode :: (ValidGraph et n) => n -> nl -> Graph et n nl el -> Graph et n nl el insEdge :: (ValidGraph et n) => (n, n, el) -> Graph et n nl el -> (Edge, Graph et n nl el) type Mergeable et n nl el ctxt = (ValidGraph et n, ToContext ctxt, ValidContext et n nl el ctxt) merge :: (ValidGraph et n) => Context (AdjType et) n nl el -> Graph et n nl el -> Graph et n nl el mergeAs :: (Mergeable et n nl el ctxt) => ctxt -> Graph et n nl el -> Graph et n nl el delNode :: (ValidGraph et n) => n -> Graph et n nl el -> Graph et n nl el delEdge :: (ValidGraph et n) => Edge -> Graph et n nl el -> Graph et n nl el delEdgeLabel :: (ValidGraph et n, Eq el) => (n, n, el) -> Graph et n nl el -> Graph et n nl el delEdgesBetween :: (ValidGraph et n) => n -> n -> Graph et n nl el -> Graph et n nl el type Matchable et n nl el ctxt = (ValidGraph et n, FromContext ctxt, ValidContext et n nl el ctxt) -- | Note that for any loops, the resultant edge will only appear once in -- the output cAdj field. match :: (ValidGraph et n) => n -> Graph et n nl el -> Maybe (Context (AdjType et) n nl el, Graph et n nl el) matchAs :: (Matchable et n nl el ctxt) => n -> Graph et n nl el -> Maybe (ctxt, Graph et n nl el) matchAny :: (ValidGraph et n) => Graph et n nl el -> Maybe (Context (AdjType et) n nl el, Graph et n nl el) matchAnyAs :: (Matchable et n nl el ctxt) => Graph et n nl el -> Maybe (ctxt, Graph et n nl el) nmap :: (ValidGraph et n) => (nl -> nl') -> Graph et n nl el -> Graph et n nl' el nmapFor :: (ValidGraph et n) => (nl -> nl) -> Graph et n nl el -> n -> Graph et n nl el emap :: (ValidGraph et n) => (el -> el') -> Graph et n nl el -> Graph et n nl el' emapFor :: (ValidGraph et n) => (el -> el) -> Graph et n nl el -> Edge -> Graph et n nl el instance GHC.Generics.Selector Data.Graph.Unordered.S1_0_2Context instance GHC.Generics.Selector Data.Graph.Unordered.S1_0_1Context instance GHC.Generics.Selector Data.Graph.Unordered.S1_0_0Context instance GHC.Generics.Constructor Data.Graph.Unordered.C1_0Context instance GHC.Generics.Datatype Data.Graph.Unordered.D1Context instance GHC.Generics.Constructor Data.Graph.Unordered.C1_1DirAdj instance GHC.Generics.Constructor Data.Graph.Unordered.C1_0DirAdj instance GHC.Generics.Datatype Data.Graph.Unordered.D1DirAdj instance GHC.Generics.Selector Data.Graph.Unordered.S1_0_0UndirEdge instance GHC.Generics.Constructor Data.Graph.Unordered.C1_0UndirEdge instance GHC.Generics.Datatype Data.Graph.Unordered.D1UndirEdge instance GHC.Generics.Selector Data.Graph.Unordered.S1_0_1DirEdge instance GHC.Generics.Selector Data.Graph.Unordered.S1_0_0DirEdge instance GHC.Generics.Constructor Data.Graph.Unordered.C1_0DirEdge instance GHC.Generics.Datatype Data.Graph.Unordered.D1DirEdge instance (Control.DeepSeq.NFData n, Control.DeepSeq.NFData nl, Control.DeepSeq.NFData el, Control.DeepSeq.NFData (at n)) => Control.DeepSeq.NFData (Data.Graph.Unordered.Context at n nl el) instance GHC.Generics.Generic (Data.Graph.Unordered.Context at n nl el) instance (GHC.Read.Read n, GHC.Read.Read nl, GHC.Read.Read el, GHC.Read.Read (at n)) => GHC.Read.Read (Data.Graph.Unordered.Context at n nl el) instance (GHC.Show.Show n, GHC.Show.Show nl, GHC.Show.Show el, GHC.Show.Show (at n)) => GHC.Show.Show (Data.Graph.Unordered.Context at n nl el) instance (GHC.Classes.Eq n, GHC.Classes.Eq nl, GHC.Classes.Eq el, GHC.Classes.Eq (at n)) => GHC.Classes.Eq (Data.Graph.Unordered.Context at n nl el) instance Control.DeepSeq.NFData n => Control.DeepSeq.NFData (Data.Graph.Unordered.DirAdj n) instance GHC.Generics.Generic (Data.Graph.Unordered.DirAdj n) instance GHC.Read.Read n => GHC.Read.Read (Data.Graph.Unordered.DirAdj n) instance GHC.Show.Show n => GHC.Show.Show (Data.Graph.Unordered.DirAdj n) instance GHC.Classes.Ord n => GHC.Classes.Ord (Data.Graph.Unordered.DirAdj n) instance GHC.Classes.Eq n => GHC.Classes.Eq (Data.Graph.Unordered.DirAdj n) instance Control.DeepSeq.NFData n => Control.DeepSeq.NFData (Data.Graph.Unordered.UndirEdge n) instance GHC.Generics.Generic (Data.Graph.Unordered.UndirEdge n) instance GHC.Base.Functor Data.Graph.Unordered.UndirEdge instance GHC.Read.Read n => GHC.Read.Read (Data.Graph.Unordered.UndirEdge n) instance GHC.Show.Show n => GHC.Show.Show (Data.Graph.Unordered.UndirEdge n) instance GHC.Classes.Ord n => GHC.Classes.Ord (Data.Graph.Unordered.UndirEdge n) instance GHC.Classes.Eq n => GHC.Classes.Eq (Data.Graph.Unordered.UndirEdge n) instance Control.DeepSeq.NFData n => Control.DeepSeq.NFData (Data.Graph.Unordered.DirEdge n) instance GHC.Generics.Generic (Data.Graph.Unordered.DirEdge n) instance GHC.Base.Functor Data.Graph.Unordered.DirEdge instance GHC.Read.Read n => GHC.Read.Read (Data.Graph.Unordered.DirEdge n) instance GHC.Show.Show n => GHC.Show.Show (Data.Graph.Unordered.DirEdge n) instance GHC.Classes.Ord n => GHC.Classes.Ord (Data.Graph.Unordered.DirEdge n) instance GHC.Classes.Eq n => GHC.Classes.Eq (Data.Graph.Unordered.DirEdge n) instance Data.Graph.Unordered.Internal.NodeFrom Data.Graph.Unordered.DirAdj instance Data.Graph.Unordered.Internal.EdgeType Data.Graph.Unordered.DirEdge instance Data.Graph.Unordered.Internal.EdgeType Data.Graph.Unordered.UndirEdge instance Data.Graph.Unordered.Contextual (Data.Graph.Unordered.Context at n nl el) instance Data.Graph.Unordered.FromContext (Data.Graph.Unordered.Context at n nl el) instance Data.Graph.Unordered.ToContext (Data.Graph.Unordered.Context at n nl el) instance Data.Graph.Unordered.Contextual (n, nl, Data.Graph.Unordered.AdjLookup (at n) el) instance Data.Graph.Unordered.FromContext (n, nl, Data.Graph.Unordered.AdjLookup (at n) el) instance Data.Graph.Unordered.ToContext (n, nl, Data.Graph.Unordered.AdjLookup (at n) el) instance Data.Graph.Unordered.Contextual (n, nl, [(n, [el])]) instance GHC.Classes.Ord n => Data.Graph.Unordered.FromContext (n, nl, [(n, [el])]) module Data.Graph.Unordered.Algorithms.Clustering -- | Find communities in weighted graphs using the algorithm by Blondel, -- Guillaume, Lambiotte and Lefebvre in their paper Fast unfolding of -- communities in large networks. bgll :: (ValidGraph et n, EdgeMergeable et, Fractional el, Ord el) => Graph et n nl el -> [[n]] class (EdgeType et) => EdgeMergeable et instance (GHC.Classes.Eq n, GHC.Read.Read n, GHC.Read.Read el, Data.Hashable.Class.Hashable n, Data.Graph.Unordered.Internal.EdgeType et) => GHC.Read.Read (Data.Graph.Unordered.Algorithms.Clustering.CGraph et n el) instance (GHC.Show.Show n, GHC.Show.Show el, Data.Graph.Unordered.Internal.EdgeType et) => GHC.Show.Show (Data.Graph.Unordered.Algorithms.Clustering.CGraph et n el) instance Data.Hashable.Class.Hashable Data.Graph.Unordered.Algorithms.Clustering.Community instance GHC.Enum.Bounded Data.Graph.Unordered.Algorithms.Clustering.Community instance GHC.Enum.Enum Data.Graph.Unordered.Algorithms.Clustering.Community instance GHC.Read.Read Data.Graph.Unordered.Algorithms.Clustering.Community instance GHC.Show.Show Data.Graph.Unordered.Algorithms.Clustering.Community instance GHC.Classes.Ord Data.Graph.Unordered.Algorithms.Clustering.Community instance GHC.Classes.Eq Data.Graph.Unordered.Algorithms.Clustering.Community instance (GHC.Classes.Eq n, GHC.Classes.Eq el, GHC.Classes.Eq (et [n])) => GHC.Classes.Eq (Data.Graph.Unordered.Algorithms.Clustering.CGraph et n el) instance Data.Graph.Unordered.Algorithms.Clustering.EdgeMergeable Data.Graph.Unordered.DirEdge instance Data.Graph.Unordered.Algorithms.Clustering.EdgeMergeable Data.Graph.Unordered.UndirEdge instance GHC.Base.Functor (Data.Graph.Unordered.Algorithms.Clustering.StateL s) instance GHC.Base.Applicative (Data.Graph.Unordered.Algorithms.Clustering.StateL s) module Data.Graph.Unordered.Algorithms.Components -- | Calculate connected components of a graph; edge directionality doesn't -- matter. components :: (ValidGraph et n) => Graph et n nl el -> [Graph et n nl el] getComponent :: (ValidGraph et n) => Graph et n nl el -> Maybe (Graph et n nl el, Graph et n nl el) getComponentFrom :: (ValidGraph et n) => Context (AdjType et) n nl el -> Graph et n nl el -> (Graph et n nl el, Graph et n nl el)