une version marché et correcte avec bitvector
[tatoo.git] / src / table.ml
index 64d4103..c40e93b 100644 (file)
@@ -144,7 +144,7 @@ let get_list_ordred tree ll =
   let l1 = List.fold_left (fun acc l -> merge_list tree acc l) [] ll in
   List.rev l1
 
-let get_descendant tree v =
+let get_descendant tree v =
   let rec aux n acc =
     if n == Naive_tree.nil then acc
     else let n1 = Naive_tree.first_child tree n in
@@ -156,12 +156,21 @@ let get_descendant tree v =
   in       
   let v0 = Bitvector.create (Naive_tree.size tree) in
  (* let v = bitvector_of_nodes tree ln in*)
-  for i = 0 to (Bitvector.length v)-1 do
-    if Bitvector.get v i then
-      let n = Naive_tree.by_preorder tree i in
-      let n1 = Naive_tree.first_child tree n in
-      let _ = aux n1 v0 in ();
-  done;
+  if c then begin
+    for i = 0 to (Bitvector.length v)-1 do
+      if Bitvector.get v i then
+       let n = Naive_tree.by_preorder tree i in
+       let n1 = Naive_tree.first_child tree n in
+       let _ = aux n1 v0 in 
+       Bitvector.set v0 i true
+    done; end
+  else
+    for i = 0 to (Bitvector.length v)-1 do
+      if Bitvector.get v i then
+       let n = Naive_tree.by_preorder tree i in
+       let n1 = Naive_tree.first_child tree n in
+       let _ = aux n1 v0 in ()
+    done;
   v0
 
 let get_child tree v =
@@ -218,24 +227,46 @@ let get_parent tree v =
   done;
   v0
 
-let get_ancestor tree v =
+let get_ancestor tree v =
   let v0 = Bitvector.create (Naive_tree.size tree) in
  (* let v = bitvector_of_nodes tree ln in  *)
-
-  for i = (Bitvector.length v)-1 downto 0 do
-    if Bitvector.get v i then
-      let n = Naive_tree.by_preorder tree i in
-      let n0 = ref n in
-      while !n0 != Naive_tree.nil do
-       let n1 = get_firstBling tree !n0 Naive_tree.nil in
-       let n2 = Naive_tree.parent_of_first tree n1 in
-       n0 := n2;
-       if n2 != Naive_tree.nil then begin let j = Naive_tree.preorder tree n2 in
-                                          Bitvector.set v0 j true;
-                                          Bitvector.set v j true;
-       end
+  if b then 
+    begin
+      for i = (Bitvector.length v)-1 downto 0 do
+       if Bitvector.get v i then 
+         begin
+           Bitvector.set v0 i true;
+           let n = Naive_tree.by_preorder tree i in
+           let n0 = ref n in
+           while !n0 != Naive_tree.nil do
+             let n1 = get_firstBling tree !n0 Naive_tree.nil in
+             let n2 = Naive_tree.parent_of_first tree n1 in
+             n0 := n2;
+             if n2 != Naive_tree.nil then begin let j = Naive_tree.preorder tree n2 in
+                                                Bitvector.set v0 j true;
+                                                Bitvector.set v j true;
+             end
+           done;
+         end
       done;
-  done;
+    end
+  else
+    for i = (Bitvector.length v)-1 downto 0 do
+      if Bitvector.get v i then 
+       begin
+         let n = Naive_tree.by_preorder tree i in
+         let n0 = ref n in
+         while !n0 != Naive_tree.nil do
+           let n1 = get_firstBling tree !n0 Naive_tree.nil in
+           let n2 = Naive_tree.parent_of_first tree n1 in
+           n0 := n2;
+           if n2 != Naive_tree.nil then begin let j = Naive_tree.preorder tree n2 in
+                                              Bitvector.set v0 j true;
+                                              Bitvector.set v j true;
+           end
+         done;
+       end
+    done;
   v0
 
 let get_preSibling tree v =
@@ -267,18 +298,16 @@ let rec eval_axis tree v a =
            
          | Child -> get_child tree v
                       
-         | Descendant c -> let v2 = get_descendant tree v in
-                           if not c then v2
-                           else Bitvector.union v2 v
+         | Descendant c ->  get_descendant tree c v 
+                           
                           
                              
          | FollowingSibling -> get_followingSibling tree v
                                  
          | Parent -> get_parent tree v
                        
-         | Ancestor b -> let v2 = get_ancestor tree v in
-                         if not b then v2
-                         else Bitvector.union v2 v    
+         | Ancestor b ->  get_ancestor tree b v 
+    
                          
                            
          | PrecedingSibling -> get_preSibling tree v