Added benchmarking funtions,
[SXSI/xpathcomp.git] / ata.ml
diff --git a/ata.ml b/ata.ml
index a5d4a3f..77d5008 100644 (file)
--- a/ata.ml
+++ b/ata.ml
@@ -337,8 +337,8 @@ module FTable = Hashtbl.Make(struct
 
 
 let h_f = FTable.create BIG_H_SIZE 
-type merge_conf = NO | MARK | ONLY1 | ONLY2 | ONLY12 | MARK1 | MARK2 | MARK12
-
+type merge_conf = NO | ONLY1 | ONLY2 | ONLY12 | MARK | MARK1 | MARK2 | MARK12
+(* 000 001 010 011 100 101 110 111 *)
 let eval_formlist tag s1 s2 fl =
   let rec loop fl =
           try 
@@ -447,14 +447,14 @@ let tags_of_state a q =
        else 0
       let merge conf t res1 res2 = 
        match conf with
-           NO -> 0
+           NO -> 0                         
          | MARK -> 1
-         | ONLY12 -> res1+res2
-         | ONLY1 -> res1
-         | ONLY2 -> res2
-         | MARK12 -> res1+res2+1
-         | MARK1 -> res1+1
-         | MARK2 -> res2+1
+         | MARK1 -> res1+1         
+         | ONLY1 -> res1                
+         | ONLY2 -> res2           
+         | ONLY12 -> res1+res2     
+         | MARK2 -> res2+1         
+         | MARK12 -> res1+res2+1   
 
       let mk_quick_tag_loop _ sl ss tree tag = ();
        fun t ctx ->
@@ -797,8 +797,8 @@ END
          (mk_fun (fun _ -> Tree.nil) "Tree.mk_nil")
          (mk_fun (Tree.tagged_child tree) "Tree.tagged_child") 
          (mk_fun (Tree.select_child tree) "Tree.select_child")
-         (mk_fun (Tree.tagged_desc tree) "Tree.tagged_desc")
-         (mk_fun (Tree.select_desc tree) "Tree.select_desc") 
+         (mk_fun (Tree.tagged_descendant tree) "Tree.tagged_desc")
+         (mk_fun (Tree.select_descendant tree) "Tree.select_desc") 
          (mk_fun (fun _ _ -> Tree.first_child tree) "[FIRSTCHILD]Tree.select_child_desc")
          (mk_fun (Tree.first_element tree) "Tree.first_element")
          (mk_fun (Tree.first_child tree) "Tree.first_child") 
@@ -806,13 +806,13 @@ END
       let choose_jump_next tree d = 
        choose_jump d
          (mk_fun (fun _ _ -> Tree.nil) "Tree.mk_nil2")
-         (mk_fun (Tree.tagged_sibling_ctx tree) "Tree.tagged_sibling_ctx")
-         (mk_fun (Tree.select_sibling_ctx tree) "Tree.select_sibling_ctx")
-         (mk_fun (Tree.tagged_foll_ctx tree) "Tree.tagged_foll_ctx")
-         (mk_fun (Tree.select_foll_ctx tree) "Tree.select_foll_ctx")
-         (mk_fun (fun _ _ -> Tree.next_sibling_ctx tree) "[NEXTSIBLING]Tree.select_sibling_foll_ctx")
-         (mk_fun (Tree.next_element_ctx tree) "Tree.next_element_ctx")   
-         (mk_fun (Tree.next_sibling_ctx tree) "Tree.node_sibling_ctx")   
+         (mk_fun (Tree.tagged_following_sibling_below tree) "Tree.tagged_sibling_ctx")
+         (mk_fun (Tree.select_following_sibling_below tree) "Tree.select_sibling_ctx")
+         (mk_fun (Tree.tagged_following_below tree) "Tree.tagged_foll_ctx")
+         (mk_fun (Tree.select_following_below tree) "Tree.select_foll_ctx")
+         (mk_fun (fun _ _ -> Tree.next_sibling_below tree) "[NEXTSIBLING]Tree.select_sibling_foll_ctx")
+         (mk_fun (Tree.next_element_below tree) "Tree.next_element_ctx")         
+         (mk_fun (Tree.next_sibling_below tree) "Tree.node_sibling_ctx")         
                          
          
       module SListTable = Hashtbl.Make(struct type t = SList.t
@@ -878,7 +878,18 @@ END
          in
          set tab tag data        
       end
-
+       
+      module TransCache2 = struct
+       include Hashtbl.Make (struct
+                       type t = Tag.t*SList.t
+                       let equal (a,b) (c,d) = a==c && b==d
+                       let hash (a,b) = HASHINT2((Obj.magic a), b.SList.Node.id)
+                     end)
+
+       let add h t s d = add h (t,s) d
+       let find h t s = find h (t,s)
+      end
+       
       let td_trans = TransCache.create 10000 (* should be number of tags *number of states^2
                                                in the document *)
 
@@ -892,35 +903,6 @@ END
                                             let hash t = t.Formlistlist.Node.id
                                      end)
        
-      module Fold2ResOld =
-      struct
-       type 'a t = 'a SListTable.t SListTable.t FllTable.t
-       let create n = Array.init 10000 (fun _ -> FllTable.create n)
-
-       let find h tag fl s1 s2 =
-         let hf = h.(tag) in
-         let hs1 = FllTable.find hf fl in
-         let hs2 = SListTable.find hs1 s1 in
-         SListTable.find hs2 s2
-         
-       let add h tag fl s1 s2 data = 
-         let hf = h.(tag) in
-         let hs1 =
-           try FllTable.find hf fl with
-             | Not_found -> 
-                 let hs1 = SListTable.create SMALL_H_SIZE
-                 in FllTable.add hf fl hs1;hs1
-         in
-         let hs2 =
-           try SListTable.find hs1 s1
-           with
-             | Not_found ->
-                 let hs2 = SListTable.create SMALL_H_SIZE
-                 in SListTable.add hs1 s1 hs2;hs2
-         in
-         SListTable.add hs2 s2 data
-      end
-
       module Fold2Res = struct
        external get : 'a array -> int ->'a = "%array_unsafe_get"
        external set : 'a array -> int -> 'a -> unit = "%array_unsafe_set"
@@ -976,7 +958,20 @@ END
          in
          set as2 s2.SList.Node.id data    
       end
-
+       
+      module Fold2Res2 = struct
+       include Hashtbl.Make(struct 
+                              type t = Tag.t*Formlistlist.t*SList.t*SList.t
+                              let equal (a,b,c,d) (x,y,z,t) =
+                                a == x && b == y && c == z && d == t
+                              let hash (a,b,c,d) = HASHINT4 (a,b.Formlistlist.Node.id,
+                                                             c.SList.Node.id,d.SList.Node.id)
+                            end)
+       let add h t f s1 s2 d =
+         add h (t,f,s1,s2) d
+       let find h t f s1 s2 =
+         find h (t,f,s1,s2)
+      end
 
       let h_fold2 = Fold2Res.create 10000
       
@@ -986,35 +981,37 @@ END
        (* evaluation starts from the right so we put sl1,res1 at the end *)
        let eval_fold2_slist fll t tag (sl2,res2) (sl1,res1) =
          let res = Array.copy rempty in
-         try
-           let r,b,btab = Fold2Res.find h_fold2 tag fll sl1 sl2  in
-           if b then for i=0 to slot_size - 1 do
-             res.(i) <- RS.merge btab.(i) t res1.(i) res2.(i);
-           done;
-           r,res
-         with
-            Not_found ->
-              let btab = Array.make slot_size NO in        
-              let rec fold l1 l2 fll i aq ab = 
-                match fll.Formlistlist.Node.node,
-                  l1.SList.Node.node,
-                  l2.SList.Node.node
-                with        
-                  | Formlistlist.Cons(fl,fll),
-                   SList.Cons(s1,ll1),
-                   SList.Cons(s2,ll2) ->
-                      let r',conf = eval_formlist tag s1 s2 fl in
-                      let _ = btab.(i) <- conf
+          try
+            let r,b,btab = Fold2Res.find h_fold2 tag fll sl1 sl2  in
+            if b then for i=0 to slot_size - 1 do
+            res.(i) <- RS.merge btab.(i) t res1.(i) res2.(i);
+            done;
+            r,res
+            with
+            Not_found -> 
+              begin 
+                let btab = Array.make slot_size NO in      
+                let rec fold l1 l2 fll i aq ab = 
+                  match fll.Formlistlist.Node.node,
+                    l1.SList.Node.node,
+                    l2.SList.Node.node
+                  with      
+                    | Formlistlist.Cons(fl,fll),
+                     SList.Cons(s1,ll1),
+                     SList.Cons(s2,ll2) ->
+                        let r',conf = eval_formlist tag s1 s2 fl in
+                        let _ = btab.(i) <- conf
                       in
-                      fold ll1 ll2 fll (i+1) (SList.cons r' aq) ((conf!=NO)||ab)
-                  | _ -> aq,ab
-              in
-              let r,b = fold sl1 sl2 fll 0 SList.nil false in
-              Fold2Res.add h_fold2 tag fll sl1 sl2 (r,b,btab);
-              if b then for i=0 to slot_size - 1 do
-                res.(i) <- RS.merge btab.(i) t res1.(i) res2.(i);
-              done;
-              r,res
+                        fold ll1 ll2 fll (i+1) (SList.cons r' aq) ((conf!=NO)||ab)
+                    | _ -> aq,ab
+                in
+                let r,b = fold sl1 sl2 fll 0 SList.nil false in
+                 Fold2Res.add h_fold2 tag fll sl1 sl2 (r,b,btab); 
+                if b then for i=0 to slot_size - 1 do
+                  res.(i) <- RS.merge btab.(i) t res1.(i) res2.(i);
+                done;
+                r,res;
+              end
        in
 
        let null_result = (pempty,Array.copy rempty) in
@@ -1029,7 +1026,7 @@ END
            try
              TransCache.find td_trans tag slist
            with        
-             | Not_found ->
+             | Not_found -> 
                  let fl_list,llist,rlist,ca,da,sa,fa = 
                    SList.fold 
                      (fun set (fll_acc,lllacc,rllacc,ca,da,sa,fa) -> (* For each set *)
@@ -1067,7 +1064,10 @@ END
                  let d_n = Algebra.decide a tags_siblings tags_after (StateSet.union sa fa) false in
                  let f_kind,first = choose_jump_down tree d_f
                  and n_kind,next = if noright then (`NIL, fun _ _ -> Tree.nil )
-                 else choose_jump_next tree d_n in
+                 else choose_jump_next tree d_n in 
+                 (*let f_kind,first = `ANY, Tree.first_child tree
+                 and n_kind,next = `ANY, Tree.next_sibling_below tree 
+                 in *)
                  let empty_res = null_result in
                   let cont =
                     match f_kind,n_kind with
@@ -1096,13 +1096,13 @@ END
                       | `NIL,_ -> (
                           match n_kind with
                             |`TAG(tag') ->
-                              if SList.equal rlist slist && tag == tag' then
+                              (*if SList.equal rlist slist && tag == tag' then
                               let rec loop t ctx = 
                                 if t == Tree.nil then empty_res else 
                                 let res2 = loop (next t ctx) ctx in                               
                                 eval_fold2_slist fl_list t tag res2 empty_res            
                               in loop
-                              else
+                              else *)
                                (fun t ctx -> eval_fold2_slist fl_list t (Tree.tag tree t)
                                  (loop_tag tag' (next t ctx) rlist ctx ) empty_res)
                                                                                             
@@ -1130,7 +1130,7 @@ END
                               (loop (first t) llist t ))
                                                                   
                       | `ANY,`ANY ->
-                         if SList.equal slist rlist && SList.equal slist llist
+                         (*if SList.equal slist rlist && SList.equal slist llist
                          then
                          let rec loop t ctx = 
                            if t == Tree.nil then empty_res else
@@ -1139,7 +1139,7 @@ END
                            in
                            eval_fold2_slist fl_list t (Tree.tag tree t) r2 r1
                          in loop
-                         else
+                         else *)
                           (fun t ctx ->
                              eval_fold2_slist fl_list t (Tree.tag tree t)
                                (loop (next t ctx) rlist ctx )
@@ -1157,7 +1157,7 @@ END
                                        (a,b)
                                     ) ,cont)
                   in
-                  (TransCache.add td_trans tag slist cont ;cont)
+                  (   TransCache.add td_trans tag slist cont  ;   cont)
          in cont t ctx
               
        in 
@@ -1371,7 +1371,7 @@ END
            match k with
              | `TAG (tag) -> 
                  (*Tree.tagged_lowest t tag, fun tree -> Tree.tagged_next tree tag*)
-                 (Tree.tagged_desc tree tag t, let jump = Tree.tagged_foll_ctx tree tag
+                 (Tree.tagged_descendant tree tag t, let jump = Tree.tagged_following_below tree tag
                  in fun n -> jump n t )
              | `CONTAINS(_) -> (Tree.text_below tree t,let jump = Tree.text_next tree 
                                 in fun n -> jump n t)