@@ -87,12 +87,6 @@ solver_factoryt::solvert::stack_decision_procedure() const
87
87
return *solver;
88
88
}
89
89
90
- propt &solver_factoryt::solvert::prop () const
91
- {
92
- PRECONDITION (prop_ptr != nullptr );
93
- return *prop_ptr;
94
- }
95
-
96
90
void solver_factoryt::set_decision_procedure_time_limit (
97
91
decision_proceduret &decision_procedure)
98
92
{
@@ -188,6 +182,17 @@ smt2_dect::solvert solver_factoryt::get_smt2_solver_type() const
188
182
return s;
189
183
}
190
184
185
+ // / Emit a warning for non-existent solver \p solver via \p message_handler.
186
+ static void emit_solver_warning (
187
+ message_handlert &message_handler,
188
+ const std::string &solver)
189
+ {
190
+ messaget log (message_handler);
191
+ log .warning () << " The specified solver, '" << solver
192
+ << " ', is not available. "
193
+ << " The default solver will be used instead." << messaget::eom;
194
+ }
195
+
191
196
template <typename SatcheckT>
192
197
static std::unique_ptr<SatcheckT>
193
198
make_satcheck_prop (message_handlert &message_handler, const optionst &options)
@@ -214,123 +219,107 @@ make_satcheck_prop(message_handlert &message_handler, const optionst &options)
214
219
return satcheck;
215
220
}
216
221
217
- std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_default ()
222
+ static std::unique_ptr<propt>
223
+ get_sat_solver (message_handlert &message_handler, const optionst &options)
218
224
{
219
- auto solver = util_make_unique<solvert>();
220
- bool solver_set = false ;
225
+ const bool no_simplifier = options.get_bool_option (" beautify" ) ||
226
+ !options.get_bool_option (" sat-preprocessor" ) ||
227
+ options.get_bool_option (" refine" ) ||
228
+ options.get_bool_option (" refine-strings" );
229
+
221
230
if (options.is_set (" sat-solver" ))
222
231
{
223
232
const std::string &solver_option = options.get_option (" sat-solver" );
224
233
if (solver_option == " zchaff" )
225
234
{
226
235
#if defined SATCHECK_ZCHAFF
227
- solver->set_prop (
228
- make_satcheck_prop<satcheck_zchafft>(message_handler, options));
229
- solver_set = true ;
236
+ return make_satcheck_prop<satcheck_zchafft>(message_handler, options);
230
237
#else
231
- emit_solver_warning (" zchaff" );
238
+ emit_solver_warning (message_handler, " zchaff" );
232
239
#endif
233
240
}
234
241
else if (solver_option == " booleforce" )
235
242
{
236
243
#if defined SATCHECK_BOOLERFORCE
237
- solver->set_prop (
238
- make_satcheck_prop<satcheck_booleforcet>(message_handler, options));
239
- solver_set = true ;
244
+ return make_satcheck_prop<satcheck_booleforcet>(message_handler, options);
240
245
#else
241
- emit_solver_warning (" booleforce" );
246
+ emit_solver_warning (message_handler, " booleforce" );
242
247
#endif
243
248
}
244
249
else if (solver_option == " minisat1" )
245
250
{
246
251
#if defined SATCHECK_MINISAT1
247
- solver->set_prop (
248
- make_satcheck_prop<satcheck_minisat1t>(message_handler, options));
249
- solver_set = true ;
252
+ return make_satcheck_prop<satcheck_minisat1t>(message_handler, options);
250
253
#else
251
- emit_solver_warning (" minisat1" );
254
+ emit_solver_warning (message_handler, " minisat1" );
252
255
#endif
253
256
}
254
257
else if (solver_option == " minisat2" )
255
258
{
256
259
#if defined SATCHECK_MINISAT2
257
- if (
258
- options.get_bool_option (" beautify" ) ||
259
- !options.get_bool_option (" sat-preprocessor" )) // no simplifier
260
+ if (no_simplifier)
260
261
{
261
262
// simplifier won't work with beautification
262
- solver-> set_prop ( make_satcheck_prop<satcheck_minisat_no_simplifiert>(
263
- message_handler, options)) ;
263
+ return make_satcheck_prop<satcheck_minisat_no_simplifiert>(
264
+ message_handler, options);
264
265
}
265
266
else // with simplifier
266
267
{
267
- solver-> set_prop ( make_satcheck_prop<satcheck_minisat_simplifiert>(
268
- message_handler, options)) ;
268
+ return make_satcheck_prop<satcheck_minisat_simplifiert>(
269
+ message_handler, options);
269
270
}
270
- solver_set = true ;
271
271
#else
272
- emit_solver_warning (" minisat2" );
272
+ emit_solver_warning (message_handler, " minisat2" );
273
273
#endif
274
274
}
275
275
else if (solver_option == " ipasir" )
276
276
{
277
277
#if defined SATCHECK_IPASIR
278
- solver->set_prop (
279
- make_satcheck_prop<satcheck_ipasirt>(message_handler, options));
280
- solver_set = true ;
278
+ return make_satcheck_prop<satcheck_ipasirt>(message_handler, options);
281
279
#else
282
- emit_solver_warning (" ipasir" );
280
+ emit_solver_warning (message_handler, " ipasir" );
283
281
#endif
284
282
}
285
283
else if (solver_option == " picosat" )
286
284
{
287
285
#if defined SATCHECK_PICOSAT
288
- solver->set_prop (
289
- make_satcheck_prop<satcheck_picosatt>(message_handler, options));
290
- solver_set = true ;
286
+ return make_satcheck_prop<satcheck_picosatt>(message_handler, options);
291
287
#else
292
- emit_solver_warning (" picosat" );
288
+ emit_solver_warning (message_handler, " picosat" );
293
289
#endif
294
290
}
295
291
else if (solver_option == " lingeling" )
296
292
{
297
293
#if defined SATCHECK_LINGELING
298
- solver->set_prop (
299
- make_satcheck_prop<satcheck_lingelingt>(message_handler, options));
300
- solver_set = true ;
294
+ return make_satcheck_prop<satcheck_lingelingt>(message_handler, options);
301
295
#else
302
- emit_solver_warning (" lingeling" );
296
+ emit_solver_warning (message_handler, " lingeling" );
303
297
#endif
304
298
}
305
299
else if (solver_option == " glucose" )
306
300
{
307
301
#if defined SATCHECK_GLUCOSE
308
- if (
309
- options.get_bool_option (" beautify" ) ||
310
- !options.get_bool_option (" sat-preprocessor" )) // no simplifier
302
+ if (no_simplifier)
311
303
{
312
304
// simplifier won't work with beautification
313
- solver-> set_prop ( make_satcheck_prop<satcheck_glucose_no_simplifiert>(
314
- message_handler, options)) ;
305
+ return make_satcheck_prop<satcheck_glucose_no_simplifiert>(
306
+ message_handler, options);
315
307
}
316
308
else // with simplifier
317
309
{
318
- solver-> set_prop ( make_satcheck_prop<satcheck_glucose_simplifiert>(
319
- message_handler, options)) ;
310
+ return make_satcheck_prop<satcheck_glucose_simplifiert>(
311
+ message_handler, options);
320
312
}
321
- solver_set = true ;
322
313
#else
323
- emit_solver_warning (" glucose" );
314
+ emit_solver_warning (message_handler, " glucose" );
324
315
#endif
325
316
}
326
317
else if (solver_option == " cadical" )
327
318
{
328
319
#if defined SATCHECK_CADICAL
329
- solver->set_prop (
330
- make_satcheck_prop<satcheck_cadicalt>(message_handler, options));
331
- solver_set = true ;
320
+ return make_satcheck_prop<satcheck_cadicalt>(message_handler, options);
332
321
#else
333
- emit_solver_warning (" cadical" );
322
+ emit_solver_warning (message_handler, " cadical" );
334
323
#endif
335
324
}
336
325
else
@@ -341,45 +330,38 @@ std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_default()
341
330
exit (CPROVER_EXIT_USAGE_ERROR);
342
331
}
343
332
}
344
- if (!solver_set)
333
+
334
+ // default solver
335
+ if (no_simplifier)
345
336
{
346
- // default solver
347
- if (
348
- options.get_bool_option (" beautify" ) ||
349
- !options.get_bool_option (" sat-preprocessor" )) // no simplifier
350
- {
351
- // simplifier won't work with beautification
352
- solver->set_prop (
353
- make_satcheck_prop<satcheck_no_simplifiert>(message_handler, options));
354
- }
355
- else // with simplifier
356
- {
357
- solver->set_prop (make_satcheck_prop<satcheckt>(message_handler, options));
358
- }
337
+ // simplifier won't work with beautification
338
+ return make_satcheck_prop<satcheck_no_simplifiert>(
339
+ message_handler, options);
359
340
}
341
+ else // with simplifier
342
+ {
343
+ return make_satcheck_prop<satcheckt>(message_handler, options);
344
+ }
345
+ }
346
+
347
+ std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_default ()
348
+ {
349
+ auto sat_solver = get_sat_solver (message_handler, options);
360
350
361
351
bool get_array_constraints =
362
352
options.get_bool_option (" show-array-constraints" );
363
353
auto bv_pointers = util_make_unique<bv_pointerst>(
364
- ns, solver-> prop () , message_handler, get_array_constraints);
354
+ ns, *sat_solver , message_handler, get_array_constraints);
365
355
366
356
if (options.get_option (" arrays-uf" ) == " never" )
367
357
bv_pointers->unbounded_array = bv_pointerst::unbounded_arrayt::U_NONE;
368
358
else if (options.get_option (" arrays-uf" ) == " always" )
369
359
bv_pointers->unbounded_array = bv_pointerst::unbounded_arrayt::U_ALL;
370
360
371
361
set_decision_procedure_time_limit (*bv_pointers);
372
- solver->set_decision_procedure (std::move (bv_pointers));
373
362
374
- return solver;
375
- }
376
-
377
- void solver_factoryt::emit_solver_warning (const std::string &solver)
378
- {
379
- messaget log (message_handler);
380
- log .warning () << " The specified solver, '" << solver
381
- << " ', is not available. "
382
- << " The default solver will be used instead." << messaget::eom;
363
+ return util_make_unique<solvert>(
364
+ std::move (bv_pointers), std::move (sat_solver));
383
365
}
384
366
385
367
std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_dimacs ()
@@ -413,16 +395,7 @@ std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_external_sat()
413
395
414
396
std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_bv_refinement ()
415
397
{
416
- std::unique_ptr<propt> prop = [this ]() -> std::unique_ptr<propt> {
417
- // We offer the option to disable the SAT preprocessor
418
- if (options.get_bool_option (" sat-preprocessor" ))
419
- {
420
- no_beautification ();
421
- return make_satcheck_prop<satcheckt>(message_handler, options);
422
- }
423
- return make_satcheck_prop<satcheck_no_simplifiert>(
424
- message_handler, options);
425
- }();
398
+ std::unique_ptr<propt> prop = get_sat_solver (message_handler, options);
426
399
427
400
bv_refinementt::infot info;
428
401
info.ns = &ns;
@@ -452,8 +425,7 @@ solver_factoryt::get_string_refinement()
452
425
{
453
426
string_refinementt::infot info;
454
427
info.ns = &ns;
455
- auto prop =
456
- make_satcheck_prop<satcheck_no_simplifiert>(message_handler, options);
428
+ auto prop = get_sat_solver (message_handler, options);
457
429
info.prop = prop.get ();
458
430
info.refinement_bound = DEFAULT_MAX_NB_REFINEMENT;
459
431
info.output_xml = output_xml_in_refinement;
0 commit comments