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