Storm 1.11.1.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
DdManager.h
Go to the documentation of this file.
1#pragma once
2
3#include <boost/optional.hpp>
4#include <functional>
5#include <set>
6#include <unordered_map>
7
16
17namespace storm {
18namespace dd {
19
20// Declare DdManager class so we can then specialize it for the different DD types.
21template<DdType LibraryType>
22class DdManager : public std::enable_shared_from_this<DdManager<LibraryType>> {
23 public:
24 friend class Bdd<LibraryType>;
25
26 template<DdType LibraryTypePrime, typename ValueType>
27 friend class Add;
28
29 template<DdType LibraryTypePrime, typename ValueType>
30 friend class AddIterator;
31
35 DdManager();
36
37 // Explicitly forbid copying a DdManager, but allow moving it.
38 DdManager(DdManager<LibraryType> const& other) = delete;
42
43 std::shared_ptr<DdManager<LibraryType>> asSharedPointer();
44 std::shared_ptr<DdManager<LibraryType> const> asSharedPointer() const;
45
52
58 template<typename ValueType>
60
67
73 template<typename ValueType>
75
81 template<typename ValueType>
83
89 template<typename ValueType>
91
97 template<typename ValueType>
98 Add<LibraryType, ValueType> getConstant(ValueType const& value) const;
99
111 Bdd<LibraryType> getEncoding(storm::expressions::Variable const& variable, int_fast64_t value, bool mostSignificantBitAtTop = true) const;
112
121
129 template<typename ValueType>
131
138 Bdd<LibraryType> getIdentity(std::vector<std::pair<storm::expressions::Variable, storm::expressions::Variable>> const& variablePairs,
139 bool restrictToFirstRange = true) const;
140
148 Bdd<LibraryType> getIdentity(storm::expressions::Variable const& first, storm::expressions::Variable const& second, bool restrictToFirstRange = true) const;
149
157
164 Bdd<LibraryType> getCube(std::set<storm::expressions::Variable> const& variables) const;
165
173 std::vector<storm::expressions::Variable> cloneVariable(storm::expressions::Variable const& variable, std::string const& newVariableName,
174 boost::optional<uint64_t> const& numberOfLayers = boost::none);
175
183 std::pair<storm::expressions::Variable, storm::expressions::Variable> addMetaVariable(
184 std::string const& variableName, int_fast64_t low, int_fast64_t high,
185 boost::optional<std::pair<MetaVariablePosition, storm::expressions::Variable>> const& position = boost::none);
186
193 std::vector<storm::expressions::Variable> addMetaVariable(
194 std::string const& variableName, int_fast64_t low, int_fast64_t high, uint64_t numberOfLayers,
195 boost::optional<std::pair<MetaVariablePosition, storm::expressions::Variable>> const& position = boost::none);
196
203 std::vector<storm::expressions::Variable> addBitVectorMetaVariable(
204 std::string const& variableName, uint64_t bits, uint64_t numberOfLayers,
205 boost::optional<std::pair<MetaVariablePosition, storm::expressions::Variable>> const& position = boost::none);
206
212 std::pair<storm::expressions::Variable, storm::expressions::Variable> addMetaVariable(
213 std::string const& variableName, boost::optional<std::pair<MetaVariablePosition, storm::expressions::Variable>> const& position = boost::none);
214
221 std::vector<storm::expressions::Variable> addMetaVariable(
222 std::string const& variableName, uint64_t numberOfLayers,
223 boost::optional<std::pair<MetaVariablePosition, storm::expressions::Variable>> const& position = boost::none);
224
230 std::set<std::string> getAllMetaVariableNames() const;
231
237 std::size_t getNumberOfMetaVariables() const;
238
245 bool hasMetaVariable(std::string const& variableName) const;
246
253 storm::expressions::Variable getMetaVariable(std::string const& variableName) const;
254
261 bool supportsOrderedInsertion() const;
262
268 void allowDynamicReordering(bool value);
269
275 bool isDynamicReorderingAllowed() const;
276
280 void triggerReordering();
281
289
295 std::set<storm::expressions::Variable> getAllMetaVariables() const;
296
302 std::vector<uint_fast64_t> getSortedVariableIndices() const;
303
310 std::vector<uint_fast64_t> getSortedVariableIndices(std::set<storm::expressions::Variable> const& metaVariables) const;
311
318
325
329 void debugCheck() const;
330
339 void execute(std::function<void()> const& f) const;
340
341 private:
349 std::vector<storm::expressions::Variable> addMetaVariableHelper(
350 MetaVariableType const& type, std::string const& name, uint64_t numberOfDdVariables, uint64_t numberOfLayers,
351 boost::optional<std::pair<MetaVariablePosition, storm::expressions::Variable>> const& position = boost::none,
352 boost::optional<std::pair<int_fast64_t, int_fast64_t>> const& bounds = boost::none);
353
359 std::vector<std::string> getDdVariableNames() const;
360
366 std::vector<storm::expressions::Variable> getDdVariables() const;
367
373 storm::expressions::ExpressionManager const& getExpressionManager() const;
374
380 storm::expressions::ExpressionManager& getExpressionManager();
381
387 InternalDdManager<LibraryType>* getInternalDdManagerPointer();
388
394 InternalDdManager<LibraryType> const* getInternalDdManagerPointer() const;
395
396 // ATTENTION: as the DD packages typically perform garbage collection, the order of members is crucial here:
397 // First, the references to the DDs of the meta variables need to be disposed of and *then* the manager.
398
399 // The DD manager that is customized according to the selected library type.
400 InternalDdManager<LibraryType> internalDdManager;
401
402 // A mapping from variables to the meta variable information.
403 std::unordered_map<storm::expressions::Variable, DdMetaVariable<LibraryType>> metaVariableMap;
404
405 // The manager responsible for the variables.
406 std::shared_ptr<storm::expressions::ExpressionManager> manager;
407};
408} // namespace dd
409} // namespace storm
storm::expressions::Variable getMetaVariable(std::string const &variableName) const
Retrieves the given meta variable by name.
Add< LibraryType, ValueType > getAddOne() const
Retrieves an ADD representing the constant one function.
Definition DdManager.cpp:38
bool hasMetaVariable(std::string const &variableName) const
Retrieves whether the given meta variable name is already in use.
std::shared_ptr< DdManager< LibraryType > > asSharedPointer()
Definition DdManager.cpp:22
Add< LibraryType, ValueType > getAddZero() const
Retrieves an ADD representing the constant zero function.
Definition DdManager.cpp:49
std::vector< uint_fast64_t > getSortedVariableIndices() const
Retrieves the (sorted) list of the variable indices of the DD variables given by the meta variable se...
std::set< storm::expressions::Variable > getAllMetaVariables() const
Retrieves the set of meta variables contained in the DD.
InternalDdManager< LibraryType > & getInternalDdManager()
Retrieves the internal DD manager.
Bdd< LibraryType > getCube(storm::expressions::Variable const &variable) const
Retrieves a BDD that is the cube of the variables representing the given meta variable.
Add< LibraryType, ValueType > getInfinity() const
Retrieves an ADD representing the constant infinity function.
Definition DdManager.cpp:61
void execute(std::function< void()> const &f) const
All code that manipulates DDs shall be called through this function.
Bdd< LibraryType > getBddOne() const
Retrieves a BDD representing the constant one function.
Definition DdManager.cpp:32
DdManager(DdManager< LibraryType > &&other)=default
DdManager()
Creates an empty manager without any meta variables.
Definition DdManager.cpp:17
std::set< std::string > getAllMetaVariableNames() const
Retrieves the names of all meta variables that have been added to the manager.
Bdd< LibraryType > getBddZero() const
Retrieves a BDD representing the constant zero function.
Definition DdManager.cpp:43
void triggerReordering()
Triggers a reordering of the DDs managed by this manager (if supported).
DdManager(DdManager< LibraryType > const &other)=delete
Bdd< LibraryType > getEncoding(storm::expressions::Variable const &variable, int_fast64_t value, bool mostSignificantBitAtTop=true) const
Retrieves the BDD representing the function that maps all inputs which have the given meta variable e...
Definition DdManager.cpp:72
bool isDynamicReorderingAllowed() const
Retrieves whether dynamic reordering is currently allowed (if supported).
std::vector< storm::expressions::Variable > cloneVariable(storm::expressions::Variable const &variable, std::string const &newVariableName, boost::optional< uint64_t > const &numberOfLayers=boost::none)
Clones the given meta variable and optionally changes the number of layers of the variable.
Add< LibraryType, ValueType > getIdentity(storm::expressions::Variable const &variable) const
Retrieves the ADD representing the identity of the meta variable, i.e., a function that maps all lega...
Add< LibraryType, ValueType > getAddUndefined() const
Retrieves an ADD representing an undefined value.
Definition DdManager.cpp:55
bool supportsOrderedInsertion() const
Checks whether this manager supports the ordered insertion of variables, i.e.
Bdd< LibraryType > getRange(storm::expressions::Variable const &variable) const
Retrieves the BDD representing the range of the meta variable, i.e., a function that maps all legal v...
std::pair< storm::expressions::Variable, storm::expressions::Variable > addMetaVariable(std::string const &variableName, int_fast64_t low, int_fast64_t high, boost::optional< std::pair< MetaVariablePosition, storm::expressions::Variable > > const &position=boost::none)
Adds an integer meta variable with the given range with two layers (a 'normal' and a 'primed' one).
DdManager< LibraryType > & operator=(DdManager< LibraryType > const &other)=delete
Add< LibraryType, ValueType > getConstant(ValueType const &value) const
Retrieves an ADD representing the constant function with the given value.
Definition DdManager.cpp:67
DdManager< LibraryType > & operator=(DdManager< LibraryType > &&other)=default
std::vector< storm::expressions::Variable > addBitVectorMetaVariable(std::string const &variableName, uint64_t bits, uint64_t numberOfLayers, boost::optional< std::pair< MetaVariablePosition, storm::expressions::Variable > > const &position=boost::none)
Creates a meta variable with the given number of layers.
void allowDynamicReordering(bool value)
Sets whether dynamic reordering is allowed for the DDs managed by this manager (if supported).
void debugCheck() const
Performs a debug check if available.
std::size_t getNumberOfMetaVariables() const
Retrieves the number of meta variables that are contained in this manager.
This class is responsible for managing a set of typed variables and all expressions using these varia...