Storm 1.14.0.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
MarkovAutomaton.cpp
Go to the documentation of this file.
2
8
9namespace storm {
10namespace models {
11namespace symbolic {
12
13template<storm::dd::DdType Type, typename ValueType>
15 std::shared_ptr<storm::dd::DdManager<Type>> manager, storm::dd::Bdd<Type> markovianMarker, storm::dd::Bdd<Type> reachableStates,
17 std::set<storm::expressions::Variable> const& rowVariables, std::shared_ptr<storm::adapters::AddExpressionAdapter<Type, ValueType>> rowExpressionAdapter,
18 std::set<storm::expressions::Variable> const& columnVariables,
19 std::vector<std::pair<storm::expressions::Variable, storm::expressions::Variable>> const& rowColumnMetaVariablePairs,
20 std::set<storm::expressions::Variable> const& nondeterminismVariables, std::map<std::string, storm::expressions::Expression> labelToExpressionMap,
21 std::unordered_map<std::string, RewardModelType> const& rewardModels)
22 : NondeterministicModel<Type, ValueType>(storm::models::ModelType::MarkovAutomaton, manager, reachableStates, initialStates, deadlockStates,
23 transitionMatrix, rowVariables, rowExpressionAdapter, columnVariables, rowColumnMetaVariablePairs,
24 nondeterminismVariables, labelToExpressionMap, rewardModels),
25 markovianMarker(markovianMarker) {
26 // Compute all Markovian info.
27 computeMarkovianChoicesAndStates();
28 convertToExitRatesAndProbabilities();
29}
30
31template<storm::dd::DdType Type, typename ValueType>
33 std::shared_ptr<storm::dd::DdManager<Type>> manager, storm::dd::Bdd<Type> markovianMarker, storm::dd::Bdd<Type> reachableStates,
35 std::set<storm::expressions::Variable> const& rowVariables, std::set<storm::expressions::Variable> const& columnVariables,
36 std::vector<std::pair<storm::expressions::Variable, storm::expressions::Variable>> const& rowColumnMetaVariablePairs,
37 std::set<storm::expressions::Variable> const& nondeterminismVariables, std::map<std::string, storm::dd::Bdd<Type>> labelToBddMap,
38 std::unordered_map<std::string, RewardModelType> const& rewardModels, std::optional<storm::dd::Add<Type, ValueType>> exitRateVector)
39 : NondeterministicModel<Type, ValueType>(storm::models::ModelType::MarkovAutomaton, manager, reachableStates, initialStates, deadlockStates,
40 transitionMatrix, rowVariables, columnVariables, rowColumnMetaVariablePairs, nondeterminismVariables,
41 labelToBddMap, rewardModels),
42 markovianMarker(markovianMarker) {
43 computeMarkovianChoicesAndStates();
44 if (exitRateVector) {
45 // The given transition matrix is already correctly normalized and the exit rates are already known.
46 this->exitRateVector = std::move(exitRateVector).value();
47 } else {
48 // Derive the exit rates from the (not yet normalized) transition matrix.
49 convertToExitRatesAndProbabilities();
50 }
51}
52
53template<storm::dd::DdType Type, typename ValueType>
54void MarkovAutomaton<Type, ValueType>::computeMarkovianChoicesAndStates() {
55 // Compute the Markovian choices.
56 this->markovianChoices = this->getQualitativeTransitionMatrix() && this->markovianMarker;
57
58 // Compute the probabilistic states.
59 std::set<storm::expressions::Variable> columnAndNondeterminsmVariables;
60 std::set_union(this->getColumnVariables().begin(), this->getColumnVariables().end(), this->getNondeterminismVariables().begin(),
61 this->getNondeterminismVariables().end(), std::inserter(columnAndNondeterminsmVariables, columnAndNondeterminsmVariables.begin()));
62 this->probabilisticStates = (this->getQualitativeTransitionMatrix() && !markovianMarker).existsAbstract(columnAndNondeterminsmVariables);
63
64 // Compute the Markovian states.
65 this->markovianStates = markovianChoices.existsAbstract(columnAndNondeterminsmVariables);
66}
67
68template<storm::dd::DdType Type, typename ValueType>
69void MarkovAutomaton<Type, ValueType>::convertToExitRatesAndProbabilities() {
70 std::set<storm::expressions::Variable> columnAndNondeterminsmVariables;
71 std::set_union(this->getColumnVariables().begin(), this->getColumnVariables().end(), this->getNondeterminismVariables().begin(),
72 this->getNondeterminismVariables().end(), std::inserter(columnAndNondeterminsmVariables, columnAndNondeterminsmVariables.begin()));
73
74 // Compute the vector of exit rates.
75 this->exitRateVector = (this->getTransitionMatrix() * this->markovianMarker.template toAdd<ValueType>()).sumAbstract(columnAndNondeterminsmVariables);
76
77 // Modify the transition matrix so all choices are probabilistic and the Markovian choices additionally
78 // have a rate.
79 this->transitionMatrix = this->transitionMatrix / this->markovianChoices.ite(this->exitRateVector, this->getManager().template getAddOne<ValueType>());
80}
81
82template<storm::dd::DdType Type, typename ValueType>
84 return this->markovianMarker;
85}
86
87template<storm::dd::DdType Type, typename ValueType>
89 return this->markovianStates;
90}
91
92template<storm::dd::DdType Type, typename ValueType>
94 return this->markovianChoices;
95}
96
97template<storm::dd::DdType Type, typename ValueType>
99 return this->markovianStates;
100}
101
102template<storm::dd::DdType Type, typename ValueType>
104 return !(this->probabilisticStates && this->markovianStates).isZero();
105}
106
107template<storm::dd::DdType Type, typename ValueType>
111
112template<storm::dd::DdType Type, typename ValueType>
114 // Create the new transition matrix by deleting all Markovian transitions from probabilistic states.
115 storm::dd::Add<Type, ValueType> newTransitionMatrix = this->probabilisticStates.ite(
116 this->getTransitionMatrix() * (!this->getMarkovianMarker()).template toAdd<ValueType>(), this->getTransitionMatrix() * this->getExitRateVector());
117
119 this->getDeadlockStates(), newTransitionMatrix, this->getRowVariables(), this->getRowExpressionAdapter(),
122}
123
124template<storm::dd::DdType Type, typename ValueType>
128
129template<storm::dd::DdType Type, typename ValueType>
130template<typename NewValueType>
131std::shared_ptr<MarkovAutomaton<Type, NewValueType>> MarkovAutomaton<Type, ValueType>::toValueType() const {
132 typedef typename NondeterministicModel<Type, NewValueType>::RewardModelType NewRewardModelType;
133 std::unordered_map<std::string, NewRewardModelType> newRewardModels;
134
135 for (auto const& e : this->getRewardModels()) {
136 newRewardModels.emplace(e.first, e.second.template toValueType<NewValueType>());
137 }
138
139 auto newLabelToBddMap = this->getLabelToBddMap();
140 newLabelToBddMap.erase("init");
141 newLabelToBddMap.erase("deadlock");
142 // Convert expression-based labels to BDD-based ones.
143 for (auto const& labelExpressionPair : this->getLabelToExpressionMap()) {
144 newLabelToBddMap.emplace(labelExpressionPair.first, this->getStates(labelExpressionPair.first));
145 }
146
147 return std::make_shared<MarkovAutomaton<Type, NewValueType>>(
150 this->getRowColumnMetaVariablePairs(), this->getNondeterminismVariables(), newLabelToBddMap, newRewardModels,
151 this->exitRateVector.template toValueType<NewValueType>());
152}
153
154// Explicitly instantiate the template class.
156
159template std::shared_ptr<MarkovAutomaton<storm::dd::DdType::Sylvan, double>> MarkovAutomaton<storm::dd::DdType::Sylvan, storm::RationalNumber>::toValueType()
160 const;
162
163} // namespace symbolic
164} // namespace models
165} // namespace storm
This class represents a discrete-time Markov decision process.
storm::dd::Bdd< Type > const & getProbabilisticStates() const
MarkovAutomaton< Type, ValueType > close()
storm::dd::Bdd< Type > const & getMarkovianStates() const
MarkovAutomaton(MarkovAutomaton< Type, ValueType > const &other)=default
storm::dd::Bdd< Type > const & getMarkovianMarker() const
std::shared_ptr< MarkovAutomaton< Type, NewValueType > > toValueType() const
storm::dd::Add< Type, ValueType > const & getExitRateVector() const
storm::dd::Bdd< Type > const & getMarkovianChoices() const
storm::dd::Add< Type, ValueType > const & getTransitionMatrix() const
Definition Model.cpp:174
storm::dd::Bdd< Type > const & getDeadlockStates() const
Definition Model.cpp:109
std::shared_ptr< storm::adapters::AddExpressionAdapter< Type, ValueType > > const & getRowExpressionAdapter() const
Definition Model.cpp:376
std::set< storm::expressions::Variable > const & getColumnVariables() const
Definition Model.cpp:194
std::shared_ptr< storm::dd::DdManager< Type > > const & getManagerAsSharedPointer() const
Definition Model.cpp:94
std::map< std::string, storm::dd::Bdd< Type > > const & getLabelToBddMap() const
Definition Model.cpp:230
storm::dd::Bdd< Type > const & getInitialStates() const
Definition Model.cpp:104
storm::dd::Add< Type, ValueType > transitionMatrix
Definition Model.h:393
std::vector< std::pair< storm::expressions::Variable, storm::expressions::Variable > > const & getRowColumnMetaVariablePairs() const
Definition Model.cpp:220
std::set< storm::expressions::Variable > const & getRowVariables() const
Definition Model.cpp:189
std::map< std::string, storm::expressions::Expression > const & getLabelToExpressionMap() const
Definition Model.cpp:225
std::unordered_map< std::string, RewardModelType > & getRewardModels()
Definition Model.cpp:295
storm::dd::Bdd< Type > const & getReachableStates() const
Definition Model.cpp:99
virtual std::set< storm::expressions::Variable > const & getNondeterminismVariables() const override
Model< Type, ValueType >::RewardModelType RewardModelType
NondeterministicModel(NondeterministicModel< Type, double > const &other)=default
storm::dd::Bdd< Type > Model< Type, ValueType >::getQualitativeTransitionMatrix(bool) const
Definition Model.cpp:184