module Problems.Graphs (
Graph (vertexes, edges, sets, neighbors, adjacent, toGraph, isValidGraph),
Vertex,
Edge (Edge),
Var (Var),
Lists (Lists),
Adjacency (Adjacency),
Paths (Paths),
G (G),
areValidGraphSets,
) where
import Control.DeepSeq
import Data.List (group, permutations, sort)
import Data.Map.Lazy (Map)
import qualified Data.Map.Lazy as Map
import Data.Maybe (fromJust)
import Data.Set (Set)
import qualified Data.Set as Set
import GHC.Generics (Generic)
class Graph g where
vertexes :: g -> Set Vertex
edges :: g -> Set Edge
sets :: g -> (Set Vertex, Set Edge)
sets g
g = (forall g. Graph g => g -> Set Vertex
vertexes g
g, forall g. Graph g => g -> Set Edge
edges g
g)
neighbors :: Vertex -> g -> Set Vertex
neighbors Vertex
v g
g = forall a b. (a -> b -> a) -> a -> Set b -> a
Set.foldl Set Vertex -> Edge -> Set Vertex
extract forall a. Set a
Set.empty forall a b. (a -> b) -> a -> b
$ forall g. Graph g => g -> Set Edge
edges g
g
where extract :: Set Vertex -> Edge -> Set Vertex
extract Set Vertex
vs (Edge (Vertex
u', Vertex
v'))
| Vertex
v forall a. Eq a => a -> a -> Bool
== Vertex
u' = forall a. Ord a => a -> Set a -> Set a
Set.insert Vertex
v' Set Vertex
vs
| Vertex
v forall a. Eq a => a -> a -> Bool
== Vertex
v' = forall a. Ord a => a -> Set a -> Set a
Set.insert Vertex
u' Set Vertex
vs
| Bool
otherwise = Set Vertex
vs
adjacent :: Vertex -> Vertex -> g -> Bool
adjacent Vertex
u Vertex
v g
g = forall a. Ord a => a -> Set a -> Bool
Set.member ((Vertex, Vertex) -> Edge
Edge (Vertex
u, Vertex
v)) (forall g. Graph g => g -> Set Edge
edges g
g)
toGraph :: (Set Vertex, Set Edge) -> Maybe g
isValidGraph :: g -> Bool
areValidGraphSets :: (Set Vertex, Set Edge) -> Bool
areValidGraphSets :: (Set Vertex, Set Edge) -> Bool
areValidGraphSets (Set Vertex
vs, Set Edge
es) = forall a. Ord a => Set a -> Set a -> Bool
Set.isSubsetOf Set Vertex
vs' Set Vertex
vs
where vs' :: Set Vertex
vs' = forall a b. (a -> b -> a) -> a -> Set b -> a
Set.foldl (\Set Vertex
s (Edge (Vertex
u, Vertex
v)) -> forall a. Ord a => a -> Set a -> Set a
Set.insert Vertex
u forall a b. (a -> b) -> a -> b
$ forall a. Ord a => a -> Set a -> Set a
Set.insert Vertex
v Set Vertex
s) forall a. Set a
Set.empty Set Edge
es
type Vertex = Int
newtype Edge = Edge (Vertex, Vertex)
deriving (Vertex -> Edge -> ShowS
[Edge] -> ShowS
Edge -> String
forall a.
(Vertex -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Edge] -> ShowS
$cshowList :: [Edge] -> ShowS
show :: Edge -> String
$cshow :: Edge -> String
showsPrec :: Vertex -> Edge -> ShowS
$cshowsPrec :: Vertex -> Edge -> ShowS
Show)
instance Eq Edge where
== :: Edge -> Edge -> Bool
(==) (Edge (Vertex, Vertex)
e) (Edge (Vertex, Vertex)
e') = (Vertex, Vertex) -> (Vertex, Vertex)
normalize (Vertex, Vertex)
e forall a. Eq a => a -> a -> Bool
== (Vertex, Vertex) -> (Vertex, Vertex)
normalize (Vertex, Vertex)
e'
instance Ord Edge where
compare :: Edge -> Edge -> Ordering
compare (Edge (Vertex, Vertex)
e) (Edge (Vertex, Vertex)
e') = forall a. Ord a => a -> a -> Ordering
compare ((Vertex, Vertex) -> (Vertex, Vertex)
normalize (Vertex, Vertex)
e) ((Vertex, Vertex) -> (Vertex, Vertex)
normalize (Vertex, Vertex)
e')
normalize :: (Vertex, Vertex) -> (Vertex, Vertex)
normalize :: (Vertex, Vertex) -> (Vertex, Vertex)
normalize e :: (Vertex, Vertex)
e@(Vertex
u, Vertex
v)
| Vertex
u forall a. Ord a => a -> a -> Bool
<= Vertex
v = (Vertex, Vertex)
e
| Bool
otherwise = (Vertex
v, Vertex
u)
equals :: Graph g => g -> g -> Bool
equals :: forall g. Graph g => g -> g -> Bool
equals g
g g
g' = Set Vertex
vs forall a. Eq a => a -> a -> Bool
== Set Vertex
vs' Bool -> Bool -> Bool
&& Set Edge
es forall a. Eq a => a -> a -> Bool
== Set Edge
es'
where (Set Vertex
vs, Set Vertex
vs') = (forall g. Graph g => g -> Set Vertex
vertexes g
g, forall g. Graph g => g -> Set Vertex
vertexes g
g')
(Set Edge
es, Set Edge
es') = (forall g. Graph g => g -> Set Edge
edges g
g, forall g. Graph g => g -> Set Edge
edges g
g')
data Var a = Var a [Var a]
deriving Vertex -> Var a -> ShowS
forall a. Show a => Vertex -> Var a -> ShowS
forall a. Show a => [Var a] -> ShowS
forall a. Show a => Var a -> String
forall a.
(Vertex -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Var a] -> ShowS
$cshowList :: forall a. Show a => [Var a] -> ShowS
show :: Var a -> String
$cshow :: forall a. Show a => Var a -> String
showsPrec :: Vertex -> Var a -> ShowS
$cshowsPrec :: forall a. Show a => Vertex -> Var a -> ShowS
Show
instance Eq a => Eq (Var a) where
== :: Var a -> Var a -> Bool
(==) (Var a
v [Var a]
vs) (Var a
v' [Var a]
vs')
| a
v forall a. Eq a => a -> a -> Bool
/= a
v' = Bool
False
| Bool
otherwise = forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem [Var a]
vs forall a b. (a -> b) -> a -> b
$ forall a. [a] -> [[a]]
permutations [Var a]
vs'
newtype Lists = Lists ([Vertex], [(Vertex, Vertex)])
deriving (Vertex -> Lists -> ShowS
[Lists] -> ShowS
Lists -> String
forall a.
(Vertex -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Lists] -> ShowS
$cshowList :: [Lists] -> ShowS
show :: Lists -> String
$cshow :: Lists -> String
showsPrec :: Vertex -> Lists -> ShowS
$cshowsPrec :: Vertex -> Lists -> ShowS
Show, forall x. Rep Lists x -> Lists
forall x. Lists -> Rep Lists x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Lists x -> Lists
$cfrom :: forall x. Lists -> Rep Lists x
Generic)
deriving anyclass Lists -> ()
forall a. (a -> ()) -> NFData a
rnf :: Lists -> ()
$crnf :: Lists -> ()
NFData
instance Graph Lists where
vertexes :: Lists -> Set Vertex
vertexes (Lists ([Vertex]
vs, [(Vertex, Vertex)]
_)) = forall a. Ord a => [a] -> Set a
Set.fromList [Vertex]
vs
edges :: Lists -> Set Edge
edges (Lists ([Vertex]
_, [(Vertex, Vertex)]
es)) = forall a. Ord a => [a] -> Set a
Set.fromList forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map (Vertex, Vertex) -> Edge
Edge [(Vertex, Vertex)]
es
toGraph :: (Set Vertex, Set Edge) -> Maybe Lists
toGraph (Set Vertex
vs, Set Edge
es)
| (Set Vertex, Set Edge) -> Bool
areValidGraphSets (Set Vertex
vs, Set Edge
es) = forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ ([Vertex], [(Vertex, Vertex)]) -> Lists
Lists (forall a. Set a -> [a]
Set.toList Set Vertex
vs, forall a b. (a -> b) -> [a] -> [b]
map (\(Edge (Vertex, Vertex)
e) -> (Vertex, Vertex)
e) forall a b. (a -> b) -> a -> b
$ forall a. Set a -> [a]
Set.toList Set Edge
es)
| Bool
otherwise = forall a. Maybe a
Nothing
isValidGraph :: Lists -> Bool
isValidGraph (Lists ([Vertex]
vs, [(Vertex, Vertex)]
es)) = (Set Vertex, Set Edge) -> Bool
areValidGraphSets (forall a. Ord a => [a] -> Set a
Set.fromList [Vertex]
vs, forall a. Ord a => [a] -> Set a
Set.fromList forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map (Vertex, Vertex) -> Edge
Edge [(Vertex, Vertex)]
es)
instance Eq Lists where
== :: Lists -> Lists -> Bool
(==) = forall g. Graph g => g -> g -> Bool
equals
newtype Adjacency = Adjacency [(Vertex, [Vertex])]
deriving (Vertex -> Adjacency -> ShowS
[Adjacency] -> ShowS
Adjacency -> String
forall a.
(Vertex -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Adjacency] -> ShowS
$cshowList :: [Adjacency] -> ShowS
show :: Adjacency -> String
$cshow :: Adjacency -> String
showsPrec :: Vertex -> Adjacency -> ShowS
$cshowsPrec :: Vertex -> Adjacency -> ShowS
Show, forall x. Rep Adjacency x -> Adjacency
forall x. Adjacency -> Rep Adjacency x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Adjacency x -> Adjacency
$cfrom :: forall x. Adjacency -> Rep Adjacency x
Generic)
deriving anyclass Adjacency -> ()
forall a. (a -> ()) -> NFData a
rnf :: Adjacency -> ()
$crnf :: Adjacency -> ()
NFData
instance Graph Adjacency where
vertexes :: Adjacency -> Set Vertex
vertexes (Adjacency [(Vertex, [Vertex])]
vs) = forall a. Ord a => [a] -> Set a
Set.fromList forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map forall a b. (a, b) -> a
fst [(Vertex, [Vertex])]
vs
edges :: Adjacency -> Set Edge
edges (Adjacency [(Vertex, [Vertex])]
vs) = forall a. Ord a => [a] -> Set a
Set.fromList forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (\(Vertex
v, [Vertex]
es) -> [(Vertex, Vertex) -> Edge
Edge (Vertex
v, Vertex
e) | Vertex
e <- [Vertex]
es]) [(Vertex, [Vertex])]
vs
neighbors :: Vertex -> Adjacency -> Set Vertex
neighbors Vertex
v (Adjacency [(Vertex, [Vertex])]
vs) = forall a. Ord a => [a] -> Set a
Set.fromList forall a b. (a -> b) -> a -> b
$ forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. [a] -> a
head forall a b. (a -> b) -> a -> b
$ forall a. (a -> Bool) -> [a] -> [a]
filter (forall a. Eq a => a -> a -> Bool
(==) Vertex
v forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a, b) -> a
fst) [(Vertex, [Vertex])]
vs
adjacent :: Vertex -> Vertex -> Adjacency -> Bool
adjacent Vertex
u Vertex
v (Adjacency [(Vertex, [Vertex])]
vs)
| forall (t :: * -> *) a. Foldable t => t a -> Bool
null [(Vertex, [Vertex])]
ls = Bool
False
| Bool
otherwise = forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem Vertex
v forall a b. (a -> b) -> a -> b
$ forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. [a] -> a
head [(Vertex, [Vertex])]
ls
where ls :: [(Vertex, [Vertex])]
ls = forall a. (a -> Bool) -> [a] -> [a]
filter (forall a. Eq a => a -> a -> Bool
(==) Vertex
u forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a, b) -> a
fst) [(Vertex, [Vertex])]
vs
toGraph :: (Set Vertex, Set Edge) -> Maybe Adjacency
toGraph (Set Vertex, Set Edge)
g
| (Set Vertex, Set Edge) -> Bool
areValidGraphSets (Set Vertex, Set Edge)
g = forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ [(Vertex, [Vertex])] -> Adjacency
Adjacency forall a b. (a -> b) -> a -> b
$ forall k a. Map k a -> [(k, a)]
Map.toList forall a b. (a -> b) -> a -> b
$ forall a b k. (a -> b) -> Map k a -> Map k b
Map.map forall a. Set a -> [a]
Set.toList Map Vertex (Set Vertex)
m
| Bool
otherwise = forall a. Maybe a
Nothing
where (G Map Vertex (Set Vertex)
m) = forall a. HasCallStack => Maybe a -> a
fromJust forall a b. (a -> b) -> a -> b
$ forall g. Graph g => (Set Vertex, Set Edge) -> Maybe g
toGraph (Set Vertex, Set Edge)
g :: G
isValidGraph :: Adjacency -> Bool
isValidGraph (Adjacency [(Vertex, [Vertex])]
ls) = Bool
unique Bool -> Bool -> Bool
&& Bool
symmetric
where
unique :: Bool
unique = forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (forall a. Eq a => a -> a -> Bool
(==) Vertex
1 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) a. Foldable t => t a -> Vertex
length) forall a b. (a -> b) -> a -> b
$ forall a. Eq a => [a] -> [[a]]
group forall a b. (a -> b) -> a -> b
$ forall a. Ord a => [a] -> [a]
sort forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map forall a b. (a, b) -> a
fst [(Vertex, [Vertex])]
ls
symmetric :: Bool
symmetric = forall g. Graph g => g -> Bool
isValidGraph forall a b. (a -> b) -> a -> b
$ Map Vertex (Set Vertex) -> G
G forall a b. (a -> b) -> a -> b
$ forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map (\(Vertex
v, [Vertex]
vs) -> (Vertex
v, forall a. Ord a => [a] -> Set a
Set.fromList [Vertex]
vs)) [(Vertex, [Vertex])]
ls
instance Eq Adjacency where
== :: Adjacency -> Adjacency -> Bool
(==) = forall g. Graph g => g -> g -> Bool
equals
newtype Paths = Paths [[Vertex]]
deriving (Vertex -> Paths -> ShowS
[Paths] -> ShowS
Paths -> String
forall a.
(Vertex -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Paths] -> ShowS
$cshowList :: [Paths] -> ShowS
show :: Paths -> String
$cshow :: Paths -> String
showsPrec :: Vertex -> Paths -> ShowS
$cshowsPrec :: Vertex -> Paths -> ShowS
Show, forall x. Rep Paths x -> Paths
forall x. Paths -> Rep Paths x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Paths x -> Paths
$cfrom :: forall x. Paths -> Rep Paths x
Generic)
deriving anyclass Paths -> ()
forall a. (a -> ()) -> NFData a
rnf :: Paths -> ()
$crnf :: Paths -> ()
NFData
instance Graph Paths where
vertexes :: Paths -> Set Vertex
vertexes (Paths [[Vertex]]
ps) = forall a. Ord a => [a] -> Set a
Set.fromList forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [[Vertex]]
ps
edges :: Paths -> Set Edge
edges (Paths [[Vertex]]
ps) = forall a. Ord a => [a] -> Set a
Set.fromList forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap [Vertex] -> [Edge]
toEdges [[Vertex]]
ps
where toEdges :: [Vertex] -> [Edge]
toEdges [] = []
toEdges [Vertex
_] = []
toEdges (Vertex
u : vs :: [Vertex]
vs@(Vertex
v:[Vertex]
_)) = (Vertex, Vertex) -> Edge
Edge (Vertex
u, Vertex
v) forall a. a -> [a] -> [a]
: [Vertex] -> [Edge]
toEdges [Vertex]
vs
toGraph :: (Set Vertex, Set Edge) -> Maybe Paths
toGraph (Set Vertex, Set Edge)
g
| (Set Vertex, Set Edge) -> Bool
areValidGraphSets (Set Vertex, Set Edge)
g = forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ [[Vertex]] -> Paths
Paths forall a b. (a -> b) -> a -> b
$ forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ (G, [[Vertex]]) -> (G, [[Vertex]])
extractPaths (forall a. HasCallStack => Maybe a -> a
fromJust forall a b. (a -> b) -> a -> b
$ forall g. Graph g => (Set Vertex, Set Edge) -> Maybe g
toGraph (Set Vertex, Set Edge)
g, [])
| Bool
otherwise = forall a. Maybe a
Nothing
isValidGraph :: Paths -> Bool
isValidGraph = forall a b. a -> b -> a
const Bool
True
extractPaths :: (G, [[Vertex]]) -> (G, [[Vertex]])
e :: (G, [[Vertex]])
e@(g :: G
g@(G Map Vertex (Set Vertex)
m), [[Vertex]]
ps)
| forall k a. Map k a -> Bool
Map.null Map Vertex (Set Vertex)
m = (G, [[Vertex]])
e
| Bool
otherwise = (G, [[Vertex]]) -> (G, [[Vertex]])
extractPaths (G
g', [Vertex]
p' forall a. a -> [a] -> [a]
: [[Vertex]]
ps)
where (G
g', [Vertex]
p') = Vertex -> G -> (G, [Vertex])
extractPathFrom (G -> Vertex
pathStart G
g) G
g
pathStart :: G -> Vertex
pathStart :: G -> Vertex
pathStart (G Map Vertex (Set Vertex)
m) = forall a b. (a, b) -> a
fst forall a b. (a -> b) -> a -> b
$ forall a. [a] -> a
head forall a b. (a -> b) -> a -> b
$ [(Vertex, Set Vertex)] -> [(Vertex, Set Vertex)]
candidates forall a b. (a -> b) -> a -> b
$ forall k a. Map k a -> [(k, a)]
Map.toList Map Vertex (Set Vertex)
roots
where roots :: Map Vertex (Set Vertex)
roots = forall a k. (a -> Bool) -> Map k a -> Map k a
Map.filter (forall a. Ord a => a -> a -> Bool
(>=) Vertex
1 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Set a -> Vertex
Set.size) Map Vertex (Set Vertex)
m
candidates :: [(Vertex, Set Vertex)] -> [(Vertex, Set Vertex)]
candidates [] = forall k a. Map k a -> [(k, a)]
Map.toList Map Vertex (Set Vertex)
m
candidates [(Vertex, Set Vertex)]
vs = [(Vertex, Set Vertex)]
vs
extractPathFrom :: Vertex -> G -> (G, [Vertex])
Vertex
v G
g = Vertex -> (G, [Vertex]) -> (G, [Vertex])
extractPath Vertex
v (G
g, [])
extractPath :: Vertex -> (G, [Vertex]) -> (G, [Vertex])
Vertex
v (g :: G
g@(G Map Vertex (Set Vertex)
m), [Vertex]
p)
| forall a. Set a -> Bool
Set.null Set Vertex
vs = (Map Vertex (Set Vertex) -> G
G forall a b. (a -> b) -> a -> b
$ forall k a. Ord k => k -> Map k a -> Map k a
Map.delete Vertex
v Map Vertex (Set Vertex)
m, Vertex
v forall a. a -> [a] -> [a]
: [Vertex]
p)
| Bool
otherwise = Vertex -> (G, [Vertex]) -> (G, [Vertex])
extractPath Vertex
v' (Vertex -> Vertex -> G -> G
deleteEdge Vertex
v Vertex
v' G
g, Vertex
v forall a. a -> [a] -> [a]
: [Vertex]
p)
where vs :: Set Vertex
vs = forall g. Graph g => Vertex -> g -> Set Vertex
neighbors Vertex
v G
g
v' :: Vertex
v' = forall a. Set a -> a
Set.findMin Set Vertex
vs
deleteEdge :: Vertex -> Vertex -> G -> G
deleteEdge :: Vertex -> Vertex -> G -> G
deleteEdge Vertex
u Vertex
v (G Map Vertex (Set Vertex)
m) = Map Vertex (Set Vertex) -> G
G forall a b. (a -> b) -> a -> b
$ forall {k} {a}.
(Ord k, Ord a) =>
k -> a -> Map k (Set a) -> Map k (Set a)
delete Vertex
u Vertex
v forall a b. (a -> b) -> a -> b
$ forall {k} {a}.
(Ord k, Ord a) =>
k -> a -> Map k (Set a) -> Map k (Set a)
delete Vertex
v Vertex
u Map Vertex (Set Vertex)
m
where delete :: k -> a -> Map k (Set a) -> Map k (Set a)
delete k
u' a
v' = forall k a. Ord k => (a -> Maybe a) -> k -> Map k a -> Map k a
Map.update (forall {a}. Set a -> Maybe (Set a)
toMaybe forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Ord a => a -> Set a -> Set a
Set.delete a
v') k
u'
toMaybe :: Set a -> Maybe (Set a)
toMaybe Set a
vs
| forall a. Set a -> Bool
Set.null Set a
vs = forall a. Maybe a
Nothing
| Bool
otherwise = forall a. a -> Maybe a
Just Set a
vs
instance Eq Paths where
== :: Paths -> Paths -> Bool
(==) = forall g. Graph g => g -> g -> Bool
equals
newtype G = G (Map Vertex (Set Vertex))
deriving (G -> G -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: G -> G -> Bool
$c/= :: G -> G -> Bool
== :: G -> G -> Bool
$c== :: G -> G -> Bool
Eq, Vertex -> G -> ShowS
[G] -> ShowS
G -> String
forall a.
(Vertex -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [G] -> ShowS
$cshowList :: [G] -> ShowS
show :: G -> String
$cshow :: G -> String
showsPrec :: Vertex -> G -> ShowS
$cshowsPrec :: Vertex -> G -> ShowS
Show, forall x. Rep G x -> G
forall x. G -> Rep G x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep G x -> G
$cfrom :: forall x. G -> Rep G x
Generic)
deriving anyclass G -> ()
forall a. (a -> ()) -> NFData a
rnf :: G -> ()
$crnf :: G -> ()
NFData
instance Graph G where
vertexes :: G -> Set Vertex
vertexes (G Map Vertex (Set Vertex)
m) = forall k a. Map k a -> Set k
Map.keysSet Map Vertex (Set Vertex)
m
edges :: G -> Set Edge
edges (G Map Vertex (Set Vertex)
m) = forall a k b. (a -> k -> b -> a) -> a -> Map k b -> a
Map.foldlWithKey Set Edge -> Vertex -> Set Vertex -> Set Edge
addVertex forall a. Set a
Set.empty Map Vertex (Set Vertex)
m
where addVertex :: Set Edge -> Vertex -> Set Vertex -> Set Edge
addVertex Set Edge
s Vertex
v Set Vertex
vs = forall a. Ord a => Set a -> Set a -> Set a
Set.union Set Edge
s forall a b. (a -> b) -> a -> b
$ Vertex -> Set Vertex -> Set Edge
toEdges Vertex
v Set Vertex
vs
toEdges :: Vertex -> Set Vertex -> Set Edge
toEdges Vertex
v = forall b a. Ord b => (a -> b) -> Set a -> Set b
Set.map (\Vertex
u -> (Vertex, Vertex) -> Edge
Edge (Vertex
v, Vertex
u))
neighbors :: Vertex -> G -> Set Vertex
neighbors Vertex
v (G Map Vertex (Set Vertex)
m) = forall k a. Ord k => a -> k -> Map k a -> a
Map.findWithDefault forall a. Set a
Set.empty Vertex
v Map Vertex (Set Vertex)
m
adjacent :: Vertex -> Vertex -> G -> Bool
adjacent Vertex
u Vertex
v G
g = forall a. Ord a => a -> Set a -> Bool
Set.member Vertex
u forall a b. (a -> b) -> a -> b
$ forall g. Graph g => Vertex -> g -> Set Vertex
neighbors Vertex
v G
g
toGraph :: (Set Vertex, Set Edge) -> Maybe G
toGraph (Set Vertex
vs, Set Edge
es)
| (Set Vertex, Set Edge) -> Bool
areValidGraphSets (Set Vertex
vs, Set Edge
es) = forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ Map Vertex (Set Vertex) -> G
G forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b -> a) -> a -> Set b -> a
Set.foldl Map Vertex (Set Vertex) -> Edge -> Map Vertex (Set Vertex)
insertEdge forall {a}. Map Vertex (Set a)
fromVertexes Set Edge
es
| Bool
otherwise = forall a. Maybe a
Nothing
where fromVertexes :: Map Vertex (Set a)
fromVertexes = forall k a. (k -> a) -> Set k -> Map k a
Map.fromSet (forall a b. a -> b -> a
const forall a. Set a
Set.empty) Set Vertex
vs
insertEdge :: Map Vertex (Set Vertex) -> Edge -> Map Vertex (Set Vertex)
insertEdge Map Vertex (Set Vertex)
m (Edge (Vertex
u, Vertex
v)) = forall {k} {a}.
(Ord k, Ord a) =>
k -> a -> Map k (Set a) -> Map k (Set a)
insertNeighbor Vertex
u Vertex
v forall a b. (a -> b) -> a -> b
$ forall {k} {a}.
(Ord k, Ord a) =>
k -> a -> Map k (Set a) -> Map k (Set a)
insertNeighbor Vertex
v Vertex
u Map Vertex (Set Vertex)
m
insertNeighbor :: k -> a -> Map k (Set a) -> Map k (Set a)
insertNeighbor k
u a
v = forall k a. Ord k => (a -> a -> a) -> k -> a -> Map k a -> Map k a
Map.insertWith forall a. Ord a => Set a -> Set a -> Set a
Set.union k
u (forall a. a -> Set a
Set.singleton a
v)
isValidGraph :: G -> Bool
isValidGraph (G Map Vertex (Set Vertex)
m) = forall a k b. (a -> k -> b -> a) -> a -> Map k b -> a
Map.foldlWithKey (\Bool
r Vertex
v Set Vertex
vs -> Bool
r Bool -> Bool -> Bool
&& Vertex -> Set Vertex -> Bool
symmetric Vertex
v Set Vertex
vs) Bool
True Map Vertex (Set Vertex)
m
where symmetric :: Vertex -> Set Vertex -> Bool
symmetric Vertex
v = forall a b. (a -> b -> a) -> a -> Set b -> a
Set.foldl (\Bool
r' Vertex
v' -> Bool
r' Bool -> Bool -> Bool
&& Vertex -> Vertex -> Bool
converse Vertex
v Vertex
v') Bool
True
converse :: Vertex -> Vertex -> Bool
converse Vertex
v Vertex
v' = Vertex
v forall {a}. Ord a => a -> Maybe (Set a) -> Bool
`inside` forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup Vertex
v' Map Vertex (Set Vertex)
m
inside :: a -> Maybe (Set a) -> Bool
inside a
_ Maybe (Set a)
Nothing = Bool
False
inside a
v (Just Set a
vs) = forall a. Ord a => a -> Set a -> Bool
Set.member a
v Set a
vs