2 | module Data.Graph.Indexed.Query.Subgraph
4 | import Data.Array.Mutable
5 | import Data.AssocList.Indexed
6 | import Data.Graph.Indexed
7 | import Data.Linear.List
18 | parameters (mq : MArray s q (Maybe $
Fin t))
19 | (mt : MArray s t (Maybe $
Fin q))
22 | assign : Fin q -> Fin t -> F1' s
24 | let _ # t := set mt y (Just x) t
25 | in set mq x (Just y) t
29 | unassign : Fin q -> Fin t -> F1' s
31 | let _ # t := set mt y Nothing t
32 | in set mq x Nothing t
39 | (r : MArray s k (Maybe a))
42 | %inline unset : Fin k -> F1 s Bool
43 | unset x t = let m # t := get r x t in isNothing m # t
47 | findUnassigned : F1 s (Either (Fin k) (Vect k a))
49 | let vs # t = toVectWith r (\x => maybe (Left x) Right) t
59 | 0 Matrix : (q,t : Nat) -> Type
60 | Matrix q t = AssocList q (List $
Fin t)
64 | %inline remove : Fin t -> Matrix q t -> Matrix q t
65 | remove = map . filter . (/=)
68 | intersect : List (Fin t) -> List (Fin t) -> List (Fin t)
69 | intersect l@(x::xs) r@(y::ys) =
71 | LT => intersect xs r
72 | EQ => x :: intersect xs ys
73 | GT => intersect l ys
80 | parameters {0 eq,et,nq,nt : Type}
82 | (mq : MArray s q (Maybe $
Fin t))
83 | (mt : MArray s t (Maybe $
Fin q))
84 | (me : eq -> et -> Bool)
85 | (mn : nq -> nt -> Bool)
86 | (query : IGraph q eq nq)
87 | (target : IGraph t et nt)
95 | candidates : AssocList q eq -> AssocList t et -> Matrix q t
96 | candidates ps qs = mapKV cand ps
98 | match : eq -> nq -> (Fin t, et) -> Maybe (Fin t)
99 | match veq vnq (y, vet) =
100 | if me veq vet && mn vnq (lab target y) then Just y else Nothing
102 | cand : Fin q -> eq -> List (Fin t)
103 | cand x lq = mapMaybe (match lq $
lab query x) (pairs qs)
105 | align : Fin q -> Fin t -> Matrix q t -> F1 s (Matrix q t)
107 | let nsX # t := filterLin (unset mq) (neighbours $
adj query x) t
108 | nsY # t := filterLin (unset mt) (neighbours $
adj target y) t
109 | in unionWith intersect (remove y m) (candidates nsX nsY) # t
112 | tryAll : Matrix q t -> F1 s Bool
115 | try : Fin q -> List (Fin t) -> Matrix q t -> F1 s Bool
119 | try x [] cs t = False # t
121 | try x (v::vs) cs t =
122 | let _ # t := assign mq mt x v t
125 | cs2 # t := align x v cs t
131 | False # t := tryAll cs2 t | res => res
132 | _ # t := unassign mq mt x v t
139 | case minBy length m of
140 | Nothing => True # t
141 | Just (x,vs) => try x vs (delete x m) t
146 | run : F1 s (Maybe $
Vect q (Fin t))
148 | let Left x # t := findUnassigned mq t | Right arr # t => Just arr # t
149 | ns # t := filter1 (unset mt) (nodes target) t
150 | ns' := filter (\y => mn (lab query x) (lab target y)) ns
151 | True # t := try x ns' empty t | False # t => Nothing # t
159 | {0 eq,et,nq,nt : Type}
161 | -> (me : eq -> et -> Bool)
162 | -> (mn : nq -> nt -> Bool)
163 | -> (query : IGraph q eq nq)
164 | -> (target : IGraph t et nt)
165 | -> Maybe (Vect q (Fin t))
166 | query me mn que tgt =
168 | let mt # tk := marray1 t Nothing tk
169 | mq # tk := marray1 q Nothing tk
170 | in run mq mt me mn que tgt tk