Storm 1.14.0.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
solutionFunctions.cpp
Go to the documentation of this file.
2
12#include "storm/logic/Formula.h"
27
28namespace storm::pars {
29
30namespace {
34template<typename ValueType>
35ValueType asSolutionFunction(storm::utility::ExtendedValueType<ValueType> const& value) {
36 STORM_LOG_THROW(storm::utility::isFinite(value), storm::exceptions::NotSupportedException,
37 "The solution function is " << value << ", which the parametric result format cannot express.");
38 return storm::utility::getFinite(value);
39}
40} // namespace
41
42template<typename ValueType>
44 std::vector<storm::jani::Property> const& properties,
45 std::function<std::unique_ptr<storm::modelchecker::CheckResult>(std::shared_ptr<storm::logic::Formula const> const& formula)> const& verificationCallback,
46 std::function<void(std::unique_ptr<storm::modelchecker::CheckResult> const&)> const& postprocessingCallback) {
47 for (auto const& property : properties) {
49 STORM_LOG_THROW(property.getRawFormula()->isOperatorFormula(), storm::exceptions::NotSupportedException,
50 "We only support operator formulas (P=?, R=?, etc).");
51 STORM_LOG_THROW(!property.getRawFormula()->asOperatorFormula().hasBound(), storm::exceptions::NotSupportedException,
52 "We only support unbounded operator formulas (P=?, R=?, etc).");
53 storm::utility::Stopwatch watch(true);
54 std::unique_ptr<storm::modelchecker::CheckResult> result = verificationCallback(property.getRawFormula());
55 watch.stop();
57 postprocessingCallback(result);
58 }
59}
60
61template<typename ValueType>
63 storm::cli::SymbolicInput const& input) {
64 bool const preferEliminationChecker = storm::cli::preferEliminationChecker();
66 input.properties,
67 [&env, &model, preferEliminationChecker](std::shared_ptr<storm::logic::Formula const> const& formula) {
68 std::unique_ptr<storm::modelchecker::CheckResult> result =
69 storm::api::verifyWithSparseEngine<ValueType>(env, model, storm::api::createTask<ValueType>(formula, true), preferEliminationChecker);
70 if (result) {
71 result->filter(storm::modelchecker::ExplicitQualitativeCheckResult<ValueType>(model->getInitialStates()));
72 }
73 return result;
74 },
75 [&model](std::unique_ptr<storm::modelchecker::CheckResult> const& result) {
77 if (parametricSettings.exportResultToFile() && model->isOfType(storm::models::ModelType::Dtmc)) {
78 auto dtmc = model->template as<storm::models::sparse::Dtmc<ValueType>>();
79 std::optional<ValueType> rationalFunction =
80 asSolutionFunction<ValueType>(result->asExplicitQuantitativeCheckResult<ValueType>()[*model->getInitialStates().begin()]);
81 auto constraintCollector = storm::analysis::ConstraintCollector(*dtmc);
82 api::exportParametricResultToFile<ValueType>(rationalFunction, constraintCollector, parametricSettings.exportResultPath());
83 } else if (parametricSettings.exportResultToFile() && model->isOfType(storm::models::ModelType::Ctmc)) {
84 auto ctmc = model->template as<storm::models::sparse::Ctmc<ValueType>>();
85 std::optional<ValueType> rationalFunction =
86 asSolutionFunction<ValueType>(result->asExplicitQuantitativeCheckResult<ValueType>()[*model->getInitialStates().begin()]);
87 auto constraintCollector = storm::analysis::ConstraintCollector(*ctmc);
88 api::exportParametricResultToFile<ValueType>(rationalFunction, constraintCollector, parametricSettings.exportResultPath());
89 }
90 });
91}
92
93template<storm::dd::DdType DdType, typename ValueType>
95 storm::cli::SymbolicInput const& input) {
97 input.properties,
98 [&env, &model](std::shared_ptr<storm::logic::Formula const> const& formula) {
99 std::unique_ptr<storm::modelchecker::CheckResult> result =
100 storm::api::verifyWithDdEngine<DdType, ValueType>(env, model, storm::api::createTask<ValueType>(formula, true));
101 if (result) {
102 result->filter(storm::modelchecker::SymbolicQualitativeCheckResult<DdType>(model->getReachableStates(), model->getInitialStates()));
103 }
104 return result;
105 },
106 [&model](std::unique_ptr<storm::modelchecker::CheckResult> const& result) {
108 if (parametricSettings.exportResultToFile() && model->isOfType(storm::models::ModelType::Dtmc)) {
109 STORM_LOG_WARN("For symbolic engines, we currently do not support collecting graph-preserving constraints.");
110 std::optional<ValueType> rationalFunction = asSolutionFunction<ValueType>(result->asSymbolicQuantitativeCheckResult<DdType, ValueType>().sum());
111 api::exportParametricResultToFile<ValueType>(rationalFunction, storm::NullRef, parametricSettings.exportResultPath());
112 }
113 });
114}
115
117 std::vector<storm::jani::Property> const&,
118 std::function<std::unique_ptr<storm::modelchecker::CheckResult>(std::shared_ptr<storm::logic::Formula const> const&)> const&,
119 std::function<void(std::unique_ptr<storm::modelchecker::CheckResult> const&)> const&);
120
124
128
129} // namespace storm::pars
Class to collect constraints on parametric Markov chains.
Base class for all sparse models.
Definition Model.h:34
Base class for all symbolic models.
Definition Model.h:42
A class that provides convenience operations to display run times.
Definition Stopwatch.h:13
void stop()
Stop stopwatch and add measured time to total time.
Definition Stopwatch.cpp:42
#define STORM_LOG_WARN(message)
Definition logging.h:35
#define STORM_LOG_THROW(cond, exception, message)
Definition macros.h:39
void printModelCheckingProperty(storm::jani::Property const &property)
bool preferEliminationChecker()
Returns whether the settings request to prefer the dedicated elimination model checker.
SFTBDDChecker::ValueType ValueType
void exportParametricResultToFile(std::optional< storm::RationalFunction > result, storm::OptionalRef< storm::analysis::ConstraintCollector const > const &constraintCollector, std::string const &path)
Definition export.cpp:27
void computeSolutionFunctionsWithSparseEngine(storm::Environment const &env, std::shared_ptr< storm::models::sparse::Model< ValueType > > const &model, storm::cli::SymbolicInput const &input)
void verifyProperties(std::vector< storm::jani::Property > const &properties, std::function< std::unique_ptr< storm::modelchecker::CheckResult >(std::shared_ptr< storm::logic::Formula const > const &formula)> const &verificationCallback, std::function< void(std::unique_ptr< storm::modelchecker::CheckResult > const &)> const &postprocessingCallback)
void computeSolutionFunctionsWithSymbolicEngine(storm::Environment const &env, std::shared_ptr< storm::models::symbolic::Model< DdType, ValueType > > const &model, storm::cli::SymbolicInput const &input)
void printInitialStatesResult(std::unique_ptr< storm::modelchecker::CheckResult > const &result, storm::utility::Stopwatch *watch, const storm::utility::parametric::Valuation< ValueType > *valuation)
Definition print.cpp:11
SettingsType const & getModule()
Get module.
bool isFinite(ExtendedNumber< ValueType > const &value)
std::conditional_t< storm::NumberTraits< ValueType >::HasInfinity, ValueType, ExtendedNumber< ValueType > > ExtendedValueType
The type to use for values that may be infinite.
ValueType const & getFinite(ExtendedNumber< ValueType > const &value)
constexpr NullRefType NullRef
Definition OptionalRef.h:31
std::vector< storm::jani::Property > properties