24 if (input.
model && input.
model.get().isJaniModel()) {
26 if (ioSettings.isExportJaniDotSet()) {
40 STORM_PRINT(
"Time for computation: " << *watch <<
".\n");
47template<
typename ModelType>
48 requires(!std::derived_from<ModelType, storm::models::sparse::Model<double>>)
50 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Counterexample generation is not supported for this data-type.");
53template<
typename ModelType>
54 requires(std::derived_from<ModelType, storm::models::sparse::Model<double>>)
56 using ValueType =
typename ModelType::ValueType;
58 for (
auto& rewModel : sparseModel->getRewardModels()) {
59 rewModel.second.reduceToStateBasedRewards(sparseModel->getTransitionMatrix(),
true);
63 storm::exceptions::NotSupportedException,
"Counterexample is currently only supported for discrete-time models.");
66 if (counterexampleSettings.isMinimalCommandSetGenerationSet()) {
67 bool useMilp = counterexampleSettings.isUseMilpBasedMinimalCommandSetGenerationSet();
68 for (
auto const& property : input.
properties) {
69 std::shared_ptr<storm::counterexamples::Counterexample> counterexample;
74 "Counterexample generation using MILP is currently only supported for MDPs.");
79 storm::exceptions::NotSupportedException,
80 "Counterexample generation using MaxSAT is currently only supported for discrete-time models.");
93 }
else if (counterexampleSettings.isShortestPathGenerationSet()) {
94 for (
auto const& property : input.
properties) {
95 std::shared_ptr<storm::counterexamples::Counterexample> counterexample;
99 "Counterexample generation using shortest paths is currently only supported for DTMCs.");
101 property.getRawFormula(), counterexampleSettings.getShortestPathMaxK());
106 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"The selected counterexample formalism is unsupported.");
110template<
typename ValueType>
113 if (result->isQuantitative()) {
117 ValueType resultValue;
120 resultValue = result->asQuantitativeCheckResult<ValueType>().sum();
123 resultValue = result->asQuantitativeCheckResult<ValueType>().average();
126 resultValue = result->asQuantitativeCheckResult<ValueType>().getMin();
129 resultValue = result->asQuantitativeCheckResult<ValueType>().getMax();
133 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.");
139 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Unhandled filter type.");
153 STORM_PRINT(result->asQualitativeCheckResult().existsTrue());
156 STORM_PRINT(result->asQualitativeCheckResult().forallTrue());
159 STORM_PRINT(result->asQualitativeCheckResult().count());
163 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Outputting states is not supported.");
168 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Filter type only defined for quantitative results.");
174template<
typename ValueType>
179 std::stringstream ss;
180 ss <<
"'" << filterStatesFormula <<
"'";
182 <<
" (for " << (filterStatesFormula.isInitialFormula() ?
"initial" : ss.str()) <<
" states): ");
185 STORM_PRINT(
"Time for model checking: " << *watch <<
".\n");
188 STORM_LOG_ERROR(
"Property is unsupported by selected engine/settings.\n");
192template<
typename ValueType>
198using VerificationCallbackType = std::function<std::unique_ptr<storm::modelchecker::CheckResult>(std::shared_ptr<storm::logic::Formula const>
const& formula,
199 std::shared_ptr<storm::logic::Formula const>
const& states)>;
203 void operator()(std::unique_ptr<storm::modelchecker::CheckResult>
const&) {
214template<
typename ValueType>
215std::unique_ptr<storm::modelchecker::CheckResult>
verifyProperty(std::shared_ptr<storm::logic::Formula const>
const& formula,
216 std::shared_ptr<storm::logic::Formula const>
const& statesFilter,
222 STORM_LOG_ASSERT(!transformationSettings.isChainEliminationSet() && !transformationSettings.isToNondeterministicModelSet(),
223 "Unsupported transformation has been invoked.");
224 return verificationCallback(formula, statesFilter);
227 STORM_LOG_WARN(
"Property is not preserved by elimination of non-markovian states.");
228 }
else if (transformationSettings.isToDiscreteTimeModelSet()) {
231 if (transformedFormula && transformedStatesFilter) {
233 return verificationCallback(transformedFormula, transformedStatesFilter);
235 STORM_LOG_WARN(
"Property is not preserved by transformation to discrete time model.");
239 return verificationCallback(formula, statesFilter);
253template<
typename ValueType>
257 for (
auto const& property : properties) {
260 auto result =
verifyProperty<ValueType>(property.getRawFormula(), property.getFilter().getStatesFormula(), verificationCallback);
263 postprocessingCallback(result);
278template<
typename ValueType>
279void computeStateValues(std::string
const& description, std::function<std::unique_ptr<storm::modelchecker::CheckResult>()>
const& computationCallback,
284 STORM_PRINT(
"\nComputing " << description <<
" ...\n");
285 std::unique_ptr<storm::modelchecker::CheckResult> result;
287 result = computationCallback();
298 postprocessingCallback(result);
303 for (uint64_t propertyIndex = 0; propertyIndex < properties.size(); ++propertyIndex) {
304 auto const&
property = properties[propertyIndex];
306 if (!property.getRawFormula()->hasQualitativeResult()) {
308 <<
"' can not be used for filtering states as it does not have a qualitative result.");
315 if (propertyFilter) {
317 std::unique_ptr<storm::modelchecker::CheckResult> filteredResult = result->clone();
318 filteredResult->filter(propertyFilter->asQualitativeCheckResult());
319 postprocessingCallback(filteredResult);
321 propertyIndex == properties.size() - 1 ? &watch :
nullptr);
328 std::string
const& constraintsString) {
329 std::vector<storm::expressions::Expression> constraints;
331 std::vector<std::string> constraintsAsStrings;
332 boost::split(constraintsAsStrings, constraintsString, boost::is_any_of(
","));
335 std::unordered_map<std::string, storm::expressions::Expression> variableMapping;
336 for (
auto const& variableTypePair : expressionManager) {
337 variableMapping[variableTypePair.first.getName()] = variableTypePair.first;
341 for (
auto const& constraintString : constraintsAsStrings) {
342 if (constraintString.empty()) {
347 STORM_LOG_TRACE(
"Adding special (user-provided) constraint " << constraint <<
".");
348 constraints.emplace_back(constraint);
356 std::vector<std::vector<storm::expressions::Expression>> injectedRefinementPredicates;
359 std::unordered_map<std::string, storm::expressions::Expression> variableMapping;
360 for (
auto const& variableTypePair : expressionManager) {
361 variableMapping[variableTypePair.first.getName()] = variableTypePair.first;
365 std::vector<std::string> predicateGroupsAsStrings;
366 boost::split(predicateGroupsAsStrings, refinementPredicatesString, boost::is_any_of(
";"));
368 if (!predicateGroupsAsStrings.empty()) {
369 for (
auto const& predicateGroupString : predicateGroupsAsStrings) {
370 if (predicateGroupString.empty()) {
374 std::vector<std::string> predicatesAsStrings;
375 boost::split(predicatesAsStrings, predicateGroupString, boost::is_any_of(
":"));
377 if (!predicatesAsStrings.empty()) {
378 injectedRefinementPredicates.emplace_back();
379 for (
auto const& predicateString : predicatesAsStrings) {
381 STORM_LOG_TRACE(
"Adding special (user-provided) refinement predicate " << predicateString <<
".");
382 injectedRefinementPredicates.back().emplace_back(predicate);
385 STORM_LOG_THROW(!injectedRefinementPredicates.back().empty(), storm::exceptions::InvalidArgumentException,
386 "Expecting non-empty list of predicates to inject for each (mentioned) refinement step.");
389 std::reverse(injectedRefinementPredicates.back().begin(), injectedRefinementPredicates.back().end());
394 std::reverse(injectedRefinementPredicates.begin(), injectedRefinementPredicates.end());
397 return injectedRefinementPredicates;
400template<storm::dd::DdType DdType,
typename ValueType>
409 std::shared_ptr<storm::logic::Formula const>
const& states) {
410 STORM_LOG_THROW(states->isInitialFormula(), storm::exceptions::NotSupportedException,
"Abstraction-refinement can only filter initial states.");
416template<
typename ValueType>
419 STORM_LOG_THROW((std::is_same<ValueType, double>::value), storm::exceptions::NotSupportedException,
420 "Exploration does not support other data-types than floating points.");
422 input, [&input, &mpi](std::shared_ptr<storm::logic::Formula const>
const& formula, std::shared_ptr<storm::logic::Formula const>
const& states) {
423 STORM_LOG_THROW(states->isInitialFormula(), storm::exceptions::NotSupportedException,
"Exploration can only filter initial states.");
428template<
typename ValueType>
432 auto verificationCallback = [&sparseModel, &ioSettings, &mpi](std::shared_ptr<storm::logic::Formula const>
const& formula,
433 std::shared_ptr<storm::logic::Formula const>
const& states) {
434 auto createTask = [&ioSettings](
auto const& f,
bool onlyInitialStates) {
436 STORM_LOG_THROW(ioSettings.isUncertaintyResolutionModeSet(), storm::exceptions::InvalidSettingsException,
437 "Uncertainty resolution mode required for uncertain (interval) models.");
444 bool const filterForInitialStates = states->isInitialFormula();
445 auto task = createTask(formula, filterForInitialStates);
446 if (ioSettings.isExportSchedulerSet()) {
447 task.setProduceSchedulers(
true);
451 std::unique_ptr<storm::modelchecker::CheckResult> filter;
452 if (filterForInitialStates) {
454 filter = std::make_unique<storm::modelchecker::ExplicitQualitativeCheckResult<SolutionType>>(sparseModel->getInitialStates());
455 }
else if (!states->isTrueFormula()) {
458 if (result && filter) {
459 result->filter(filter->asQualitativeCheckResult());
463 uint64_t exportCount = 0;
464 auto postprocessingCallback = [&sparseModel, &ioSettings, &input, &exportCount](std::unique_ptr<storm::modelchecker::CheckResult>
const& result) {
466 STORM_LOG_WARN_COND(!ioSettings.isExportSchedulerSet() || result->hasScheduler(),
"Scheduler requested but could not be generated.");
467 if (ioSettings.isExportSchedulerSet() && result->hasScheduler()) {
468 std::filesystem::path schedulerExportPath = ioSettings.getExportSchedulerFilename();
469 if (exportCount > 0) {
470 STORM_LOG_WARN(
"Prepending " << exportCount <<
" to scheduler file name for this property because there are multiple properties.");
471 schedulerExportPath.replace_filename(std::to_string(exportCount) + schedulerExportPath.filename().string());
476 "No information of state valuations available. The scheduler output will use internal state ids. You might be "
477 "interested in building the model with state valuations using --buildstateval.");
479 sparseModel->hasChoiceLabeling() || sparseModel->hasChoiceOrigins(),
480 "No symbolic choice information is available. The scheduler output will use internal choice ids. You might be interested in "
481 "building the model with choice labels or choice origins using --buildchoicelab or --buildchoiceorig.");
483 "Only partial choice information is available. You might want to build the model with choice origins using "
484 "--buildchoicelab or --buildchoiceorig.");
486 if (result->isExplicitQuantitativeCheckResult()) {
488 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Scheduler export for interval models is not supported.");
491 schedulerExportPath.string());
493 }
else if (result->isExplicitParetoCurveCheckResult()) {
495 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Scheduler export for models of this value type is not supported.");
497 auto const& paretoRes = result->template asExplicitParetoCurveCheckResult<ValueType>();
500 }
else if (result->isExplicitQualitativeCheckResult()) {
502 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Scheduler export for interval models is not supported.");
505 schedulerExportPath.string());
508 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Scheduler export not supported for this value type.");
513 if (ioSettings.isExportCheckResultSet()) {
515 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Result export for interval models is not supported.");
517 std::filesystem::path resultExportPath = ioSettings.getExportCheckResultFilename();
518 if (exportCount > 0) {
519 STORM_LOG_WARN(
"Prepending " << exportCount <<
" to result file name for this property because there are multiple properties.");
520 resultExportPath.replace_filename(std::to_string(exportCount) + resultExportPath.filename().string());
523 "No information of state valuations available. The result output will use internal state ids. You might be interested in "
524 "building the model with state valuations using --buildstateval.");
530 if (!(ioSettings.isComputeSteadyStateDistributionSet() || ioSettings.isComputeExpectedVisitingTimesSet())) {
533 if (ioSettings.isComputeSteadyStateDistributionSet()) {
535 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Computing steady state distribution is not supported for interval models.");
538 "steady-state probabilities",
540 verificationCallback, postprocessingCallback);
543 if (ioSettings.isComputeExpectedVisitingTimesSet()) {
545 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Computing expected visiting times is not supported for interval models.");
548 "expected visiting times",
550 verificationCallback, postprocessingCallback);
555template<storm::dd::DdType DdType,
typename ValueType>
559 input, [&symbolicModel, &mpi](std::shared_ptr<storm::logic::Formula const>
const& formula, std::shared_ptr<storm::logic::Formula const>
const& states) {
560 bool filterForInitialStates = states->isInitialFormula();
565 std::unique_ptr<storm::modelchecker::CheckResult> filter;
566 if (filterForInitialStates) {
567 filter = std::make_unique<storm::modelchecker::SymbolicQualitativeCheckResult<DdType>>(symbolicModel->getReachableStates(),
568 symbolicModel->getInitialStates());
569 }
else if (!states->isTrueFormula()) {
572 if (result && filter) {
573 result->filter(filter->asQualitativeCheckResult());
579template<storm::dd::DdType DdType,
typename ValueType>
583 input, [&symbolicModel, &mpi](std::shared_ptr<storm::logic::Formula const>
const& formula, std::shared_ptr<storm::logic::Formula const>
const& states) {
584 bool filterForInitialStates = states->isInitialFormula();
587 std::unique_ptr<storm::modelchecker::CheckResult> result =
590 std::unique_ptr<storm::modelchecker::CheckResult> filter;
591 if (filterForInitialStates) {
592 filter = std::make_unique<storm::modelchecker::SymbolicQualitativeCheckResult<DdType>>(symbolicModel->getReachableStates(),
593 symbolicModel->getInitialStates());
594 }
else if (!states->isTrueFormula()) {
597 if (result && filter) {
598 result->filter(filter->asQualitativeCheckResult());
604template<storm::dd::DdType DdType,
typename ValueType>
608 input, [&symbolicModel, &mpi](std::shared_ptr<storm::logic::Formula const>
const& formula, std::shared_ptr<storm::logic::Formula const>
const& states) {
609 STORM_LOG_THROW(states->isInitialFormula(), storm::exceptions::NotSupportedException,
"Abstraction-refinement can only filter initial states.");
615template<storm::dd::DdType DdType,
typename ValueType>
616typename std::enable_if<DdType != storm::dd::DdType::CUDD || std::is_same<ValueType, double>::value,
void>::type
verifyModel(
628template<storm::dd::DdType DdType,
typename ValueType>
629typename std::enable_if<DdType == storm::dd::DdType::CUDD && !std::is_same<ValueType, double>::value,
void>::type
verifySymbolicModel(
631 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"CUDD does not support the selected data-type.");
642 [&input, &mpi]<
storm::dd::DdType DD,
typename VT>() { verifyWithAbstractionRefinementEngine<DD, VT>(input, mpi); });
648 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.
std::string getInjectedRefinementPredicates() const
Retrieves a string containing refinement predicates to inject (if there are any).
std::string getConstraintString() const
Retrieves the string that specifies additional constraints.
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 > computeHighLevelCounterexampleMilp(storm::storage::SymbolicModelDescription const &symbolicModel, std::shared_ptr< storm::models::sparse::Mdp< double > > mdp, std::shared_ptr< storm::logic::Formula const > const &formula)
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")
std::shared_ptr< storm::counterexamples::Counterexample > computeHighLevelCounterexampleMaxSmt(storm::storage::SymbolicModelDescription const &symbolicModel, std::shared_ptr< storm::models::sparse::Model< double > > model, std::shared_ptr< storm::logic::Formula const > const &formula)
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)
std::unique_ptr< storm::modelchecker::CheckResult > computeSteadyStateDistributionWithSparseEngine(storm::Environment const &env, std::shared_ptr< storm::models::sparse::Dtmc< ValueType > > const &dtmc)
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 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)
void processInput(SymbolicInput const &input, ModelProcessingInformation const &mpi)
void generateCounterexamples(std::shared_ptr< ModelType > const &, SymbolicInput const &)
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())
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 &)
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 &)