Storm
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
MarkovAutomaton.cpp
Go to the documentation of this file.
2
6
8
10
11namespace storm {
12namespace models {
13namespace symbolic {
14
15template<storm::dd::DdType Type, typename ValueType>
17 std::shared_ptr<storm::dd::DdManager<Type>> manager, storm::dd::Bdd<Type> markovianMarker, storm::dd::Bdd<Type> reachableStates,
18 storm::dd::Bdd<Type> initialStates, storm::dd::Bdd<Type> deadlockStates, storm::dd::Add<Type, ValueType> transitionMatrix,
19 std::set<storm::expressions::Variable> const& rowVariables, std::shared_ptr<storm::adapters::AddExpressionAdapter<Type, ValueType>> rowExpressionAdapter,
20 std::set<storm::expressions::Variable> const& columnVariables,
21 std::vector<std::pair<storm::expressions::Variable, storm::expressions::Variable>> const& rowColumnMetaVariablePairs,
22 std::set<storm::expressions::Variable> const& nondeterminismVariables, std::map<std::string, storm::expressions::Expression> labelToExpressionMap,
23 std::unordered_map<std::string, RewardModelType> const& rewardModels)
24 : NondeterministicModel<Type, ValueType>(storm::models::ModelType::MarkovAutomaton, manager, reachableStates, initialStates, deadlockStates,
25 transitionMatrix, rowVariables, rowExpressionAdapter, columnVariables, rowColumnMetaVariablePairs,
26 nondeterminismVariables, labelToExpressionMap, rewardModels),
27 markovianMarker(markovianMarker) {
28 // Compute all Markovian info.
29 computeMarkovianInfo();
30}
31
32template<storm::dd::DdType Type, typename ValueType>
34 std::shared_ptr<storm::dd::DdManager<Type>> manager, storm::dd::Bdd<Type> markovianMarker, storm::dd::Bdd<Type> reachableStates,
35 storm::dd::Bdd<Type> initialStates, storm::dd::Bdd<Type> deadlockStates, storm::dd::Add<Type, ValueType> transitionMatrix,
36 std::set<storm::expressions::Variable> const& rowVariables, std::set<storm::expressions::Variable> const& columnVariables,
37 std::vector<std::pair<storm::expressions::Variable, storm::expressions::Variable>> const& rowColumnMetaVariablePairs,
38 std::set<storm::expressions::Variable> const& nondeterminismVariables, std::map<std::string, storm::dd::Bdd<Type>> labelToBddMap,
39 std::unordered_map<std::string, RewardModelType> const& rewardModels)
40 : NondeterministicModel<Type, ValueType>(storm::models::ModelType::MarkovAutomaton, manager, reachableStates, initialStates, deadlockStates,
41 transitionMatrix, rowVariables, columnVariables, rowColumnMetaVariablePairs, nondeterminismVariables,
42 labelToBddMap, rewardModels),
43 markovianMarker(markovianMarker) {
44 // Compute all Markovian info.
45 computeMarkovianInfo();
46}
47
48template<storm::dd::DdType Type, typename ValueType>
50 // Compute the Markovian choices.
51 this->markovianChoices = this->getQualitativeTransitionMatrix() && this->markovianMarker;
52
53 // Compute the probabilistic states.
54 std::set<storm::expressions::Variable> columnAndNondeterminsmVariables;
55 std::set_union(this->getColumnVariables().begin(), this->getColumnVariables().end(), this->getNondeterminismVariables().begin(),
56 this->getNondeterminismVariables().end(), std::inserter(columnAndNondeterminsmVariables, columnAndNondeterminsmVariables.begin()));
57 this->probabilisticStates = (this->getQualitativeTransitionMatrix() && !markovianMarker).existsAbstract(columnAndNondeterminsmVariables);
58
59 // Compute the Markovian states.
60 this->markovianStates = markovianChoices.existsAbstract(columnAndNondeterminsmVariables);
61
62 // Compute the vector of exit rates.
63 this->exitRateVector = (this->getTransitionMatrix() * this->markovianMarker.template toAdd<ValueType>()).sumAbstract(columnAndNondeterminsmVariables);
64
65 // Modify the transition matrix so all choices are probabilistic and the Markovian choices additionally
66 // have a rate.
67 this->transitionMatrix = this->transitionMatrix / this->markovianChoices.ite(this->exitRateVector, this->getManager().template getAddOne<ValueType>());
68}
69
70template<storm::dd::DdType Type, typename ValueType>
72 return this->markovianMarker;
73}
74
75template<storm::dd::DdType Type, typename ValueType>
77 return this->markovianStates;
78}
79
80template<storm::dd::DdType Type, typename ValueType>
82 return this->markovianChoices;
83}
84
85template<storm::dd::DdType Type, typename ValueType>
87 return this->markovianStates;
88}
89
90template<storm::dd::DdType Type, typename ValueType>
92 return !(this->probabilisticStates && this->markovianStates).isZero();
93}
94
95template<storm::dd::DdType Type, typename ValueType>
97 return !this->hasHybridStates();
98}
99
100template<storm::dd::DdType Type, typename ValueType>
102 // Create the new transition matrix by deleting all Markovian transitions from probabilistic states.
103 storm::dd::Add<Type, ValueType> newTransitionMatrix = this->probabilisticStates.ite(
104 this->getTransitionMatrix() * (!this->getMarkovianMarker()).template toAdd<ValueType>(), this->getTransitionMatrix() * this->getExitRateVector());
105
106 return MarkovAutomaton<Type, ValueType>(this->getManagerAsSharedPointer(), this->getMarkovianMarker(), this->getReachableStates(), this->getInitialStates(),
107 this->getDeadlockStates(), newTransitionMatrix, this->getRowVariables(), this->getRowExpressionAdapter(),
108 this->getColumnVariables(), this->getRowColumnMetaVariablePairs(), this->getNondeterminismVariables(),
109 this->getLabelToExpressionMap(), this->getRewardModels());
110}
111
112template<storm::dd::DdType Type, typename ValueType>
116
117template<storm::dd::DdType Type, typename ValueType>
118template<typename NewValueType>
119std::shared_ptr<MarkovAutomaton<Type, NewValueType>> MarkovAutomaton<Type, ValueType>::toValueType() const {
120 typedef typename NondeterministicModel<Type, NewValueType>::RewardModelType NewRewardModelType;
121 std::unordered_map<std::string, NewRewardModelType> newRewardModels;
122
123 for (auto const& e : this->getRewardModels()) {
124 newRewardModels.emplace(e.first, e.second.template toValueType<NewValueType>());
125 }
126
127 auto newLabelToBddMap = this->getLabelToBddMap();
128 newLabelToBddMap.erase("init");
129 newLabelToBddMap.erase("deadlock");
130
131 return std::make_shared<MarkovAutomaton<Type, NewValueType>>(
132 this->getManagerAsSharedPointer(), this->getMarkovianMarker(), this->getReachableStates(), this->getInitialStates(), this->getDeadlockStates(),
133 this->getTransitionMatrix().template toValueType<NewValueType>(), this->getRowVariables(), this->getColumnVariables(),
134 this->getRowColumnMetaVariablePairs(), this->getNondeterminismVariables(), newLabelToBddMap, newRewardModels);
135}
136
137// Explicitly instantiate the template class.
140
142template std::shared_ptr<MarkovAutomaton<storm::dd::DdType::Sylvan, double>> MarkovAutomaton<storm::dd::DdType::Sylvan, storm::RationalNumber>::toValueType()
143 const;
145
146} // namespace symbolic
147} // namespace models
148} // 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
Base class for all nondeterministic symbolic models.
LabParser.cpp.
Definition cli.cpp:18