module Algebra.Graph.Bipartite.AdjacencyMap (
AdjacencyMap, leftAdjacencyMap, rightAdjacencyMap,
empty, leftVertex, rightVertex, vertex, edge, overlay, connect, vertices,
edges, overlays, connects, swap,
toBipartite, toBipartiteWith, fromBipartite, fromBipartiteWith,
isEmpty, hasLeftVertex, hasRightVertex, hasVertex, hasEdge, leftVertexCount,
rightVertexCount, vertexCount, edgeCount, leftVertexList, rightVertexList,
vertexList, edgeList, leftVertexSet, rightVertexSet, vertexSet, edgeSet,
leftAdjacencyList, rightAdjacencyList,
List (..), evenList, oddList, path, circuit, biclique, star, stars, mesh,
removeLeftVertex, removeRightVertex, removeEdge, bimap,
box, boxWith,
consistent
) where
import Control.Monad
import Control.Monad.Trans.Maybe
import Control.Monad.State
import Data.Either
import Data.Foldable (asum)
import Data.List ((\\), sort)
import Data.Map.Strict (Map)
import Data.Maybe
import Data.Set (Set)
import GHC.Exts (IsList(..))
import GHC.Generics
import qualified Algebra.Graph as G
import qualified Algebra.Graph.AdjacencyMap as AM
import qualified Data.Map.Strict as Map
import qualified Data.Set as Set
import qualified Data.Tuple
data AdjacencyMap a b = BAM {
AdjacencyMap a b -> Map a (Set b)
leftAdjacencyMap :: Map a (Set b),
AdjacencyMap a b -> Map b (Set a)
rightAdjacencyMap :: Map b (Set a)
} deriving (forall x. AdjacencyMap a b -> Rep (AdjacencyMap a b) x)
-> (forall x. Rep (AdjacencyMap a b) x -> AdjacencyMap a b)
-> Generic (AdjacencyMap a b)
forall x. Rep (AdjacencyMap a b) x -> AdjacencyMap a b
forall x. AdjacencyMap a b -> Rep (AdjacencyMap a b) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a b x. Rep (AdjacencyMap a b) x -> AdjacencyMap a b
forall a b x. AdjacencyMap a b -> Rep (AdjacencyMap a b) x
$cto :: forall a b x. Rep (AdjacencyMap a b) x -> AdjacencyMap a b
$cfrom :: forall a b x. AdjacencyMap a b -> Rep (AdjacencyMap a b) x
Generic
instance (Ord a, Ord b, Num b) => Num (AdjacencyMap a b) where
fromInteger :: Integer -> AdjacencyMap a b
fromInteger = b -> AdjacencyMap a b
forall b a. b -> AdjacencyMap a b
rightVertex (b -> AdjacencyMap a b)
-> (Integer -> b) -> Integer -> AdjacencyMap a b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> b
forall a. Num a => Integer -> a
fromInteger
+ :: AdjacencyMap a b -> AdjacencyMap a b -> AdjacencyMap a b
(+) = AdjacencyMap a b -> AdjacencyMap a b -> AdjacencyMap a b
forall a b.
(Ord a, Ord b) =>
AdjacencyMap a b -> AdjacencyMap a b -> AdjacencyMap a b
overlay
* :: AdjacencyMap a b -> AdjacencyMap a b -> AdjacencyMap a b
(*) = AdjacencyMap a b -> AdjacencyMap a b -> AdjacencyMap a b
forall a b.
(Ord a, Ord b) =>
AdjacencyMap a b -> AdjacencyMap a b -> AdjacencyMap a b
connect
signum :: AdjacencyMap a b -> AdjacencyMap a b
signum = AdjacencyMap a b -> AdjacencyMap a b -> AdjacencyMap a b
forall a b. a -> b -> a
const AdjacencyMap a b
forall a b. AdjacencyMap a b
empty
abs :: AdjacencyMap a b -> AdjacencyMap a b
abs = AdjacencyMap a b -> AdjacencyMap a b
forall a. a -> a
id
negate :: AdjacencyMap a b -> AdjacencyMap a b
negate = AdjacencyMap a b -> AdjacencyMap a b
forall a. a -> a
id
instance (Ord a, Ord b) => Eq (AdjacencyMap a b) where
BAM Map a (Set b)
ab1 Map b (Set a)
ba1 == :: AdjacencyMap a b -> AdjacencyMap a b -> Bool
== BAM Map a (Set b)
ab2 Map b (Set a)
ba2 = Map a (Set b)
ab1 Map a (Set b) -> Map a (Set b) -> Bool
forall a. Eq a => a -> a -> Bool
== Map a (Set b)
ab2 Bool -> Bool -> Bool
&& Map b (Set a) -> Set b
forall k a. Map k a -> Set k
Map.keysSet Map b (Set a)
ba1 Set b -> Set b -> Bool
forall a. Eq a => a -> a -> Bool
== Map b (Set a) -> Set b
forall k a. Map k a -> Set k
Map.keysSet Map b (Set a)
ba2
instance (Ord a, Ord b) => Ord (AdjacencyMap a b) where
compare :: AdjacencyMap a b -> AdjacencyMap a b -> Ordering
compare AdjacencyMap a b
x AdjacencyMap a b
y = [Ordering] -> Ordering
forall a. Monoid a => [a] -> a
mconcat
[ Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (AdjacencyMap a b -> Int
forall a b. AdjacencyMap a b -> Int
vertexCount AdjacencyMap a b
x) (AdjacencyMap a b -> Int
forall a b. AdjacencyMap a b -> Int
vertexCount AdjacencyMap a b
y)
, Set (Either a b) -> Set (Either a b) -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (AdjacencyMap a b -> Set (Either a b)
forall a b. (Ord a, Ord b) => AdjacencyMap a b -> Set (Either a b)
vertexSet AdjacencyMap a b
x) (AdjacencyMap a b -> Set (Either a b)
forall a b. (Ord a, Ord b) => AdjacencyMap a b -> Set (Either a b)
vertexSet AdjacencyMap a b
y)
, Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (AdjacencyMap a b -> Int
forall a b. AdjacencyMap a b -> Int
edgeCount AdjacencyMap a b
x) (AdjacencyMap a b -> Int
forall a b. AdjacencyMap a b -> Int
edgeCount AdjacencyMap a b
y)
, Set (a, b) -> Set (a, b) -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (AdjacencyMap a b -> Set (a, b)
forall a b. (Ord a, Ord b) => AdjacencyMap a b -> Set (a, b)
edgeSet AdjacencyMap a b
x) (AdjacencyMap a b -> Set (a, b)
forall a b. (Ord a, Ord b) => AdjacencyMap a b -> Set (a, b)
edgeSet AdjacencyMap a b
y) ]
instance (Ord a, Ord b, Show a, Show b) => Show (AdjacencyMap a b) where
showsPrec :: Int -> AdjacencyMap a b -> ShowS
showsPrec Int
p AdjacencyMap a b
g
| [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [a]
as Bool -> Bool -> Bool
&& [b] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [b]
bs = String -> ShowS
showString String
"empty"
| [(a, b)] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [(a, b)]
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] -> [b] -> ShowS
forall a a. (Show a, Show a) => [a] -> [a] -> ShowS
vShow [a]
as [b]
bs
| ([a]
as [a] -> [a] -> Bool
forall a. Eq a => a -> a -> Bool
== [a]
aUsed) Bool -> Bool -> Bool
&& ([b]
bs [b] -> [b] -> Bool
forall a. Eq a => a -> a -> Bool
== [b]
bUsed) = 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, b)] -> ShowS
forall a a. (Show a, Show a) => [(a, a)] -> ShowS
eShow [(a, b)]
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
. [Either a b] -> ShowS
forall a a. (Show a, Show a) => [Either a a] -> ShowS
veShow ([Either a b]
vs [Either a b] -> [Either a b] -> [Either a b]
forall a. Eq a => [a] -> [a] -> [a]
\\ [Either a b]
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, b)] -> ShowS
forall a a. (Show a, Show a) => [(a, a)] -> ShowS
eShow [(a, b)]
es
ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ShowS
showString String
")"
where
as :: [a]
as = AdjacencyMap a b -> [a]
forall a b. AdjacencyMap a b -> [a]
leftVertexList AdjacencyMap a b
g
bs :: [b]
bs = AdjacencyMap a b -> [b]
forall a b. AdjacencyMap a b -> [b]
rightVertexList AdjacencyMap a b
g
vs :: [Either a b]
vs = AdjacencyMap a b -> [Either a b]
forall a b. AdjacencyMap a b -> [Either a b]
vertexList AdjacencyMap a b
g
es :: [(a, b)]
es = AdjacencyMap a b -> [(a, b)]
forall a b. AdjacencyMap a b -> [(a, b)]
edgeList AdjacencyMap a b
g
aUsed :: [a]
aUsed = Set a -> [a]
forall a. Set a -> [a]
Set.toAscList (Set a -> [a]) -> Set a -> [a]
forall a b. (a -> b) -> a -> b
$ [a] -> Set a
forall a. Eq a => [a] -> Set a
Set.fromAscList [ a
a | (a
a, b
_) <- AdjacencyMap a b -> [(a, b)]
forall a b. AdjacencyMap a b -> [(a, b)]
edgeList AdjacencyMap a b
g ]
bUsed :: [b]
bUsed = Set b -> [b]
forall a. Set a -> [a]
Set.toAscList (Set b -> [b]) -> Set b -> [b]
forall a b. (a -> b) -> a -> b
$ [b] -> Set b
forall a. Eq a => [a] -> Set a
Set.fromAscList [ b
b | (b
b, a
_) <- AdjacencyMap b a -> [(b, a)]
forall a b. AdjacencyMap a b -> [(a, b)]
edgeList (AdjacencyMap a b -> AdjacencyMap b a
forall a b. AdjacencyMap a b -> AdjacencyMap b a
swap AdjacencyMap a b
g) ]
used :: [Either a b]
used = (a -> Either a b) -> [a] -> [Either a b]
forall a b. (a -> b) -> [a] -> [b]
map a -> Either a b
forall a b. a -> Either a b
Left [a]
aUsed [Either a b] -> [Either a b] -> [Either a b]
forall a. [a] -> [a] -> [a]
++ (b -> Either a b) -> [b] -> [Either a b]
forall a b. (a -> b) -> [a] -> [b]
map b -> Either a b
forall a b. b -> Either a b
Right [b]
bUsed
vShow :: [a] -> [a] -> ShowS
vShow [a
a] [] = String -> ShowS
showString String
"leftVertex " 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
a
vShow [] [a
b] = String -> ShowS
showString String
"rightVertex " 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
b
vShow [a]
as [a]
bs = 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]
as
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]
bs
eShow :: [(a, a)] -> ShowS
eShow [(a
a, a
b)] = 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
a
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
b
eShow [(a, a)]
es = 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)]
es
veShow :: [Either a a] -> ShowS
veShow [Either a a]
xs = [a] -> [a] -> ShowS
forall a a. (Show a, Show a) => [a] -> [a] -> ShowS
vShow ([Either a a] -> [a]
forall a b. [Either a b] -> [a]
lefts [Either a a]
xs) ([Either a a] -> [a]
forall a b. [Either a b] -> [b]
rights [Either a a]
xs)
instance (Ord a, Ord b) => Semigroup (AdjacencyMap a b) where
<> :: AdjacencyMap a b -> AdjacencyMap a b -> AdjacencyMap a b
(<>) = AdjacencyMap a b -> AdjacencyMap a b -> AdjacencyMap a b
forall a b.
(Ord a, Ord b) =>
AdjacencyMap a b -> AdjacencyMap a b -> AdjacencyMap a b
overlay
instance (Ord a, Ord b) => Monoid (AdjacencyMap a b) where
mempty :: AdjacencyMap a b
mempty = AdjacencyMap a b
forall a b. AdjacencyMap a b
empty
empty :: AdjacencyMap a b
empty :: AdjacencyMap a b
empty = Map a (Set b) -> Map b (Set a) -> AdjacencyMap a b
forall a b. Map a (Set b) -> Map b (Set a) -> AdjacencyMap a b
BAM Map a (Set b)
forall k a. Map k a
Map.empty Map b (Set a)
forall k a. Map k a
Map.empty
leftVertex :: a -> AdjacencyMap a b
leftVertex :: a -> AdjacencyMap a b
leftVertex a
a = Map a (Set b) -> Map b (Set a) -> AdjacencyMap a b
forall a b. Map a (Set b) -> Map b (Set a) -> AdjacencyMap a b
BAM (a -> Set b -> Map a (Set b)
forall k a. k -> a -> Map k a
Map.singleton a
a Set b
forall a. Set a
Set.empty) Map b (Set a)
forall k a. Map k a
Map.empty
rightVertex :: b -> AdjacencyMap a b
rightVertex :: b -> AdjacencyMap a b
rightVertex b
b = Map a (Set b) -> Map b (Set a) -> AdjacencyMap a b
forall a b. Map a (Set b) -> Map b (Set a) -> AdjacencyMap a b
BAM Map a (Set b)
forall k a. Map k a
Map.empty (b -> Set a -> Map b (Set a)
forall k a. k -> a -> Map k a
Map.singleton b
b Set a
forall a. Set a
Set.empty)
vertex :: Either a b -> AdjacencyMap a b
vertex :: Either a b -> AdjacencyMap a b
vertex (Left a
a) = a -> AdjacencyMap a b
forall a b. a -> AdjacencyMap a b
leftVertex a
a
vertex (Right b
b) = b -> AdjacencyMap a b
forall b a. b -> AdjacencyMap a b
rightVertex b
b
edge :: a -> b -> AdjacencyMap a b
edge :: a -> b -> AdjacencyMap a b
edge a
a b
b =
Map a (Set b) -> Map b (Set a) -> AdjacencyMap a b
forall a b. Map a (Set b) -> Map b (Set a) -> AdjacencyMap a b
BAM (a -> Set b -> Map a (Set b)
forall k a. k -> a -> Map k a
Map.singleton a
a (b -> Set b
forall a. a -> Set a
Set.singleton b
b)) (b -> Set a -> Map b (Set a)
forall k a. k -> a -> Map k a
Map.singleton b
b (a -> Set a
forall a. a -> Set a
Set.singleton a
a))
overlay :: (Ord a, Ord b) => AdjacencyMap a b -> AdjacencyMap a b -> AdjacencyMap a b
overlay :: AdjacencyMap a b -> AdjacencyMap a b -> AdjacencyMap a b
overlay (BAM Map a (Set b)
ab1 Map b (Set a)
ba1) (BAM Map a (Set b)
ab2 Map b (Set a)
ba2) =
Map a (Set b) -> Map b (Set a) -> AdjacencyMap a b
forall a b. Map a (Set b) -> Map b (Set a) -> AdjacencyMap a b
BAM ((Set b -> Set b -> Set b)
-> Map a (Set b) -> Map a (Set b) -> Map a (Set b)
forall k a. Ord k => (a -> a -> a) -> Map k a -> Map k a -> Map k a
Map.unionWith Set b -> Set b -> Set b
forall a. Ord a => Set a -> Set a -> Set a
Set.union Map a (Set b)
ab1 Map a (Set b)
ab2) ((Set a -> Set a -> Set a)
-> Map b (Set a) -> Map b (Set a) -> Map b (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 b (Set a)
ba1 Map b (Set a)
ba2)
connect :: (Ord a, Ord b) => AdjacencyMap a b -> AdjacencyMap a b -> AdjacencyMap a b
connect :: AdjacencyMap a b -> AdjacencyMap a b -> AdjacencyMap a b
connect (BAM Map a (Set b)
ab1 Map b (Set a)
ba1) (BAM Map a (Set b)
ab2 Map b (Set a)
ba2) = Map a (Set b) -> Map b (Set a) -> AdjacencyMap a b
forall a b. Map a (Set b) -> Map b (Set a) -> AdjacencyMap a b
BAM Map a (Set b)
ab Map b (Set a)
ba
where
a1 :: Set a
a1 = Map a (Set b) -> Set a
forall k a. Map k a -> Set k
Map.keysSet Map a (Set b)
ab1
a2 :: Set a
a2 = Map a (Set b) -> Set a
forall k a. Map k a -> Set k
Map.keysSet Map a (Set b)
ab2
b1 :: Set b
b1 = Map b (Set a) -> Set b
forall k a. Map k a -> Set k
Map.keysSet Map b (Set a)
ba1
b2 :: Set b
b2 = Map b (Set a) -> Set b
forall k a. Map k a -> Set k
Map.keysSet Map b (Set a)
ba2
ab :: Map a (Set b)
ab = (Set b -> Set b -> Set b) -> [Map a (Set b)] -> Map a (Set b)
forall (f :: * -> *) k a.
(Foldable f, Ord k) =>
(a -> a -> a) -> f (Map k a) -> Map k a
Map.unionsWith Set b -> Set b -> Set b
forall a. Ord a => Set a -> Set a -> Set a
Set.union
[ Map a (Set b)
ab1, Map a (Set b)
ab2, (a -> Set b) -> Set a -> Map a (Set b)
forall k a. (k -> a) -> Set k -> Map k a
Map.fromSet (Set b -> a -> Set b
forall a b. a -> b -> a
const Set b
b2) Set a
a1, (a -> Set b) -> Set a -> Map a (Set b)
forall k a. (k -> a) -> Set k -> Map k a
Map.fromSet (Set b -> a -> Set b
forall a b. a -> b -> a
const Set b
b1) Set a
a2 ]
ba :: Map b (Set a)
ba = (Set a -> Set a -> Set a) -> [Map b (Set a)] -> Map b (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 b (Set a)
ba1, Map b (Set a)
ba2, (b -> Set a) -> Set b -> Map b (Set a)
forall k a. (k -> a) -> Set k -> Map k a
Map.fromSet (Set a -> b -> Set a
forall a b. a -> b -> a
const Set a
a2) Set b
b1, (b -> Set a) -> Set b -> Map b (Set a)
forall k a. (k -> a) -> Set k -> Map k a
Map.fromSet (Set a -> b -> Set a
forall a b. a -> b -> a
const Set a
a1) Set b
b2 ]
vertices :: (Ord a, Ord b) => [a] -> [b] -> AdjacencyMap a b
vertices :: [a] -> [b] -> AdjacencyMap a b
vertices [a]
as [b]
bs = Map a (Set b) -> Map b (Set a) -> AdjacencyMap a b
forall a b. Map a (Set b) -> Map b (Set a) -> AdjacencyMap a b
BAM ([(a, Set b)] -> Map a (Set b)
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList [ (a
a, Set b
forall a. Set a
Set.empty) | a
a <- [a]
as ])
([(b, Set a)] -> Map b (Set a)
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList [ (b
b, Set a
forall a. Set a
Set.empty) | b
b <- [b]
bs ])
edges :: (Ord a, Ord b) => [(a, b)] -> AdjacencyMap a b
edges :: [(a, b)] -> AdjacencyMap a b
edges [(a, b)]
es = Map a (Set b) -> Map b (Set a) -> AdjacencyMap a b
forall a b. Map a (Set b) -> Map b (Set a) -> AdjacencyMap a b
BAM ((Set b -> Set b -> Set b) -> [(a, Set b)] -> Map a (Set b)
forall k a. Ord k => (a -> a -> a) -> [(k, a)] -> Map k a
Map.fromListWith Set b -> Set b -> Set b
forall a. Ord a => Set a -> Set a -> Set a
Set.union [ (a
a, b -> Set b
forall a. a -> Set a
Set.singleton b
b) | (a
a, b
b) <- [(a, b)]
es ])
((Set a -> Set a -> Set a) -> [(b, Set a)] -> Map b (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 [ (b
b, a -> Set a
forall a. a -> Set a
Set.singleton a
a) | (a
a, b
b) <- [(a, b)]
es ])
overlays :: (Ord a, Ord b) => [AdjacencyMap a b] -> AdjacencyMap a b
overlays :: [AdjacencyMap a b] -> AdjacencyMap a b
overlays [AdjacencyMap a b]
xs = Map a (Set b) -> Map b (Set a) -> AdjacencyMap a b
forall a b. Map a (Set b) -> Map b (Set a) -> AdjacencyMap a b
BAM ((Set b -> Set b -> Set b) -> [Map a (Set b)] -> Map a (Set b)
forall (f :: * -> *) k a.
(Foldable f, Ord k) =>
(a -> a -> a) -> f (Map k a) -> Map k a
Map.unionsWith Set b -> Set b -> Set b
forall a. Ord a => Set a -> Set a -> Set a
Set.union ((AdjacencyMap a b -> Map a (Set b))
-> [AdjacencyMap a b] -> [Map a (Set b)]
forall a b. (a -> b) -> [a] -> [b]
map AdjacencyMap a b -> Map a (Set b)
forall a b. AdjacencyMap a b -> Map a (Set b)
leftAdjacencyMap [AdjacencyMap a b]
xs))
((Set a -> Set a -> Set a) -> [Map b (Set a)] -> Map b (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 ((AdjacencyMap a b -> Map b (Set a))
-> [AdjacencyMap a b] -> [Map b (Set a)]
forall a b. (a -> b) -> [a] -> [b]
map AdjacencyMap a b -> Map b (Set a)
forall a b. AdjacencyMap a b -> Map b (Set a)
rightAdjacencyMap [AdjacencyMap a b]
xs))
connects :: (Ord a, Ord b) => [AdjacencyMap a b] -> AdjacencyMap a b
connects :: [AdjacencyMap a b] -> AdjacencyMap a b
connects = (AdjacencyMap a b -> AdjacencyMap a b -> AdjacencyMap a b)
-> AdjacencyMap a b -> [AdjacencyMap a b] -> AdjacencyMap a b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr AdjacencyMap a b -> AdjacencyMap a b -> AdjacencyMap a b
forall a b.
(Ord a, Ord b) =>
AdjacencyMap a b -> AdjacencyMap a b -> AdjacencyMap a b
connect AdjacencyMap a b
forall a b. AdjacencyMap a b
empty
swap :: AdjacencyMap a b -> AdjacencyMap b a
swap :: AdjacencyMap a b -> AdjacencyMap b a
swap (BAM Map a (Set b)
ab Map b (Set a)
ba) = Map b (Set a) -> Map a (Set b) -> AdjacencyMap b a
forall a b. Map a (Set b) -> Map b (Set a) -> AdjacencyMap a b
BAM Map b (Set a)
ba Map a (Set b)
ab
toBipartite :: (Ord a, Ord b) => AM.AdjacencyMap (Either a b) -> AdjacencyMap a b
toBipartite :: AdjacencyMap (Either a b) -> AdjacencyMap a b
toBipartite AdjacencyMap (Either a b)
g = Map a (Set b) -> Map b (Set a) -> AdjacencyMap a b
forall a b. Map a (Set b) -> Map b (Set a) -> AdjacencyMap a b
BAM ([(a, Set b)] -> Map a (Set b)
forall k a. Eq k => [(k, a)] -> Map k a
Map.fromAscList [ (a
a, Set (Either a b) -> Set b
forall a. Set (Either a b) -> Set b
getRights Set (Either a b)
vs) | (Left a
a, Set (Either a b)
vs) <- [(Either a b, Set (Either a b))]
am ])
([(b, Set a)] -> Map b (Set a)
forall k a. Eq k => [(k, a)] -> Map k a
Map.fromAscList [ (b
b, Set (Either a b) -> Set a
forall b. Set (Either a b) -> Set a
getLefts Set (Either a b)
vs) | (Right b
b, Set (Either a b)
vs) <- [(Either a b, Set (Either a b))]
am ])
where
getRights :: Set (Either a b) -> Set b
getRights = [b] -> Set b
forall a. Eq a => [a] -> Set a
Set.fromAscList ([b] -> Set b)
-> (Set (Either a b) -> [b]) -> Set (Either a b) -> Set b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Either a b] -> [b]
forall a b. [Either a b] -> [b]
rights ([Either a b] -> [b])
-> (Set (Either a b) -> [Either a b]) -> Set (Either a b) -> [b]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Set (Either a b) -> [Either a b]
forall a. Set a -> [a]
Set.toAscList
getLefts :: Set (Either a b) -> Set a
getLefts = [a] -> Set a
forall a. Eq a => [a] -> Set a
Set.fromAscList ([a] -> Set a)
-> (Set (Either a b) -> [a]) -> Set (Either a b) -> Set a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Either a b] -> [a]
forall a b. [Either a b] -> [a]
lefts ([Either a b] -> [a])
-> (Set (Either a b) -> [Either a b]) -> Set (Either a b) -> [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Set (Either a b) -> [Either a b]
forall a. Set a -> [a]
Set.toAscList
am :: [(Either a b, Set (Either a b))]
am = Map (Either a b) (Set (Either a b))
-> [(Either a b, Set (Either a b))]
forall k a. Map k a -> [(k, a)]
Map.toAscList (Map (Either a b) (Set (Either a b))
-> [(Either a b, Set (Either a b))])
-> Map (Either a b) (Set (Either a b))
-> [(Either a b, Set (Either a b))]
forall a b. (a -> b) -> a -> b
$ AdjacencyMap (Either a b) -> Map (Either a b) (Set (Either a b))
forall a. AdjacencyMap a -> Map a (Set a)
AM.adjacencyMap (AdjacencyMap (Either a b) -> Map (Either a b) (Set (Either a b)))
-> AdjacencyMap (Either a b) -> Map (Either a b) (Set (Either a b))
forall a b. (a -> b) -> a -> b
$ AdjacencyMap (Either a b) -> AdjacencyMap (Either a b)
forall a. Ord a => AdjacencyMap a -> AdjacencyMap a
AM.symmetricClosure AdjacencyMap (Either a b)
g
toBipartiteWith :: (Ord a, Ord b, Ord c) => (a -> Either b c) -> AM.AdjacencyMap a -> AdjacencyMap b c
toBipartiteWith :: (a -> Either b c) -> AdjacencyMap a -> AdjacencyMap b c
toBipartiteWith a -> Either b c
f = AdjacencyMap (Either b c) -> AdjacencyMap b c
forall a b.
(Ord a, Ord b) =>
AdjacencyMap (Either a b) -> AdjacencyMap a b
toBipartite (AdjacencyMap (Either b c) -> AdjacencyMap b c)
-> (AdjacencyMap a -> AdjacencyMap (Either b c))
-> AdjacencyMap a
-> AdjacencyMap b c
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> Either b c) -> AdjacencyMap a -> AdjacencyMap (Either b c)
forall a b.
(Ord a, Ord b) =>
(a -> b) -> AdjacencyMap a -> AdjacencyMap b
AM.gmap a -> Either b c
f
fromBipartite :: (Ord a, Ord b) => AdjacencyMap a b -> AM.AdjacencyMap (Either a b)
fromBipartite :: AdjacencyMap a b -> AdjacencyMap (Either a b)
fromBipartite (BAM Map a (Set b)
ab Map b (Set a)
ba) = [(Either a b, Set (Either a b))] -> AdjacencyMap (Either a b)
forall a. Ord a => [(a, Set a)] -> AdjacencyMap a
AM.fromAdjacencySets ([(Either a b, Set (Either a b))] -> AdjacencyMap (Either a b))
-> [(Either a b, Set (Either a b))] -> AdjacencyMap (Either a b)
forall a b. (a -> b) -> a -> b
$
[ (a -> Either a b
forall a b. a -> Either a b
Left a
a, (b -> Either a b) -> Set b -> Set (Either a b)
forall a b. (a -> b) -> Set a -> Set b
Set.mapMonotonic b -> Either a b
forall a b. b -> Either a b
Right Set b
bs) | (a
a, Set b
bs) <- Map a (Set b) -> [(a, Set b)]
forall k a. Map k a -> [(k, a)]
Map.toAscList Map a (Set b)
ab ] [(Either a b, Set (Either a b))]
-> [(Either a b, Set (Either a b))]
-> [(Either a b, Set (Either a b))]
forall a. [a] -> [a] -> [a]
++
[ (b -> Either a b
forall a b. b -> Either a b
Right b
b, (a -> Either a b) -> Set a -> Set (Either a b)
forall a b. (a -> b) -> Set a -> Set b
Set.mapMonotonic a -> Either a b
forall a b. a -> Either a b
Left Set a
as) | (b
b, Set a
as) <- Map b (Set a) -> [(b, Set a)]
forall k a. Map k a -> [(k, a)]
Map.toAscList Map b (Set a)
ba ]
fromBipartiteWith :: Ord c => (a -> c) -> (b -> c) -> AdjacencyMap a b -> AM.AdjacencyMap c
fromBipartiteWith :: (a -> c) -> (b -> c) -> AdjacencyMap a b -> AdjacencyMap c
fromBipartiteWith a -> c
f b -> c
g (BAM Map a (Set b)
ab Map b (Set a)
ba) = [(c, Set c)] -> AdjacencyMap c
forall a. Ord a => [(a, Set a)] -> AdjacencyMap a
AM.fromAdjacencySets ([(c, Set c)] -> AdjacencyMap c) -> [(c, Set c)] -> AdjacencyMap c
forall a b. (a -> b) -> a -> b
$
[ (a -> c
f a
a, (b -> c) -> Set b -> Set c
forall b a. Ord b => (a -> b) -> Set a -> Set b
Set.map b -> c
g Set b
bs) | (a
a, Set b
bs) <- Map a (Set b) -> [(a, Set b)]
forall k a. Map k a -> [(k, a)]
Map.toAscList Map a (Set b)
ab ] [(c, Set c)] -> [(c, Set c)] -> [(c, Set c)]
forall a. [a] -> [a] -> [a]
++
[ (b -> c
g b
b, (a -> c) -> Set a -> Set c
forall b a. Ord b => (a -> b) -> Set a -> Set b
Set.map a -> c
f Set a
as) | (b
b, Set a
as) <- Map b (Set a) -> [(b, Set a)]
forall k a. Map k a -> [(k, a)]
Map.toAscList Map b (Set a)
ba ]
isEmpty :: AdjacencyMap a b -> Bool
isEmpty :: AdjacencyMap a b -> Bool
isEmpty (BAM Map a (Set b)
ab Map b (Set a)
ba) = Map a (Set b) -> Bool
forall k a. Map k a -> Bool
Map.null Map a (Set b)
ab Bool -> Bool -> Bool
&& Map b (Set a) -> Bool
forall k a. Map k a -> Bool
Map.null Map b (Set a)
ba
hasLeftVertex :: Ord a => a -> AdjacencyMap a b -> Bool
hasLeftVertex :: a -> AdjacencyMap a b -> Bool
hasLeftVertex a
a (BAM Map a (Set b)
ab Map b (Set a)
_) = a -> Map a (Set b) -> Bool
forall k a. Ord k => k -> Map k a -> Bool
Map.member a
a Map a (Set b)
ab
hasRightVertex :: Ord b => b -> AdjacencyMap a b -> Bool
hasRightVertex :: b -> AdjacencyMap a b -> Bool
hasRightVertex b
b (BAM Map a (Set b)
_ Map b (Set a)
ba) = b -> Map b (Set a) -> Bool
forall k a. Ord k => k -> Map k a -> Bool
Map.member b
b Map b (Set a)
ba
hasVertex :: (Ord a, Ord b) => Either a b -> AdjacencyMap a b -> Bool
hasVertex :: Either a b -> AdjacencyMap a b -> Bool
hasVertex (Left a
a) = a -> AdjacencyMap a b -> Bool
forall a b. Ord a => a -> AdjacencyMap a b -> Bool
hasLeftVertex a
a
hasVertex (Right b
b) = b -> AdjacencyMap a b -> Bool
forall b a. Ord b => b -> AdjacencyMap a b -> Bool
hasRightVertex b
b
hasEdge :: (Ord a, Ord b) => a -> b -> AdjacencyMap a b -> Bool
hasEdge :: a -> b -> AdjacencyMap a b -> Bool
hasEdge a
a b
b (BAM Map a (Set b)
ab Map b (Set a)
_) = (b -> Set b -> Bool
forall a. Ord a => a -> Set a -> Bool
Set.member b
b (Set b -> Bool) -> Maybe (Set b) -> Maybe Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> Map a (Set b) -> Maybe (Set b)
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup a
a Map a (Set b)
ab) Maybe Bool -> Maybe Bool -> Bool
forall a. Eq a => a -> a -> Bool
== Bool -> Maybe Bool
forall a. a -> Maybe a
Just Bool
True
leftVertexCount :: AdjacencyMap a b -> Int
leftVertexCount :: AdjacencyMap a b -> Int
leftVertexCount = Map a (Set b) -> Int
forall k a. Map k a -> Int
Map.size (Map a (Set b) -> Int)
-> (AdjacencyMap a b -> Map a (Set b)) -> AdjacencyMap a b -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AdjacencyMap a b -> Map a (Set b)
forall a b. AdjacencyMap a b -> Map a (Set b)
leftAdjacencyMap
rightVertexCount :: AdjacencyMap a b -> Int
rightVertexCount :: AdjacencyMap a b -> Int
rightVertexCount = Map b (Set a) -> Int
forall k a. Map k a -> Int
Map.size (Map b (Set a) -> Int)
-> (AdjacencyMap a b -> Map b (Set a)) -> AdjacencyMap a b -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AdjacencyMap a b -> Map b (Set a)
forall a b. AdjacencyMap a b -> Map b (Set a)
rightAdjacencyMap
vertexCount :: AdjacencyMap a b -> Int
vertexCount :: AdjacencyMap a b -> Int
vertexCount AdjacencyMap a b
g = AdjacencyMap a b -> Int
forall a b. AdjacencyMap a b -> Int
leftVertexCount AdjacencyMap a b
g Int -> Int -> Int
forall a. Num a => a -> a -> a
+ AdjacencyMap a b -> Int
forall a b. AdjacencyMap a b -> Int
rightVertexCount AdjacencyMap a b
g
edgeCount :: AdjacencyMap a b -> Int
edgeCount :: AdjacencyMap a b -> Int
edgeCount = (Set b -> Int -> Int) -> Int -> Map a (Set b) -> Int
forall a b k. (a -> b -> b) -> b -> Map k a -> b
Map.foldr (Int -> Int -> Int
forall a. Num a => a -> a -> a
(+) (Int -> Int -> Int) -> (Set b -> Int) -> Set b -> Int -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Set b -> Int
forall a. Set a -> Int
Set.size) Int
0 (Map a (Set b) -> Int)
-> (AdjacencyMap a b -> Map a (Set b)) -> AdjacencyMap a b -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AdjacencyMap a b -> Map a (Set b)
forall a b. AdjacencyMap a b -> Map a (Set b)
leftAdjacencyMap
leftVertexList :: AdjacencyMap a b -> [a]
leftVertexList :: AdjacencyMap a b -> [a]
leftVertexList = Map a (Set b) -> [a]
forall k a. Map k a -> [k]
Map.keys (Map a (Set b) -> [a])
-> (AdjacencyMap a b -> Map a (Set b)) -> AdjacencyMap a b -> [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AdjacencyMap a b -> Map a (Set b)
forall a b. AdjacencyMap a b -> Map a (Set b)
leftAdjacencyMap
rightVertexList :: AdjacencyMap a b -> [b]
rightVertexList :: AdjacencyMap a b -> [b]
rightVertexList = Map b (Set a) -> [b]
forall k a. Map k a -> [k]
Map.keys (Map b (Set a) -> [b])
-> (AdjacencyMap a b -> Map b (Set a)) -> AdjacencyMap a b -> [b]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AdjacencyMap a b -> Map b (Set a)
forall a b. AdjacencyMap a b -> Map b (Set a)
rightAdjacencyMap
vertexList :: AdjacencyMap a b -> [Either a b]
vertexList :: AdjacencyMap a b -> [Either a b]
vertexList AdjacencyMap a b
g = (a -> Either a b) -> [a] -> [Either a b]
forall a b. (a -> b) -> [a] -> [b]
map a -> Either a b
forall a b. a -> Either a b
Left (AdjacencyMap a b -> [a]
forall a b. AdjacencyMap a b -> [a]
leftVertexList AdjacencyMap a b
g) [Either a b] -> [Either a b] -> [Either a b]
forall a. [a] -> [a] -> [a]
++ (b -> Either a b) -> [b] -> [Either a b]
forall a b. (a -> b) -> [a] -> [b]
map b -> Either a b
forall a b. b -> Either a b
Right (AdjacencyMap a b -> [b]
forall a b. AdjacencyMap a b -> [b]
rightVertexList AdjacencyMap a b
g)
edgeList :: AdjacencyMap a b -> [(a, b)]
edgeList :: AdjacencyMap a b -> [(a, b)]
edgeList (BAM Map a (Set b)
ab Map b (Set a)
_) = [ (a
a, b
b) | (a
a, Set b
bs) <- Map a (Set b) -> [(a, Set b)]
forall k a. Map k a -> [(k, a)]
Map.toAscList Map a (Set b)
ab, b
b <- Set b -> [b]
forall a. Set a -> [a]
Set.toAscList Set b
bs ]
leftVertexSet :: AdjacencyMap a b -> Set a
leftVertexSet :: AdjacencyMap a b -> Set a
leftVertexSet = Map a (Set b) -> Set a
forall k a. Map k a -> Set k
Map.keysSet (Map a (Set b) -> Set a)
-> (AdjacencyMap a b -> Map a (Set b)) -> AdjacencyMap a b -> Set a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AdjacencyMap a b -> Map a (Set b)
forall a b. AdjacencyMap a b -> Map a (Set b)
leftAdjacencyMap
rightVertexSet :: AdjacencyMap a b -> Set b
rightVertexSet :: AdjacencyMap a b -> Set b
rightVertexSet = Map b (Set a) -> Set b
forall k a. Map k a -> Set k
Map.keysSet (Map b (Set a) -> Set b)
-> (AdjacencyMap a b -> Map b (Set a)) -> AdjacencyMap a b -> Set b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AdjacencyMap a b -> Map b (Set a)
forall a b. AdjacencyMap a b -> Map b (Set a)
rightAdjacencyMap
vertexSet :: (Ord a, Ord b) => AdjacencyMap a b -> Set (Either a b)
vertexSet :: AdjacencyMap a b -> Set (Either a b)
vertexSet = [Either a b] -> Set (Either a b)
forall a. Eq a => [a] -> Set a
Set.fromAscList ([Either a b] -> Set (Either a b))
-> (AdjacencyMap a b -> [Either a b])
-> AdjacencyMap a b
-> Set (Either a b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AdjacencyMap a b -> [Either a b]
forall a b. AdjacencyMap a b -> [Either a b]
vertexList
edgeSet :: (Ord a, Ord b) => AdjacencyMap a b -> Set (a, b)
edgeSet :: AdjacencyMap a b -> Set (a, b)
edgeSet = [(a, b)] -> Set (a, b)
forall a. Eq a => [a] -> Set a
Set.fromAscList ([(a, b)] -> Set (a, b))
-> (AdjacencyMap a b -> [(a, b)]) -> AdjacencyMap a b -> Set (a, b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AdjacencyMap a b -> [(a, b)]
forall a b. AdjacencyMap a b -> [(a, b)]
edgeList
leftAdjacencyList :: AdjacencyMap a b -> [(a, [b])]
leftAdjacencyList :: AdjacencyMap a b -> [(a, [b])]
leftAdjacencyList (BAM Map a (Set b)
ab Map b (Set a)
_) = (Set b -> [b]) -> (a, Set b) -> (a, [b])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Set b -> [b]
forall a. Set a -> [a]
Set.toAscList ((a, Set b) -> (a, [b])) -> [(a, Set b)] -> [(a, [b])]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Map a (Set b) -> [(a, Set b)]
forall k a. Map k a -> [(k, a)]
Map.toAscList Map a (Set b)
ab
rightAdjacencyList :: AdjacencyMap a b -> [(b, [a])]
rightAdjacencyList :: AdjacencyMap a b -> [(b, [a])]
rightAdjacencyList (BAM Map a (Set b)
_ Map b (Set a)
ba) = (Set a -> [a]) -> (b, Set a) -> (b, [a])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Set a -> [a]
forall a. Set a -> [a]
Set.toAscList ((b, Set a) -> (b, [a])) -> [(b, Set a)] -> [(b, [a])]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Map b (Set a) -> [(b, Set a)]
forall k a. Map k a -> [(k, a)]
Map.toAscList Map b (Set a)
ba
data List a b = Nil | Cons a (List b a) deriving (List a b -> List a b -> Bool
(List a b -> List a b -> Bool)
-> (List a b -> List a b -> Bool) -> Eq (List a b)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall a b. (Eq a, Eq b) => List a b -> List a b -> Bool
/= :: List a b -> List a b -> Bool
$c/= :: forall a b. (Eq a, Eq b) => List a b -> List a b -> Bool
== :: List a b -> List a b -> Bool
$c== :: forall a b. (Eq a, Eq b) => List a b -> List a b -> Bool
Eq, (forall x. List a b -> Rep (List a b) x)
-> (forall x. Rep (List a b) x -> List a b) -> Generic (List a b)
forall x. Rep (List a b) x -> List a b
forall x. List a b -> Rep (List a b) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a b x. Rep (List a b) x -> List a b
forall a b x. List a b -> Rep (List a b) x
$cto :: forall a b x. Rep (List a b) x -> List a b
$cfrom :: forall a b x. List a b -> Rep (List a b) x
Generic, Eq (List a b)
Eq (List a b)
-> (List a b -> List a b -> Ordering)
-> (List a b -> List a b -> Bool)
-> (List a b -> List a b -> Bool)
-> (List a b -> List a b -> Bool)
-> (List a b -> List a b -> Bool)
-> (List a b -> List a b -> List a b)
-> (List a b -> List a b -> List a b)
-> Ord (List a b)
List a b -> List a b -> Bool
List a b -> List a b -> Ordering
List a b -> List a b -> List a b
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall a b. (Ord a, Ord b) => Eq (List a b)
forall a b. (Ord a, Ord b) => List a b -> List a b -> Bool
forall a b. (Ord a, Ord b) => List a b -> List a b -> Ordering
forall a b. (Ord a, Ord b) => List a b -> List a b -> List a b
min :: List a b -> List a b -> List a b
$cmin :: forall a b. (Ord a, Ord b) => List a b -> List a b -> List a b
max :: List a b -> List a b -> List a b
$cmax :: forall a b. (Ord a, Ord b) => List a b -> List a b -> List a b
>= :: List a b -> List a b -> Bool
$c>= :: forall a b. (Ord a, Ord b) => List a b -> List a b -> Bool
> :: List a b -> List a b -> Bool
$c> :: forall a b. (Ord a, Ord b) => List a b -> List a b -> Bool
<= :: List a b -> List a b -> Bool
$c<= :: forall a b. (Ord a, Ord b) => List a b -> List a b -> Bool
< :: List a b -> List a b -> Bool
$c< :: forall a b. (Ord a, Ord b) => List a b -> List a b -> Bool
compare :: List a b -> List a b -> Ordering
$ccompare :: forall a b. (Ord a, Ord b) => List a b -> List a b -> Ordering
$cp1Ord :: forall a b. (Ord a, Ord b) => Eq (List a b)
Ord, Int -> List a b -> ShowS
[List a b] -> ShowS
List a b -> String
(Int -> List a b -> ShowS)
-> (List a b -> String) -> ([List a b] -> ShowS) -> Show (List a b)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall a b. (Show a, Show b) => Int -> List a b -> ShowS
forall a b. (Show a, Show b) => [List a b] -> ShowS
forall a b. (Show a, Show b) => List a b -> String
showList :: [List a b] -> ShowS
$cshowList :: forall a b. (Show a, Show b) => [List a b] -> ShowS
show :: List a b -> String
$cshow :: forall a b. (Show a, Show b) => List a b -> String
showsPrec :: Int -> List a b -> ShowS
$cshowsPrec :: forall a b. (Show a, Show b) => Int -> List a b -> ShowS
Show)
instance IsList (List a a) where
type Item (List a a) = a
fromList :: [Item (List a a)] -> List a a
fromList = (a -> List a a -> List a a) -> List a a -> [a] -> List a a
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr a -> List a a -> List a a
forall a b. a -> List b a -> List a b
Cons List a a
forall a b. List a b
Nil
toList :: List a a -> [Item (List a a)]
toList List a a
Nil = []
toList (Cons a
a List a a
as) = a
a a -> [a] -> [a]
forall a. a -> [a] -> [a]
: List a a -> [Item (List a a)]
forall l. IsList l => l -> [Item l]
toList List a a
as
evenList :: [(a, b)] -> List a b
evenList :: [(a, b)] -> List a b
evenList = ((a, b) -> List a b -> List a b)
-> List a b -> [(a, b)] -> List a b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\(a
a, b
b) -> a -> List b a -> List a b
forall a b. a -> List b a -> List a b
Cons a
a (List b a -> List a b)
-> (List a b -> List b a) -> List a b -> List a b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. b -> List a b -> List b a
forall a b. a -> List b a -> List a b
Cons b
b) List a b
forall a b. List a b
Nil
oddList :: a -> [(b, a)] -> List a b
oddList :: a -> [(b, a)] -> List a b
oddList a
a = a -> List b a -> List a b
forall a b. a -> List b a -> List a b
Cons a
a (List b a -> List a b)
-> ([(b, a)] -> List b a) -> [(b, a)] -> List a b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(b, a)] -> List b a
forall a b. [(a, b)] -> List a b
evenList
path :: (Ord a, Ord b) => List a b -> AdjacencyMap a b
path :: List a b -> AdjacencyMap a b
path List a b
Nil = AdjacencyMap a b
forall a b. AdjacencyMap a b
empty
path (Cons a
a List b a
Nil) = a -> AdjacencyMap a b
forall a b. a -> AdjacencyMap a b
leftVertex a
a
path List a b
abs = [(a, b)] -> AdjacencyMap a b
forall a b. (Ord a, Ord b) => [(a, b)] -> AdjacencyMap a b
edges ([a] -> [b] -> [(a, b)]
forall a b. [a] -> [b] -> [(a, b)]
zip [a]
as [b]
bs [(a, b)] -> [(a, b)] -> [(a, b)]
forall a. [a] -> [a] -> [a]
++ [a] -> [b] -> [(a, b)]
forall a b. [a] -> [b] -> [(a, b)]
zip (Int -> [a] -> [a]
forall a. Int -> [a] -> [a]
drop Int
1 [a]
as) [b]
bs)
where
([a]
as, [b]
bs) = List a b -> ([a], [b])
forall a b. List a b -> ([a], [b])
split List a b
abs
split :: List a b -> ([a], [b])
split :: List a b -> ([a], [b])
split List a b
xs = case List a b
xs of
List a b
Nil -> ([], [])
Cons a
a List b a
Nil -> ([a
a], [])
Cons a
a (Cons b
b List a b
abs) -> (a
a a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
as, b
b b -> [b] -> [b]
forall a. a -> [a] -> [a]
: [b]
bs) where ([a]
as, [b]
bs) = List a b -> ([a], [b])
forall a b. List a b -> ([a], [b])
split List a b
abs
circuit :: (Ord a, Ord b) => [(a, b)] -> AdjacencyMap a b
circuit :: [(a, b)] -> AdjacencyMap a b
circuit [] = AdjacencyMap a b
forall a b. AdjacencyMap a b
empty
circuit [(a, b)]
xs = [(a, b)] -> AdjacencyMap a b
forall a b. (Ord a, Ord b) => [(a, b)] -> AdjacencyMap a b
edges ([(a, b)] -> AdjacencyMap a b) -> [(a, b)] -> AdjacencyMap a b
forall a b. (a -> b) -> a -> b
$ [(a, b)]
xs [(a, b)] -> [(a, b)] -> [(a, b)]
forall a. [a] -> [a] -> [a]
++ [a] -> [b] -> [(a, b)]
forall a b. [a] -> [b] -> [(a, b)]
zip (Int -> [a] -> [a]
forall a. Int -> [a] -> [a]
drop Int
1 ([a] -> [a]) -> [a] -> [a]
forall a b. (a -> b) -> a -> b
$ [a] -> [a]
forall a. [a] -> [a]
cycle [a]
as) [b]
bs
where
([a]
as, [b]
bs) = [(a, b)] -> ([a], [b])
forall a b. [(a, b)] -> ([a], [b])
unzip [(a, b)]
xs
biclique :: (Ord a, Ord b) => [a] -> [b] -> AdjacencyMap a b
biclique :: [a] -> [b] -> AdjacencyMap a b
biclique [a]
xs [b]
ys = Map a (Set b) -> Map b (Set a) -> AdjacencyMap a b
forall a b. Map a (Set b) -> Map b (Set a) -> AdjacencyMap a b
BAM ((a -> Set b) -> Set a -> Map a (Set b)
forall k a. (k -> a) -> Set k -> Map k a
Map.fromSet (Set b -> a -> Set b
forall a b. a -> b -> a
const Set b
sys) Set a
sxs) ((b -> Set a) -> Set b -> Map b (Set a)
forall k a. (k -> a) -> Set k -> Map k a
Map.fromSet (Set a -> b -> Set a
forall a b. a -> b -> a
const Set a
sxs) Set b
sys)
where
sxs :: Set a
sxs = [a] -> Set a
forall a. Ord a => [a] -> Set a
Set.fromList [a]
xs
sys :: Set b
sys = [b] -> Set b
forall a. Ord a => [a] -> Set a
Set.fromList [b]
ys
star :: (Ord a, Ord b) => a -> [b] -> AdjacencyMap a b
star :: a -> [b] -> AdjacencyMap a b
star a
x [b]
ys = AdjacencyMap a b -> AdjacencyMap a b -> AdjacencyMap a b
forall a b.
(Ord a, Ord b) =>
AdjacencyMap a b -> AdjacencyMap a b -> AdjacencyMap a b
connect (a -> AdjacencyMap a b
forall a b. a -> AdjacencyMap a b
leftVertex a
x) ([a] -> [b] -> AdjacencyMap a b
forall a b. (Ord a, Ord b) => [a] -> [b] -> AdjacencyMap a b
vertices [] [b]
ys)
stars :: (Ord a, Ord b) => [(a, [b])] -> AdjacencyMap a b
stars :: [(a, [b])] -> AdjacencyMap a b
stars = [AdjacencyMap a b] -> AdjacencyMap a b
forall a b.
(Ord a, Ord b) =>
[AdjacencyMap a b] -> AdjacencyMap a b
overlays ([AdjacencyMap a b] -> AdjacencyMap a b)
-> ([(a, [b])] -> [AdjacencyMap a b])
-> [(a, [b])]
-> AdjacencyMap a b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((a, [b]) -> AdjacencyMap a b) -> [(a, [b])] -> [AdjacencyMap a b]
forall a b. (a -> b) -> [a] -> [b]
map ((a -> [b] -> AdjacencyMap a b) -> (a, [b]) -> AdjacencyMap a b
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry a -> [b] -> AdjacencyMap a b
forall a b. (Ord a, Ord b) => a -> [b] -> AdjacencyMap a b
star)
removeLeftVertex :: Ord a => a -> AdjacencyMap a b -> AdjacencyMap a b
removeLeftVertex :: a -> AdjacencyMap a b -> AdjacencyMap a b
removeLeftVertex a
a (BAM Map a (Set b)
ab Map b (Set a)
ba) = Map a (Set b) -> Map b (Set a) -> AdjacencyMap a b
forall a b. Map a (Set b) -> Map b (Set a) -> AdjacencyMap a b
BAM (a -> Map a (Set b) -> Map a (Set b)
forall k a. Ord k => k -> Map k a -> Map k a
Map.delete a
a Map a (Set b)
ab) ((Set a -> Set a) -> Map b (Set a) -> Map b (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
a) Map b (Set a)
ba)
removeRightVertex :: Ord b => b -> AdjacencyMap a b -> AdjacencyMap a b
removeRightVertex :: b -> AdjacencyMap a b -> AdjacencyMap a b
removeRightVertex b
b (BAM Map a (Set b)
ab Map b (Set a)
ba) = Map a (Set b) -> Map b (Set a) -> AdjacencyMap a b
forall a b. Map a (Set b) -> Map b (Set a) -> AdjacencyMap a b
BAM ((Set b -> Set b) -> Map a (Set b) -> Map a (Set b)
forall a b k. (a -> b) -> Map k a -> Map k b
Map.map (b -> Set b -> Set b
forall a. Ord a => a -> Set a -> Set a
Set.delete b
b) Map a (Set b)
ab) (b -> Map b (Set a) -> Map b (Set a)
forall k a. Ord k => k -> Map k a -> Map k a
Map.delete b
b Map b (Set a)
ba)
removeEdge :: (Ord a, Ord b) => a -> b -> AdjacencyMap a b -> AdjacencyMap a b
removeEdge :: a -> b -> AdjacencyMap a b -> AdjacencyMap a b
removeEdge a
a b
b (BAM Map a (Set b)
ab Map b (Set a)
ba) =
Map a (Set b) -> Map b (Set a) -> AdjacencyMap a b
forall a b. Map a (Set b) -> Map b (Set a) -> AdjacencyMap a b
BAM ((Set b -> Set b) -> a -> Map a (Set b) -> Map a (Set b)
forall k a. Ord k => (a -> a) -> k -> Map k a -> Map k a
Map.adjust (b -> Set b -> Set b
forall a. Ord a => a -> Set a -> Set a
Set.delete b
b) a
a Map a (Set b)
ab) ((Set a -> Set a) -> b -> Map b (Set a) -> Map b (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
a) b
b Map b (Set a)
ba)
bimap :: (Ord a, Ord b, Ord c, Ord d) => (a -> c) -> (b -> d) -> AdjacencyMap a b -> AdjacencyMap c d
bimap :: (a -> c) -> (b -> d) -> AdjacencyMap a b -> AdjacencyMap c d
bimap a -> c
f b -> d
g (BAM Map a (Set b)
ab Map b (Set a)
ba) = Map c (Set d) -> Map d (Set c) -> AdjacencyMap c d
forall a b. Map a (Set b) -> Map b (Set a) -> AdjacencyMap a b
BAM Map c (Set d)
cd Map d (Set c)
dc
where
cd :: Map c (Set d)
cd = (Set b -> Set d) -> Map c (Set b) -> Map c (Set d)
forall a b k. (a -> b) -> Map k a -> Map k b
Map.map ((b -> d) -> Set b -> Set d
forall b a. Ord b => (a -> b) -> Set a -> Set b
Set.map b -> d
g) (Map c (Set b) -> Map c (Set d)) -> Map c (Set b) -> Map c (Set d)
forall a b. (a -> b) -> a -> b
$ (Set b -> Set b -> Set b)
-> (a -> c) -> Map a (Set b) -> Map c (Set b)
forall k2 a k1.
Ord k2 =>
(a -> a -> a) -> (k1 -> k2) -> Map k1 a -> Map k2 a
Map.mapKeysWith Set b -> Set b -> Set b
forall a. Ord a => Set a -> Set a -> Set a
Set.union a -> c
f Map a (Set b)
ab
dc :: Map d (Set c)
dc = (Set a -> Set c) -> Map d (Set a) -> Map d (Set c)
forall a b k. (a -> b) -> Map k a -> Map k b
Map.map ((a -> c) -> Set a -> Set c
forall b a. Ord b => (a -> b) -> Set a -> Set b
Set.map a -> c
f) (Map d (Set a) -> Map d (Set c)) -> Map d (Set a) -> Map d (Set c)
forall a b. (a -> b) -> a -> b
$ (Set a -> Set a -> Set a)
-> (b -> d) -> Map b (Set a) -> Map d (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 b -> d
g Map b (Set a)
ba
mesh :: (Ord a, Ord b) => [a] -> [b] -> AdjacencyMap (a, b) (a, b)
mesh :: [a] -> [b] -> AdjacencyMap (a, b) (a, b)
mesh [a]
as [b]
bs = AdjacencyMap a a -> AdjacencyMap b b -> AdjacencyMap (a, b) (a, b)
forall a b.
(Ord a, Ord b) =>
AdjacencyMap a a -> AdjacencyMap b b -> AdjacencyMap (a, b) (a, b)
box (List a a -> AdjacencyMap a a
forall a b. (Ord a, Ord b) => List a b -> AdjacencyMap a b
path (List a a -> AdjacencyMap a a) -> List a a -> AdjacencyMap a a
forall a b. (a -> b) -> a -> b
$ [Item (List a a)] -> List a a
forall l. IsList l => [Item l] -> l
fromList [a]
[Item (List a a)]
as) (List b b -> AdjacencyMap b b
forall a b. (Ord a, Ord b) => List a b -> AdjacencyMap a b
path (List b b -> AdjacencyMap b b) -> List b b -> AdjacencyMap b b
forall a b. (a -> b) -> a -> b
$ [Item (List b b)] -> List b b
forall l. IsList l => [Item l] -> l
fromList [b]
[Item (List b b)]
bs)
box :: (Ord a, Ord b) => AdjacencyMap a a -> AdjacencyMap b b -> AdjacencyMap (a, b) (a, b)
box :: AdjacencyMap a a -> AdjacencyMap b b -> AdjacencyMap (a, b) (a, b)
box = (a -> b -> (a, b))
-> (a -> b -> (a, b))
-> (a -> b -> (a, b))
-> (a -> b -> (a, b))
-> AdjacencyMap a a
-> AdjacencyMap b b
-> AdjacencyMap (a, b) (a, b)
forall a b c d e f.
(Ord a, Ord b, Ord c, Ord d, Ord e, Ord f) =>
(a -> c -> e)
-> (b -> d -> e)
-> (a -> d -> f)
-> (b -> c -> f)
-> AdjacencyMap a b
-> AdjacencyMap c d
-> AdjacencyMap e f
boxWith (,) (,) (,) (,)
boxWith :: (Ord a, Ord b, Ord c, Ord d, Ord e, Ord f)
=> (a -> c -> e) -> (b -> d -> e) -> (a -> d -> f) -> (b -> c -> f)
-> AdjacencyMap a b -> AdjacencyMap c d -> AdjacencyMap e f
boxWith :: (a -> c -> e)
-> (b -> d -> e)
-> (a -> d -> f)
-> (b -> c -> f)
-> AdjacencyMap a b
-> AdjacencyMap c d
-> AdjacencyMap e f
boxWith a -> c -> e
ac b -> d -> e
bd a -> d -> f
ad b -> c -> f
bc AdjacencyMap a b
x AdjacencyMap c d
y = AdjacencyMap (Either e f) -> AdjacencyMap e f
forall a b.
(Ord a, Ord b) =>
AdjacencyMap (Either a b) -> AdjacencyMap a b
toBipartite (((Either a b, Either c d) -> Either e f)
-> AdjacencyMap (Either a b, Either c d)
-> AdjacencyMap (Either e f)
forall a b.
(Ord a, Ord b) =>
(a -> b) -> AdjacencyMap a -> AdjacencyMap b
AM.gmap (Either a b, Either c d) -> Either e f
combine AdjacencyMap (Either a b, Either c d)
ambox)
where
ambox :: AdjacencyMap (Either a b, Either c d)
ambox = AdjacencyMap (Either a b)
-> AdjacencyMap (Either c d)
-> AdjacencyMap (Either a b, Either c d)
forall a b.
(Ord a, Ord b) =>
AdjacencyMap a -> AdjacencyMap b -> AdjacencyMap (a, b)
AM.box (AdjacencyMap a b -> AdjacencyMap (Either a b)
forall a b.
(Ord a, Ord b) =>
AdjacencyMap a b -> AdjacencyMap (Either a b)
fromBipartite AdjacencyMap a b
x) (AdjacencyMap c d -> AdjacencyMap (Either c d)
forall a b.
(Ord a, Ord b) =>
AdjacencyMap a b -> AdjacencyMap (Either a b)
fromBipartite AdjacencyMap c d
y)
combine :: (Either a b, Either c d) -> Either e f
combine (Left a
a, Left c
c) = e -> Either e f
forall a b. a -> Either a b
Left (a -> c -> e
ac a
a c
c)
combine (Left a
a, Right d
d) = f -> Either e f
forall a b. b -> Either a b
Right (a -> d -> f
ad a
a d
d)
combine (Right b
b, Left c
c) = f -> Either e f
forall a b. b -> Either a b
Right (b -> c -> f
bc b
b c
c)
combine (Right b
b, Right d
d) = e -> Either e f
forall a b. a -> Either a b
Left (b -> d -> e
bd b
b d
d)
consistent :: (Ord a, Ord b) => AdjacencyMap a b -> Bool
consistent :: AdjacencyMap a b -> Bool
consistent (BAM Map a (Set b)
lr Map b (Set a)
rl) = Map a (Set b) -> [(a, b)]
forall a b. Map a (Set b) -> [(a, b)]
edgeList Map a (Set b)
lr [(a, b)] -> [(a, b)] -> Bool
forall a. Eq a => a -> a -> Bool
== [(a, b)] -> [(a, b)]
forall a. Ord a => [a] -> [a]
sort (((b, a) -> (a, b)) -> [(b, a)] -> [(a, b)]
forall a b. (a -> b) -> [a] -> [b]
map (b, a) -> (a, b)
forall a b. (a, b) -> (b, a)
Data.Tuple.swap ([(b, a)] -> [(a, b)]) -> [(b, a)] -> [(a, b)]
forall a b. (a -> b) -> a -> b
$ Map b (Set a) -> [(b, a)]
forall a b. Map a (Set b) -> [(a, b)]
edgeList Map b (Set a)
rl)
where
edgeList :: Map a (Set b) -> [(a, b)]
edgeList Map a (Set b)
lr = [ (a
u, b
v) | (a
u, Set b
vs) <- Map a (Set b) -> [(a, Set b)]
forall k a. Map k a -> [(k, a)]
Map.toAscList Map a (Set b)
lr, b
v <- Set b -> [b]
forall a. Set a -> [a]
Set.toAscList Set b
vs ]