Storm 1.14.0.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
DdPrismModelBuilder.h
Go to the documentation of this file.
1#pragma once
2
3#include <boost/optional.hpp>
4#include <boost/variant.hpp>
5#include <map>
6
8
10
13
15
16namespace storm {
17class Environment;
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>
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 // A flag that indicates whether deadlock states should be fixed by inserting a self-loop. If not set,
104 // an error is raised whenever a deadlock state is encountered.
105 bool fixDeadlocks = true;
106 };
107
117 std::shared_ptr<storm::models::symbolic::Model<Type, ValueType>> build(storm::Environment const& env, storm::prism::Program const& program,
118 Options const& options = Options());
119
120 private:
121 // This structure can store the decision diagrams representing a particular action.
122 struct UpdateDecisionDiagram {
123 UpdateDecisionDiagram() : updateDd(), assignedGlobalVariables() {
124 // Intentionally left empty.
125 }
126
127 UpdateDecisionDiagram(storm::dd::Add<Type, ValueType> const& updateDd, std::set<storm::expressions::Variable> const& assignedGlobalVariables)
128 : updateDd(updateDd), assignedGlobalVariables(assignedGlobalVariables) {
129 // Intentionally left empty.
130 }
131
132 // The DD representing the update behaviour.
134
135 // Keep track of the global variables that were written by this update.
136 std::set<storm::expressions::Variable> assignedGlobalVariables;
137 };
138
139 // This structure can store the decision diagrams representing a particular action.
140 struct ActionDecisionDiagram {
141 ActionDecisionDiagram() : guardDd(), transitionsDd(), numberOfUsedNondeterminismVariables(0) {
142 // Intentionally left empty.
143 }
144
145 ActionDecisionDiagram(storm::dd::DdManager<Type> const& manager,
146 std::set<storm::expressions::Variable> const& assignedGlobalVariables = std::set<storm::expressions::Variable>(),
147 uint_fast64_t numberOfUsedNondeterminismVariables = 0)
148 : guardDd(manager.getBddZero()),
149 transitionsDd(manager.template getAddZero<ValueType>()),
150 numberOfUsedNondeterminismVariables(numberOfUsedNondeterminismVariables),
151 assignedGlobalVariables(assignedGlobalVariables) {
152 // Intentionally left empty.
153 }
154
155 ActionDecisionDiagram(storm::dd::Bdd<Type> guardDd, storm::dd::Add<Type, ValueType> transitionsDd,
156 std::set<storm::expressions::Variable> const& assignedGlobalVariables = std::set<storm::expressions::Variable>(),
157 uint_fast64_t numberOfUsedNondeterminismVariables = 0)
158 : guardDd(guardDd),
159 transitionsDd(transitionsDd),
160 numberOfUsedNondeterminismVariables(numberOfUsedNondeterminismVariables),
161 assignedGlobalVariables(assignedGlobalVariables) {
162 // Intentionally left empty.
163 }
164
165 void ensureContainsVariables(std::set<storm::expressions::Variable> const& rowMetaVariables,
166 std::set<storm::expressions::Variable> const& columnMetaVariables) {
167 guardDd.addMetaVariables(rowMetaVariables);
168 transitionsDd.addMetaVariables(rowMetaVariables);
169 transitionsDd.addMetaVariables(columnMetaVariables);
170 }
171
172 ActionDecisionDiagram(ActionDecisionDiagram const& other) = default;
173 ActionDecisionDiagram& operator=(ActionDecisionDiagram const& other) = default;
174
175 // The guard of the action.
176 storm::dd::Bdd<Type> guardDd;
177
178 // The actual transitions (source and target states).
179 storm::dd::Add<Type, ValueType> transitionsDd;
180
181 // The number of variables that are used to encode the nondeterminism.
182 uint_fast64_t numberOfUsedNondeterminismVariables;
183
184 // Keep track of the global variables that were written by this action.
185 std::set<storm::expressions::Variable> assignedGlobalVariables;
186 };
187
188 // This structure holds all decision diagrams related to a module.
189 struct ModuleDecisionDiagram {
190 ModuleDecisionDiagram() : independentAction(), synchronizingActionToDecisionDiagramMap(), identity(), numberOfUsedNondeterminismVariables(0) {
191 // Intentionally left empty.
192 }
193
194 ModuleDecisionDiagram(storm::dd::DdManager<Type> const& manager)
195 : independentAction(manager),
196 synchronizingActionToDecisionDiagramMap(),
197 identity(manager.template getAddZero<ValueType>()),
198 numberOfUsedNondeterminismVariables(0) {
199 // Intentionally left empty.
200 }
201
202 ModuleDecisionDiagram(ActionDecisionDiagram const& independentAction,
203 std::map<uint_fast64_t, ActionDecisionDiagram> const& synchronizingActionToDecisionDiagramMap,
204 storm::dd::Add<Type, ValueType> const& identity, uint_fast64_t numberOfUsedNondeterminismVariables = 0)
205 : independentAction(independentAction),
206 synchronizingActionToDecisionDiagramMap(synchronizingActionToDecisionDiagramMap),
207 identity(identity),
208 numberOfUsedNondeterminismVariables(numberOfUsedNondeterminismVariables) {
209 // Intentionally left empty.
210 }
211
212 ModuleDecisionDiagram(ModuleDecisionDiagram const& other) = default;
213 ModuleDecisionDiagram& operator=(ModuleDecisionDiagram const& other) = default;
214
215 bool hasSynchronizingAction(uint_fast64_t actionIndex) {
216 return synchronizingActionToDecisionDiagramMap.find(actionIndex) != synchronizingActionToDecisionDiagramMap.end();
217 }
218
219 std::set<uint_fast64_t> getSynchronizingActionIndices() const {
220 std::set<uint_fast64_t> result;
221 for (auto const& entry : synchronizingActionToDecisionDiagramMap) {
222 result.insert(entry.first);
223 }
224 return result;
225 }
226
227 // The decision diagram for the independent action.
228 ActionDecisionDiagram independentAction;
229
230 // A mapping from synchronizing action indices to the decision diagram.
231 std::map<uint_fast64_t, ActionDecisionDiagram> synchronizingActionToDecisionDiagramMap;
232
233 // A decision diagram that represents the identity of this module.
234 storm::dd::Add<Type, ValueType> identity;
235
236 // The number of variables encoding the nondeterminism that were actually used.
237 uint_fast64_t numberOfUsedNondeterminismVariables;
238 };
239
244
248 struct SystemResult;
249
250 private:
251 std::shared_ptr<storm::models::symbolic::Model<Type, ValueType>> buildInternal(storm::prism::Program const& program, Options const& options,
252 std::shared_ptr<storm::dd::DdManager<Type>> const& manager);
253
254 template<storm::dd::DdType TypePrime, typename ValueTypePrime>
255 friend class ModuleComposer;
256
257 static std::set<storm::expressions::Variable> equalizeAssignedGlobalVariables(GenerationInformation const& generationInfo, ActionDecisionDiagram& action1,
258 ActionDecisionDiagram& action2);
259
260 static std::set<storm::expressions::Variable> equalizeAssignedGlobalVariables(GenerationInformation const& generationInfo,
261 std::vector<ActionDecisionDiagram>& actionDds);
262
263 static storm::dd::Add<Type, ValueType> encodeChoice(GenerationInformation& generationInfo, uint_fast64_t nondeterminismVariableOffset,
264 uint_fast64_t numberOfBinaryVariables, int_fast64_t value);
265
266 static UpdateDecisionDiagram createUpdateDecisionDiagram(GenerationInformation& generationInfo, storm::prism::Module const& module,
267 storm::dd::Add<Type, ValueType> const& guard, storm::prism::Update const& update);
268
269 static ActionDecisionDiagram createCommandDecisionDiagram(GenerationInformation& generationInfo, storm::prism::Module const& module,
270 storm::prism::Command const& command);
271
272 static ActionDecisionDiagram createActionDecisionDiagram(GenerationInformation& generationInfo, storm::prism::Module const& module,
273 uint_fast64_t synchronizationActionIndex, uint_fast64_t nondeterminismVariableOffset);
274
275 static ActionDecisionDiagram combineCommandsToActionMarkovChain(GenerationInformation& generationInfo, std::vector<ActionDecisionDiagram>& commandDds);
276
277 static ActionDecisionDiagram combineCommandsToActionMDP(GenerationInformation& generationInfo, std::vector<ActionDecisionDiagram>& commandDds,
278 uint_fast64_t nondeterminismVariableOffset);
279
280 static ActionDecisionDiagram combineSynchronizingActions(ActionDecisionDiagram const& action1, ActionDecisionDiagram const& action2);
281
282 static ActionDecisionDiagram combineUnsynchronizedActions(GenerationInformation const& generationInfo, ActionDecisionDiagram& action1,
283 ActionDecisionDiagram& action2, storm::dd::Add<Type, ValueType> const& identityDd1,
284 storm::dd::Add<Type, ValueType> const& identityDd2);
285
286 static ActionDecisionDiagram combineUnsynchronizedActions(GenerationInformation const& generationInfo, ActionDecisionDiagram& action1,
287 ActionDecisionDiagram& action2);
288
289 static ModuleDecisionDiagram createModuleDecisionDiagram(GenerationInformation& generationInfo, storm::prism::Module const& module,
290 std::map<uint_fast64_t, uint_fast64_t> const& synchronizingActionToOffsetMap);
291
292 static storm::dd::Add<Type, ValueType> getSynchronizationDecisionDiagram(GenerationInformation& generationInfo, uint_fast64_t actionIndex = 0);
293
294 static storm::dd::Add<Type, ValueType> createSystemFromModule(GenerationInformation& generationInfo, ModuleDecisionDiagram& module);
295
296 static std::unordered_map<std::string, storm::models::symbolic::StandardRewardModel<Type, ValueType>> createRewardModelDecisionDiagrams(
297 std::vector<std::reference_wrapper<storm::prism::RewardModel const>> const& selectedRewardModels, SystemResult& system,
298 GenerationInformation& generationInfo, ModuleDecisionDiagram const& globalModule, storm::dd::Add<Type, ValueType> const& reachableStatesAdd,
299 storm::dd::Add<Type, ValueType> const& transitionMatrix);
300
301 static storm::models::symbolic::StandardRewardModel<Type, ValueType> createRewardModelDecisionDiagrams(
302 GenerationInformation& generationInfo, storm::prism::RewardModel const& rewardModel, ModuleDecisionDiagram const& globalModule,
303 storm::dd::Add<Type, ValueType> const& reachableStatesAdd, storm::dd::Add<Type, ValueType> const& transitionMatrix,
304 boost::optional<storm::dd::Add<Type, ValueType>>& stateActionDd);
305
306 static SystemResult createSystemDecisionDiagram(GenerationInformation& generationInfo);
307
308 static storm::dd::Bdd<Type> createInitialStatesDecisionDiagram(GenerationInformation& generationInfo);
309};
310
311} // namespace builder
312} // namespace storm
std::shared_ptr< storm::models::symbolic::Model< Type, ValueType > > build(storm::Environment const &env, 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.
Base class for all symbolic models.
Definition Model.h:42
SFTBDDChecker::ValueType ValueType
SettingsManager const & manager()
Retrieves the settings manager.
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