module Algebra.Graph.HigherKinded.Class (
Graph (..), empty, vertex, overlay,
Undirected,
Reflexive,
Transitive,
Preorder,
edge, vertices, edges, overlays, connects,
isSubgraphOf,
hasEdge,
path, circuit, clique, biclique, star, stars, tree, forest, mesh, torus,
deBruijn,
removeVertex, replaceVertex, mergeVertices, splitVertex, induce
) where
import Control.Applicative (Alternative(empty, (<|>)))
import Control.Monad (MonadPlus, mfilter)
import Data.Tree
import qualified Algebra.Graph as G
class MonadPlus g => Graph g where
connect :: g a -> g a -> g a
instance Graph G.Graph where
connect :: forall a. Graph a -> Graph a -> Graph a
connect = Graph a -> Graph a -> Graph a
forall a. Graph a -> Graph a -> Graph a
G.connect
vertex :: Graph g => a -> g a
vertex :: forall (g :: * -> *) a. Graph g => a -> g a
vertex = a -> g a
forall a. a -> g a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
overlay :: Graph g => g a -> g a -> g a
overlay :: forall (g :: * -> *) a. Graph g => g a -> g a -> g a
overlay = g a -> g a -> g a
forall a. g a -> g a -> g a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
(<|>)
class Graph g => Undirected g
class Graph g => Reflexive g
class Graph g => Transitive g
class (Reflexive g, Transitive g) => Preorder g
edge :: Graph g => a -> a -> g a
edge :: forall (g :: * -> *) a. Graph g => a -> a -> g a
edge a
x a
y = g a -> g a -> g a
forall a. g a -> g a -> g a
forall (g :: * -> *) a. Graph g => g a -> g a -> g a
connect (a -> g a
forall (g :: * -> *) a. Graph g => a -> g a
vertex a
x) (a -> g a
forall (g :: * -> *) a. Graph g => a -> g a
vertex a
y)
vertices :: Graph g => [a] -> g a
vertices :: forall (g :: * -> *) a. Graph g => [a] -> g a
vertices [] = g a
forall a. g a
forall (f :: * -> *) a. Alternative f => f a
empty
vertices [a
x] = a -> g a
forall (g :: * -> *) a. Graph g => a -> g a
vertex a
x
vertices (a
x:[a]
xs) = a -> g a
forall (g :: * -> *) a. Graph g => a -> g a
vertex a
x g a -> g a -> g a
forall (g :: * -> *) a. Graph g => g a -> g a -> g a
`overlay` [a] -> g a
forall (g :: * -> *) a. Graph g => [a] -> g a
vertices [a]
xs
edges :: Graph g => [(a, a)] -> g a
edges :: forall (g :: * -> *) a. Graph g => [(a, a)] -> g a
edges = [g a] -> g a
forall (g :: * -> *) a. Graph g => [g a] -> g a
overlays ([g a] -> g a) -> ([(a, a)] -> [g a]) -> [(a, a)] -> g a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((a, a) -> g a) -> [(a, a)] -> [g a]
forall a b. (a -> b) -> [a] -> [b]
map ((a -> a -> g a) -> (a, a) -> g a
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry a -> a -> g a
forall (g :: * -> *) a. Graph g => a -> a -> g a
edge)
overlays :: Graph g => [g a] -> g a
overlays :: forall (g :: * -> *) a. Graph g => [g a] -> g a
overlays [] = g a
forall a. g a
forall (f :: * -> *) a. Alternative f => f a
empty
overlays [g a
x] = g a
x
overlays (g a
x:[g a]
xs) = g a
x g a -> g a -> g a
forall (g :: * -> *) a. Graph g => g a -> g a -> g a
`overlay` [g a] -> g a
forall (g :: * -> *) a. Graph g => [g a] -> g a
overlays [g a]
xs
connects :: Graph g => [g a] -> g a
connects :: forall (g :: * -> *) a. Graph g => [g a] -> g a
connects [] = g a
forall a. g a
forall (f :: * -> *) a. Alternative f => f a
empty
connects [g a
x] = g a
x
connects (g a
x:[g a]
xs) = g a
x g a -> g a -> g a
forall a. g a -> g a -> g a
forall (g :: * -> *) a. Graph g => g a -> g a -> g a
`connect` [g a] -> g a
forall (g :: * -> *) a. Graph g => [g a] -> g a
connects [g a]
xs
isSubgraphOf :: (Graph g, Eq (g a)) => g a -> g a -> Bool
isSubgraphOf :: forall (g :: * -> *) a. (Graph g, Eq (g a)) => g a -> g a -> Bool
isSubgraphOf g a
x g a
y = g a -> g a -> g a
forall (g :: * -> *) a. Graph g => g a -> g a -> g a
overlay g a
x g a
y g a -> g a -> Bool
forall a. Eq a => a -> a -> Bool
== g a
y
hasEdge :: (Eq (g a), Graph g, Ord a) => a -> a -> g a -> Bool
hasEdge :: forall (g :: * -> *) a.
(Eq (g a), Graph g, Ord a) =>
a -> a -> g a -> Bool
hasEdge a
u a
v = (a -> a -> g a
forall (g :: * -> *) a. Graph g => a -> a -> g a
edge a
u a
v g a -> g a -> Bool
forall (g :: * -> *) a. (Graph g, Eq (g a)) => g a -> g a -> Bool
`isSubgraphOf`) (g a -> Bool) -> (g a -> g a) -> g a -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> Bool) -> g a -> g a
forall (g :: * -> *) a. Graph g => (a -> Bool) -> g a -> g a
induce (\a
x -> a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
u Bool -> Bool -> Bool
|| a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
v)
path :: Graph g => [a] -> g a
path :: forall (g :: * -> *) a. Graph g => [a] -> g a
path [a]
xs = case [a]
xs of [] -> g a
forall a. g a
forall (f :: * -> *) a. Alternative f => f a
empty
[a
x] -> a -> g a
forall (g :: * -> *) a. Graph g => a -> g a
vertex a
x
(a
_:[a]
ys) -> [(a, a)] -> g a
forall (g :: * -> *) a. Graph g => [(a, a)] -> g a
edges ([a] -> [a] -> [(a, a)]
forall a b. [a] -> [b] -> [(a, b)]
zip [a]
xs [a]
ys)
circuit :: Graph g => [a] -> g a
circuit :: forall (g :: * -> *) a. Graph g => [a] -> g a
circuit [] = g a
forall a. g a
forall (f :: * -> *) a. Alternative f => f a
empty
circuit (a
x:[a]
xs) = [a] -> g a
forall (g :: * -> *) a. Graph g => [a] -> g a
path ([a] -> g a) -> [a] -> g a
forall a b. (a -> b) -> a -> b
$ [a
x] [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ [a]
xs [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ [a
x]
clique :: Graph g => [a] -> g a
clique :: forall (g :: * -> *) a. Graph g => [a] -> g a
clique = [g a] -> g a
forall (g :: * -> *) a. Graph g => [g a] -> g a
connects ([g a] -> g a) -> ([a] -> [g a]) -> [a] -> g a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> g a) -> [a] -> [g a]
forall a b. (a -> b) -> [a] -> [b]
map a -> g a
forall (g :: * -> *) a. Graph g => a -> g a
vertex
biclique :: Graph g => [a] -> [a] -> g a
biclique :: forall (g :: * -> *) a. Graph g => [a] -> [a] -> g a
biclique [a]
xs [] = [a] -> g a
forall (g :: * -> *) a. Graph g => [a] -> g a
vertices [a]
xs
biclique [] [a]
ys = [a] -> g a
forall (g :: * -> *) a. Graph g => [a] -> g a
vertices [a]
ys
biclique [a]
xs [a]
ys = g a -> g a -> g a
forall a. g a -> g a -> g a
forall (g :: * -> *) a. Graph g => g a -> g a -> g a
connect ([a] -> g a
forall (g :: * -> *) a. Graph g => [a] -> g a
vertices [a]
xs) ([a] -> g a
forall (g :: * -> *) a. Graph g => [a] -> g a
vertices [a]
ys)
star :: Graph g => a -> [a] -> g a
star :: forall (g :: * -> *) a. Graph g => a -> [a] -> g a
star a
x [] = a -> g a
forall (g :: * -> *) a. Graph g => a -> g a
vertex a
x
star a
x [a]
ys = g a -> g a -> g a
forall a. g a -> g a -> g a
forall (g :: * -> *) a. Graph g => g a -> g a -> g a
connect (a -> g a
forall (g :: * -> *) a. Graph g => a -> g a
vertex a
x) ([a] -> g a
forall (g :: * -> *) a. Graph g => [a] -> g a
vertices [a]
ys)
stars :: Graph g => [(a, [a])] -> g a
stars :: forall (g :: * -> *) a. Graph g => [(a, [a])] -> g a
stars = [g a] -> g a
forall (g :: * -> *) a. Graph g => [g a] -> g a
overlays ([g a] -> g a) -> ([(a, [a])] -> [g a]) -> [(a, [a])] -> g a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((a, [a]) -> g a) -> [(a, [a])] -> [g a]
forall a b. (a -> b) -> [a] -> [b]
map ((a -> [a] -> g a) -> (a, [a]) -> g a
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry a -> [a] -> g a
forall (g :: * -> *) a. Graph g => a -> [a] -> g a
star)
tree :: Graph g => Tree a -> g a
tree :: forall (g :: * -> *) a. Graph g => Tree a -> g a
tree (Node a
x []) = a -> g a
forall (g :: * -> *) a. Graph g => a -> g a
vertex a
x
tree (Node a
x [Tree a]
f ) = a -> [a] -> g a
forall (g :: * -> *) a. Graph g => a -> [a] -> g a
star a
x ((Tree a -> a) -> [Tree a] -> [a]
forall a b. (a -> b) -> [a] -> [b]
map Tree a -> a
forall a. Tree a -> a
rootLabel [Tree a]
f)
g a -> g a -> g a
forall (g :: * -> *) a. Graph g => g a -> g a -> g a
`overlay` [Tree a] -> g a
forall (g :: * -> *) a. Graph g => Forest a -> g a
forest ((Tree a -> Bool) -> [Tree a] -> [Tree a]
forall a. (a -> Bool) -> [a] -> [a]
filter (Bool -> Bool
not (Bool -> Bool) -> (Tree a -> Bool) -> Tree a -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Tree a] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null ([Tree a] -> Bool) -> (Tree a -> [Tree a]) -> Tree a -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Tree a -> [Tree a]
forall a. Tree a -> [Tree a]
subForest) [Tree a]
f)
forest :: Graph g => Forest a -> g a
forest :: forall (g :: * -> *) a. Graph g => Forest a -> g a
forest = [g a] -> g a
forall (g :: * -> *) a. Graph g => [g a] -> g a
overlays ([g a] -> g a) -> (Forest a -> [g a]) -> Forest a -> g a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Tree a -> g a) -> Forest a -> [g a]
forall a b. (a -> b) -> [a] -> [b]
map Tree a -> g a
forall (g :: * -> *) a. Graph g => Tree a -> g a
tree
mesh :: Graph g => [a] -> [b] -> g (a, b)
mesh :: forall (g :: * -> *) a b. Graph g => [a] -> [b] -> g (a, b)
mesh [] [b]
_ = g (a, b)
forall a. g a
forall (f :: * -> *) a. Alternative f => f a
empty
mesh [a]
_ [] = g (a, b)
forall a. g a
forall (f :: * -> *) a. Alternative f => f a
empty
mesh [a
x] [b
y] = (a, b) -> g (a, b)
forall (g :: * -> *) a. Graph g => a -> g a
vertex (a
x, b
y)
mesh [a]
xs [b]
ys = [((a, b), [(a, b)])] -> g (a, b)
forall (g :: * -> *) a. Graph g => [(a, [a])] -> g a
stars ([((a, b), [(a, b)])] -> g (a, b))
-> [((a, b), [(a, b)])] -> g (a, b)
forall a b. (a -> b) -> a -> b
$ [ ((a
a1, b
b1), [(a
a1, b
b2), (a
a2, b
b1)]) | (a
a1, a
a2) <- [(a, a)]
ipxs, (b
b1, b
b2) <- [(b, b)]
ipys ]
[((a, b), [(a, b)])]
-> [((a, b), [(a, b)])] -> [((a, b), [(a, b)])]
forall a. [a] -> [a] -> [a]
++ [ ((a
lx,b
y1), [(a
lx,b
y2)]) | (b
y1,b
y2) <- [(b, b)]
ipys]
[((a, b), [(a, b)])]
-> [((a, b), [(a, b)])] -> [((a, b), [(a, b)])]
forall a. [a] -> [a] -> [a]
++ [ ((a
x1,b
ly), [(a
x2,b
ly)]) | (a
x1,a
x2) <- [(a, a)]
ipxs]
where
lx :: a
lx = [a] -> a
forall a. HasCallStack => [a] -> a
last [a]
xs
ly :: b
ly = [b] -> b
forall a. HasCallStack => [a] -> a
last [b]
ys
ipxs :: [(a, a)]
ipxs = [(a, a)] -> [(a, a)]
forall a. HasCallStack => [a] -> [a]
init ([a] -> [(a, a)]
forall a. [a] -> [(a, a)]
pairs [a]
xs)
ipys :: [(b, b)]
ipys = [(b, b)] -> [(b, b)]
forall a. HasCallStack => [a] -> [a]
init ([b] -> [(b, b)]
forall a. [a] -> [(a, a)]
pairs [b]
ys)
torus :: Graph g => [a] -> [b] -> g (a, b)
torus :: forall (g :: * -> *) a b. Graph g => [a] -> [b] -> g (a, b)
torus [a]
xs [b]
ys = [((a, b), [(a, b)])] -> g (a, b)
forall (g :: * -> *) a. Graph g => [(a, [a])] -> g a
stars [ ((a
a1, b
b1), [(a
a1, b
b2), (a
a2, b
b1)]) | (a
a1, a
a2) <- [a] -> [(a, a)]
forall a. [a] -> [(a, a)]
pairs [a]
xs, (b
b1, b
b2) <- [b] -> [(b, b)]
forall a. [a] -> [(a, a)]
pairs [b]
ys ]
pairs :: [a] -> [(a, a)]
pairs :: forall a. [a] -> [(a, a)]
pairs [] = []
pairs as :: [a]
as@(a
x:[a]
xs) = [a] -> [a] -> [(a, a)]
forall a b. [a] -> [b] -> [(a, b)]
zip [a]
as ([a]
xs [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ [a
x])
deBruijn :: Graph g => Int -> [a] -> g [a]
deBruijn :: forall (g :: * -> *) a. Graph g => Int -> [a] -> g [a]
deBruijn Int
0 [a]
_ = [a] -> [a] -> g [a]
forall (g :: * -> *) a. Graph g => a -> a -> g a
edge [] []
deBruijn Int
len [a]
alphabet = g (Either [a] [a])
skeleton g (Either [a] [a]) -> (Either [a] [a] -> g [a]) -> g [a]
forall a b. g a -> (a -> g b) -> g b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Either [a] [a] -> g [a]
expand
where
overlaps :: [[a]]
overlaps = (Int -> [a]) -> [Int] -> [[a]]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM ([a] -> Int -> [a]
forall a b. a -> b -> a
const [a]
alphabet) [Int
2..Int
len]
skeleton :: g (Either [a] [a])
skeleton = [(Either [a] [a], Either [a] [a])] -> g (Either [a] [a])
forall (g :: * -> *) a. Graph g => [(a, a)] -> g a
edges [ ([a] -> Either [a] [a]
forall a b. a -> Either a b
Left [a]
s, [a] -> Either [a] [a]
forall a b. b -> Either a b
Right [a]
s) | [a]
s <- [[a]]
overlaps ]
expand :: Either [a] [a] -> g [a]
expand Either [a] [a]
v = [[a]] -> g [a]
forall (g :: * -> *) a. Graph g => [a] -> g a
vertices [ ([a] -> [a]) -> ([a] -> [a]) -> Either [a] [a] -> [a]
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either ([a
a] [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++) ([a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ [a
a]) Either [a] [a]
v | a
a <- [a]
alphabet ]
induce :: Graph g => (a -> Bool) -> g a -> g a
induce :: forall (g :: * -> *) a. Graph g => (a -> Bool) -> g a -> g a
induce = (a -> Bool) -> g a -> g a
forall (m :: * -> *) a. MonadPlus m => (a -> Bool) -> m a -> m a
mfilter
removeVertex :: (Eq a, Graph g) => a -> g a -> g a
removeVertex :: forall a (g :: * -> *). (Eq a, Graph g) => a -> g a -> g a
removeVertex a
v = (a -> Bool) -> g a -> g a
forall (g :: * -> *) a. Graph g => (a -> Bool) -> g a -> g a
induce (a -> a -> Bool
forall a. Eq a => a -> a -> Bool
/= a
v)
replaceVertex :: (Eq a, Graph g) => a -> a -> g a -> g a
replaceVertex :: forall a (g :: * -> *). (Eq a, Graph g) => a -> a -> g a -> g a
replaceVertex a
u a
v = (a -> a) -> g a -> g a
forall a b. (a -> b) -> g a -> g b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((a -> a) -> g a -> g a) -> (a -> a) -> g a -> g a
forall a b. (a -> b) -> a -> b
$ \a
w -> if a
w a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
u then a
v else a
w
mergeVertices :: Graph g => (a -> Bool) -> a -> g a -> g a
mergeVertices :: forall (g :: * -> *) a. Graph g => (a -> Bool) -> a -> g a -> g a
mergeVertices a -> Bool
p a
v = (a -> a) -> g a -> g a
forall a b. (a -> b) -> g a -> g b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((a -> a) -> g a -> g a) -> (a -> a) -> g a -> g a
forall a b. (a -> b) -> a -> b
$ \a
w -> if a -> Bool
p a
w then a
v else a
w
splitVertex :: (Eq a, Graph g) => a -> [a] -> g a -> g a
splitVertex :: forall a (g :: * -> *). (Eq a, Graph g) => a -> [a] -> g a -> g a
splitVertex a
v [a]
us g a
g = g a
g g a -> (a -> g a) -> g a
forall a b. g a -> (a -> g b) -> g b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \a
w -> if a
w a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
v then [a] -> g a
forall (g :: * -> *) a. Graph g => [a] -> g a
vertices [a]
us else a -> g a
forall (g :: * -> *) a. Graph g => a -> g a
vertex a
w