1#ifndef STORM_STORAGE_DD_DDMANAGER_H_
2#define STORM_STORAGE_DD_DDMANAGER_H_
4#include <boost/optional.hpp>
7#include <unordered_map>
24template<DdType LibraryType>
25class DdManager :
public std::enable_shared_from_this<DdManager<LibraryType>> {
27 friend class Bdd<LibraryType>;
29 template<DdType LibraryTypePrime,
typename ValueType>
32 template<DdType LibraryTypePrime,
typename ValueType>
61 template<
typename ValueType>
76 template<
typename ValueType>
84 template<
typename ValueType>
92 template<
typename ValueType>
100 template<
typename ValueType>
132 template<
typename ValueType>
141 Bdd<LibraryType> getIdentity(std::vector<std::pair<storm::expressions::Variable, storm::expressions::Variable>>
const& variablePairs,
142 bool restrictToFirstRange =
true)
const;
177 boost::optional<uint64_t>
const& numberOfLayers = boost::none);
186 std::pair<storm::expressions::Variable, storm::expressions::Variable>
addMetaVariable(
187 std::string
const& variableName, int_fast64_t low, int_fast64_t high,
188 boost::optional<std::pair<MetaVariablePosition, storm::expressions::Variable>>
const& position = boost::none);
197 std::string
const& variableName, int_fast64_t low, int_fast64_t high, uint64_t numberOfLayers,
198 boost::optional<std::pair<MetaVariablePosition, storm::expressions::Variable>>
const& position = boost::none);
207 std::string
const& variableName, uint64_t bits, uint64_t numberOfLayers,
208 boost::optional<std::pair<MetaVariablePosition, storm::expressions::Variable>>
const& position = boost::none);
215 std::pair<storm::expressions::Variable, storm::expressions::Variable>
addMetaVariable(
216 std::string
const& variableName, boost::optional<std::pair<MetaVariablePosition, storm::expressions::Variable>>
const& position = boost::none);
225 std::string
const& variableName, uint64_t numberOfLayers,
226 boost::optional<std::pair<MetaVariablePosition, storm::expressions::Variable>>
const& position = boost::none);
316 std::vector<uint_fast64_t>
getSortedVariableIndices(std::set<storm::expressions::Variable>
const& metaVariables)
const;
345 void execute(std::function<
void()>
const& f)
const;
355 std::vector<storm::expressions::Variable> addMetaVariableHelper(
356 MetaVariableType const& type, std::string
const& name, uint64_t numberOfDdVariables, uint64_t numberOfLayers,
357 boost::optional<std::pair<MetaVariablePosition, storm::expressions::Variable>>
const& position = boost::none,
358 boost::optional<std::pair<int_fast64_t, int_fast64_t>>
const& bounds = boost::none);
365 std::vector<std::string> getDdVariableNames()
const;
372 std::vector<storm::expressions::Variable> getDdVariables()
const;
409 std::unordered_map<storm::expressions::Variable, DdMetaVariable<LibraryType>> metaVariableMap;
412 std::shared_ptr<storm::expressions::ExpressionManager> manager;
storm::expressions::Variable getMetaVariable(std::string const &variableName) const
Retrieves the given meta variable by name.
Add< LibraryType, ValueType > getInfinity() const
Retrieves an ADD representing the constant infinity function.
bool hasMetaVariable(std::string const &variableName) const
Retrieves whether the given meta variable name is already in use.
std::shared_ptr< DdManager< LibraryType > > asSharedPointer()
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...
Add< LibraryType, ValueType > getAddZero() const
Retrieves an ADD representing the constant zero function.
std::set< storm::expressions::Variable > getAllMetaVariables() const
Retrieves the set of meta variables contained in the DD.
Add< LibraryType, ValueType > getAddUndefined() const
Retrieves an ADD representing an undefined value.
Add< LibraryType, ValueType > getAddOne() const
Retrieves an ADD representing the constant one function.
InternalDdManager< LibraryType > & getInternalDdManager()
Retrieves the internal DD manager.
Add< LibraryType, ValueType > getConstant(ValueType const &value) const
Retrieves an ADD representing the constant function with the given value.
Bdd< LibraryType > getCube(storm::expressions::Variable const &variable) const
Retrieves a BDD that is the cube of the variables representing the given meta variable.
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.
DdManager(DdManager< LibraryType > &&other)=default
DdManager()
Creates an empty manager without any meta variables.
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.
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...
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...
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
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 or not 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...