Storm
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
solver.cpp
Go to the documentation of this file.
2
14
15namespace storm {
16namespace utility {
17namespace solver {
18
19template<typename ValueType>
20std::unique_ptr<storm::solver::LpSolver<ValueType>> GlpkLpSolverFactory<ValueType>::create(std::string const& name) const {
21 return std::unique_ptr<storm::solver::LpSolver<ValueType>>(new storm::solver::GlpkLpSolver<ValueType>(name));
22}
23
24template<typename ValueType>
25std::unique_ptr<storm::solver::LpSolver<ValueType, true>> GlpkLpSolverFactory<ValueType>::createRaw(std::string const& name) const {
26 return std::unique_ptr<storm::solver::LpSolver<ValueType, true>>(new storm::solver::GlpkLpSolver<ValueType, true>(name));
27}
28
29template<typename ValueType>
30std::unique_ptr<LpSolverFactory<ValueType>> GlpkLpSolverFactory<ValueType>::clone() const {
31 return std::make_unique<GlpkLpSolverFactory<ValueType>>(*this);
32}
33
34template<typename ValueType>
35std::unique_ptr<storm::solver::LpSolver<ValueType>> SoplexLpSolverFactory<ValueType>::create(std::string const& name) const {
36 return std::unique_ptr<storm::solver::LpSolver<ValueType>>(new storm::solver::SoplexLpSolver<ValueType>(name));
37}
38
39template<typename ValueType>
40std::unique_ptr<storm::solver::LpSolver<ValueType, true>> SoplexLpSolverFactory<ValueType>::createRaw(std::string const& name) const {
41 return std::unique_ptr<storm::solver::LpSolver<ValueType, true>>(new storm::solver::SoplexLpSolver<ValueType, true>(name));
42}
43
44template<typename ValueType>
45std::unique_ptr<LpSolverFactory<ValueType>> SoplexLpSolverFactory<ValueType>::clone() const {
46 return std::make_unique<SoplexLpSolverFactory<ValueType>>(*this);
47}
48
49template<typename ValueType>
51 environment = std::make_shared<storm::solver::GurobiEnvironment>();
52 environment->initialize();
53}
54
55template<typename ValueType>
56std::unique_ptr<storm::solver::LpSolver<ValueType>> GurobiLpSolverFactory<ValueType>::create(std::string const& name) const {
57 return std::unique_ptr<storm::solver::LpSolver<ValueType>>(new storm::solver::GurobiLpSolver<ValueType>(environment, name));
58}
59
60template<typename ValueType>
61std::unique_ptr<storm::solver::LpSolver<ValueType, true>> GurobiLpSolverFactory<ValueType>::createRaw(std::string const& name) const {
62 return std::unique_ptr<storm::solver::LpSolver<ValueType, true>>(new storm::solver::GurobiLpSolver<ValueType, true>(environment, name));
63}
64
65template<typename ValueType>
66std::unique_ptr<LpSolverFactory<ValueType>> GurobiLpSolverFactory<ValueType>::clone() const {
67 return std::make_unique<GurobiLpSolverFactory<ValueType>>(*this);
68}
69
70template<typename ValueType>
71std::unique_ptr<storm::solver::LpSolver<ValueType>> Z3LpSolverFactory<ValueType>::create(std::string const& name) const {
72 return std::unique_ptr<storm::solver::LpSolver<ValueType>>(new storm::solver::Z3LpSolver<ValueType>(name));
73}
74
75template<typename ValueType>
76std::unique_ptr<storm::solver::LpSolver<ValueType, true>> Z3LpSolverFactory<ValueType>::createRaw(std::string const& name) const {
77 return std::unique_ptr<storm::solver::LpSolver<ValueType, true>>(new storm::solver::Z3LpSolver<ValueType, true>(name));
78}
79
80template<typename ValueType>
81std::unique_ptr<LpSolverFactory<ValueType>> Z3LpSolverFactory<ValueType>::clone() const {
82 return std::make_unique<Z3LpSolverFactory<ValueType>>(*this);
83}
84
85template<typename ValueType>
86std::unique_ptr<LpSolverFactory<ValueType>> getLpSolverFactory(storm::solver::LpSolverTypeSelection solvType) {
87 storm::solver::LpSolverType t;
88 if (solvType == storm::solver::LpSolverTypeSelection::FROMSETTINGS) {
90 bool useExact =
92 if (useExact && t != storm::solver::LpSolverType::Z3 &&
94 t = storm::solver::LpSolverType::Z3;
95 }
96 } else {
97 t = convert(solvType);
98 }
99 switch (t) {
100 case storm::solver::LpSolverType::Gurobi:
101 return std::unique_ptr<LpSolverFactory<ValueType>>(new GurobiLpSolverFactory<ValueType>());
102 case storm::solver::LpSolverType::Glpk:
103 return std::unique_ptr<LpSolverFactory<ValueType>>(new GlpkLpSolverFactory<ValueType>());
104 case storm::solver::LpSolverType::Z3:
105 return std::unique_ptr<LpSolverFactory<ValueType>>(new Z3LpSolverFactory<ValueType>());
106 case storm::solver::LpSolverType::Soplex:
107 return std::unique_ptr<LpSolverFactory<ValueType>>(new SoplexLpSolverFactory<ValueType>());
108 }
109 return nullptr;
110}
111
112template<typename ValueType>
113std::unique_ptr<storm::solver::LpSolver<ValueType>> getLpSolver(std::string const& name, storm::solver::LpSolverTypeSelection solvType) {
114 std::unique_ptr<storm::utility::solver::LpSolverFactory<ValueType>> factory = getLpSolverFactory<ValueType>(solvType);
115 return factory->create(name);
116}
117
118template<typename ValueType>
119std::unique_ptr<storm::solver::LpSolver<ValueType, true>> getRawLpSolver(std::string const& name, storm::solver::LpSolverTypeSelection solvType) {
120 std::unique_ptr<storm::utility::solver::LpSolverFactory<ValueType>> factory = getLpSolverFactory<ValueType>(solvType);
121 return factory->createRaw(name);
122}
123
124std::unique_ptr<storm::solver::SmtSolver> SmtSolverFactory::create(storm::expressions::ExpressionManager& manager) const {
125 storm::solver::SmtSolverType smtSolverType;
128 } else {
129#ifdef STORM_HAVE_Z3
130 smtSolverType = storm::solver::SmtSolverType::Z3;
131#elif STORM_HAVE_MSAT
132 smtSolverType = storm::solver::SmtSolverType::Mathsat;
133#else
134 STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Requested an SMT solver but none was installed.");
135#endif
136 }
137 switch (smtSolverType) {
138 case storm::solver::SmtSolverType::Z3:
139 return std::unique_ptr<storm::solver::SmtSolver>(new storm::solver::Z3SmtSolver(manager));
140 case storm::solver::SmtSolverType::Mathsat:
141 return std::unique_ptr<storm::solver::SmtSolver>(new storm::solver::MathsatSmtSolver(manager));
142 }
143 return nullptr;
144}
145
146std::unique_ptr<storm::solver::SmtSolver> Z3SmtSolverFactory::create(storm::expressions::ExpressionManager& manager) const {
147 return std::unique_ptr<storm::solver::SmtSolver>(new storm::solver::Z3SmtSolver(manager));
148}
149
150std::unique_ptr<storm::solver::SmtSolver> MathsatSmtSolverFactory::create(storm::expressions::ExpressionManager& manager) const {
151 return std::unique_ptr<storm::solver::SmtSolver>(new storm::solver::MathsatSmtSolver(manager));
152}
153
154std::unique_ptr<storm::solver::SmtSolver> getSmtSolver(storm::expressions::ExpressionManager& manager) {
155 std::unique_ptr<storm::utility::solver::SmtSolverFactory> factory(new SmtSolverFactory());
156 return factory->create(manager);
157}
158
159template class LpSolverFactory<double>;
160template class LpSolverFactory<storm::RationalNumber>;
161template class GlpkLpSolverFactory<double>;
162template class GlpkLpSolverFactory<storm::RationalNumber>;
163template class GurobiLpSolverFactory<double>;
164template class GurobiLpSolverFactory<storm::RationalNumber>;
165template class Z3LpSolverFactory<double>;
166template class Z3LpSolverFactory<storm::RationalNumber>;
167template class SoplexLpSolverFactory<double>;
168template class SoplexLpSolverFactory<storm::RationalNumber>;
169
170template std::unique_ptr<LpSolverFactory<double>> getLpSolverFactory(storm::solver::LpSolverTypeSelection solvType);
171template std::unique_ptr<LpSolverFactory<storm::RationalNumber>> getLpSolverFactory(storm::solver::LpSolverTypeSelection solvType);
172template std::unique_ptr<storm::solver::LpSolver<double>> getLpSolver(std::string const& name, storm::solver::LpSolverTypeSelection solvType);
173template std::unique_ptr<storm::solver::LpSolver<storm::RationalNumber>> getLpSolver(std::string const& name, storm::solver::LpSolverTypeSelection solvType);
174template std::unique_ptr<storm::solver::LpSolver<double, true>> getRawLpSolver(std::string const& name, storm::solver::LpSolverTypeSelection solvType);
175template std::unique_ptr<storm::solver::LpSolver<storm::RationalNumber, true>> getRawLpSolver(std::string const& name,
176 storm::solver::LpSolverTypeSelection solvType);
177} // namespace solver
178} // namespace utility
179} // namespace storm
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 Gurobi.
A class that implements the LpSolver interface using Z3.
Definition Z3LpSolver.h:24
virtual std::unique_ptr< LpSolverFactory< ValueType > > clone() const override
Definition solver.cpp:30
virtual std::unique_ptr< storm::solver::LpSolver< ValueType, true > > createRaw(std::string const &name) const override
Definition solver.cpp:25
virtual std::unique_ptr< storm::solver::LpSolver< ValueType, false > > create(std::string const &name) const override
Creates a new linear equation solver instance with the given name.
Definition solver.cpp:20
virtual std::unique_ptr< storm::solver::LpSolver< ValueType, false > > create(std::string const &name) const override
Creates a new linear equation solver instance with the given name.
Definition solver.cpp:56
virtual std::unique_ptr< storm::solver::LpSolver< ValueType, true > > createRaw(std::string const &name) const override
Definition solver.cpp:61
virtual std::unique_ptr< LpSolverFactory< ValueType > > clone() const override
Definition solver.cpp:66
virtual std::unique_ptr< storm::solver::SmtSolver > create(storm::expressions::ExpressionManager &manager) const
Creates a new SMT solver instance.
Definition solver.cpp:150
virtual std::unique_ptr< storm::solver::SmtSolver > create(storm::expressions::ExpressionManager &manager) const
Creates a new SMT solver instance.
Definition solver.cpp:124
virtual std::unique_ptr< LpSolverFactory< ValueType > > clone() const override
Definition solver.cpp:45
virtual std::unique_ptr< storm::solver::LpSolver< ValueType, true > > createRaw(std::string const &name) const override
Definition solver.cpp:40
virtual std::unique_ptr< storm::solver::LpSolver< ValueType, false > > create(std::string const &name) const override
Creates a new linear equation solver instance with the given name.
Definition solver.cpp:35
virtual std::unique_ptr< LpSolverFactory< ValueType > > clone() const override
Definition solver.cpp:81
virtual std::unique_ptr< storm::solver::LpSolver< ValueType, true > > createRaw(std::string const &name) const override
Definition solver.cpp:76
virtual std::unique_ptr< storm::solver::LpSolver< ValueType, false > > create(std::string const &name) const override
Creates a new linear equation solver instance with the given name.
Definition solver.cpp:71
virtual std::unique_ptr< storm::solver::SmtSolver > create(storm::expressions::ExpressionManager &manager) const
Creates a new SMT solver instance.
Definition solver.cpp:146
#define STORM_LOG_THROW(cond, exception, message)
Definition macros.h:30
SettingsType const & getModule()
Get module.
std::unique_ptr< storm::solver::LpSolver< ValueType > > getLpSolver(std::string const &name, storm::solver::LpSolverTypeSelection solvType)
Definition solver.cpp:113
std::unique_ptr< storm::solver::SmtSolver > getSmtSolver(storm::expressions::ExpressionManager &manager)
Definition solver.cpp:154
std::unique_ptr< LpSolverFactory< ValueType > > getLpSolverFactory(storm::solver::LpSolverTypeSelection solvType)
Definition solver.cpp:86
std::unique_ptr< storm::solver::LpSolver< ValueType, true > > getRawLpSolver(std::string const &name, storm::solver::LpSolverTypeSelection solvType)
Definition solver.cpp:119
LabParser.cpp.
Definition cli.cpp:18