From b3178e17f6ec06120a9652ba5a166687e6773e47 Mon Sep 17 00:00:00 2001 From: dehnert <dehnert@cs.rwth-aachen.de> Date: Fri, 21 Aug 2015 17:25:54 +0200 Subject: [PATCH] more bug fixes Former-commit-id: 0b33b30efa15b6f7ed6892eb9842ee2da45aaa61 --- src/builder/DdPrismModelBuilder.cpp | 119 +++++++++--------- src/builder/DdPrismModelBuilder.h | 4 +- src/builder/ExplicitPrismModelBuilder.cpp | 24 ++-- .../csl/helper/HybridCtmcCslHelper.cpp | 5 +- .../csl/helper/SparseCtmcCslHelper.cpp | 6 +- .../prctl/helper/HybridDtmcPrctlHelper.cpp | 2 + .../prctl/helper/HybridMdpPrctlHelper.cpp | 2 + .../prctl/helper/SymbolicDtmcPrctlHelper.cpp | 2 + .../SparsePropositionalModelChecker.cpp | 1 + .../SymbolicPropositionalModelChecker.cpp | 1 + .../SparseDtmcEliminationModelChecker.cpp | 1 + src/models/sparse/Ctmc.cpp | 2 +- src/models/sparse/DeterministicModel.cpp | 1 + src/models/sparse/Dtmc.cpp | 2 +- src/models/sparse/MarkovAutomaton.cpp | 2 +- src/models/sparse/Mdp.cpp | 2 + src/models/sparse/Model.cpp | 2 + src/models/sparse/Model.h | 3 +- src/models/sparse/NondeterministicModel.cpp | 2 + src/models/sparse/StandardRewardModel.cpp | 41 +++++- src/models/sparse/StandardRewardModel.h | 17 +++ src/models/sparse/StochasticTwoPlayerGame.cpp | 2 + src/models/symbolic/Ctmc.cpp | 3 +- src/models/symbolic/DeterministicModel.cpp | 2 + src/models/symbolic/Dtmc.cpp | 3 +- src/models/symbolic/Mdp.cpp | 4 +- src/models/symbolic/Model.cpp | 2 + src/models/symbolic/Model.h | 4 +- src/models/symbolic/NondeterministicModel.cpp | 3 +- src/models/symbolic/StandardRewardModel.cpp | 17 ++- src/models/symbolic/StandardRewardModel.h | 13 +- .../symbolic/StochasticTwoPlayerGame.cpp | 3 +- src/parser/AutoParser.cpp | 2 + src/parser/DeterministicModelParser.cpp | 2 + src/parser/MarkovAutomatonParser.cpp | 3 + src/parser/NondeterministicModelParser.cpp | 2 + ...ministicModelBisimulationDecomposition.cpp | 3 +- .../MaximalEndComponentDecomposition.cpp | 2 + ...tronglyConnectedComponentDecomposition.cpp | 1 + src/storage/dd/CuddDd.h | 14 +-- src/utility/constants.cpp | 59 ++++++++- src/utility/constants.h | 47 +------ src/utility/vector.h | 38 ++++++ .../builder/DdPrismModelBuilderTest.cpp | 2 + .../builder/ExplicitPrismModelBuilderTest.cpp | 1 + test/functional/builder/cluster2.sm | 12 +- .../GmmxxDtmcPrctlModelCheckerTest.cpp | 1 + .../GmmxxHybridDtmcPrctlModelCheckerTest.cpp | 1 + .../GmmxxHybridMdpPrctlModelCheckerTest.cpp | 1 + .../GmmxxMdpPrctlModelCheckerTest.cpp | 1 + .../NativeCtmcCslModelCheckerTest.cpp | 10 +- .../NativeDtmcPrctlModelCheckerTest.cpp | 1 + .../NativeHybridDtmcPrctlModelCheckerTest.cpp | 1 + .../NativeHybridMdpPrctlModelCheckerTest.cpp | 1 + .../NativeMdpPrctlModelCheckerTest.cpp | 1 + .../SparseDtmcEliminationModelCheckerTest.cpp | 1 + .../SymbolicDtmcPrctlModelCheckerTest.cpp | 1 + ...ValueIterationMdpPrctlModelCheckerTest.cpp | 1 + test/functional/parser/AutoParserTest.cpp | 1 + .../parser/DeterministicModelParserTest.cpp | 1 + .../parser/MarkovAutomatonParserTest.cpp | 1 + .../NondeterministicModelParserTest.cpp | 1 + ...sticModelBisimulationDecompositionTest.cpp | 3 +- .../MaximalEndComponentDecompositionTest.cpp | 1 + test/functional/utility/GraphTest.cpp | 2 + 65 files changed, 352 insertions(+), 164 deletions(-) diff --git a/src/builder/DdPrismModelBuilder.cpp b/src/builder/DdPrismModelBuilder.cpp index 2807e2f51..461713e9c 100644 --- a/src/builder/DdPrismModelBuilder.cpp +++ b/src/builder/DdPrismModelBuilder.cpp @@ -3,6 +3,7 @@ #include "src/models/symbolic/Dtmc.h" #include "src/models/symbolic/Ctmc.h" #include "src/models/symbolic/Mdp.h" +#include "src/models/symbolic/StandardRewardModel.h" #include "src/storage/dd/CuddDd.h" #include "src/storage/dd/CuddDdManager.h" @@ -63,7 +64,10 @@ namespace storm { // A set of all variables used for encoding the nondeterminism (i.e. nondetermism + synchronization // variables). This is handy to abstract from this variable set. std::set<storm::expressions::Variable> allNondeterminismVariables; - + + // As set of all variables used for encoding the synchronization. + std::set<storm::expressions::Variable> allSynchronizationMetaVariables; + // DDs representing the identity for each variable. std::map<storm::expressions::Variable, storm::dd::Add<Type>> variableToIdentityMap; @@ -82,6 +86,7 @@ namespace storm { for (auto const& actionIndex : program.getSynchronizingActionIndices()) { std::pair<storm::expressions::Variable, storm::expressions::Variable> variablePair = manager->addMetaVariable(program.getActionName(actionIndex)); synchronizationMetaVariables.push_back(variablePair.first); + allSynchronizationMetaVariables.insert(variablePair.first); allNondeterminismVariables.insert(variablePair.first); } @@ -640,7 +645,7 @@ namespace storm { } template <storm::dd::DdType Type> - std::pair<storm::dd::Add<Type>, typename DdPrismModelBuilder<Type>::ModuleDecisionDiagram> DdPrismModelBuilder<Type>::createSystemDecisionDiagram(GenerationInformation& generationInfo) { + std::tuple<storm::dd::Add<Type>, typename DdPrismModelBuilder<Type>::ModuleDecisionDiagram, boost::optional<storm::dd::Add<Type>>> DdPrismModelBuilder<Type>::createSystemDecisionDiagram(GenerationInformation& generationInfo) { // Create the initial offset mapping. std::map<uint_fast64_t, uint_fast64_t> synchronizingActionToOffsetMap; for (auto const& actionIndex : generationInfo.program.getSynchronizingActionIndices()) { @@ -698,8 +703,10 @@ namespace storm { storm::dd::Add<Type> result = createSystemFromModule(generationInfo, system); // For DTMCs, we normalize each row to 1 (to account for non-determinism). + boost::optional<storm::dd::Add<Type>> stateToChoiceCountMap; if (generationInfo.program.getModelType() == storm::prism::Program::ModelType::DTMC) { - result = result / result.sumAbstract(generationInfo.columnMetaVariables); + stateToChoiceCountMap = result.sumAbstract(generationInfo.columnMetaVariables); + result = result / stateToChoiceCountMap.get(); } else if (generationInfo.program.getModelType() == storm::prism::Program::ModelType::MDP) { // For MDPs, we need to throw away the nondeterminism variables from the generation information that // were never used. @@ -709,11 +716,11 @@ namespace storm { generationInfo.nondeterminismMetaVariables.resize(system.numberOfUsedNondeterminismVariables); } - return std::make_pair(result, system); + return std::make_tuple(result, system, stateToChoiceCountMap); } template <storm::dd::DdType Type> - storm::models::symbolic::StandardRewardModel<Type, double> DdPrismModelBuilder<Type>::createRewardModelDecisionDiagrams(GenerationInformation& generationInfo, storm::prism::RewardModel const& rewardModel, ModuleDecisionDiagram const& globalModule, storm::dd::Add<Type> const& fullTransitionMatrix) { + storm::models::symbolic::StandardRewardModel<Type, double> DdPrismModelBuilder<Type>::createRewardModelDecisionDiagrams(GenerationInformation& generationInfo, storm::prism::RewardModel const& rewardModel, ModuleDecisionDiagram const& globalModule, storm::dd::Add<Type> const& transitionMatrix, storm::dd::Add<Type> const& reachableStatesAdd, boost::optional<storm::dd::Add<Type>> const& stateToChoiceCountMap) { // Start by creating the state reward vector. boost::optional<storm::dd::Add<Type>> stateRewards; @@ -725,7 +732,7 @@ namespace storm { storm::dd::Add<Type> rewards = generationInfo.rowExpressionAdapter->translateExpression(stateReward.getRewardValueExpression()); // Restrict the rewards to those states that satisfy the condition. - rewards = states * rewards; + rewards = reachableStatesAdd * states * rewards; // Perform some sanity checks. STORM_LOG_WARN_COND(rewards.getMin() >= 0, "The reward model assigns negative rewards to some states."); @@ -744,43 +751,36 @@ namespace storm { for (auto const& stateActionReward : rewardModel.getStateActionRewards()) { storm::dd::Add<Type> states = generationInfo.rowExpressionAdapter->translateExpression(stateActionReward.getStatePredicateExpression()); storm::dd::Add<Type> rewards = generationInfo.rowExpressionAdapter->translateExpression(stateActionReward.getRewardValueExpression()); - storm::dd::Add<Type> synchronization = generationInfo.manager->getAddOne(); - storm::dd::Add<Type> transitions; if (stateActionReward.isLabeled()) { if (generationInfo.program.getModelType() == storm::prism::Program::ModelType::MDP) { synchronization = getSynchronizationDecisionDiagram(generationInfo, stateActionReward.getActionIndex()); } - transitions = globalModule.synchronizingActionToDecisionDiagramMap.at(stateActionReward.getActionIndex()).transitionsDd; + states *= globalModule.synchronizingActionToDecisionDiagramMap.at(stateActionReward.getActionIndex()).guardDd * reachableStatesAdd; } else { if (generationInfo.program.getModelType() == storm::prism::Program::ModelType::MDP) { synchronization = getSynchronizationDecisionDiagram(generationInfo); } - transitions = globalModule.independentAction.transitionsDd; + states *= globalModule.independentAction.guardDd * reachableStatesAdd; } - storm::dd::Add<Type> transitionRewardDd = synchronization * states * rewards; - if (generationInfo.program.getModelType() == storm::prism::Program::ModelType::DTMC) { - // For DTMCs we need to keep the weighting for the scaling that follows. - transitionRewardDd = transitions * transitionRewardDd; - } else { - // For all other model types, we do not scale the rewards. - transitionRewardDd = transitions.notZero().toAdd() * transitionRewardDd; - } + storm::dd::Add<Type> stateActionRewardDd = synchronization * states * rewards; // Perform some sanity checks. - STORM_LOG_WARN_COND(transitionRewardDd.getMin() >= 0, "The reward model assigns negative rewards to some states."); - STORM_LOG_WARN_COND(!transitionRewardDd.isZero(), "The reward model does not assign any non-zero rewards."); + STORM_LOG_WARN_COND(stateActionRewardDd.getMin() >= 0, "The reward model assigns negative rewards to some states."); + STORM_LOG_WARN_COND(!stateActionRewardDd.isZero(), "The reward model does not assign any non-zero rewards."); // Add the rewards to the global transition reward matrix. - stateActionRewards.get() += transitionRewardDd; + stateActionRewards.get() += stateActionRewardDd; } - // Scale transition rewards for DTMCs. + // Scale state-action rewards for DTMCs. if (generationInfo.program.getModelType() == storm::prism::Program::ModelType::DTMC) { - stateActionRewards.get() /= fullTransitionMatrix; + STORM_LOG_THROW(static_cast<bool>(stateToChoiceCountMap), storm::exceptions::InvalidStateException, "A DD that reflects the number of choices per state was not build, but was expected to exist."); + stateActionRewards.get() /= stateToChoiceCountMap.get(); } + stateActionRewards.get().exportToDot("rewards.dot"); } // Then build the transition reward matrix. @@ -827,7 +827,8 @@ namespace storm { // Scale transition rewards for DTMCs. if (generationInfo.program.getModelType() == storm::prism::Program::ModelType::DTMC) { - transitionRewards.get() /= fullTransitionMatrix; + STORM_LOG_THROW(static_cast<bool>(stateToChoiceCountMap), storm::exceptions::InvalidStateException, "A DD that reflects the number of choices per state was not build, but was expected to exist."); + stateActionRewards.get() /= stateToChoiceCountMap.get(); } } @@ -868,40 +869,10 @@ namespace storm { // In particular, this creates the meta variables used to encode the model. GenerationInformation generationInfo(preparedProgram); - std::pair<storm::dd::Add<Type>, ModuleDecisionDiagram> transitionMatrixModulePair = createSystemDecisionDiagram(generationInfo); - storm::dd::Add<Type> transitionMatrix = transitionMatrixModulePair.first; - ModuleDecisionDiagram const& globalModule = transitionMatrixModulePair.second; - - // Finally, we build the DDs for the selected reward structures. It is important to do this now, because - // we still have the uncut transition matrix, which is needed for the reward computation. This is because - // the reward computation might divide by the transition probabilities, which must therefore never be 0. - // However, cutting it to the reachable fragment, there might be zero probability transitions. - std::vector<std::reference_wrapper<storm::prism::RewardModel const>> selectedRewardModels; - - // First, we make sure that all selected reward models actually exist. - for (auto const& rewardModelName : options.rewardModelsToBuild) { - STORM_LOG_THROW(rewardModelName.empty() || preparedProgram.hasRewardModel(rewardModelName), storm::exceptions::InvalidArgumentException, "Model does not possess a reward model with the name '" << rewardModelName << "'."); - } - - for (auto const& rewardModel : preparedProgram.getRewardModels()) { - if (options.buildAllRewardModels || options.rewardModelsToBuild.find(rewardModel.getName()) != options.rewardModelsToBuild.end()) { - selectedRewardModels.push_back(rewardModel); - } - } - // If no reward model was selected until now and a referenced reward model appears to be unique, we build - // the only existing reward model (given that no explicit name was given for the referenced reward model). - if (selectedRewardModels.empty() && preparedProgram.getNumberOfRewardModels() == 1 && options.rewardModelsToBuild.size() == 1 && *options.rewardModelsToBuild.begin() == "") { - selectedRewardModels.push_back(preparedProgram.getRewardModel(0)); - } - std::unordered_map<std::string, storm::models::symbolic::StandardRewardModel<Type, double>> rewardModels; - if (options.buildAllRewardModels || !options.rewardModelsToBuild.empty()) { - for (auto const& rewardModel : preparedProgram.getRewardModels()) { - if (options.buildAllRewardModels || options.rewardModelsToBuild.find(rewardModel.getName()) != options.rewardModelsToBuild.end()) { - STORM_LOG_TRACE("Building reward structure."); - rewardModels.emplace(rewardModel.getName(), createRewardModelDecisionDiagrams(generationInfo, rewardModel, globalModule, transitionMatrix)); - } - } - } + std::tuple<storm::dd::Add<Type>, ModuleDecisionDiagram, boost::optional<storm::dd::Add<Type>>> system = createSystemDecisionDiagram(generationInfo); + storm::dd::Add<Type> transitionMatrix = std::get<0>(system); + ModuleDecisionDiagram const& globalModule = std::get<1>(system); + boost::optional<storm::dd::Add<Type>> stateToChoiceCountMap = std::get<2>(system); // Cut the transitions and rewards to the reachable fragment of the state space. storm::dd::Bdd<Type> initialStates = createInitialStatesDecisionDiagram(generationInfo); @@ -912,9 +883,6 @@ namespace storm { storm::dd::Bdd<Type> reachableStates = computeReachableStates(generationInfo, initialStates, transitionMatrixBdd); storm::dd::Add<Type> reachableStatesAdd = reachableStates.toAdd(); transitionMatrix *= reachableStatesAdd; - for (auto& rewardModel : rewardModels) { - rewardModel.second *= reachableStatesAdd; - } // Detect deadlocks and 1) fix them if requested 2) throw an error otherwise. storm::dd::Bdd<Type> statesWithTransition = transitionMatrixBdd.existsAbstract(generationInfo.columnMetaVariables); @@ -940,6 +908,35 @@ namespace storm { } } + // Now build the reward models. + std::vector<std::reference_wrapper<storm::prism::RewardModel const>> selectedRewardModels; + + // First, we make sure that all selected reward models actually exist. + for (auto const& rewardModelName : options.rewardModelsToBuild) { + STORM_LOG_THROW(rewardModelName.empty() || preparedProgram.hasRewardModel(rewardModelName), storm::exceptions::InvalidArgumentException, "Model does not possess a reward model with the name '" << rewardModelName << "'."); + } + + for (auto const& rewardModel : preparedProgram.getRewardModels()) { + if (options.buildAllRewardModels || options.rewardModelsToBuild.find(rewardModel.getName()) != options.rewardModelsToBuild.end()) { + selectedRewardModels.push_back(rewardModel); + } + } + // If no reward model was selected until now and a referenced reward model appears to be unique, we build + // the only existing reward model (given that no explicit name was given for the referenced reward model). + if (selectedRewardModels.empty() && preparedProgram.getNumberOfRewardModels() == 1 && options.rewardModelsToBuild.size() == 1 && *options.rewardModelsToBuild.begin() == "") { + selectedRewardModels.push_back(preparedProgram.getRewardModel(0)); + } + + std::unordered_map<std::string, storm::models::symbolic::StandardRewardModel<Type, double>> rewardModels; + if (options.buildAllRewardModels || !options.rewardModelsToBuild.empty()) { + for (auto const& rewardModel : preparedProgram.getRewardModels()) { + if (options.buildAllRewardModels || options.rewardModelsToBuild.find(rewardModel.getName()) != options.rewardModelsToBuild.end()) { + STORM_LOG_TRACE("Building reward structure."); + rewardModels.emplace(rewardModel.getName(), createRewardModelDecisionDiagrams(generationInfo, rewardModel, globalModule, transitionMatrix, reachableStatesAdd, stateToChoiceCountMap)); + } + } + } + // Build the labels that can be accessed as a shortcut. std::map<std::string, storm::expressions::Expression> labelToExpressionMapping; for (auto const& label : preparedProgram.getLabels()) { diff --git a/src/builder/DdPrismModelBuilder.h b/src/builder/DdPrismModelBuilder.h index a6d45c3fc..4380598c4 100644 --- a/src/builder/DdPrismModelBuilder.h +++ b/src/builder/DdPrismModelBuilder.h @@ -189,9 +189,9 @@ namespace storm { static storm::dd::Add<Type> createSystemFromModule(GenerationInformation& generationInfo, ModuleDecisionDiagram const& module); - static storm::models::symbolic::StandardRewardModel<Type, double> createRewardModelDecisionDiagrams(GenerationInformation& generationInfo, storm::prism::RewardModel const& rewardModel, ModuleDecisionDiagram const& globalModule, storm::dd::Add<Type> const& fullTransitionMatrix); + static storm::models::symbolic::StandardRewardModel<Type, double> createRewardModelDecisionDiagrams(GenerationInformation& generationInfo, storm::prism::RewardModel const& rewardModel, ModuleDecisionDiagram const& globalModule, storm::dd::Add<Type> const& transitionMatrix, storm::dd::Add<Type> const& reachableStatesAdd, boost::optional<storm::dd::Add<Type>> const& stateToChoiceCountMap); - static std::pair<storm::dd::Add<Type>, ModuleDecisionDiagram> createSystemDecisionDiagram(GenerationInformation& generationInfo); + static std::tuple<storm::dd::Add<Type>, ModuleDecisionDiagram, boost::optional<storm::dd::Add<Type>>> createSystemDecisionDiagram(GenerationInformation& generationInfo); static storm::dd::Bdd<Type> createInitialStatesDecisionDiagram(GenerationInformation& generationInfo); diff --git a/src/builder/ExplicitPrismModelBuilder.cpp b/src/builder/ExplicitPrismModelBuilder.cpp index 18c58a69a..c65dc5b3a 100644 --- a/src/builder/ExplicitPrismModelBuilder.cpp +++ b/src/builder/ExplicitPrismModelBuilder.cpp @@ -5,6 +5,7 @@ #include "src/models/sparse/Dtmc.h" #include "src/models/sparse/Ctmc.h" #include "src/models/sparse/Mdp.h" +#include "src/models/sparse/StandardRewardModel.h" #include "src/settings/modules/GeneralSettings.h" @@ -653,6 +654,11 @@ namespace storm { for (auto rewardModelIt = selectedRewardModels.begin(), rewardModelIte = selectedRewardModels.end(); rewardModelIt != rewardModelIte; ++rewardModelIt, ++builderIt) { if (rewardModelIt->get().hasStateRewards()) { builderIt->stateRewardVector.push_back(storm::utility::zero<ValueType>()); + for (auto const& stateReward : rewardModelIt->get().getStateRewards()) { + if (evaluator.asBool(stateReward.getStatePredicateExpression())) { + builderIt->stateRewardVector.back() += ValueType(evaluator.asRational(stateReward.getRewardValueExpression())); + } + } } if (rewardModelIt->get().hasStateActionRewards()) { @@ -668,14 +674,6 @@ namespace storm { auto builderIt = rewardModelBuilders.begin(); for (auto rewardModelIt = selectedRewardModels.begin(), rewardModelIte = selectedRewardModels.end(); rewardModelIt != rewardModelIte; ++rewardModelIt, ++builderIt) { - if (rewardModelIt->get().hasStateRewards()) { - for (auto const& stateReward : rewardModelIt->get().getStateRewards()) { - if (evaluator.asBool(stateReward.getStatePredicateExpression())) { - builderIt->stateRewardVector.back() += ValueType(evaluator.asRational(stateReward.getRewardValueExpression())); - } - } - } - if (rewardModelIt->get().hasStateActionRewards()) { for (auto const& stateActionReward : rewardModelIt->get().getStateActionRewards()) { if (!stateActionReward.isLabeled()) { @@ -702,19 +700,11 @@ namespace storm { auto builderIt = rewardModelBuilders.begin(); for (auto rewardModelIt = selectedRewardModels.begin(), rewardModelIte = selectedRewardModels.end(); rewardModelIt != rewardModelIte; ++rewardModelIt, ++builderIt) { - if (rewardModelIt->get().hasStateRewards()) { - for (auto const& stateReward : rewardModelIt->get().getStateRewards()) { - if (evaluator.asBool(stateReward.getStatePredicateExpression())) { - builderIt->stateRewardVector.back() += ValueType(evaluator.asRational(stateReward.getRewardValueExpression())); - } - } - } - if (rewardModelIt->get().hasStateActionRewards()) { for (auto const& stateActionReward : rewardModelIt->get().getStateActionRewards()) { if (stateActionReward.isLabeled() && stateActionReward.getActionIndex() == choice.getActionIndex()) { if (evaluator.asBool(stateActionReward.getStatePredicateExpression())) { - builderIt->stateActionRewardVector.back() += ValueType(evaluator.asRational(stateActionReward.getRewardValueExpression())) / totalNumberOfChoices; + builderIt->stateActionRewardVector.back() += ValueType(evaluator.asRational(stateActionReward.getRewardValueExpression())); } } } diff --git a/src/modelchecker/csl/helper/HybridCtmcCslHelper.cpp b/src/modelchecker/csl/helper/HybridCtmcCslHelper.cpp index cd289f33d..692d56629 100644 --- a/src/modelchecker/csl/helper/HybridCtmcCslHelper.cpp +++ b/src/modelchecker/csl/helper/HybridCtmcCslHelper.cpp @@ -11,6 +11,8 @@ #include "src/utility/macros.h" #include "src/utility/graph.h" +#include "src/models/symbolic/StandardRewardModel.h" + #include "src/modelchecker/results/SymbolicQualitativeCheckResult.h" #include "src/modelchecker/results/SymbolicQuantitativeCheckResult.h" #include "src/modelchecker/results/HybridQuantitativeCheckResult.h" @@ -266,7 +268,8 @@ namespace storm { storm::storage::SparseMatrix<ValueType> explicitUniformizedMatrix = uniformizedMatrix.toMatrix(odd, odd); // Then compute the state reward vector to use in the computation. - storm::dd::Add<DdType> totalRewardVector = rewardModel.getTotalRewardVector(rateMatrix, model.getColumnVariables()); + storm::dd::Add<DdType> totalRewardVector = rewardModel.getTotalRewardVector(rateMatrix, model.getColumnVariables(), exitRateVector); + totalRewardVector.exportToDot("rewards.dot"); std::vector<ValueType> explicitTotalRewardVector = totalRewardVector.template toVector<ValueType>(odd); // Finally, compute the transient probabilities. diff --git a/src/modelchecker/csl/helper/SparseCtmcCslHelper.cpp b/src/modelchecker/csl/helper/SparseCtmcCslHelper.cpp index 8c90dd905..deb458f42 100644 --- a/src/modelchecker/csl/helper/SparseCtmcCslHelper.cpp +++ b/src/modelchecker/csl/helper/SparseCtmcCslHelper.cpp @@ -314,7 +314,7 @@ namespace storm { // Initialize result to state rewards of the this->getModel(). std::vector<ValueType> result(rewardModel.getStateRewardVector()); - + // If the time-bound is not zero, we need to perform a transient analysis. if (timeBound > 0) { ValueType uniformizationRate = 0; @@ -335,7 +335,7 @@ namespace storm { std::vector<ValueType> SparseCtmcCslHelper<ValueType, RewardModelType>::computeCumulativeRewards(storm::storage::SparseMatrix<ValueType> const& rateMatrix, std::vector<ValueType> const& exitRateVector, RewardModelType const& rewardModel, double timeBound, storm::utility::solver::LinearEquationSolverFactory<ValueType> const& linearEquationSolverFactory) { // Only compute the result if the model has a state-based reward this->getModel(). STORM_LOG_THROW(!rewardModel.empty(), storm::exceptions::InvalidPropertyException, "Missing reward model for formula. Skipping formula."); - + uint_fast64_t numberOfStates = rateMatrix.getRowCount(); // If the time bound is zero, the result is the constant zero vector. @@ -356,7 +356,7 @@ namespace storm { storm::storage::SparseMatrix<ValueType> uniformizedMatrix = computeUniformizedMatrix(rateMatrix, storm::storage::BitVector(numberOfStates, true), uniformizationRate, exitRateVector); // Compute the total state reward vector. - std::vector<ValueType> totalRewardVector = rewardModel.getTotalRewardVector(uniformizedMatrix); + std::vector<ValueType> totalRewardVector = rewardModel.getTotalRewardVector(rateMatrix, exitRateVector); // Finally, compute the transient probabilities. return computeTransientProbabilities<true>(uniformizedMatrix, nullptr, timeBound, uniformizationRate, totalRewardVector, linearEquationSolverFactory); diff --git a/src/modelchecker/prctl/helper/HybridDtmcPrctlHelper.cpp b/src/modelchecker/prctl/helper/HybridDtmcPrctlHelper.cpp index 02b318310..1cdc1f840 100644 --- a/src/modelchecker/prctl/helper/HybridDtmcPrctlHelper.cpp +++ b/src/modelchecker/prctl/helper/HybridDtmcPrctlHelper.cpp @@ -7,6 +7,8 @@ #include "src/utility/graph.h" +#include "src/models/symbolic/StandardRewardModel.h" + #include "src/modelchecker/results/SymbolicQualitativeCheckResult.h" #include "src/modelchecker/results/SymbolicQuantitativeCheckResult.h" #include "src/modelchecker/results/HybridQuantitativeCheckResult.h" diff --git a/src/modelchecker/prctl/helper/HybridMdpPrctlHelper.cpp b/src/modelchecker/prctl/helper/HybridMdpPrctlHelper.cpp index 2409fe5d3..46476d95b 100644 --- a/src/modelchecker/prctl/helper/HybridMdpPrctlHelper.cpp +++ b/src/modelchecker/prctl/helper/HybridMdpPrctlHelper.cpp @@ -7,6 +7,8 @@ #include "src/utility/graph.h" +#include "src/models/symbolic/StandardRewardModel.h" + #include "src/modelchecker/results/SymbolicQualitativeCheckResult.h" #include "src/modelchecker/results/SymbolicQuantitativeCheckResult.h" #include "src/modelchecker/results/HybridQuantitativeCheckResult.h" diff --git a/src/modelchecker/prctl/helper/SymbolicDtmcPrctlHelper.cpp b/src/modelchecker/prctl/helper/SymbolicDtmcPrctlHelper.cpp index cc6853bf2..4ef62691a 100644 --- a/src/modelchecker/prctl/helper/SymbolicDtmcPrctlHelper.cpp +++ b/src/modelchecker/prctl/helper/SymbolicDtmcPrctlHelper.cpp @@ -6,6 +6,8 @@ #include "src/storage/dd/CuddBdd.h" #include "src/storage/dd/CuddOdd.h" +#include "src/models/symbolic/StandardRewardModel.h" + #include "src/utility/graph.h" #include "src/exceptions/InvalidPropertyException.h" diff --git a/src/modelchecker/propositional/SparsePropositionalModelChecker.cpp b/src/modelchecker/propositional/SparsePropositionalModelChecker.cpp index 44d6a454b..ef2a63a2e 100644 --- a/src/modelchecker/propositional/SparsePropositionalModelChecker.cpp +++ b/src/modelchecker/propositional/SparsePropositionalModelChecker.cpp @@ -6,6 +6,7 @@ #include "src/models/sparse/Ctmc.h" #include "src/models/sparse/Mdp.h" #include "src/models/sparse/MarkovAutomaton.h" +#include "src/models/sparse/StandardRewardModel.h" #include "src/modelchecker/results/ExplicitQualitativeCheckResult.h" diff --git a/src/modelchecker/propositional/SymbolicPropositionalModelChecker.cpp b/src/modelchecker/propositional/SymbolicPropositionalModelChecker.cpp index e594c2f70..2e51ff7ad 100644 --- a/src/modelchecker/propositional/SymbolicPropositionalModelChecker.cpp +++ b/src/modelchecker/propositional/SymbolicPropositionalModelChecker.cpp @@ -6,6 +6,7 @@ #include "src/models/symbolic/Dtmc.h" #include "src/models/symbolic/Ctmc.h" #include "src/models/symbolic/Mdp.h" +#include "src/models/symbolic/StandardRewardModel.h" #include "src/modelchecker/results/SymbolicQualitativeCheckResult.h" diff --git a/src/modelchecker/reachability/SparseDtmcEliminationModelChecker.cpp b/src/modelchecker/reachability/SparseDtmcEliminationModelChecker.cpp index 86a741a09..a16ec2089 100644 --- a/src/modelchecker/reachability/SparseDtmcEliminationModelChecker.cpp +++ b/src/modelchecker/reachability/SparseDtmcEliminationModelChecker.cpp @@ -11,6 +11,7 @@ #include "src/storage/StronglyConnectedComponentDecomposition.h" +#include "src/models/sparse/StandardRewardModel.h" #include "src/modelchecker/results/ExplicitQualitativeCheckResult.h" #include "src/modelchecker/results/ExplicitQuantitativeCheckResult.h" diff --git a/src/models/sparse/Ctmc.cpp b/src/models/sparse/Ctmc.cpp index a9509ddbb..371d48270 100644 --- a/src/models/sparse/Ctmc.cpp +++ b/src/models/sparse/Ctmc.cpp @@ -1,5 +1,5 @@ #include "src/models/sparse/Ctmc.h" - +#include "src/models/sparse/StandardRewardModel.h" #include "src/adapters/CarlAdapter.h" #include "src/utility/macros.h" diff --git a/src/models/sparse/DeterministicModel.cpp b/src/models/sparse/DeterministicModel.cpp index 3942f8301..d774d5e7f 100644 --- a/src/models/sparse/DeterministicModel.cpp +++ b/src/models/sparse/DeterministicModel.cpp @@ -1,4 +1,5 @@ #include "src/models/sparse/DeterministicModel.h" +#include "src/models/sparse/StandardRewardModel.h" #include "src/utility/constants.h" #include "src/adapters/CarlAdapter.h" diff --git a/src/models/sparse/Dtmc.cpp b/src/models/sparse/Dtmc.cpp index a92872c0f..78a8a4a0f 100644 --- a/src/models/sparse/Dtmc.cpp +++ b/src/models/sparse/Dtmc.cpp @@ -1,5 +1,5 @@ #include "src/models/sparse/Dtmc.h" - +#include "src/models/sparse/StandardRewardModel.h" #include "src/adapters/CarlAdapter.h" #include "src/exceptions/NotImplementedException.h" #include "src/exceptions/InvalidArgumentException.h" diff --git a/src/models/sparse/MarkovAutomaton.cpp b/src/models/sparse/MarkovAutomaton.cpp index 694cb2a07..03b9341f2 100644 --- a/src/models/sparse/MarkovAutomaton.cpp +++ b/src/models/sparse/MarkovAutomaton.cpp @@ -1,5 +1,5 @@ #include "src/models/sparse/MarkovAutomaton.h" - +#include "src/models/sparse/StandardRewardModel.h" #include "src/exceptions/InvalidArgumentException.h" #include "src/utility/constants.h" #include "src/adapters/CarlAdapter.h" diff --git a/src/models/sparse/Mdp.cpp b/src/models/sparse/Mdp.cpp index f89225d27..4d62741e9 100644 --- a/src/models/sparse/Mdp.cpp +++ b/src/models/sparse/Mdp.cpp @@ -4,6 +4,8 @@ #include "src/utility/constants.h" #include "src/adapters/CarlAdapter.h" +#include "src/models/sparse/StandardRewardModel.h" + namespace storm { namespace models { namespace sparse { diff --git a/src/models/sparse/Model.cpp b/src/models/sparse/Model.cpp index 6e56003ba..81a224a22 100644 --- a/src/models/sparse/Model.cpp +++ b/src/models/sparse/Model.cpp @@ -2,6 +2,8 @@ #include <boost/algorithm/string/join.hpp> +#include "src/models/sparse/StandardRewardModel.h" + #include "src/utility/vector.h" #include "src/adapters/CarlAdapter.h" diff --git a/src/models/sparse/Model.h b/src/models/sparse/Model.h index 7aadc01c9..8adc60bb1 100644 --- a/src/models/sparse/Model.h +++ b/src/models/sparse/Model.h @@ -7,7 +7,6 @@ #include <boost/optional.hpp> #include "src/models/ModelBase.h" -#include "src/models/sparse/StandardRewardModel.h" #include "src/models/sparse/StateLabeling.h" #include "src/storage/sparse/StateType.h" #include "src/storage/BitVector.h" @@ -21,6 +20,8 @@ namespace storm { // The type used for storing a set of labels. typedef boost::container::flat_set<uint_fast64_t> LabelSet; + template<typename ValueType> + class StandardRewardModel; /*! * Base class for all sparse models. diff --git a/src/models/sparse/NondeterministicModel.cpp b/src/models/sparse/NondeterministicModel.cpp index a2310d073..fd3f95f02 100644 --- a/src/models/sparse/NondeterministicModel.cpp +++ b/src/models/sparse/NondeterministicModel.cpp @@ -1,5 +1,7 @@ #include "src/models/sparse/NondeterministicModel.h" +#include "src/models/sparse/StandardRewardModel.h" + #include "src/adapters/CarlAdapter.h" namespace storm { diff --git a/src/models/sparse/StandardRewardModel.cpp b/src/models/sparse/StandardRewardModel.cpp index f6a3d5a54..0ba437c96 100644 --- a/src/models/sparse/StandardRewardModel.cpp +++ b/src/models/sparse/StandardRewardModel.cpp @@ -130,7 +130,7 @@ namespace storm { template<typename MatrixValueType> std::vector<ValueType> StandardRewardModel<ValueType>::getTotalRewardVector(storm::storage::SparseMatrix<MatrixValueType> const& transitionMatrix) const { std::vector<ValueType> result = this->hasTransitionRewards() ? transitionMatrix.getPointwiseProductRowSumVector(this->getTransitionRewardMatrix()) : (this->hasStateActionRewards() ? this->getStateActionRewardVector() : std::vector<ValueType>(transitionMatrix.getRowCount())); - if (this->hasStateActionRewards() && this->hasStateActionRewards()) { + if (this->hasStateActionRewards() && this->hasTransitionRewards()) { storm::utility::vector::addVectors(result, this->getStateActionRewardVector(), result); } if (this->hasStateRewards()) { @@ -139,6 +139,25 @@ namespace storm { return result; } + template<typename ValueType> + template<typename MatrixValueType> + std::vector<ValueType> StandardRewardModel<ValueType>::getTotalRewardVector(storm::storage::SparseMatrix<MatrixValueType> const& transitionMatrix, std::vector<ValueType> const& weights) const { + std::vector<ValueType> result = this->hasTransitionRewards() ? transitionMatrix.getPointwiseProductRowSumVector(this->getTransitionRewardMatrix()) : (this->hasStateActionRewards() ? this->getStateActionRewardVector() : std::vector<ValueType>(transitionMatrix.getRowCount())); + if (!this->hasTransitionRewards() && this->hasStateActionRewards()) { + // If we initialized the result with the state-action rewards we can scale the result in place. + storm::utility::vector::multiplyVectorsPointwise(result, weights, result); + } + if (this->hasStateActionRewards() && this->hasTransitionRewards()) { + // If we initialized the result with the transition rewards and still have state-action rewards, + // we need to add the scaled vector directly. + storm::utility::vector::applyPointwise<ValueType>(weights, this->getStateActionRewardVector(), result, [] (ValueType const& a, ValueType const& b, ValueType const& c) { return c + a * b; } ); + } + if (this->hasStateRewards()) { + storm::utility::vector::addVectorToGroupedVector(result, this->getStateRewardVector(), transitionMatrix.getRowGroupIndices()); + } + return result; + } + template<typename ValueType> template<typename MatrixValueType> std::vector<ValueType> StandardRewardModel<ValueType>::getTotalRewardVector(uint_fast64_t numberOfRows, storm::storage::SparseMatrix<MatrixValueType> const& transitionMatrix, storm::storage::BitVector const& filter) const { @@ -198,23 +217,43 @@ namespace storm { return result; } + template <typename ValueType> + std::ostream& operator<<(std::ostream& out, StandardRewardModel<ValueType> const& rewardModel) { + out << std::boolalpha << "reward model [state reward: " + << rewardModel.hasStateRewards() + << ", state-action rewards: " + << rewardModel.hasStateActionRewards() + << ", transition rewards: " + << rewardModel.hasTransitionRewards() + << "]" + << std::noboolalpha; + return out; + } + // Explicitly instantiate the class. template std::vector<double> StandardRewardModel<double>::getTotalRewardVector(storm::storage::SparseMatrix<double> const& transitionMatrix) const; template std::vector<double> StandardRewardModel<double>::getTotalRewardVector(uint_fast64_t numberOfRows, storm::storage::SparseMatrix<double> const& transitionMatrix, storm::storage::BitVector const& filter) const; + template std::vector<double> StandardRewardModel<double>::getTotalRewardVector(storm::storage::SparseMatrix<double> const& transitionMatrix, std::vector<double> const& weights) const; template void StandardRewardModel<double>::reduceToStateBasedRewards(storm::storage::SparseMatrix<double> const& transitionMatrix, bool reduceToStateRewards); template class StandardRewardModel<double>; + template std::ostream& operator<<<double>(std::ostream& out, StandardRewardModel<double> const& rewardModel); template std::vector<float> StandardRewardModel<float>::getTotalRewardVector(uint_fast64_t numberOfRows, storm::storage::SparseMatrix<float> const& transitionMatrix, storm::storage::BitVector const& filter) const; template std::vector<float> StandardRewardModel<float>::getTotalRewardVector(storm::storage::SparseMatrix<float> const& transitionMatrix) const; + template std::vector<float> StandardRewardModel<float>::getTotalRewardVector(storm::storage::SparseMatrix<float> const& transitionMatrix, std::vector<float> const& weights) const; template void StandardRewardModel<float>::reduceToStateBasedRewards(storm::storage::SparseMatrix<float> const& transitionMatrix, bool reduceToStateRewards); template class StandardRewardModel<float>; +// template std::ostream& operator<<<float>(std::ostream& out, StandardRewardModel<float> const& rewardModel); #ifdef STORM_HAVE_CARL template std::vector<storm::RationalFunction> StandardRewardModel<storm::RationalFunction>::getTotalRewardVector(uint_fast64_t numberOfRows, storm::storage::SparseMatrix<storm::RationalFunction> const& transitionMatrix, storm::storage::BitVector const& filter) const; template std::vector<storm::RationalFunction> StandardRewardModel<storm::RationalFunction>::getTotalRewardVector(storm::storage::SparseMatrix<storm::RationalFunction> const& transitionMatrix) const; + template std::vector<storm::RationalFunction> StandardRewardModel<storm::RationalFunction>::getTotalRewardVector(storm::storage::SparseMatrix<storm::RationalFunction> const& transitionMatrix, std::vector<storm::RationalFunction> const& weights) const; template void StandardRewardModel<storm::RationalFunction>::reduceToStateBasedRewards(storm::storage::SparseMatrix<storm::RationalFunction> const& transitionMatrix, bool reduceToStateRewards); template class StandardRewardModel<storm::RationalFunction>; +// template std::ostream& operator<<<storm::RationalFunction>(std::ostream& out, StandardRewardModel<storm::RationalFunction> const& rewardModel); #endif } + } } \ No newline at end of file diff --git a/src/models/sparse/StandardRewardModel.h b/src/models/sparse/StandardRewardModel.h index d1c78cb15..7bf8afe19 100644 --- a/src/models/sparse/StandardRewardModel.h +++ b/src/models/sparse/StandardRewardModel.h @@ -168,6 +168,17 @@ namespace storm { */ template<typename MatrixValueType> std::vector<ValueType> getTotalRewardVector(storm::storage::SparseMatrix<MatrixValueType> const& transitionMatrix) const; + + /*! + * Creates a vector representing the complete reward vector based on the state-, state-action- and + * transition-based rewards in the reward model. + * + * @param transitionMatrix The matrix that is used to weight the values of the transition reward matrix. + * @param weights A vector used for scaling the entries of the state-action rewards (if present). + * @return The full state-action reward vector. + */ + template<typename MatrixValueType> + std::vector<ValueType> getTotalRewardVector(storm::storage::SparseMatrix<MatrixValueType> const& transitionMatrix, std::vector<ValueType> const& weights) const; /*! * Creates a vector representing the complete reward vector based on the state-, state-action- and @@ -217,6 +228,9 @@ namespace storm { */ std::size_t getSizeInBytes() const; + template <typename ValueTypePrime> + friend std::ostream& operator<<(std::ostream& out, StandardRewardModel<ValueTypePrime> const& rewardModel); + private: // An (optional) vector representing the state rewards. boost::optional<std::vector<ValueType>> optionalStateRewardVector; @@ -227,6 +241,9 @@ namespace storm { // An (optional) matrix representing the transition rewards. boost::optional<storm::storage::SparseMatrix<ValueType>> optionalTransitionRewardMatrix; }; + + template <typename ValueType> + std::ostream& operator<<(std::ostream& out, StandardRewardModel<ValueType> const& rewardModel); } } } diff --git a/src/models/sparse/StochasticTwoPlayerGame.cpp b/src/models/sparse/StochasticTwoPlayerGame.cpp index 6158e3588..132410720 100644 --- a/src/models/sparse/StochasticTwoPlayerGame.cpp +++ b/src/models/sparse/StochasticTwoPlayerGame.cpp @@ -1,5 +1,7 @@ #include "src/models/sparse/StochasticTwoPlayerGame.h" +#include "src/models/sparse/StandardRewardModel.h" + #include "src/adapters/CarlAdapter.h" namespace storm { diff --git a/src/models/symbolic/Ctmc.cpp b/src/models/symbolic/Ctmc.cpp index d2ad8af65..297b3d99a 100644 --- a/src/models/symbolic/Ctmc.cpp +++ b/src/models/symbolic/Ctmc.cpp @@ -1,10 +1,11 @@ #include "src/models/symbolic/Ctmc.h" - #include "src/storage/dd/CuddDdManager.h" #include "src/storage/dd/CuddAdd.h" #include "src/storage/dd/CuddBdd.h" +#include "src/models/symbolic/StandardRewardModel.h" + namespace storm { namespace models { namespace symbolic { diff --git a/src/models/symbolic/DeterministicModel.cpp b/src/models/symbolic/DeterministicModel.cpp index 081183eb7..361e6c438 100644 --- a/src/models/symbolic/DeterministicModel.cpp +++ b/src/models/symbolic/DeterministicModel.cpp @@ -4,6 +4,8 @@ #include "src/storage/dd/CuddAdd.h" #include "src/storage/dd/CuddBdd.h" +#include "src/models/symbolic/StandardRewardModel.h" + namespace storm { namespace models { namespace symbolic { diff --git a/src/models/symbolic/Dtmc.cpp b/src/models/symbolic/Dtmc.cpp index ca1e6d8cb..aed3d9c20 100644 --- a/src/models/symbolic/Dtmc.cpp +++ b/src/models/symbolic/Dtmc.cpp @@ -1,10 +1,11 @@ #include "src/models/symbolic/Dtmc.h" - #include "src/storage/dd/CuddDdManager.h" #include "src/storage/dd/CuddAdd.h" #include "src/storage/dd/CuddBdd.h" +#include "src/models/symbolic/StandardRewardModel.h" + namespace storm { namespace models { namespace symbolic { diff --git a/src/models/symbolic/Mdp.cpp b/src/models/symbolic/Mdp.cpp index a14d78961..093190106 100644 --- a/src/models/symbolic/Mdp.cpp +++ b/src/models/symbolic/Mdp.cpp @@ -1,11 +1,11 @@ #include "src/models/symbolic/Mdp.h" - - #include "src/storage/dd/CuddDdManager.h" #include "src/storage/dd/CuddAdd.h" #include "src/storage/dd/CuddBdd.h" +#include "src/models/symbolic/StandardRewardModel.h" + namespace storm { namespace models { namespace symbolic { diff --git a/src/models/symbolic/Model.cpp b/src/models/symbolic/Model.cpp index fb0538605..7c31e3fa1 100644 --- a/src/models/symbolic/Model.cpp +++ b/src/models/symbolic/Model.cpp @@ -10,6 +10,8 @@ #include "src/storage/dd/CuddAdd.h" #include "src/storage/dd/CuddBdd.h" +#include "src/models/symbolic/StandardRewardModel.h" + namespace storm { namespace models { namespace symbolic { diff --git a/src/models/symbolic/Model.h b/src/models/symbolic/Model.h index 0d7fb70be..b70c39b97 100644 --- a/src/models/symbolic/Model.h +++ b/src/models/symbolic/Model.h @@ -10,7 +10,6 @@ #include "src/storage/expressions/Variable.h" #include "src/storage/dd/DdType.h" #include "src/models/ModelBase.h" -#include "src/models/symbolic/StandardRewardModel.h" #include "src/utility/OsDetection.h" namespace storm { @@ -30,6 +29,9 @@ namespace storm { namespace models { namespace symbolic { + template<storm::dd::DdType Type, typename ValueType> + class StandardRewardModel; + /*! * Base class for all symbolic models. */ diff --git a/src/models/symbolic/NondeterministicModel.cpp b/src/models/symbolic/NondeterministicModel.cpp index 1b080ecee..f5decd7d5 100644 --- a/src/models/symbolic/NondeterministicModel.cpp +++ b/src/models/symbolic/NondeterministicModel.cpp @@ -1,10 +1,11 @@ #include "src/models/symbolic/NondeterministicModel.h" - #include "src/storage/dd/CuddDdManager.h" #include "src/storage/dd/CuddAdd.h" #include "src/storage/dd/CuddBdd.h" +#include "src/models/symbolic/StandardRewardModel.h" + namespace storm { namespace models { namespace symbolic { diff --git a/src/models/symbolic/StandardRewardModel.cpp b/src/models/symbolic/StandardRewardModel.cpp index 1d2ce401b..4762ff242 100644 --- a/src/models/symbolic/StandardRewardModel.cpp +++ b/src/models/symbolic/StandardRewardModel.cpp @@ -97,6 +97,21 @@ namespace storm { return result; } + template <storm::dd::DdType Type, typename ValueType> + storm::dd::Add<Type> StandardRewardModel<Type, ValueType>::getTotalRewardVector(storm::dd::Add<Type> const& transitionMatrix, std::set<storm::expressions::Variable> const& columnVariables, storm::dd::Add<Type> const& weights) const { + storm::dd::Add<Type> result = transitionMatrix.getDdManager()->getAddZero(); + if (this->hasStateRewards()) { + result += optionalStateRewardVector.get(); + } + if (this->hasStateActionRewards()) { + result += optionalStateActionRewardVector.get() * weights; + } + if (this->hasTransitionRewards()) { + result += (transitionMatrix * this->getTransitionRewardMatrix()).sumAbstract(columnVariables); + } + return result; + } + template <storm::dd::DdType Type, typename ValueType> StandardRewardModel<Type, ValueType>& StandardRewardModel<Type, ValueType>::operator*=(storm::dd::Add<Type> const& filter) { if (this->hasStateRewards()) { @@ -116,7 +131,7 @@ namespace storm { StandardRewardModel<Type, ValueType> StandardRewardModel<Type, ValueType>::divideStateRewardVector(storm::dd::Add<Type> const& divisor) const { boost::optional<storm::dd::Add<Type>> modifiedStateRewardVector; if (this->hasStateRewards()) { - modifiedStateRewardVector.get() = modifiedStateRewardVector.get() / divisor; + modifiedStateRewardVector = this->optionalStateRewardVector.get() / divisor; } return StandardRewardModel<Type, ValueType>(modifiedStateRewardVector, this->optionalStateActionRewardVector, this->optionalTransitionRewardMatrix); } diff --git a/src/models/symbolic/StandardRewardModel.h b/src/models/symbolic/StandardRewardModel.h index a53cd1a52..76abc9fdd 100644 --- a/src/models/symbolic/StandardRewardModel.h +++ b/src/models/symbolic/StandardRewardModel.h @@ -144,11 +144,22 @@ namespace storm { * transition-based rewards in the reward model. * * @param transitionMatrix The matrix that is used to weight the values of the transition reward matrix. - * @param columnVariables . + * @param columnVariables The column variables of the model. * @return The full state-action reward vector. */ storm::dd::Add<Type> getTotalRewardVector(storm::dd::Add<Type> const& transitionMatrix, std::set<storm::expressions::Variable> const& columnVariables) const; + /*! + * Creates a vector representing the complete reward vector based on the state-, state-action- and + * transition-based rewards in the reward model. + * + * @param transitionMatrix The matrix that is used to weight the values of the transition reward matrix. + * @param columnVariables The column variables of the model. + * @param weights The weights used to scale the state-action reward vector. + * @return The full state-action reward vector. + */ + storm::dd::Add<Type> getTotalRewardVector(storm::dd::Add<Type> const& transitionMatrix, std::set<storm::expressions::Variable> const& columnVariables, storm::dd::Add<Type> const& weights) const; + /*! * Multiplies all components of the reward model with the given DD. * diff --git a/src/models/symbolic/StochasticTwoPlayerGame.cpp b/src/models/symbolic/StochasticTwoPlayerGame.cpp index 6b3fc393a..370df9ffb 100644 --- a/src/models/symbolic/StochasticTwoPlayerGame.cpp +++ b/src/models/symbolic/StochasticTwoPlayerGame.cpp @@ -1,10 +1,11 @@ #include "src/models/symbolic/StochasticTwoPlayerGame.h" - #include "src/storage/dd/CuddDdManager.h" #include "src/storage/dd/CuddAdd.h" #include "src/storage/dd/CuddBdd.h" +#include "src/models/symbolic/StandardRewardModel.h" + namespace storm { namespace models { namespace symbolic { diff --git a/src/parser/AutoParser.cpp b/src/parser/AutoParser.cpp index 065ad4327..6bd71189d 100644 --- a/src/parser/AutoParser.cpp +++ b/src/parser/AutoParser.cpp @@ -1,5 +1,7 @@ #include "src/parser/AutoParser.h" +#include "src/models/sparse/StandardRewardModel.h" + #include "src/parser/MappedFile.h" #include "src/parser/DeterministicModelParser.h" diff --git a/src/parser/DeterministicModelParser.cpp b/src/parser/DeterministicModelParser.cpp index f0d0770cb..fd163c56a 100644 --- a/src/parser/DeterministicModelParser.cpp +++ b/src/parser/DeterministicModelParser.cpp @@ -3,6 +3,8 @@ #include <string> #include <vector> +#include "src/models/sparse/StandardRewardModel.h" + #include "src/parser/DeterministicSparseTransitionParser.h" #include "src/parser/AtomicPropositionLabelingParser.h" #include "src/parser/SparseStateRewardParser.h" diff --git a/src/parser/MarkovAutomatonParser.cpp b/src/parser/MarkovAutomatonParser.cpp index 7325a922e..bc61a7a1f 100644 --- a/src/parser/MarkovAutomatonParser.cpp +++ b/src/parser/MarkovAutomatonParser.cpp @@ -1,6 +1,9 @@ #include "MarkovAutomatonParser.h" #include "AtomicPropositionLabelingParser.h" #include "SparseStateRewardParser.h" + +#include "src/models/sparse/StandardRewardModel.h" + #include "src/exceptions/WrongFormatException.h" #include "log4cplus/logger.h" diff --git a/src/parser/NondeterministicModelParser.cpp b/src/parser/NondeterministicModelParser.cpp index 0a8ad5ae8..8f3e8028d 100644 --- a/src/parser/NondeterministicModelParser.cpp +++ b/src/parser/NondeterministicModelParser.cpp @@ -3,6 +3,8 @@ #include <string> #include <vector> +#include "src/models/sparse/StandardRewardModel.h" + #include "src/parser/NondeterministicSparseTransitionParser.h" #include "src/parser/AtomicPropositionLabelingParser.h" #include "src/parser/SparseStateRewardParser.h" diff --git a/src/storage/DeterministicModelBisimulationDecomposition.cpp b/src/storage/DeterministicModelBisimulationDecomposition.cpp index 725d46b02..f362da110 100644 --- a/src/storage/DeterministicModelBisimulationDecomposition.cpp +++ b/src/storage/DeterministicModelBisimulationDecomposition.cpp @@ -10,6 +10,8 @@ #include "src/modelchecker/propositional/SparsePropositionalModelChecker.h" #include "src/modelchecker/results/ExplicitQualitativeCheckResult.h" +#include "src/models/sparse/StandardRewardModel.h" + #include "src/utility/graph.h" #include "src/utility/constants.h" #include "src/exceptions/IllegalFunctionCallException.h" @@ -19,7 +21,6 @@ #include "src/settings/SettingsManager.h" #include "src/settings/modules/GeneralSettings.h" - namespace storm { namespace storage { diff --git a/src/storage/MaximalEndComponentDecomposition.cpp b/src/storage/MaximalEndComponentDecomposition.cpp index 7a8c53cda..f7c314eb4 100644 --- a/src/storage/MaximalEndComponentDecomposition.cpp +++ b/src/storage/MaximalEndComponentDecomposition.cpp @@ -1,6 +1,8 @@ #include <list> #include <queue> +#include "src/models/sparse/StandardRewardModel.h" + #include "src/storage/MaximalEndComponentDecomposition.h" #include "src/storage/StronglyConnectedComponentDecomposition.h" diff --git a/src/storage/StronglyConnectedComponentDecomposition.cpp b/src/storage/StronglyConnectedComponentDecomposition.cpp index a03a22b63..0e3938da3 100644 --- a/src/storage/StronglyConnectedComponentDecomposition.cpp +++ b/src/storage/StronglyConnectedComponentDecomposition.cpp @@ -1,5 +1,6 @@ #include "src/storage/StronglyConnectedComponentDecomposition.h" #include "src/models/sparse/Model.h" +#include "src/models/sparse/StandardRewardModel.h" #include "src/adapters/CarlAdapter.h" namespace storm { diff --git a/src/storage/dd/CuddDd.h b/src/storage/dd/CuddDd.h index b80bfc671..0077bcc8a 100644 --- a/src/storage/dd/CuddDd.h +++ b/src/storage/dd/CuddDd.h @@ -105,6 +105,13 @@ namespace storm { */ std::shared_ptr<DdManager<DdType::CUDD> const> getDdManager() const; + /*! + * Retrieves the set of all meta variables contained in the DD. + * + * @return The set of all meta variables contained in the DD. + */ + std::set<storm::expressions::Variable>& getContainedMetaVariables(); + protected: /*! @@ -123,13 +130,6 @@ namespace storm { */ static std::vector<uint_fast64_t> getSortedVariableIndices(DdManager<DdType::CUDD> const& manager, std::set<storm::expressions::Variable> const& metaVariables); - /*! - * Retrieves the set of all meta variables contained in the DD. - * - * @return The set of all meta variables contained in the DD. - */ - std::set<storm::expressions::Variable>& getContainedMetaVariables(); - /*! * Adds the given set of meta variables to the DD. * diff --git a/src/utility/constants.cpp b/src/utility/constants.cpp index 8e21b2325..c3edc2639 100644 --- a/src/utility/constants.cpp +++ b/src/utility/constants.cpp @@ -59,16 +59,62 @@ namespace storm { return value; } + // For floats we specialize this class and consider the comparison modulo some predefined precision. + template<> + class ConstantsComparator<float> { + public: + ConstantsComparator(); + + ConstantsComparator(float precision); + + bool isOne(float const& value) const; + + bool isZero(float const& value) const; + + bool isEqual(float const& value1, float const& value2) const; + + bool isConstant(float const& value) const; + + private: + // The precision used for comparisons. + float precision; + }; + + // For doubles we specialize this class and consider the comparison modulo some predefined precision. + template<> + class ConstantsComparator<double> { + public: + ConstantsComparator(); + + ConstantsComparator(double precision); + + bool isOne(double const& value) const; + + bool isZero(double const& value) const; + + bool isInfinity(double const& value) const; + + bool isEqual(double const& value1, double const& value2) const; + + bool isConstant(double const& value) const; + + private: + // The precision used for comparisons. + double precision; + }; + #ifdef STORM_HAVE_CARL template<> RationalFunction& simplify(RationalFunction& value); template<> RationalFunction&& simplify(RationalFunction&& value); - + template<> class ConstantsComparator<storm::RationalFunction> { public: + ConstantsComparator(); + bool isOne(storm::RationalFunction const& value) const; bool isZero(storm::RationalFunction const& value) const; @@ -81,6 +127,8 @@ namespace storm { template<> class ConstantsComparator<storm::Polynomial> { public: + ConstantsComparator(); + bool isOne(storm::Polynomial const& value) const; bool isZero(storm::Polynomial const& value) const; @@ -91,7 +139,6 @@ namespace storm { }; #endif - template<typename ValueType> bool ConstantsComparator<ValueType>::isOne(ValueType const& value) const { return value == one<ValueType>(); @@ -183,6 +230,10 @@ namespace storm { return std::move(value); } + ConstantsComparator<storm::RationalFunction>::ConstantsComparator() { + // Intentionally left empty. + } + bool ConstantsComparator<storm::RationalFunction>::isOne(storm::RationalFunction const& value) const { return value.isOne(); } @@ -199,6 +250,10 @@ namespace storm { return value.isConstant(); } + ConstantsComparator<storm::Polynomial>::ConstantsComparator() { + // Intentionally left empty. + } + bool ConstantsComparator<storm::Polynomial>::isOne(storm::Polynomial const& value) const { return value.isOne(); } diff --git a/src/utility/constants.h b/src/utility/constants.h index c91ea9fdf..ae2b2c0be 100644 --- a/src/utility/constants.h +++ b/src/utility/constants.h @@ -41,6 +41,9 @@ namespace storm { template<typename ValueType> class ConstantsComparator { public: + // This needs to be in here, otherwise the template specializations are not used properly. + ConstantsComparator(); + bool isOne(ValueType const& value) const; bool isZero(ValueType const& value) const; @@ -52,50 +55,6 @@ namespace storm { bool isInfinity(ValueType const& value) const; }; - // For floats we specialize this class and consider the comparison modulo some predefined precision. - template<> - class ConstantsComparator<float> { - public: - ConstantsComparator(); - - ConstantsComparator(float precision); - - bool isOne(float const& value) const; - - bool isZero(float const& value) const; - - bool isEqual(float const& value1, float const& value2) const; - - bool isConstant(float const& value) const; - - private: - // The precision used for comparisons. - float precision; - }; - - // For doubles we specialize this class and consider the comparison modulo some predefined precision. - template<> - class ConstantsComparator<double> { - public: - ConstantsComparator(); - - ConstantsComparator(double precision); - - bool isOne(double const& value) const; - - bool isZero(double const& value) const; - - bool isInfinity(double const& value) const; - - bool isEqual(double const& value1, double const& value2) const; - - bool isConstant(double const& value) const; - - private: - // The precision used for comparisons. - double precision; - }; - template<typename IndexType, typename ValueType> storm::storage::MatrixEntry<IndexType, ValueType>& simplify(storm::storage::MatrixEntry<IndexType, ValueType>& matrixEntry); diff --git a/src/utility/vector.h b/src/utility/vector.h index 8d4548267..c695fa6d9 100644 --- a/src/utility/vector.h +++ b/src/utility/vector.h @@ -192,6 +192,44 @@ namespace storm { } } + /*! + * Applies the given operation pointwise on the two given vectors and writes the result to the third vector. + * To obtain an in-place operation, the third vector may be equal to any of the other two vectors. + * + * @param firstOperand The first operand. + * @param secondOperand The second operand. + * @param target The target vector. + */ + template<class T> + void applyPointwise(std::vector<T> const& firstOperand, std::vector<T> const& secondOperand, std::vector<T>& target, std::function<T (T const&, T const&, T const&)> const& function) { +#ifdef STORM_HAVE_INTELTBB + tbb::parallel_for(tbb::blocked_range<uint_fast64_t>(0, target.size()), + [&](tbb::blocked_range<uint_fast64_t> const& range) { + auto firstIt = firstOperand.begin() + range.begin(); + auto firstIte = firstOperand.begin() + range.end(); + auto secondIt = secondOperand.begin() + range.begin(); + auto targetIt = target.begin() + range.begin(); + while (firstIt != firstIte) { + *targetIt = function(*firstIt, *secondIt, *targetIt); + ++targetIt; + ++firstIt; + ++secondIt; + } + }); +#else + auto firstIt = firstOperand.begin(); + auto firstIte = firstOperand.end(); + auto secondIt = secondOperand.begin(); + auto targetIt = target.begin(); + while (firstIt != firstIte) { + *targetIt = function(*firstIt, *secondIt, *targetIt); + ++targetIt; + ++firstIt; + ++secondIt; + } +#endif + } + /*! * Applies the given operation pointwise on the two given vectors and writes the result to the third vector. * To obtain an in-place operation, the third vector may be equal to any of the other two vectors. diff --git a/test/functional/builder/DdPrismModelBuilderTest.cpp b/test/functional/builder/DdPrismModelBuilderTest.cpp index 096d83fbf..4f9f8cbb5 100644 --- a/test/functional/builder/DdPrismModelBuilderTest.cpp +++ b/test/functional/builder/DdPrismModelBuilderTest.cpp @@ -4,7 +4,9 @@ #include "src/settings/SettingsManager.h" #include "src/settings/modules/GeneralSettings.h" #include "src/models/symbolic/Dtmc.h" +#include "src/models/symbolic/Ctmc.h" #include "src/models/symbolic/Mdp.h" +#include "src/models/symbolic/StandardRewardModel.h" #include "src/storage/dd/CuddDd.h" #include "src/storage/dd/CuddAdd.h" #include "src/storage/dd/CuddBdd.h" diff --git a/test/functional/builder/ExplicitPrismModelBuilderTest.cpp b/test/functional/builder/ExplicitPrismModelBuilderTest.cpp index 8c0a6e81e..3387f730d 100644 --- a/test/functional/builder/ExplicitPrismModelBuilderTest.cpp +++ b/test/functional/builder/ExplicitPrismModelBuilderTest.cpp @@ -1,5 +1,6 @@ #include "gtest/gtest.h" #include "storm-config.h" +#include "src/models/sparse/StandardRewardModel.h" #include "src/settings/SettingMemento.h" #include "src/parser/PrismParser.h" #include "src/builder/ExplicitPrismModelBuilder.h" diff --git a/test/functional/builder/cluster2.sm b/test/functional/builder/cluster2.sm index 5afd88f47..80b1085df 100644 --- a/test/functional/builder/cluster2.sm +++ b/test/functional/builder/cluster2.sm @@ -97,14 +97,14 @@ label "premium" = (left_n>=left_mx & toleft_n) | (right_n>=right_mx & toright_n) // Reward structures // Percentage of operational workstations stations -rewards "percent_op" - true : 100*(left_n+right_n)/(2*N); -endrewards +//rewards "percent_op" +// true : 100*(left_n+right_n)/(2*N); +//endrewards // Time that the system is not delivering at least minimum QoS -rewards "time_not_min" - !minimum : 1; -endrewards +//rewards "time_not_min" +// !minimum : 1; +//endrewards // Number of repairs rewards "num_repairs" diff --git a/test/functional/modelchecker/GmmxxDtmcPrctlModelCheckerTest.cpp b/test/functional/modelchecker/GmmxxDtmcPrctlModelCheckerTest.cpp index c0ad1325b..d7d1b2524 100644 --- a/test/functional/modelchecker/GmmxxDtmcPrctlModelCheckerTest.cpp +++ b/test/functional/modelchecker/GmmxxDtmcPrctlModelCheckerTest.cpp @@ -3,6 +3,7 @@ #include "src/logic/Formulas.h" #include "src/utility/solver.h" +#include "src/models/sparse/StandardRewardModel.h" #include "src/modelchecker/prctl/SparseDtmcPrctlModelChecker.h" #include "src/modelchecker/results/ExplicitQuantitativeCheckResult.h" #include "src/settings/SettingsManager.h" diff --git a/test/functional/modelchecker/GmmxxHybridDtmcPrctlModelCheckerTest.cpp b/test/functional/modelchecker/GmmxxHybridDtmcPrctlModelCheckerTest.cpp index b8cbcd701..5cc56d0ed 100644 --- a/test/functional/modelchecker/GmmxxHybridDtmcPrctlModelCheckerTest.cpp +++ b/test/functional/modelchecker/GmmxxHybridDtmcPrctlModelCheckerTest.cpp @@ -10,6 +10,7 @@ #include "src/parser/PrismParser.h" #include "src/builder/DdPrismModelBuilder.h" #include "src/models/symbolic/Dtmc.h" +#include "src/models/symbolic/StandardRewardModel.h" #include "src/settings/SettingsManager.h" #include "src/settings/modules/GeneralSettings.h" #include "src/settings/modules/GmmxxEquationSolverSettings.h" diff --git a/test/functional/modelchecker/GmmxxHybridMdpPrctlModelCheckerTest.cpp b/test/functional/modelchecker/GmmxxHybridMdpPrctlModelCheckerTest.cpp index 945d4bc6f..8162d0a5c 100644 --- a/test/functional/modelchecker/GmmxxHybridMdpPrctlModelCheckerTest.cpp +++ b/test/functional/modelchecker/GmmxxHybridMdpPrctlModelCheckerTest.cpp @@ -11,6 +11,7 @@ #include "src/parser/FormulaParser.h" #include "src/builder/DdPrismModelBuilder.h" #include "src/models/symbolic/Dtmc.h" +#include "src/models/symbolic/StandardRewardModel.h" #include "src/settings/SettingsManager.h" #include "src/settings/modules/GeneralSettings.h" diff --git a/test/functional/modelchecker/GmmxxMdpPrctlModelCheckerTest.cpp b/test/functional/modelchecker/GmmxxMdpPrctlModelCheckerTest.cpp index 5dc655e56..73541f562 100644 --- a/test/functional/modelchecker/GmmxxMdpPrctlModelCheckerTest.cpp +++ b/test/functional/modelchecker/GmmxxMdpPrctlModelCheckerTest.cpp @@ -4,6 +4,7 @@ #include "src/parser/FormulaParser.h" #include "src/logic/Formulas.h" #include "src/utility/solver.h" +#include "src/models/sparse/StandardRewardModel.h" #include "src/modelchecker/prctl/SparseMdpPrctlModelChecker.h" #include "src/modelchecker/results/ExplicitQuantitativeCheckResult.h" #include "src/settings/SettingsManager.h" diff --git a/test/functional/modelchecker/NativeCtmcCslModelCheckerTest.cpp b/test/functional/modelchecker/NativeCtmcCslModelCheckerTest.cpp index adb100e27..ebfc2bbe6 100644 --- a/test/functional/modelchecker/NativeCtmcCslModelCheckerTest.cpp +++ b/test/functional/modelchecker/NativeCtmcCslModelCheckerTest.cpp @@ -14,7 +14,7 @@ #include "src/settings/modules/GeneralSettings.h" -TEST(SparseCtmcCslModelCheckerTest, Cluster) { +TEST(NativeCtmcCslModelCheckerTest, Cluster) { // Set the PRISM compatibility mode temporarily. It is set to its old value once the returned object is destructed. std::unique_ptr<storm::settings::SettingMemento> enablePrismCompatibility = storm::settings::mutableGeneralSettings().overridePrismCompatibilityMode(true); @@ -90,7 +90,7 @@ TEST(SparseCtmcCslModelCheckerTest, Cluster) { EXPECT_NEAR(0.8602815057967503, quantitativeCheckResult7[initialState], storm::settings::generalSettings().getPrecision()); } -TEST(SparseCtmcCslModelCheckerTest, Embedded) { +TEST(NativeCtmcCslModelCheckerTest, Embedded) { // Set the PRISM compatibility mode temporarily. It is set to its old value once the returned object is destructed. std::unique_ptr<storm::settings::SettingMemento> enablePrismCompatibility = storm::settings::mutableGeneralSettings().overridePrismCompatibilityMode(true); @@ -152,7 +152,7 @@ TEST(SparseCtmcCslModelCheckerTest, Embedded) { EXPECT_NEAR(2.7745274082080154, quantitativeCheckResult5[initialState], storm::settings::generalSettings().getPrecision()); } -TEST(SparseCtmcCslModelCheckerTest, Polling) { +TEST(NativeCtmcCslModelCheckerTest, Polling) { // Set the PRISM compatibility mode temporarily. It is set to its old value once the returned object is destructed. std::unique_ptr<storm::settings::SettingMemento> enablePrismCompatibility = storm::settings::mutableGeneralSettings().overridePrismCompatibilityMode(true); @@ -179,14 +179,14 @@ TEST(SparseCtmcCslModelCheckerTest, Polling) { EXPECT_NEAR(1, quantitativeCheckResult1[initialState], storm::settings::generalSettings().getPrecision()); } -TEST(SparseCtmcCslModelCheckerTest, Fms) { +TEST(NativeCtmcCslModelCheckerTest, Fms) { // Set the PRISM compatibility mode temporarily. It is set to its old value once the returned object is destructed. std::unique_ptr<storm::settings::SettingMemento> enablePrismCompatibility = storm::settings::mutableGeneralSettings().overridePrismCompatibilityMode(true); // No properties to check at this point. } -TEST(SparseCtmcCslModelCheckerTest, Tandem) { +TEST(NativeCtmcCslModelCheckerTest, Tandem) { // Set the PRISM compatibility mode temporarily. It is set to its old value once the returned object is destructed. std::unique_ptr<storm::settings::SettingMemento> enablePrismCompatibility = storm::settings::mutableGeneralSettings().overridePrismCompatibilityMode(true); diff --git a/test/functional/modelchecker/NativeDtmcPrctlModelCheckerTest.cpp b/test/functional/modelchecker/NativeDtmcPrctlModelCheckerTest.cpp index 9b6a4aa00..c9730e795 100644 --- a/test/functional/modelchecker/NativeDtmcPrctlModelCheckerTest.cpp +++ b/test/functional/modelchecker/NativeDtmcPrctlModelCheckerTest.cpp @@ -4,6 +4,7 @@ #include "src/settings/SettingMemento.h" #include "src/logic/Formulas.h" #include "src/utility/solver.h" +#include "src/models/sparse/StandardRewardModel.h" #include "src/modelchecker/prctl/SparseDtmcPrctlModelChecker.h" #include "src/modelchecker/results/ExplicitQuantitativeCheckResult.h" #include "src/settings/SettingsManager.h" diff --git a/test/functional/modelchecker/NativeHybridDtmcPrctlModelCheckerTest.cpp b/test/functional/modelchecker/NativeHybridDtmcPrctlModelCheckerTest.cpp index 2a0d8cd7b..688fa8a16 100644 --- a/test/functional/modelchecker/NativeHybridDtmcPrctlModelCheckerTest.cpp +++ b/test/functional/modelchecker/NativeHybridDtmcPrctlModelCheckerTest.cpp @@ -9,6 +9,7 @@ #include "src/modelchecker/results/SymbolicQuantitativeCheckResult.h" #include "src/parser/PrismParser.h" #include "src/builder/DdPrismModelBuilder.h" +#include "src/models/symbolic/StandardRewardModel.h" #include "src/models/symbolic/Dtmc.h" #include "src/settings/SettingsManager.h" #include "src/settings/modules/GeneralSettings.h" diff --git a/test/functional/modelchecker/NativeHybridMdpPrctlModelCheckerTest.cpp b/test/functional/modelchecker/NativeHybridMdpPrctlModelCheckerTest.cpp index 4918451b7..5b67f31e2 100644 --- a/test/functional/modelchecker/NativeHybridMdpPrctlModelCheckerTest.cpp +++ b/test/functional/modelchecker/NativeHybridMdpPrctlModelCheckerTest.cpp @@ -11,6 +11,7 @@ #include "src/parser/PrismParser.h" #include "src/builder/DdPrismModelBuilder.h" #include "src/models/symbolic/Dtmc.h" +#include "src/models/symbolic/StandardRewardModel.h" #include "src/settings/SettingsManager.h" #include "src/settings/modules/GeneralSettings.h" diff --git a/test/functional/modelchecker/NativeMdpPrctlModelCheckerTest.cpp b/test/functional/modelchecker/NativeMdpPrctlModelCheckerTest.cpp index 648bdd037..e4123495a 100644 --- a/test/functional/modelchecker/NativeMdpPrctlModelCheckerTest.cpp +++ b/test/functional/modelchecker/NativeMdpPrctlModelCheckerTest.cpp @@ -4,6 +4,7 @@ #include "src/parser/FormulaParser.h" #include "src/logic/Formulas.h" #include "src/utility/solver.h" +#include "src/models/sparse/StandardRewardModel.h" #include "src/modelchecker/prctl/SparseMdpPrctlModelChecker.h" #include "src/modelchecker/results/ExplicitQuantitativeCheckResult.h" #include "src/settings/SettingsManager.h" diff --git a/test/functional/modelchecker/SparseDtmcEliminationModelCheckerTest.cpp b/test/functional/modelchecker/SparseDtmcEliminationModelCheckerTest.cpp index 86b4494f8..d660862ec 100644 --- a/test/functional/modelchecker/SparseDtmcEliminationModelCheckerTest.cpp +++ b/test/functional/modelchecker/SparseDtmcEliminationModelCheckerTest.cpp @@ -2,6 +2,7 @@ #include "storm-config.h" #include "src/logic/Formulas.h" +#include "src/models/sparse/StandardRewardModel.h" #include "src/modelchecker/reachability/SparseDtmcEliminationModelChecker.h" #include "src/modelchecker/results/ExplicitQuantitativeCheckResult.h" #include "src/settings/SettingsManager.h" diff --git a/test/functional/modelchecker/SymbolicDtmcPrctlModelCheckerTest.cpp b/test/functional/modelchecker/SymbolicDtmcPrctlModelCheckerTest.cpp index 574f1752c..1b1071a58 100644 --- a/test/functional/modelchecker/SymbolicDtmcPrctlModelCheckerTest.cpp +++ b/test/functional/modelchecker/SymbolicDtmcPrctlModelCheckerTest.cpp @@ -8,6 +8,7 @@ #include "src/modelchecker/results/SymbolicQuantitativeCheckResult.h" #include "src/parser/PrismParser.h" #include "src/builder/DdPrismModelBuilder.h" +#include "src/models/symbolic/StandardRewardModel.h" #include "src/models/symbolic/Dtmc.h" #include "src/settings/SettingsManager.h" diff --git a/test/functional/modelchecker/TopologicalValueIterationMdpPrctlModelCheckerTest.cpp b/test/functional/modelchecker/TopologicalValueIterationMdpPrctlModelCheckerTest.cpp index 159568433..e07c04e20 100644 --- a/test/functional/modelchecker/TopologicalValueIterationMdpPrctlModelCheckerTest.cpp +++ b/test/functional/modelchecker/TopologicalValueIterationMdpPrctlModelCheckerTest.cpp @@ -4,6 +4,7 @@ #include "src/parser/FormulaParser.h" #include "src/logic/Formulas.h" #include "src/utility/solver.h" +#include "src/models/sparse/StandardRewardModel.h" #include "src/modelchecker/prctl/SparseMdpPrctlModelChecker.h" #include "src/modelchecker/results/ExplicitQuantitativeCheckResult.h" #include "src/settings/SettingsManager.h" diff --git a/test/functional/parser/AutoParserTest.cpp b/test/functional/parser/AutoParserTest.cpp index c3d8e0082..dd4ff7286 100644 --- a/test/functional/parser/AutoParserTest.cpp +++ b/test/functional/parser/AutoParserTest.cpp @@ -1,6 +1,7 @@ #include "gtest/gtest.h" #include "storm-config.h" +#include "src/models/sparse/StandardRewardModel.h" #include "src/parser/AutoParser.h" #include "src/exceptions/FileIoException.h" #include "src/exceptions/WrongFormatException.h" diff --git a/test/functional/parser/DeterministicModelParserTest.cpp b/test/functional/parser/DeterministicModelParserTest.cpp index 154b06114..d8c23f2f1 100644 --- a/test/functional/parser/DeterministicModelParserTest.cpp +++ b/test/functional/parser/DeterministicModelParserTest.cpp @@ -1,6 +1,7 @@ #include "gtest/gtest.h" #include "storm-config.h" +#include "src/models/sparse/StandardRewardModel.h" #include "src/parser/DeterministicModelParser.h" #include "src/models/sparse/Dtmc.h" #include "src/models/sparse/Ctmc.h" diff --git a/test/functional/parser/MarkovAutomatonParserTest.cpp b/test/functional/parser/MarkovAutomatonParserTest.cpp index 9152dab08..a9f0552fe 100644 --- a/test/functional/parser/MarkovAutomatonParserTest.cpp +++ b/test/functional/parser/MarkovAutomatonParserTest.cpp @@ -2,6 +2,7 @@ #include "storm-config.h" #include "src/parser/MarkovAutomatonParser.h" +#include "src/models/sparse/StandardRewardModel.h" #include "src/exceptions/FileIoException.h" #include "src/exceptions/OutOfRangeException.h" diff --git a/test/functional/parser/NondeterministicModelParserTest.cpp b/test/functional/parser/NondeterministicModelParserTest.cpp index 7f956d06f..9beda9450 100644 --- a/test/functional/parser/NondeterministicModelParserTest.cpp +++ b/test/functional/parser/NondeterministicModelParserTest.cpp @@ -3,6 +3,7 @@ #include "src/parser/NondeterministicModelParser.h" #include "src/models/sparse/Mdp.h" +#include "src/models/sparse/StandardRewardModel.h" #include "src/exceptions/FileIoException.h" #include "src/exceptions/OutOfRangeException.h" diff --git a/test/functional/storage/DeterministicModelBisimulationDecompositionTest.cpp b/test/functional/storage/DeterministicModelBisimulationDecompositionTest.cpp index 23b3a6be6..a995bbea0 100644 --- a/test/functional/storage/DeterministicModelBisimulationDecompositionTest.cpp +++ b/test/functional/storage/DeterministicModelBisimulationDecompositionTest.cpp @@ -1,7 +1,8 @@ #include "gtest/gtest.h" #include "storm-config.h" #include "src/parser/AutoParser.h" -#include "storage/DeterministicModelBisimulationDecomposition.h" +#include "src/storage/DeterministicModelBisimulationDecomposition.h" +#include "src/models/sparse/StandardRewardModel.h" TEST(DeterministicModelBisimulationDecomposition, Die) { std::shared_ptr<storm::models::sparse::Model<double>> abstractModel = storm::parser::AutoParser::parseModel(STORM_CPP_BASE_PATH "/examples/dtmc/die/die.tra", STORM_CPP_BASE_PATH "/examples/dtmc/die/die.lab", "", ""); diff --git a/test/functional/storage/MaximalEndComponentDecompositionTest.cpp b/test/functional/storage/MaximalEndComponentDecompositionTest.cpp index ea3b2826e..0cbac96c1 100644 --- a/test/functional/storage/MaximalEndComponentDecompositionTest.cpp +++ b/test/functional/storage/MaximalEndComponentDecompositionTest.cpp @@ -3,6 +3,7 @@ #include "src/parser/AutoParser.h" #include "src/storage/MaximalEndComponentDecomposition.h" #include "src/models/sparse/MarkovAutomaton.h" +#include "src/models/sparse/StandardRewardModel.h" TEST(MaximalEndComponentDecomposition, FullSystem1) { std::shared_ptr<storm::models::sparse::Model<double>> abstractModel = storm::parser::AutoParser::parseModel(STORM_CPP_BASE_PATH "/examples/ma/tiny/tiny1.tra", STORM_CPP_BASE_PATH "/examples/ma/tiny/tiny1.lab", "", ""); diff --git a/test/functional/utility/GraphTest.cpp b/test/functional/utility/GraphTest.cpp index 2d4d7615d..d58de5ca9 100644 --- a/test/functional/utility/GraphTest.cpp +++ b/test/functional/utility/GraphTest.cpp @@ -5,8 +5,10 @@ #include "src/parser/PrismParser.h" #include "src/models/symbolic/Dtmc.h" #include "src/models/symbolic/Mdp.h" +#include "src/models/symbolic/StandardRewardModel.h" #include "src/models/sparse/Dtmc.h" #include "src/models/sparse/Mdp.h" +#include "src/models/sparse/StandardRewardModel.h" #include "src/builder/DdPrismModelBuilder.h" #include "src/builder/ExplicitPrismModelBuilder.h" #include "src/utility/graph.h"