| 1 | :- module(alloy2b_benchmarks, [benchmark_alloy_command/2]). | |
| 2 | ||
| 3 | :- use_module(probsrc(debug)). | |
| 4 | :- use_module(probsrc(parsercall)). | |
| 5 | :- use_module(probsrc(preferences)). | |
| 6 | :- use_module(probsrc('alloy2b/alloy2b')). | |
| 7 | :- use_module(cbcsrc(cbc_path_solver), [verify_alloy_command/5]). | |
| 8 | ||
| 9 | % For instance: probcli -bench_alloy_cmd run0 ../einsteins_enum.als | |
| 10 | ||
| 11 | solver_timeout_ms(300000). | |
| 12 | ||
| 13 | %% benchmark_alloy_command(+CmdName, +AlloyFilePath). | |
| 14 | benchmark_alloy_command(CmdName, AlloyFilePath) :- | |
| 15 | call_alloy2pl_parser(AlloyFilePath, PrologFile), | |
| 16 | statistics(walltime, [LoadStart|_]), | |
| 17 | load_alloy_ast_prolog_file(PrologFile), | |
| 18 | statistics(walltime, [LoadEnd|_]), | |
| 19 | LoadTime is LoadEnd - LoadStart, | |
| 20 | solver_timeout_ms(Timeout), | |
| 21 | temporary_set_preference(time_out, Timeout), !, | |
| 22 | format('Running Alloy benchmarks for ~w with timeout ~w~n',[CmdName,Timeout]), | |
| 23 | benchmark_command_initialized(CmdName, BenchResults), !, | |
| 24 | write_benchmark_results_to_file([(loading_and_translation,LoadTime)|BenchResults], AlloyFilePath, CmdName), | |
| 25 | reset_temporary_preference(time_out), halt. | |
| 26 | ||
| 27 | write_benchmark_results_to_file(BenchResults, AlloyFilePath, CmdName) :- | |
| 28 | atom_concat('_benchmarked_', CmdName, TFilename), | |
| 29 | atom_concat(TFilename, '.txt', FileName), | |
| 30 | atom_concat(AlloyFilePath, FileName, FilePath), | |
| 31 | open(FilePath, write, Stream), | |
| 32 | writeq(Stream, BenchResults), | |
| 33 | close(Stream). | |
| 34 | ||
| 35 | verify_command_multi(_, _, 0, _, [], []). | |
| 36 | verify_command_multi(Solver, CmdName, C, CmdIsValid, [Time|NT], [PRes|NR]) :- | |
| 37 | C \== 0, | |
| 38 | statistics(walltime, [Start|_]), | |
| 39 | verify_alloy_command(CmdName, Solver, TCmdIsValid, _, Res), | |
| 40 | pretty_res(Res, PRes), | |
| 41 | statistics(walltime, [End|_]), | |
| 42 | TTime is End - Start, | |
| 43 | CmdIsValid = TCmdIsValid, | |
| 44 | solver_timeout_ms(Timeout), | |
| 45 | ( TTime >= Timeout | |
| 46 | -> Time = TTime, | |
| 47 | NT = [], % stop multi execution if timeout exceeded | |
| 48 | NR = [] | |
| 49 | ; Time = TTime, | |
| 50 | C1 is C - 1, | |
| 51 | verify_command_multi(Solver, CmdName, C1, CmdIsValid, NT, NR) | |
| 52 | ). | |
| 53 | ||
| 54 | pretty_res(solution(_), PRes) :- | |
| 55 | !, | |
| 56 | PRes = solution. | |
| 57 | pretty_res(Res, Res). | |
| 58 | ||
| 59 | %% benchmark_command_initialized(+CmdName, -BenchResults). | |
| 60 | benchmark_command_initialized(CmdName, BenchResults) :- | |
| 61 | verify_command_multi(z3, CmdName, 3, CmdIsValidProBZ3, ProBZ3Times, ProBZ3Results), | |
| 62 | verify_command_multi(prob, CmdName, 3, CmdIsValidProB, ProBTimes, ProBResults), | |
| 63 | verify_command_multi(probkodkod, CmdName, 3, CmdIsValidProBKodkod, ProBKodkodTimes, ProBKodkodResults), | |
| 64 | set_preference(cdclt_use_idl_theory_solver, false), | |
| 65 | set_preference(cdclt_perform_static_analysis, true), | |
| 66 | set_preference(cdclt_perform_symmetry_breaking, false), | |
| 67 | verify_command_multi(probsmt, CmdName, 3, CmdIsValidProBSmt, ProBSmtTimes, ProBSmtResults), | |
| 68 | set_preference(cdclt_perform_static_analysis, false), | |
| 69 | verify_command_multi(probsmt, CmdName, 3, CmdIsValidProBRawSmt, ProBRawSmtTimes, ProBRawSmtResults), | |
| 70 | set_preference(cdclt_perform_symmetry_breaking, true), | |
| 71 | verify_command_multi(probsmt, CmdName, 3, CmdIsValidProBSymRawSmt, ProBSymRawSmtTimes, ProBSymRawSmtResults), | |
| 72 | set_preference(cdclt_perform_static_analysis, true), | |
| 73 | verify_command_multi(probsmt, CmdName, 3, CmdIsValidProBSymSmt, ProBSymSmtTimes, ProBSymSmtResults), | |
| 74 | BenchResults = [(prob,CmdName,CmdIsValidProB,ProBTimes,ProBResults),(probkodkod,CmdName,CmdIsValidProBKodkod,ProBKodkodTimes,ProBKodkodResults),(probsmt,CmdName,CmdIsValidProBSmt,ProBSmtTimes,ProBSmtResults),(probrawsmt,CmdName,CmdIsValidProBRawSmt,ProBRawSmtTimes,ProBRawSmtResults),(probsymrawsmt,CmdName,CmdIsValidProBSymRawSmt,ProBSymRawSmtTimes,ProBSymRawSmtResults),(probsymsmt,CmdName,CmdIsValidProBSymSmt,ProBSymSmtTimes,ProBSymSmtResults),(probz3,CmdName,CmdIsValidProBZ3,ProBZ3Times,ProBZ3Results)]. |