package mc2
A mcsat-based SMT solver in pure OCaml
Install
Dune Dependency
Authors
Maintainers
Sources
v0.1.tar.gz
md5=92de696251ec76fbf3eba6ee917fd80f
sha512=e88ba0cfc23186570a52172a0bd7c56053273941eaf3cda0b80fb6752e05d1b75986b01a4e4d46d9711124318e57cba1cd92d302e81d34f9f1ae8b49f39114f0
doc/src/mc2.core/Heap.ml.html
Source file Heap.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
(**************************************************************************) (* *) (* Cubicle *) (* Combining model checking algorithms and SMT solvers *) (* *) (* Mohamed Iguernelala *) (* Universite Paris-Sud 11 *) (* *) (* Copyright 2011. This file is distributed under the terms of the *) (* Apache Software License version 2.0 *) (* *) (**************************************************************************) module type RANKED = Heap_intf.RANKED module type S = Heap_intf.S module Make(Elt : RANKED) = struct type elt = Elt.t type t = { heap : elt Vec.t; } let _absent_index = -1 let create () = { heap = Vec.create (); } let[@inline] left i = (i lsl 1) + 1 (* i*2 + 1 *) let[@inline] right i = (i + 1) lsl 1 (* (i+1)*2 *) let[@inline] parent i = (i - 1) asr 1 (* (i-1) / 2 *) (* let rec heap_property cmp ({heap=heap} as s) i = i >= (Vec.size heap) || ((i = 0 || not(cmp (Vec. get heap i) (Vec.get heap (parent i)))) && heap_property cmp s (left i) && heap_property cmp s (right i)) let heap_property cmp s = heap_property cmp s 1 *) (* [elt] is above or at its expected position. Move it up the heap (towards high indices) to restore the heap property *) let percolate_up {heap} (elt:Elt.t) : unit = let pi = ref (parent (Elt.idx elt)) in let i = ref (Elt.idx elt) in while !i <> 0 && Elt.cmp elt (Vec.get heap !pi) do Vec.set heap !i (Vec.get heap !pi); Elt.set_idx (Vec.get heap !i) !i; i := !pi; pi := parent !i done; Vec.set heap !i elt; Elt.set_idx elt !i let percolate_down {heap} (elt:Elt.t): unit = let sz = Vec.size heap in let li = ref (left (Elt.idx elt)) in let ri = ref (right (Elt.idx elt)) in let i = ref (Elt.idx elt) in begin try while !li < sz do let child = if !ri < sz && Elt.cmp (Vec.get heap !ri) (Vec.get heap !li) then !ri else !li in if not (Elt.cmp (Vec.get heap child) elt) then raise Exit; Vec.set heap !i (Vec.get heap child); Elt.set_idx (Vec.get heap !i) !i; i := child; li := left !i; ri := right !i done; with Exit -> () end; Vec.set heap !i elt; Elt.set_idx elt !i let[@inline] in_heap x = Elt.idx x >= 0 let[@inline] decrease s x = assert (in_heap x); percolate_up s x (* let increase cmp s n = assert (in_heap s n); percolate_down cmp s (V.get s.indices n) *) let filter s filt = let j = ref 0 in let lim = Vec.size s.heap in for i = 0 to lim - 1 do if filt (Vec.get s.heap i) then ( Vec.set s.heap !j (Vec.get s.heap i); Elt.set_idx (Vec.get s.heap i) !j; incr j; ) else ( Elt.set_idx (Vec.get s.heap i) _absent_index; ); done; Vec.shrink s.heap (lim - !j); for i = (lim / 2) - 1 downto 0 do percolate_down s (Vec.get s.heap i) done let size s = Vec.size s.heap let is_empty s = Vec.is_empty s.heap let clear {heap} = Vec.iter (fun e -> Elt.set_idx e _absent_index) heap; Vec.clear heap; () let insert s elt = if not (in_heap elt) then ( Elt.set_idx elt (Vec.size s.heap); Vec.push s.heap elt; percolate_up s elt; ) (* let update cmp s n = assert (heap_property cmp s); begin if in_heap s n then begin percolate_up cmp s (Vec.get s.indices n); percolate_down cmp s (Vec.get s.indices n) end else insert cmp s n end; assert (heap_property cmp s) *) let remove_min ({heap} as s) = match Vec.size heap with | 0 -> raise Not_found | 1 -> let x = Vec.pop heap in Elt.set_idx x _absent_index; x | _ -> let x = Vec.get heap 0 in let new_hd = Vec.pop heap in (* heap.last() *) Vec.set heap 0 new_hd; Elt.set_idx x _absent_index; Elt.set_idx new_hd 0; (* enforce heap property again *) if Vec.size heap > 1 then ( percolate_down s new_hd; ); x let to_iter self k = Vec.iter k self.heap end
sectionYPositions = computeSectionYPositions($el), 10)"
x-init="setTimeout(() => sectionYPositions = computeSectionYPositions($el), 10)"
>