]> matita.cs.unibo.it Git - helm.git/commitdiff
added (but not active) last chance idea
authorEnrico Tassi <enrico.tassi@inria.fr>
Mon, 29 Jun 2009 12:59:20 +0000 (12:59 +0000)
committerEnrico Tassi <enrico.tassi@inria.fr>
Mon, 29 Jun 2009 12:59:20 +0000 (12:59 +0000)
helm/software/components/ng_paramodulation/paramod.ml

index a92bf5dcccb7d9a86c9300c7001b9134810ded82..43b57b6cd0b8da83f116eda2b4c6fc6a827782ec 100644 (file)
@@ -13,6 +13,8 @@
 
 let debug s = prerr_endline s ;;
 let debug _ = ();;
+
+let monster = 500;;
     
 module Paramod (B : Terms.Blob) = struct
   exception Failure of string * B.t Terms.bag * int * int
@@ -24,14 +26,14 @@ module Paramod (B : Terms.Blob) = struct
   module Utils = FoUtils.Utils(B) 
   module WeightOrderedPassives =
       struct
-       type t = B.t Terms.passive_clause
-       let compare = Utils.compare_passive_clauses_weight
+        type t = B.t Terms.passive_clause
+        let compare = Utils.compare_passive_clauses_weight
       end
 
   module AgeOrderedPassives =
       struct
-       type t = B.t Terms.passive_clause
-       let compare = Utils.compare_passive_clauses_age
+        type t = B.t Terms.passive_clause
+        let compare = Utils.compare_passive_clauses_age
       end
   
   module WeightPassiveSet = Set.Make(WeightOrderedPassives)
@@ -93,17 +95,17 @@ module Paramod (B : Terms.Blob) = struct
     if is_passive_set_empty passives then begin
       assert (not (is_passive_set_empty g_passives));
       let g_cl = pick_min_passive ~use_age:use_age g_passives in
-       (true,snd g_cl,passives,remove_passive_clause g_passives g_cl)
+        (true,g_cl,passives,remove_passive_clause g_passives g_cl)
     end
     else let cl = pick_min_passive ~use_age:use_age passives in
       if is_passive_set_empty g_passives then
-       (false,snd cl,remove_passive_clause passives cl,g_passives)
+        (false,cl,remove_passive_clause passives cl,g_passives)
       else
-       let g_cl = pick_min_passive ~use_age:use_age g_passives in
-         if (fst cl <= fst g_cl) then
-           (false,snd cl,remove_passive_clause passives cl,g_passives)
-         else
-           (true,snd g_cl,passives,remove_passive_clause g_passives g_cl)
+        let g_cl = pick_min_passive ~use_age:use_age g_passives in
+          if (fst cl <= fst g_cl) then
+            (false,cl,remove_passive_clause passives cl,g_passives)
+          else
+            (true,g_cl,passives,remove_passive_clause g_passives g_cl)
   ;;
 
   let backward_infer_step bag maxvar actives passives
@@ -113,7 +115,7 @@ module Paramod (B : Terms.Blob) = struct
       let bag, maxvar, new_goals = 
         Sup.infer_left bag maxvar g_current actives 
       in
-       debug "Performed infer_left step";
+        debug "Performed infer_left step";
         bag, maxvar, actives, passives, g_current::g_actives,
     (add_passive_clauses g_passives new_goals)
   ;;
@@ -137,25 +139,25 @@ module Paramod (B : Terms.Blob) = struct
       debug "Demodulating goals with actives...";
       (* keep goals demodulated w.r.t. actives and check if solved *)
       let bag, g_actives = 
-       List.fold_left 
+        List.fold_left 
           (fun (bag,acc) c -> 
-            match 
-              Sup.simplify_goal ~no_demod:false maxvar (snd actives) bag acc c
-            with
-              | None -> bag, acc
-              | Some (bag,c) -> bag,c::acc)
+             match 
+               Sup.simplify_goal ~no_demod:false maxvar (snd actives) bag acc c
+             with
+               | None -> bag, acc
+               | Some (bag,c) -> bag,c::acc)
           (bag,[]) g_actives 
       in
       let ctable = IDX.index_unit_clause IDX.DT.empty current in
       let bag, maxvar, new_goals = 
-       List.fold_left 
-         (fun (bag,m,acc) g -> 
-            let bag, m, ng = Sup.infer_left bag m g
-              ([current],ctable) in
-              bag,m,ng@acc) 
-         (bag,maxvar,[]) g_actives 
+        List.fold_left 
+          (fun (bag,m,acc) g -> 
+             let bag, m, ng = Sup.infer_left bag m g
+               ([current],ctable) in
+               bag,m,ng@acc) 
+          (bag,maxvar,[]) g_actives 
       in
