X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=main.ml;h=ee14b34184fc0bcc59d425858283cd58962d93b2;hb=83b4813de7204842bb59d5cb0aec71aff633ca85;hp=4e12ae8dc3f3fe920f30e2a5ed7f83b6f5408159;hpb=09870a49122b3d7048422818dbb0a038513b4d14;p=SXSI%2Fxpathcomp.git diff --git a/main.ml b/main.ml index 4e12ae8..ee14b34 100644 --- a/main.ml +++ b/main.ml @@ -6,24 +6,41 @@ (******************************************************************************) open Ata +INCLUDE "utils.ml" +let () = init_timer();; -let l = ref [] ;; -let time f x = - let t1 = Unix.gettimeofday () in - let r = f x in - let t2 = Unix.gettimeofday () in - let t = (1000. *. (t2 -. t1)) in - l:= t::!l; - Printf.eprintf " %fms\n%!" t ; - r -;; -let total_time () = List.fold_left (+.) 0. !l;; let enabled_gc = Gc.get() let disabled_gc = { Gc.get() with Gc.max_overhead = 1000000; Gc.space_overhead = 100 } +let hash x = 131*x/(x-1+1) +let test_loop tree tag = + let t' = Tree.tagged_desc tree tag Tree.root in + let f = Hashtbl.create 4096 + in + let jump t _ = Tree.tagged_foll_ctx tree tag t Tree.root in + let g t ctx = + if t == Tree.nil then 0 + else 1+ ((Hashtbl.find f (hash 101)) (jump t ctx) ctx) + in + Hashtbl.add f (hash 101) g; + (Hashtbl.find f (hash 101)) t' Tree.root +let test_loop2 tree tag = + let t' = Tree.tagged_desc tree tag Tree.root in + let f = Hashtbl.create 4096 + in + let jump t _ = Tree.tagged_foll_ctx tree tag t Tree.root in + let rec g t ctx = + if t == Tree.nil then 0 + else 1+ (match (Hashtbl.find f (hash 101)) with + `Foo ->g (jump t ctx) ctx + ) + in + Hashtbl.add f (hash 101) `Foo; + g t' Tree.root let main v query_string output = + let _ = Tag.init (Tree.tag_pool v) in Printf.eprintf "Parsing query : "; let query = try @@ -32,41 +49,49 @@ let main v query_string output = with Ulexer.Loc.Exc_located ((x,y),e) -> Printf.eprintf "character %i-%i %s\n" x y (Printexc.to_string e);exit 1 in - XPath.Ast.print Format.err_formatter query; - Format.fprintf Format.err_formatter "\n%!"; - Printf.eprintf "Compiling query : "; - let auto,ltags,contains = time (XPath.Compile.compile ~querystring:query_string) query in - let _ = Ata.dump Format.err_formatter auto in - let _ = Printf.eprintf "%!" in - let jump_to = - match contains with - None -> (max_int,`NOTHING) - | Some s -> - let r = Tree.count v s - in - Printf.eprintf "%i documents in the TextCollection\n" (Tree.text_size v); - Printf.eprintf "Global count is %i, using " r; - if r < !Options.tc_threshold then begin - Printf.eprintf "TextCollection contains\nCalling global contains : "; - time (Tree.init_contains v) s; - end - else begin - Printf.eprintf "Naive contains\nCalling global contains : "; - time (Tree.init_naive_contains v) s - end;(r,`CONTAINS(s)) - in + let _ = Printf.eprintf "Timing //keyword :" in + let r = time (test_loop v) (Tag.tag "keyword") in + let _ = Printf.eprintf "Count is %i\n%!" r in + let _ = Printf.eprintf "Timing //keyword 2:" in + let r = time (test_loop2 v) (Tag.tag "keyword") in + let _ = Printf.eprintf "Count is %i\n%!" r in + XPath.Ast.print Format.err_formatter query; + Format.fprintf Format.err_formatter "\n%!"; + Printf.eprintf "Compiling query : "; + let auto,ltags,contains = time (XPath.Compile.compile ~querystring:query_string) query in + let _ = Ata.dump Format.err_formatter auto in + let _ = Printf.eprintf "%!" in + let jump_to = + match contains with + None -> (max_int,`NOTHING) + | Some s -> + let r = Tree.count v s + in + Printf.eprintf "%i documents in the TextCollection\n" (Tree.text_size v); + Printf.eprintf "Global count is %i, using " r; + if r < !Options.tc_threshold then begin + Printf.eprintf "TextCollection contains\nCalling global contains : "; + time (Tree.init_contains v) s; + end + else begin + Printf.eprintf "Naive contains\nCalling global contains : "; + time (Tree.init_naive_contains v) s + end;(r,`CONTAINS(s)) + in + let test_list = jump_to in + (* let test_list = - if (!Options.backward) then begin - Printf.eprintf "Finding min occurences : "; - time - ( List.fold_left (fun ((min_occ,kind)as acc) (tag,_) -> - let numtags = Tree.subtree_tags v tag in + if (!Options.backward) then begin + Printf.eprintf "Finding min occurences : "; + time + ( List.fold_left (fun ((min_occ,kind)as acc) (tag,_) -> + let numtags = Tree.subtree_tags v tag Tree.root in if ((numtags < min_occ) && numtags >= 2) then (numtags,`TAG(tag)) else acc) jump_to) ltags end else (max_int,`NOTHING) - in + in*) let _ = if (snd test_list) != `NOTHING then let occ,s1,s2 = match test_list with | (x,`TAG (tag)) -> (x, "tag", (Tag.to_string tag)) @@ -79,7 +104,8 @@ let main v query_string output = (if !Options.count_only then "(counting only)" else if !Options.backward then "(bottomup)" else ""); begin let _ = Gc.full_major();Gc.compact() in - (* let _ = Gc.set (disabled_gc) in *) + let _ = Printf.eprintf "%!" in + let _ = Gc.set (disabled_gc) in if !Options.backward && ((snd test_list) != `NOTHING )then let r = time (bottom_up_count auto v )(snd test_list) in @@ -107,9 +133,9 @@ let main v query_string output = let oc = open_out f in output_string oc "\n"; IdSet.iter (fun t -> - Tree.print_xml_fast oc t; + Tree.print_xml_fast oc v t; output_char oc '\n'; - output_string oc "----------\n"; + ) result) (); end; end; @@ -119,13 +145,13 @@ let main v query_string output = Options.parse_cmdline();; -let v = +let v = if (Filename.check_suffix !Options.input_file ".srx") then begin Printf.eprintf "Loading from file : "; time (Tree.load ~sample:!Options.sample_factor ) - (Filename.chop_suffix !Options.input_file ".srx"); + !Options.input_file; end else let v =