Skip to content

Commit d6bf5a1

Browse files
committed
Refactor solver_factoryt::get_default
Move all SAT solver construction to a procedure of its own. This is in preparation of also constructing the solver for refinement, which does not yet honour the new `--sat-solver` option.
1 parent 989029d commit d6bf5a1

File tree

2 files changed

+57
-71
lines changed

2 files changed

+57
-71
lines changed

src/goto-checker/solver_factory.cpp

Lines changed: 57 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,17 @@ smt2_dect::solvert solver_factoryt::get_smt2_solver_type() const
188188
return s;
189189
}
190190

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+
191202
template <typename SatcheckT>
192203
static std::unique_ptr<SatcheckT>
193204
make_satcheck_prop(message_handlert &message_handler, const optionst &options)
@@ -214,41 +225,34 @@ make_satcheck_prop(message_handlert &message_handler, const optionst &options)
214225
return satcheck;
215226
}
216227

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)
218230
{
219-
auto solver = util_make_unique<solvert>();
220-
bool solver_set = false;
221231
if(options.is_set("sat-solver"))
222232
{
223233
const std::string &solver_option = options.get_option("sat-solver");
224234
if(solver_option == "zchaff")
225235
{
226236
#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);
230238
#else
231-
emit_solver_warning("zchaff");
239+
emit_solver_warning(message_handler, "zchaff");
232240
#endif
233241
}
234242
else if(solver_option == "booleforce")
235243
{
236244
#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);
240246
#else
241-
emit_solver_warning("booleforce");
247+
emit_solver_warning(message_handler, "booleforce");
242248
#endif
243249
}
244250
else if(solver_option == "minisat1")
245251
{
246252
#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);
250254
#else
251-
emit_solver_warning("minisat1");
255+
emit_solver_warning(message_handler, "minisat1");
252256
#endif
253257
}
254258
else if(solver_option == "minisat2")
@@ -259,47 +263,40 @@ std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_default()
259263
!options.get_bool_option("sat-preprocessor")) // no simplifier
260264
{
261265
// 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);
264268
}
265269
else // with simplifier
266270
{
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);
269273
}
270-
solver_set = true;
271274
#else
272-
emit_solver_warning("minisat2");
275+
emit_solver_warning(message_handler, "minisat2");
273276
#endif
274277
}
275278
else if(solver_option == "ipasir")
276279
{
277280
#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);
281282
#else
282-
emit_solver_warning("ipasir");
283+
emit_solver_warning(message_handler, "ipasir");
283284
#endif
284285
}
285286
else if(solver_option == "picosat")
286287
{
287288
#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);
291290
#else
292-
emit_solver_warning("picosat");
291+
emit_solver_warning(message_handler, "picosat");
293292
#endif
294293
}
295294
else if(solver_option == "lingeling")
296295
{
297296
#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);
301298
#else
302-
emit_solver_warning("lingeling");
299+
emit_solver_warning(message_handler, "lingeling");
303300
#endif
304301
}
305302
else if(solver_option == "glucose")
@@ -310,27 +307,24 @@ std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_default()
310307
!options.get_bool_option("sat-preprocessor")) // no simplifier
311308
{
312309
// 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);
315312
}
316313
else // with simplifier
317314
{
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);
320317
}
321-
solver_set = true;
322318
#else
323-
emit_solver_warning("glucose");
319+
emit_solver_warning(message_handler, "glucose");
324320
#endif
325321
}
326322
else if(solver_option == "cadical")
327323
{
328324
#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);
332326
#else
333-
emit_solver_warning("cadical");
327+
emit_solver_warning(message_handler, "cadical");
334328
#endif
335329
}
336330
else
@@ -341,45 +335,40 @@ std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_default()
341335
exit(CPROVER_EXIT_USAGE_ERROR);
342336
}
343337
}
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
345349
{
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);
359351
}
352+
}
353+
354+
std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_default()
355+
{
356+
auto sat_solver = get_sat_solver(message_handler, options);
360357

361358
bool get_array_constraints =
362359
options.get_bool_option("show-array-constraints");
363360
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);
365362

366363
if(options.get_option("arrays-uf") == "never")
367364
bv_pointers->unbounded_array = bv_pointerst::unbounded_arrayt::U_NONE;
368365
else if(options.get_option("arrays-uf") == "always")
369366
bv_pointers->unbounded_array = bv_pointerst::unbounded_arrayt::U_ALL;
370367

371368
set_decision_procedure_time_limit(*bv_pointers);
372-
solver->set_decision_procedure(std::move(bv_pointers));
373369

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));
383372
}
384373

385374
std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_dimacs()

src/goto-checker/solver_factory.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,9 +89,6 @@ class solver_factoryt final
8989
// consistency checks during solver creation
9090
void no_beautification();
9191
void no_incremental_check();
92-
93-
// emit a warning for non-existent solver
94-
void emit_solver_warning(const std::string &solver);
9592
};
9693

9794
/// Parse solver-related command-line parameters in \p cmdline and set

0 commit comments

Comments
 (0)