| Copyright | (c) Ivan Lazar Miljenovic |
|---|---|
| License | BSD3 |
| Maintainer | Ivan.Miljenovic@gmail.com |
| Safe Haskell | None |
| Language | Haskell2010 |
Data.Graph.Inductive.Arbitrary
Description
This module provides default definitions for use with QuickCheck's
Arbitrary class.
Both Data.Graph.Inductive.Tree- and
Data.Graph.Inductive.PatriciaTree-based graph implementations have
Arbitrary instances. In most cases, this is all you will need.
If, however, you want to create arbitrary custom graph-like data
structures, then you will probably want to do some custom processing
from an arbitrary GraphNodesEdges value, either directly or with a
custom ArbGraph instance.
Synopsis
- arbitraryGraph :: (Graph gr, Arbitrary a, Arbitrary b) => Gen (gr a b)
- arbitraryGraphWith :: (Graph gr, Arbitrary a, Arbitrary b) => ([LEdge b] -> [LEdge b]) -> Gen (gr a b)
- shrinkGraph :: Graph gr => gr a b -> [gr a b]
- shrinkGraphWith :: Graph gr => gr a b -> [(Node, gr a b)]
- class DynGraph (BaseGraph ag) => ArbGraph (ag :: Type -> Type -> Type) where
- type BaseGraph (ag :: Type -> Type -> Type) :: Type -> Type -> Type
- toBaseGraph :: ag a b -> BaseGraph ag a b
- fromBaseGraph :: BaseGraph ag a b -> ag a b
- edgeF :: GrProxy ag -> [LEdge b] -> [LEdge b]
- shrinkFWith :: ag a b -> [(Node, ag a b)]
- data GrProxy (gr :: Type -> Type -> Type) = GrProxy
- shrinkF :: ArbGraph ag => ag a b -> [ag a b]
- arbitraryGraphBy :: (ArbGraph ag, Arbitrary a, Arbitrary b) => Gen (ag a b)
- newtype NoMultipleEdges (gr :: Type -> Type -> Type) a b = NME {
- nmeGraph :: gr a b
- newtype NoLoops (gr :: Type -> Type -> Type) a b = NL {
- looplessGraph :: gr a b
- type SimpleGraph (gr :: Type -> Type -> Type) = NoLoops (NoMultipleEdges gr)
- newtype Undirected (gr :: Type -> Type -> Type) a b = UG {
- undirGraph :: gr a b
- data Connected (ag :: Type -> Type -> Type) a b = CG {
- connNode :: Node
- connArbGraph :: ag a b
- connGraph :: forall (ag :: Type -> Type -> Type) a b. ArbGraph ag => Connected ag a b -> BaseGraph ag a b
- arbitraryNodes :: Arbitrary a => Gen [LNode a]
- arbitraryEdges :: Arbitrary b => [LNode a] -> Gen [LEdge b]
- data GraphNodesEdges a b = GNEs {
- graphNodes :: [LNode a]
- graphEdges :: [LEdge b]
Explicit graph creation
If you wish to explicitly create a generated graph value (rather than
using the Arbitrary class) then you will want to use these
functions.
arbitraryGraph :: (Graph gr, Arbitrary a, Arbitrary b) => Gen (gr a b) Source #
Generate an arbitrary graph. Multiple edges are allowed.
arbitraryGraphWith :: (Graph gr, Arbitrary a, Arbitrary b) => ([LEdge b] -> [LEdge b]) -> Gen (gr a b) Source #
Generate an arbitrary graph, using the specified function to manipulate the generated list of edges (e.g. remove multiple edges).
shrinkGraph :: Graph gr => gr a b -> [gr a b] Source #
For a graph with at least two nodes, return every possible way of deleting a single node (i.e. will never shrink to an empty graph).
shrinkGraphWith :: Graph gr => gr a b -> [(Node, gr a b)] Source #
As with shrinkGraph, but also return the node that was deleted.
Types of graphs
class DynGraph (BaseGraph ag) => ArbGraph (ag :: Type -> Type -> Type) where Source #
Representation of generating arbitrary graph structures.
Typically, you would only use this for the toBaseGraph function
or if you wanted to make a custom graph wrapper.
The intent of this class is to simplify defining and using
different wrappers on top of graphs (e.g. you may wish to have an
Undirected graph, or one with NoLoops, or possibly both!).
Methods
toBaseGraph :: ag a b -> BaseGraph ag a b Source #
fromBaseGraph :: BaseGraph ag a b -> ag a b Source #
edgeF :: GrProxy ag -> [LEdge b] -> [LEdge b] Source #
Any manipulation of edges that should be done to satisfy the requirements of the specified wrapper.
shrinkFWith :: ag a b -> [(Node, ag a b)] Source #
Shrinking function (assuming only one node is removed at a time) which also returns the node that is removed.
Instances
data GrProxy (gr :: Type -> Type -> Type) Source #
A simple graph-specific proxy type.
Constructors
| GrProxy |
Instances
| Read (GrProxy gr) Source # | |
| Show (GrProxy gr) Source # | |
| Eq (GrProxy gr) Source # | |
| Ord (GrProxy gr) Source # | |
Defined in Data.Graph.Inductive.Arbitrary Methods compare :: GrProxy gr -> GrProxy gr -> Ordering Source # (<) :: GrProxy gr -> GrProxy gr -> Bool Source # (<=) :: GrProxy gr -> GrProxy gr -> Bool Source # (>) :: GrProxy gr -> GrProxy gr -> Bool Source # (>=) :: GrProxy gr -> GrProxy gr -> Bool Source # | |
shrinkF :: ArbGraph ag => ag a b -> [ag a b] Source #
In most cases, for an instance of ArbGraph the Arbitrary
instance definition will/can have shrink = shrinkF.
arbitraryGraphBy :: (ArbGraph ag, Arbitrary a, Arbitrary b) => Gen (ag a b) Source #
Generate an instance of ArbGraph using the class methods.
Specific graph structures
newtype NoMultipleEdges (gr :: Type -> Type -> Type) a b Source #
A newtype wrapper to generate a graph without multiple edges (loops allowed).
Instances
| ArbGraph gr => ArbGraph (NoMultipleEdges gr) Source # | |||||
Defined in Data.Graph.Inductive.Arbitrary Associated Types
Methods toBaseGraph :: NoMultipleEdges gr a b -> BaseGraph (NoMultipleEdges gr) a b Source # fromBaseGraph :: BaseGraph (NoMultipleEdges gr) a b -> NoMultipleEdges gr a b Source # edgeF :: GrProxy (NoMultipleEdges gr) -> [LEdge b] -> [LEdge b] Source # shrinkFWith :: NoMultipleEdges gr a b -> [(Node, NoMultipleEdges gr a b)] Source # | |||||
| (ArbGraph gr, Arbitrary a, Arbitrary b) => Arbitrary (NoMultipleEdges gr a b) Source # | |||||
Defined in Data.Graph.Inductive.Arbitrary Methods arbitrary :: Gen (NoMultipleEdges gr a b) shrink :: NoMultipleEdges gr a b -> [NoMultipleEdges gr a b] | |||||
| Read (gr a b) => Read (NoMultipleEdges gr a b) Source # | |||||
Defined in Data.Graph.Inductive.Arbitrary Methods readsPrec :: Int -> ReadS (NoMultipleEdges gr a b) Source # readList :: ReadS [NoMultipleEdges gr a b] Source # readPrec :: ReadPrec (NoMultipleEdges gr a b) Source # readListPrec :: ReadPrec [NoMultipleEdges gr a b] Source # | |||||
| Show (gr a b) => Show (NoMultipleEdges gr a b) Source # | |||||
Defined in Data.Graph.Inductive.Arbitrary | |||||
| Eq (gr a b) => Eq (NoMultipleEdges gr a b) Source # | |||||
Defined in Data.Graph.Inductive.Arbitrary Methods (==) :: NoMultipleEdges gr a b -> NoMultipleEdges gr a b -> Bool Source # (/=) :: NoMultipleEdges gr a b -> NoMultipleEdges gr a b -> Bool Source # | |||||
| type BaseGraph (NoMultipleEdges gr) Source # | |||||
Defined in Data.Graph.Inductive.Arbitrary | |||||
newtype NoLoops (gr :: Type -> Type -> Type) a b Source #
A newtype wrapper to generate a graph without loops (multiple edges allowed).
Constructors
| NL | |
Fields
| |
Instances
| ArbGraph gr => ArbGraph (NoLoops gr) Source # | |||||
Defined in Data.Graph.Inductive.Arbitrary Associated Types
| |||||
| (ArbGraph gr, Arbitrary a, Arbitrary b) => Arbitrary (NoLoops gr a b) Source # | |||||
| Read (gr a b) => Read (NoLoops gr a b) Source # | |||||
| Show (gr a b) => Show (NoLoops gr a b) Source # | |||||
| Eq (gr a b) => Eq (NoLoops gr a b) Source # | |||||
| type BaseGraph (NoLoops gr) Source # | |||||
Defined in Data.Graph.Inductive.Arbitrary | |||||
type SimpleGraph (gr :: Type -> Type -> Type) = NoLoops (NoMultipleEdges gr) Source #
A wrapper to generate a graph without multiple edges and no loops.
newtype Undirected (gr :: Type -> Type -> Type) a b Source #
A newtype wrapper such that each (non-loop) edge also has its reverse in the graph.
Note that there is no way to guarantee this after any additional edges are added or removed.
You should also apply this wrapper after NoMultipleEdges or
else the wrong reverse edge might be removed.
Constructors
| UG | |
Fields
| |
Instances
| ArbGraph gr => ArbGraph (Undirected gr) Source # | |||||
Defined in Data.Graph.Inductive.Arbitrary Associated Types
Methods toBaseGraph :: Undirected gr a b -> BaseGraph (Undirected gr) a b Source # fromBaseGraph :: BaseGraph (Undirected gr) a b -> Undirected gr a b Source # edgeF :: GrProxy (Undirected gr) -> [LEdge b] -> [LEdge b] Source # shrinkFWith :: Undirected gr a b -> [(Node, Undirected gr a b)] Source # | |||||
| (ArbGraph gr, Arbitrary a, Arbitrary b) => Arbitrary (Undirected gr a b) Source # | |||||
Defined in Data.Graph.Inductive.Arbitrary | |||||
| Read (gr a b) => Read (Undirected gr a b) Source # | |||||
Defined in Data.Graph.Inductive.Arbitrary Methods readsPrec :: Int -> ReadS (Undirected gr a b) Source # readList :: ReadS [Undirected gr a b] Source # readPrec :: ReadPrec (Undirected gr a b) Source # readListPrec :: ReadPrec [Undirected gr a b] Source # | |||||
| Show (gr a b) => Show (Undirected gr a b) Source # | |||||
Defined in Data.Graph.Inductive.Arbitrary | |||||
| Eq (gr a b) => Eq (Undirected gr a b) Source # | |||||
Defined in Data.Graph.Inductive.Arbitrary Methods (==) :: Undirected gr a b -> Undirected gr a b -> Bool Source # (/=) :: Undirected gr a b -> Undirected gr a b -> Bool Source # | |||||
| type BaseGraph (Undirected gr) Source # | |||||
Defined in Data.Graph.Inductive.Arbitrary | |||||
Connected graphs
data Connected (ag :: Type -> Type -> Type) a b Source #
A brute-force approach to generating connected graphs.
The resultant graph (obtained with connGraph) will never be
empty: it will, at the very least, contain an additional
connected node (obtained with connNode).
Note that this is not an instance of ArbGraph as it is not
possible to arbitrarily layer a transformer on top of this.
Constructors
| CG | |
Fields
| |
connGraph :: forall (ag :: Type -> Type -> Type) a b. ArbGraph ag => Connected ag a b -> BaseGraph ag a b Source #
The underlying graph represented by this Connected value.
Node and edge lists
arbitraryNodes :: Arbitrary a => Gen [LNode a] Source #
Generally a list of labelled nodes.
arbitraryEdges :: Arbitrary b => [LNode a] -> Gen [LEdge b] Source #
Given a specified list of nodes, generate a list of edges.
data GraphNodesEdges a b Source #
Defined so as to be able to generate valid arbitrary node and
edge lists.
If any specific structure (no multiple edges, no loops, etc.) is
required then you will need to post-process this after generating
it, or else create a new instance of ArbGraph.
Constructors
| GNEs | |
Fields
| |
Instances
| (Arbitrary a, Arbitrary b) => Arbitrary (GraphNodesEdges a b) Source # | |
Defined in Data.Graph.Inductive.Arbitrary | |
| (Read a, Read b) => Read (GraphNodesEdges a b) Source # | |
Defined in Data.Graph.Inductive.Arbitrary Methods readsPrec :: Int -> ReadS (GraphNodesEdges a b) Source # readList :: ReadS [GraphNodesEdges a b] Source # readPrec :: ReadPrec (GraphNodesEdges a b) Source # readListPrec :: ReadPrec [GraphNodesEdges a b] Source # | |
| (Show a, Show b) => Show (GraphNodesEdges a b) Source # | |
Defined in Data.Graph.Inductive.Arbitrary | |
| (Eq a, Eq b) => Eq (GraphNodesEdges a b) Source # | |
Defined in Data.Graph.Inductive.Arbitrary Methods (==) :: GraphNodesEdges a b -> GraphNodesEdges a b -> Bool Source # (/=) :: GraphNodesEdges a b -> GraphNodesEdges a b -> Bool Source # | |
| (Ord a, Ord b) => Ord (GraphNodesEdges a b) Source # | |
Defined in Data.Graph.Inductive.Arbitrary Methods compare :: GraphNodesEdges a b -> GraphNodesEdges a b -> Ordering Source # (<) :: GraphNodesEdges a b -> GraphNodesEdges a b -> Bool Source # (<=) :: GraphNodesEdges a b -> GraphNodesEdges a b -> Bool Source # (>) :: GraphNodesEdges a b -> GraphNodesEdges a b -> Bool Source # (>=) :: GraphNodesEdges a b -> GraphNodesEdges a b -> Bool Source # max :: GraphNodesEdges a b -> GraphNodesEdges a b -> GraphNodesEdges a b Source # min :: GraphNodesEdges a b -> GraphNodesEdges a b -> GraphNodesEdges a b Source # | |