@@ -19,7 +19,6 @@ Author: Daniel Kroening, Peter Schrammel
1919#include < util/unicode.h>
2020#include < util/version.h>
2121
22- #include < goto-symex/solver_hardness.h>
2322#include < solvers/flattening/bv_dimacs.h>
2423#include < solvers/prop/prop.h>
2524#include < solvers/prop/solver_resource_limits.h>
@@ -71,6 +70,16 @@ solver_factoryt::solvert::solvert(
7170{
7271}
7372
73+ solver_factoryt::solvert::solvert (
74+ std::unique_ptr<boolbvt> p1,
75+ std::unique_ptr<propt> p2,
76+ std::shared_ptr<solver_hardnesst> p3)
77+ : hardness_ptr(std::move(p3)),
78+ prop_ptr(std::move(p2)),
79+ decision_procedure_is_boolbvt_ptr(std::move(p1))
80+ {
81+ }
82+
7483stack_decision_proceduret &solver_factoryt::solvert::decision_procedure () const
7584{
7685 PRECONDITION (
@@ -88,6 +97,11 @@ boolbvt &solver_factoryt::solvert::boolbv_decision_procedure() const
8897 return *decision_procedure_is_boolbvt_ptr;
8998}
9099
100+ solver_hardnesst *solver_factoryt::solvert::hardness_collector () const
101+ {
102+ return hardness_ptr.get ();
103+ }
104+
91105void solver_factoryt::set_decision_procedure_time_limit (
92106 solver_resource_limitst &decision_procedure)
93107{
@@ -168,8 +182,9 @@ static void emit_solver_warning(
168182template <typename SatcheckT>
169183static typename std::enable_if<
170184 !std::is_base_of<hardness_collectort, SatcheckT>::value,
171- std::unique_ptr<SatcheckT>>::type
172- make_satcheck_prop (message_handlert &message_handler, const optionst &options)
185+ std::pair<std::unique_ptr<SatcheckT>, std::shared_ptr<solver_hardnesst>>>::
186+ type
187+ make_satcheck_prop (message_handlert &message_handler, const optionst &options)
173188{
174189 auto satcheck = std::make_unique<SatcheckT>(message_handler);
175190 if (options.is_set (" write-solver-stats-to" ))
@@ -179,27 +194,29 @@ make_satcheck_prop(message_handlert &message_handler, const optionst &options)
179194 << " Configured solver does not support --write-solver-stats-to. "
180195 << " Solver stats will not be written." << messaget::eom;
181196 }
182- return satcheck;
197+ return { std::move ( satcheck), nullptr } ;
183198}
184199
185200template <typename SatcheckT>
186201static typename std::enable_if<
187202 std::is_base_of<hardness_collectort, SatcheckT>::value,
188- std::unique_ptr<SatcheckT>>::type
189- make_satcheck_prop (message_handlert &message_handler, const optionst &options)
203+ std::pair<std::unique_ptr<SatcheckT>, std::shared_ptr<solver_hardnesst>>>::
204+ type
205+ make_satcheck_prop (message_handlert &message_handler, const optionst &options)
190206{
191207 auto satcheck = std::make_unique<SatcheckT>(message_handler);
192- if (options.is_set (" write-solver-stats-to" ))
193- {
194- std::unique_ptr<solver_hardnesst> solver_hardness =
195- std::make_unique<solver_hardnesst>();
196- solver_hardness->set_outfile (options.get_option (" write-solver-stats-to" ));
197- satcheck->solver_hardness = std::move (solver_hardness);
198- }
199- return satcheck;
208+ if (!options.is_set (" write-solver-stats-to" ))
209+ return {std::move (satcheck), nullptr };
210+
211+ std::shared_ptr<solver_hardnesst> solver_hardness =
212+ std::make_shared<solver_hardnesst>();
213+ solver_hardness->set_outfile (options.get_option (" write-solver-stats-to" ));
214+ satcheck->solver_hardness = solver_hardness;
215+
216+ return {std::move (satcheck), std::move (solver_hardness)};
200217}
201218
202- static std::unique_ptr<propt>
219+ static std::pair<std:: unique_ptr<propt>, std::shared_ptr<solver_hardnesst> >
203220get_sat_solver (message_handlert &message_handler, const optionst &options)
204221{
205222 const bool no_simplifier = options.get_bool_option (" beautify" ) ||
@@ -326,12 +343,15 @@ get_sat_solver(message_handlert &message_handler, const optionst &options)
326343
327344std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_default ()
328345{
329- auto sat_solver = get_sat_solver (message_handler, options);
346+ auto sat_solver_and_hardness_opt = get_sat_solver (message_handler, options);
330347
331348 bool get_array_constraints =
332349 options.get_bool_option (" show-array-constraints" );
333350 auto bv_pointers = std::make_unique<bv_pointerst>(
334- ns, *sat_solver, message_handler, get_array_constraints);
351+ ns,
352+ *sat_solver_and_hardness_opt.first ,
353+ message_handler,
354+ get_array_constraints);
335355
336356 if (options.get_option (" arrays-uf" ) == " never" )
337357 bv_pointers->unbounded_array = bv_pointerst::unbounded_arrayt::U_NONE;
@@ -341,7 +361,10 @@ std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_default()
341361 set_decision_procedure_time_limit (*bv_pointers);
342362
343363 std::unique_ptr<boolbvt> boolbv = std::move (bv_pointers);
344- return std::make_unique<solvert>(std::move (boolbv), std::move (sat_solver));
364+ return std::make_unique<solvert>(
365+ std::move (boolbv),
366+ std::move (sat_solver_and_hardness_opt.first ),
367+ std::move (sat_solver_and_hardness_opt.second ));
345368}
346369
347370std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_dimacs ()
@@ -376,11 +399,11 @@ std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_external_sat()
376399
377400std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_bv_refinement ()
378401{
379- std::unique_ptr<propt> prop = get_sat_solver (message_handler, options);
402+ auto prop_and_hardness_opt = get_sat_solver (message_handler, options);
380403
381404 bv_refinementt::infot info;
382405 info.ns = &ns;
383- info.prop = prop .get ();
406+ info.prop = prop_and_hardness_opt. first .get ();
384407 info.output_xml = output_xml_in_refinement;
385408
386409 // we allow setting some parameters
@@ -396,7 +419,9 @@ std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_bv_refinement()
396419 std::make_unique<bv_refinementt>(info);
397420 set_decision_procedure_time_limit (*decision_procedure);
398421 return std::make_unique<solvert>(
399- std::move (decision_procedure), std::move (prop));
422+ std::move (decision_procedure),
423+ std::move (prop_and_hardness_opt.first ),
424+ std::move (prop_and_hardness_opt.second ));
400425}
401426
402427// / the string refinement adds to the bit vector refinement specifications for
@@ -407,8 +432,8 @@ solver_factoryt::get_string_refinement()
407432{
408433 string_refinementt::infot info;
409434 info.ns = &ns;
410- auto prop = get_sat_solver (message_handler, options);
411- info.prop = prop .get ();
435+ auto prop_and_hardness_opt = get_sat_solver (message_handler, options);
436+ info.prop = prop_and_hardness_opt. first .get ();
412437 info.refinement_bound = DEFAULT_MAX_NB_REFINEMENT;
413438 info.output_xml = output_xml_in_refinement;
414439 if (options.get_bool_option (" max-node-refinement" ))
@@ -422,7 +447,9 @@ solver_factoryt::get_string_refinement()
422447 std::make_unique<string_refinementt>(info);
423448 set_decision_procedure_time_limit (*decision_procedure);
424449 return std::make_unique<solvert>(
425- std::move (decision_procedure), std::move (prop));
450+ std::move (decision_procedure),
451+ std::move (prop_and_hardness_opt.first ),
452+ std::move (prop_and_hardness_opt.second ));
426453}
427454
428455std::unique_ptr<std::ofstream> open_outfile_and_check (
0 commit comments