module Cauldron.Graph
(
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 Data.List ((\\))
import Data.Map.Strict (Map)
import Data.Map.Strict qualified as Map
import Data.Maybe qualified as Maybe
import Data.Monoid
import Data.Set (Set)
import Data.Set qualified as Set
import Data.String
import Data.Tree (Forest, Tree (..))
import GHC.Generics
newtype AdjacencyMap a = AM
{
forall a. 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
$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
/= :: 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
$cfrom :: forall a x. AdjacencyMap a -> Rep (AdjacencyMap a) x
from :: forall x. AdjacencyMap a -> Rep (AdjacencyMap a) x
$cto :: forall a x. Rep (AdjacencyMap a) x -> AdjacencyMap a
to :: forall x. Rep (AdjacencyMap a) x -> AdjacencyMap a
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 a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [a]
vs = String -> ShowS
showString String
"empty"
| [(a, a)] -> Bool
forall 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 (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 :: forall a. 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 :: forall a. 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 :: forall a. Ord a => 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 :: forall a.
Ord a =>
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 :: forall a.
Ord a =>
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 :: forall a. Ord a => [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 :: forall a. Ord a => [(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 a b. (a -> b) -> (a, a) -> (a, b)
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 :: forall a. Ord a => [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 :: forall a. Ord a => [AdjacencyMap a] -> AdjacencyMap a
connects = (AdjacencyMap a -> AdjacencyMap a -> AdjacencyMap a)
-> AdjacencyMap a -> [AdjacencyMap a] -> AdjacencyMap a
forall a b. (a -> b -> b) -> b -> [a] -> b
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 :: forall a. Ord a => 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 :: forall a. 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 :: forall a. Ord a => 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 :: forall a. Ord a => 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 :: forall a. 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 :: forall a. 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 m a. Monoid m => (a -> m) -> Map a a -> m
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 :: forall a. 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 :: forall a. 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 :: forall a. 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 :: forall a. Eq a => 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 :: forall a. 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 a b. (a -> b) -> (a, a) -> (a, b)
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 :: forall a. Ord a => 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
forall {a}. (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 :: forall a. Ord a => 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 :: forall a. Ord a => [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 :: forall a. Ord a => [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 :: forall a. Ord a => [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 :: forall a. Ord a => [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 :: forall a. Ord a => 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 :: forall a. Ord a => [(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 a b. (a -> b) -> (a, a) -> (a, b)
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 :: forall a. Ord a => [(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)
forall {a}. 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 :: forall a. Ord a => 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 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 :: (Ord a) => Forest a -> AdjacencyMap a
forest :: forall a. Ord a => 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 :: forall a. Ord a => 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 :: forall a. Ord a => 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 :: forall a. Ord a => 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 :: forall a.
Ord a =>
(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 :: forall a. Ord a => 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)
forall {a}. 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 :: forall a b.
(Ord a, Ord b) =>
(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 :: forall a. (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 :: forall a. Ord a => 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 :: forall a.
Ord a =>
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 :: 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) = 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 a. a -> [a]
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 a. a -> [a]
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 :: forall a. Ord a => 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 :: forall a. Ord a => 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 :: forall a. Ord a => 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 :: forall a. Ord a => 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 :: forall a. Ord a => 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 :: forall a. Ord a => 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]