-       bag, maxvar, actives,
+    bag, maxvar, actives,
     add_passive_clauses passives new_clauses, g_actives,
     add_passive_clauses g_passives new_goals
   ;;
@@ -172,111 +174,114 @@ module Paramod (B : Terms.Blob) = struct
       (match timeout with
       | None -> assert false
       | Some timeout -> Unix.gettimeofday () > timeout) then
-       begin
-         prerr_endline("Last chance: "^string_of_float (Unix.gettimeofday()));
-          given_clause ~noinfer:true bag maxvar iterno max_steps None
-           actives passives g_actives g_passives
-             (*raise (Failure ("Timeout !",bag,maxvar,iterno))*)
-       end
-    else
+        if noinfer then
+          begin
+            debug 
+              ("Last chance: all is indexed " ^ string_of_float
+                (Unix.gettimeofday()));
+            let maxgoals = 100 in
+            ignore(List.fold_left 
+              (fun (acc,i) x -> 
+                 if i < maxgoals then
+                 ignore(Sup.simplify_goal ~no_demod:true 
+                          maxvar (snd actives) bag acc x)
+                 else
+                   ();
+                 x::acc,i+1)
+              ([],0) g_actives);
+            raise (Failure (("Last chance: failed over " ^ 
+              string_of_int maxgoals^ " goal " ^ 
+              string_of_float (Unix.gettimeofday())),bag,maxvar,0));
+          end
+        else if false then (* activates last chance strategy *)
+          begin
+           debug("Last chance: "^string_of_float (Unix.gettimeofday()));
+           given_clause ~noinfer:true bag maxvar iterno max_steps 
+             (Some (Unix.gettimeofday () +. 20.))
+             actives passives g_actives g_passives;
+           raise (Failure ("Timeout !",bag,maxvar,iterno))
+          end
+        else raise (Failure ("Timeout !",bag,maxvar,iterno));
 
-    let use_age = iterno mod 10 = 0 in
+    (* let use_age = iterno mod 10 = 0 in *)
 
     let rec aux_select bag passives g_passives =
-      if noinfer && 
-       is_passive_set_empty passives && 
-       is_passive_set_empty g_passives then
-         begin
-           prerr_endline 
-             ("Last chance: all is indexed " ^ string_of_float
-               (Unix.gettimeofday()));
-           let maxgoals = 100 in
-            List.fold_left 
-             (fun (acc,i) x -> 
-                if i < maxgoals then
-                ignore(Sup.simplify_goal ~no_demod:true 
-                         maxvar (snd actives) bag acc x)
-                else
-                  ();
-                x::acc,i+1)
-             ([],0) g_actives;
-           raise (Failure (("Last chance: failed over " ^ 
-              string_of_int maxgoals^ " goal " ^ 
-              string_of_float (Unix.gettimeofday())),bag,maxvar,0));
-         end;
-      let backward,current,passives,g_passives =
-       select ~use_age:false passives g_passives
+      let backward,(weight,current),passives,g_passives =
+        select ~use_age:false passives g_passives
       in
-       if backward then
-        match 
-          if noinfer then Some (bag,current)
-          else 
-            Sup.simplify_goal 
-              ~no_demod:false maxvar (snd actives) bag g_actives current 
-        with
-           | None -> aux_select bag passives g_passives
-           | Some (bag,g_current) ->
+        if backward then
+         match 
+           if noinfer then 
+             if weight > monster then None else Some (bag,current)
+           else 
+             Sup.simplify_goal 
+               ~no_demod:false maxvar (snd actives) bag g_actives current 
+         with
+            | None -> aux_select bag passives g_passives
+            | Some (bag,g_current) ->
                if noinfer then 
-                let g_actives = g_current :: g_actives in 
-                bag,maxvar,actives,passives,g_actives,g_passives
-              else
-                backward_infer_step bag maxvar actives passives
-                  g_actives g_passives g_current
-       else
-         (* debug ("Selected fact : " ^ Pp.pp_unit_clause current); *)
+                 let g_actives = g_current :: g_actives in 
+                 bag,maxvar,actives,passives,g_actives,g_passives
+               else
+                 backward_infer_step bag maxvar actives passives
+                   g_actives g_passives g_current
+        else
+          let _ = debug ("Selected fact : " ^ Pp.pp_unit_clause current) in
          (*let is_orphan = Sup.orphan_murder bag (fst actives) current in*)
           match 
