open Unix;; open Printf;; open Misc;; open Syntax;; open Lexer;; let get_states chr = List.fold_left (fun x (Rule (snl,stm)) -> snl @@ x) [] chr ;; let opti_duration = ref 600.0 let optimize c = try yourelate := false; ignore(Sys.set_signal Sys.sigvtalrm (Sys.Signal_handle (fun _ -> prerr_endline "We're running late..."; yourelate := true))); ignore(Unix.setitimer Unix.ITIMER_VIRTUAL {it_interval = 0.0; it_value = !opti_duration}); let chr = Syntax.from_ast c in let clauses = Clauses.decompose chr in let states = get_states chr in let best = Tree.find_best states clauses in ignore(Unix.setitimer Unix.ITIMER_VIRTUAL {it_interval = 0.0; it_value = 0.0}); let res = Syntax.to_ast best in Results.record_attempt res; res with Timeout -> raise Timeout | _ -> c ;;