0 | module Data.Graph.Indexed.Subgraph
3 | import Data.Array.Mutable
4 | import Data.AssocList.Indexed
5 | import Data.Graph.Indexed.Query.DFS
6 | import Data.Graph.Indexed.Types
7 | import Data.Graph.Indexed.Util
8 | import Data.Linear.Ref1
9 | import Data.SortedMap
19 | 0 NodeMap : (k,m : Nat) -> Type
20 | NodeMap k m = SortedMap (Fin k) (Fin m)
24 | nodeMap : {k : _} -> IArray k (Fin m) -> NodeMap m k
25 | nodeMap = foldrKV (flip insert) empty
30 | adjAssocList : NodeMap k m -> AssocList k e -> AssocList m e
31 | adjAssocList nm = foldl ins empty . pairs
33 | ins : AssocList m e -> (Fin k,e) -> AssocList m e
34 | ins l (x,ve) = maybe l (\y => insert y ve l) (lookup x nm)
44 | 0 ISubgraph : (k,m : Nat) -> (e,n : Type) -> Type
45 | ISubgraph k m e n = IGraph k e (Fin m, n)
51 | 0 Subgraph : (m : Nat) -> (e,n : Type) -> Type
52 | Subgraph m e n = Graph e (Fin m, n)
57 | subgraph : {k : _} -> IGraph m e n -> IArray k (Fin m) -> ISubgraph k m e n
58 | subgraph (IG g) arr = let m := nodeMap arr in IG $
map (adj m) arr
61 | adj : NodeMap m k -> Fin m -> Adj k e (Fin m, n)
62 | adj m fm = let A l ns := at g fm in A (fm,l) (adjAssocList m ns)
67 | subgraphL : IGraph m e n -> List (Fin m) -> Subgraph m e n
68 | subgraphL g ns = G _ $
subgraph g (arrayL ns)
75 | connectedComponents : {k : _} -> IGraph k e n -> List (Subgraph k e n)
76 | connectedComponents g = subgraphL g . (<>> []) <$> components g
81 | origin : ISubgraph k m e n -> Fin k -> Fin m
82 | origin s = fst . lab s
91 | originEdge : ISubgraph k m e n -> Edge k e -> Maybe (Edge m e)
92 | originEdge s (E x y l) = mkEdge (origin s x) (origin s y) l
98 | 0 Stack : Type -> Nat -> Type
99 | Stack s n = Ref s (List $
Fin n)
101 | 0 Comps : Type -> Nat -> Type
102 | Comps s n = Ref s (List (List $
Fin n))
104 | pop : Stack s k -> F1' s
105 | pop s = mod1 s $
\case h::t => t;
[] => []
107 | extractComp : Fin k -> Stack s k -> Comps s k -> F1' s
108 | extractComp n s c t =
109 | let st # t := read1 s t
110 | (cmp,rem) := go [<] st
111 | _ # t := mod1 c (cmp::) t
115 | go : SnocList (Fin k) -> List (Fin k) -> (List $
Fin k, List $
Fin k)
116 | go sx (x :: xs) = if n == x then (sx <>> [x], xs) else go (sx :< x) xs
117 | go sx [] = (sx <>> [], [])
119 | parameters (g : IGraph k e n)
120 | (d : MArray t k Nat)
123 | covering sc : Fin k -> Fin k -> Nat -> F1 t Nat
125 | covering scs : List (Fin k) -> Fin k -> Nat -> F1 t Nat
126 | scs [] p dpt t = dpt # t
127 | scs (x::xs) p dpt t =
128 | let r2 # t2 := sc x p dpt t
129 | r3 # t3 := scs xs p dpt t2
133 | let Z # t := get d n t | res => res
134 | _ # t := set d n dpt t
135 | _ # t := mod1 s (n::) t
136 | dc # t := scs (filter (/= p) $
neighbours g n) n (S dpt) t
137 | in case compare dc dpt of
139 | EQ => let _ # t := extractComp n s c t in dc # t
140 | GT => let _ # t := Subgraph.pop s t in dpt # t
142 | go : List (Fin k) -> F1 t (List $
Subgraph k e n)
143 | go [] t = mapR1 (map (subgraphL g)) (read1 c t)
145 | let Z # t := get d n t | _ # t => go ns t
146 | _ # t := assert_total $
sc n n 1 t
160 | biconnectedComponents : {k : _} -> IGraph k e n -> List (Subgraph k e n)
161 | biconnectedComponents g =
163 | let c # t := ref1 (the (List (List $
Fin k)) []) t
164 | s # t := ref1 (the (List $
Fin k) []) t
165 | d # t := marray1 k Z t
166 | in go g d s c (allFinsFast k) t