CBMC
solver_factory.h
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module: Solver Factory
4 
5 Author: Daniel Kroening, Peter Schrammel
6 
7 \*******************************************************************/
8 
11 
12 #ifndef CPROVER_GOTO_CHECKER_SOLVER_FACTORY_H
13 #define CPROVER_GOTO_CHECKER_SOLVER_FACTORY_H
14 
15 #include <memory>
16 
17 #include <solvers/smt2/smt2_dec.h>
18 
19 class cmdlinet;
20 class message_handlert;
21 class namespacet;
22 class optionst;
23 class propt;
26 
27 class solver_factoryt final
28 {
29 public:
32  const optionst &_options,
33  const namespacet &_ns,
34  message_handlert &_message_handler,
35  bool _output_xml_in_refinement);
36 
37  // The solver class,
38  // which owns a variety of allocated objects.
39  class solvert final
40  {
41  public:
42  solvert() = default;
43  explicit solvert(std::unique_ptr<decision_proceduret> p);
44  solvert(std::unique_ptr<decision_proceduret> p1, std::unique_ptr<propt> p2);
45  solvert(
46  std::unique_ptr<decision_proceduret> p1,
47  std::unique_ptr<std::ofstream> p2);
48 
51  propt &prop() const;
52 
53  void set_decision_procedure(std::unique_ptr<decision_proceduret> p);
54  void set_prop(std::unique_ptr<propt> p);
55  void set_ofstream(std::unique_ptr<std::ofstream> p);
56 
57  // the objects are deleted in the opposite order they appear below
58  std::unique_ptr<std::ofstream> ofstream_ptr;
59  std::unique_ptr<propt> prop_ptr;
60  std::unique_ptr<decision_proceduret> decision_procedure_ptr;
61  };
62 
64  virtual std::unique_ptr<solvert> get_solver();
65 
66  virtual ~solver_factoryt() = default;
67 
68 protected:
69  const optionst &options;
70  const namespacet &ns;
73 
74  std::unique_ptr<solvert> get_default();
75  std::unique_ptr<solvert> get_dimacs();
76  std::unique_ptr<solvert> get_external_sat();
77  std::unique_ptr<solvert> get_bv_refinement();
78  std::unique_ptr<solvert> get_string_refinement();
79  std::unique_ptr<solvert> get_incremental_smt2(std::string solver_command);
80  std::unique_ptr<solvert> get_smt2(smt2_dect::solvert solver);
81 
83 
87  void
89 
90  // consistency checks during solver creation
91  void no_beautification();
92  void no_incremental_check();
93 };
94 
97 void parse_solver_options(const cmdlinet &cmdline, optionst &options);
98 
99 #define OPT_SOLVER \
100  "(smt1)" /* rejected, will eventually disappear */ \
101  "(smt2)" \
102  "(fpa)" \
103  "(cvc3)" \
104  "(cvc4)(boolector)(yices)(z3)" \
105  "(mathsat)" \
106  "(cprover-smt2)" \
107  "(incremental-smt2-solver):" \
108  "(external-sat-solver):" \
109  "(no-sat-preprocessor)" \
110  "(beautify)" \
111  "(dimacs)" \
112  "(refine)" \
113  "(max-node-refinement):" \
114  "(refine-arrays)" \
115  "(refine-arithmetic)" \
116  "(outfile):" \
117  "(write-solver-stats-to):"
118 
119 #define HELP_SOLVER \
120  " --external-sat-solver cmd command to invoke SAT solver process\n" \
121  " --no-sat-preprocessor disable the SAT solver's simplifier\n" \
122  " --dimacs generate CNF in DIMACS format\n" \
123  " --beautify beautify the counterexample\n" \
124  " (greedy heuristic)\n" \
125  " --smt1 use default SMT1 solver (obsolete)\n" \
126  " --smt2 use default SMT2 solver (Z3)\n" \
127  " --boolector use Boolector\n" \
128  " --cprover-smt2 use CPROVER SMT2 solver\n" \
129  " --cvc3 use CVC3\n" \
130  " --cvc4 use CVC4\n" \
131  " --mathsat use MathSAT\n" \
132  " --yices use Yices\n" \
133  " --z3 use Z3\n" \
134  " --fpa use theory of floating-point arithmetic\n" \
135  " --refine use refinement procedure (experimental)\n" \
136  " --refine-arrays use refinement for arrays only\n" \
137  " --refine-arithmetic refinement of arithmetic expressions only\n" \
138  " --max-node-refinement maximum refinement iterations for\n" \
139  " arithmetic expressions\n" \
140  " --incremental-smt2-solver cmd\n" \
141  " command to invoke external SMT solver for\n" \
142  " incremental solving (experimental)\n" \
143  " --outfile filename output formula to given file\n" \
144  " --write-solver-stats-to json-file\n" \
145  " collect the solver query complexity\n"
146 
147 #endif // CPROVER_GOTO_CHECKER_SOLVER_FACTORY_H
solver_factoryt::solvert::set_decision_procedure
void set_decision_procedure(std::unique_ptr< decision_proceduret > p)
Definition: solver_factory.cpp:118
optionst
Definition: options.h:22
decision_proceduret
Definition: decision_procedure.h:20
solver_factoryt::get_dimacs
std::unique_ptr< solvert > get_dimacs()
Definition: solver_factory.cpp:244
solver_factoryt::solvert
Definition: solver_factory.h:39
solver_factoryt::set_decision_procedure_time_limit
void set_decision_procedure_time_limit(decision_proceduret &decision_procedure)
Sets the timeout of decision_procedure if the solver-time-limit option has a positive value (in secon...
Definition: solver_factory.cpp:95
solver_factoryt::no_incremental_check
void no_incremental_check()
Definition: solver_factory.cpp:430
solver_factoryt::solvert::prop
propt & prop() const
Definition: solver_factory.cpp:89
stack_decision_proceduret
Definition: stack_decision_procedure.h:57
solver_factoryt
Definition: solver_factory.h:27
namespacet
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
Definition: namespace.h:90
solver_factoryt::get_incremental_smt2
std::unique_ptr< solvert > get_incremental_smt2(std::string solver_command)
Definition: solver_factory.cpp:333
cmdlinet
Definition: cmdline.h:20
solver_factoryt::get_string_refinement
std::unique_ptr< solvert > get_string_refinement()
the string refinement adds to the bit vector refinement specifications for functions from the Java st...
Definition: solver_factory.cpp:310
parse_solver_options
void parse_solver_options(const cmdlinet &cmdline, optionst &options)
Parse solver-related command-line parameters in cmdline and set corresponding values in options.
Definition: solver_factory.cpp:537
solver_factoryt::get_bv_refinement
std::unique_ptr< solvert > get_bv_refinement()
Definition: solver_factory.cpp:273
solver_factoryt::no_beautification
void no_beautification()
Definition: solver_factory.cpp:421
solver_factoryt::solvert::solvert
solvert()=default
solver_factoryt::~solver_factoryt
virtual ~solver_factoryt()=default
solver_factoryt::solvert::set_ofstream
void set_ofstream(std::unique_ptr< std::ofstream > p)
Definition: solver_factory.cpp:129
smt2_dec.h
solver_factoryt::message_handler
message_handlert & message_handler
Definition: solver_factory.h:71
message_handlert
Definition: message.h:27
solver_factoryt::solver_factoryt
solver_factoryt(const optionst &_options, const namespacet &_ns, message_handlert &_message_handler, bool _output_xml_in_refinement)
Note: The solver returned will hold a reference to the namespace ns.
Definition: solver_factory.cpp:42
solver_factoryt::get_default
std::unique_ptr< solvert > get_default()
Definition: solver_factory.cpp:212
solver_factoryt::get_solver
virtual std::unique_ptr< solvert > get_solver()
Returns a solvert object.
Definition: solver_factory.cpp:134
solver_factoryt::solvert::stack_decision_procedure
stack_decision_proceduret & stack_decision_procedure() const
Definition: solver_factory.cpp:80
solver_factoryt::get_external_sat
std::unique_ptr< solvert > get_external_sat()
Definition: solver_factory.cpp:259
solver_factoryt::solvert::decision_procedure_ptr
std::unique_ptr< decision_proceduret > decision_procedure_ptr
Definition: solver_factory.h:60
propt
TO_BE_DOCUMENTED.
Definition: prop.h:22
solver_factoryt::solvert::set_prop
void set_prop(std::unique_ptr< propt > p)
Definition: solver_factory.cpp:124
solver
int solver(std::istream &in)
Definition: smt2_solver.cpp:407
solver_factoryt::solvert::ofstream_ptr
std::unique_ptr< std::ofstream > ofstream_ptr
Definition: solver_factory.h:58
solver_factoryt::options
const optionst & options
Definition: solver_factory.h:69
smt2_convt::solvert
solvert
Definition: smt2_conv.h:39
solver_factoryt::output_xml_in_refinement
const bool output_xml_in_refinement
Definition: solver_factory.h:72
solver_factoryt::solvert::prop_ptr
std::unique_ptr< propt > prop_ptr
Definition: solver_factory.h:59
solver_factoryt::ns
const namespacet & ns
Definition: solver_factory.h:70
solver_factoryt::solvert::decision_procedure
decision_proceduret & decision_procedure() const
Definition: solver_factory.cpp:73
solver_factoryt::get_smt2_solver_type
smt2_dect::solvert get_smt2_solver_type() const
Uses the options to pick an SMT 2.0 solver.
Definition: solver_factory.cpp:159
solver_factoryt::get_smt2
std::unique_ptr< solvert > get_smt2(smt2_dect::solvert solver)
Definition: solver_factory.cpp:345