The AdjacencyMap data type represents a graph by a map of vertices to their adjacency sets. We define a Num instance as a convenient notation for working with graphs:
0 == vertex 0
1 + 2 == overlay (vertex 1) (vertex 2)
1 * 2 == connect (vertex 1) (vertex 2)
1 + 2 * 3 == overlay (vertex 1) (connect (vertex 2) (vertex 3))
1 * (2 + 3) == connect (vertex 1) (overlay (vertex 2) (vertex 3))
Note: the signum method of the type class Num cannot be implemented and
will throw an error. Furthermore, the Num instance does not satisfy several
"customary laws" of Num, which dictate that fromInteger 0 and
fromInteger 1 should act as additive and multiplicative identities, and
negate as additive inverse. Nevertheless, overloading fromInteger, + and
* is very convenient when working with algebraic graphs; we hope that in
future Haskell's Prelude will provide a more fine-grained class hierarchy for
algebraic structures, which we would be able to utilise without violating any
laws.
The Show instance is defined using basic graph construction primitives:
show (1 :: AdjacencyMap Int) == "vertex 1"
show (1 + 2 :: AdjacencyMap Int) == "vertices1 [1,2]"
show (1 * 2 :: AdjacencyMap Int) == "edge 1 2"
show (1 * 2 * 3 :: AdjacencyMap Int) == "edges1 [(1,2),(1,3),(2,3)]"
show (1 * 2 + 3 :: AdjacencyMap Int) == "overlay (vertex 3) (edge 1 2)"The Eq instance satisfies the following laws of algebraic graphs:
overlay is commutative, associative and idempotent:
x + y == y + x x + (y + z) == (x + y) + z x + x == xconnect is associative:
x * (y * z) == (x * y) * zconnect distributes over overlay:
x * (y + z) == x * y + x * z (x + y) * z == x * z + y * zconnect can be decomposed:
x * y * z == x * y + x * z + y * zconnect satisfies absorption and saturation:
x * y + x + y == x * y x * x * x == x * x
When specifying the time and memory complexity of graph algorithms, n and m will denote the number of vertices and edges in the graph, respectively.
The total order on graphs is defined using size-lexicographic comparison:
Compare the number of vertices. In case of a tie, continue.
Compare the sets of vertices. In case of a tie, continue.
Compare the number of edges. In case of a tie, continue.
Compare the sets of edges.
Here are a few examples:
vertex 1 < vertex 2
vertex 3 < edge 1 2
vertex 1 < edge 1 1
edge 1 1 < edge 1 2
edge 1 2 < edge 1 1 + edge 2 2
edge 1 2 < edge 1 3Note that the resulting order refines the isSubgraphOf relation and is compatible with overlay and connect operations:
isSubgraphOf x y ==> x <= yx <= x + y
x + y <= x * yInstances11Eq, Num, Ord, Show, IsString, Generic, …
Eq a => Eq (AdjacencyMap a)Defined in algebraic-graphs-0.8 · Algebra.Graph.NonEmpty.AdjacencyMap(Ord a, Num a) => Num (AdjacencyMap a)Defined in algebraic-graphs-0.8 · Algebra.Graph.NonEmpty.AdjacencyMapNote: this does not satisfy the usual ring laws; see AdjacencyMap for more details.
Ord a => Ord (AdjacencyMap a)Defined in algebraic-graphs-0.8 · Algebra.Graph.NonEmpty.AdjacencyMap(Ord a, Show a) => Show (AdjacencyMap a)Defined in algebraic-graphs-0.8 · Algebra.Graph.NonEmpty.AdjacencyMapIsString a => IsString (AdjacencyMap a)Defined in algebraic-graphs-0.8 · Algebra.Graph.NonEmpty.AdjacencyMapGeneric (AdjacencyMap a)Defined in algebraic-graphs-0.8 · Algebra.Graph.NonEmpty.AdjacencyMapOrd a => Semigroup (AdjacencyMap a)Defined in algebraic-graphs-0.8 · Algebra.Graph.NonEmpty.AdjacencyMapDefined via overlay.
NFData a => NFData (AdjacencyMap a)Defined in algebraic-graphs-0.8 · Algebra.Graph.NonEmpty.AdjacencyMapOrd a => ToGraph (AdjacencyMap a)Defined in algebraic-graphs-0.8 · Algebra.Graph.ToGraphtype Rep (AdjacencyMap a) = D1 ('MetaDataDefined in algebraic-graphs-0.8 · Algebra.Graph.NonEmpty.AdjacencyMap"AdjacencyMap"
"Algebra.Graph.NonEmpty.AdjacencyMap"
"algebraic-graphs-0.8-8JX2W3BiNP382gnPBc0Np8"
'True) (C1 ('MetaCons"NAM"
'PrefixI 'True) (S1 ('MetaSel ('Just"am"
) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (AdjacencyMap a))))type ToVertex (AdjacencyMap a) = aDefined in algebraic-graphs-0.8 · Algebra.Graph.ToGraph