Storm 1.14.0.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
MathsatSmtSolver.cpp
Go to the documentation of this file.
2
9
10namespace storm {
11namespace solver {
12
13#ifdef STORM_HAVE_MATHSAT
14MathsatSmtSolver::MathsatAllsatModelReference::MathsatAllsatModelReference(
15 storm::expressions::ExpressionManager const& manager, msat_env const& env, msat_term* model,
16 std::unordered_map<storm::expressions::Variable, uint_fast64_t> const& variableToSlotMapping)
17 : ModelReference(manager), env(env), model(model), variableToSlotMapping(variableToSlotMapping) {
18 // Intentionally left empty.
19}
20
21bool MathsatSmtSolver::MathsatAllsatModelReference::getBooleanValue(storm::expressions::Variable const& variable) const {
22 std::unordered_map<storm::expressions::Variable, uint_fast64_t>::const_iterator variableSlotPair = variableToSlotMapping.find(variable);
23 STORM_LOG_THROW(variableSlotPair != variableToSlotMapping.end(), storm::exceptions::InvalidArgumentException,
24 "Cannot retrieve value of unknown variable '" << variable.getName() << "' from model.");
25 msat_term selectedTerm = model[variableSlotPair->second];
26
27 if (msat_term_is_not(env, selectedTerm)) {
28 return false;
29 } else {
30 return true;
31 }
32}
33
34int_fast64_t MathsatSmtSolver::MathsatAllsatModelReference::getIntegerValue(storm::expressions::Variable const&) const {
35 STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "Unable to retrieve integer value from model that only contains boolean values.");
36}
37
38double MathsatSmtSolver::MathsatAllsatModelReference::getRationalValue(storm::expressions::Variable const&) const {
39 STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "Unable to retrieve double value from model that only contains boolean values.");
40}
41
42std::string MathsatSmtSolver::MathsatAllsatModelReference::toString() const {
43 std::stringstream str;
44 bool first = true;
45 str << "[";
46 for (auto const& varSlot : variableToSlotMapping) {
47 if (first) {
48 first = false;
49 } else {
50 str << ", ";
51 }
52 str << varSlot.first.getName() << "=" << std::boolalpha << getBooleanValue(varSlot.first);
53 }
54 str << "]";
55 return str.str();
56}
57
58MathsatSmtSolver::MathsatModelReference::MathsatModelReference(storm::expressions::ExpressionManager const& manager, msat_env const& env,
59 storm::adapters::MathsatExpressionAdapter& expressionAdapter)
60 : ModelReference(manager), env(env), expressionAdapter(expressionAdapter) {
61 // Intentionally left empty.
62}
63
64bool MathsatSmtSolver::MathsatModelReference::getBooleanValue(storm::expressions::Variable const& variable) const {
65 STORM_LOG_ASSERT(variable.hasBooleanType(), "Variable is non-boolean type.");
66 msat_term msatVariable = expressionAdapter.translateExpression(variable);
67 msat_term msatValue = msat_get_model_value(env, msatVariable);
69 !MSAT_ERROR_TERM(msatValue),
70 "Unable to retrieve value of variable in model. This could be caused by calls to the solver between checking for satisfiability and model retrieval.");
71 storm::expressions::Expression value = expressionAdapter.translateExpression(msatValue);
72 return value.evaluateAsBool();
73}
74
75int_fast64_t MathsatSmtSolver::MathsatModelReference::getIntegerValue(storm::expressions::Variable const& variable) const {
76 STORM_LOG_ASSERT(variable.hasIntegerType(), "Variable is non-boolean type.");
77 msat_term msatVariable = expressionAdapter.translateExpression(variable);
78 msat_term msatValue = msat_get_model_value(env, msatVariable);
80 !MSAT_ERROR_TERM(msatValue),
81 "Unable to retrieve value of variable in model. This could be caused by calls to the solver between checking for satisfiability and model retrieval.");
82 storm::expressions::Expression value = expressionAdapter.translateExpression(msatValue);
83 return value.evaluateAsInt();
84}
85
86double MathsatSmtSolver::MathsatModelReference::getRationalValue(storm::expressions::Variable const& variable) const {
87 STORM_LOG_ASSERT(variable.hasRationalType(), "Variable is non-boolean type.");
88 msat_term msatVariable = expressionAdapter.translateExpression(variable);
89 msat_term msatValue = msat_get_model_value(env, msatVariable);
91 !MSAT_ERROR_TERM(msatValue),
92 "Unable to retrieve value of variable in model. This could be caused by calls to the solver between checking for satisfiability and model retrieval.");
93 storm::expressions::Expression value = expressionAdapter.translateExpression(msatValue);
94 return value.evaluateAsDouble();
95}
96
97std::string MathsatSmtSolver::MathsatModelReference::toString() const {
98 std::stringstream str;
99 bool first = true;
100 str << "[";
101 for (auto const& varDecl : expressionAdapter.getAllDeclaredVariables()) {
102 if (first) {
103 first = false;
104 } else {
105 str << ", ";
106 }
107 msat_term msatValue = msat_get_model_value(env, expressionAdapter.translateExpression(varDecl.first));
108 STORM_LOG_ASSERT(!MSAT_ERROR_TERM(msatValue),
109 "Unable to retrieve value of variable in model. This could be caused by calls to the solver between checking for satisfiability and "
110 "model retrieval.");
111 str << varDecl.first.getName() << "=" << expressionAdapter.translateExpression(msatValue);
112 }
113 str << "]";
114 return str.str();
115}
116
117#endif
118
120 : SmtSolver(manager)
121#ifdef STORM_HAVE_MATHSAT
122 ,
123 expressionAdapter(nullptr),
124 lastCheckAssumptions(false),
125 lastResult(CheckResult::Unknown)
126#endif
127{
128#ifdef STORM_HAVE_MATHSAT
129 msat_config config = msat_create_config();
130 if (options.enableInterpolantGeneration) {
131 msat_set_option(config, "interpolation", "true");
132 }
133 if (options.enableModelGeneration) {
134 msat_set_option(config, "model_generation", "true");
135 }
136 if (options.enableUnsatCoreGeneration) {
137 msat_set_option(config, "unsat_core_generation", "true");
138 }
139 STORM_LOG_THROW(!MSAT_ERROR_CONFIG(config), storm::exceptions::UnexpectedException, "Unable to create Mathsat configuration.");
140
141 // Based on the configuration, build the environment, check for errors and destroy the configuration.
142 env = msat_create_env(config);
143 STORM_LOG_THROW(!MSAT_ERROR_ENV(env), storm::exceptions::UnexpectedException, "Unable to create Mathsat environment.");
144 msat_destroy_config(config);
145
146 expressionAdapter = std::make_unique<storm::adapters::MathsatExpressionAdapter>(manager, env);
147#else
148 (void)options;
149#endif
150}
151
153#ifdef STORM_HAVE_MATHSAT
154 if (!MSAT_ERROR_ENV(env)) {
155 msat_destroy_env(env);
156 } else {
157 STORM_LOG_ERROR("Trying to destroy illegal MathSAT environment.");
158 }
159#else
160 // Empty.
161#endif
162}
163
165#ifdef STORM_HAVE_MATHSAT
166 msat_push_backtrack_point(env);
167#else
168 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException, "Storm is compiled without MathSAT support.");
169#endif
170}
171
173#ifdef STORM_HAVE_MATHSAT
174 msat_pop_backtrack_point(env);
175#else
176 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException, "Storm is compiled without MathSAT support.");
177#endif
178}
179
180void MathsatSmtSolver::pop(uint_fast64_t n) {
181#ifdef STORM_HAVE_MATHSAT
183#else
184 (void)n;
185 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException, "Storm is compiled without MathSAT support.");
186#endif
187}
188
190#ifdef STORM_HAVE_MATHSAT
191 msat_reset_env(env);
192#else
193 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException, "Storm is compiled without MathSAT support.");
194#endif
195}
196
198#ifdef STORM_HAVE_MATHSAT
199 msat_term expression = expressionAdapter->translateExpression(e);
200 msat_assert_formula(env, expression);
201 if (expressionAdapter->hasAdditionalConstraints()) {
202 for (auto const& constraint : expressionAdapter->getAdditionalConstraints()) {
203 msat_assert_formula(env, constraint);
204 }
205 }
206#else
207 (void)e;
208 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException, "Storm is compiled without MathSAT support.");
209#endif
210}
211
213#ifdef STORM_HAVE_MATHSAT
214 lastCheckAssumptions = false;
215 switch (msat_solve(env)) {
216 case MSAT_SAT:
217 this->lastResult = SmtSolver::CheckResult::Sat;
218 break;
219 case MSAT_UNSAT:
220 this->lastResult = SmtSolver::CheckResult::Unsat;
221 break;
222 default:
223 this->lastResult = SmtSolver::CheckResult::Unknown;
224 break;
225 }
226 return this->lastResult;
227#else
228 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException, "Storm is compiled without MathSAT support.");
229#endif
230}
231
233#ifdef STORM_HAVE_MATHSAT
234 lastCheckAssumptions = true;
235 std::vector<msat_term> mathSatAssumptions;
236 mathSatAssumptions.reserve(assumptions.size());
237
238 for (storm::expressions::Expression assumption : assumptions) {
239 mathSatAssumptions.push_back(this->expressionAdapter->translateExpression(assumption));
240 }
241
242 switch (msat_solve_with_assumptions(env, mathSatAssumptions.data(), mathSatAssumptions.size())) {
243 case MSAT_SAT:
244 this->lastResult = SmtSolver::CheckResult::Sat;
245 break;
246 case MSAT_UNSAT:
247 this->lastResult = SmtSolver::CheckResult::Unsat;
248 break;
249 default:
250 this->lastResult = SmtSolver::CheckResult::Unknown;
251 break;
252 }
253 return this->lastResult;
254#else
255 (void)assumptions;
256 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException, "Storm is compiled without MathSAT support.");
257#endif
258}
259
260SmtSolver::CheckResult MathsatSmtSolver::checkWithAssumptions(std::initializer_list<storm::expressions::Expression> const& assumptions) {
261#ifdef STORM_HAVE_MATHSAT
262 lastCheckAssumptions = true;
263 std::vector<msat_term> mathSatAssumptions;
264 mathSatAssumptions.reserve(assumptions.size());
265
266 for (storm::expressions::Expression assumption : assumptions) {
267 mathSatAssumptions.push_back(this->expressionAdapter->translateExpression(assumption));
268 }
269
270 switch (msat_solve_with_assumptions(env, mathSatAssumptions.data(), mathSatAssumptions.size())) {
271 case MSAT_SAT:
272 this->lastResult = SmtSolver::CheckResult::Sat;
273 break;
274 case MSAT_UNSAT:
275 this->lastResult = SmtSolver::CheckResult::Unsat;
276 break;
277 default:
278 this->lastResult = SmtSolver::CheckResult::Unknown;
279 break;
280 }
281 return this->lastResult;
282#else
283 (void)assumptions;
284 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException, "Storm is compiled without MathSAT support.");
285#endif
286}
287
289#ifdef STORM_HAVE_MATHSAT
290 STORM_LOG_THROW(this->lastResult == SmtSolver::CheckResult::Sat, storm::exceptions::InvalidStateException,
291 "Unable to create model for formula that was not determined to be satisfiable.");
292 return this->convertMathsatModelToValuation();
293#else
294 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException, "Storm is compiled without MathSAT support.");
295#endif
296}
297
298std::shared_ptr<SmtSolver::ModelReference> MathsatSmtSolver::getModel() {
299#ifdef STORM_HAVE_MATHSAT
300 STORM_LOG_THROW(this->lastResult == SmtSolver::CheckResult::Sat, storm::exceptions::InvalidStateException,
301 "Unable to create model for formula that was not determined to be satisfiable.");
302 return std::shared_ptr<SmtSolver::ModelReference>(new MathsatModelReference(this->getManager(), env, *expressionAdapter));
303#else
304 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException, "Storm is compiled without MathSAT support.");
305#endif
306}
307
308#ifdef STORM_HAVE_MATHSAT
309storm::expressions::SimpleValuation MathsatSmtSolver::convertMathsatModelToValuation() {
310 storm::expressions::SimpleValuation stormModel(this->getManager().getSharedPointer());
311
312 msat_model_iterator modelIterator = msat_create_model_iterator(env);
313 STORM_LOG_THROW(!MSAT_ERROR_MODEL_ITERATOR(modelIterator), storm::exceptions::UnexpectedException, "MathSat returned an illegal model iterator.");
314
315 while (msat_model_iterator_has_next(modelIterator)) {
316 msat_term t, v;
317 msat_model_iterator_next(modelIterator, &t, &v);
318
319 storm::expressions::Expression variableInterpretation = this->expressionAdapter->translateExpression(v);
320 storm::expressions::Variable stormVariable = this->expressionAdapter->getVariable(msat_term_get_decl(t));
321
322 if (stormVariable.hasBooleanType()) {
323 stormModel.setBooleanValue(stormVariable, variableInterpretation.isTrue());
324 } else if (stormVariable.hasIntegerType()) {
325 stormModel.setIntegerValue(stormVariable, variableInterpretation.evaluateAsInt());
326 } else if (stormVariable.hasRationalType()) {
327 stormModel.setRationalValue(stormVariable, variableInterpretation.evaluateAsDouble());
328 } else {
329 STORM_LOG_THROW(false, storm::exceptions::ExpressionEvaluationException, "Variable interpretation in model is not of type bool, int or rational.");
330 }
331 }
332
333 return stormModel;
334}
335#endif
336
337std::vector<storm::expressions::SimpleValuation> MathsatSmtSolver::allSat(std::vector<storm::expressions::Variable> const& important) {
338#ifdef STORM_HAVE_MATHSAT
339 std::vector<storm::expressions::SimpleValuation> valuations;
340 this->allSat(important, [&valuations](storm::expressions::SimpleValuation const& valuation) -> bool {
341 valuations.push_back(valuation);
342 return true;
343 });
344 return valuations;
345#else
346 (void)important;
347 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException, "Storm is compiled without MathSAT support.");
348#endif
349}
350
351#ifdef STORM_HAVE_MATHSAT
352class AllsatValuationCallbackUserData {
353 public:
354 AllsatValuationCallbackUserData(storm::expressions::ExpressionManager const& manager, storm::adapters::MathsatExpressionAdapter& adapter, msat_env& env,
355 std::function<bool(storm::expressions::SimpleValuation&)> const& callback)
356 : manager(manager), adapter(adapter), env(env), callback(callback) {
357 // Intentionally left empty.
358 }
359
360 static int allsatValuationsCallback(msat_term* model, int size, void* user_data) {
361 AllsatValuationCallbackUserData* user = reinterpret_cast<AllsatValuationCallbackUserData*>(user_data);
362
363 storm::expressions::SimpleValuation valuation(user->manager.getSharedPointer());
364 for (int i = 0; i < size; ++i) {
365 bool currentTermValue = true;
366 msat_term currentTerm = model[i];
367 if (msat_term_is_not(user->env, currentTerm)) {
368 currentTerm = msat_term_get_arg(currentTerm, 0);
369 currentTermValue = false;
370 }
371 storm::expressions::Variable stormVariable = user->adapter.getVariable(msat_term_get_decl(currentTerm));
372 valuation.setBooleanValue(stormVariable, currentTermValue);
373 }
374
375 if (user->callback(valuation)) {
376 return 1;
377 } else {
378 return 0;
379 }
380 }
381
382 protected:
383 // The manager responsible for the expression.s
384 storm::expressions::ExpressionManager const& manager;
385
386 // The adapter to use for expression translation.
387 storm::adapters::MathsatExpressionAdapter& adapter;
388
389 // The MathSAT environment. It is used to retrieve the values of the atoms in a model.
390 msat_env& env;
391
392 // The function that is to be called when the MathSAT model has been translated to a valuation.
393 std::function<bool(storm::expressions::SimpleValuation&)> const& callback;
394};
395
396class AllsatModelReferenceCallbackUserData {
397 public:
398 AllsatModelReferenceCallbackUserData(storm::expressions::ExpressionManager const& manager, msat_env& env,
399 std::unordered_map<storm::expressions::Variable, uint_fast64_t> const& atomToSlotMapping,
400 std::function<bool(storm::solver::SmtSolver::ModelReference&)> const& callback)
401 : manager(manager), env(env), atomToSlotMapping(atomToSlotMapping), callback(callback) {
402 // Intentionally left empty.
403 }
404
405 static int allsatModelReferenceCallback(msat_term* model, int, void* user_data) {
406 AllsatModelReferenceCallbackUserData* user = reinterpret_cast<AllsatModelReferenceCallbackUserData*>(user_data);
407 MathsatSmtSolver::MathsatAllsatModelReference modelReference(user->manager, user->env, model, user->atomToSlotMapping);
408 if (user->callback(modelReference)) {
409 return 1;
410 } else {
411 return 0;
412 }
413 }
414
415 protected:
416 // The manager responsible for the expression.s
417 storm::expressions::ExpressionManager const& manager;
418
419 // The MathSAT environment. It is used to retrieve the values of the atoms in a model.
420 msat_env& env;
421
422 // Store a mapping from atoms to their slots in the model.
423 std::unordered_map<storm::expressions::Variable, uint_fast64_t> const& atomToSlotMapping;
424
425 // The function that is to be called when the MathSAT model has been translated to a valuation.
426 std::function<bool(storm::solver::SmtSolver::ModelReference&)> const& callback;
427};
428#endif
429
430uint_fast64_t MathsatSmtSolver::allSat(std::vector<storm::expressions::Variable> const& important,
431 std::function<bool(storm::expressions::SimpleValuation&)> const& callback) {
432#ifdef STORM_HAVE_MATHSAT
433 // Create a backtracking point, because MathSAT will modify the assertions stack during its AllSat procedure.
434 this->push();
435
436 std::vector<msat_term> msatImportant;
437 msatImportant.reserve(important.size());
438
439 for (storm::expressions::Variable const& variable : important) {
440 STORM_LOG_THROW(variable.hasBooleanType(), storm::exceptions::InvalidArgumentException, "The important atoms for AllSat must be boolean variables.");
441 msatImportant.push_back(expressionAdapter->translateExpression(variable));
442 }
443
444 AllsatValuationCallbackUserData allSatUserData(this->getManager(), *expressionAdapter, env, callback);
445 int numberOfModels =
446 msat_all_sat(env, msatImportant.data(), msatImportant.size(), &AllsatValuationCallbackUserData::allsatValuationsCallback, &allSatUserData);
447
448 // Restore original assertion stack and return.
449 this->pop();
450 return static_cast<uint_fast64_t>(numberOfModels);
451#else
452 (void)important;
453 (void)callback;
454 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException, "Storm is compiled without MathSAT support.");
455#endif
456}
457
458uint_fast64_t MathsatSmtSolver::allSat(std::vector<storm::expressions::Variable> const& important,
459 std::function<bool(SmtSolver::ModelReference&)> const& callback) {
460#ifdef STORM_HAVE_MATHSAT
461 // Create a backtracking point, because MathSAT will modify the assertions stack during its AllSat procedure.
462 this->push();
463
464 std::vector<msat_term> msatImportant;
465 msatImportant.reserve(important.size());
466 std::unordered_map<storm::expressions::Variable, uint_fast64_t> atomToSlotMapping;
467
468 for (storm::expressions::Variable const& variable : important) {
469 STORM_LOG_THROW(variable.hasBooleanType(), storm::exceptions::InvalidArgumentException, "The important atoms for AllSat must be boolean variables.");
470 msatImportant.push_back(expressionAdapter->translateExpression(variable));
471 atomToSlotMapping[variable] = msatImportant.size() - 1;
472 }
473
474 AllsatModelReferenceCallbackUserData allSatUserData(this->getManager(), env, atomToSlotMapping, callback);
475 int numberOfModels =
476 msat_all_sat(env, msatImportant.data(), msatImportant.size(), &AllsatModelReferenceCallbackUserData::allsatModelReferenceCallback, &allSatUserData);
477
478 // Restore original assertion stack and return.
479 this->pop();
480 return static_cast<uint_fast64_t>(numberOfModels);
481#else
482 (void)important;
483 (void)callback;
484 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException, "Storm is compiled without MathSAT support.");
485#endif
486}
487
488std::vector<storm::expressions::Expression> MathsatSmtSolver::getUnsatAssumptions() {
489#ifdef STORM_HAVE_MATHSAT
490 STORM_LOG_THROW(lastResult == SmtSolver::CheckResult::Unsat, storm::exceptions::InvalidStateException,
491 "Unable to generate unsatisfiable core of assumptions, because the last check did not determine the formulas to be unsatisfiable.");
492 STORM_LOG_THROW(lastCheckAssumptions, storm::exceptions::InvalidStateException,
493 "Unable to generate unsatisfiable core of assumptions, because the last check did not involve assumptions.");
494
495 size_t numUnsatAssumpations;
496 msat_term* msatUnsatAssumptions = msat_get_unsat_assumptions(env, &numUnsatAssumpations);
497
498 std::vector<storm::expressions::Expression> unsatAssumptions;
499 unsatAssumptions.reserve(numUnsatAssumpations);
500
501 for (unsigned int i = 0; i < numUnsatAssumpations; ++i) {
502 unsatAssumptions.push_back(this->expressionAdapter->translateExpression(msatUnsatAssumptions[i]));
503 }
504
505 return unsatAssumptions;
506#else
507 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException, "Storm is compiled without MathSAT support.");
508#endif
509}
510
512#ifdef STORM_HAVE_MATHSAT
513 auto groupIter = this->interpolationGroups.find(group);
514 if (groupIter == this->interpolationGroups.end()) {
515 int newGroup = msat_create_itp_group(env);
516 auto insertResult = this->interpolationGroups.insert(std::make_pair(group, newGroup));
517 groupIter = insertResult.first;
518 }
519 msat_set_itp_group(env, groupIter->second);
520#else
521 (void)group;
522 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException, "Storm is compiled without MathSAT support.");
523#endif
524}
525
527#ifdef STORM_HAVE_MATHSAT
528 STORM_LOG_THROW(lastResult == SmtSolver::CheckResult::Unsat, storm::exceptions::InvalidStateException,
529 "Unable to generate interpolant, because the last check did not determine the formulas to be unsatisfiable.");
530 STORM_LOG_THROW(!lastCheckAssumptions, storm::exceptions::InvalidStateException,
531 "Unable to generate interpolant, because the last check for satisfiability involved assumptions.");
532
533 std::vector<int> msatInterpolationGroupsA;
534 msatInterpolationGroupsA.reserve(groupsA.size());
535 for (auto groupOfA : groupsA) {
536 auto groupIter = this->interpolationGroups.find(groupOfA);
537 STORM_LOG_THROW(groupIter != this->interpolationGroups.end(), storm::exceptions::InvalidArgumentException,
538 "Unable to generate interpolant, because an unknown interpolation group was referenced.");
539 msatInterpolationGroupsA.push_back(groupIter->second);
540 }
541 msat_term interpolant = msat_get_interpolant(env, msatInterpolationGroupsA.data(), msatInterpolationGroupsA.size());
542
543 STORM_LOG_THROW(!MSAT_ERROR_TERM(interpolant), storm::exceptions::UnexpectedException, "Unable to retrieve an interpolant.");
544
545 return this->expressionAdapter->translateExpression(interpolant);
546#else
547 (void)groupsA;
548 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException, "Storm is compiled without MathSAT support.");
549#endif
550}
551} // namespace solver
552} // namespace storm
int_fast64_t evaluateAsInt(Valuation const *valuation=nullptr) const
Evaluates the expression under the valuation of variables given by the valuation and returns the resu...
bool evaluateAsBool(Valuation const *valuation=nullptr) const
Evaluates the expression under the valuation of variables given by the valuation and returns the resu...
double evaluateAsDouble(Valuation const *valuation=nullptr) const
Evaluates the expression under the valuation of variables given by the valuation and returns the resu...
bool isTrue() const
Checks if the expression is equal to the boolean literal true.
This class is responsible for managing a set of typed variables and all expressions using these varia...
A simple implementation of the valuation interface.
bool hasBooleanType() const
Checks whether the variable is of boolean type.
Definition Variable.cpp:59
bool hasIntegerType() const
Checks whether the variable is of integral type.
Definition Variable.cpp:63
bool hasRationalType() const
Checks whether the variable is of rational type.
Definition Variable.cpp:71
std::string const & getName() const
Retrieves the name of the variable.
Definition Variable.cpp:46
A class that captures options that may be passed to the Mathsat solver.
virtual std::vector< storm::expressions::Expression > getUnsatAssumptions() override
If the last call to checkWithAssumptions() returned Unsat, this function can be used to retrieve a su...
virtual CheckResult checkWithAssumptions(storm::expressions::ExpressionSet const &assumptions) override
Checks whether the conjunction of assertions that are currently on the solver's stack together with t...
virtual storm::expressions::Expression getInterpolant(std::vector< uint_fast64_t > const &groupsA) override
If the last call to check() returned Unsat, the solver has been instantiated with support for interpo...
virtual std::shared_ptr< SmtSolver::ModelReference > getModel() override
If the last call to check() or checkWithAssumptions() returned Sat, this method retrieves a model tha...
virtual void add(storm::expressions::Expression const &assertion) override
Adds an assertion to the solver's stack.
MathsatSmtSolver(storm::expressions::ExpressionManager &manager, Options const &options=Options())
virtual void pop() override
Pops a backtracking point from the solver's stack.
virtual CheckResult check() override
Checks whether the conjunction of assertions that are currently on the solver's stack is satisfiable.
virtual void reset() override
Removes all assertions from the solver's stack.
virtual std::vector< storm::expressions::SimpleValuation > allSat(std::vector< storm::expressions::Variable > const &important) override
Performs AllSat over the (provided) important atoms.
virtual void push() override
Pushes a backtracking point on the solver's stack.
virtual storm::expressions::SimpleValuation getModelAsValuation() override
If the last call to check() or checkWithAssumptions() returned Sat, this method retrieves a model tha...
virtual void setInterpolationGroup(uint_fast64_t group) override
Sets the current interpolation group.
The base class for all model references.
Definition SmtSolver.h:30
virtual void pop()=0
Pops a backtracking point from the solver's stack.
storm::expressions::ExpressionManager const & getManager() const
Retrieves the expression manager associated with the solver.
Definition SmtSolver.cpp:79
SmtSolver(storm::expressions::ExpressionManager &manager)
Constructs a new Smt solver with the given options.
Definition SmtSolver.cpp:17
CheckResult
possible check results
Definition SmtSolver.h:24
#define STORM_LOG_ERROR(message)
Definition logging.h:36
#define STORM_LOG_ASSERT(cond, message)
Definition macros.h:9
#define STORM_LOG_THROW(cond, exception, message)
Definition macros.h:39
std::set< Expression, ExpressionComparator > ExpressionSet
Definition Expression.h:515
SettingsManager const & manager()
Retrieves the settings manager.