Skip to content
Snippets Groups Projects
Commit 59fd6ed1 authored by Loïc Correnson's avatar Loïc Correnson
Browse files

[region] refactor squash

parent 9bc721cf
No related branches found
No related tags found
No related merge requests found
...@@ -254,13 +254,16 @@ let labels (m: map) (r: node) = ...@@ -254,13 +254,16 @@ let labels (m: map) (r: node) =
(* -------------------------------------------------------------------------- *) (* -------------------------------------------------------------------------- *)
type queue = (node * node) Queue.t type queue = (node * node) Queue.t
type cell = { mutable size : int ; mutable ptr : node option }
let new_cell ?(size=0) ?ptr () = { size ; ptr }
let cell_layout { size ; ptr } =
if size = 0 && ptr = None then Blob else Cell(size,ptr)
let singleton ~size = function let merge_push (m: map) (q: queue) (a: node) (b: node) : unit =
| None -> Ranges.empty if not @@ Ufind.eq m.store a b then Queue.push (a,b) q
| Some r -> Ranges.range ~length:size r
let merge_node (m: map) (q: queue) (a: node) (b: node) : node = let merge_node (m: map) (q: queue) (a: node) (b: node) : node =
if not @@ Ufind.eq m.store a b then Queue.push (a,b) q ; merge_push m q a b ;
Ufind.find m.store (min a b) Ufind.find m.store (min a b)
let merge_opt (m: map) (q: queue) let merge_opt (m: map) (q: queue)
...@@ -269,6 +272,16 @@ let merge_opt (m: map) (q: queue) ...@@ -269,6 +272,16 @@ let merge_opt (m: map) (q: queue)
| None, p | p, None -> p | None, p | p, None -> p
| Some pa, Some pb -> Some (merge_node m q pa pb) | Some pa, Some pb -> Some (merge_node m q pa pb)
let merge_cell (m:map) (q:queue) cell root r =
let node = Ufind.get m.store r in
let s = sizeof node.clayout in
let p = cpointed node.clayout in
begin
merge_push m q root r ;
cell.size <- Ranges.gcd cell.size s ;
cell.ptr <- merge_opt m q cell.ptr p ;
end
let merge_range (m: map) (q: queue) (ra : rg) (rb : rg) : node = let merge_range (m: map) (q: queue) (ra : rg) (rb : rg) : node =
let na = ra.data in let na = ra.data in
let nb = rb.data in let nb = rb.data in
...@@ -283,7 +296,7 @@ let merge_range (m: map) (q: queue) (ra : rg) (rb : rg) : node = ...@@ -283,7 +296,7 @@ let merge_range (m: map) (q: queue) (ra : rg) (rb : rg) : node =
if size = sa && size = sb then data else if size = sa && size = sb then data else
merge_node m q (new_chunk m ~size ()) data merge_node m q (new_chunk m ~size ()) data
let merge_ranges (m: map) (q: queue) let merge_ranges (m: map) (q: queue) (root: node)
(sa : int) (fa : Fields.domain) (wa : node Ranges.t) (sa : int) (fa : Fields.domain) (wa : node Ranges.t)
(sb : int) (fb : Fields.domain) (wb : node Ranges.t) (sb : int) (fb : Fields.domain) (wb : node Ranges.t)
: layout = : layout =
...@@ -292,32 +305,29 @@ let merge_ranges (m: map) (q: queue) ...@@ -292,32 +305,29 @@ let merge_ranges (m: map) (q: queue)
Compound(sa, fields, Ranges.merge (merge_range m q) wa wb) Compound(sa, fields, Ranges.merge (merge_range m q) wa wb)
else else
let size = Ranges.gcd sa sb in let size = Ranges.gcd sa sb in
let ra = Ranges.squash (merge_node m q) wa in let cell = new_cell ~size () in
let rb = Ranges.squash (merge_node m q) wb in Ranges.iter (merge_cell m q cell root) wa ;
Compound(size, fields, singleton ~size @@ merge_opt m q ra rb) Ranges.iter (merge_cell m q cell root) wb ;
cell_layout cell
let merge_layout (m: map) (q: queue) (a : layout) (b : layout) : layout = let merge_layout (m:map) (q:queue) (root:node) (a:layout) (b:layout) : layout =
match a, b with match a, b with
| Blob, c | c, Blob -> c | Blob, c | c, Blob -> c
| Cell(sa,pa) , Cell(sb,pb) -> Cell(Ranges.gcd sa sb, merge_opt m q pa pb) | Cell(sa,pa) , Cell(sb,pb) -> Cell(Ranges.gcd sa sb, merge_opt m q pa pb)
| Compound(sa,fa,wa), Compound(sb,fb,wb) -> | Compound(sa,fa,wa), Compound(sb,fb,wb) ->
merge_ranges m q sa fa wa sb fb wb merge_ranges m q root sa fa wa sb fb wb
| Compound(sr,fr,wr), Cell(sx,None) | Compound(sr,_,wr), Cell(sx,ptr)
| Cell(sx,None), Compound(sr,fr,wr) -> | Cell(sx,ptr), Compound(sr,_,wr) ->
let size = Ranges.gcd sx sr in let size = Ranges.gcd sx sr in
Compound(size, fr, singleton ~size @@ Ranges.squash (merge_node m q) wr) let cell = new_cell ~size ?ptr () in
Ranges.iter (merge_cell m q cell root) wr ;
| Compound(sr,fr,wr), Cell(sx,Some ptr) cell_layout cell
| Cell(sx,Some ptr), Compound(sr,fr,wr) ->
let rp = new_chunk m ~size:sx ~ptr () in
let fx = Fields.empty in
let wx = Ranges.range ~length:sx rp in
merge_ranges m q sx fx wx sr fr wr
let merge_region (m: map) (q: queue) (a : chunk) (b : chunk) : chunk = { let merge_chunk (m: map) (q:queue) (root:node)
(a : chunk) (b : chunk) : chunk = {
cparents = nodes m @@ Store.bag a.cparents b.cparents ; cparents = nodes m @@ Store.bag a.cparents b.cparents ;
cpointed = nodes m @@ Store.bag a.cpointed b.cpointed ; cpointed = nodes m @@ Store.bag a.cpointed b.cpointed ;
clabels = Lset.union a.clabels b.clabels ; clabels = Lset.union a.clabels b.clabels ;
...@@ -325,16 +335,16 @@ let merge_region (m: map) (q: queue) (a : chunk) (b : chunk) : chunk = { ...@@ -325,16 +335,16 @@ let merge_region (m: map) (q: queue) (a : chunk) (b : chunk) : chunk = {
creads = Access.Set.union a.creads b.creads ; creads = Access.Set.union a.creads b.creads ;
cwrites = Access.Set.union a.cwrites b.cwrites ; cwrites = Access.Set.union a.cwrites b.cwrites ;
cshifts = Access.Set.union a.cshifts b.cshifts ; cshifts = Access.Set.union a.cshifts b.cshifts ;
clayout = merge_layout m q a.clayout b.clayout ; clayout = merge_layout m q root a.clayout b.clayout ;
} }
let do_merge (m: map) (q: queue) (a: node) (b: node): unit = let do_merge (m: map) (q: queue) (a: node) (b: node): unit =
begin begin
let ra = Ufind.get m.store a in let ca = Ufind.get m.store a in
let rb = Ufind.get m.store b in let cb = Ufind.get m.store b in
let rx = Ufind.union m.store a b in let rt = Ufind.union m.store a b in
let rc = merge_region m q ra rb in let ck = merge_chunk m q rt ca cb in
Ufind.set m.store rx rc ; Ufind.set m.store rt ck ;
end end
let merge_all (m:map) = function let merge_all (m:map) = function
......
...@@ -83,12 +83,11 @@ let rec merge f ra rb = ...@@ -83,12 +83,11 @@ let rec merge f ra rb =
let merge f (R x) (R y) = R (merge f x y) let merge f (R x) (R y) = R (merge f x y)
let squash f = function
| R [] -> None
| R (x::xs) -> Some (List.fold_left (fun w r -> f w r.data) x.data xs)
let iteri f (R xs) = List.iter f xs let iteri f (R xs) = List.iter f xs
let foldi f w (R xs) = List.fold_left f w xs
let iter f (R xs) = List.iter (fun r -> f r.data) xs let iter f (R xs) = List.iter (fun r -> f r.data) xs
let fold f w (R xs) = List.fold_left (fun w r -> f w r.data) w xs
let mapi f (R xs) = R (List.map f xs)
let map f (R xs) = R (List.map (fun r -> { r with data = f r.data }) xs) let map f (R xs) = R (List.map (fun r -> { r with data = f r.data }) xs)
(* -------------------------------------------------------------------------- *) (* -------------------------------------------------------------------------- *)
...@@ -36,9 +36,12 @@ val empty : 'a t ...@@ -36,9 +36,12 @@ val empty : 'a t
val singleton : 'a range -> 'a t val singleton : 'a range -> 'a t
val range : ?offset:int -> ?length:int -> 'a -> 'a t val range : ?offset:int -> ?length:int -> 'a -> 'a t
val merge : ('a range -> 'a range -> 'a) -> 'a t -> 'a t -> 'a t val merge : ('a range -> 'a range -> 'a) -> 'a t -> 'a t -> 'a t
val squash : ('a -> 'a -> 'a) -> 'a t -> 'a option
val find : int -> 'a t -> 'a range val find : int -> 'a t -> 'a range
val map : ('a -> 'b) -> 'a t -> 'b t val map : ('a -> 'b) -> 'a t -> 'b t
val mapi : ('a range -> 'b range) -> 'a t -> 'b t
val iter : ('a -> unit) -> 'a t -> unit val iter : ('a -> unit) -> 'a t -> unit
val iteri : ('a range -> unit) -> 'a t -> unit val iteri : ('a range -> unit) -> 'a t -> unit
val fold : ('b -> 'a -> 'b) -> 'b -> 'a t -> 'b
val foldi : ('b -> 'a range -> 'b) -> 'b -> 'a t -> 'b
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment