@@ -87,12 +87,6 @@ solver_factoryt::solvert::stack_decision_procedure() const
8787 return *solver;
8888}
8989
90- propt &solver_factoryt::solvert::prop () const
91- {
92- PRECONDITION (prop_ptr != nullptr );
93- return *prop_ptr;
94- }
95-
9690void solver_factoryt::set_decision_procedure_time_limit (
9791 decision_proceduret &decision_procedure)
9892{
@@ -188,6 +182,17 @@ smt2_dect::solvert solver_factoryt::get_smt2_solver_type() const
188182 return s;
189183}
190184
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+
191196template <typename SatcheckT>
192197static std::unique_ptr<SatcheckT>
193198make_satcheck_prop (message_handlert &message_handler, const optionst &options)
@@ -214,123 +219,107 @@ make_satcheck_prop(message_handlert &message_handler, const optionst &options)
214219 return satcheck;
215220}
216221
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)
218224{
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+
221230 if (options.is_set (" sat-solver" ))
222231 {
223232 const std::string &solver_option = options.get_option (" sat-solver" );
224233 if (solver_option == " zchaff" )
225234 {
226235#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);
230237#else
231- emit_solver_warning (" zchaff" );
238+ emit_solver_warning (message_handler, " zchaff" );
232239#endif
233240 }
234241 else if (solver_option == " booleforce" )
235242 {
236243#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);
240245#else
241- emit_solver_warning (" booleforce" );
246+ emit_solver_warning (message_handler, " booleforce" );
242247#endif
243248 }
244249 else if (solver_option == " minisat1" )
245250 {
246251#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);
250253#else
251- emit_solver_warning (" minisat1" );
254+ emit_solver_warning (message_handler, " minisat1" );
252255#endif
253256 }
254257 else if (solver_option == " minisat2" )
255258 {
256259#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)
260261 {
261262 // 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);
264265 }
265266 else // with simplifier
266267 {
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);
269270 }
270- solver_set = true ;
271271#else
272- emit_solver_warning (" minisat2" );
272+ emit_solver_warning (message_handler, " minisat2" );
273273#endif
274274 }
275275 else if (solver_option == " ipasir" )
276276 {
277277#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);
281279#else
282- emit_solver_warning (" ipasir" );
280+ emit_solver_warning (message_handler, " ipasir" );
283281#endif
284282 }
285283 else if (solver_option == " picosat" )
286284 {
287285#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);
291287#else
292- emit_solver_warning (" picosat" );
288+ emit_solver_warning (message_handler, " picosat" );
293289#endif
294290 }
295291 else if (solver_option == " lingeling" )
296292 {
297293#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);
301295#else
302- emit_solver_warning (" lingeling" );
296+ emit_solver_warning (message_handler, " lingeling" );
303297#endif
304298 }
305299 else if (solver_option == " glucose" )
306300 {
307301#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)
311303 {
312304 // 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);
315307 }
316308 else // with simplifier
317309 {
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);
320312 }
321- solver_set = true ;
322313#else
323- emit_solver_warning (" glucose" );
314+ emit_solver_warning (message_handler, " glucose" );
324315#endif
325316 }
326317 else if (solver_option == " cadical" )
327318 {
328319#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);
332321#else
333- emit_solver_warning (" cadical" );
322+ emit_solver_warning (message_handler, " cadical" );
334323#endif
335324 }
336325 else
@@ -341,45 +330,38 @@ std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_default()
341330 exit (CPROVER_EXIT_USAGE_ERROR);
342331 }
343332 }
344- if (!solver_set)
333+
334+ // default solver
335+ if (no_simplifier)
345336 {
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);
359340 }
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);
360350
361351 bool get_array_constraints =
362352 options.get_bool_option (" show-array-constraints" );
363353 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);
365355
366356 if (options.get_option (" arrays-uf" ) == " never" )
367357 bv_pointers->unbounded_array = bv_pointerst::unbounded_arrayt::U_NONE;
368358 else if (options.get_option (" arrays-uf" ) == " always" )
369359 bv_pointers->unbounded_array = bv_pointerst::unbounded_arrayt::U_ALL;
370360
371361 set_decision_procedure_time_limit (*bv_pointers);
372- solver->set_decision_procedure (std::move (bv_pointers));
373362
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));
383365}
384366
385367std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_dimacs ()
@@ -413,16 +395,7 @@ std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_external_sat()
413395
414396std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_bv_refinement ()
415397{
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);
426399
427400 bv_refinementt::infot info;
428401 info.ns = &ns;
@@ -452,8 +425,7 @@ solver_factoryt::get_string_refinement()
452425{
453426 string_refinementt::infot info;
454427 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);
457429 info.prop = prop.get ();
458430 info.refinement_bound = DEFAULT_MAX_NB_REFINEMENT;
459431 info.output_xml = output_xml_in_refinement;
0 commit comments