Storm
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
DdPrismModelBuilder.h
Go to the documentation of this file.
1#ifndef STORM_BUILDER_DDPRISMMODELBUILDER_H_
2#define STORM_BUILDER_DDPRISMMODELBUILDER_H_
3
4#include <boost/optional.hpp>
5#include <boost/variant.hpp>
6#include <map>
7
9
11
14
16
17namespace storm {
18namespace dd {
19template<storm::dd::DdType T>
20class Bdd;
21template<storm::dd::DdType LibraryType, typename ValueType>
22class Add;
23template<storm::dd::DdType T>
24class DdManager;
25} // namespace dd
26
27namespace models {
28namespace symbolic {
29template<storm::dd::DdType T, typename ValueType>
30class Model;
31
32template<storm::dd::DdType T, typename ValueType>
33class StandardRewardModel;
34} // namespace symbolic
35} // namespace models
36
37namespace builder {
38
39template<storm::dd::DdType Type, typename ValueType = double>
41 public:
47 static bool canHandle(storm::prism::Program const& program);
48
49 struct Options {
53 Options();
54
60 Options(storm::logic::Formula const& formula);
61
67 Options(std::vector<std::shared_ptr<storm::logic::Formula const>> const& formulas);
68
75 void preserveFormula(storm::logic::Formula const& formula);
76
86
87 // A flag that indicates whether or not all reward models are to be build.
89
90 // A list of reward models to be build in case not all reward models are to be build.
91 std::set<std::string> rewardModelsToBuild;
92
93 // A flag indicating whether all labels are to be build.
95
96 // An optional set of labels that, if given, restricts the labels that are built.
97 boost::optional<std::set<std::string>> labelsToBuild;
98
99 // An optional set of expression or labels that characterizes (a subset of) the terminal states of the model.
100 // If this is set, the outgoing transitions of these states are replaced with a self-loop.
102 };
103
111 std::shared_ptr<storm::models::symbolic::Model<Type, ValueType>> build(storm::prism::Program const& program, Options const& options = Options());
112
113 private:
114 // This structure can store the decision diagrams representing a particular action.
115 struct UpdateDecisionDiagram {
116 UpdateDecisionDiagram() : updateDd(), assignedGlobalVariables() {
117 // Intentionally left empty.
118 }
119
120 UpdateDecisionDiagram(storm::dd::Add<Type, ValueType> const& updateDd, std::set<storm::expressions::Variable> const& assignedGlobalVariables)
121 : updateDd(updateDd), assignedGlobalVariables(assignedGlobalVariables) {
122 // Intentionally left empty.
123 }
124
125 // The DD representing the update behaviour.
127
128 // Keep track of the global variables that were written by this update.
129 std::set<storm::expressions::Variable> assignedGlobalVariables;
130 };
131
132 // This structure can store the decision diagrams representing a particular action.
133 struct ActionDecisionDiagram {
134 ActionDecisionDiagram() : guardDd(), transitionsDd(), numberOfUsedNondeterminismVariables(0) {
135 // Intentionally left empty.
136 }
137
138 ActionDecisionDiagram(storm::dd::DdManager<Type> const& manager,
139 std::set<storm::expressions::Variable> const& assignedGlobalVariables = std::set<storm::expressions::Variable>(),
140 uint_fast64_t numberOfUsedNondeterminismVariables = 0)
141 : guardDd(manager.getBddZero()),
142 transitionsDd(manager.template getAddZero<ValueType>()),
143 numberOfUsedNondeterminismVariables(numberOfUsedNondeterminismVariables),
144 assignedGlobalVariables(assignedGlobalVariables) {
145 // Intentionally left empty.
146 }
147
148 ActionDecisionDiagram(storm::dd::Bdd<Type> guardDd, storm::dd::Add<Type, ValueType> transitionsDd,
149 std::set<storm::expressions::Variable> const& assignedGlobalVariables = std::set<storm::expressions::Variable>(),
150 uint_fast64_t numberOfUsedNondeterminismVariables = 0)
151 : guardDd(guardDd),
152 transitionsDd(transitionsDd),
153 numberOfUsedNondeterminismVariables(numberOfUsedNondeterminismVariables),
154 assignedGlobalVariables(assignedGlobalVariables) {
155 // Intentionally left empty.
156 }
157
158 void ensureContainsVariables(std::set<storm::expressions::Variable> const& rowMetaVariables,
159 std::set<storm::expressions::Variable> const& columnMetaVariables) {
160 guardDd.addMetaVariables(rowMetaVariables);
161 transitionsDd.addMetaVariables(rowMetaVariables);
162 transitionsDd.addMetaVariables(columnMetaVariables);
163 }
164
165 ActionDecisionDiagram(ActionDecisionDiagram const& other) = default;
166 ActionDecisionDiagram& operator=(ActionDecisionDiagram const& other) = default;
167
168 // The guard of the action.
169 storm::dd::Bdd<Type> guardDd;
170
171 // The actual transitions (source and target states).
173
174 // The number of variables that are used to encode the nondeterminism.
175 uint_fast64_t numberOfUsedNondeterminismVariables;
176
177 // Keep track of the global variables that were written by this action.
178 std::set<storm::expressions::Variable> assignedGlobalVariables;
179 };
180
181 // This structure holds all decision diagrams related to a module.
182 struct ModuleDecisionDiagram {
183 ModuleDecisionDiagram() : independentAction(), synchronizingActionToDecisionDiagramMap(), identity(), numberOfUsedNondeterminismVariables(0) {
184 // Intentionally left empty.
185 }
186
187 ModuleDecisionDiagram(storm::dd::DdManager<Type> const& manager)
188 : independentAction(manager),
189 synchronizingActionToDecisionDiagramMap(),
190 identity(manager.template getAddZero<ValueType>()),
191 numberOfUsedNondeterminismVariables(0) {
192 // Intentionally left empty.
193 }
194
195 ModuleDecisionDiagram(ActionDecisionDiagram const& independentAction,
196 std::map<uint_fast64_t, ActionDecisionDiagram> const& synchronizingActionToDecisionDiagramMap,
197 storm::dd::Add<Type, ValueType> const& identity, uint_fast64_t numberOfUsedNondeterminismVariables = 0)
198 : independentAction(independentAction),
199 synchronizingActionToDecisionDiagramMap(synchronizingActionToDecisionDiagramMap),
200 identity(identity),
201 numberOfUsedNondeterminismVariables(numberOfUsedNondeterminismVariables) {
202 // Intentionally left empty.
203 }
204
205 ModuleDecisionDiagram(ModuleDecisionDiagram const& other) = default;
206 ModuleDecisionDiagram& operator=(ModuleDecisionDiagram const& other) = default;
207
208 bool hasSynchronizingAction(uint_fast64_t actionIndex) {
209 return synchronizingActionToDecisionDiagramMap.find(actionIndex) != synchronizingActionToDecisionDiagramMap.end();
210 }
211
212 std::set<uint_fast64_t> getSynchronizingActionIndices() const {
213 std::set<uint_fast64_t> result;
214 for (auto const& entry : synchronizingActionToDecisionDiagramMap) {
215 result.insert(entry.first);
216 }
217 return result;
218 }
219
220 // The decision diagram for the independent action.
221 ActionDecisionDiagram independentAction;
222
223 // A mapping from synchronizing action indices to the decision diagram.
224 std::map<uint_fast64_t, ActionDecisionDiagram> synchronizingActionToDecisionDiagramMap;
225
226 // A decision diagram that represents the identity of this module.
228
229 // The number of variables encoding the nondeterminism that were actually used.
230 uint_fast64_t numberOfUsedNondeterminismVariables;
231 };
232
236 class GenerationInformation;
237
241 struct SystemResult;
242
243 private:
244 std::shared_ptr<storm::models::symbolic::Model<Type, ValueType>> buildInternal(storm::prism::Program const& program, Options const& options,
245 std::shared_ptr<storm::dd::DdManager<Type>> const& manager);
246
247 template<storm::dd::DdType TypePrime, typename ValueTypePrime>
248 friend class ModuleComposer;
249
250 static std::set<storm::expressions::Variable> equalizeAssignedGlobalVariables(GenerationInformation const& generationInfo, ActionDecisionDiagram& action1,
251 ActionDecisionDiagram& action2);
252
253 static std::set<storm::expressions::Variable> equalizeAssignedGlobalVariables(GenerationInformation const& generationInfo,
254 std::vector<ActionDecisionDiagram>& actionDds);
255
256 static storm::dd::Add<Type, ValueType> encodeChoice(GenerationInformation& generationInfo, uint_fast64_t nondeterminismVariableOffset,
257 uint_fast64_t numberOfBinaryVariables, int_fast64_t value);
258
259 static UpdateDecisionDiagram createUpdateDecisionDiagram(GenerationInformation& generationInfo, storm::prism::Module const& module,
260 storm::dd::Add<Type, ValueType> const& guard, storm::prism::Update const& update);
261
262 static ActionDecisionDiagram createCommandDecisionDiagram(GenerationInformation& generationInfo, storm::prism::Module const& module,
263 storm::prism::Command const& command);
264
265 static ActionDecisionDiagram createActionDecisionDiagram(GenerationInformation& generationInfo, storm::prism::Module const& module,
266 uint_fast64_t synchronizationActionIndex, uint_fast64_t nondeterminismVariableOffset);
267
268 static ActionDecisionDiagram combineCommandsToActionMarkovChain(GenerationInformation& generationInfo, std::vector<ActionDecisionDiagram>& commandDds);
269
270 static ActionDecisionDiagram combineCommandsToActionMDP(GenerationInformation& generationInfo, std::vector<ActionDecisionDiagram>& commandDds,
271 uint_fast64_t nondeterminismVariableOffset);
272
273 static ActionDecisionDiagram combineSynchronizingActions(ActionDecisionDiagram const& action1, ActionDecisionDiagram const& action2);
274
275 static ActionDecisionDiagram combineUnsynchronizedActions(GenerationInformation const& generationInfo, ActionDecisionDiagram& action1,
276 ActionDecisionDiagram& action2, storm::dd::Add<Type, ValueType> const& identityDd1,
277 storm::dd::Add<Type, ValueType> const& identityDd2);
278
279 static ActionDecisionDiagram combineUnsynchronizedActions(GenerationInformation const& generationInfo, ActionDecisionDiagram& action1,
280 ActionDecisionDiagram& action2);
281
282 static ModuleDecisionDiagram createModuleDecisionDiagram(GenerationInformation& generationInfo, storm::prism::Module const& module,
283 std::map<uint_fast64_t, uint_fast64_t> const& synchronizingActionToOffsetMap);
284
285 static storm::dd::Add<Type, ValueType> getSynchronizationDecisionDiagram(GenerationInformation& generationInfo, uint_fast64_t actionIndex = 0);
286
287 static storm::dd::Add<Type, ValueType> createSystemFromModule(GenerationInformation& generationInfo, ModuleDecisionDiagram& module);
288
289 static std::unordered_map<std::string, storm::models::symbolic::StandardRewardModel<Type, ValueType>> createRewardModelDecisionDiagrams(
290 std::vector<std::reference_wrapper<storm::prism::RewardModel const>> const& selectedRewardModels, SystemResult& system,
291 GenerationInformation& generationInfo, ModuleDecisionDiagram const& globalModule, storm::dd::Add<Type, ValueType> const& reachableStatesAdd,
292 storm::dd::Add<Type, ValueType> const& transitionMatrix);
293
294 static storm::models::symbolic::StandardRewardModel<Type, ValueType> createRewardModelDecisionDiagrams(
295 GenerationInformation& generationInfo, storm::prism::RewardModel const& rewardModel, ModuleDecisionDiagram const& globalModule,
296 storm::dd::Add<Type, ValueType> const& reachableStatesAdd, storm::dd::Add<Type, ValueType> const& transitionMatrix,
297 boost::optional<storm::dd::Add<Type, ValueType>>& stateActionDd);
298
299 static SystemResult createSystemDecisionDiagram(GenerationInformation& generationInfo);
300
301 static storm::dd::Bdd<Type> createInitialStatesDecisionDiagram(GenerationInformation& generationInfo);
302};
303
304} // namespace builder
305} // namespace storm
306
307#endif /* STORM_BUILDER_DDPRISMMODELBUILDER_H_ */
std::shared_ptr< storm::models::symbolic::Model< Type, ValueType > > build(storm::prism::Program const &program, Options const &options=Options())
Translates the given program into a symbolic model (i.e.
static bool canHandle(storm::prism::Program const &program)
A quick check to detect whether the given model is not supported.
AddIterator< LibraryType, ValueType > end() const
Retrieves an iterator that points past the end of the container.
Definition Add.cpp:1161
void addMetaVariables(std::set< storm::expressions::Variable > const &metaVariables)
Adds the given set of meta variables to the DD.
Definition Dd.cpp:44
SFTBDDChecker::ValueType ValueType
SFTBDDChecker::Bdd Bdd
SettingsManager const & manager()
Retrieves the settings manager.
LabParser.cpp.
Definition cli.cpp:18
void preserveFormula(storm::logic::Formula const &formula)
Changes the options in a way that ensures that the given formula can be checked on the model once it ...
void setTerminalStatesFromFormula(storm::logic::Formula const &formula)
Analyzes the given formula and sets an expression for the states states of the model that can be trea...
Options()
Creates an object representing the default building options.
boost::optional< std::set< std::string > > labelsToBuild