53 boost::optional<storm::storage::SymbolicModelDescription>
model;
70 boost::optional<std::vector<std::string>> propertyFilter;
75 propertyFilter = boost::none;
78 propertyFilter = std::vector<std::string>();
81 input.
model = std::move(janiInput.first);
83 input.
properties = std::move(janiInput.second);
86 modelParsingWatch.
stop();
87 STORM_PRINT(
"Time for model input parsing: " << modelParsingWatch <<
".\n\n");
92 boost::optional<std::set<std::string>>
const& propertyFilter) {
94 std::vector<storm::jani::Property> newProperties;
112 input.
model = std::move(janiInput.first);
113 input.
properties = std::move(janiInput.second);
114 modelParsingWatch.
stop();
115 STORM_PRINT(
"Time for model input parsing: " << modelParsingWatch <<
".\n\n");
123 input.
model = input.
model.get().preprocess(constantDefinitions);
133 if (ioSettings.isQvbsInputSet()) {
175 STORM_LOG_THROW(input.
model.is_initialized(), storm::exceptions::InvalidArgumentException,
"Automatic engine requires a JANI input model.");
176 STORM_LOG_THROW(input.
model->isJaniModel(), storm::exceptions::InvalidArgumentException,
"Automatic engine requires a JANI input model.");
177 std::vector<storm::jani::Property>
const& properties =
179 STORM_LOG_THROW(!properties.empty(), storm::exceptions::InvalidArgumentException,
"Automatic engine requires a property.");
181 "Automatic engine does not support decisions based on multiple properties. Only the first property will be considered.");
184 if (hints.isNumberStatesSet()) {
185 as.
predict(input.
model->asJaniModel(), properties.front(), hints.getNumberStates());
187 as.
predict(input.
model->asJaniModel(), properties.front());
208 std::shared_ptr<SymbolicInput>
const& transformedJaniInput =
nullptr) {
216 mpi.
engine = coreSettings.getEngine();
222 if (generalSettings.isParametricSet()) {
224 }
else if (generalSettings.isExactSet()) {
234 if (input.
model->isJaniModel()) {
245 janiInput.
model = modelAndProperties.first;
246 if (!modelAndProperties.second.empty()) {
252 if (transformedJaniInput) {
254 *transformedJaniInput = std::move(janiInput);
261 auto checkCompatibleSettings = [&mpi, &input] {
280 STORM_LOG_WARN(
"The settings picked by the automatic engine (engine="
282 <<
") are incompatible with this model. Falling back to default settings.");
302 "Dd-based model builder for Markov Automata is only available for JANI models, automatically converting the input model.");
308 if (bisimulationSettings.useExactArithmeticInDdBisimulation()) {
314 STORM_LOG_WARN(
"Requested using exact arithmetic in Dd bisimulation but no dd bisimulation is applied.");
319 mpi.
ddType = coreSettings.getDdLibraryType();
323 STORM_LOG_INFO(
"Switching to DD library sylvan to allow for rational arithmetic.");
330auto castAndApply(std::shared_ptr<storm::models::ModelBase>
const& model,
auto const& callback) {
334 auto castAndApplyImpl = [&model, &callback]<
typename TargetModelType> {
335 auto res = model->template as<TargetModelType>();
337 return callback(res);
341 auto castAndApplyVT = [&]<
typename ValueType> {
342 if (model->isSparseModel()) {
345 auto ddType = model->getDdType();
346 STORM_LOG_ASSERT(model->isSymbolicModel() && ddType.has_value(),
"Unexpected model representation");
349 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Symbolic interval models are currently not supported.");
352 if (*ddType == CUDD) {
353 if constexpr (std::is_same_v<ValueType, double>) {
364 if (model->supportsParameters()) {
366 }
else if (model->supportsUncertainty()) {
367 if (model->isExact()) {
373 if (model->isExact()) {
374 return castAndApplyVT.template operator()<storm::RationalNumber>();
376 return castAndApplyVT.template operator()<
double>();
384 case FinitePrecision:
385 return callback.template operator()<
double>();
387 return callback.template operator()<storm::RationalNumber>();
391 STORM_LOG_THROW(
false, storm::exceptions::UnexpectedException,
"Unexpected value type.");
399 STORM_LOG_THROW(vt == FinitePrecision, storm::exceptions::UnexpectedException,
"Unexpected value type for DD library Cudd.");
400 return callback.template operator()<CUDD,
double>();
403 case FinitePrecision:
404 return callback.template operator()<
Sylvan,
double>();
406 return callback.template operator()<
Sylvan, storm::RationalNumber>();
411 STORM_LOG_THROW(
false, storm::exceptions::UnexpectedException,
"Unexpected DDType or value type.");
416 for (
auto const& property : properties) {
417 std::set<storm::expressions::Variable> usedUndefinedConstants =
property.getUndefinedConstants();
418 if (!usedUndefinedConstants.empty()) {
419 std::vector<std::string> undefinedConstantsNames;
420 for (
auto const& constant : usedUndefinedConstants) {
421 undefinedConstantsNames.emplace_back(constant.getName());
424 false, storm::exceptions::InvalidArgumentException,
425 "The property '" << property <<
" still refers to the undefined constants " << boost::algorithm::join(undefinedConstantsNames,
",") <<
".");
436 if (ioSettings.isPropertiesAsMultiSet()) {
438 "Can not translate properties to multi-objective formula because no properties were specified.");
445 std::string constantDefinitionString = ioSettings.getConstantDefinitionString();
446 std::map<storm::expressions::Variable, storm::expressions::Expression> constantDefinitions;
448 constantDefinitions = output.
model.get().parseConstantDefinitions(constantDefinitionString);
449 output.
model = output.
model.get().preprocess(constantDefinitions);
455 auto transformedJani = std::make_shared<SymbolicInput>();
459 if (output.
model && output.
model.get().isPrismProgram()) {
461 if (transformedJani->model) {
463 output = std::move(*transformedJani);
468 output.
model = modelAndProperties.first;
470 if (!modelAndProperties.second.empty()) {
477 if (output.
model && output.
model.get().isJaniModel()) {
482 if (buildSettings.isLocationEliminationSet()) {
483 auto locationHeuristic = buildSettings.getLocationEliminationLocationHeuristic();
484 auto edgesHeuristic = buildSettings.getLocationEliminationEdgesHeuristic();
486 locationHeuristic, edgesHeuristic));
490 return {output, mpi};
495 if (input.
model && input.
model.get().isJaniModel()) {
497 if (ioSettings.isExportJaniDotSet()) {
503inline std::vector<std::shared_ptr<storm::logic::Formula const>>
createFormulasToRespect(std::vector<storm::jani::Property>
const& properties) {
506 for (
auto const& property : properties) {
507 if (!property.getFilter().getStatesFormula()->isInitialFormula()) {
508 result.push_back(property.getFilter().getStatesFormula());
515template<storm::dd::DdType DdType,
typename ValueType>
523 !buildSettings.isApplyNoMaximumProgressAssumptionSet());
536 if (counterexampleGeneratorSettings.isCounterexampleSet()) {
537 buildChoiceOrigins |= counterexampleGeneratorSettings.isMinimalCommandSetGenerationSet();
542 if (buildSettings.isApplyNoMaximumProgressAssumptionSet()) {
546 if (buildSettings.isExplorationChecksSet()) {
552 if (buildSettings.isBuildFullModelSet()) {
559 if (buildSettings.isAddOverlappingGuardsLabelSet()) {
564 if (ioSettings.isComputeExpectedVisitingTimesSet() || ioSettings.isComputeSteadyStateDistributionSet()) {
570template<
typename ValueType>
574 input.
model->asPrismProgram().hasIntervalUpdates()) {
576 bool constexpr IsDoubleInterval = std::is_same_v<ValueType, storm::IntervalBaseType<storm::Interval>>;
577 bool constexpr IsRationalInterval = std::is_same_v<ValueType, storm::IntervalBaseType<storm::RationalInterval>>;
578 STORM_LOG_THROW(IsDoubleInterval || IsRationalInterval, storm::exceptions::NotSupportedException,
579 "Can not build interval model for the provided value type.");
580 using IntervalType = std::conditional_t<IsDoubleInterval, storm::Interval, storm::RationalInterval>;
587template<
typename ValueType>
590 std::shared_ptr<storm::models::ModelBase> result;
602 if constexpr (std::is_same_v<ValueType, double>) {
604 }
else if constexpr (std::is_same_v<ValueType, storm::RationalNumber>) {
605 valueType = Rational;
607 static_assert(std::is_same_v<ValueType, storm::RationalFunction>,
"Unexpected value type.");
608 valueType = Parametric;
615 if constexpr (std::is_same_v<ValueType, storm::RationalFunction>) {
616 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"RationalFunction currently not supported for UMB models.");
617 }
else if constexpr (std::is_same_v<ValueType, storm::RationalNumber>) {
620 static_assert(std::is_same_v<ValueType, double>,
"Unhandled value type.");
635 std::shared_ptr<storm::models::ModelBase> result;
642 auto options = createBuildOptionsSparseFromSettings(input);
643 return buildModelSparse<VT>(input, options);
648 "Can only use sparse engine with explicit input.");
650 return buildModelExplicit<VT>(ioSettings, storm::settings::getModule<storm::settings::modules::BuildSettings>());
654 modelBuildingWatch.
stop();
656 STORM_PRINT(
"Time for model construction: " << modelBuildingWatch <<
".\n\n");
662template<
typename ValueType>
668 std::shared_ptr<storm::models::sparse::Model<ValueType>> result = model;
671 "MA contains a Zeno cycle. Model checking results cannot be trusted.");
673 if (model->isConvertibleToCtmc()) {
675 result = model->convertToCtmc();
678 if (transformationSettings.isChainEliminationSet()) {
681 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Chain elimination not supported for interval models.");
685 transformationSettings.getLabelBehavior())
693template<
typename ValueType>
706template<
typename ValueType>
710 "Converting value types for sparse engine is not supported.");
715 std::pair<std::shared_ptr<storm::models::sparse::Model<ValueType>>,
bool> result = std::make_pair(model,
false);
717 if (
auto order = transformationSettings.getModelPermutation(); order.has_value()) {
718 auto seed = transformationSettings.getModelPermutationSeed();
720 << (seed.has_value() ?
" with seed " + std::to_string(seed.value()) :
"") <<
".\n");
722 result.second =
true;
723 STORM_PRINT_AND_LOG(
"Transition matrix hash after permuting: " << result.first->getTransitionMatrix().hash() <<
".\n");
728 result.second =
true;
733 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Bisimulation not supported for interval models.");
736 result.second =
true;
740 if (transformationSettings.isToDiscreteTimeModelSet()) {
742 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Transformation to discrete time model not supported for interval models.");
746 !model->hasRewardModel(
"_time"),
747 "Scheduled transformation to discrete time model, but a reward model named '_time' is already present in this model. We might take "
748 "the wrong reward model later.");
752 result.second =
true;
756 if (transformationSettings.isToNondeterministicModelSet()) {
758 result.second =
true;
764template<
typename ValueType>
768 if (ioSettings.isExportBuildSet()) {
770 modelExportWatch.
start();
771 STORM_PRINT(
"\nExporting model to '" << ioSettings.getExportBuildFilename() <<
"'.\n");
772 switch (ioSettings.getExportBuildFormat()) {
779 options.
compression = ioSettings.getCompressionMode();
780 if (ioSettings.isExportDigitsSet()) {
784 input.
model ? input.
model.get().getParameterNames() : std::vector<std::string>());
792 options.
compression = ioSettings.getCompressionMode();
798 "Exporting sparse models in " <<
storm::io::toString(ioSettings.getExportBuildFormat()) <<
" format is not supported.");
800 modelExportWatch.
stop();
801 STORM_PRINT(
"Time for model export: " << modelExportWatch <<
".\n\n");
806 if (ioSettings.isExportExplicitSet()) {
808 input.
model ? input.
model.get().getParameterNames() : std::vector<std::string>(),
809 !ioSettings.isExplicitExportPlaceholdersDisabled());
812 if (ioSettings.isExportDdSet()) {
813 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Exporting in drdd format is only supported for DDs.");
816 if (ioSettings.isExportDotSet()) {
821template<storm::dd::DdType DdType,
typename ValueType>
825 if (ioSettings.isExportBuildSet()) {
826 switch (ioSettings.getExportBuildFormat()) {
835 "Exporting symbolic models in " <<
storm::io::toString(ioSettings.getExportBuildFormat()) <<
" format is not supported.");
841 if (ioSettings.isExportExplicitSet()) {
842 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Exporting in drn format is only supported for sparse models.");
845 if (ioSettings.isExportDdSet()) {
849 if (ioSettings.isExportDotSet()) {
854template<storm::dd::DdType DdType,
typename ValueType>
855typename std::enable_if<DdType != storm::dd::DdType::Sylvan && !std::is_same<ValueType, double>::value, std::shared_ptr<storm::models::Model<ValueType>>>::type
860template<storm::dd::DdType DdType,
typename ValueType>
861typename std::enable_if<DdType == storm::dd::DdType::Sylvan || std::is_same<ValueType, double>::value, std::shared_ptr<storm::models::Model<ValueType>>>::type
863 auto ma = model->template as<storm::models::symbolic::MarkovAutomaton<DdType, ValueType>>();
864 if (!ma->isClosed()) {
865 return std::make_shared<storm::models::symbolic::MarkovAutomaton<DdType, ValueType>>(ma->close());
871template<storm::dd::DdType DdType,
typename ValueType,
typename ExportValueType = ValueType>
876 "Weak bisimulation is currently not supported on DDs. Falling back to strong bisimulation.");
881 STORM_LOG_INFO(
"Setting bisimulation quotient format to 'sparse'.");
889template<
typename ExportValueType, storm::dd::DdType DdType,
typename ValueType>
893 std::pair<std::shared_ptr<storm::models::Model<ValueType>>,
bool> intermediateResult = std::make_pair(model,
false);
897 intermediateResult.second =
true;
900 std::unique_ptr<std::pair<std::shared_ptr<storm::models::Model<ExportValueType>>,
bool>> result;
901 auto symbolicModel = intermediateResult.first->template as<storm::models::symbolic::Model<DdType, ValueType>>();
903 std::shared_ptr<storm::models::Model<ExportValueType>> newModel =
905 result = std::make_unique<std::pair<std::shared_ptr<storm::models::Model<ExportValueType>>,
bool>>(newModel,
true);
907 result = std::make_unique<std::pair<std::shared_ptr<storm::models::Model<ExportValueType>>,
bool>>(
908 symbolicModel->template toValueType<ExportValueType>(), !std::is_same<ValueType, ExportValueType>::value);
913 result->second =
true;
915 std::shared_ptr<storm::models::symbolic::Model<DdType, ExportValueType>> symbolicModel =
916 result->first->template as<storm::models::symbolic::Model<DdType, ExportValueType>>();
917 std::vector<std::shared_ptr<storm::logic::Formula const>> formulas;
918 for (
auto const& property : input.
properties) {
919 formulas.emplace_back(property.getRawFormula());
922 STORM_LOG_THROW(result, storm::exceptions::NotSupportedException,
"The translation to a sparse model is not supported for the given model type.");
928template<storm::dd::DdType DdType,
typename ValueType>
933 if constexpr (std::is_same_v<ValueType, VT> ||
934 (DdType == storm::dd::DdType::Sylvan && std::is_same_v<ValueType, storm::RationalNumber> && std::is_same_v<VT, double>)) {
935 return preprocessDdModelImpl<VT>(model, input, mpi);
937 STORM_LOG_THROW(false, storm::exceptions::NotSupportedException,
938 "Unexpected combination of DD library, build value type, and verification value type.");
948 if (counterexample) {
951 STORM_PRINT(
"Time for computation: " << *watch <<
".\n");
958template<
typename ModelType>
959 requires(!std::derived_from<ModelType, storm::models::sparse::Model<double>>)
961 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Counterexample generation is not supported for this data-type.");
964template<
typename ModelType>
965 requires(std::derived_from<ModelType, storm::models::sparse::Model<double>>)
967 using ValueType =
typename ModelType::ValueType;
969 for (
auto& rewModel : sparseModel->getRewardModels()) {
970 rewModel.second.reduceToStateBasedRewards(sparseModel->getTransitionMatrix(),
true);
974 storm::exceptions::NotSupportedException,
"Counterexample is currently only supported for discrete-time models.");
977 if (counterexampleSettings.isMinimalCommandSetGenerationSet()) {
978 bool useMilp = counterexampleSettings.isUseMilpBasedMinimalCommandSetGenerationSet();
979 for (
auto const& property : input.
properties) {
980 std::shared_ptr<storm::counterexamples::Counterexample> counterexample;
985 "Counterexample generation using MILP is currently only supported for MDPs.");
990 storm::exceptions::NotSupportedException,
991 "Counterexample generation using MaxSAT is currently only supported for discrete-time models.");
1004 }
else if (counterexampleSettings.isShortestPathGenerationSet()) {
1005 for (
auto const& property : input.
properties) {
1006 std::shared_ptr<storm::counterexamples::Counterexample> counterexample;
1010 "Counterexample generation using shortest paths is currently only supported for DTMCs.");
1012 property.getRawFormula(), counterexampleSettings.getShortestPathMaxK());
1017 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"The selected counterexample formalism is unsupported.");
1021template<
typename ValueType>
1024 if (result->isQuantitative()) {
1028 ValueType resultValue;
1031 resultValue = result->asQuantitativeCheckResult<ValueType>().sum();
1034 resultValue = result->asQuantitativeCheckResult<ValueType>().average();
1037 resultValue = result->asQuantitativeCheckResult<ValueType>().getMin();
1040 resultValue = result->asQuantitativeCheckResult<ValueType>().getMax();
1044 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Outputting states is not supported.");
1048 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Filter type only defined for qualitative results.");
1050 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Unhandled filter type.");
1064 STORM_PRINT(result->asQualitativeCheckResult().existsTrue());
1067 STORM_PRINT(result->asQualitativeCheckResult().forallTrue());
1070 STORM_PRINT(result->asQualitativeCheckResult().count());
1074 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Outputting states is not supported.");
1079 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Filter type only defined for quantitative results.");
1089template<
typename ValueType>
1094 std::stringstream ss;
1095 ss <<
"'" << filterStatesFormula <<
"'";
1097 <<
" (for " << (filterStatesFormula.isInitialFormula() ?
"initial" : ss.str()) <<
" states): ");
1100 STORM_PRINT(
"Time for model checking: " << *watch <<
".\n");
1103 STORM_LOG_ERROR(
"Property is unsupported by selected engine/settings.\n");
1107template<
typename ValueType>
1113using VerificationCallbackType = std::function<std::unique_ptr<storm::modelchecker::CheckResult>(std::shared_ptr<storm::logic::Formula const>
const& formula,
1114 std::shared_ptr<storm::logic::Formula const>
const& states)>;
1118 void operator()(std::unique_ptr<storm::modelchecker::CheckResult>
const&) {
1129template<
typename ValueType>
1130std::unique_ptr<storm::modelchecker::CheckResult>
verifyProperty(std::shared_ptr<storm::logic::Formula const>
const& formula,
1131 std::shared_ptr<storm::logic::Formula const>
const& statesFilter,
1137 STORM_LOG_ASSERT(!transformationSettings.isChainEliminationSet() && !transformationSettings.isToNondeterministicModelSet(),
1138 "Unsupported transformation has been invoked.");
1139 return verificationCallback(formula, statesFilter);
1142 STORM_LOG_WARN(
"Property is not preserved by elimination of non-markovian states.");
1143 }
else if (transformationSettings.isToDiscreteTimeModelSet()) {
1146 if (transformedFormula && transformedStatesFilter) {
1148 return verificationCallback(transformedFormula, transformedStatesFilter);
1150 STORM_LOG_WARN(
"Property is not preserved by transformation to discrete time model.");
1154 return verificationCallback(formula, statesFilter);
1168template<
typename ValueType>
1172 for (
auto const& property : properties) {
1175 auto result =
verifyProperty<ValueType>(property.getRawFormula(), property.getFilter().getStatesFormula(), verificationCallback);
1178 postprocessingCallback(result);
1193template<
typename ValueType>
1194void computeStateValues(std::string
const& description, std::function<std::unique_ptr<storm::modelchecker::CheckResult>()>
const& computationCallback,
1199 STORM_PRINT(
"\nComputing " << description <<
" ...\n");
1200 std::unique_ptr<storm::modelchecker::CheckResult> result;
1202 result = computationCallback();
1213 postprocessingCallback(result);
1218 for (uint64_t propertyIndex = 0; propertyIndex < properties.size(); ++propertyIndex) {
1219 auto const&
property = properties[propertyIndex];
1221 if (!property.getRawFormula()->hasQualitativeResult()) {
1223 <<
"' can not be used for filtering states as it does not have a qualitative result.");
1230 if (propertyFilter) {
1232 std::unique_ptr<storm::modelchecker::CheckResult> filteredResult = result->clone();
1233 filteredResult->filter(propertyFilter->asQualitativeCheckResult());
1234 postprocessingCallback(filteredResult);
1236 propertyIndex == properties.size() - 1 ? &watch :
nullptr);
1243 std::string
const& constraintsString) {
1244 std::vector<storm::expressions::Expression> constraints;
1246 std::vector<std::string> constraintsAsStrings;
1247 boost::split(constraintsAsStrings, constraintsString, boost::is_any_of(
","));
1250 std::unordered_map<std::string, storm::expressions::Expression> variableMapping;
1251 for (
auto const& variableTypePair : expressionManager) {
1252 variableMapping[variableTypePair.first.getName()] = variableTypePair.first;
1256 for (
auto const& constraintString : constraintsAsStrings) {
1257 if (constraintString.empty()) {
1262 STORM_LOG_TRACE(
"Adding special (user-provided) constraint " << constraint <<
".");
1263 constraints.emplace_back(constraint);
1271 std::vector<std::vector<storm::expressions::Expression>> injectedRefinementPredicates;
1274 std::unordered_map<std::string, storm::expressions::Expression> variableMapping;
1275 for (
auto const& variableTypePair : expressionManager) {
1276 variableMapping[variableTypePair.first.getName()] = variableTypePair.first;
1280 std::vector<std::string> predicateGroupsAsStrings;
1281 boost::split(predicateGroupsAsStrings, refinementPredicatesString, boost::is_any_of(
";"));
1283 if (!predicateGroupsAsStrings.empty()) {
1284 for (
auto const& predicateGroupString : predicateGroupsAsStrings) {
1285 if (predicateGroupString.empty()) {
1289 std::vector<std::string> predicatesAsStrings;
1290 boost::split(predicatesAsStrings, predicateGroupString, boost::is_any_of(
":"));
1292 if (!predicatesAsStrings.empty()) {
1293 injectedRefinementPredicates.emplace_back();
1294 for (
auto const& predicateString : predicatesAsStrings) {
1296 STORM_LOG_TRACE(
"Adding special (user-provided) refinement predicate " << predicateString <<
".");
1297 injectedRefinementPredicates.back().emplace_back(predicate);
1300 STORM_LOG_THROW(!injectedRefinementPredicates.back().empty(), storm::exceptions::InvalidArgumentException,
1301 "Expecting non-empty list of predicates to inject for each (mentioned) refinement step.");
1304 std::reverse(injectedRefinementPredicates.back().begin(), injectedRefinementPredicates.back().end());
1309 std::reverse(injectedRefinementPredicates.begin(), injectedRefinementPredicates.end());
1312 return injectedRefinementPredicates;
1315template<storm::dd::DdType DdType,
typename ValueType>
1324 std::shared_ptr<storm::logic::Formula const>
const& states) {
1325 STORM_LOG_THROW(states->isInitialFormula(), storm::exceptions::NotSupportedException,
"Abstraction-refinement can only filter initial states.");
1331template<
typename ValueType>
1334 STORM_LOG_THROW((std::is_same<ValueType, double>::value), storm::exceptions::NotSupportedException,
1335 "Exploration does not support other data-types than floating points.");
1337 input, [&input, &mpi](std::shared_ptr<storm::logic::Formula const>
const& formula, std::shared_ptr<storm::logic::Formula const>
const& states) {
1338 STORM_LOG_THROW(states->isInitialFormula(), storm::exceptions::NotSupportedException,
"Exploration can only filter initial states.");
1343template<
typename ValueType>
1347 auto verificationCallback = [&sparseModel, &ioSettings, &mpi](std::shared_ptr<storm::logic::Formula const>
const& formula,
1348 std::shared_ptr<storm::logic::Formula const>
const& states) {
1349 auto createTask = [&ioSettings](
auto const& f,
bool onlyInitialStates) {
1351 STORM_LOG_THROW(ioSettings.isUncertaintyResolutionModeSet(), storm::exceptions::InvalidSettingsException,
1352 "Uncertainty resolution mode required for uncertain (interval) models.");
1359 bool const filterForInitialStates = states->isInitialFormula();
1360 auto task = createTask(formula, filterForInitialStates);
1361 if (ioSettings.isExportSchedulerSet()) {
1362 task.setProduceSchedulers(
true);
1366 std::unique_ptr<storm::modelchecker::CheckResult> filter;
1367 if (filterForInitialStates) {
1369 filter = std::make_unique<storm::modelchecker::ExplicitQualitativeCheckResult<SolutionType>>(sparseModel->getInitialStates());
1370 }
else if (!states->isTrueFormula()) {
1373 if (result && filter) {
1374 result->filter(filter->asQualitativeCheckResult());
1378 uint64_t exportCount = 0;
1379 auto postprocessingCallback = [&sparseModel, &ioSettings, &input, &exportCount](std::unique_ptr<storm::modelchecker::CheckResult>
const& result) {
1381 STORM_LOG_WARN_COND(!ioSettings.isExportSchedulerSet() || result->hasScheduler(),
"Scheduler requested but could not be generated.");
1382 if (ioSettings.isExportSchedulerSet() && result->hasScheduler()) {
1383 std::filesystem::path schedulerExportPath = ioSettings.getExportSchedulerFilename();
1384 if (exportCount > 0) {
1385 STORM_LOG_WARN(
"Prepending " << exportCount <<
" to scheduler file name for this property because there are multiple properties.");
1386 schedulerExportPath.replace_filename(std::to_string(exportCount) + schedulerExportPath.filename().string());
1391 "No information of state valuations available. The scheduler output will use internal state ids. You might be "
1392 "interested in building the model with state valuations using --buildstateval.");
1394 sparseModel->hasChoiceLabeling() || sparseModel->hasChoiceOrigins(),
1395 "No symbolic choice information is available. The scheduler output will use internal choice ids. You might be interested in "
1396 "building the model with choice labels or choice origins using --buildchoicelab or --buildchoiceorig.");
1398 "Only partial choice information is available. You might want to build the model with choice origins using "
1399 "--buildchoicelab or --buildchoiceorig.");
1401 if (result->isExplicitQuantitativeCheckResult()) {
1403 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Scheduler export for interval models is not supported.");
1406 schedulerExportPath.string());
1408 }
else if (result->isExplicitParetoCurveCheckResult()) {
1410 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Scheduler export for models of this value type is not supported.");
1412 auto const& paretoRes = result->template asExplicitParetoCurveCheckResult<ValueType>();
1415 }
else if (result->isExplicitQualitativeCheckResult()) {
1417 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Scheduler export for interval models is not supported.");
1420 schedulerExportPath.string());
1423 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Scheduler export not supported for this value type.");
1428 if (ioSettings.isExportCheckResultSet()) {
1430 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Result export for interval models is not supported.");
1432 std::filesystem::path resultExportPath = ioSettings.getExportCheckResultFilename();
1433 if (exportCount > 0) {
1434 STORM_LOG_WARN(
"Prepending " << exportCount <<
" to result file name for this property because there are multiple properties.");
1435 resultExportPath.replace_filename(std::to_string(exportCount) + resultExportPath.filename().string());
1438 "No information of state valuations available. The result output will use internal state ids. You might be interested in "
1439 "building the model with state valuations using --buildstateval.");
1445 if (!(ioSettings.isComputeSteadyStateDistributionSet() || ioSettings.isComputeExpectedVisitingTimesSet())) {
1448 if (ioSettings.isComputeSteadyStateDistributionSet()) {
1450 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Computing steady state distribution is not supported for interval models.");
1453 "steady-state probabilities",
1455 verificationCallback, postprocessingCallback);
1458 if (ioSettings.isComputeExpectedVisitingTimesSet()) {
1460 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Computing expected visiting times is not supported for interval models.");
1463 "expected visiting times",
1465 verificationCallback, postprocessingCallback);
1470template<storm::dd::DdType DdType,
typename ValueType>
1474 input, [&symbolicModel, &mpi](std::shared_ptr<storm::logic::Formula const>
const& formula, std::shared_ptr<storm::logic::Formula const>
const& states) {
1475 bool filterForInitialStates = states->isInitialFormula();
1480 std::unique_ptr<storm::modelchecker::CheckResult> filter;
1481 if (filterForInitialStates) {
1482 filter = std::make_unique<storm::modelchecker::SymbolicQualitativeCheckResult<DdType>>(symbolicModel->getReachableStates(),
1483 symbolicModel->getInitialStates());
1484 }
else if (!states->isTrueFormula()) {
1487 if (result && filter) {
1488 result->filter(filter->asQualitativeCheckResult());
1494template<storm::dd::DdType DdType,
typename ValueType>
1498 input, [&symbolicModel, &mpi](std::shared_ptr<storm::logic::Formula const>
const& formula, std::shared_ptr<storm::logic::Formula const>
const& states) {
1499 bool filterForInitialStates = states->isInitialFormula();
1502 std::unique_ptr<storm::modelchecker::CheckResult> result =
1505 std::unique_ptr<storm::modelchecker::CheckResult> filter;
1506 if (filterForInitialStates) {
1507 filter = std::make_unique<storm::modelchecker::SymbolicQualitativeCheckResult<DdType>>(symbolicModel->getReachableStates(),
1508 symbolicModel->getInitialStates());
1509 }
else if (!states->isTrueFormula()) {
1512 if (result && filter) {
1513 result->filter(filter->asQualitativeCheckResult());
1519template<storm::dd::DdType DdType,
typename ValueType>
1523 input, [&symbolicModel, &mpi](std::shared_ptr<storm::logic::Formula const>
const& formula, std::shared_ptr<storm::logic::Formula const>
const& states) {
1524 STORM_LOG_THROW(states->isInitialFormula(), storm::exceptions::NotSupportedException,
"Abstraction-refinement can only filter initial states.");
1530template<storm::dd::DdType DdType,
typename ValueType>
1531typename std::enable_if<DdType != storm::dd::DdType::CUDD || std::is_same<ValueType, double>::value,
void>::type
verifyModel(
1543template<storm::dd::DdType DdType,
typename ValueType>
1544typename std::enable_if<DdType == storm::dd::DdType::CUDD && !std::is_same<ValueType, double>::value,
void>::type
verifySymbolicModel(
1546 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"CUDD does not support the selected data-type.");
1553 std::shared_ptr<storm::models::ModelBase> model;
1554 if (!buildSettings.isNoBuildModelSet()) {
1561 model->printModelInformationToStream(std::cout);
1565 preprocessingWatch.
stop();
1566 if (preprocessingResult.second) {
1567 STORM_PRINT(
"\nTime for model preprocessing: " << preprocessingWatch <<
".\n\n");
1568 model = preprocessingResult.first;
1569 model->printModelInformationToStream(std::cout);
1591 [&input, &mpi]<
storm::dd::DdType DD,
typename VT>() { verifyWithAbstractionRefinementEngine<DD, VT>(input, mpi); });
1597 if (counterexampleSettings.isCounterexampleSet()) {
BuilderOptions & setBuildAllLabels(bool newValue=true)
Should all reward models be built?
BuilderOptions & setExplorationChecks(bool newValue=true)
Should extra checks be performed during exploration.
void clearTerminalStates()
BuilderOptions & setAddOutOfBoundsState(bool newValue=true)
Should a state for out of bounds be constructed.
BuilderOptions & setReservedBitsForUnboundedVariables(uint64_t value)
Sets the number of bits that will be reserved for unbounded integer variables.
BuilderOptions & setBuildChoiceLabels(bool newValue=true)
Should the choice labels be built?
bool isBuildStateValuationsSet() const
BuilderOptions & setBuildAllRewardModels(bool newValue=true)
Should all reward models be built?
bool isBuildChoiceLabelsSet() const
bool isBuildChoiceOriginsSet() const
BuilderOptions & setBuildChoiceOrigins(bool newValue=true)
Should the origins the different choices be built?
BuilderOptions & setBuildStateValuations(bool newValue=true)
Should the state valuation mapping be built?
bool isBuildAllLabelsSet() const
BuilderOptions & setApplyMaximalProgressAssumption(bool newValue=true)
Should the maximal progress assumption be applied when building a Markov Automaton?
BuilderOptions & setBuildObservationValuations(bool newValue=true)
Should a observation valuation mapping be built?
BuilderOptions & setAddOverlappingGuardsLabel(bool newValue=true)
Should a state be labelled for overlapping guards.
bool isBuildObservationValuationsSet() const
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
static Model eliminateAutomatically(const Model &model, std::vector< jani::Property > properties, uint64_t locationHeuristic, uint64_t edgesHeuristic)
std::shared_ptr< storm::logic::Formula const > getRawFormula() const
std::string const & getName() const
Get the provided name.
FilterExpression const & getFilter() const
This class represents a discrete-time Markov chain.
This class represents a Markov automaton.
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.
storm::jani::Model toJani(bool allVariablesGlobal=true, std::string suffix="") const
Converts the PRISM model into an equivalent JANI model.
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.
This class represents the bisimulation settings.
storm::dd::bisimulation::QuotientFormat getQuotientFormat() const
Retrieves the format in which the quotient is to be extracted.
storm::dd::bisimulation::SignatureMode getSignatureMode() const
Retrieves the mode to compute signatures.
bool isQuotientFormatSetFromDefaultValue() const
Retrieves whether the format in which the quotient is to be extracted has been set from its default v...
bool isWeakBisimulationSet() const
Retrieves whether weak bisimulation is to be used.
bool isBuildStateValuationsSet() const
Retrieves whether the choice labels should be build.
bool isBuildChoiceLabelsSet() const
Retrieves whether the choice labels should be build.
static const std::string moduleName
This class represents the markov chain settings.
bool isJaniPropertiesSet() const
Retrieves whether the jani-property option was set.
std::string getExplicitIMCAFilename() const
Retrieves the name of the file that contains the model in the IMCA format.
bool areJaniPropertiesSelected() const
Retrieves whether one or more jani-properties have been selected.
std::string getChoiceLabelingFilename() const
Retrieves the name of the file that contains the choice labeling if the model was given using the exp...
bool isStateRewardsSet() const
Retrieves whether the state reward option was set.
std::string getProperty() const
Retrieves the property specified with the property option.
std::string getJaniInputFilename() const
Retrieves the name of the file that contains the JANI model specification if the model was given usin...
bool isChoiceLabelingSet() const
Retrieves whether the choice labeling option was set.
bool isPrismOrJaniInputSet() const
Retrieves whether the JANI or PRISM input option was set.
std::string getPropertyFilter() const
Retrieves the property filter.
std::string getPrismInputFilename() const
Retrieves the name of the file that contains the PRISM model specification if the model was given usi...
bool isExplicitDRNSet() const
Retrieves whether the explicit option with DRN was set.
std::string getExplicitDRNFilename() const
Retrieves the name of the file that contains the model in the DRN format.
std::string getLabelingFilename() const
Retrieves the name of the file that contains the state labeling if the model was given using the expl...
boost::optional< std::vector< std::string > > getQvbsPropertyFilter() const
Retrieves the selected property names.
std::string getStateRewardsFilename() const
Retrieves the name of the file that contains the state rewards if the model was given using the expli...
bool isExplicitUmbSet() const
Retrieves whether the explicit option with UMB was set.
std::string getTransitionRewardsFilename() const
Retrieves the name of the file that contains the transition rewards if the model was given using the ...
bool isPropertySet() const
Retrieves whether the property option was set.
std::string getQvbsModelName() const
Retrieves the specified model (short-)name of the QVBS.
std::vector< std::string > getSelectedJaniProperties() const
std::string getTransitionFilename() const
Retrieves the name of the file that contains the transitions if the model was given using the explici...
uint64_t getQvbsInstanceIndex() const
Retrieves the selected model instance (file + open parameters of the model).
bool isExplicitIMCASet() const
Retrieves whether the explicit option with IMCA was set.
bool isPrismInputSet() const
Retrieves whether the PRISM language option was set.
bool isTransitionRewardsSet() const
Retrieves whether the transition reward option was set.
std::string getExplicitUmbFilename() const
Retrieves the name of the file that contains the model in the UMB format.
bool isExplicitSet() const
Retrieves whether the explicit option was set.
This class provides easy access to a benchmark of the Quantitative Verification Benchmark Set http://...
std::string const & getJaniFile(uint64_t instanceIndex=0) const
std::string getInfo(uint64_t instanceIndex=0, boost::optional< std::vector< std::string > > propertyFilter=boost::none) const
std::string const & getConstantDefinition(uint64_t instanceIndex=0) const
storm::jani::Model const & asJaniModel() const
bool enableBisimulation() const
storm::utility::Engine getEngine() const
Retrieve "good" settings after calling predict.
void predict(storm::jani::Model const &model, storm::jani::Property const &property)
Predicts "good" settings for the provided model checking query.
A class that provides convenience operations to display run times.
void start()
Start stopwatch (again) and start measuring time.
void stop()
Stop stopwatch and add measured time to total time.
#define STORM_LOG_INFO(message)
#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)
#define STORM_PRINT_AND_LOG(message)
#define STORM_PRINT(message)
Define the macros that print information and optionally also log it.
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)
std::shared_ptr< storm::models::sparse::Model< ValueType > > buildSparseModel(storm::storage::SymbolicModelDescription const &model, storm::builder::BuilderOptions const &options)
void exportScheduler(std::shared_ptr< storm::models::sparse::Model< ValueType > > const &model, storm::storage::Scheduler< ValueType > const &scheduler, std::string const &filename)
std::shared_ptr< storm::models::sparse::Model< ValueType > > buildExplicitModel(std::string const &transitionsFile, std::string const &labelingFile, boost::optional< std::string > const &stateRewardsFile, boost::optional< std::string > const &transitionRewardsFile, boost::optional< std::string > const &choiceLabelingFile)
std::shared_ptr< storm::models::sparse::Model< ValueType > > transformToNondeterministicModel(storm::models::sparse::Model< ValueType > &&model)
storm::modelchecker::CheckTask< storm::logic::Formula, ValueType > createTask(std::shared_ptr< const storm::logic::Formula > const &formula, bool onlyInitialStatesRelevant=false)
void exportSymbolicModelAsDot(std::shared_ptr< storm::models::symbolic::Model< Type, ValueType > > const &model, std::string const &filename)
void exportSparseModelAsUmb(std::shared_ptr< storm::models::sparse::Model< ValueType > > const &model, std::string const &filename, storm::umb::ExportOptions const &options={})
storm::prism::Program parseProgram(std::string const &filename, bool prismCompatibility, bool simplify)
std::shared_ptr< storm::models::symbolic::Model< LibraryType, ValueType > > buildSymbolicModel(storm::storage::SymbolicModelDescription const &model, std::vector< std::shared_ptr< storm::logic::Formula const > > const &formulas, bool buildFullModel=false, bool applyMaximumProgress=true)
std::shared_ptr< storm::models::ModelBase > buildExplicitUmbModel(std::string const &umbLocation, storm::umb::ImportOptions const &options={})
std::shared_ptr< storm::models::sparse::Model< ValueType > > permuteModelStates(std::shared_ptr< storm::models::sparse::Model< ValueType > > const &model, storm::utility::permutation::OrderKind order, std::optional< uint64_t > seed=std::nullopt)
Permutes the order of the states of the model according to the given order.
storm::jani::Property createMultiObjectiveProperty(std::vector< storm::jani::Property > const &properties, bool lexicographic)
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)
std::pair< std::shared_ptr< storm::models::sparse::Model< ValueType > >, std::vector< std::shared_ptr< storm::logic::Formula const > > > eliminateNonMarkovianChains(std::shared_ptr< storm::models::sparse::MarkovAutomaton< ValueType > > const &ma, std::vector< std::shared_ptr< storm::logic::Formula const > > const &formulas, storm::transformer::EliminationLabelBehavior labelBehavior)
Eliminates chains of non-Markovian states from a given Markov Automaton.
std::pair< storm::jani::Model, std::vector< storm::jani::Property > > parseJaniModel(std::string const &filename, boost::optional< std::vector< std::string > > const &propertyFilter)
void exportJaniModelAsDot(storm::jani::Model const &model, std::string const &filename)
std::vector< storm::jani::Property > parseProperties(storm::parser::FormulaParser &formulaParser, std::string const &inputString, boost::optional< std::set< std::string > > const &propertyFilter)
std::shared_ptr< storm::models::sparse::Model< ValueType > > transformSymbolicToSparseModel(std::shared_ptr< storm::models::symbolic::Model< Type, ValueType > > const &symbolicModel, std::vector< std::shared_ptr< storm::logic::Formula const > > const &formulas=std::vector< std::shared_ptr< storm::logic::Formula const > >())
Transforms the given symbolic model to a sparse model.
std::unique_ptr< storm::modelchecker::CheckResult > computeExpectedVisitingTimesWithSparseEngine(storm::Environment const &env, std::shared_ptr< storm::models::sparse::Dtmc< ValueType > > const &dtmc)
std::pair< std::shared_ptr< storm::models::sparse::Model< ValueType > >, std::vector< std::shared_ptr< storm::logic::Formula const > > > transformContinuousToDiscreteTimeSparseModel(std::shared_ptr< storm::models::sparse::Model< ValueType > > const &model, std::vector< std::shared_ptr< storm::logic::Formula const > > const &formulas)
Transforms the given continuous model to a discrete time model.
void exportSymbolicModelAsDrdd(std::shared_ptr< storm::models::symbolic::Model< Type, ValueType > > const &model, std::string const &filename)
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::models::sparse::Model< ValueType > > performBisimulationMinimization(std::shared_ptr< storm::models::sparse::Model< ValueType > > const &model, std::vector< std::shared_ptr< storm::logic::Formula const > > const &formulas, storm::storage::BisimulationType type=storm::storage::BisimulationType::Strong, bool graphPreserving=true)
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)
std::vector< storm::jani::Property > parsePropertiesForSymbolicModelDescription(std::string const &inputString, storm::storage::SymbolicModelDescription const &modelDescription, boost::optional< std::set< std::string > > const &propertyFilter)
std::vector< std::shared_ptr< storm::logic::Formula const > > extractFormulasFromProperties(std::vector< storm::jani::Property > const &properties)
void simplifyJaniModel(storm::jani::Model &model, std::vector< storm::jani::Property > &properties, storm::jani::ModelFeatures const &supportedFeatures)
std::shared_ptr< storm::models::sparse::Model< ValueType > > buildExplicitDRNModel(std::string const &drnFile, storm::parser::DirectEncodingParserOptions const &options=storm::parser::DirectEncodingParserOptions())
boost::optional< std::set< std::string > > parsePropertyFilter(std::string const &propertyFilter)
storm::jani::ModelFeatures getSupportedJaniFeatures(storm::builder::BuilderType const &builderType)
std::shared_ptr< storm::models::sparse::Model< ValueType > > buildExplicitIMCAModel(std::string const &imcaFile)
void exportSparseModelAsDrn(std::shared_ptr< storm::models::sparse::Model< ValueType > > const &model, std::string const &filename, std::vector< std::string > const ¶meterNames={}, bool allowPlaceholders=true)
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 exportSparseModelAsJson(std::shared_ptr< storm::models::sparse::Model< ValueType > > const &model, std::string const &filename)
void exportSparseModelAsDot(std::shared_ptr< storm::models::sparse::Model< ValueType > > const &model, std::string const &filename, size_t maxWidth=30)
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::vector< storm::jani::Property > substituteConstantsInProperties(std::vector< storm::jani::Property > const &properties, std::map< storm::expressions::Variable, storm::expressions::Expression > const &substitution)
std::unique_ptr< storm::modelchecker::CheckResult > computeSteadyStateDistributionWithSparseEngine(storm::Environment const &env, std::shared_ptr< storm::models::sparse::Dtmc< ValueType > > const &dtmc)
void exportModel(std::shared_ptr< storm::models::sparse::Model< ValueType > > const &model, SymbolicInput const &input)
void exportSymbolicInput(SymbolicInput const &input)
void parseSymbolicModelDescription(storm::settings::modules::IOSettings const &ioSettings, SymbolicInput &input)
void verifyWithAbstractionRefinementEngine(SymbolicInput const &input, ModelProcessingInformation const &mpi)
std::shared_ptr< storm::models::ModelBase > buildModelExplicit(storm::settings::modules::IOSettings const &ioSettings, storm::settings::modules::BuildSettings const &buildSettings)
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)
SymbolicInput parseSymbolicInputQvbs(storm::settings::modules::IOSettings const &ioSettings)
void getModelProcessingInformationAutomatic(SymbolicInput const &input, ModelProcessingInformation &mpi)
void verifyWithExplorationEngine(SymbolicInput const &input, ModelProcessingInformation const &mpi)
std::shared_ptr< storm::models::sparse::Model< ValueType > > preprocessSparseModelBisimulation(std::shared_ptr< storm::models::sparse::Model< ValueType > > const &model, SymbolicInput const &input, storm::settings::modules::BisimulationSettings const &bisimulationSettings, bool graphPreserving=true)
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)
SymbolicInput parseSymbolicInput()
void verifyWithDdEngine(std::shared_ptr< storm::models::symbolic::Model< DdType, ValueType > > const &symbolicModel, SymbolicInput const &input, ModelProcessingInformation const &mpi)
std::shared_ptr< storm::models::ModelBase > buildModelSparse(SymbolicInput const &input, storm::builder::BuilderOptions const &options)
std::enable_if< DdType!=storm::dd::DdType::Sylvan &&!std::is_same< ValueType, double >::value, std::shared_ptr< storm::models::Model< ValueType > > >::type preprocessDdMarkovAutomaton(std::shared_ptr< storm::models::symbolic::Model< DdType, ValueType > > const &model)
std::shared_ptr< storm::models::sparse::Model< ValueType > > preprocessSparseMarkovAutomaton(std::shared_ptr< storm::models::sparse::MarkovAutomaton< ValueType > > const &model)
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)
std::pair< SymbolicInput, ModelProcessingInformation > preprocessSymbolicInput(SymbolicInput const &input)
std::shared_ptr< storm::models::ModelBase > buildModel(SymbolicInput const &input, storm::settings::modules::IOSettings const &ioSettings, ModelProcessingInformation const &mpi)
void printModelCheckingProperty(storm::jani::Property const &property)
void parseProperties(storm::settings::modules::IOSettings const &ioSettings, SymbolicInput &input, boost::optional< std::set< std::string > > const &propertyFilter)
void verifyWithHybridEngine(std::shared_ptr< storm::models::symbolic::Model< DdType, ValueType > > const &symbolicModel, SymbolicInput const &input, ModelProcessingInformation const &mpi)
ModelProcessingInformation getModelProcessingInformation(SymbolicInput const &input, std::shared_ptr< SymbolicInput > const &transformedJaniInput=nullptr)
Sets the model processing information based on the given input.
void printComputingCounterexample(storm::jani::Property const &property)
std::shared_ptr< storm::models::Model< ExportValueType > > preprocessDdModelBisimulation(std::shared_ptr< storm::models::symbolic::Model< DdType, ValueType > > const &model, SymbolicInput const &input, storm::settings::modules::BisimulationSettings const &bisimulationSettings, ModelProcessingInformation const &mpi)
auto applyDdLibValueType(storm::dd::DdType dd, ModelProcessingInformation::ValueType vt, auto const &callback)
std::shared_ptr< storm::models::ModelBase > buildPreprocessModel(SymbolicInput const &input, ModelProcessingInformation const &mpi)
storm::builder::BuilderOptions createBuildOptionsSparseFromSettings(SymbolicInput const &input)
void processInput(SymbolicInput const &input, ModelProcessingInformation const &mpi)
void ensureNoUndefinedPropertyConstants(std::vector< storm::jani::Property > const &properties)
void generateCounterexamples(std::shared_ptr< ModelType > const &, SymbolicInput const &)
std::vector< std::shared_ptr< storm::logic::Formula const > > createFormulasToRespect(std::vector< storm::jani::Property > const &properties)
std::pair< std::shared_ptr< storm::models::ModelBase >, bool > preprocessModel(std::shared_ptr< storm::models::sparse::Model< ValueType > > const &model, SymbolicInput const &input, ModelProcessingInformation const &mpi)
std::shared_ptr< storm::models::ModelBase > buildModelDd(SymbolicInput const &input)
std::pair< std::shared_ptr< storm::models::ModelBase >, bool > preprocessDdModelImpl(std::shared_ptr< storm::models::symbolic::Model< DdType, ValueType > > const &model, SymbolicInput const &input, ModelProcessingInformation const &mpi)
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())
std::string toString(CompressionMode const &input)
SettingsType const & getModule()
Get module.
SettingsManager const & manager()
Retrieves the settings manager.
OptimizationDirection convert(OptimizationDirectionSetting s)
std::string orderKindtoString(OrderKind order)
Converts the given order to a string.
bool isTerminate()
Check whether the program should terminate (due to some abort signal).
bool isConstant(ValueType const &)
bool canHandle< storm::RationalFunction >(storm::utility::Engine const &engine, storm::storage::SymbolicModelDescription::ModelType const &modelType, storm::modelchecker::CheckTask< storm::logic::Formula, storm::RationalFunction > const &checkTask)
Engine
An enumeration of all engines.
template bool canHandle< storm::RationalNumber >(storm::utility::Engine const &, std::vector< storm::jani::Property > const &, storm::storage::SymbolicModelDescription const &)
template bool canHandle< double >(storm::utility::Engine const &, std::vector< storm::jani::Property > const &, storm::storage::SymbolicModelDescription const &)
storm::builder::BuilderType getBuilderType(Engine const &engine)
Returns the builder type used for the given engine.
TargetType convertNumber(SourceType const &number)
carl::Interval< storm::RationalNumber > RationalInterval
carl::Interval< double > Interval
Interval type.
constexpr bool IsIntervalType
Helper to check if a type is an interval.
carl::RationalFunction< Polynomial, true > RationalFunction
typename detail::IntervalMetaProgrammingHelper< ValueType >::BaseType IntervalBaseType
Helper to access the type in which interval boundaries are stored.
static const bool IsExact
void operator()(std::unique_ptr< storm::modelchecker::CheckResult > const &)
bool allowPlaceholders
Allow placeholders for rational functions in the exported DRN file.
storm::io::CompressionMode compression
The type of compression used for the exported DRN file.
std::optional< std::size_t > outputPrecision
If set, the output precision for floating point numbers in the exported DRN file is set to the given ...
storm::io::CompressionMode compression
The type of compression used for the exported UMB model.
bool buildChoiceLabeling
Controls building of choice labelings.
bool buildStateValuations
Controls building of state valuations.