@@ -19,7 +19,6 @@ Author: Daniel Kroening, Peter Schrammel
19
19
#include < util/unicode.h>
20
20
#include < util/version.h>
21
21
22
- #include < goto-symex/solver_hardness.h>
23
22
#include < solvers/flattening/bv_dimacs.h>
24
23
#include < solvers/prop/prop.h>
25
24
#include < solvers/prop/solver_resource_limits.h>
@@ -71,6 +70,16 @@ solver_factoryt::solvert::solvert(
71
70
{
72
71
}
73
72
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
+
74
83
stack_decision_proceduret &solver_factoryt::solvert::decision_procedure () const
75
84
{
76
85
PRECONDITION (
@@ -88,6 +97,11 @@ boolbvt &solver_factoryt::solvert::boolbv_decision_procedure() const
88
97
return *decision_procedure_is_boolbvt_ptr;
89
98
}
90
99
100
+ solver_hardnesst *solver_factoryt::solvert::hardness_collector () const
101
+ {
102
+ return hardness_ptr.get ();
103
+ }
104
+
91
105
void solver_factoryt::set_decision_procedure_time_limit (
92
106
solver_resource_limitst &decision_procedure)
93
107
{
@@ -168,8 +182,9 @@ static void emit_solver_warning(
168
182
template <typename SatcheckT>
169
183
static typename std::enable_if<
170
184
!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)
173
188
{
174
189
auto satcheck = std::make_unique<SatcheckT>(message_handler);
175
190
if (options.is_set (" write-solver-stats-to" ))
@@ -179,27 +194,29 @@ make_satcheck_prop(message_handlert &message_handler, const optionst &options)
179
194
<< " Configured solver does not support --write-solver-stats-to. "
180
195
<< " Solver stats will not be written." << messaget::eom;
181
196
}
182
- return satcheck;
197
+ return { std::move ( satcheck), nullptr } ;
183
198
}
184
199
185
200
template <typename SatcheckT>
186
201
static typename std::enable_if<
187
202
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)
190
206
{
191
207
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)};
200
217
}
201
218
202
- static std::unique_ptr<propt>
219
+ static std::pair<std:: unique_ptr<propt>, std::shared_ptr<solver_hardnesst> >
203
220
get_sat_solver (message_handlert &message_handler, const optionst &options)
204
221
{
205
222
const bool no_simplifier = options.get_bool_option (" beautify" ) ||
@@ -326,12 +343,15 @@ get_sat_solver(message_handlert &message_handler, const optionst &options)
326
343
327
344
std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_default ()
328
345
{
329
- auto sat_solver = get_sat_solver (message_handler, options);
346
+ auto sat_solver_and_hardness_opt = get_sat_solver (message_handler, options);
330
347
331
348
bool get_array_constraints =
332
349
options.get_bool_option (" show-array-constraints" );
333
350
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);
335
355
336
356
if (options.get_option (" arrays-uf" ) == " never" )
337
357
bv_pointers->unbounded_array = bv_pointerst::unbounded_arrayt::U_NONE;
@@ -341,7 +361,10 @@ std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_default()
341
361
set_decision_procedure_time_limit (*bv_pointers);
342
362
343
363
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 ));
345
368
}
346
369
347
370
std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_dimacs ()
@@ -376,11 +399,11 @@ std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_external_sat()
376
399
377
400
std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_bv_refinement ()
378
401
{
379
- std::unique_ptr<propt> prop = get_sat_solver (message_handler, options);
402
+ auto prop_and_hardness_opt = get_sat_solver (message_handler, options);
380
403
381
404
bv_refinementt::infot info;
382
405
info.ns = &ns;
383
- info.prop = prop .get ();
406
+ info.prop = prop_and_hardness_opt. first .get ();
384
407
info.output_xml = output_xml_in_refinement;
385
408
386
409
// we allow setting some parameters
@@ -396,7 +419,9 @@ std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_bv_refinement()
396
419
std::make_unique<bv_refinementt>(info);
397
420
set_decision_procedure_time_limit (*decision_procedure);
398
421
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 ));
400
425
}
401
426
402
427
// / the string refinement adds to the bit vector refinement specifications for
@@ -407,8 +432,8 @@ solver_factoryt::get_string_refinement()
407
432
{
408
433
string_refinementt::infot info;
409
434
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 ();
412
437
info.refinement_bound = DEFAULT_MAX_NB_REFINEMENT;
413
438
info.output_xml = output_xml_in_refinement;
414
439
if (options.get_bool_option (" max-node-refinement" ))
@@ -422,7 +447,9 @@ solver_factoryt::get_string_refinement()
422
447
std::make_unique<string_refinementt>(info);
423
448
set_decision_procedure_time_limit (*decision_procedure);
424
449
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 ));
426
453
}
427
454
428
455
std::unique_ptr<std::ofstream> open_outfile_and_check (
0 commit comments