diff --git a/src/main.ml b/src/main.ml index 8149e910bd839f009385f57a1d1a5ce6e2bd9c42..4d1a088602b65255abf66ff5624445bbaf918e05 100644 --- a/src/main.ml +++ b/src/main.ml @@ -16,7 +16,7 @@ let () = let () = Pyrat.init (); Marabou.init (); - Saver.init() + Saver.init () (* -- Logs. *) @@ -69,10 +69,12 @@ let config detect () = Whyconf.print_prover Pp.nothing) provers)) -let verify format loadpath memlimit timeout prover files = +let verify format loadpath memlimit timeout prover dataset_csv files = let debug = log_level_is_debug () in List.iter - ~f:(Verification.verify ~debug format loadpath ?memlimit ?timeout prover) + ~f: + (Verification.verify ~debug format loadpath ?memlimit ?timeout prover + ~dataset_csv) files let exec_cmd cmdname cmd = @@ -155,6 +157,13 @@ let verify_cmd = in Arg.(required & opt (some provers) None & info [ "p"; "prover" ] ~doc) in + let dataset_csv = + let doc = + "Dataset under .csv format to use for analyse.\n\ + \ Currently only supported by SAVer." + in + Arg.(value & opt (some string) None & info [ "dataset-csv" ] ~doc) + in let doc = "Property verification of neural networks using external provers." in @@ -162,11 +171,13 @@ let verify_cmd = let man = [ `S Manpage.s_description; `P doc ] in ( Term.( ret - (const (fun format loadpath memlimit timeout prover files _ -> + (const + (fun format loadpath memlimit timeout prover dataset_csv files _ -> `Ok (exec_cmd cmdname (fun () -> - verify format loadpath memlimit timeout prover files))) - $ format $ loadpath $ memlimit $ timeout $ prover $ files $ setup_logs)), + verify format loadpath memlimit timeout prover dataset_csv files))) + $ format $ loadpath $ memlimit $ timeout $ prover $ dataset_csv $ files + $ setup_logs)), Term.info cmdname ~sdocs:Manpage.s_common_options ~exits ~doc ~man ) let default_cmd = diff --git a/src/verification.ml b/src/verification.ml index 5c47d1db277421f1bb93636becdded1ab1421c0c..2c5f03ec2e397b12ea3dfc74411fcc3cdb56078e 100644 --- a/src/verification.ml +++ b/src/verification.ml @@ -55,9 +55,13 @@ let combine_prover_answers answers = | Call_provers.Valid, r | r, Call_provers.Valid -> r | _ -> acc) -let handle_task_saver task env command = +let handle_task_saver task env dataset_csv command = let open Why3 in - let dataset_filename = "test_data.csv" in + let dataset_filename = + match dataset_csv with + | Some s -> s + | None -> failwith "Error, no dataset provided for SAVer." + in let goal = Task.task_goal_fmla task in let eps, svm_filename = match goal.t_node with @@ -96,12 +100,12 @@ let handle_task_saver task env command = command let call_prover ~limit config (prover : Why3.Whyconf.config_prover) driver env - task = + dataset_csv task = let open Why3 in if String.equal prover.prover.prover_name "SAVer" then let command = Whyconf.get_complete_command ~with_steps:false prover in - let command = handle_task_saver task env command in + let command = handle_task_saver task env dataset_csv command in let res_parser = { Call_provers.prp_regexps = @@ -174,7 +178,8 @@ let call_prover ~limit config (prover : Why3.Whyconf.config_prover) driver env Fmt.pr "Goal %a: %a@." Pretty.print_pr (Task.task_goal task) Call_provers.print_prover_answer answer -let verify ?(debug = false) format loadpath ?memlimit ?timeout prover file = +let verify ?(debug = false) format loadpath ?memlimit ?timeout prover + ~dataset_csv file = if debug then Debug.set_flag (Debug.lookup_flag "call_prover"); let env, config = create_env loadpath in let steplimit = None in @@ -217,6 +222,8 @@ let verify ?(debug = false) format loadpath ?memlimit ?timeout prover file = Driver.load_driver_absolute env file prover.extra_drivers in List.iter - ~f:(call_prover ~limit (Whyconf.get_main config) prover driver env) + ~f: + (call_prover ~limit (Whyconf.get_main config) prover driver env + dataset_csv) tasks) mstr_theory diff --git a/src/verification.mli b/src/verification.mli index 36ba72e042266b79b26d41b084004b02575e4586..5f8f7ae2bfdc102c1c265888fe48f1143b750b7a 100644 --- a/src/verification.mli +++ b/src/verification.mli @@ -18,6 +18,7 @@ val verify : ?memlimit:int -> ?timeout:int -> Prover.t -> + dataset_csv:string option -> File.t -> unit (** [verify debug format loadpath memlimit timeout prover file] launches a @@ -28,4 +29,7 @@ val verify : @param loadpath is the additional loadpath. @param memlimit is the memory limit (in megabytes) granted to the verification. - @param timeout is the timeout (in seconds) granted to the verification. *) + @param timeout is the timeout (in seconds) granted to the verification. + @param dataset_csv + is the filepath of a dataset to analyze. Currently, it is only required + for SAVer. *)