Browse Source

more bug fixes

Former-commit-id: 0b33b30efa
main
dehnert 10 years ago
parent
commit
b3178e17f6
  1. 119
      src/builder/DdPrismModelBuilder.cpp
  2. 4
      src/builder/DdPrismModelBuilder.h
  3. 24
      src/builder/ExplicitPrismModelBuilder.cpp
  4. 5
      src/modelchecker/csl/helper/HybridCtmcCslHelper.cpp
  5. 6
      src/modelchecker/csl/helper/SparseCtmcCslHelper.cpp
  6. 2
      src/modelchecker/prctl/helper/HybridDtmcPrctlHelper.cpp
  7. 2
      src/modelchecker/prctl/helper/HybridMdpPrctlHelper.cpp
  8. 2
      src/modelchecker/prctl/helper/SymbolicDtmcPrctlHelper.cpp
  9. 1
      src/modelchecker/propositional/SparsePropositionalModelChecker.cpp
  10. 1
      src/modelchecker/propositional/SymbolicPropositionalModelChecker.cpp
  11. 1
      src/modelchecker/reachability/SparseDtmcEliminationModelChecker.cpp
  12. 2
      src/models/sparse/Ctmc.cpp
  13. 1
      src/models/sparse/DeterministicModel.cpp
  14. 2
      src/models/sparse/Dtmc.cpp
  15. 2
      src/models/sparse/MarkovAutomaton.cpp
  16. 2
      src/models/sparse/Mdp.cpp
  17. 2
      src/models/sparse/Model.cpp
  18. 3
      src/models/sparse/Model.h
  19. 2
      src/models/sparse/NondeterministicModel.cpp
  20. 41
      src/models/sparse/StandardRewardModel.cpp
  21. 17
      src/models/sparse/StandardRewardModel.h
  22. 2
      src/models/sparse/StochasticTwoPlayerGame.cpp
  23. 3
      src/models/symbolic/Ctmc.cpp
  24. 2
      src/models/symbolic/DeterministicModel.cpp
  25. 3
      src/models/symbolic/Dtmc.cpp
  26. 4
      src/models/symbolic/Mdp.cpp
  27. 2
      src/models/symbolic/Model.cpp
  28. 4
      src/models/symbolic/Model.h
  29. 3
      src/models/symbolic/NondeterministicModel.cpp
  30. 17
      src/models/symbolic/StandardRewardModel.cpp
  31. 13
      src/models/symbolic/StandardRewardModel.h
  32. 3
      src/models/symbolic/StochasticTwoPlayerGame.cpp
  33. 2
      src/parser/AutoParser.cpp
  34. 2
      src/parser/DeterministicModelParser.cpp
  35. 3
      src/parser/MarkovAutomatonParser.cpp
  36. 2
      src/parser/NondeterministicModelParser.cpp
  37. 3
      src/storage/DeterministicModelBisimulationDecomposition.cpp
  38. 2
      src/storage/MaximalEndComponentDecomposition.cpp
  39. 1
      src/storage/StronglyConnectedComponentDecomposition.cpp
  40. 14
      src/storage/dd/CuddDd.h
  41. 59
      src/utility/constants.cpp
  42. 47
      src/utility/constants.h
  43. 38
      src/utility/vector.h
  44. 2
      test/functional/builder/DdPrismModelBuilderTest.cpp
  45. 1
      test/functional/builder/ExplicitPrismModelBuilderTest.cpp
  46. 12
      test/functional/builder/cluster2.sm
  47. 1
      test/functional/modelchecker/GmmxxDtmcPrctlModelCheckerTest.cpp
  48. 1
      test/functional/modelchecker/GmmxxHybridDtmcPrctlModelCheckerTest.cpp
  49. 1
      test/functional/modelchecker/GmmxxHybridMdpPrctlModelCheckerTest.cpp
  50. 1
      test/functional/modelchecker/GmmxxMdpPrctlModelCheckerTest.cpp
  51. 10
      test/functional/modelchecker/NativeCtmcCslModelCheckerTest.cpp
  52. 1
      test/functional/modelchecker/NativeDtmcPrctlModelCheckerTest.cpp
  53. 1
      test/functional/modelchecker/NativeHybridDtmcPrctlModelCheckerTest.cpp
  54. 1
      test/functional/modelchecker/NativeHybridMdpPrctlModelCheckerTest.cpp
  55. 1
      test/functional/modelchecker/NativeMdpPrctlModelCheckerTest.cpp
  56. 1
      test/functional/modelchecker/SparseDtmcEliminationModelCheckerTest.cpp
  57. 1
      test/functional/modelchecker/SymbolicDtmcPrctlModelCheckerTest.cpp
  58. 1
      test/functional/modelchecker/TopologicalValueIterationMdpPrctlModelCheckerTest.cpp
  59. 1
      test/functional/parser/AutoParserTest.cpp
  60. 1
      test/functional/parser/DeterministicModelParserTest.cpp
  61. 1
      test/functional/parser/MarkovAutomatonParserTest.cpp
  62. 1
      test/functional/parser/NondeterministicModelParserTest.cpp
  63. 3
      test/functional/storage/DeterministicModelBisimulationDecompositionTest.cpp
  64. 1
      test/functional/storage/MaximalEndComponentDecompositionTest.cpp
  65. 2
      test/functional/utility/GraphTest.cpp

119
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()) {

4
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);

24
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()));
}
}
}

5
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.

6
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);

2
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"

2
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"

2
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"

1
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"

1
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"

1
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"

2
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"

1
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"

2
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"

2
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"

2
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 {

2
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"

3
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.

2
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 {

41
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
}
}
}

17
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);
}
}
}

2
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 {

3
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 {

2
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 {

3
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 {

4
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 {

2
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 {

4
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.
*/

3
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 {

17
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);
}

13
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.
*

3
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 {

2
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"

2
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"

3
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"

2
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"

3
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 {

2
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"

1
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 {

14
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.
*

59
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();
}

47
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);

38
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.

2
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"

1
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"

12
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"

1
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"

1
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"

1
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"

1
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"

10
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);

1
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"

1
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"

1
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"

1
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"

1
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"

1
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"

1
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"

1
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"

1
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"

1
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"

1
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"

3
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", "", "");

1
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", "", "");

2
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"

|||||||
100:0
Loading…
Cancel
Save