3#include <boost/algorithm/string/join.hpp>
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()) {
176 STORM_LOG_THROW(input.
model.is_initialized(), storm::exceptions::InvalidArgumentException,
"Automatic engine requires a JANI input model.");
177 STORM_LOG_THROW(input.
model->isJaniModel(), storm::exceptions::InvalidArgumentException,
"Automatic engine requires a JANI input model.");
178 std::vector<storm::jani::Property>
const& properties =
180 STORM_LOG_THROW(!properties.empty(), storm::exceptions::InvalidArgumentException,
"Automatic engine requires a property.");
182 "Automatic engine does not support decisions based on multiple properties. Only the first property will be considered.");
185 if (hints.isNumberStatesSet()) {
186 as.
predict(input.
model->asJaniModel(), properties.front(), hints.getNumberStates());
188 as.
predict(input.
model->asJaniModel(), properties.front());
209 std::shared_ptr<SymbolicInput>
const& transformedJaniInput =
nullptr) {
218 mpi.
engine = coreSettings.getEngine();
224 if (generalSettings.isParametricSet()) {
226 }
else if (generalSettings.isExactSet()) {
236 if (input.
model->isJaniModel()) {
247 janiInput.
model = modelAndProperties.first;
248 if (!modelAndProperties.second.empty()) {
254 if (transformedJaniInput) {
256 *transformedJaniInput = std::move(janiInput);
263 auto checkCompatibleSettings = [&mpi, &input] {
282 STORM_LOG_WARN(
"The settings picked by the automatic engine (engine="
284 <<
") are incompatible with this model. Falling back to default settings.");
304 "Dd-based model builder for Markov Automata is only available for JANI models, automatically converting the input model.");
310 if (bisimulationSettings.useExactArithmeticInDdBisimulation()) {
316 STORM_LOG_WARN(
"Requested using exact arithmetic in Dd bisimulation but no dd bisimulation is applied.");
321 mpi.
ddType = coreSettings.getDdLibraryType();
325 STORM_LOG_INFO(
"Switching to DD library sylvan to allow for rational arithmetic.");
332auto castAndApply(std::shared_ptr<storm::models::ModelBase>
const& model,
auto const& callback) {
336 auto castAndApplyImpl = [&model, &callback]<
typename TargetModelType> {
337 auto res = model->template as<TargetModelType>();
339 return callback(res);
343 auto castAndApplyVT = [&]<
typename ValueType> {
344 if (model->isSparseModel()) {
347 auto ddType = model->getDdType();
348 STORM_LOG_ASSERT(model->isSymbolicModel() && ddType.has_value(),
"Unexpected model representation.");
351 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Symbolic interval models are currently not supported.");
354 if (*ddType == CUDD) {
355 if constexpr (std::is_same_v<ValueType, double>) {
366 if (model->supportsParameters()) {
368 }
else if (model->supportsUncertainty()) {
369 if (model->isExact()) {
375 if (model->isExact()) {
376 return castAndApplyVT.template operator()<storm::RationalNumber>();
378 return castAndApplyVT.template operator()<
double>();
386 case FinitePrecision:
387 return callback.template operator()<
double>();
389 return callback.template operator()<storm::RationalNumber>();
393 STORM_LOG_THROW(
false, storm::exceptions::UnexpectedException,
"Unexpected value type.");
401 STORM_LOG_THROW(vt == FinitePrecision, storm::exceptions::UnexpectedException,
"Unexpected value type for DD library Cudd.");
402 return callback.template operator()<CUDD,
double>();
405 case FinitePrecision:
406 return callback.template operator()<
Sylvan,
double>();
408 return callback.template operator()<
Sylvan, storm::RationalNumber>();
413 STORM_LOG_THROW(
false, storm::exceptions::UnexpectedException,
"Unexpected DDType or value type.");
418 for (
auto const& property : properties) {
419 std::set<storm::expressions::Variable> usedUndefinedConstants =
property.getUndefinedConstants();
420 if (!usedUndefinedConstants.empty()) {
421 std::vector<std::string> undefinedConstantsNames;
422 for (
auto const& constant : usedUndefinedConstants) {
423 undefinedConstantsNames.emplace_back(constant.getName());
426 false, storm::exceptions::InvalidArgumentException,
427 "The property '" << property <<
" still refers to the undefined constants " << boost::algorithm::join(undefinedConstantsNames,
",") <<
".");
438 if (ioSettings.isPropertiesAsMultiSet()) {
440 "Can not translate properties to multi-objective formula because no properties were specified.");
447 std::string constantDefinitionString = ioSettings.getConstantDefinitionString();
448 std::map<storm::expressions::Variable, storm::expressions::Expression> constantDefinitions;
450 constantDefinitions = output.
model.get().parseConstantDefinitions(constantDefinitionString);
451 output.
model = output.
model.get().preprocess(constantDefinitions);
457 auto transformedJani = std::make_shared<SymbolicInput>();
461 if (output.
model && output.
model.get().isPrismProgram()) {
463 if (transformedJani->model) {
465 output = std::move(*transformedJani);
470 output.
model = modelAndProperties.first;
472 if (!modelAndProperties.second.empty()) {
479 if (output.
model && output.
model.get().isJaniModel()) {
484 if (buildSettings.isLocationEliminationSet()) {
485 auto locationHeuristic = buildSettings.getLocationEliminationLocationHeuristic();
486 auto edgesHeuristic = buildSettings.getLocationEliminationEdgesHeuristic();
488 locationHeuristic, edgesHeuristic));
492 return {output, mpi};
495inline std::vector<std::shared_ptr<storm::logic::Formula const>>
createFormulasToRespect(std::vector<storm::jani::Property>
const& properties) {
498 for (
auto const& property : properties) {
499 if (!property.getFilter().getStatesFormula()->isInitialFormula()) {
500 result.push_back(property.getFilter().getStatesFormula());
507template<storm::dd::DdType DdType,
typename ValueType>
515 buildSettings.isBuildFullModelSet(), !buildSettings.isApplyNoMaximumProgressAssumptionSet(),
516 !buildSettings.isDontFixDeadlocksSet());
529 if (counterexampleGeneratorSettings.isCounterexampleSet()) {
530 buildChoiceOrigins |= counterexampleGeneratorSettings.isMinimalCommandSetGenerationSet();
535 if (buildSettings.isApplyNoMaximumProgressAssumptionSet()) {
539 if (buildSettings.isExplorationChecksSet()) {
545 if (buildSettings.isBuildFullModelSet()) {
552 if (buildSettings.isAddOverlappingGuardsLabelSet()) {
557 if (ioSettings.isComputeExpectedVisitingTimesSet() || ioSettings.isComputeSteadyStateDistributionSet()) {
569template<
typename ValueType>
574 explorationOptions.
fixDeadlocks = !buildSettings.isDontFixDeadlocksSet();
575 if (buildSettings.isExplorationStateLimitSet()) {
578 return explorationOptions;
581template<
typename ValueType>
585 input.
model->asPrismProgram().hasIntervalUpdates()) {
587 bool constexpr IsDoubleInterval = std::is_same_v<ValueType, storm::IntervalBaseType<storm::Interval>>;
588 bool constexpr IsRationalInterval = std::is_same_v<ValueType, storm::IntervalBaseType<storm::RationalInterval>>;
589 STORM_LOG_THROW(IsDoubleInterval || IsRationalInterval, storm::exceptions::NotSupportedException,
590 "Can not build interval model for the provided value type.");
591 using IntervalType = std::conditional_t<IsDoubleInterval, storm::Interval, storm::RationalInterval>;
598template<
typename ValueType>
601 std::shared_ptr<storm::models::ModelBase> result;
616 if constexpr (std::is_same_v<ValueType, double>) {
618 }
else if constexpr (std::is_same_v<ValueType, storm::RationalNumber>) {
619 valueType = Rational;
621 static_assert(std::is_same_v<ValueType, storm::RationalFunction>,
"Unexpected value type.");
622 valueType = Parametric;
630 if constexpr (std::is_same_v<ValueType, storm::RationalFunction>) {
631 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"RationalFunction currently not supported for UMB models.");
632 }
else if constexpr (std::is_same_v<ValueType, storm::RationalNumber>) {
635 static_assert(std::is_same_v<ValueType, double>,
"Unhandled value type.");
653 std::shared_ptr<storm::models::ModelBase> result;
658 [&input, &mpi]<
storm::dd::DdType DD,
typename VT>() { return buildModelDd<DD, VT>(mpi.env, input); });
661 auto options = createBuildOptionsSparseFromSettings(input);
662 return buildModelSparse<VT>(input, options);
667 "Can only use sparse engine with explicit input.");
669 return buildModelExplicit<VT>(ioSettings, storm::settings::getModule<storm::settings::modules::BuildSettings>());
673 modelBuildingWatch.
stop();
675 STORM_PRINT(
"Time for model construction: " << modelBuildingWatch <<
".\n\n");
681template<
typename ValueType>
687 std::shared_ptr<storm::models::sparse::Model<ValueType>> result = model;
689 STORM_LOG_WARN_COND(!buildSettings.isCheckZenoSet() || !model->containsZenoCycle(),
"MA contains a Zeno cycle. Model checking results cannot be trusted.");
691 if (model->isConvertibleToCtmc()) {
693 result = model->convertToCtmc();
696 if (transformationSettings.isChainEliminationSet()) {
699 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Chain elimination not supported for interval models.");
703 transformationSettings.getLabelBehavior())
711template<
typename ValueType>
726 <<
", tolerance: " << options.
tolerance.value() << (options.
actionSensitive ?
", action-sensitive" :
"") <<
")...");
730template<
typename ValueType>
734 "Converting value types for sparse engine is not supported.");
739 std::pair<std::shared_ptr<storm::models::sparse::Model<ValueType>>,
bool> result = std::make_pair(model,
false);
741 if (
auto order = transformationSettings.getModelPermutation(); order.has_value()) {
742 auto seed = transformationSettings.getModelPermutationSeed();
744 << (seed.has_value() ?
" with seed " + std::to_string(seed.value()) :
"") <<
".\n");
746 result.second =
true;
747 STORM_PRINT_AND_LOG(
"Transition matrix hash after permuting: " << result.first->getTransitionMatrix().hash() <<
".\n");
751 if (transformationSettings.isMergeEquivalentStatesSet()) {
753 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Merging equivalent states not supported for interval models.");
756 if (formulas.size() == 1) {
759 STORM_LOG_INFO(
"Merged equivalent states for the considered property '" << *formulas.front() <<
"'.");
760 result.first = mergedModel;
761 result.second =
true;
763 STORM_LOG_WARN(
"Merging equivalent states is not supported for the considered " << result.first->getType() <<
" model and property '"
764 << *formulas.front() <<
"'.");
767 STORM_LOG_WARN(
"Skipping merging of equivalent states as it requires exactly one input property. " << formulas.size()
768 <<
" properties given instead.");
775 result.second =
true;
780 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Bisimulation not supported for interval models.");
783 result.second =
true;
787 if (transformationSettings.isToDiscreteTimeModelSet()) {
789 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Transformation to discrete time model not supported for interval models.");
793 !model->hasRewardModel(
"_time"),
794 "Scheduled transformation to discrete time model, but a reward model named '_time' is already present in this model. We might take "
795 "the wrong reward model later.");
799 result.second =
true;
803 if (transformationSettings.isToNondeterministicModelSet()) {
805 result.second =
true;
811template<
typename ValueType>
815 if (ioSettings.isExportBuildSet()) {
817 modelExportWatch.
start();
818 STORM_PRINT(
"\nExporting model to '" << ioSettings.getExportBuildFilename() <<
"'.\n");
819 switch (ioSettings.getExportBuildFormat()) {
826 options.
compression = ioSettings.getCompressionMode();
827 if (ioSettings.isExportDigitsSet()) {
831 input.
model ? input.
model.get().getParameterNames() : std::vector<std::string>());
839 options.
compression = ioSettings.getCompressionMode();
845 "Exporting sparse models in " <<
storm::io::toString(ioSettings.getExportBuildFormat()) <<
" format is not supported.");
847 modelExportWatch.
stop();
848 STORM_PRINT(
"Time for model export: " << modelExportWatch <<
".\n\n");
853 if (ioSettings.isExportExplicitSet()) {
855 input.
model ? input.
model.get().getParameterNames() : std::vector<std::string>(),
856 !ioSettings.isExplicitExportPlaceholdersDisabled());
859 STORM_LOG_THROW(!ioSettings.isExportDdSet(), storm::exceptions::NotSupportedException,
"Exporting in drdd format is only supported for DDs.");
861 if (ioSettings.isExportDotSet()) {
866template<storm::dd::DdType DdType,
typename ValueType>
870 if (ioSettings.isExportBuildSet()) {
871 switch (ioSettings.getExportBuildFormat()) {
880 "Exporting symbolic models in " <<
storm::io::toString(ioSettings.getExportBuildFormat()) <<
" format is not supported.");
886 STORM_LOG_THROW(!ioSettings.isExportExplicitSet(), storm::exceptions::NotSupportedException,
887 "Exporting in drn format is only supported for sparse models.");
889 if (ioSettings.isExportDdSet()) {
893 if (ioSettings.isExportDotSet()) {
898template<storm::dd::DdType DdType,
typename ValueType>
899typename std::enable_if<DdType != storm::dd::DdType::Sylvan && !std::is_same<ValueType, double>::value, std::shared_ptr<storm::models::Model<ValueType>>>::type
904template<storm::dd::DdType DdType,
typename ValueType>
905typename std::enable_if<DdType == storm::dd::DdType::Sylvan || std::is_same<ValueType, double>::value, std::shared_ptr<storm::models::Model<ValueType>>>::type
907 auto ma = model->template as<storm::models::symbolic::MarkovAutomaton<DdType, ValueType>>();
908 if (!ma->isClosed()) {
909 return std::make_shared<storm::models::symbolic::MarkovAutomaton<DdType, ValueType>>(ma->close());
915template<storm::dd::DdType DdType,
typename ValueType,
typename ExportValueType = ValueType>
920 "Weak bisimulation is currently not supported on DDs. Falling back to strong bisimulation.");
925 STORM_LOG_INFO(
"Setting bisimulation quotient format to 'sparse'.");
939 quotientFormat, ddBisimulationOptions);
942template<
typename ExportValueType, storm::dd::DdType DdType,
typename ValueType>
946 std::pair<std::shared_ptr<storm::models::Model<ValueType>>,
bool> intermediateResult = std::make_pair(model,
false);
950 intermediateResult.second =
true;
953 std::unique_ptr<std::pair<std::shared_ptr<storm::models::Model<ExportValueType>>,
bool>> result;
954 auto symbolicModel = intermediateResult.first->template as<storm::models::symbolic::Model<DdType, ValueType>>();
956 std::shared_ptr<storm::models::Model<ExportValueType>> newModel =
958 result = std::make_unique<std::pair<std::shared_ptr<storm::models::Model<ExportValueType>>,
bool>>(newModel,
true);
960 result = std::make_unique<std::pair<std::shared_ptr<storm::models::Model<ExportValueType>>,
bool>>(
961 symbolicModel->template toValueType<ExportValueType>(), !std::is_same<ValueType, ExportValueType>::value);
966 result->second =
true;
968 std::shared_ptr<storm::models::symbolic::Model<DdType, ExportValueType>> symbolicModel =
969 result->first->template as<storm::models::symbolic::Model<DdType, ExportValueType>>();
970 std::vector<std::shared_ptr<storm::logic::Formula const>> formulas;
971 for (
auto const& property : input.
properties) {
972 formulas.emplace_back(property.getRawFormula());
975 STORM_LOG_THROW(result, storm::exceptions::NotSupportedException,
"The translation to a sparse model is not supported for the given model type.");
981template<storm::dd::DdType DdType,
typename ValueType>
986 if constexpr (std::is_same_v<ValueType, VT> ||
987 (DdType == storm::dd::DdType::Sylvan && std::is_same_v<ValueType, storm::RationalNumber> && std::is_same_v<VT, double>)) {
988 return preprocessDdModelImpl<VT>(model, input, mpi);
990 STORM_LOG_THROW(false, storm::exceptions::NotSupportedException,
991 "Unexpected combination of DD library, build value type, and verification value type.");
1004 std::shared_ptr<storm::models::ModelBase> model;
1005 if (!buildSettings.isNoBuildModelSet()) {
1012 model->printModelInformationToStream(std::cout);
1016 preprocessingWatch.
stop();
1017 if (preprocessingResult.second) {
1018 STORM_PRINT(
"\nTime for model preprocessing: " << preprocessingWatch <<
".\n\n");
1019 model = preprocessingResult.first;
1020 model->printModelInformationToStream(std::cout);
SylvanDdManagerEnvironment & sylvan()
uint64_t getNumberOfThreads() const
Retrieves the number of threads used by Sylvan.
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 & setShowProgressDelay(uint64_t newValue)
Sets the delay (in seconds) between progress reports during state space exploration.
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 & setStochasticTolerance(double newValue)
Sets the tolerance used for checking whether a distribution sums to one.
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
BuilderOptions & setShowProgress(bool newValue=true)
Sets whether the progress of state space exploration should be printed.
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.
This class represents a Markov automaton.
Base class for all sparse models.
Base class for all symbolic models.
storm::jani::Model toJani(bool allVariablesGlobal=true, std::string suffix="") const
Converts the PRISM model into an equivalent JANI model.
static storm::Environment buildEnvironment()
This class represents the bisimulation settings.
storm::dd::bisimulation::ReuseMode getReuseMode() const
Retrieves the selected reuse mode.
bool isActionSensitiveSet() const
Retrieves whether action-sensitive bisimulation is to be used, i.e., choices are only lumped together...
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.
double getTolerance() const
Retrieves the tolerance to use for bisimulation minimization.
bool isUseOriginalVariablesSet() const
Retrieves whether the extracted quotient model is supposed to use the same variables as the original ...
storm::dd::bisimulation::InitialPartitionMode getInitialPartitionMode() const
Retrieves the initial partition mode.
bool isQuotientFormatSetFromDefaultValue() const
Retrieves whether the format in which the quotient is to be extracted has been set from its default v...
bool isUseRepresentativesSet() const
Retrieves whether representatives for blocks are to be used instead of the block numbers.
storm::dd::bisimulation::RefinementMode getRefinementMode() const
Retrieves the refinement mode to use.
bool isWeakBisimulationSet() const
Retrieves whether weak bisimulation is to be used.
bool isToleranceSet() const
Retrieves whether the tolerance to use for (approximate) bisimulation minimization has been set expli...
bool isBuildStateValuationsSet() const
Retrieves whether the choice labels should be build.
bool isDontFixDeadlocksSet() const
Retrieves whether the dont-fix-deadlocks option was set.
bool isBuildObservationValuationsSet() const
Retrieves whether the observation valuations 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
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_ASSERT(cond, message)
#define STORM_LOG_WARN_COND(cond, message)
#define STORM_LOG_THROW(cond, exception, message)
std::shared_ptr< storm::models::sparse::Model< ValueType > > transformToNondeterministicModel(storm::models::sparse::Model< ValueType > &&model)
std::shared_ptr< storm::models::sparse::Model< ValueType > > mergeEquivalentStatesForFormula(std::shared_ptr< storm::models::sparse::Model< ValueType > > const &model, storm::logic::Formula const &formula)
Identifies states of the given model that are equivalent w.r.t.
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={})
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::models::sparse::Model< ValueType > > buildExplicitIMCAModel(std::string const &imcaFile, storm::parser::ExplicitModelParserOptions const &options=storm::parser::ExplicitModelParserOptions())
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::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::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)
storm::prism::Program parseProgram(std::string const &filename, bool prismCompatibility, bool simplify)
std::shared_ptr< storm::models::symbolic::Model< LibraryType, ValueType > > buildSymbolicModel(storm::Environment const &env, storm::storage::SymbolicModelDescription const &model, std::vector< std::shared_ptr< storm::logic::Formula const > > const &formulas, bool buildFullModel=false, bool applyMaximumProgress=true, bool fixDeadlocks=true)
std::shared_ptr< storm::models::sparse::Model< ValueType > > buildSparseModel(storm::storage::SymbolicModelDescription const &model, storm::builder::BuilderOptions const &options, typename storm::builder::ExplicitModelBuilder< ValueType >::Options const &explorationOptions=typename storm::builder::ExplicitModelBuilder< ValueType >::Options())
boost::optional< std::set< std::string > > parsePropertyFilter(std::string const &propertyFilter)
std::vector< std::shared_ptr< storm::logic::Formula const > > extractFormulasFromProperties(std::vector< storm::jani::Property > const &properties)
std::shared_ptr< storm::models::sparse::Model< ValueType > > buildExplicitDRNModel(std::string const &drnFile, storm::parser::DirectEncodingParserOptions const &options=storm::parser::DirectEncodingParserOptions())
storm::jani::ModelFeatures getSupportedJaniFeatures(storm::builder::BuilderType const &builderType)
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)
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, storm::parser::ExplicitModelParserOptions const &options=storm::parser::ExplicitModelParserOptions())
void simplifyJaniModel(storm::jani::Model &model, std::vector< storm::jani::Property > &properties, storm::jani::ModelFeatures const &supportedFeatures)
std::vector< storm::jani::Property > parsePropertiesForSymbolicModelDescription(std::string const &inputString, storm::storage::SymbolicModelDescription const &modelDescription, boost::optional< std::set< std::string > > const &propertyFilter)
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)
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 > > performBisimulationMinimization(std::shared_ptr< storm::models::sparse::Model< ValueType > > const &model, std::vector< std::shared_ptr< storm::logic::Formula const > > const &formulas={}, storm::bisimulation::Options const &options={})
std::pair< storm::jani::Model, std::vector< storm::jani::Property > > parseJaniModel(std::string const &filename, boost::optional< std::vector< std::string > > const &propertyFilter)
std::vector< storm::jani::Property > substituteConstantsInProperties(std::vector< storm::jani::Property > const &properties, std::map< storm::expressions::Variable, storm::expressions::Expression > const &substitution)
void exportModel(std::shared_ptr< storm::models::sparse::Model< ValueType > > const &model, SymbolicInput const &input)
void parseSymbolicModelDescription(storm::settings::modules::IOSettings const &ioSettings, SymbolicInput &input)
std::shared_ptr< storm::models::ModelBase > buildModelExplicit(storm::settings::modules::IOSettings const &ioSettings, storm::settings::modules::BuildSettings const &buildSettings)
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)
auto applyValueType(ModelProcessingInformation::ValueType vt, auto const &callback)
std::shared_ptr< storm::models::ModelBase > buildPreprocessExportModel(SymbolicInput const &input, ModelProcessingInformation const &mpi)
SymbolicInput parseSymbolicInput()
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::shared_ptr< storm::models::ModelBase > buildModelDd(storm::Environment const &env, SymbolicInput const &input)
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)
ModelProcessingInformation getModelProcessingInformation(SymbolicInput const &input, std::shared_ptr< SymbolicInput > const &transformedJaniInput=nullptr)
Sets the model processing information based on the given input.
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)
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)
storm::builder::BuilderOptions createBuildOptionsSparseFromSettings(SymbolicInput const &input)
void ensureNoUndefinedPropertyConstants(std::vector< storm::jani::Property > const &properties)
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::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)
storm::builder::ExplicitModelBuilder< ValueType >::Options createExplorationOptionsFromSettings()
std::string toString(CompressionMode const &input)
SettingsType const & getModule()
Get module.
SettingsManager const & manager()
Retrieves the settings manager.
std::string orderKindtoString(OrderKind order)
Converts the given order to a string.
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
#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
BisimulationType bisimulationType
std::optional< storm::RationalNumber > tolerance
std::optional< StateType > explorationStateLimit
ExplorationOrder explorationOrder
RefinementMode refinementMode
bool useOriginalVariables
InitialPartitionMode initialPartitionMode
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 buildObservationValuations
Controls building of observation valuations.
bool buildStateValuations
Controls building of state valuations.