diff --git a/src/builder/ExplicitPrismModelBuilder.cpp b/src/builder/ExplicitPrismModelBuilder.cpp index d00054963..bb28b7dca 100644 --- a/src/builder/ExplicitPrismModelBuilder.cpp +++ b/src/builder/ExplicitPrismModelBuilder.cpp @@ -54,14 +54,46 @@ namespace storm { // Intentionally left empty. } + template - std::unique_ptr> ExplicitPrismModelBuilder::translateProgram(storm::prism::Program program, bool commandLabels, bool rewards, std::string const& rewardModelName, std::string const& constantDefinitionString) { - // Start by defining the undefined constants in the model. - // First, we need to parse the constant definition string. - std::map constantDefinitions = storm::utility::prism::parseConstantDefinitionString(program, constantDefinitionString); + ExplicitPrismModelBuilder::Options::Options() : buildCommandLabels(false), buildRewards(false), rewardModelName(), constantDefinitions() { + // Intentionally left empty. + } + + + template + ExplicitPrismModelBuilder::Options::Options(storm::logic::Formula const& formula) : buildCommandLabels(false), buildRewards(false), rewardModelName(), constantDefinitions() { + // FIXME: buildRewards should be something like formula.containsRewardOperator() + // FIXME: The necessary labels need to be computed properly. + } + + template + void ExplicitPrismModelBuilder::Options::addConstantDefinitionsFromString(storm::prism::Program const& program, std::string const& constantDefinitionString) { + std::map newConstantDefinitions = storm::utility::prism::parseConstantDefinitionString(program, constantDefinitionString); + + // If there is at least one constant that is defined, and the constant definition map does not yet exist, + // we need to create it. + if (!constantDefinitions && !newConstantDefinitions.empty()) { + constantDefinitions = std::map(); + } - storm::prism::Program preparedProgram = program.defineUndefinedConstants(constantDefinitions); + // Now insert all the entries that need to be defined. + for (auto const& entry : newConstantDefinitions) { + constantDefinitions.get().insert(entry); + } + } + + template + std::unique_ptr> ExplicitPrismModelBuilder::translateProgram(storm::prism::Program program, Options const& options) { + // Start by defining the undefined constants in the model. + storm::prism::Program preparedProgram; + if (options.constantDefinitions) { + preparedProgram = program.defineUndefinedConstants(options.constantDefinitions.get()); + } else { + preparedProgram = program; + } + // If the program still contains undefined constants, assemble an appropriate error message. if (preparedProgram.hasUndefinedConstants()) { std::vector> undefinedConstants = preparedProgram.getUndefinedConstants(); std::stringstream stream; @@ -85,17 +117,19 @@ namespace storm { storm::prism::RewardModel rewardModel = storm::prism::RewardModel(); // Select the appropriate reward model. - if (rewards) { + if (options.buildRewards) { // If a specific reward model was selected or one with the empty name exists, select it. - if (rewardModelName != "" || preparedProgram.hasRewardModel(rewardModelName)) { - rewardModel = preparedProgram.getRewardModel(rewardModelName); + if (options.rewardModelName) { + rewardModel = preparedProgram.getRewardModel(options.rewardModelName.get()); + } else if (preparedProgram.hasRewardModel("")) { + rewardModel = preparedProgram.getRewardModel(""); } else if (preparedProgram.hasRewardModel()) { // Otherwise, we select the first one. rewardModel = preparedProgram.getRewardModel(0); } } - ModelComponents modelComponents = buildModelComponents(preparedProgram, rewardModel, commandLabels); + ModelComponents modelComponents = buildModelComponents(preparedProgram, rewardModel, options.buildCommandLabels); std::unique_ptr> result; switch (program.getModelType()) { diff --git a/src/builder/ExplicitPrismModelBuilder.h b/src/builder/ExplicitPrismModelBuilder.h index ee35e4108..9abb5a2d7 100644 --- a/src/builder/ExplicitPrismModelBuilder.h +++ b/src/builder/ExplicitPrismModelBuilder.h @@ -14,6 +14,7 @@ #include "src/storage/expressions/SimpleValuation.h" #include "src/storage/expressions/ExprtkExpressionEvaluator.h" #include "src/storage/BitVectorHashMap.h" +#include "src/logic/Formulas.h" #include "src/models/AbstractModel.h" #include "src/models/AtomicPropositionsLabeling.h" #include "src/storage/SparseMatrix.h" @@ -119,6 +120,42 @@ namespace storm { boost::optional>> choiceLabeling; }; + struct Options { + /*! + * Creates an object representing the default building options. + */ + Options(); + + /*! Creates an object representing the suggested building options assuming that the given formula is the + * only one to check. + * + * @param formula The formula based on which to choose the building options. + */ + Options(storm::logic::Formula const& formula); + + /*! + * Sets the constants definitions from the given string. The string must be of the form 'X=a,Y=b,Z=c', + * etc. where X,Y,Z are the variable names and a,b,c are the values of the constants. + * + * @param program The program managing the constants that shall be defined. Note that the program itself + * is not modified whatsoever. + * @param constantDefinitionString The string from which to parse the constants' values. + */ + void addConstantDefinitionsFromString(storm::prism::Program const& program, std::string const& constantDefinitionString); + + // A flag that indicates whether or not command labels are to be built. + bool buildCommandLabels; + + // A flag that indicates whether or not a reward model is to be built. + bool buildRewards; + + // An optional string, that, if given, indicates which of the reward models is to be built. + boost::optional rewardModelName; + + // An optional mapping that, if given, contains defining expressions for undefined constants. + boost::optional> constantDefinitions; + }; + /*! * Convert the program given at construction time to an abstract model. The type of the model is the one * specified in the program. The given reward model name selects the rewards that the model will contain. @@ -129,7 +166,7 @@ namespace storm { * @param rewardModel The reward model that is to be built. * @return The explicit model that was given by the probabilistic program. */ - static std::unique_ptr> translateProgram(storm::prism::Program program, bool commandLabels = false, bool rewards = true, std::string const& rewardModelName = "", std::string const& constantDefinitionString = ""); + static std::unique_ptr> translateProgram(storm::prism::Program program, Options const& options = Options()); private: static void unpackStateIntoEvaluator(storm::storage::BitVector const& currentState, VariableInformation const& variableInformation, storm::expressions::ExprtkExpressionEvaluator& evaluator); diff --git a/src/logic/AtomicExpressionFormula.cpp b/src/logic/AtomicExpressionFormula.cpp index c0d5bb719..7f3a26b2c 100644 --- a/src/logic/AtomicExpressionFormula.cpp +++ b/src/logic/AtomicExpressionFormula.cpp @@ -26,6 +26,10 @@ namespace storm { return expression; } + void AtomicExpressionFormula::gatherAtomicExpressionFormulas(std::vector>& atomicExpressionFormulas) const { + atomicExpressionFormulas.push_back(std::dynamic_pointer_cast(this->shared_from_this())); + } + std::ostream& AtomicExpressionFormula::writeToStream(std::ostream& out) const { out << expression; return out; diff --git a/src/logic/AtomicExpressionFormula.h b/src/logic/AtomicExpressionFormula.h index 6bafddb57..61fa50aa2 100644 --- a/src/logic/AtomicExpressionFormula.h +++ b/src/logic/AtomicExpressionFormula.h @@ -24,6 +24,8 @@ namespace storm { virtual std::ostream& writeToStream(std::ostream& out) const override; + virtual void gatherAtomicExpressionFormulas(std::vector>& atomicExpressionFormulas) const override; + private: // The atomic expression represented by this node in the formula tree. storm::expressions::Expression expression; diff --git a/src/logic/AtomicLabelFormula.cpp b/src/logic/AtomicLabelFormula.cpp index 2d045d92d..01ceb0d44 100644 --- a/src/logic/AtomicLabelFormula.cpp +++ b/src/logic/AtomicLabelFormula.cpp @@ -26,6 +26,10 @@ namespace storm { return label; } + void AtomicLabelFormula::gatherAtomicLabelFormulas(std::vector>& atomicExpressionFormulas) const { + atomicExpressionFormulas.push_back(std::dynamic_pointer_cast(this->shared_from_this())); + } + std::ostream& AtomicLabelFormula::writeToStream(std::ostream& out) const { out << "\"" << label << "\""; return out; diff --git a/src/logic/AtomicLabelFormula.h b/src/logic/AtomicLabelFormula.h index 00e9f9623..554de08df 100644 --- a/src/logic/AtomicLabelFormula.h +++ b/src/logic/AtomicLabelFormula.h @@ -23,6 +23,8 @@ namespace storm { std::string const& getLabel() const; + virtual void gatherAtomicLabelFormulas(std::vector>& atomicLabelFormulas) const override; + virtual std::ostream& writeToStream(std::ostream& out) const override; private: diff --git a/src/logic/BinaryPathFormula.cpp b/src/logic/BinaryPathFormula.cpp index a554b204e..03c260515 100644 --- a/src/logic/BinaryPathFormula.cpp +++ b/src/logic/BinaryPathFormula.cpp @@ -33,5 +33,13 @@ namespace storm { Formula const& BinaryPathFormula::getRightSubformula() const { return *rightSubformula; } + + void BinaryPathFormula::gatherAtomicExpressionFormulas(std::vector>& atomicExpressionFormulas) const { + this->getLeftSubformula().gatherAtomicExpressionFormulas(atomicExpressionFormulas); + } + + void BinaryPathFormula::gatherAtomicLabelFormulas(std::vector>& atomicLabelFormulas) const { + this->getLeftSubformula().gatherAtomicLabelFormulas(atomicLabelFormulas); + } } } \ No newline at end of file diff --git a/src/logic/BinaryPathFormula.h b/src/logic/BinaryPathFormula.h index 6dcfd3783..90071fd9c 100644 --- a/src/logic/BinaryPathFormula.h +++ b/src/logic/BinaryPathFormula.h @@ -25,6 +25,9 @@ namespace storm { Formula const& getLeftSubformula() const; Formula const& getRightSubformula() const; + virtual void gatherAtomicExpressionFormulas(std::vector>& atomicExpressionFormulas) const override; + virtual void gatherAtomicLabelFormulas(std::vector>& atomicLabelFormulas) const override; + private: std::shared_ptr leftSubformula; std::shared_ptr rightSubformula; diff --git a/src/logic/BinaryStateFormula.cpp b/src/logic/BinaryStateFormula.cpp index 1a03cd887..e175b3f7c 100644 --- a/src/logic/BinaryStateFormula.cpp +++ b/src/logic/BinaryStateFormula.cpp @@ -33,5 +33,13 @@ namespace storm { Formula const& BinaryStateFormula::getRightSubformula() const { return *rightSubformula; } + + void BinaryStateFormula::gatherAtomicExpressionFormulas(std::vector>& atomicExpressionFormulas) const { + this->getLeftSubformula().gatherAtomicExpressionFormulas(atomicExpressionFormulas); + } + + void BinaryStateFormula::gatherAtomicLabelFormulas(std::vector>& atomicLabelFormulas) const { + this->getLeftSubformula().gatherAtomicLabelFormulas(atomicLabelFormulas); + } } } \ No newline at end of file diff --git a/src/logic/BinaryStateFormula.h b/src/logic/BinaryStateFormula.h index 2965c83da..570753f40 100644 --- a/src/logic/BinaryStateFormula.h +++ b/src/logic/BinaryStateFormula.h @@ -23,6 +23,9 @@ namespace storm { Formula const& getLeftSubformula() const; Formula const& getRightSubformula() const; + virtual void gatherAtomicExpressionFormulas(std::vector>& atomicExpressionFormulas) const override; + virtual void gatherAtomicLabelFormulas(std::vector>& atomicLabelFormulas) const override; + private: std::shared_ptr leftSubformula; std::shared_ptr rightSubformula; diff --git a/src/logic/Formula.cpp b/src/logic/Formula.cpp index e0e25c5ba..3141b4654 100644 --- a/src/logic/Formula.cpp +++ b/src/logic/Formula.cpp @@ -350,6 +350,18 @@ namespace storm { return dynamic_cast(*this); } + std::vector> Formula::getAtomicExpressionFormulas() const { + std::vector> result; + this->gatherAtomicExpressionFormulas(result); + return result; + } + + std::vector> Formula::getAtomicLabelFormulas() const { + std::vector> result; + this->gatherAtomicLabelFormulas(result); + return result; + } + std::shared_ptr Formula::asSharedPointer() { return this->shared_from_this(); } @@ -358,6 +370,14 @@ namespace storm { return this->shared_from_this(); } + void Formula::gatherAtomicExpressionFormulas(std::vector>& atomicExpressionFormulas) const { + return; + } + + void Formula::gatherAtomicLabelFormulas(std::vector>& atomicExpressionFormulas) const { + return; + } + std::ostream& operator<<(std::ostream& out, Formula const& formula) { return formula.writeToStream(out); } diff --git a/src/logic/Formula.h b/src/logic/Formula.h index ba0b240c3..f687865f7 100644 --- a/src/logic/Formula.h +++ b/src/logic/Formula.h @@ -163,11 +163,17 @@ namespace storm { RewardOperatorFormula& asRewardOperatorFormula(); RewardOperatorFormula const& asRewardOperatorFormula() const; + std::vector> getAtomicExpressionFormulas() const; + std::vector> getAtomicLabelFormulas() const; + std::shared_ptr asSharedPointer(); std::shared_ptr asSharedPointer() const; virtual std::ostream& writeToStream(std::ostream& out) const = 0; + virtual void gatherAtomicExpressionFormulas(std::vector>& atomicExpressionFormulas) const; + virtual void gatherAtomicLabelFormulas(std::vector>& atomicExpressionFormulas) const; + private: // Currently empty. }; diff --git a/src/logic/ReachabilityRewardFormula.cpp b/src/logic/ReachabilityRewardFormula.cpp index a3d85dca8..4312dc72c 100644 --- a/src/logic/ReachabilityRewardFormula.cpp +++ b/src/logic/ReachabilityRewardFormula.cpp @@ -14,6 +14,14 @@ namespace storm { return *subformula; } + void ReachabilityRewardFormula::gatherAtomicExpressionFormulas(std::vector>& atomicExpressionFormulas) const { + this->getSubformula().gatherAtomicExpressionFormulas(atomicExpressionFormulas); + } + + void ReachabilityRewardFormula::gatherAtomicLabelFormulas(std::vector>& atomicLabelFormulas) const { + this->getSubformula().gatherAtomicLabelFormulas(atomicLabelFormulas); + } + std::ostream& ReachabilityRewardFormula::writeToStream(std::ostream& out) const { out << "F "; this->getSubformula().writeToStream(out); diff --git a/src/logic/ReachabilityRewardFormula.h b/src/logic/ReachabilityRewardFormula.h index 7bc9564e8..357d2f680 100644 --- a/src/logic/ReachabilityRewardFormula.h +++ b/src/logic/ReachabilityRewardFormula.h @@ -20,6 +20,9 @@ namespace storm { Formula const& getSubformula() const; + virtual void gatherAtomicExpressionFormulas(std::vector>& atomicExpressionFormulas) const override; + virtual void gatherAtomicLabelFormulas(std::vector>& atomicLabelFormulas) const override; + virtual std::ostream& writeToStream(std::ostream& out) const override; private: diff --git a/src/logic/UnaryPathFormula.cpp b/src/logic/UnaryPathFormula.cpp index b74e159c7..1e38f754d 100644 --- a/src/logic/UnaryPathFormula.cpp +++ b/src/logic/UnaryPathFormula.cpp @@ -29,5 +29,13 @@ namespace storm { Formula const& UnaryPathFormula::getSubformula() const { return *subformula; } + + void UnaryPathFormula::gatherAtomicExpressionFormulas(std::vector>& atomicExpressionFormulas) const { + this->getSubformula().gatherAtomicExpressionFormulas(atomicExpressionFormulas); + } + + void UnaryPathFormula::gatherAtomicLabelFormulas(std::vector>& atomicLabelFormulas) const { + this->getSubformula().gatherAtomicLabelFormulas(atomicLabelFormulas); + } } } \ No newline at end of file diff --git a/src/logic/UnaryPathFormula.h b/src/logic/UnaryPathFormula.h index f77310549..b96d78f03 100644 --- a/src/logic/UnaryPathFormula.h +++ b/src/logic/UnaryPathFormula.h @@ -24,6 +24,9 @@ namespace storm { Formula const& getSubformula() const; + virtual void gatherAtomicExpressionFormulas(std::vector>& atomicExpressionFormulas) const override; + virtual void gatherAtomicLabelFormulas(std::vector>& atomicLabelFormulas) const override; + private: std::shared_ptr subformula; }; diff --git a/src/logic/UnaryStateFormula.cpp b/src/logic/UnaryStateFormula.cpp index 08d817cf4..f775e9a4b 100644 --- a/src/logic/UnaryStateFormula.cpp +++ b/src/logic/UnaryStateFormula.cpp @@ -33,5 +33,14 @@ namespace storm { Formula const& UnaryStateFormula::getSubformula() const { return *subformula; } + + void UnaryStateFormula::gatherAtomicExpressionFormulas(std::vector>& atomicExpressionFormulas) const { + this->getSubformula().gatherAtomicExpressionFormulas(atomicExpressionFormulas); + } + + void UnaryStateFormula::gatherAtomicLabelFormulas(std::vector>& atomicLabelFormulas) const { + this->getSubformula().gatherAtomicLabelFormulas(atomicLabelFormulas); + } + } } \ No newline at end of file diff --git a/src/logic/UnaryStateFormula.h b/src/logic/UnaryStateFormula.h index a87330af3..d9fc4026b 100644 --- a/src/logic/UnaryStateFormula.h +++ b/src/logic/UnaryStateFormula.h @@ -23,6 +23,9 @@ namespace storm { Formula const& getSubformula() const; + virtual void gatherAtomicExpressionFormulas(std::vector>& atomicExpressionFormulas) const override; + virtual void gatherAtomicLabelFormulas(std::vector>& atomicLabelFormulas) const override; + private: std::shared_ptr subformula; }; diff --git a/src/modelchecker/reachability/SparseDtmcEliminationModelChecker.cpp b/src/modelchecker/reachability/SparseDtmcEliminationModelChecker.cpp index b265d08fd..c74fc06e4 100644 --- a/src/modelchecker/reachability/SparseDtmcEliminationModelChecker.cpp +++ b/src/modelchecker/reachability/SparseDtmcEliminationModelChecker.cpp @@ -30,16 +30,10 @@ namespace storm { bool SparseDtmcEliminationModelChecker::canHandle(storm::logic::Formula const& formula) const { if (formula.isProbabilityOperatorFormula()) { storm::logic::ProbabilityOperatorFormula const& probabilityOperatorFormula = formula.asProbabilityOperatorFormula(); - // The probability operator must not have a bound. - if (!probabilityOperatorFormula.hasBound()) { - return this->canHandle(probabilityOperatorFormula.getSubformula()); - } + return this->canHandle(probabilityOperatorFormula.getSubformula()); } else if (formula.isRewardOperatorFormula()) { storm::logic::RewardOperatorFormula const& rewardOperatorFormula = formula.asRewardOperatorFormula(); - // The reward operator must not have a bound. - if (!rewardOperatorFormula.hasBound()) { - return this->canHandle(rewardOperatorFormula.getSubformula()); - } + return this->canHandle(rewardOperatorFormula.getSubformula()); } else if (formula.isUntilFormula() || formula.isEventuallyFormula()) { if (formula.isUntilFormula()) { storm::logic::UntilFormula const& untilFormula = formula.asUntilFormula(); @@ -193,6 +187,8 @@ namespace storm { template std::unique_ptr SparseDtmcEliminationModelChecker::computeConditionalProbabilities(storm::logic::ConditionalPathFormula const& pathFormula, bool qualitative, boost::optional const& optimalityType) { + std::chrono::high_resolution_clock::time_point totalTimeStart = std::chrono::high_resolution_clock::now(); + // Retrieve the appropriate bitvectors by model checking the subformulas. STORM_LOG_THROW(pathFormula.getLeftSubformula().isEventuallyFormula(), storm::exceptions::InvalidPropertyException, "Expected 'eventually' formula."); STORM_LOG_THROW(pathFormula.getRightSubformula().isEventuallyFormula(), storm::exceptions::InvalidPropertyException, "Expected 'eventually' formula."); @@ -218,6 +214,7 @@ namespace storm { // If the initial state is known to have probability 1 of satisfying the condition, we can apply regular model checking. if (model.getInitialStates().isSubsetOf(statesWithProbability1)) { + STORM_LOG_INFO("The condition holds with probability 1, so the regular reachability probability is computed."); std::shared_ptr trueFormula = std::make_shared(true); std::shared_ptr untilFormula = std::make_shared(trueFormula, pathFormula.getLeftSubformula().asSharedPointer()); return this->computeUntilProbabilities(*untilFormula); @@ -276,8 +273,11 @@ namespace storm { STORM_LOG_INFO("Computing conditional probilities." << std::endl); STORM_LOG_INFO("Eliminating " << states.size() << " states using the state elimination technique." << std::endl); boost::optional> missingStateRewards; + std::chrono::high_resolution_clock::time_point conversionStart = std::chrono::high_resolution_clock::now(); FlexibleSparseMatrix flexibleMatrix = getFlexibleSparseMatrix(submatrix); FlexibleSparseMatrix flexibleBackwardTransitions = getFlexibleSparseMatrix(submatrixTransposed, true); + std::chrono::high_resolution_clock::time_point conversionEnd = std::chrono::high_resolution_clock::now(); + std::chrono::high_resolution_clock::time_point modelCheckingStart = std::chrono::high_resolution_clock::now(); for (auto const& state : states) { eliminateState(flexibleMatrix, oneStepProbabilities, state, flexibleBackwardTransitions, missingStateRewards); } @@ -373,6 +373,25 @@ namespace storm { numerator += trans1.getValue() * additiveTerm; } } + std::chrono::high_resolution_clock::time_point modelCheckingEnd = std::chrono::high_resolution_clock::now(); + std::chrono::high_resolution_clock::time_point totalTimeEnd = std::chrono::high_resolution_clock::now(); + + if (storm::settings::generalSettings().isShowStatisticsSet()) { + std::chrono::high_resolution_clock::duration conversionTime = conversionEnd - conversionStart; + std::chrono::milliseconds conversionTimeInMilliseconds = std::chrono::duration_cast(conversionTime); + std::chrono::high_resolution_clock::duration modelCheckingTime = modelCheckingEnd - modelCheckingStart; + std::chrono::milliseconds modelCheckingTimeInMilliseconds = std::chrono::duration_cast(modelCheckingTime); + std::chrono::high_resolution_clock::duration totalTime = totalTimeEnd - totalTimeStart; + std::chrono::milliseconds totalTimeInMilliseconds = std::chrono::duration_cast(totalTime); + + STORM_PRINT_AND_LOG(std::endl); + STORM_PRINT_AND_LOG("Time breakdown:" << std::endl); + STORM_PRINT_AND_LOG(" * time for conversion: " << conversionTimeInMilliseconds.count() << "ms" << std::endl); + STORM_PRINT_AND_LOG(" * time for checking: " << modelCheckingTimeInMilliseconds.count() << "ms" << std::endl); + STORM_PRINT_AND_LOG("------------------------------------------" << std::endl); + STORM_PRINT_AND_LOG(" * total time: " << totalTimeInMilliseconds.count() << "ms" << std::endl); + STORM_PRINT_AND_LOG(std::endl); + } return std::unique_ptr(new ExplicitQuantitativeCheckResult(initialState, numerator / denominator)); } @@ -395,11 +414,11 @@ namespace storm { template ValueType SparseDtmcEliminationModelChecker::computeReachabilityValue(storm::storage::SparseMatrix const& transitionMatrix, std::vector& oneStepProbabilities, storm::storage::SparseMatrix const& backwardTransitions, storm::storage::BitVector const& initialStates, storm::storage::BitVector const& phiStates, storm::storage::BitVector const& psiStates, boost::optional>& stateRewards, boost::optional> const& statePriorities) { std::chrono::high_resolution_clock::time_point totalTimeStart = std::chrono::high_resolution_clock::now(); - std::chrono::high_resolution_clock::time_point conversionStart = std::chrono::high_resolution_clock::now(); // Create a bit vector that represents the subsystem of states we still have to eliminate. storm::storage::BitVector subsystem = storm::storage::BitVector(transitionMatrix.getRowCount(), true); + std::chrono::high_resolution_clock::time_point conversionStart = std::chrono::high_resolution_clock::now(); // Then, we convert the reduced matrix to a more flexible format to be able to perform state elimination more easily. FlexibleSparseMatrix flexibleMatrix = getFlexibleSparseMatrix(transitionMatrix); FlexibleSparseMatrix flexibleBackwardTransitions = getFlexibleSparseMatrix(backwardTransitions, true); diff --git a/src/storage/prism/Program.cpp b/src/storage/prism/Program.cpp index e89ff8a3c..f2b2f1078 100644 --- a/src/storage/prism/Program.cpp +++ b/src/storage/prism/Program.cpp @@ -11,7 +11,7 @@ namespace storm { namespace prism { - Program::Program(std::shared_ptr manager, ModelType modelType, std::vector const& constants, std::vector const& globalBooleanVariables, std::vector const& globalIntegerVariables, std::vector const& formulas, std::vector const& modules, std::map const& actionToIndexMap, std::vector const& rewardModels, bool fixInitialConstruct, storm::prism::InitialConstruct const& initialConstruct, std::vector