Storm 1.11.1.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
SymbolicToSparseTransformer.cpp
Go to the documentation of this file.
2
13
14namespace storm {
15namespace transformer {
16
18 LabelInformation(std::vector<std::shared_ptr<storm::logic::Formula const>> const& formulas) {
19 for (auto const& formula : formulas) {
20 std::vector<std::shared_ptr<storm::logic::AtomicLabelFormula const>> atomicLabelFormulas = formula->getAtomicLabelFormulas();
21 for (auto const& labelFormula : atomicLabelFormulas) {
22 atomicLabels.insert(labelFormula->getLabel());
23 }
24
25 std::vector<std::shared_ptr<storm::logic::AtomicExpressionFormula const>> atomicExpressionFormulas = formula->getAtomicExpressionFormulas();
26 for (auto const& expressionFormula : atomicExpressionFormulas) {
27 std::stringstream ss;
28 ss << expressionFormula->getExpression();
29 expressionLabels[ss.str()] = expressionFormula->getExpression();
30 }
31 }
32 }
33
34 std::set<std::string> atomicLabels;
35 std::map<std::string, storm::expressions::Expression> expressionLabels;
36};
37
38template<storm::dd::DdType Type, typename ValueType>
39std::shared_ptr<storm::models::sparse::Dtmc<ValueType>> SymbolicDtmcToSparseDtmcTransformer<Type, ValueType>::translate(
40 storm::models::symbolic::Dtmc<Type, ValueType> const& symbolicDtmc, std::vector<std::shared_ptr<storm::logic::Formula const>> const& formulas) {
41 this->odd = symbolicDtmc.getReachableStates().createOdd();
42 storm::storage::SparseMatrix<ValueType> transitionMatrix = symbolicDtmc.getTransitionMatrix().toMatrix(this->odd, this->odd);
43 std::unordered_map<std::string, storm::models::sparse::StandardRewardModel<ValueType>> rewardModels;
44 for (auto const& rewardModelNameAndModel : symbolicDtmc.getRewardModels()) {
45 std::optional<std::vector<ValueType>> stateRewards;
46 std::optional<std::vector<ValueType>> stateActionRewards;
47 std::optional<storm::storage::SparseMatrix<ValueType>> transitionRewards;
48 if (rewardModelNameAndModel.second.hasStateRewards()) {
49 stateRewards = rewardModelNameAndModel.second.getStateRewardVector().toVector(this->odd);
50 }
51 if (rewardModelNameAndModel.second.hasStateActionRewards()) {
52 stateActionRewards = rewardModelNameAndModel.second.getStateActionRewardVector().toVector(this->odd);
53 }
54 if (rewardModelNameAndModel.second.hasTransitionRewards()) {
55 transitionRewards = rewardModelNameAndModel.second.getTransitionRewardMatrix().toMatrix(this->odd, this->odd);
56 }
57 rewardModels.emplace(rewardModelNameAndModel.first,
58 storm::models::sparse::StandardRewardModel<ValueType>(stateRewards, stateActionRewards, transitionRewards));
59 }
60 storm::models::sparse::StateLabeling labelling(transitionMatrix.getRowGroupCount());
61
62 labelling.addLabel("init", symbolicDtmc.getInitialStates().toVector(this->odd));
63 labelling.addLabel("deadlock", symbolicDtmc.getDeadlockStates().toVector(this->odd));
64 if (formulas.empty()) {
65 for (auto const& label : symbolicDtmc.getLabels()) {
66 labelling.addLabel(label, symbolicDtmc.getStates(label).toVector(this->odd));
67 }
68 } else {
69 LabelInformation labelInfo(formulas);
70 for (auto const& label : labelInfo.atomicLabels) {
71 labelling.addLabel(label, symbolicDtmc.getStates(label).toVector(this->odd));
72 }
73 for (auto const& expressionLabel : labelInfo.expressionLabels) {
74 labelling.addLabel(expressionLabel.first, symbolicDtmc.getStates(expressionLabel.second).toVector(this->odd));
75 }
76 }
77 return std::make_shared<storm::models::sparse::Dtmc<ValueType>>(transitionMatrix, labelling, rewardModels);
78}
79
80template<storm::dd::DdType Type, typename ValueType>
84
85template<storm::dd::DdType Type, typename ValueType>
86std::shared_ptr<storm::models::sparse::Mdp<ValueType>> SymbolicMdpToSparseMdpTransformer<Type, ValueType>::translate(
87 storm::models::symbolic::Mdp<Type, ValueType> const& symbolicMdp, std::vector<std::shared_ptr<storm::logic::Formula const>> const& formulas) {
88 storm::dd::Odd odd = symbolicMdp.getReachableStates().createOdd();
89
90 // Collect action reward vectors that need translation
91 std::vector<storm::dd::Add<Type, ValueType>> symbolicActionRewardVectors;
92 std::map<std::string, uint64_t> rewardNameToActionRewardIndexMap;
93 for (auto const& rewardModelNameAndModel : symbolicMdp.getRewardModels()) {
94 if (rewardModelNameAndModel.second.hasStateActionRewards()) {
95 rewardNameToActionRewardIndexMap.emplace(rewardModelNameAndModel.first, symbolicActionRewardVectors.size());
96 symbolicActionRewardVectors.push_back(rewardModelNameAndModel.second.getStateActionRewardVector());
97 }
98 }
99 // Build transition matrix and (potentially) actionRewardVectors.
101 std::vector<std::vector<ValueType>> actionRewardVectors;
102 if (symbolicActionRewardVectors.empty()) {
103 transitionMatrix = symbolicMdp.getTransitionMatrix().toMatrix(symbolicMdp.getNondeterminismVariables(), odd, odd);
104 } else {
105 auto matrRewards = symbolicMdp.getTransitionMatrix().toMatrixVectors(symbolicActionRewardVectors, symbolicMdp.getNondeterminismVariables(), odd, odd);
106 transitionMatrix = std::move(matrRewards.first);
107 actionRewardVectors = std::move(matrRewards.second);
108 }
109
110 // Translate reward models
111 std::unordered_map<std::string, storm::models::sparse::StandardRewardModel<ValueType>> rewardModels;
112 for (auto const& rewardModelNameAndModel : symbolicMdp.getRewardModels()) {
113 std::optional<std::vector<ValueType>> stateRewards;
114 std::optional<std::vector<ValueType>> stateActionRewards;
115 std::optional<storm::storage::SparseMatrix<ValueType>> transitionRewards;
116 if (rewardModelNameAndModel.second.hasStateRewards()) {
117 stateRewards = rewardModelNameAndModel.second.getStateRewardVector().toVector(odd);
118 }
119 auto actRewIndexIt = rewardNameToActionRewardIndexMap.find(rewardModelNameAndModel.first);
120 if (actRewIndexIt != rewardNameToActionRewardIndexMap.end()) {
121 stateActionRewards = std::move(actionRewardVectors[actRewIndexIt->second]);
122 }
123 STORM_LOG_THROW(!rewardModelNameAndModel.second.hasTransitionRewards(), storm::exceptions::NotImplementedException,
124 "Translation of symbolic to explicit transition rewards is not yet supported.");
125 rewardModels.emplace(rewardModelNameAndModel.first,
126 storm::models::sparse::StandardRewardModel<ValueType>(stateRewards, stateActionRewards, transitionRewards));
127 }
128
129 storm::models::sparse::StateLabeling labelling(transitionMatrix.getRowGroupCount());
130
131 labelling.addLabel("init", symbolicMdp.getInitialStates().toVector(odd));
132 labelling.addLabel("deadlock", symbolicMdp.getDeadlockStates().toVector(odd));
133 if (formulas.empty()) {
134 for (auto const& label : symbolicMdp.getLabels()) {
135 labelling.addLabel(label, symbolicMdp.getStates(label).toVector(odd));
136 }
137 } else {
138 LabelInformation labelInfo(formulas);
139 for (auto const& label : labelInfo.atomicLabels) {
140 labelling.addLabel(label, symbolicMdp.getStates(label).toVector(odd));
141 }
142 for (auto const& expressionLabel : labelInfo.expressionLabels) {
143 labelling.addLabel(expressionLabel.first, symbolicMdp.getStates(expressionLabel.second).toVector(odd));
144 }
145 }
146
147 return std::make_shared<storm::models::sparse::Mdp<ValueType>>(transitionMatrix, labelling, rewardModels);
148}
149
150template<storm::dd::DdType Type, typename ValueType>
151std::shared_ptr<storm::models::sparse::Ctmc<ValueType>> SymbolicCtmcToSparseCtmcTransformer<Type, ValueType>::translate(
152 storm::models::symbolic::Ctmc<Type, ValueType> const& symbolicCtmc, std::vector<std::shared_ptr<storm::logic::Formula const>> const& formulas) {
153 storm::dd::Odd odd = symbolicCtmc.getReachableStates().createOdd();
154 storm::storage::SparseMatrix<ValueType> transitionMatrix = symbolicCtmc.getTransitionMatrix().toMatrix(odd, odd);
155 std::unordered_map<std::string, storm::models::sparse::StandardRewardModel<ValueType>> rewardModels;
156 for (auto const& rewardModelNameAndModel : symbolicCtmc.getRewardModels()) {
157 std::optional<std::vector<ValueType>> stateRewards;
158 std::optional<std::vector<ValueType>> stateActionRewards;
159 std::optional<storm::storage::SparseMatrix<ValueType>> transitionRewards;
160 if (rewardModelNameAndModel.second.hasStateRewards()) {
161 stateRewards = rewardModelNameAndModel.second.getStateRewardVector().toVector(odd);
162 }
163 if (rewardModelNameAndModel.second.hasStateActionRewards()) {
164 stateActionRewards = rewardModelNameAndModel.second.getStateActionRewardVector().toVector(odd);
165 }
166 if (rewardModelNameAndModel.second.hasTransitionRewards()) {
167 transitionRewards = rewardModelNameAndModel.second.getTransitionRewardMatrix().toMatrix(odd, odd);
168 }
169 rewardModels.emplace(rewardModelNameAndModel.first,
170 storm::models::sparse::StandardRewardModel<ValueType>(stateRewards, stateActionRewards, transitionRewards));
171 }
172 storm::models::sparse::StateLabeling labelling(transitionMatrix.getRowGroupCount());
173
174 labelling.addLabel("init", symbolicCtmc.getInitialStates().toVector(odd));
175 labelling.addLabel("deadlock", symbolicCtmc.getDeadlockStates().toVector(odd));
176 if (formulas.empty()) {
177 for (auto const& label : symbolicCtmc.getLabels()) {
178 labelling.addLabel(label, symbolicCtmc.getStates(label).toVector(odd));
179 }
180 } else {
181 LabelInformation labelInfo(formulas);
182 for (auto const& label : labelInfo.atomicLabels) {
183 labelling.addLabel(label, symbolicCtmc.getStates(label).toVector(odd));
184 }
185 for (auto const& expressionLabel : labelInfo.expressionLabels) {
186 labelling.addLabel(expressionLabel.first, symbolicCtmc.getStates(expressionLabel.second).toVector(odd));
187 }
188 }
189
190 return std::make_shared<storm::models::sparse::Ctmc<ValueType>>(transitionMatrix, labelling, rewardModels);
191}
192
193template<storm::dd::DdType Type, typename ValueType>
194std::shared_ptr<storm::models::sparse::MarkovAutomaton<ValueType>> SymbolicMaToSparseMaTransformer<Type, ValueType>::translate(
195 storm::models::symbolic::MarkovAutomaton<Type, ValueType> const& symbolicMa, std::vector<std::shared_ptr<storm::logic::Formula const>> const& formulas) {
196 storm::dd::Odd odd = symbolicMa.getReachableStates().createOdd();
197 // Collect action reward vectors that need translation
198 std::vector<storm::dd::Add<Type, ValueType>> symbolicActionRewardVectors;
199 std::map<std::string, uint64_t> rewardNameToActionRewardIndexMap;
200 for (auto const& rewardModelNameAndModel : symbolicMa.getRewardModels()) {
201 if (rewardModelNameAndModel.second.hasStateActionRewards()) {
202 rewardNameToActionRewardIndexMap.emplace(rewardModelNameAndModel.first, symbolicActionRewardVectors.size());
203 symbolicActionRewardVectors.push_back(rewardModelNameAndModel.second.getStateActionRewardVector());
204 }
205 }
206 // Build transition matrix and (potentially) actionRewardVectors.
208 std::vector<std::vector<ValueType>> actionRewardVectors;
209 if (symbolicActionRewardVectors.empty()) {
210 transitionMatrix = symbolicMa.getTransitionMatrix().toMatrix(symbolicMa.getNondeterminismVariables(), odd, odd);
211 } else {
212 auto matrRewards = symbolicMa.getTransitionMatrix().toMatrixVectors(symbolicActionRewardVectors, symbolicMa.getNondeterminismVariables(), odd, odd);
213 transitionMatrix = std::move(matrRewards.first);
214 actionRewardVectors = std::move(matrRewards.second);
215 }
216
217 // Translate reward models
218 std::unordered_map<std::string, storm::models::sparse::StandardRewardModel<ValueType>> rewardModels;
219 for (auto const& rewardModelNameAndModel : symbolicMa.getRewardModels()) {
220 std::optional<std::vector<ValueType>> stateRewards;
221 std::optional<std::vector<ValueType>> stateActionRewards;
222 std::optional<storm::storage::SparseMatrix<ValueType>> transitionRewards;
223 if (rewardModelNameAndModel.second.hasStateRewards()) {
224 stateRewards = rewardModelNameAndModel.second.getStateRewardVector().toVector(odd);
225 }
226 auto actRewIndexIt = rewardNameToActionRewardIndexMap.find(rewardModelNameAndModel.first);
227 if (actRewIndexIt != rewardNameToActionRewardIndexMap.end()) {
228 stateActionRewards = std::move(actionRewardVectors[actRewIndexIt->second]);
229 }
230 STORM_LOG_THROW(!rewardModelNameAndModel.second.hasTransitionRewards(), storm::exceptions::NotImplementedException,
231 "Translation of symbolic to explicit transition rewards is not yet supported.");
232 rewardModels.emplace(rewardModelNameAndModel.first,
233 storm::models::sparse::StandardRewardModel<ValueType>(stateRewards, stateActionRewards, transitionRewards));
234 }
235
236 storm::models::sparse::StateLabeling labelling(transitionMatrix.getRowGroupCount());
237
238 labelling.addLabel("init", symbolicMa.getInitialStates().toVector(odd));
239 labelling.addLabel("deadlock", symbolicMa.getDeadlockStates().toVector(odd));
240 if (formulas.empty()) {
241 for (auto const& label : symbolicMa.getLabels()) {
242 labelling.addLabel(label, symbolicMa.getStates(label).toVector(odd));
243 }
244 } else {
245 LabelInformation labelInfo(formulas);
246 for (auto const& label : labelInfo.atomicLabels) {
247 labelling.addLabel(label, symbolicMa.getStates(label).toVector(odd));
248 }
249 for (auto const& expressionLabel : labelInfo.expressionLabels) {
250 labelling.addLabel(expressionLabel.first, symbolicMa.getStates(expressionLabel.second).toVector(odd));
251 }
252 }
253 storm::storage::BitVector markovianStates = symbolicMa.getMarkovianStates().toVector(odd);
254 storm::storage::sparse::ModelComponents<ValueType> components(std::move(transitionMatrix), std::move(labelling), std::move(rewardModels), false,
255 std::move(markovianStates));
256 components.exitRates = symbolicMa.getExitRateVector().toVector(odd);
257
258 return std::make_shared<storm::models::sparse::MarkovAutomaton<ValueType>>(std::move(components));
259}
260
265
270
275
280
281} // namespace transformer
282} // namespace storm
std::pair< storm::storage::SparseMatrix< ValueType >, std::vector< std::vector< ValueType > > > toMatrixVectors(std::vector< storm::dd::Add< LibraryType, ValueType > > const &vectors, std::set< storm::expressions::Variable > const &groupMetaVariables, storm::dd::Odd const &rowOdd, storm::dd::Odd const &columnOdd) const
Converts the ADD to a row-grouped (sparse) matrix and the given vectors to row-grouped vectors.
Definition Add.cpp:955
storm::storage::SparseMatrix< ValueType > toMatrix() const
Converts the ADD to a (sparse) matrix.
Definition Add.cpp:627
std::vector< ValueType > toVector() const
Converts the ADD to a vector.
Definition Add.cpp:545
Odd createOdd() const
Creates an ODD based on the current BDD.
Definition Bdd.cpp:565
storm::storage::BitVector toVector(storm::dd::Odd const &rowOdd) const
Converts the BDD to a bit vector.
Definition Bdd.cpp:491
void addLabel(std::string const &label)
Adds a new label to the labelings.
This class manages the labeling of the state space with a number of (atomic) labels.
This class represents a continuous-time Markov chain.
Definition Ctmc.h:13
This class represents a discrete-time Markov chain.
Definition Dtmc.h:13
This class represents a discrete-time Markov decision process.
storm::dd::Bdd< Type > const & getMarkovianStates() const
storm::dd::Add< Type, ValueType > const & getExitRateVector() const
This class represents a discrete-time Markov decision process.
Definition Mdp.h:13
storm::dd::Add< Type, ValueType > const & getTransitionMatrix() const
Retrieves the matrix representing the transitions of the model.
Definition Model.cpp:172
storm::dd::Bdd< Type > const & getDeadlockStates() const
Definition Model.cpp:107
std::vector< std::string > getLabels() const
Definition Model.cpp:309
storm::dd::Bdd< Type > const & getInitialStates() const
Retrieves the initial states of the model.
Definition Model.cpp:102
std::unordered_map< std::string, RewardModelType > & getRewardModels()
Definition Model.cpp:293
virtual storm::dd::Bdd< Type > getStates(std::string const &label) const
Returns the sets of states labeled with the given label.
Definition Model.cpp:112
storm::dd::Bdd< Type > const & getReachableStates() const
Retrieves the reachable states of the model.
Definition Model.cpp:97
virtual std::set< storm::expressions::Variable > const & getNondeterminismVariables() const override
Retrieves the meta variables used to encode the nondeterminism in the model.
A bit vector that is internally represented as a vector of 64-bit values.
Definition BitVector.h:16
A class that holds a possibly non-square matrix in the compressed row storage format.
index_type getRowGroupCount() const
Returns the number of row groups in the matrix.
static std::shared_ptr< storm::models::sparse::Ctmc< ValueType > > translate(storm::models::symbolic::Ctmc< Type, ValueType > const &symbolicCtmc, std::vector< std::shared_ptr< storm::logic::Formula const > > const &formulas=std::vector< std::shared_ptr< storm::logic::Formula const > >())
std::shared_ptr< storm::models::sparse::Dtmc< ValueType > > translate(storm::models::symbolic::Dtmc< Type, ValueType > const &symbolicDtmc, std::vector< std::shared_ptr< storm::logic::Formula const > > const &formulas=std::vector< std::shared_ptr< storm::logic::Formula const > >())
static std::shared_ptr< storm::models::sparse::MarkovAutomaton< ValueType > > translate(storm::models::symbolic::MarkovAutomaton< Type, ValueType > const &symbolicMa, std::vector< std::shared_ptr< storm::logic::Formula const > > const &formulas=std::vector< std::shared_ptr< storm::logic::Formula const > >())
static std::shared_ptr< storm::models::sparse::Mdp< ValueType > > translate(storm::models::symbolic::Mdp< Type, ValueType > const &symbolicMdp, std::vector< std::shared_ptr< storm::logic::Formula const > > const &formulas=std::vector< std::shared_ptr< storm::logic::Formula const > >())
#define STORM_LOG_THROW(cond, exception, message)
Definition macros.h:30
boost::optional< std::vector< ValueType > > exitRates
std::map< std::string, storm::expressions::Expression > expressionLabels
LabelInformation(std::vector< std::shared_ptr< storm::logic::Formula const > > const &formulas)