26 if (input.
model && input.
model.get().isJaniModel()) {
28 if (ioSettings.isExportJaniDotSet()) {
42 STORM_PRINT(
"Time for computation: " << *watch <<
".\n");
49template<
typename ModelType>
50 requires(!std::derived_from<ModelType, storm::models::sparse::Model<double>>)
52 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Counterexample generation is not supported for this data-type.");
55template<
typename ModelType>
56 requires(std::derived_from<ModelType, storm::models::sparse::Model<double>>)
58 using ValueType =
typename ModelType::ValueType;
60 for (
auto& rewModel : sparseModel->getRewardModels()) {
61 rewModel.second.reduceToStateBasedRewards(sparseModel->getTransitionMatrix(),
true);
65 storm::exceptions::NotSupportedException,
"Counterexample is currently only supported for discrete-time models.");
68 if (counterexampleSettings.isMinimalCommandSetGenerationSet()) {
69 bool useMilp = counterexampleSettings.isUseMilpBasedMinimalCommandSetGenerationSet();
73 for (
auto const& property : input.
properties) {
74 std::shared_ptr<storm::counterexamples::Counterexample> counterexample;
79 "Counterexample generation using MILP is currently only supported for MDPs.");
82 property.getRawFormula(), counterexampleSettings.isUseSchedulerCutsSet());
85 storm::exceptions::NotSupportedException,
86 "Counterexample generation using MaxSAT is currently only supported for discrete-time models.");
91 property.getRawFormula(), maxSmtOptions);
100 }
else if (counterexampleSettings.isShortestPathGenerationSet()) {
101 for (
auto const& property : input.
properties) {
102 std::shared_ptr<storm::counterexamples::Counterexample> counterexample;
106 "Counterexample generation using shortest paths is currently only supported for DTMCs.");
108 property.getRawFormula(), counterexampleSettings.getShortestPathMaxK());
113 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"The selected counterexample formalism is unsupported.");
117template<
typename ValueType>
120 if (result->isQuantitative()) {
132 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Outputting states is not supported.");
137 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Filter type only defined for qualitative results.");
140 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Unhandled filter type.");
142 auto const aggregate = result->asQuantitativeCheckResult<ValueType>().aggregate(ft);
143 auto const printSide = [](std::optional<storm::utility::ExtendedValueType<ValueType>>
const& value,
bool approximate) {
148 }
else if (approximate) {
155 bool const approximates =
157 printSide(aggregate.value,
false);
160 printSide(aggregate.value,
true);
164 if (aggregate.hasLower() && aggregate.hasUpper() && *aggregate.lower == *aggregate.upper) {
166 }
else if (aggregate.hasLower() || aggregate.hasUpper()) {
168 printSide(aggregate.lower,
false);
170 printSide(aggregate.upper,
false);
174 printSide(aggregate.lower,
true);
176 printSide(aggregate.upper,
true);
188 STORM_PRINT(result->asQualitativeCheckResult().existsTrue());
191 STORM_PRINT(result->asQualitativeCheckResult().forallTrue());
194 STORM_PRINT(result->asQualitativeCheckResult().count());
198 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Outputting states is not supported.");
204 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Filter type only defined for quantitative results.");
210template<
typename ValueType>
215 std::stringstream ss;
216 ss <<
"'" << filterStatesFormula <<
"'";
218 <<
" (for " << (filterStatesFormula.isInitialFormula() ?
"initial" : ss.str()) <<
" states): ");
221 STORM_PRINT(
"Time for model checking: " << *watch <<
".\n");
224 STORM_LOG_ERROR(
"Property is unsupported by selected engine/settings.\n");
228template<
typename ValueType>
234using VerificationCallbackType = std::function<std::unique_ptr<storm::modelchecker::CheckResult>(std::shared_ptr<storm::logic::Formula const>
const& formula,
235 std::shared_ptr<storm::logic::Formula const>
const& states)>;
239 void operator()(std::unique_ptr<storm::modelchecker::CheckResult>
const&) {
250template<
typename ValueType>
251std::unique_ptr<storm::modelchecker::CheckResult>
verifyProperty(std::shared_ptr<storm::logic::Formula const>
const& formula,
252 std::shared_ptr<storm::logic::Formula const>
const& statesFilter,
258 STORM_LOG_ASSERT(!transformationSettings.isChainEliminationSet() && !transformationSettings.isToNondeterministicModelSet(),
259 "Unsupported transformation has been invoked.");
260 return verificationCallback(formula, statesFilter);
263 STORM_LOG_WARN(
"Property is not preserved by elimination of non-markovian states.");
264 }
else if (transformationSettings.isToDiscreteTimeModelSet()) {
267 if (transformedFormula && transformedStatesFilter) {
269 return verificationCallback(transformedFormula, transformedStatesFilter);
271 STORM_LOG_WARN(
"Property is not preserved by transformation to discrete time model.");
275 return verificationCallback(formula, statesFilter);
289template<
typename ValueType>
293 for (
auto const& property : properties) {
296 auto result =
verifyProperty<ValueType>(property.getRawFormula(), property.getFilter().getStatesFormula(), verificationCallback);
299 postprocessingCallback(result);
314template<
typename ValueType>
315void computeStateValues(std::string
const& description, std::function<std::unique_ptr<storm::modelchecker::CheckResult>()>
const& computationCallback,
320 STORM_PRINT(
"\nComputing " << description <<
" ...\n");
321 std::unique_ptr<storm::modelchecker::CheckResult> result;
323 result = computationCallback();
334 postprocessingCallback(result);
339 for (uint64_t propertyIndex = 0; propertyIndex < properties.size(); ++propertyIndex) {
340 auto const&
property = properties[propertyIndex];
342 if (!property.getRawFormula()->hasQualitativeResult()) {
344 <<
"' can not be used for filtering states as it does not have a qualitative result.");
351 if (propertyFilter) {
353 std::unique_ptr<storm::modelchecker::CheckResult> filteredResult = result->clone();
354 filteredResult->filter(propertyFilter->asQualitativeCheckResult());
355 postprocessingCallback(filteredResult);
357 propertyIndex == properties.size() - 1 ? &watch :
nullptr);
364 std::string
const& constraintsString) {
365 std::vector<storm::expressions::Expression> constraints;
367 std::vector<std::string> constraintsAsStrings;
368 boost::split(constraintsAsStrings, constraintsString, boost::is_any_of(
","));
371 std::unordered_map<std::string, storm::expressions::Expression> variableMapping;
372 for (
auto const& variableTypePair : expressionManager) {
373 variableMapping[variableTypePair.first.getName()] = variableTypePair.first;
377 for (
auto const& constraintString : constraintsAsStrings) {
378 if (constraintString.empty()) {
383 STORM_LOG_TRACE(
"Adding special (user-provided) constraint " << constraint <<
".");
384 constraints.emplace_back(constraint);
392 std::vector<std::vector<storm::expressions::Expression>> injectedRefinementPredicates;
395 std::unordered_map<std::string, storm::expressions::Expression> variableMapping;
396 for (
auto const& variableTypePair : expressionManager) {
397 variableMapping[variableTypePair.first.getName()] = variableTypePair.first;
401 std::vector<std::string> predicateGroupsAsStrings;
402 boost::split(predicateGroupsAsStrings, refinementPredicatesString, boost::is_any_of(
";"));
404 if (!predicateGroupsAsStrings.empty()) {
405 for (
auto const& predicateGroupString : predicateGroupsAsStrings) {
406 if (predicateGroupString.empty()) {
410 std::vector<std::string> predicatesAsStrings;
411 boost::split(predicatesAsStrings, predicateGroupString, boost::is_any_of(
":"));
413 if (!predicatesAsStrings.empty()) {
414 injectedRefinementPredicates.emplace_back();
415 for (
auto const& predicateString : predicatesAsStrings) {
417 STORM_LOG_TRACE(
"Adding special (user-provided) refinement predicate " << predicateString <<
".");
418 injectedRefinementPredicates.back().emplace_back(predicate);
421 STORM_LOG_THROW(!injectedRefinementPredicates.back().empty(), storm::exceptions::InvalidArgumentException,
422 "Expecting non-empty list of predicates to inject for each (mentioned) refinement step.");
425 std::reverse(injectedRefinementPredicates.back().begin(), injectedRefinementPredicates.back().end());
430 std::reverse(injectedRefinementPredicates.begin(), injectedRefinementPredicates.end());
433 return injectedRefinementPredicates;
440 if (expressionManager !=
nullptr) {
445 options.
restrictToValidBlocks =
settings.getValidBlockMode() == storm::settings::modules::AbstractionSettings::ValidBlockMode::BlockEnumeration;
465template<storm::dd::DdType DdType,
typename ValueType>
471 std::shared_ptr<storm::logic::Formula const>
const& states) {
472 STORM_LOG_THROW(states->isInitialFormula(), storm::exceptions::NotSupportedException,
"Abstraction-refinement can only filter initial states.");
478template<
typename ValueType>
481 STORM_LOG_THROW((std::is_same<ValueType, double>::value), storm::exceptions::NotSupportedException,
482 "Exploration does not support other data-types than floating points.");
484 input, [&input, &mpi](std::shared_ptr<storm::logic::Formula const>
const& formula, std::shared_ptr<storm::logic::Formula const>
const& states) {
485 STORM_LOG_THROW(states->isInitialFormula(), storm::exceptions::NotSupportedException,
"Exploration can only filter initial states.");
490template<
typename ValueType>
495 auto verificationCallback = [&sparseModel, &ioSettings, &mpi,
preferEliminationChecker](std::shared_ptr<storm::logic::Formula const>
const& formula,
496 std::shared_ptr<storm::logic::Formula const>
const& states) {
497 auto createTask = [&ioSettings](
auto const& f,
bool onlyInitialStates) {
499 STORM_LOG_THROW(ioSettings.isUncertaintyResolutionModeSet(), storm::exceptions::InvalidSettingsException,
500 "Uncertainty resolution mode required for uncertain (interval) models.");
507 bool const filterForInitialStates = states->isInitialFormula();
508 auto task = createTask(formula, filterForInitialStates);
509 if (ioSettings.isExportSchedulerSet()) {
510 task.setProduceSchedulers(
true);
512 std::unique_ptr<storm::modelchecker::CheckResult> result =
515 std::unique_ptr<storm::modelchecker::CheckResult> filter;
516 if (filterForInitialStates) {
518 filter = std::make_unique<storm::modelchecker::ExplicitQualitativeCheckResult<SolutionType>>(sparseModel->getInitialStates());
519 }
else if (!states->isTrueFormula()) {
522 if (result && filter) {
523 result->filter(filter->asQualitativeCheckResult());
527 uint64_t exportCount = 0;
528 auto postprocessingCallback = [&sparseModel, &ioSettings, &input, &exportCount](std::unique_ptr<storm::modelchecker::CheckResult>
const& result) {
530 STORM_LOG_WARN_COND(!ioSettings.isExportSchedulerSet() || result->hasScheduler(),
"Scheduler requested but could not be generated.");
531 if (ioSettings.isExportSchedulerSet() && result->hasScheduler()) {
532 std::filesystem::path schedulerExportPath = ioSettings.getExportSchedulerFilename();
533 if (exportCount > 0) {
534 STORM_LOG_WARN(
"Prepending " << exportCount <<
" to scheduler file name for this property because there are multiple properties.");
535 schedulerExportPath.replace_filename(std::to_string(exportCount) + schedulerExportPath.filename().string());
540 "No information of state valuations available. The scheduler output will use internal state ids. You might be "
541 "interested in building the model with state valuations using --buildstateval.");
543 sparseModel->hasChoiceLabeling() || sparseModel->hasChoiceOrigins(),
544 "No symbolic choice information is available. The scheduler output will use internal choice ids. You might be interested in "
545 "building the model with choice labels or choice origins using --buildchoicelab or --buildchoiceorig.");
547 "Only partial choice information is available. You might want to build the model with choice origins using "
548 "--buildchoicelab or --buildchoiceorig.");
550 if (result->isExplicitQuantitativeCheckResult()) {
552 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Scheduler export for interval models is not supported.");
555 schedulerExportPath.string());
557 }
else if (result->isExplicitParetoCurveCheckResult()) {
559 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Scheduler export for models of this value type is not supported.");
561 auto const& paretoRes = result->template asExplicitParetoCurveCheckResult<ValueType>();
564 }
else if (result->isExplicitQualitativeCheckResult()) {
566 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Scheduler export for interval models is not supported.");
569 schedulerExportPath.string());
572 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Scheduler export not supported for this value type.");
577 if (ioSettings.isExportCheckResultSet()) {
579 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Result export for interval models is not supported.");
581 std::filesystem::path resultExportPath = ioSettings.getExportCheckResultFilename();
582 if (exportCount > 0) {
583 STORM_LOG_WARN(
"Prepending " << exportCount <<
" to result file name for this property because there are multiple properties.");
584 resultExportPath.replace_filename(std::to_string(exportCount) + resultExportPath.filename().string());
587 "No information of state valuations available. The result output will use internal state ids. You might be interested in "
588 "building the model with state valuations using --buildstateval.");
594 if (!(ioSettings.isComputeSteadyStateDistributionSet() || ioSettings.isComputeExpectedVisitingTimesSet())) {
597 if (ioSettings.isComputeSteadyStateDistributionSet()) {
599 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Computing steady state distribution is not supported for interval models.");
602 "steady-state probabilities",
604 verificationCallback, postprocessingCallback);
607 if (ioSettings.isComputeExpectedVisitingTimesSet()) {
609 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Computing expected visiting times is not supported for interval models.");
612 "expected visiting times",
614 verificationCallback, postprocessingCallback);
619template<storm::dd::DdType DdType,
typename ValueType>
623 input, [&symbolicModel, &mpi](std::shared_ptr<storm::logic::Formula const>
const& formula, std::shared_ptr<storm::logic::Formula const>
const& states) {
624 bool filterForInitialStates = states->isInitialFormula();
629 std::unique_ptr<storm::modelchecker::CheckResult> filter;
630 if (filterForInitialStates) {
631 filter = std::make_unique<storm::modelchecker::SymbolicQualitativeCheckResult<DdType>>(symbolicModel->getReachableStates(),
632 symbolicModel->getInitialStates());
633 }
else if (!states->isTrueFormula()) {
636 if (result && filter) {
637 result->filter(filter->asQualitativeCheckResult());
643template<storm::dd::DdType DdType,
typename ValueType>
647 input, [&symbolicModel, &mpi](std::shared_ptr<storm::logic::Formula const>
const& formula, std::shared_ptr<storm::logic::Formula const>
const& states) {
648 bool filterForInitialStates = states->isInitialFormula();
651 std::unique_ptr<storm::modelchecker::CheckResult> result =
654 std::unique_ptr<storm::modelchecker::CheckResult> filter;
655 if (filterForInitialStates) {
656 filter = std::make_unique<storm::modelchecker::SymbolicQualitativeCheckResult<DdType>>(symbolicModel->getReachableStates(),
657 symbolicModel->getInitialStates());
658 }
else if (!states->isTrueFormula()) {
661 if (result && filter) {
662 result->filter(filter->asQualitativeCheckResult());
668template<storm::dd::DdType DdType,
typename ValueType>
673 std::shared_ptr<storm::logic::Formula const>
const& states) {
674 STORM_LOG_THROW(states->isInitialFormula(), storm::exceptions::NotSupportedException,
"Abstraction-refinement can only filter initial states.");
680template<storm::dd::DdType DdType,
typename ValueType>
681typename std::enable_if<DdType != storm::dd::DdType::CUDD || std::is_same<ValueType, double>::value,
void>::type
verifyModel(
693template<storm::dd::DdType DdType,
typename ValueType>
694typename std::enable_if<DdType == storm::dd::DdType::CUDD && !std::is_same<ValueType, double>::value,
void>::type
verifySymbolicModel(
696 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"CUDD does not support the selected data-type.");
707 [&input, &mpi]<
storm::dd::DdType DD,
typename VT>() { verifyWithAbstractionRefinementEngine<DD, VT>(input, mpi); });
713 if (counterexampleSettings.isCounterexampleSet()) {
This class represents the base class of all exception classes.
virtual const char * what() const noexcept override
Retrieves the message associated with this exception.
This class is responsible for managing a set of typed variables and all expressions using these varia...
std::shared_ptr< storm::logic::Formula const > const & getStatesFormula() const
storm::modelchecker::FilterType getFilterType() const
std::shared_ptr< storm::logic::Formula const > getRawFormula() const
FilterExpression const & getFilter() const
This class represents a discrete-time Markov chain.
This class represents a (discrete-time) Markov decision process.
Base class for all sparse models.
Base class for all symbolic models.
storm::expressions::Expression parseFromString(std::string const &expressionString, bool ignoreError=false) const
Parses an expression from the given string.
void setIdentifierMapping(qi::symbols< char, storm::expressions::Expression > const *identifiers_)
Sets an identifier mapping that is used to determine valid variables in the expression.
This class represents the settings for the abstraction procedures.
storm::jani::Model const & asJaniModel() const
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_TRACE(message)
#define STORM_LOG_ERROR(message)
#define STORM_LOG_ASSERT(cond, message)
#define STORM_LOG_WARN_COND(cond, message)
#define STORM_LOG_THROW(cond, exception, message)
std::unique_ptr< storm::modelchecker::CheckResult > verifyWithHybridEngine(storm::Environment const &env, std::shared_ptr< storm::models::symbolic::Dtmc< DdType, ValueType > > const &dtmc, storm::modelchecker::CheckTask< storm::logic::Formula, ValueType > const &task)
void exportScheduler(std::shared_ptr< storm::models::sparse::Model< ValueType > > const &model, storm::storage::Scheduler< ValueType > const &scheduler, std::string const &filename)
storm::modelchecker::CheckTask< storm::logic::Formula, ValueType > createTask(std::shared_ptr< const storm::logic::Formula > const &formula, bool onlyInitialStatesRelevant=false)
std::shared_ptr< storm::counterexamples::Counterexample > computeHighLevelCounterexampleMaxSmt(storm::Environment const &env, storm::storage::SymbolicModelDescription const &symbolicModel, std::shared_ptr< storm::models::sparse::Model< double > > model, std::shared_ptr< storm::logic::Formula const > const &formula, storm::counterexamples::SMTMinimalLabelSetGenerator< double >::Options const &options)
std::unique_ptr< storm::modelchecker::CheckResult > verifyWithExplorationEngine(storm::Environment const &env, storm::storage::SymbolicModelDescription const &model, storm::modelchecker::CheckTask< storm::logic::Formula, ValueType > const &task)
void exportJaniModelAsDot(storm::jani::Model const &model, std::string const &filename)
std::unique_ptr< storm::modelchecker::CheckResult > computeExpectedVisitingTimesWithSparseEngine(storm::Environment const &env, std::shared_ptr< storm::models::sparse::Dtmc< ValueType > > const &dtmc)
std::unique_ptr< storm::modelchecker::CheckResult > verifyWithDdEngine(storm::Environment const &env, std::shared_ptr< storm::models::symbolic::Dtmc< DdType, ValueType > > const &dtmc, storm::modelchecker::CheckTask< storm::logic::Formula, ValueType > const &task)
std::shared_ptr< storm::logic::Formula const > checkAndTransformContinuousToDiscreteTimeFormula(storm::logic::Formula const &formula, std::string const &timeRewardName="_time")
void exportCheckResultToJson(std::shared_ptr< storm::models::sparse::Model< ValueType > > const &model, std::unique_ptr< storm::modelchecker::CheckResult > const &checkResult, std::string const &filename)
std::shared_ptr< storm::counterexamples::Counterexample > computeKShortestPathCounterexample(std::shared_ptr< storm::models::sparse::Model< double > > model, std::shared_ptr< storm::logic::Formula const > const &formula, size_t maxK)
void exportParetoScheduler(std::shared_ptr< storm::models::sparse::Model< ValueType > > const &model, std::vector< PointType > const &points, std::vector< storm::storage::Scheduler< ValueType > > const &schedulers, std::string const &baseFilenameStr)
std::unique_ptr< storm::modelchecker::CheckResult > verifyWithSparseEngine(storm::Environment const &env, std::shared_ptr< storm::models::sparse::Dtmc< ValueType > > const &dtmc, storm::modelchecker::CheckTask< storm::logic::Formula, ValueType > const &task, bool preferEliminationChecker=false)
std::unique_ptr< storm::modelchecker::CheckResult > computeSteadyStateDistributionWithSparseEngine(storm::Environment const &env, std::shared_ptr< storm::models::sparse::Dtmc< ValueType > > const &dtmc)
std::shared_ptr< storm::counterexamples::Counterexample > computeHighLevelCounterexampleMilp(storm::Environment const &env, storm::storage::SymbolicModelDescription const &symbolicModel, std::shared_ptr< storm::models::sparse::Mdp< double > > mdp, std::shared_ptr< storm::logic::Formula const > const &formula, bool includeSchedulerCuts)
void exportSymbolicInput(SymbolicInput const &input)
void verifyWithAbstractionRefinementEngine(SymbolicInput const &input, ModelProcessingInformation const &mpi)
std::enable_if< DdType==storm::dd::DdType::CUDD &&!std::is_same< ValueType, double >::value, void >::type verifySymbolicModel(std::shared_ptr< storm::models::ModelBase > const &, SymbolicInput const &, ModelProcessingInformation const &)
void verifyModel(std::shared_ptr< storm::models::sparse::Model< ValueType > > const &sparseModel, SymbolicInput const &input, ModelProcessingInformation const &mpi)
auto castAndApply(std::shared_ptr< storm::models::ModelBase > const &model, auto const &callback)
void verifyWithExplorationEngine(SymbolicInput const &input, ModelProcessingInformation const &mpi)
void printResult(std::unique_ptr< storm::modelchecker::CheckResult > const &result, storm::logic::Formula const &filterStatesFormula, storm::modelchecker::FilterType const &filterType, storm::utility::Stopwatch *watch=nullptr)
auto applyValueType(ModelProcessingInformation::ValueType vt, auto const &callback)
std::shared_ptr< storm::models::ModelBase > buildPreprocessExportModel(SymbolicInput const &input, ModelProcessingInformation const &mpi)
void verifyProperties(SymbolicInput const &input, VerificationCallbackType const &verificationCallback, PostprocessingCallbackType const &postprocessingCallback=PostprocessingIdentity())
Verifies all (potentially preprocessed) properties given in input.
std::vector< storm::expressions::Expression > parseConstraints(storm::expressions::ExpressionManager const &expressionManager, std::string const &constraintsString)
std::vector< std::vector< storm::expressions::Expression > > parseInjectedRefinementPredicates(storm::expressions::ExpressionManager const &expressionManager, std::string const &refinementPredicatesString)
void generateCounterexamples(std::shared_ptr< ModelType > const &, SymbolicInput const &, ModelProcessingInformation const &)
void verifyWithDdEngine(std::shared_ptr< storm::models::symbolic::Model< DdType, ValueType > > const &symbolicModel, SymbolicInput const &input, ModelProcessingInformation const &mpi)
std::function< std::unique_ptr< storm::modelchecker::CheckResult >(std::shared_ptr< storm::logic::Formula const > const &formula, std::shared_ptr< storm::logic::Formula const > const &states)> VerificationCallbackType
void printFilteredResult(std::unique_ptr< storm::modelchecker::CheckResult > const &result, storm::modelchecker::FilterType ft)
void computeStateValues(std::string const &description, std::function< std::unique_ptr< storm::modelchecker::CheckResult >()> const &computationCallback, SymbolicInput const &input, VerificationCallbackType const &verificationCallback, PostprocessingCallbackType const &postprocessingCallback=PostprocessingIdentity())
Computes values for each state (such as the steady-state probability distribution).
std::function< void(std::unique_ptr< storm::modelchecker::CheckResult > const &)> PostprocessingCallbackType
void printCounterexample(std::shared_ptr< storm::counterexamples::Counterexample > const &counterexample, storm::utility::Stopwatch *watch=nullptr)
void printModelCheckingProperty(storm::jani::Property const &property)
void verifyWithHybridEngine(std::shared_ptr< storm::models::symbolic::Model< DdType, ValueType > > const &symbolicModel, SymbolicInput const &input, ModelProcessingInformation const &mpi)
void printComputingCounterexample(storm::jani::Property const &property)
auto applyDdLibValueType(storm::dd::DdType dd, ModelProcessingInformation::ValueType vt, auto const &callback)
bool preferEliminationChecker()
Returns whether the settings request to prefer the dedicated elimination model checker.
void processInput(SymbolicInput const &input, ModelProcessingInformation const &mpi)
storm::gbar::api::AbstractionRefinementOptions getAbstractionRefinementOptions(storm::expressions::ExpressionManager const *expressionManager=nullptr)
std::unique_ptr< storm::modelchecker::CheckResult > verifyProperty(std::shared_ptr< storm::logic::Formula const > const &formula, std::shared_ptr< storm::logic::Formula const > const &statesFilter, VerificationCallbackType const &verificationCallback)
Verifies the given formula plus a filter formula to identify relevant states and warns the user in ca...
std::enable_if<!std::is_same< ValueType, storm::RationalFunction >::value, std::unique_ptr< storm::modelchecker::CheckResult > >::type verifyWithAbstractionRefinementEngine(storm::Environment const &env, storm::storage::SymbolicModelDescription const &model, storm::modelchecker::CheckTask< storm::logic::Formula, ValueType > const &task, AbstractionRefinementOptions const &options=AbstractionRefinementOptions())
storm::gbar::abstraction::AbstractionOptions AbstractionRefinementOptions
SettingsType const & getModule()
Get module.
OptimizationDirection convert(OptimizationDirectionSetting s)
bool isTerminate()
Check whether the program should terminate (due to some abort signal).
bool isConstant(ValueType const &)
bool isInfinity(ValueType const &a)
TargetType convertNumber(SourceType const &number)
constexpr bool IsIntervalType
Helper to check if a type is an interval.
typename detail::IntervalMetaProgrammingHelper< ValueType >::BaseType IntervalBaseType
Helper to access the type in which interval boundaries are stored.
#define STORM_PRINT_AND_LOG(message)
#define STORM_PRINT(message)
Define the macros that print information to stdout and optionally also log it.
static const bool IsExact
void operator()(std::unique_ptr< storm::modelchecker::CheckResult > const &)
bool useDynamicConstraints
bool useDecomposition
A flag indicating whether decomposition is to be used during the abstraction.
bool relativeTerminationCriterion
A flag indicating whether to use a relative termination criterion.
SolveMode solveMode
The mode with which to solve the abstractions.
bool restrictToValidBlocks
A flag indicating whether the abstractor restricts the initial states to valid blocks.
bool useInterpolation
A flag indicating whether interpolation is to be used to eliminate spurious pivot blocks.
ReuseMode reuseMode
The mode determining which results are reused.
bool fixPlayer1Strategy
A flag indicating whether player 1 strategies are to be fixed.
bool debug
A flag indicating whether debug mode is enabled.
std::vector< std::vector< storm::expressions::Expression > > injectedRefinementPredicates
Predicates that are injected (starting with the last one in this list) instead of the derived ones.
bool fixPlayer2Strategy
A flag indicating whether player 2 strategies are to be fixed.
bool addAllInitialExpressions
A flag indicating whether all initial expressions are added as initial predicates.
bool useEagerRefinement
A flag indicating whether to refine eagerly.
SplitMode splitMode
The mode that determines which predicates are split into atoms for the refinement.
bool rankRefinementPredicates
A flag indicating whether refinement predicates are to be ranked.
std::vector< storm::expressions::Expression > constraints
Additional constraints used by the abstraction.
bool addAllGuards
A flag indicating whether all guards are added as initial predicates.
bool restrictToRelevantStates
A flag indicating whether the abstractor restricts the abstraction to relevant states.
uint_fast64_t maximalNumberOfAbstractions
The maximal number of abstractions to perform until giving up on converging.
double precision
The precision used for detecting convergence.
PivotSelectionHeuristic pivotSelectionHeuristic
The heuristic to use for pivot block selection.