Don't needlessly run the last bottom-up phase, when the top-down is sufficient.
[tatoo.git] / src / cache.ml
index f9b7457..bc18392 100644 (file)
 (*                                                                     *)
 (***********************************************************************)
 
-(*
-  Time-stamp: <Last modified on 2013-03-18 22:41:45 CET by Kim Nguyen>
-*)
-
 module N1 =
 struct
   type 'a t = {
@@ -56,19 +52,22 @@ struct
        (* preventively allocate the space for the following elements *)
        let nlen = ((i - offset + 1) lsl 1) + 1 in
        let narray = Array.create nlen a.dummy in
-       for j = 0 to len - 1 do
+        Array.blit a.line 0 narray 0 len;
+         (*for j = 0 to len - 1 do
          narray.(j) <- a.line.(j);
-       done;
+           done; *)
        narray.(i - offset) <- v;
        a.line <- narray
       end
 
   let find a i =
     let idx = i - a.offset in
-    let len = Array.length a.line in
-    if idx >= 0 && idx < len then
-      Array.unsafe_get a.line idx
-    else a.dummy
+    if idx < 0 then a.dummy
+    else
+      let len = Array.length a.line in
+      if idx < len then
+        Array.unsafe_get a.line idx
+      else a.dummy
 
   let dummy a = a.dummy
 
@@ -110,8 +109,8 @@ struct
 
   let find a i j =
     let v = N1.find a i in
-    if v == a.N1.dummy then v.N1.dummy
-    else N1.find v j
+    if v != a.N1.dummy then N1.find v j
+    else v.N1.dummy
 
 
   let dummy c = c.N1.dummy.N1.dummy
@@ -159,8 +158,8 @@ struct
 
   let find a i j k =
     let v = N1.find a i in
-    if v == a.N1.dummy then N2.dummy v
-    else N2.find v j k
+    if v != a.N1.dummy then N2.find v j k
+    else N2.dummy v
 
 
   let dummy a = N2.dummy a.N1.dummy
@@ -279,45 +278,32 @@ end
 
 module N6 =
 struct
-  type 'a t = 'a N5.t N1.t
-
-  let create_with_level level a =
-    let dummy5 = N5.create_with_level (level+1) a in
-    N1.create_with_level (level) dummy5
+  type 'a t = 'a N3.t N3.t
 
-  let create a = create_with_level 1 a
+  let create a =
+    let dummy3 = N3.create a in
+    N3.create dummy3
 
   let add a i j k l m n v =
-    let line = N1.find a i in
-    if line == N1.dummy a then
-      let nline = N5.create_with_level (a.N1.level+1) (N5.dummy line) in
-      N1.add a i nline;
-      N5.add nline j k l m n v
+    let line = N3.find a i j k in
+    if line == N3.dummy a then
+      let nline = N3.create (N3.dummy line) in
+      N3.add a i j k nline;
+      N3.add nline l m n v
     else
-      N5.add line j k l m n v
+      N3.add line l m n v
 
   let find a i j k l m n =
-    let v = N1.find a i in
-    if v == N1.dummy a then N5.dummy v
-    else N5.find v j k l m n
+    let v = N3.find a i j k in
+    if v == N3.dummy a then N3.dummy v
+    else N3.find v l m n
 
 
-  let dummy a = N5.dummy (N1.dummy a)
+  let dummy a = N3.dummy (N3.dummy a)
   let iteri f a =
-    N1.iteri (fun i v _  ->
-      N5.iteri (fun j k l m n v2 b -> f i j k l m n v2 b) v
+    N3.iteri (fun i j k v _  ->
+      N3.iteri (fun l m n v2 b -> f i j k l m n v2 b) v
     ) a
 
-  let stats a =
-    let d = a.N1.dummy in
-    let len, used =
-      Array.fold_left (fun ((alen,aused) as acc) i ->
-        if i != d then
-          let l, u = N5.stats i in
-          (alen+l, aused+u)
-        else
-          acc) (0, 0) a.N1.line
-    in
-    len, used
-
+  let stats a = assert false
 end