module Algebra.Graph.AdjacencyMap (
AdjacencyMap, adjacencyMap,
empty, vertex, edge, overlay, connect, vertices, edges, overlays, connects,
isSubgraphOf,
isEmpty, hasVertex, hasEdge, vertexCount, edgeCount, vertexList, edgeList,
adjacencyList, vertexSet, edgeSet, preSet, postSet,
path, circuit, clique, biclique, star, stars, fromAdjacencySets, tree,
forest,
removeVertex, removeEdge, replaceVertex, mergeVertices, transpose, gmap,
induce, induceJust,
compose, box,
closure, reflexiveClosure, symmetricClosure, transitiveClosure,
consistent
) where
import Control.DeepSeq
import Data.List ((\\))
import Data.Map.Strict (Map)
import Data.Monoid
import Data.Set (Set)
import Data.String
import Data.Tree
import GHC.Generics
import qualified Data.Map.Strict as Map
import qualified Data.Maybe as Maybe
import qualified Data.Set as Set
newtype AdjacencyMap a = AM {
forall a. AdjacencyMap a -> Map a (Set a)
adjacencyMap :: Map a (Set a) } deriving (AdjacencyMap a -> AdjacencyMap a -> Bool
forall a. Eq a => AdjacencyMap a -> AdjacencyMap a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: AdjacencyMap a -> AdjacencyMap a -> Bool
$c/= :: forall a. Eq a => AdjacencyMap a -> AdjacencyMap a -> Bool
== :: AdjacencyMap a -> AdjacencyMap a -> Bool
$c== :: forall a. Eq a => AdjacencyMap a -> AdjacencyMap a -> Bool
Eq, forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (AdjacencyMap a) x -> AdjacencyMap a
forall a x. AdjacencyMap a -> Rep (AdjacencyMap a) x
$cto :: forall a x. Rep (AdjacencyMap a) x -> AdjacencyMap a
$cfrom :: forall a x. AdjacencyMap a -> Rep (AdjacencyMap a) x
Generic)
instance Ord a => Ord (AdjacencyMap a) where
compare :: AdjacencyMap a -> AdjacencyMap a -> Ordering
compare AdjacencyMap a
x AdjacencyMap a
y = forall a. Monoid a => [a] -> a
mconcat
[ forall a. Ord a => a -> a -> Ordering
compare (forall a. AdjacencyMap a -> Int
vertexCount AdjacencyMap a
x) (forall a. AdjacencyMap a -> Int
vertexCount AdjacencyMap a
y)
, forall a. Ord a => a -> a -> Ordering
compare (forall a. AdjacencyMap a -> Set a
vertexSet AdjacencyMap a
x) (forall a. AdjacencyMap a -> Set a
vertexSet AdjacencyMap a
y)
, forall a. Ord a => a -> a -> Ordering
compare (forall a. AdjacencyMap a -> Int
edgeCount AdjacencyMap a
x) (forall a. AdjacencyMap a -> Int
edgeCount AdjacencyMap a
y)
, forall a. Ord a => a -> a -> Ordering
compare (forall a. Eq a => AdjacencyMap a -> Set (a, a)
edgeSet AdjacencyMap a
x) (forall a. Eq a => AdjacencyMap a -> Set (a, a)
edgeSet AdjacencyMap a
y) ]
instance (Ord a, Show a) => Show (AdjacencyMap a) where
showsPrec :: Int -> AdjacencyMap a -> ShowS
showsPrec Int
p am :: AdjacencyMap a
am@(AM Map a (Set a)
m)
| forall (t :: * -> *) a. Foldable t => t a -> Bool
null [a]
vs = String -> ShowS
showString String
"empty"
| forall (t :: * -> *) a. Foldable t => t a -> Bool
null [(a, a)]
es = Bool -> ShowS -> ShowS
showParen (Int
p forall a. Ord a => a -> a -> Bool
> Int
10) forall a b. (a -> b) -> a -> b
$ forall {a}. Show a => [a] -> ShowS
vshow [a]
vs
| [a]
vs forall a. Eq a => a -> a -> Bool
== [a]
used = Bool -> ShowS -> ShowS
showParen (Int
p forall a. Ord a => a -> a -> Bool
> Int
10) forall a b. (a -> b) -> a -> b
$ forall {a} {a}. (Show a, Show a) => [(a, a)] -> ShowS
eshow [(a, a)]
es
| Bool
otherwise = Bool -> ShowS -> ShowS
showParen (Int
p forall a. Ord a => a -> a -> Bool
> Int
10) forall a b. (a -> b) -> a -> b
$ String -> ShowS
showString String
"overlay ("
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {a}. Show a => [a] -> ShowS
vshow ([a]
vs forall a. Eq a => [a] -> [a] -> [a]
\\ [a]
used) forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ShowS
showString String
") ("
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {a} {a}. (Show a, Show a) => [(a, a)] -> ShowS
eshow [(a, a)]
es forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ShowS
showString String
")"
where
vs :: [a]
vs = forall a. AdjacencyMap a -> [a]
vertexList AdjacencyMap a
am
es :: [(a, a)]
es = forall a. AdjacencyMap a -> [(a, a)]
edgeList AdjacencyMap a
am
vshow :: [a] -> ShowS
vshow [a
x] = String -> ShowS
showString String
"vertex " forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Show a => Int -> a -> ShowS
showsPrec Int
11 a
x
vshow [a]
xs = String -> ShowS
showString String
"vertices " forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Show a => Int -> a -> ShowS
showsPrec Int
11 [a]
xs
eshow :: [(a, a)] -> ShowS
eshow [(a
x, a
y)] = String -> ShowS
showString String
"edge " forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Show a => Int -> a -> ShowS
showsPrec Int
11 a
x forall b c a. (b -> c) -> (a -> b) -> a -> c
.
String -> ShowS
showString String
" " forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Show a => Int -> a -> ShowS
showsPrec Int
11 a
y
eshow [(a, a)]
xs = String -> ShowS
showString String
"edges " forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Show a => Int -> a -> ShowS
showsPrec Int
11 [(a, a)]
xs
used :: [a]
used = forall a. Set a -> [a]
Set.toAscList (forall a. Ord a => Map a (Set a) -> Set a
referredToVertexSet Map a (Set a)
m)
instance (Ord a, Num a) => Num (AdjacencyMap a) where
fromInteger :: Integer -> AdjacencyMap a
fromInteger = forall a. a -> AdjacencyMap a
vertex forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Num a => Integer -> a
fromInteger
+ :: AdjacencyMap a -> AdjacencyMap a -> AdjacencyMap a
(+) = forall a.
Ord a =>
AdjacencyMap a -> AdjacencyMap a -> AdjacencyMap a
overlay
* :: AdjacencyMap a -> AdjacencyMap a -> AdjacencyMap a
(*) = forall a.
Ord a =>
AdjacencyMap a -> AdjacencyMap a -> AdjacencyMap a
connect
signum :: AdjacencyMap a -> AdjacencyMap a
signum = forall a b. a -> b -> a
const forall a. AdjacencyMap a
empty
abs :: AdjacencyMap a -> AdjacencyMap a
abs = forall a. a -> a
id
negate :: AdjacencyMap a -> AdjacencyMap a
negate = forall a. a -> a
id
instance IsString a => IsString (AdjacencyMap a) where
fromString :: String -> AdjacencyMap a
fromString = forall a. a -> AdjacencyMap a
vertex forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. IsString a => String -> a
fromString
instance NFData a => NFData (AdjacencyMap a) where
rnf :: AdjacencyMap a -> ()
rnf (AM Map a (Set a)
a) = forall a. NFData a => a -> ()
rnf Map a (Set a)
a
instance Ord a => Semigroup (AdjacencyMap a) where
<> :: AdjacencyMap a -> AdjacencyMap a -> AdjacencyMap a
(<>) = forall a.
Ord a =>
AdjacencyMap a -> AdjacencyMap a -> AdjacencyMap a
overlay
instance Ord a => Monoid (AdjacencyMap a) where
mempty :: AdjacencyMap a
mempty = forall a. AdjacencyMap a
empty
empty :: AdjacencyMap a
empty :: forall a. AdjacencyMap a
empty = forall a. Map a (Set a) -> AdjacencyMap a
AM forall k a. Map k a
Map.empty
{-# NOINLINE [1] empty #-}
vertex :: a -> AdjacencyMap a
vertex :: forall a. a -> AdjacencyMap a
vertex a
x = forall a. Map a (Set a) -> AdjacencyMap a
AM forall a b. (a -> b) -> a -> b
$ forall k a. k -> a -> Map k a
Map.singleton a
x forall a. Set a
Set.empty
{-# NOINLINE [1] vertex #-}
edge :: Ord a => a -> a -> AdjacencyMap a
edge :: forall a. Ord a => a -> a -> AdjacencyMap a
edge a
x a
y | a
x forall a. Eq a => a -> a -> Bool
== a
y = forall a. Map a (Set a) -> AdjacencyMap a
AM forall a b. (a -> b) -> a -> b
$ forall k a. k -> a -> Map k a
Map.singleton a
x (forall a. a -> Set a
Set.singleton a
y)
| Bool
otherwise = forall a. Map a (Set a) -> AdjacencyMap a
AM forall a b. (a -> b) -> a -> b
$ forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList [(a
x, forall a. a -> Set a
Set.singleton a
y), (a
y, forall a. Set a
Set.empty)]
overlay :: Ord a => AdjacencyMap a -> AdjacencyMap a -> AdjacencyMap a
overlay :: forall a.
Ord a =>
AdjacencyMap a -> AdjacencyMap a -> AdjacencyMap a
overlay (AM Map a (Set a)
x) (AM Map a (Set a)
y) = forall a. Map a (Set a) -> AdjacencyMap a
AM forall a b. (a -> b) -> a -> b
$ forall k a. Ord k => (a -> a -> a) -> Map k a -> Map k a -> Map k a
Map.unionWith forall a. Ord a => Set a -> Set a -> Set a
Set.union Map a (Set a)
x Map a (Set a)
y
{-# NOINLINE [1] overlay #-}
connect :: Ord a => AdjacencyMap a -> AdjacencyMap a -> AdjacencyMap a
connect :: forall a.
Ord a =>
AdjacencyMap a -> AdjacencyMap a -> AdjacencyMap a
connect (AM Map a (Set a)
x) (AM Map a (Set a)
y) = forall a. Map a (Set a) -> AdjacencyMap a
AM forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) k a.
(Foldable f, Ord k) =>
(a -> a -> a) -> f (Map k a) -> Map k a
Map.unionsWith forall a. Ord a => Set a -> Set a -> Set a
Set.union
[ Map a (Set a)
x, Map a (Set a)
y, forall k a. (k -> a) -> Set k -> Map k a
Map.fromSet (forall a b. a -> b -> a
const forall a b. (a -> b) -> a -> b
$ forall k a. Map k a -> Set k
Map.keysSet Map a (Set a)
y) (forall k a. Map k a -> Set k
Map.keysSet Map a (Set a)
x) ]
{-# NOINLINE [1] connect #-}
vertices :: Ord a => [a] -> AdjacencyMap a
vertices :: forall a. Ord a => [a] -> AdjacencyMap a
vertices = forall a. Map a (Set a) -> AdjacencyMap a
AM forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map (, forall a. Set a
Set.empty)
{-# NOINLINE [1] vertices #-}
edges :: Ord a => [(a, a)] -> AdjacencyMap a
edges :: forall a. Ord a => [(a, a)] -> AdjacencyMap a
edges = forall a. Ord a => [(a, Set a)] -> AdjacencyMap a
fromAdjacencySets forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. a -> Set a
Set.singleton)
overlays :: Ord a => [AdjacencyMap a] -> AdjacencyMap a
overlays :: forall a. Ord a => [AdjacencyMap a] -> AdjacencyMap a
overlays = forall a. Map a (Set a) -> AdjacencyMap a
AM forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) k a.
(Foldable f, Ord k) =>
(a -> a -> a) -> f (Map k a) -> Map k a
Map.unionsWith forall a. Ord a => Set a -> Set a -> Set a
Set.union forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map forall a. AdjacencyMap a -> Map a (Set a)
adjacencyMap
{-# NOINLINE overlays #-}
connects :: Ord a => [AdjacencyMap a] -> AdjacencyMap a
connects :: forall a. Ord a => [AdjacencyMap a] -> AdjacencyMap a
connects = forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr forall a.
Ord a =>
AdjacencyMap a -> AdjacencyMap a -> AdjacencyMap a
connect forall a. AdjacencyMap a
empty
{-# NOINLINE connects #-}
isSubgraphOf :: Ord a => AdjacencyMap a -> AdjacencyMap a -> Bool
isSubgraphOf :: forall a. Ord a => AdjacencyMap a -> AdjacencyMap a -> Bool
isSubgraphOf (AM Map a (Set a)
x) (AM Map a (Set a)
y) = forall k a b.
Ord k =>
(a -> b -> Bool) -> Map k a -> Map k b -> Bool
Map.isSubmapOfBy forall a. Ord a => Set a -> Set a -> Bool
Set.isSubsetOf Map a (Set a)
x Map a (Set a)
y
isEmpty :: AdjacencyMap a -> Bool
isEmpty :: forall a. AdjacencyMap a -> Bool
isEmpty = forall k a. Map k a -> Bool
Map.null forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. AdjacencyMap a -> Map a (Set a)
adjacencyMap
hasVertex :: Ord a => a -> AdjacencyMap a -> Bool
hasVertex :: forall a. Ord a => a -> AdjacencyMap a -> Bool
hasVertex a
x = forall k a. Ord k => k -> Map k a -> Bool
Map.member a
x forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. AdjacencyMap a -> Map a (Set a)
adjacencyMap
hasEdge :: Ord a => a -> a -> AdjacencyMap a -> Bool
hasEdge :: forall a. Ord a => a -> a -> AdjacencyMap a -> Bool
hasEdge a
u a
v (AM Map a (Set a)
m) = case forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup a
u Map a (Set a)
m of
Maybe (Set a)
Nothing -> Bool
False
Just Set a
vs -> forall a. Ord a => a -> Set a -> Bool
Set.member a
v Set a
vs
vertexCount :: AdjacencyMap a -> Int
vertexCount :: forall a. AdjacencyMap a -> Int
vertexCount = forall k a. Map k a -> Int
Map.size forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. AdjacencyMap a -> Map a (Set a)
adjacencyMap
edgeCount :: AdjacencyMap a -> Int
edgeCount :: forall a. AdjacencyMap a -> Int
edgeCount = forall a. Sum a -> a
getSum forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap (forall a. a -> Sum a
Sum forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Set a -> Int
Set.size) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. AdjacencyMap a -> Map a (Set a)
adjacencyMap
vertexList :: AdjacencyMap a -> [a]
vertexList :: forall a. AdjacencyMap a -> [a]
vertexList = forall k a. Map k a -> [k]
Map.keys forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. AdjacencyMap a -> Map a (Set a)
adjacencyMap
edgeList :: AdjacencyMap a -> [(a, a)]
edgeList :: forall a. AdjacencyMap a -> [(a, a)]
edgeList (AM Map a (Set a)
m) = [ (a
x, a
y) | (a
x, Set a
ys) <- forall k a. Map k a -> [(k, a)]
Map.toAscList Map a (Set a)
m, a
y <- forall a. Set a -> [a]
Set.toAscList Set a
ys ]
{-# INLINE edgeList #-}
vertexSet :: AdjacencyMap a -> Set a
vertexSet :: forall a. AdjacencyMap a -> Set a
vertexSet = forall k a. Map k a -> Set k
Map.keysSet forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. AdjacencyMap a -> Map a (Set a)
adjacencyMap
edgeSet :: Eq a => AdjacencyMap a -> Set (a, a)
edgeSet :: forall a. Eq a => AdjacencyMap a -> Set (a, a)
edgeSet = forall a. Eq a => [a] -> Set a
Set.fromAscList forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. AdjacencyMap a -> [(a, a)]
edgeList
adjacencyList :: AdjacencyMap a -> [(a, [a])]
adjacencyList :: forall a. AdjacencyMap a -> [(a, [a])]
adjacencyList = forall a b. (a -> b) -> [a] -> [b]
map (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Set a -> [a]
Set.toAscList) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k a. Map k a -> [(k, a)]
Map.toAscList forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. AdjacencyMap a -> Map a (Set a)
adjacencyMap
preSet :: Ord a => a -> AdjacencyMap a -> Set a
preSet :: forall a. Ord a => a -> AdjacencyMap a -> Set a
preSet a
x = forall a. Eq a => [a] -> Set a
Set.fromAscList forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map forall a b. (a, b) -> a
fst forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> Bool) -> [a] -> [a]
filter (a, Set a) -> Bool
p forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k a. Map k a -> [(k, a)]
Map.toAscList forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. AdjacencyMap a -> Map a (Set a)
adjacencyMap
where
p :: (a, Set a) -> Bool
p (a
_, Set a
set) = a
x forall a. Ord a => a -> Set a -> Bool
`Set.member` Set a
set
postSet :: Ord a => a -> AdjacencyMap a -> Set a
postSet :: forall a. Ord a => a -> AdjacencyMap a -> Set a
postSet a
x = forall k a. Ord k => a -> k -> Map k a -> a
Map.findWithDefault forall a. Set a
Set.empty a
x forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. AdjacencyMap a -> Map a (Set a)
adjacencyMap
path :: Ord a => [a] -> AdjacencyMap a
path :: forall a. Ord a => [a] -> AdjacencyMap a
path [a]
xs = case [a]
xs of [] -> forall a. AdjacencyMap a
empty
[a
x] -> forall a. a -> AdjacencyMap a
vertex a
x
(a
_:[a]
ys) -> forall a. Ord a => [(a, a)] -> AdjacencyMap a
edges (forall a b. [a] -> [b] -> [(a, b)]
zip [a]
xs [a]
ys)
circuit :: Ord a => [a] -> AdjacencyMap a
circuit :: forall a. Ord a => [a] -> AdjacencyMap a
circuit [] = forall a. AdjacencyMap a
empty
circuit (a
x:[a]
xs) = forall a. Ord a => [a] -> AdjacencyMap a
path forall a b. (a -> b) -> a -> b
$ [a
x] forall a. [a] -> [a] -> [a]
++ [a]
xs forall a. [a] -> [a] -> [a]
++ [a
x]
clique :: Ord a => [a] -> AdjacencyMap a
clique :: forall a. Ord a => [a] -> AdjacencyMap a
clique = forall a. Ord a => [(a, Set a)] -> AdjacencyMap a
fromAdjacencySets forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a, b) -> a
fst forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {a}. Ord a => [a] -> ([(a, Set a)], Set a)
go
where
go :: [a] -> ([(a, Set a)], Set a)
go [] = ([], forall a. Set a
Set.empty)
go (a
x:[a]
xs) = let ([(a, Set a)]
res, Set a
set) = [a] -> ([(a, Set a)], Set a)
go [a]
xs in ((a
x, Set a
set) forall a. a -> [a] -> [a]
: [(a, Set a)]
res, forall a. Ord a => a -> Set a -> Set a
Set.insert a
x Set a
set)
{-# NOINLINE [1] clique #-}
biclique :: Ord a => [a] -> [a] -> AdjacencyMap a
biclique :: forall a. Ord a => [a] -> [a] -> AdjacencyMap a
biclique [a]
xs [a]
ys = forall a. Map a (Set a) -> AdjacencyMap a
AM forall a b. (a -> b) -> a -> b
$ forall k a. (k -> a) -> Set k -> Map k a
Map.fromSet a -> Set a
adjacent (Set a
x forall a. Ord a => Set a -> Set a -> Set a
`Set.union` Set a
y)
where
x :: Set a
x = forall a. Ord a => [a] -> Set a
Set.fromList [a]
xs
y :: Set a
y = forall a. Ord a => [a] -> Set a
Set.fromList [a]
ys
adjacent :: a -> Set a
adjacent a
v = if a
v forall a. Ord a => a -> Set a -> Bool
`Set.member` Set a
x then Set a
y else forall a. Set a
Set.empty
star :: Ord a => a -> [a] -> AdjacencyMap a
star :: forall a. Ord a => a -> [a] -> AdjacencyMap a
star a
x [] = forall a. a -> AdjacencyMap a
vertex a
x
star a
x [a]
ys = forall a.
Ord a =>
AdjacencyMap a -> AdjacencyMap a -> AdjacencyMap a
connect (forall a. a -> AdjacencyMap a
vertex a
x) (forall a. Ord a => [a] -> AdjacencyMap a
vertices [a]
ys)
{-# INLINE star #-}
stars :: Ord a => [(a, [a])] -> AdjacencyMap a
stars :: forall a. Ord a => [(a, [a])] -> AdjacencyMap a
stars = forall a. Ord a => [(a, Set a)] -> AdjacencyMap a
fromAdjacencySets forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Ord a => [a] -> Set a
Set.fromList)
fromAdjacencySets :: Ord a => [(a, Set a)] -> AdjacencyMap a
fromAdjacencySets :: forall a. Ord a => [(a, Set a)] -> AdjacencyMap a
fromAdjacencySets [(a, Set a)]
ss = forall a. Map a (Set a) -> AdjacencyMap a
AM forall a b. (a -> b) -> a -> b
$ forall k a. Ord k => (a -> a -> a) -> Map k a -> Map k a -> Map k a
Map.unionWith forall a. Ord a => Set a -> Set a -> Set a
Set.union Map a (Set a)
vs Map a (Set a)
es
where
vs :: Map a (Set a)
vs = 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) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. (Foldable f, Ord a) => f (Set a) -> Set a
Set.unions forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map forall a b. (a, b) -> b
snd [(a, Set a)]
ss
es :: Map a (Set a)
es = forall k a. Ord k => (a -> a -> a) -> [(k, a)] -> Map k a
Map.fromListWith forall a. Ord a => Set a -> Set a -> Set a
Set.union [(a, Set a)]
ss
tree :: Ord a => Tree a -> AdjacencyMap a
tree :: forall a. Ord a => Tree a -> AdjacencyMap a
tree (Node a
x []) = forall a. a -> AdjacencyMap a
vertex a
x
tree (Node a
x [Tree a]
f ) = forall a. Ord a => a -> [a] -> AdjacencyMap a
star a
x (forall a b. (a -> b) -> [a] -> [b]
map forall a. Tree a -> a
rootLabel [Tree a]
f)
forall a.
Ord a =>
AdjacencyMap a -> AdjacencyMap a -> AdjacencyMap a
`overlay` forall a. Ord a => Forest a -> AdjacencyMap a
forest (forall a. (a -> Bool) -> [a] -> [a]
filter (Bool -> Bool
not forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) a. Foldable t => t a -> Bool
null forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Tree a -> [Tree a]
subForest) [Tree a]
f)
forest :: Ord a => Forest a -> AdjacencyMap a
forest :: forall a. Ord a => Forest a -> AdjacencyMap a
forest = forall a. Ord a => [AdjacencyMap a] -> AdjacencyMap a
overlays forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map forall a. Ord a => Tree a -> AdjacencyMap a
tree
removeVertex :: Ord a => a -> AdjacencyMap a -> AdjacencyMap a
removeVertex :: forall a. Ord a => a -> AdjacencyMap a -> AdjacencyMap a
removeVertex a
x = forall a. Map a (Set a) -> AdjacencyMap a
AM forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b k. (a -> b) -> Map k a -> Map k b
Map.map (forall a. Ord a => a -> Set a -> Set a
Set.delete a
x) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k a. Ord k => k -> Map k a -> Map k a
Map.delete a
x forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. AdjacencyMap a -> Map a (Set a)
adjacencyMap
removeEdge :: Ord a => a -> a -> AdjacencyMap a -> AdjacencyMap a
removeEdge :: forall a. Ord a => a -> a -> AdjacencyMap a -> AdjacencyMap a
removeEdge a
x a
y = forall a. Map a (Set a) -> AdjacencyMap a
AM forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k a. Ord k => (a -> a) -> k -> Map k a -> Map k a
Map.adjust (forall a. Ord a => a -> Set a -> Set a
Set.delete a
y) a
x forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. AdjacencyMap a -> Map a (Set a)
adjacencyMap
replaceVertex :: Ord a => a -> a -> AdjacencyMap a -> AdjacencyMap a
replaceVertex :: forall a. Ord a => a -> a -> AdjacencyMap a -> AdjacencyMap a
replaceVertex a
u a
v = forall a b.
(Ord a, Ord b) =>
(a -> b) -> AdjacencyMap a -> AdjacencyMap b
gmap forall a b. (a -> b) -> a -> b
$ \a
w -> if a
w forall a. Eq a => a -> a -> Bool
== a
u then a
v else a
w
mergeVertices :: Ord a => (a -> Bool) -> a -> AdjacencyMap a -> AdjacencyMap a
mergeVertices :: forall a.
Ord a =>
(a -> Bool) -> a -> AdjacencyMap a -> AdjacencyMap a
mergeVertices a -> Bool
p a
v = forall a b.
(Ord a, Ord b) =>
(a -> b) -> AdjacencyMap a -> AdjacencyMap b
gmap forall a b. (a -> b) -> a -> b
$ \a
u -> if a -> Bool
p a
u then a
v else a
u
transpose :: Ord a => AdjacencyMap a -> AdjacencyMap a
transpose :: forall a. Ord a => AdjacencyMap a -> AdjacencyMap a
transpose (AM Map a (Set a)
m) = forall a. Map a (Set a) -> AdjacencyMap a
AM forall a b. (a -> b) -> a -> b
$ forall k a b. (k -> a -> b -> b) -> b -> Map k a -> b
Map.foldrWithKey forall {k} {a}.
(Ord k, Ord a) =>
a -> Set k -> Map k (Set a) -> Map k (Set a)
combine Map a (Set a)
vs Map a (Set a)
m
where
combine :: a -> Set k -> Map k (Set a) -> Map k (Set a)
combine a
v Set k
es = forall k a. Ord k => (a -> a -> a) -> Map k a -> Map k a -> Map k a
Map.unionWith forall a. Ord a => Set a -> Set a -> Set a
Set.union (forall k a. (k -> a) -> Set k -> Map k a
Map.fromSet (forall a b. a -> b -> a
const forall a b. (a -> b) -> a -> b
$ forall a. a -> Set a
Set.singleton a
v) Set k
es)
vs :: Map a (Set a)
vs = 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) (forall k a. Map k a -> Set k
Map.keysSet Map a (Set a)
m)
{-# NOINLINE [1] transpose #-}
{-# RULES
"transpose/empty" transpose empty = empty
"transpose/vertex" forall x. transpose (vertex x) = vertex x
"transpose/overlay" forall g1 g2. transpose (overlay g1 g2) = overlay (transpose g1) (transpose g2)
"transpose/connect" forall g1 g2. transpose (connect g1 g2) = connect (transpose g2) (transpose g1)
"transpose/overlays" forall xs. transpose (overlays xs) = overlays (map transpose xs)
"transpose/connects" forall xs. transpose (connects xs) = connects (reverse (map transpose xs))
"transpose/vertices" forall xs. transpose (vertices xs) = vertices xs
"transpose/clique" forall xs. transpose (clique xs) = clique (reverse xs)
#-}
gmap :: (Ord a, Ord b) => (a -> b) -> AdjacencyMap a -> AdjacencyMap b
gmap :: forall a b.
(Ord a, Ord b) =>
(a -> b) -> AdjacencyMap a -> AdjacencyMap b
gmap a -> b
f = forall a. Map a (Set a) -> AdjacencyMap a
AM forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b k. (a -> b) -> Map k a -> Map k b
Map.map (forall b a. Ord b => (a -> b) -> Set a -> Set b
Set.map a -> b
f) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k2 a k1.
Ord k2 =>
(a -> a -> a) -> (k1 -> k2) -> Map k1 a -> Map k2 a
Map.mapKeysWith forall a. Ord a => Set a -> Set a -> Set a
Set.union a -> b
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. AdjacencyMap a -> Map a (Set a)
adjacencyMap
induce :: (a -> Bool) -> AdjacencyMap a -> AdjacencyMap a
induce :: forall a. (a -> Bool) -> AdjacencyMap a -> AdjacencyMap a
induce a -> Bool
p = forall a. Map a (Set a) -> AdjacencyMap a
AM forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b k. (a -> b) -> Map k a -> Map k b
Map.map (forall a. (a -> Bool) -> Set a -> Set a
Set.filter a -> Bool
p) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k a. (k -> a -> Bool) -> Map k a -> Map k a
Map.filterWithKey (\a
k Set a
_ -> a -> Bool
p a
k) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. AdjacencyMap a -> Map a (Set a)
adjacencyMap
induceJust :: Ord a => AdjacencyMap (Maybe a) -> AdjacencyMap a
induceJust :: forall a. Ord a => AdjacencyMap (Maybe a) -> AdjacencyMap a
induceJust = forall a. Map a (Set a) -> AdjacencyMap a
AM forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b k. (a -> b) -> Map k a -> Map k b
Map.map Set (Maybe a) -> Set a
catMaybesSet forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {a}. Map (Maybe a) a -> Map a a
catMaybesMap forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. AdjacencyMap a -> Map a (Set a)
adjacencyMap
where
catMaybesSet :: Set (Maybe a) -> Set a
catMaybesSet = forall a b. (a -> b) -> Set a -> Set b
Set.mapMonotonic forall a. HasCallStack => Maybe a -> a
Maybe.fromJust forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Ord a => a -> Set a -> Set a
Set.delete forall a. Maybe a
Nothing
catMaybesMap :: Map (Maybe a) a -> Map a a
catMaybesMap = forall k1 k2 a. (k1 -> k2) -> Map k1 a -> Map k2 a
Map.mapKeysMonotonic forall a. HasCallStack => Maybe a -> a
Maybe.fromJust forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k a. Ord k => k -> Map k a -> Map k a
Map.delete forall a. Maybe a
Nothing
compose :: Ord a => AdjacencyMap a -> AdjacencyMap a -> AdjacencyMap a
compose :: forall a.
Ord a =>
AdjacencyMap a -> AdjacencyMap a -> AdjacencyMap a
compose AdjacencyMap a
x AdjacencyMap a
y = forall a. Ord a => [(a, Set a)] -> AdjacencyMap a
fromAdjacencySets
[ (a
t, Set a
ys) | a
v <- forall a. Set a -> [a]
Set.toList Set a
vs, let ys :: Set a
ys = forall a. Ord a => a -> AdjacencyMap a -> Set a
postSet a
v AdjacencyMap a
y, Bool -> Bool
not (forall a. Set a -> Bool
Set.null Set a
ys)
, a
t <- forall a. Set a -> [a]
Set.toList (forall a. Ord a => a -> AdjacencyMap a -> Set a
postSet a
v AdjacencyMap a
tx) ]
where
tx :: AdjacencyMap a
tx = forall a. Ord a => AdjacencyMap a -> AdjacencyMap a
transpose AdjacencyMap a
x
vs :: Set a
vs = forall a. AdjacencyMap a -> Set a
vertexSet AdjacencyMap a
x forall a. Ord a => Set a -> Set a -> Set a
`Set.union` forall a. AdjacencyMap a -> Set a
vertexSet AdjacencyMap a
y
box :: (Ord a, Ord b) => AdjacencyMap a -> AdjacencyMap b -> AdjacencyMap (a, b)
box :: forall a b.
(Ord a, Ord b) =>
AdjacencyMap a -> AdjacencyMap b -> AdjacencyMap (a, b)
box (AM Map a (Set a)
x) (AM Map b (Set b)
y) = forall a.
Ord a =>
AdjacencyMap a -> AdjacencyMap a -> AdjacencyMap a
overlay (forall a. Map a (Set a) -> AdjacencyMap a
AM forall a b. (a -> b) -> a -> b
$ forall k a. Eq k => [(k, a)] -> Map k a
Map.fromAscList [((a, b), Set (a, b))]
xs) (forall a. Map a (Set a) -> AdjacencyMap a
AM forall a b. (a -> b) -> a -> b
$ forall k a. Eq k => [(k, a)] -> Map k a
Map.fromAscList [((a, b), Set (a, b))]
ys)
where
xs :: [((a, b), Set (a, b))]
xs = do (a
a, Set a
as) <- forall k a. Map k a -> [(k, a)]
Map.toAscList Map a (Set a)
x
b
b <- forall a. Set a -> [a]
Set.toAscList (forall k a. Map k a -> Set k
Map.keysSet Map b (Set b)
y)
forall (m :: * -> *) a. Monad m => a -> m a
return ((a
a, b
b), forall a b. (a -> b) -> Set a -> Set b
Set.mapMonotonic (,b
b) Set a
as)
ys :: [((a, b), Set (a, b))]
ys = do a
a <- forall a. Set a -> [a]
Set.toAscList (forall k a. Map k a -> Set k
Map.keysSet Map a (Set a)
x)
(b
b, Set b
bs) <- forall k a. Map k a -> [(k, a)]
Map.toAscList Map b (Set b)
y
forall (m :: * -> *) a. Monad m => a -> m a
return ((a
a, b
b), forall a b. (a -> b) -> Set a -> Set b
Set.mapMonotonic (a
a,) Set b
bs)
closure :: Ord a => AdjacencyMap a -> AdjacencyMap a
closure :: forall a. Ord a => AdjacencyMap a -> AdjacencyMap a
closure = forall a. Ord a => AdjacencyMap a -> AdjacencyMap a
reflexiveClosure forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Ord a => AdjacencyMap a -> AdjacencyMap a
transitiveClosure
reflexiveClosure :: Ord a => AdjacencyMap a -> AdjacencyMap a
reflexiveClosure :: forall a. Ord a => AdjacencyMap a -> AdjacencyMap a
reflexiveClosure (AM Map a (Set a)
m) = forall a. Map a (Set a) -> AdjacencyMap a
AM forall a b. (a -> b) -> a -> b
$ forall k a b. (k -> a -> b) -> Map k a -> Map k b
Map.mapWithKey forall a. Ord a => a -> Set a -> Set a
Set.insert Map a (Set a)
m
symmetricClosure :: Ord a => AdjacencyMap a -> AdjacencyMap a
symmetricClosure :: forall a. Ord a => AdjacencyMap a -> AdjacencyMap a
symmetricClosure AdjacencyMap a
m = forall a.
Ord a =>
AdjacencyMap a -> AdjacencyMap a -> AdjacencyMap a
overlay AdjacencyMap a
m (forall a. Ord a => AdjacencyMap a -> AdjacencyMap a
transpose AdjacencyMap a
m)
transitiveClosure :: Ord a => AdjacencyMap a -> AdjacencyMap a
transitiveClosure :: forall a. Ord a => AdjacencyMap a -> AdjacencyMap a
transitiveClosure AdjacencyMap a
old
| AdjacencyMap a
old forall a. Eq a => a -> a -> Bool
== AdjacencyMap a
new = AdjacencyMap a
old
| Bool
otherwise = forall a. Ord a => AdjacencyMap a -> AdjacencyMap a
transitiveClosure AdjacencyMap a
new
where
new :: AdjacencyMap a
new = forall a.
Ord a =>
AdjacencyMap a -> AdjacencyMap a -> AdjacencyMap a
overlay AdjacencyMap a
old (AdjacencyMap a
old forall a.
Ord a =>
AdjacencyMap a -> AdjacencyMap a -> AdjacencyMap a
`compose` AdjacencyMap a
old)
consistent :: Ord a => AdjacencyMap a -> Bool
consistent :: forall a. Ord a => AdjacencyMap a -> Bool
consistent (AM Map a (Set a)
m) = forall a. Ord a => Map a (Set a) -> Set a
referredToVertexSet Map a (Set a)
m forall a. Ord a => Set a -> Set a -> Bool
`Set.isSubsetOf` forall k a. Map k a -> Set k
Map.keysSet Map a (Set a)
m
referredToVertexSet :: Ord a => Map a (Set a) -> Set a
referredToVertexSet :: forall a. Ord a => Map a (Set a) -> Set a
referredToVertexSet Map a (Set a)
m = 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
[ [a
x, a
y] | (a
x, Set a
ys) <- forall k a. Map k a -> [(k, a)]
Map.toAscList Map a (Set a)
m, a
y <- forall a. Set a -> [a]
Set.toAscList Set a
ys ]