Storm 1.14.0.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
solver.cpp
Go to the documentation of this file.
2
3#include <type_traits>
4
18
19namespace storm {
20namespace utility {
21namespace solver {
22
23template<typename ValueType>
24std::unique_ptr<storm::solver::LpSolver<ValueType>> GlpkLpSolverFactory<ValueType>::create(storm::Environment const& env, std::string const& name) const {
25 return std::unique_ptr<storm::solver::LpSolver<ValueType>>(
27}
28
29template<typename ValueType>
30std::unique_ptr<storm::solver::LpSolver<ValueType, true>> GlpkLpSolverFactory<ValueType>::createRaw(storm::Environment const& env,
31 std::string const& name) const {
32 return std::unique_ptr<storm::solver::LpSolver<ValueType, true>>(
34}
35
36template<typename ValueType>
37std::unique_ptr<LpSolverFactory<ValueType>> GlpkLpSolverFactory<ValueType>::clone() const {
38 return std::make_unique<GlpkLpSolverFactory<ValueType>>(*this);
39}
40
41template<typename ValueType>
42std::unique_ptr<storm::solver::LpSolver<ValueType>> SoplexLpSolverFactory<ValueType>::create(storm::Environment const&, std::string const& name) const {
43 return std::unique_ptr<storm::solver::LpSolver<ValueType>>(new storm::solver::SoplexLpSolver<ValueType>(name));
44}
45
46template<typename ValueType>
47std::unique_ptr<storm::solver::LpSolver<ValueType, true>> SoplexLpSolverFactory<ValueType>::createRaw(storm::Environment const&,
48 std::string const& name) const {
49 return std::unique_ptr<storm::solver::LpSolver<ValueType, true>>(new storm::solver::SoplexLpSolver<ValueType, true>(name));
50}
51
52template<typename ValueType>
53std::unique_ptr<LpSolverFactory<ValueType>> SoplexLpSolverFactory<ValueType>::clone() const {
54 return std::make_unique<SoplexLpSolverFactory<ValueType>>(*this);
55}
56
57template<typename ValueType>
58std::unique_ptr<storm::solver::LpSolver<ValueType>> HighsLpSolverFactory<ValueType>::create(storm::Environment const&, std::string const& name) const {
59 return std::unique_ptr<storm::solver::LpSolver<ValueType>>(new storm::solver::HighsLpSolver<ValueType>(name));
60}
61
62template<typename ValueType>
63std::unique_ptr<storm::solver::LpSolver<ValueType, true>> HighsLpSolverFactory<ValueType>::createRaw(storm::Environment const&, std::string const& name) const {
64 return std::unique_ptr<storm::solver::LpSolver<ValueType, true>>(new storm::solver::HighsLpSolver<ValueType, true>(name));
65}
66
67template<typename ValueType>
68std::unique_ptr<LpSolverFactory<ValueType>> HighsLpSolverFactory<ValueType>::clone() const {
69 return std::make_unique<HighsLpSolverFactory<ValueType>>(*this);
70}
71
72template<typename ValueType>
73std::shared_ptr<storm::solver::GurobiEnvironment> const& GurobiLpSolverFactory<ValueType>::getOrCreateGurobiEnvironment(storm::Environment const& env) const {
74 if (!environment) {
75 environment = std::make_shared<storm::solver::GurobiEnvironment>();
76 environment->initialize(env.solver().gurobi(), env.solver().isDebugSet());
77 }
78 return environment;
79}
80
81template<typename ValueType>
82std::unique_ptr<storm::solver::LpSolver<ValueType>> GurobiLpSolverFactory<ValueType>::create(storm::Environment const& env, std::string const& name) const {
83 return std::unique_ptr<storm::solver::LpSolver<ValueType>>(new storm::solver::GurobiLpSolver<ValueType>(getOrCreateGurobiEnvironment(env), name));
84}
85
86template<typename ValueType>
87std::unique_ptr<storm::solver::LpSolver<ValueType, true>> GurobiLpSolverFactory<ValueType>::createRaw(storm::Environment const& env,
88 std::string const& name) const {
89 return std::unique_ptr<storm::solver::LpSolver<ValueType, true>>(
90 new storm::solver::GurobiLpSolver<ValueType, true>(getOrCreateGurobiEnvironment(env), name));
91}
92
93template<typename ValueType>
94std::unique_ptr<LpSolverFactory<ValueType>> GurobiLpSolverFactory<ValueType>::clone() const {
95 return std::make_unique<GurobiLpSolverFactory<ValueType>>(*this);
96}
97
98template<typename ValueType>
99std::unique_ptr<storm::solver::LpSolver<ValueType>> Z3LpSolverFactory<ValueType>::create(storm::Environment const&, std::string const& name) const {
100 return std::unique_ptr<storm::solver::LpSolver<ValueType>>(new storm::solver::Z3LpSolver<ValueType>(name));
101}
102
103template<typename ValueType>
104std::unique_ptr<storm::solver::LpSolver<ValueType, true>> Z3LpSolverFactory<ValueType>::createRaw(storm::Environment const&, std::string const& name) const {
105 return std::unique_ptr<storm::solver::LpSolver<ValueType, true>>(new storm::solver::Z3LpSolver<ValueType, true>(name));
106}
107
108template<typename ValueType>
109std::unique_ptr<LpSolverFactory<ValueType>> Z3LpSolverFactory<ValueType>::clone() const {
110 return std::make_unique<Z3LpSolverFactory<ValueType>>(*this);
111}
112
113template<typename ValueType>
114std::unique_ptr<LpSolverFactory<ValueType>> getLpSolverFactory(storm::Environment const& env, storm::solver::LpSolverTypeSelection solvType) {
115 storm::solver::LpSolverType t;
116 if (solvType == storm::solver::LpSolverTypeSelection::FROMSETTINGS) {
117 t = env.solver().getLpSolverType();
119 if (useExact && t != storm::solver::LpSolverType::Z3 && env.solver().isLpSolverTypeSetFromDefaultValue()) {
120 t = storm::solver::LpSolverType::Z3;
121 }
122 } else {
123 t = convert(solvType);
124 }
125 switch (t) {
126 case storm::solver::LpSolverType::Glpk:
127 return std::unique_ptr<LpSolverFactory<ValueType>>(new GlpkLpSolverFactory<ValueType>());
128 case storm::solver::LpSolverType::Gurobi:
129 return std::unique_ptr<LpSolverFactory<ValueType>>(new GurobiLpSolverFactory<ValueType>());
130 case storm::solver::LpSolverType::Highs:
131 if constexpr (std::is_same_v<ValueType, double>) {
132 return std::unique_ptr<LpSolverFactory<ValueType>>(new HighsLpSolverFactory<ValueType>());
133 } else {
134 STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "The HiGHS LP solver only supports double precision.");
135 }
136 break;
137 case storm::solver::LpSolverType::Soplex:
138 return std::unique_ptr<LpSolverFactory<ValueType>>(new SoplexLpSolverFactory<ValueType>());
139 case storm::solver::LpSolverType::Z3:
140 return std::unique_ptr<LpSolverFactory<ValueType>>(new Z3LpSolverFactory<ValueType>());
141 }
142 return nullptr;
143}
144
145template<typename ValueType>
146std::unique_ptr<storm::solver::LpSolver<ValueType>> getLpSolver(storm::Environment const& env, std::string const& name,
147 storm::solver::LpSolverTypeSelection solvType) {
148 std::unique_ptr<storm::utility::solver::LpSolverFactory<ValueType>> factory = getLpSolverFactory<ValueType>(env, solvType);
149 return factory->create(env, name);
150}
151
152template<typename ValueType>
153std::unique_ptr<storm::solver::LpSolver<ValueType, true>> getRawLpSolver(storm::Environment const& env, std::string const& name,
154 storm::solver::LpSolverTypeSelection solvType) {
155 std::unique_ptr<storm::utility::solver::LpSolverFactory<ValueType>> factory = getLpSolverFactory<ValueType>(env, solvType);
156 return factory->createRaw(env, name);
157}
158
159namespace {
160std::unique_ptr<storm::solver::SmtSolver> createSmtSolver(storm::solver::SmtSolverType smtSolverType, storm::expressions::ExpressionManager& manager) {
161 switch (smtSolverType) {
162 case storm::solver::SmtSolverType::Z3:
163 return std::unique_ptr<storm::solver::SmtSolver>(new storm::solver::Z3SmtSolver(manager));
164 case storm::solver::SmtSolverType::Mathsat:
165 return std::unique_ptr<storm::solver::SmtSolver>(new storm::solver::MathsatSmtSolver(manager));
166 case storm::solver::SmtSolverType::Cvc5:
167 return std::unique_ptr<storm::solver::SmtSolver>(new storm::solver::Cvc5SmtSolver(manager));
168 }
169 STORM_LOG_THROW_UNCONDITIONALLY(storm::exceptions::MissingLibraryException, "Requested an SMT solver but none was installed.");
170}
171} // namespace
172
173std::unique_ptr<storm::solver::SmtSolver> SmtSolverFactory::create(storm::expressions::ExpressionManager& manager) const {
174 // Without an environment to consult, we use the SMT solver that was selected at compile time.
175#ifdef STORM_DEFAULT_SMT_SOLVER_Z3
176 return createSmtSolver(storm::solver::SmtSolverType::Z3, manager);
177#elif defined STORM_DEFAULT_SMT_SOLVER_MATHSAT
178 return createSmtSolver(storm::solver::SmtSolverType::Mathsat, manager);
179#elif defined STORM_DEFAULT_SMT_SOLVER_CVC5
180 return createSmtSolver(storm::solver::SmtSolverType::Cvc5, manager);
181#else
182 STORM_LOG_THROW_UNCONDITIONALLY(storm::exceptions::MissingLibraryException, "Requested an SMT solver but none was installed.");
183#endif
184}
185
186std::unique_ptr<storm::solver::SmtSolver> SmtSolverFactory::create(storm::Environment const& env, storm::expressions::ExpressionManager& manager) const {
187 // If an environment is available, we use the SMT solver that was selected in it.
188 return createSmtSolver(env.solver().getSmtSolverType(), manager);
189}
190
191std::unique_ptr<storm::solver::SmtSolver> Z3SmtSolverFactory::create(storm::expressions::ExpressionManager& manager) const {
192 return std::unique_ptr<storm::solver::SmtSolver>(new storm::solver::Z3SmtSolver(manager));
193}
194
195std::unique_ptr<storm::solver::SmtSolver> Z3SmtSolverFactory::create(storm::Environment const&, storm::expressions::ExpressionManager& manager) const {
196 return std::unique_ptr<storm::solver::SmtSolver>(new storm::solver::Z3SmtSolver(manager));
197}
198
199std::unique_ptr<storm::solver::SmtSolver> MathsatSmtSolverFactory::create(storm::expressions::ExpressionManager& manager) const {
200 return std::unique_ptr<storm::solver::SmtSolver>(new storm::solver::MathsatSmtSolver(manager));
201}
202
203std::unique_ptr<storm::solver::SmtSolver> MathsatSmtSolverFactory::create(storm::Environment const&, storm::expressions::ExpressionManager& manager) const {
204 return std::unique_ptr<storm::solver::SmtSolver>(new storm::solver::MathsatSmtSolver(manager));
205}
206
207std::unique_ptr<storm::solver::SmtSolver> Cvc5SmtSolverFactory::create(storm::expressions::ExpressionManager& manager) const {
208 return std::unique_ptr<storm::solver::SmtSolver>(new storm::solver::Cvc5SmtSolver(manager));
209}
210
211std::unique_ptr<storm::solver::SmtSolver> Cvc5SmtSolverFactory::create(storm::Environment const&, storm::expressions::ExpressionManager& manager) const {
212 return std::unique_ptr<storm::solver::SmtSolver>(new storm::solver::Cvc5SmtSolver(manager));
213}
214
215std::unique_ptr<storm::solver::SmtSolver> getSmtSolver(storm::expressions::ExpressionManager& manager) {
216 std::unique_ptr<storm::utility::solver::SmtSolverFactory> factory = std::make_unique<SmtSolverFactory>();
217 return factory->create(manager);
218}
219
220std::unique_ptr<storm::solver::SmtSolver> getSmtSolver(storm::Environment const& env, storm::expressions::ExpressionManager& manager) {
221 std::unique_ptr<storm::utility::solver::SmtSolverFactory> factory = std::make_unique<SmtSolverFactory>();
222 return factory->create(env, manager);
223}
224
225template class LpSolverFactory<double>;
226template class LpSolverFactory<storm::RationalNumber>;
227template class GlpkLpSolverFactory<double>;
228template class GlpkLpSolverFactory<storm::RationalNumber>;
229template class GurobiLpSolverFactory<double>;
230template class GurobiLpSolverFactory<storm::RationalNumber>;
231template class Z3LpSolverFactory<double>;
232template class Z3LpSolverFactory<storm::RationalNumber>;
233template class SoplexLpSolverFactory<double>;
234template class SoplexLpSolverFactory<storm::RationalNumber>;
235template class HighsLpSolverFactory<double>;
236
237template std::unique_ptr<LpSolverFactory<double>> getLpSolverFactory(storm::Environment const& env, storm::solver::LpSolverTypeSelection solvType);
238template std::unique_ptr<LpSolverFactory<storm::RationalNumber>> getLpSolverFactory(storm::Environment const& env,
239 storm::solver::LpSolverTypeSelection solvType);
240template std::unique_ptr<storm::solver::LpSolver<double>> getLpSolver(storm::Environment const& env, std::string const& name,
241 storm::solver::LpSolverTypeSelection solvType);
242template std::unique_ptr<storm::solver::LpSolver<storm::RationalNumber>> getLpSolver(storm::Environment const& env, std::string const& name,
243 storm::solver::LpSolverTypeSelection solvType);
244template std::unique_ptr<storm::solver::LpSolver<double, true>> getRawLpSolver(storm::Environment const& env, std::string const& name,
245 storm::solver::LpSolverTypeSelection solvType);
246template std::unique_ptr<storm::solver::LpSolver<storm::RationalNumber, true>> getRawLpSolver(storm::Environment const& env, std::string const& name,
247 storm::solver::LpSolverTypeSelection solvType);
248} // namespace solver
249} // namespace utility
250} // namespace storm
SolverEnvironment & solver()
GlpkSolverEnvironment & glpk()
bool isLpSolverTypeSetFromDefaultValue() const
storm::solver::LpSolverType const & getLpSolverType() const
GurobiSolverEnvironment & gurobi()
storm::solver::SmtSolverType const & getSmtSolverType() const
Retrieves the SMT solver that is currently selected.
This class is responsible for managing a set of typed variables and all expressions using these varia...
A class that implements the LpSolver interface using glpk as the background solver.
A class that implements the LpSolver interface using Gurobi.
A class that implements the LpSolver interface using HiGHS.
A class that implements the LpSolver interface using Z3.
Definition Z3LpSolver.h:23
virtual std::unique_ptr< storm::solver::SmtSolver > create(storm::expressions::ExpressionManager &manager) const
Creates a new SMT solver instance.
Definition solver.cpp:207
virtual std::unique_ptr< storm::solver::LpSolver< ValueType, false > > create(storm::Environment const &env, std::string const &name) const override
Creates a new linear equation solver instance with the given name.
Definition solver.cpp:24
virtual std::unique_ptr< LpSolverFactory< ValueType > > clone() const override
Definition solver.cpp:37
virtual std::unique_ptr< storm::solver::LpSolver< ValueType, true > > createRaw(storm::Environment const &env, std::string const &name) const override
Definition solver.cpp:30
virtual std::unique_ptr< storm::solver::LpSolver< ValueType, true > > createRaw(storm::Environment const &env, std::string const &name) const override
Definition solver.cpp:87
virtual std::unique_ptr< storm::solver::LpSolver< ValueType, false > > create(storm::Environment const &env, std::string const &name) const override
Creates a new linear equation solver instance with the given name.
Definition solver.cpp:82
virtual std::unique_ptr< LpSolverFactory< ValueType > > clone() const override
Definition solver.cpp:94
virtual std::unique_ptr< storm::solver::LpSolver< ValueType, true > > createRaw(storm::Environment const &env, std::string const &name) const override
Definition solver.cpp:63
virtual std::unique_ptr< LpSolverFactory< ValueType > > clone() const override
Definition solver.cpp:68
virtual std::unique_ptr< storm::solver::LpSolver< ValueType, false > > create(storm::Environment const &env, std::string const &name) const override
Creates a new linear equation solver instance with the given name.
Definition solver.cpp:58
virtual std::unique_ptr< storm::solver::SmtSolver > create(storm::expressions::ExpressionManager &manager) const
Creates a new SMT solver instance.
Definition solver.cpp:199
virtual std::unique_ptr< storm::solver::SmtSolver > create(storm::expressions::ExpressionManager &manager) const
Creates a new SMT solver instance.
Definition solver.cpp:173
virtual std::unique_ptr< LpSolverFactory< ValueType > > clone() const override
Definition solver.cpp:53
virtual std::unique_ptr< storm::solver::LpSolver< ValueType, false > > create(storm::Environment const &env, std::string const &name) const override
Creates a new linear equation solver instance with the given name.
Definition solver.cpp:42
virtual std::unique_ptr< storm::solver::LpSolver< ValueType, true > > createRaw(storm::Environment const &env, std::string const &name) const override
Definition solver.cpp:47
virtual std::unique_ptr< LpSolverFactory< ValueType > > clone() const override
Definition solver.cpp:109
virtual std::unique_ptr< storm::solver::LpSolver< ValueType, false > > create(storm::Environment const &env, std::string const &name) const override
Creates a new linear equation solver instance with the given name.
Definition solver.cpp:99
virtual std::unique_ptr< storm::solver::LpSolver< ValueType, true > > createRaw(storm::Environment const &env, std::string const &name) const override
Definition solver.cpp:104
virtual std::unique_ptr< storm::solver::SmtSolver > create(storm::expressions::ExpressionManager &manager) const
Creates a new SMT solver instance.
Definition solver.cpp:191
#define STORM_LOG_THROW_UNCONDITIONALLY(exception, message)
Definition macros.h:48
#define STORM_LOG_THROW(cond, exception, message)
Definition macros.h:39
std::unique_ptr< LpSolverFactory< ValueType > > getLpSolverFactory(storm::Environment const &env, storm::solver::LpSolverTypeSelection solvType)
Definition solver.cpp:114
std::unique_ptr< storm::solver::LpSolver< ValueType, true > > getRawLpSolver(storm::Environment const &env, std::string const &name, storm::solver::LpSolverTypeSelection solvType)
Definition solver.cpp:153
std::unique_ptr< storm::solver::SmtSolver > getSmtSolver(storm::expressions::ExpressionManager &manager)
Definition solver.cpp:215
std::unique_ptr< storm::solver::LpSolver< ValueType > > getLpSolver(storm::Environment const &env, std::string const &name, storm::solver::LpSolverTypeSelection solvType)
Definition solver.cpp:146
static const bool IsExact