-            if noinfer then bag, Some (current,actives)
-           else if Sup.orphan_murder bag (fst actives) current then
-             let (id,_,_,_) = current in
-             let bag = Terms.M.add id (current,true) bag in
-               bag, None
-           else Sup.keep_simplified current actives bag maxvar
-         with
-       (*match Sup.one_pass_simplification current actives bag maxvar with*)
-             | bag,None -> aux_select bag passives g_passives
-             | bag,Some (current,actives) ->
-(*                 if is_orphan then prerr_endline
-                     ("WRONG discarded: " ^ (Pp.pp_unit_clause current));
-                 List.iter (fun x ->
-                              prerr_endline (Pp.pp_unit_clause x))
-                   (fst actives);*)
+            if noinfer then 
+              if weight > monster then bag,None 
+              else  bag, Some (current,actives)
+            else if Sup.orphan_murder bag (fst actives) current then
+              let (id,_,_,_) = current in
+              let bag = Terms.M.add id (current,true) bag in
+                bag, None
+            else Sup.keep_simplified current actives bag maxvar
+          with
+        (*match Sup.one_pass_simplification current actives bag maxvar with*)
+              | bag,None -> aux_select bag passives g_passives
+              | bag,Some (current,actives) ->
+(*                    if is_orphan then prerr_endline
+                      ("WRONG discarded: " ^ (Pp.pp_unit_clause current));
+                  List.iter (fun x ->
+                               prerr_endline (Pp.pp_unit_clause x))
+                    (fst actives);*)
 
-(*               List.iter (fun (id,_,_,_) -> let (cl,d) =
-                            Terms.M.find id bag in 
-                            if d then prerr_endline
-                              ("WRONG discarded: " ^ (Pp.pp_unit_clause cl)))
-                   (current::fst actives);*)
-                 if noinfer then
-                   let actives = 
-                     current::fst actives,
-                     IDX.index_unit_clause (snd actives) current
-                   in
-                   bag,maxvar,actives,passives,g_actives,g_passives
-                 else
-                   forward_infer_step bag maxvar actives passives
-                     g_actives g_passives current
+(*                  List.iter (fun (id,_,_,_) -> let (cl,d) =
+                             Terms.M.find id bag in 
+                             if d then prerr_endline
+                               ("WRONG discarded: " ^ (Pp.pp_unit_clause cl)))
+                    (current::fst actives);*)
+                  if noinfer then
+                    let actives = 
+                      current::fst actives,
+                      IDX.index_unit_clause (snd actives) current
+                    in
+                    bag,maxvar,actives,passives,g_actives,g_passives
+                  else
+                    forward_infer_step bag maxvar actives passives
+                      g_actives g_passives current
     in
     
 
       (*prerr_endline "Active table :"; 
        (List.iter (fun x -> prerr_endline (Pp.pp_unit_clause x))
-         (fst actives)); *)
+          (fst actives)); *)
 
     let bag,maxvar,actives,passives,g_actives,g_passives =      
       aux_select bag passives g_passives
     in
       debug
-       (Printf.sprintf "Number of active goals : %d"
-          (List.length g_actives));
+        (Printf.sprintf "Number of active goals : %d"
+           (List.length g_actives));
       debug
-       (Printf.sprintf "Number of passive goals : %d"
-          (passive_set_cardinal g_passives));
+        (Printf.sprintf "Number of passive goals : %d"
+           (passive_set_cardinal g_passives));
       debug
-       (Printf.sprintf "Number of actives : %d" (List.length (fst actives)));
+        (Printf.sprintf "Number of actives : %d" (List.length (fst actives)));
       debug
-       (Printf.sprintf "Number of passives : %d"
-          (passive_set_cardinal passives));
+        (Printf.sprintf "Number of passives : %d"
+           (passive_set_cardinal passives));
       given_clause ~noinfer
         bag maxvar iterno max_steps timeout 
         actives passives g_actives g_passives
@@ -301,15 +306,15 @@ module Paramod (B : Terms.Blob) = struct
           let rec traverse ongoal (accg,acce) i =
             match Terms.M.find i bag with
               | (id,_,_,Terms.Exact _),_ ->
-               if ongoal then [i],acce else
-                 if (List.mem i acce) then accg,acce else accg,acce@[i]
+                  if ongoal then [i],acce else
+                    if (List.mem i acce) then accg,acce else accg,acce@[i]
               | (_,_,_,Terms.Step (_,i1,i2,_,_,_)),_ ->
-               if (not ongoal) && (List.mem i acce) then accg,acce
-               else
+                  if (not ongoal) && (List.mem i acce) then accg,acce
+                  else
                     let accg,acce = 
-                   traverse false (traverse ongoal (accg,acce) i1) i2
-                 in
-                   if ongoal then i::accg,acce else accg,i::acce
+                      traverse false (traverse ongoal (accg,acce) i1) i2
+                    in
+                      if ongoal then i::accg,acce else accg,i::acce
           in
           let gsteps,esteps = traverse true ([],[]) i in
             (List.rev esteps)@gsteps