3#include <boost/algorithm/string/join.hpp>
48 boost::optional<storm::storage::SymbolicModelDescription>
model;
65 boost::optional<std::vector<std::string>> propertyFilter;
70 propertyFilter = boost::none;
73 propertyFilter = std::vector<std::string>();
76 input.
model = std::move(janiInput.first);
78 input.
properties = std::move(janiInput.second);
81 modelParsingWatch.
stop();
82 STORM_PRINT(
"Time for model input parsing: " << modelParsingWatch <<
".\n\n");
87 boost::optional<std::set<std::string>>
const& propertyFilter) {
89 std::vector<storm::jani::Property> newProperties;
107 input.
model = std::move(janiInput.first);
108 input.
properties = std::move(janiInput.second);
109 modelParsingWatch.
stop();
110 STORM_PRINT(
"Time for model input parsing: " << modelParsingWatch <<
".\n\n");
118 input.
model = input.
model.get().preprocess(constantDefinitions);
128 if (ioSettings.isQvbsInputSet()) {
170 STORM_LOG_THROW(input.
model.is_initialized(), storm::exceptions::InvalidArgumentException,
"Automatic engine requires a JANI input model.");
171 STORM_LOG_THROW(input.
model->isJaniModel(), storm::exceptions::InvalidArgumentException,
"Automatic engine requires a JANI input model.");
172 std::vector<storm::jani::Property>
const& properties =
174 STORM_LOG_THROW(!properties.empty(), storm::exceptions::InvalidArgumentException,
"Automatic engine requires a property.");
176 "Automatic engine does not support decisions based on multiple properties. Only the first property will be considered.");
179 if (hints.isNumberStatesSet()) {
180 as.
predict(input.
model->asJaniModel(), properties.front(), hints.getNumberStates());
182 as.
predict(input.
model->asJaniModel(), properties.front());
203 std::shared_ptr<SymbolicInput>
const& transformedJaniInput =
nullptr) {
211 mpi.
engine = coreSettings.getEngine();
217 if (generalSettings.isParametricSet()) {
219 }
else if (generalSettings.isExactSet()) {
229 if (input.
model->isJaniModel()) {
240 janiInput.
model = modelAndProperties.first;
241 if (!modelAndProperties.second.empty()) {
247 if (transformedJaniInput) {
249 *transformedJaniInput = std::move(janiInput);
256 auto checkCompatibleSettings = [&mpi, &input] {
275 STORM_LOG_WARN(
"The settings picked by the automatic engine (engine="
277 <<
") are incompatible with this model. Falling back to default settings.");
297 "Dd-based model builder for Markov Automata is only available for JANI models, automatically converting the input model.");
303 if (bisimulationSettings.useExactArithmeticInDdBisimulation()) {
309 STORM_LOG_WARN(
"Requested using exact arithmetic in Dd bisimulation but no dd bisimulation is applied.");
314 mpi.
ddType = coreSettings.getDdLibraryType();
318 STORM_LOG_INFO(
"Switching to DD library sylvan to allow for rational arithmetic.");
325auto castAndApply(std::shared_ptr<storm::models::ModelBase>
const& model,
auto const& callback) {
329 auto castAndApplyImpl = [&model, &callback]<
typename TargetModelType> {
330 auto res = model->template as<TargetModelType>();
332 return callback(res);
336 auto castAndApplyVT = [&]<
typename ValueType> {
337 if (model->isSparseModel()) {
340 auto ddType = model->getDdType();
341 STORM_LOG_ASSERT(model->isSymbolicModel() && ddType.has_value(),
"Unexpected model representation.");
344 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Symbolic interval models are currently not supported.");
347 if (*ddType == CUDD) {
348 if constexpr (std::is_same_v<ValueType, double>) {
359 if (model->supportsParameters()) {
361 }
else if (model->supportsUncertainty()) {
362 if (model->isExact()) {
368 if (model->isExact()) {
369 return castAndApplyVT.template operator()<storm::RationalNumber>();
371 return castAndApplyVT.template operator()<
double>();
379 case FinitePrecision:
380 return callback.template operator()<
double>();
382 return callback.template operator()<storm::RationalNumber>();
386 STORM_LOG_THROW(
false, storm::exceptions::UnexpectedException,
"Unexpected value type.");
394 STORM_LOG_THROW(vt == FinitePrecision, storm::exceptions::UnexpectedException,
"Unexpected value type for DD library Cudd.");
395 return callback.template operator()<CUDD,
double>();
398 case FinitePrecision:
399 return callback.template operator()<
Sylvan,
double>();
401 return callback.template operator()<
Sylvan, storm::RationalNumber>();
406 STORM_LOG_THROW(
false, storm::exceptions::UnexpectedException,
"Unexpected DDType or value type.");
411 for (
auto const& property : properties) {
412 std::set<storm::expressions::Variable> usedUndefinedConstants =
property.getUndefinedConstants();
413 if (!usedUndefinedConstants.empty()) {
414 std::vector<std::string> undefinedConstantsNames;
415 for (
auto const& constant : usedUndefinedConstants) {
416 undefinedConstantsNames.emplace_back(constant.getName());
419 false, storm::exceptions::InvalidArgumentException,
420 "The property '" << property <<
" still refers to the undefined constants " << boost::algorithm::join(undefinedConstantsNames,
",") <<
".");
431 if (ioSettings.isPropertiesAsMultiSet()) {
433 "Can not translate properties to multi-objective formula because no properties were specified.");
440 std::string constantDefinitionString = ioSettings.getConstantDefinitionString();
441 std::map<storm::expressions::Variable, storm::expressions::Expression> constantDefinitions;
443 constantDefinitions = output.
model.get().parseConstantDefinitions(constantDefinitionString);
444 output.
model = output.
model.get().preprocess(constantDefinitions);
450 auto transformedJani = std::make_shared<SymbolicInput>();
454 if (output.
model && output.
model.get().isPrismProgram()) {
456 if (transformedJani->model) {
458 output = std::move(*transformedJani);
463 output.
model = modelAndProperties.first;
465 if (!modelAndProperties.second.empty()) {
472 if (output.
model && output.
model.get().isJaniModel()) {
477 if (buildSettings.isLocationEliminationSet()) {
478 auto locationHeuristic = buildSettings.getLocationEliminationLocationHeuristic();
479 auto edgesHeuristic = buildSettings.getLocationEliminationEdgesHeuristic();
481 locationHeuristic, edgesHeuristic));
485 return {output, mpi};
488inline std::vector<std::shared_ptr<storm::logic::Formula const>>
createFormulasToRespect(std::vector<storm::jani::Property>
const& properties) {
491 for (
auto const& property : properties) {
492 if (!property.getFilter().getStatesFormula()->isInitialFormula()) {
493 result.push_back(property.getFilter().getStatesFormula());
500template<storm::dd::DdType DdType,
typename ValueType>
508 buildSettings.isBuildFullModelSet(), !buildSettings.isApplyNoMaximumProgressAssumptionSet(),
509 !buildSettings.isDontFixDeadlocksSet());
522 if (counterexampleGeneratorSettings.isCounterexampleSet()) {
523 buildChoiceOrigins |= counterexampleGeneratorSettings.isMinimalCommandSetGenerationSet();
528 if (buildSettings.isApplyNoMaximumProgressAssumptionSet()) {
532 if (buildSettings.isExplorationChecksSet()) {
538 if (buildSettings.isBuildFullModelSet()) {
545 if (buildSettings.isAddOverlappingGuardsLabelSet()) {
550 if (ioSettings.isComputeExpectedVisitingTimesSet() || ioSettings.isComputeSteadyStateDistributionSet()) {
562template<
typename ValueType>
567 explorationOptions.
fixDeadlocks = !buildSettings.isDontFixDeadlocksSet();
568 if (buildSettings.isExplorationStateLimitSet()) {
571 return explorationOptions;
574template<
typename ValueType>
578 input.
model->asPrismProgram().hasIntervalUpdates()) {
580 bool constexpr IsDoubleInterval = std::is_same_v<ValueType, storm::IntervalBaseType<storm::Interval>>;
581 bool constexpr IsRationalInterval = std::is_same_v<ValueType, storm::IntervalBaseType<storm::RationalInterval>>;
582 STORM_LOG_THROW(IsDoubleInterval || IsRationalInterval, storm::exceptions::NotSupportedException,
583 "Can not build interval model for the provided value type.");
584 using IntervalType = std::conditional_t<IsDoubleInterval, storm::Interval, storm::RationalInterval>;
591template<
typename ValueType>
594 std::shared_ptr<storm::models::ModelBase> result;
609 if constexpr (std::is_same_v<ValueType, double>) {
611 }
else if constexpr (std::is_same_v<ValueType, storm::RationalNumber>) {
612 valueType = Rational;
614 static_assert(std::is_same_v<ValueType, storm::RationalFunction>,
"Unexpected value type.");
615 valueType = Parametric;
623 if constexpr (std::is_same_v<ValueType, storm::RationalFunction>) {
624 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"RationalFunction currently not supported for UMB models.");
625 }
else if constexpr (std::is_same_v<ValueType, storm::RationalNumber>) {
628 static_assert(std::is_same_v<ValueType, double>,
"Unhandled value type.");
646 std::shared_ptr<storm::models::ModelBase> result;
651 [&input, &mpi]<
storm::dd::DdType DD,
typename VT>() { return buildModelDd<DD, VT>(mpi.env, input); });
654 auto options = createBuildOptionsSparseFromSettings(input);
655 return buildModelSparse<VT>(input, options);
660 "Can only use sparse engine with explicit input.");
662 return buildModelExplicit<VT>(ioSettings, storm::settings::getModule<storm::settings::modules::BuildSettings>());
666 modelBuildingWatch.
stop();
668 STORM_PRINT(
"Time for model construction: " << modelBuildingWatch <<
".\n\n");
674template<
typename ValueType>
680 std::shared_ptr<storm::models::sparse::Model<ValueType>> result = model;
682 STORM_LOG_WARN_COND(!buildSettings.isCheckZenoSet() || !model->containsZenoCycle(),
"MA contains a Zeno cycle. Model checking results cannot be trusted.");
684 if (model->isConvertibleToCtmc()) {
686 result = model->convertToCtmc();
689 if (transformationSettings.isChainEliminationSet()) {
692 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Chain elimination not supported for interval models.");
696 transformationSettings.getLabelBehavior())
704template<
typename ValueType>
718template<
typename ValueType>
722 "Converting value types for sparse engine is not supported.");
727 std::pair<std::shared_ptr<storm::models::sparse::Model<ValueType>>,
bool> result = std::make_pair(model,
false);
729 if (
auto order = transformationSettings.getModelPermutation(); order.has_value()) {
730 auto seed = transformationSettings.getModelPermutationSeed();
732 << (seed.has_value() ?
" with seed " + std::to_string(seed.value()) :
"") <<
".\n");
734 result.second =
true;
735 STORM_PRINT_AND_LOG(
"Transition matrix hash after permuting: " << result.first->getTransitionMatrix().hash() <<
".\n");
740 result.second =
true;
745 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Bisimulation not supported for interval models.");
748 result.second =
true;
752 if (transformationSettings.isToDiscreteTimeModelSet()) {
754 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Transformation to discrete time model not supported for interval models.");
758 !model->hasRewardModel(
"_time"),
759 "Scheduled transformation to discrete time model, but a reward model named '_time' is already present in this model. We might take "
760 "the wrong reward model later.");
764 result.second =
true;
768 if (transformationSettings.isToNondeterministicModelSet()) {
770 result.second =
true;
776template<
typename ValueType>
780 if (ioSettings.isExportBuildSet()) {
782 modelExportWatch.
start();
783 STORM_PRINT(
"\nExporting model to '" << ioSettings.getExportBuildFilename() <<
"'.\n");
784 switch (ioSettings.getExportBuildFormat()) {
791 options.
compression = ioSettings.getCompressionMode();
792 if (ioSettings.isExportDigitsSet()) {
796 input.
model ? input.
model.get().getParameterNames() : std::vector<std::string>());
804 options.
compression = ioSettings.getCompressionMode();
810 "Exporting sparse models in " <<
storm::io::toString(ioSettings.getExportBuildFormat()) <<
" format is not supported.");
812 modelExportWatch.
stop();
813 STORM_PRINT(
"Time for model export: " << modelExportWatch <<
".\n\n");
818 if (ioSettings.isExportExplicitSet()) {
820 input.
model ? input.
model.get().getParameterNames() : std::vector<std::string>(),
821 !ioSettings.isExplicitExportPlaceholdersDisabled());
824 STORM_LOG_THROW(!ioSettings.isExportDdSet(), storm::exceptions::NotSupportedException,
"Exporting in drdd format is only supported for DDs.");
826 if (ioSettings.isExportDotSet()) {
831template<storm::dd::DdType DdType,
typename ValueType>
835 if (ioSettings.isExportBuildSet()) {
836 switch (ioSettings.getExportBuildFormat()) {
845 "Exporting symbolic models in " <<
storm::io::toString(ioSettings.getExportBuildFormat()) <<
" format is not supported.");
851 STORM_LOG_THROW(!ioSettings.isExportExplicitSet(), storm::exceptions::NotSupportedException,
852 "Exporting in drn format is only supported for sparse models.");
854 if (ioSettings.isExportDdSet()) {
858 if (ioSettings.isExportDotSet()) {
863template<storm::dd::DdType DdType,
typename ValueType>
864typename std::enable_if<DdType != storm::dd::DdType::Sylvan && !std::is_same<ValueType, double>::value, std::shared_ptr<storm::models::Model<ValueType>>>::type
869template<storm::dd::DdType DdType,
typename ValueType>
870typename std::enable_if<DdType == storm::dd::DdType::Sylvan || std::is_same<ValueType, double>::value, std::shared_ptr<storm::models::Model<ValueType>>>::type
872 auto ma = model->template as<storm::models::symbolic::MarkovAutomaton<DdType, ValueType>>();
873 if (!ma->isClosed()) {
874 return std::make_shared<storm::models::symbolic::MarkovAutomaton<DdType, ValueType>>(ma->close());
880template<storm::dd::DdType DdType,
typename ValueType,
typename ExportValueType = ValueType>
885 "Weak bisimulation is currently not supported on DDs. Falling back to strong bisimulation.");
890 STORM_LOG_INFO(
"Setting bisimulation quotient format to 'sparse'.");
904 ddBisimulationOptions);
907template<
typename ExportValueType, storm::dd::DdType DdType,
typename ValueType>
911 std::pair<std::shared_ptr<storm::models::Model<ValueType>>,
bool> intermediateResult = std::make_pair(model,
false);
915 intermediateResult.second =
true;
918 std::unique_ptr<std::pair<std::shared_ptr<storm::models::Model<ExportValueType>>,
bool>> result;
919 auto symbolicModel = intermediateResult.first->template as<storm::models::symbolic::Model<DdType, ValueType>>();
921 std::shared_ptr<storm::models::Model<ExportValueType>> newModel =
923 result = std::make_unique<std::pair<std::shared_ptr<storm::models::Model<ExportValueType>>,
bool>>(newModel,
true);
925 result = std::make_unique<std::pair<std::shared_ptr<storm::models::Model<ExportValueType>>,
bool>>(
926 symbolicModel->template toValueType<ExportValueType>(), !std::is_same<ValueType, ExportValueType>::value);
931 result->second =
true;
933 std::shared_ptr<storm::models::symbolic::Model<DdType, ExportValueType>> symbolicModel =
934 result->first->template as<storm::models::symbolic::Model<DdType, ExportValueType>>();
935 std::vector<std::shared_ptr<storm::logic::Formula const>> formulas;
936 for (
auto const& property : input.
properties) {
937 formulas.emplace_back(property.getRawFormula());
940 STORM_LOG_THROW(result, storm::exceptions::NotSupportedException,
"The translation to a sparse model is not supported for the given model type.");
946template<storm::dd::DdType DdType,
typename ValueType>
951 if constexpr (std::is_same_v<ValueType, VT> ||
952 (DdType == storm::dd::DdType::Sylvan && std::is_same_v<ValueType, storm::RationalNumber> && std::is_same_v<VT, double>)) {
953 return preprocessDdModelImpl<VT>(model, input, mpi);
955 STORM_LOG_THROW(false, storm::exceptions::NotSupportedException,
956 "Unexpected combination of DD library, build value type, and verification value type.");
969 std::shared_ptr<storm::models::ModelBase> model;
970 if (!buildSettings.isNoBuildModelSet()) {
977 model->printModelInformationToStream(std::cout);
981 preprocessingWatch.
stop();
982 if (preprocessingResult.second) {
983 STORM_PRINT(
"\nTime for model preprocessing: " << preprocessingWatch <<
".\n\n");
984 model = preprocessingResult.first;
985 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.
This class represents the bisimulation settings.
storm::dd::bisimulation::ReuseMode getReuseMode() const
Retrieves the selected reuse mode.
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 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 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 > > 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::optional< double > const &tolerance=std::nullopt)
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::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::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 > 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::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::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())
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)
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 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 > 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)
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)
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)
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.
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.
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.