package kappa-library
Public internals of the Kappa tool suite. Use this package to use kappa as a lib
Install
Dune Dependency
Authors
Maintainers
Sources
v4.1.3.tar.gz
md5=1c9a8a0d79f085757817f90834e166f5
sha512=13ac40442940ba6e72d7dc5bf952e67443872f7bff63e9c76a3a699a6904c88696047fe04519b7ec6546371642f6ee7b0983117be302694aca15500b0df40de3
doc/src/kappa-library.generic/renaming.ml.html
Source file renaming.ml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305
(******************************************************************************) (* _ __ * The Kappa Language *) (* | |/ / * Copyright 2010-2020 CNRS - Harvard Medical School - INRIA - IRIF *) (* | ' / *********************************************************************) (* | . \ * This file is distributed under the terms of the *) (* |_|\_\ * GNU Lesser General Public License Version 3 *) (******************************************************************************) exception Undefined exception NotBijective exception Clashing let special_val = max_int type t = { mutable immediate: int array; mutable delayed: (t * t) option; mutable is_identity: bool; mutable dsts: Mods.IntSet.t; } let empty () = { immediate = [||]; delayed = None; is_identity = true; dsts = Mods.IntSet.empty; } let dummy = empty () let identity l = let max = List.fold_left max 0 l in let immediate = Array.make (succ max) special_val in let () = List.iter (fun x -> immediate.(x) <- x) l in { immediate; delayed = None; is_identity = true; dsts = List.fold_left (fun out x -> Mods.IntSet.add x out) Mods.IntSet.empty l; } let is_identity i = i.is_identity let rec compute k i = let v = i.immediate.(k) in if v <> special_val then v else ( match i.delayed with | None -> special_val | Some (x, y) -> if k >= Array.length x.immediate then special_val else ( let v' = compute k x in if v' = special_val then special_val else ( let v'' = compute v' y in let o = if v'' = special_val then v' else v'' in let () = i.immediate.(k) <- o in o ) ) ) let force i = if i.delayed <> None then ( let () = Array.iteri (fun k _ -> ignore (compute k i)) i.immediate in i.delayed <- None ) let to_list i = let () = force i in Tools.array_fold_lefti (fun i acc v -> if v <> special_val then (i, v) :: acc else acc) [] i.immediate |> List.rev let image i = i.dsts let unsafe_functionnal_add x y i = let l = max (Array.length i.immediate) (x + 1) in let immediate = Array.make l special_val in let () = Array.blit i.immediate 0 immediate 0 (Array.length i.immediate) in let () = immediate.(x) <- y in { immediate; delayed = i.delayed; is_identity = i.is_identity && x == y; dsts = Mods.IntSet.add y i.dsts; } let add ~debug_mode x y i = let not_ok = debug_mode && x < Array.length i.immediate && i.immediate.(x) <> special_val in if not_ok then raise Clashing else ( let i' = unsafe_functionnal_add x y i in if i.dsts == i'.dsts then None else Some i' ) let unsafe_imperative_add x y i = let () = let l = Array.length i.immediate in if x >= l then ( let immediate = Array.make (succ x) special_val in let () = Array.blit i.immediate 0 immediate 0 l in let () = immediate.(x) <- y in i.immediate <- immediate ) else i.immediate.(x) <- y in let () = i.is_identity <- i.is_identity && x == y in i.dsts <- Mods.IntSet.add y i.dsts let imperative_add ~debug_mode x y i = let not_ok = debug_mode && x < Array.length i.immediate && i.immediate.(x) <> special_val in if not_ok then raise Clashing else ( let origin = i.dsts in let () = unsafe_imperative_add x y i in not (i.dsts == origin) ) let rec cyclic_permutation_from_identity max id subst pre = function | _ when pre = id -> unsafe_imperative_add pre max subst | [] -> assert false | h :: t -> let () = unsafe_imperative_add pre h subst in cyclic_permutation_from_identity max id subst h t let cyclic_permutation_from_list ~stop_at = function | [] -> failwith "Renaming.cyclic_permutation_from_list" | h :: t -> let out = empty () in let () = cyclic_permutation_from_identity h stop_at out h t in out let mem x i = x < Array.length i.immediate && compute x i <> special_val let fold f i acc = let () = force i in Tools.array_fold_lefti (fun i acc v -> if v = special_val then acc else f i v acc) acc i.immediate let apply ~debug_mode i x = if (not i.is_identity) || debug_mode then ( let c = compute x i in if c = special_val then raise Undefined else c ) else x let compose ~debug_mode extensible i i' = if (not i.is_identity) || extensible || debug_mode then { immediate = Array.make (Array.length i.immediate) special_val; delayed = Some (i, i'); is_identity = i.is_identity && i'.is_identity; dsts = Mods.IntSet.fold (fun v' set -> let v'' = compute v' i' in Mods.IntSet.add v'' set) i.dsts Mods.IntSet.empty; } (* let sigma,is_id = Mods.IntMap.fold (fun x y (out,is_id) -> match Mods.IntMap.find_option y i'.sigma with | Some z -> (Mods.IntMap.add x z out,is_id && x==z) | None -> (out,is_id && x==y) ) i.sigma (i.sigma,true) in {sigma=sigma ; is_identity=is_id ; dsts = i'.dsts} *) else i' let inverse i = if i.is_identity then i else ( let out = empty () in let () = force i in let () = Array.iteri (fun x y -> if y <> special_val then if y < Array.length out.immediate && out.immediate.(y) <> special_val then raise NotBijective else unsafe_imperative_add y x out) i.immediate in out ) let compare i i' = let () = force i in let () = force i' in Tools.array_compare Mods.int_compare i.immediate i'.immediate let equal i i' = compare i i' = 0 let min_elt i = let l = Array.length i.immediate in let rec aux_min_elt k = if k >= l then None else ( let o = compute k i in if o = special_val then aux_min_elt (succ k) else Some (k, o) ) in aux_min_elt 0 let print f i = let () = force i in ignore (Tools.array_fold_lefti (fun src b dst -> if src <> dst && dst <> special_val then ( let () = Format.fprintf f "%t%i->%i" (if b then Pp.comma else Pp.empty) src dst in true ) else b) false i.immediate) let print_full f i = let () = force i in Format.fprintf f "@[(%a)@]" (Pp.array Pp.comma (fun src f dst -> if dst <> special_val then if src <> dst then Format.fprintf f "%i->%i" src dst else Format.pp_print_int f src)) i.immediate let to_yojson i = let () = force i in `List (Tools.array_fold_lefti (fun src acc dst -> if dst <> special_val then `List [ `Int src; `Int dst ] :: acc else acc) [] i.immediate) let of_yojson = function | `List l -> let out = empty () in let () = List.iter (function | `List [ `Int src; `Int dst ] as x -> if not (imperative_add ~debug_mode:false src dst out) then raise (Yojson.Basic.Util.Type_error ("Incorrect renaming item", x)) | x -> raise (Yojson.Basic.Util.Type_error ("Incorrect renaming item", x))) l in out | x -> raise (Yojson.Basic.Util.Type_error ("Incorrect renaming", x))
sectionYPositions = computeSectionYPositions($el), 10)"
x-init="setTimeout(() => sectionYPositions = computeSectionYPositions($el), 10)"
>