34template<
typename ValueType>
37 "The solution function is " << value <<
", which the parametric result format cannot express.");
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).");
54 std::unique_ptr<storm::modelchecker::CheckResult> result = verificationCallback(property.getRawFormula());
57 postprocessingCallback(result);
61template<
typename ValueType>
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);
71 result->filter(storm::modelchecker::ExplicitQualitativeCheckResult<ValueType>(model->getInitialStates()));
75 [&model](std::unique_ptr<storm::modelchecker::CheckResult>
const& result) {
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()]);
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()]);
93template<storm::dd::DdType DdType,
typename ValueType>
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));
102 result->filter(storm::modelchecker::SymbolicQualitativeCheckResult<DdType>(model->getReachableStates(), model->getInitialStates()));
106 [&model](std::unique_ptr<storm::modelchecker::CheckResult>
const& result) {
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());
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&);
Class to collect constraints on parametric Markov chains.
Base class for all sparse models.
Base class for all symbolic models.
A class that provides convenience operations to display run times.
void stop()
Stop stopwatch and add measured time to total time.
#define STORM_LOG_WARN(message)
#define STORM_LOG_THROW(cond, exception, message)
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)
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)
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