@@ -188,6 +188,17 @@ smt2_dect::solvert solver_factoryt::get_smt2_solver_type() const
188
188
return s;
189
189
}
190
190
191
+ // / Emit a warning for non-existent solver \p solver via \p message_handler.
192
+ static void emit_solver_warning (
193
+ message_handlert &message_handler,
194
+ const std::string &solver)
195
+ {
196
+ messaget log (message_handler);
197
+ log .warning () << " The specified solver, '" << solver
198
+ << " ', is not available. "
199
+ << " The default solver will be used instead." << messaget::eom;
200
+ }
201
+
191
202
template <typename SatcheckT>
192
203
static std::unique_ptr<SatcheckT>
193
204
make_satcheck_prop (message_handlert &message_handler, const optionst &options)
@@ -214,41 +225,34 @@ make_satcheck_prop(message_handlert &message_handler, const optionst &options)
214
225
return satcheck;
215
226
}
216
227
217
- std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_default ()
228
+ static std::unique_ptr<propt>
229
+ get_sat_solver (message_handlert &message_handler, const optionst &options)
218
230
{
219
- auto solver = util_make_unique<solvert>();
220
- bool solver_set = false ;
221
231
if (options.is_set (" sat-solver" ))
222
232
{
223
233
const std::string &solver_option = options.get_option (" sat-solver" );
224
234
if (solver_option == " zchaff" )
225
235
{
226
236
#if defined SATCHECK_ZCHAFF
227
- solver->set_prop (
228
- make_satcheck_prop<satcheck_zchafft>(message_handler, options));
229
- solver_set = true ;
237
+ return make_satcheck_prop<satcheck_zchafft>(message_handler, options);
230
238
#else
231
- emit_solver_warning (" zchaff" );
239
+ emit_solver_warning (message_handler, " zchaff" );
232
240
#endif
233
241
}
234
242
else if (solver_option == " booleforce" )
235
243
{
236
244
#if defined SATCHECK_BOOLERFORCE
237
- solver->set_prop (
238
- make_satcheck_prop<satcheck_booleforcet>(message_handler, options));
239
- solver_set = true ;
245
+ return make_satcheck_prop<satcheck_booleforcet>(message_handler, options);
240
246
#else
241
- emit_solver_warning (" booleforce" );
247
+ emit_solver_warning (message_handler, " booleforce" );
242
248
#endif
243
249
}
244
250
else if (solver_option == " minisat1" )
245
251
{
246
252
#if defined SATCHECK_MINISAT1
247
- solver->set_prop (
248
- make_satcheck_prop<satcheck_minisat1t>(message_handler, options));
249
- solver_set = true ;
253
+ return make_satcheck_prop<satcheck_minisat1t>(message_handler, options);
250
254
#else
251
- emit_solver_warning (" minisat1" );
255
+ emit_solver_warning (message_handler, " minisat1" );
252
256
#endif
253
257
}
254
258
else if (solver_option == " minisat2" )
@@ -259,47 +263,40 @@ std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_default()
259
263
!options.get_bool_option (" sat-preprocessor" )) // no simplifier
260
264
{
261
265
// simplifier won't work with beautification
262
- solver-> set_prop ( make_satcheck_prop<satcheck_minisat_no_simplifiert>(
263
- message_handler, options)) ;
266
+ return make_satcheck_prop<satcheck_minisat_no_simplifiert>(
267
+ message_handler, options);
264
268
}
265
269
else // with simplifier
266
270
{
267
- solver-> set_prop ( make_satcheck_prop<satcheck_minisat_simplifiert>(
268
- message_handler, options)) ;
271
+ return make_satcheck_prop<satcheck_minisat_simplifiert>(
272
+ message_handler, options);
269
273
}
270
- solver_set = true ;
271
274
#else
272
- emit_solver_warning (" minisat2" );
275
+ emit_solver_warning (message_handler, " minisat2" );
273
276
#endif
274
277
}
275
278
else if (solver_option == " ipasir" )
276
279
{
277
280
#if defined SATCHECK_IPASIR
278
- solver->set_prop (
279
- make_satcheck_prop<satcheck_ipasirt>(message_handler, options));
280
- solver_set = true ;
281
+ return make_satcheck_prop<satcheck_ipasirt>(message_handler, options);
281
282
#else
282
- emit_solver_warning (" ipasir" );
283
+ emit_solver_warning (message_handler, " ipasir" );
283
284
#endif
284
285
}
285
286
else if (solver_option == " picosat" )
286
287
{
287
288
#if defined SATCHECK_PICOSAT
288
- solver->set_prop (
289
- make_satcheck_prop<satcheck_picosatt>(message_handler, options));
290
- solver_set = true ;
289
+ return make_satcheck_prop<satcheck_picosatt>(message_handler, options);
291
290
#else
292
- emit_solver_warning (" picosat" );
291
+ emit_solver_warning (message_handler, " picosat" );
293
292
#endif
294
293
}
295
294
else if (solver_option == " lingeling" )
296
295
{
297
296
#if defined SATCHECK_LINGELING
298
- solver->set_prop (
299
- make_satcheck_prop<satcheck_lingelingt>(message_handler, options));
300
- solver_set = true ;
297
+ return make_satcheck_prop<satcheck_lingelingt>(message_handler, options);
301
298
#else
302
- emit_solver_warning (" lingeling" );
299
+ emit_solver_warning (message_handler, " lingeling" );
303
300
#endif
304
301
}
305
302
else if (solver_option == " glucose" )
@@ -310,27 +307,24 @@ std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_default()
310
307
!options.get_bool_option (" sat-preprocessor" )) // no simplifier
311
308
{
312
309
// simplifier won't work with beautification
313
- solver-> set_prop ( make_satcheck_prop<satcheck_glucose_no_simplifiert>(
314
- message_handler, options)) ;
310
+ return make_satcheck_prop<satcheck_glucose_no_simplifiert>(
311
+ message_handler, options);
315
312
}
316
313
else // with simplifier
317
314
{
318
- solver-> set_prop ( make_satcheck_prop<satcheck_glucose_simplifiert>(
319
- message_handler, options)) ;
315
+ return make_satcheck_prop<satcheck_glucose_simplifiert>(
316
+ message_handler, options);
320
317
}
321
- solver_set = true ;
322
318
#else
323
- emit_solver_warning (" glucose" );
319
+ emit_solver_warning (message_handler, " glucose" );
324
320
#endif
325
321
}
326
322
else if (solver_option == " cadical" )
327
323
{
328
324
#if defined SATCHECK_CADICAL
329
- solver->set_prop (
330
- make_satcheck_prop<satcheck_cadicalt>(message_handler, options));
331
- solver_set = true ;
325
+ return make_satcheck_prop<satcheck_cadicalt>(message_handler, options);
332
326
#else
333
- emit_solver_warning (" cadical" );
327
+ emit_solver_warning (message_handler, " cadical" );
334
328
#endif
335
329
}
336
330
else
@@ -341,45 +335,40 @@ std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_default()
341
335
exit (CPROVER_EXIT_USAGE_ERROR);
342
336
}
343
337
}
344
- if (!solver_set)
338
+
339
+ // default solver
340
+ if (
341
+ options.get_bool_option (" beautify" ) ||
342
+ !options.get_bool_option (" sat-preprocessor" )) // no simplifier
343
+ {
344
+ // simplifier won't work with beautification
345
+ return make_satcheck_prop<satcheck_no_simplifiert>(
346
+ message_handler, options);
347
+ }
348
+ else // with simplifier
345
349
{
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
- }
350
+ return make_satcheck_prop<satcheckt>(message_handler, options);
359
351
}
352
+ }
353
+
354
+ std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_default ()
355
+ {
356
+ auto sat_solver = get_sat_solver (message_handler, options);
360
357
361
358
bool get_array_constraints =
362
359
options.get_bool_option (" show-array-constraints" );
363
360
auto bv_pointers = util_make_unique<bv_pointerst>(
364
- ns, solver-> prop () , message_handler, get_array_constraints);
361
+ ns, *sat_solver , message_handler, get_array_constraints);
365
362
366
363
if (options.get_option (" arrays-uf" ) == " never" )
367
364
bv_pointers->unbounded_array = bv_pointerst::unbounded_arrayt::U_NONE;
368
365
else if (options.get_option (" arrays-uf" ) == " always" )
369
366
bv_pointers->unbounded_array = bv_pointerst::unbounded_arrayt::U_ALL;
370
367
371
368
set_decision_procedure_time_limit (*bv_pointers);
372
- solver->set_decision_procedure (std::move (bv_pointers));
373
369
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;
370
+ return util_make_unique<solvert>(
371
+ std::move (bv_pointers), std::move (sat_solver));
383
372
}
384
373
385
374
std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_dimacs ()
0 commit comments