Added time/size limits to test utility

This commit is contained in:
Guillaume Bury 2014-11-02 11:02:08 +01:00
parent 7cd1f38d49
commit 4daf685b3e
2 changed files with 57 additions and 2 deletions

View file

@ -4,7 +4,7 @@ solvertest () {
for f in `find $1 -name *.d -type f` for f in `find $1 -name *.d -type f`
do do
echo -ne "\r\033[K Testing $f " echo -ne "\r\033[K Testing $f "
tests/main $f | grep $2 > /dev/null 2> /dev/null tests/main -t 5s -s 1G $f | grep $2 > /dev/null 2> /dev/null
RET=$? RET=$?
if [ $RET -ne 0 ]; if [ $RET -ne 0 ];
then then

View file

@ -1,19 +1,62 @@
module S = Sat.Make(struct end) module S = Sat.Make(struct end)
exception Out_of_time
exception Out_of_space
(* Arguments parsing *) (* Arguments parsing *)
let file = ref "" let file = ref ""
let p_assign = ref false let p_assign = ref false
let time_limit = ref 300.
let size_limit = ref 1000_000_000.
;;
let int_arg r arg =
let l = String.length arg in
let multiplier m =
let arg1 = String.sub arg 0 (l-1) in
r := m *. (float_of_string arg1)
in
if l = 0 then raise (Arg.Bad "bad numeric argument")
else
try
match arg.[l-1] with
| 'k' -> multiplier 1e3
| 'M' -> multiplier 1e6
| 'G' -> multiplier 1e9
| 'T' -> multiplier 1e12
| 's' -> multiplier 1.
| 'm' -> multiplier 60.
| 'h' -> multiplier 3600.
| 'd' -> multiplier 86400.
| '0'..'9' -> r := float_of_string arg
| _ -> raise (Arg.Bad "bad numeric argument")
with Failure "float_of_string" -> raise (Arg.Bad "bad numeric argument")
;;
let input_file = fun s -> file := s let input_file = fun s -> file := s
let usage = "Usage : main [options] <file>" let usage = "Usage : main [options] <file>"
let argspec = Arg.align [ let argspec = Arg.align [
"-v", Arg.Int (fun i -> Log.set_debug i), "-v", Arg.Int (fun i -> Log.set_debug i),
"<lvl> Sets the debug verbose level"; "<lvl> Sets the debug verbose level";
"-t", Arg.String (int_arg time_limit),
"<t>[smhd] Sets the time limit for the sat solver";
"-s", Arg.String (int_arg size_limit),
"<s>[kMGT] Sets the size limit for the sat solver";
"-model", Arg.Set p_assign, "-model", Arg.Set p_assign,
" Outputs the boolean model found if sat"; " Outputs the boolean model found if sat";
] ]
(* Limits alarm *)
let check () =
let t = Sys.time () in
let heap_size = (Gc.quick_stat ()).Gc.heap_words in
let s = float heap_size *. float Sys.word_size /. 8. in
if t > !time_limit then
raise Out_of_time
else if s > !size_limit then
raise Out_of_space
(* Entry file parsing *) (* Entry file parsing *)
let get_cnf () = let get_cnf () =
let chan = open_in !file in let chan = open_in !file in
@ -40,11 +83,15 @@ let print_assign fmt () =
) )
let main () = let main () =
(* Administrative duties *)
Arg.parse argspec input_file usage; Arg.parse argspec input_file usage;
if !file = "" then begin if !file = "" then begin
Arg.usage argspec usage; Arg.usage argspec usage;
exit 2 exit 2
end; end;
let al = Gc.create_alarm check in
(* Interesting stuff happening *)
let cnf = get_cnf () in let cnf = get_cnf () in
S.assume cnf; S.assume cnf;
match S.solve () with match S.solve () with
@ -56,4 +103,12 @@ let main () =
Format.printf "Unsat@." Format.printf "Unsat@."
;; ;;
main () try
main ()
with
| Out_of_time ->
Format.printf "Time limit exceeded@.";
exit 2
| Out_of_space ->
Format.printf "Size limit exceeded@.";
exit 3