dehnert
9 years ago
15 changed files with 901 additions and 314 deletions
-
2src/storage/dd/Bdd.cpp
-
1src/storage/dd/Bdd.h
-
281src/storage/dd/DdManager.cpp
-
212src/storage/dd/DdManager.h
-
62src/storage/dd/DdMetaVariable.cpp
-
102src/storage/dd/DdMetaVariable.h
-
14src/storage/dd/InternalDdManager.h
-
242src/storage/dd/cudd/CuddDdManager.cpp
-
20src/storage/dd/cudd/CuddDdManager.h
-
0src/storage/dd/cudd/InternalCuddAdd.cpp
-
0src/storage/dd/cudd/InternalCuddAdd.h
-
62src/storage/dd/cudd/InternalCuddBdd.cpp
-
10src/storage/dd/cudd/InternalCuddBdd.h
-
88src/storage/dd/cudd/InternalCuddDdManager.cpp
-
119src/storage/dd/cudd/InternalCuddDdManager.h
@ -0,0 +1,62 @@ |
|||
#include "src/storage/dd/DdMetaVariable.h"
|
|||
|
|||
namespace storm { |
|||
namespace dd { |
|||
template<DdType LibraryType> |
|||
DdMetaVariable<LibraryType>::DdMetaVariable(std::string const& name, int_fast64_t low, int_fast64_t high, std::vector<Bdd<LibraryType>> const& ddVariables) : name(name), type(MetaVariableType::Int), low(low), high(high), ddVariables(ddVariables) { |
|||
this->createCube(); |
|||
} |
|||
|
|||
template<DdType LibraryType> |
|||
DdMetaVariable<LibraryType>::DdMetaVariable(std::string const& name, std::vector<Bdd<LibraryType>> const& ddVariables) : name(name), type(MetaVariableType::Bool), low(0), high(1), ddVariables(ddVariables) { |
|||
this->createCube(); |
|||
} |
|||
|
|||
template<DdType LibraryType> |
|||
std::string const& DdMetaVariable<LibraryType>::getName() const { |
|||
return this->name; |
|||
} |
|||
|
|||
template<DdType LibraryType> |
|||
MetaVariableType DdMetaVariable<LibraryType>::getType() const { |
|||
return this->type; |
|||
} |
|||
|
|||
template<DdType LibraryType> |
|||
int_fast64_t DdMetaVariable<LibraryType>::getLow() const { |
|||
return this->low; |
|||
} |
|||
|
|||
template<DdType LibraryType> |
|||
int_fast64_t DdMetaVariable<LibraryType>::getHigh() const { |
|||
return this->high; |
|||
} |
|||
|
|||
template<DdType LibraryType> |
|||
std::size_t DdMetaVariable<LibraryType>::getNumberOfDdVariables() const { |
|||
return this->ddVariables.size(); |
|||
} |
|||
|
|||
template<DdType LibraryType> |
|||
std::vector<Bdd<LibraryType>> const& DdMetaVariable<LibraryType>::getDdVariables() const { |
|||
return this->ddVariables; |
|||
} |
|||
|
|||
template<DdType LibraryType> |
|||
Bdd<LibraryType> const& DdMetaVariable<LibraryType>::getCube() const { |
|||
return this->cube; |
|||
} |
|||
|
|||
template<DdType LibraryType> |
|||
void DdMetaVariable<LibraryType>::createCube() { |
|||
auto it = this->ddVariables.begin(); |
|||
this->cube = *it; |
|||
++it; |
|||
for (auto ite = this->ddVariables.end(); it != ite; ++it) { |
|||
this->cube &= *it; |
|||
} |
|||
} |
|||
|
|||
template class DdMetaVariable<DdType::CUDD>; |
|||
} |
|||
} |
@ -0,0 +1,14 @@ |
|||
#ifndef STORM_STORAGE_DD_INTERNALDDMANAGER_H_ |
|||
#define STORM_STORAGE_DD_INTERNALDDMANAGER_H_ |
|||
|
|||
#include "src/storage/dd/DdType.h" |
|||
|
|||
namespace storm { |
|||
namespace dd { |
|||
template <storm::dd::DdType LibraryType> |
|||
class InternalDdManager; |
|||
} |
|||
} |
|||
|
|||
|
|||
#endif /* STORM_STORAGE_DD_INTERNALDDMANAGER_H_ */ |
@ -0,0 +1,88 @@ |
|||
#include "src/storage/dd/cudd/InternalCuddDdManager.h"
|
|||
|
|||
#include "src/settings/SettingsManager.h"
|
|||
#include "src/settings/modules/CuddSettings.h"
|
|||
|
|||
namespace storm { |
|||
namespace dd { |
|||
|
|||
InternalDdManager<DdType::CUDD>::InternalDdManager() : cuddManager(), reorderingTechnique(CUDD_REORDER_NONE) { |
|||
this->cuddManager.SetMaxMemory(static_cast<unsigned long>(storm::settings::cuddSettings().getMaximalMemory() * 1024ul * 1024ul)); |
|||
this->cuddManager.SetEpsilon(storm::settings::cuddSettings().getConstantPrecision()); |
|||
|
|||
// Now set the selected reordering technique.
|
|||
storm::settings::modules::CuddSettings::ReorderingTechnique reorderingTechniqueAsSetting = storm::settings::cuddSettings().getReorderingTechnique(); |
|||
switch (reorderingTechniqueAsSetting) { |
|||
case storm::settings::modules::CuddSettings::ReorderingTechnique::None: this->reorderingTechnique = CUDD_REORDER_NONE; break; |
|||
case storm::settings::modules::CuddSettings::ReorderingTechnique::Random: this->reorderingTechnique = CUDD_REORDER_RANDOM; break; |
|||
case storm::settings::modules::CuddSettings::ReorderingTechnique::RandomPivot: this->reorderingTechnique = CUDD_REORDER_RANDOM_PIVOT; break; |
|||
case storm::settings::modules::CuddSettings::ReorderingTechnique::Sift: this->reorderingTechnique = CUDD_REORDER_SIFT; break; |
|||
case storm::settings::modules::CuddSettings::ReorderingTechnique::SiftConv: this->reorderingTechnique = CUDD_REORDER_SIFT_CONVERGE; break; |
|||
case storm::settings::modules::CuddSettings::ReorderingTechnique::SymmetricSift: this->reorderingTechnique = CUDD_REORDER_SYMM_SIFT; break; |
|||
case storm::settings::modules::CuddSettings::ReorderingTechnique::SymmetricSiftConv: this->reorderingTechnique = CUDD_REORDER_SYMM_SIFT_CONV; break; |
|||
case storm::settings::modules::CuddSettings::ReorderingTechnique::GroupSift: this->reorderingTechnique = CUDD_REORDER_GROUP_SIFT; break; |
|||
case storm::settings::modules::CuddSettings::ReorderingTechnique::GroupSiftConv: this->reorderingTechnique = CUDD_REORDER_GROUP_SIFT_CONV; break; |
|||
case storm::settings::modules::CuddSettings::ReorderingTechnique::Win2: this->reorderingTechnique = CUDD_REORDER_WINDOW2; break; |
|||
case storm::settings::modules::CuddSettings::ReorderingTechnique::Win2Conv: this->reorderingTechnique = CUDD_REORDER_WINDOW2_CONV; break; |
|||
case storm::settings::modules::CuddSettings::ReorderingTechnique::Win3: this->reorderingTechnique = CUDD_REORDER_WINDOW3; break; |
|||
case storm::settings::modules::CuddSettings::ReorderingTechnique::Win3Conv: this->reorderingTechnique = CUDD_REORDER_WINDOW3_CONV; break; |
|||
case storm::settings::modules::CuddSettings::ReorderingTechnique::Win4: this->reorderingTechnique = CUDD_REORDER_WINDOW4; break; |
|||
case storm::settings::modules::CuddSettings::ReorderingTechnique::Win4Conv: this->reorderingTechnique = CUDD_REORDER_WINDOW4_CONV; break; |
|||
case storm::settings::modules::CuddSettings::ReorderingTechnique::Annealing: this->reorderingTechnique = CUDD_REORDER_ANNEALING; break; |
|||
case storm::settings::modules::CuddSettings::ReorderingTechnique::Genetic: this->reorderingTechnique = CUDD_REORDER_GENETIC; break; |
|||
case storm::settings::modules::CuddSettings::ReorderingTechnique::Exact: this->reorderingTechnique = CUDD_REORDER_EXACT; break; |
|||
} |
|||
} |
|||
|
|||
InternalBdd<DdType::CUDD> InternalDdManager<DdType::CUDD>::getBddOne() const { |
|||
return InternalBdd<DdType::CUDD>(this, cuddManager.bddOne()); |
|||
} |
|||
|
|||
template<typename ValueType> |
|||
InternalAdd<DdType::CUDD, ValueType> InternalDdManager<DdType::CUDD>::getAddOne() const { |
|||
return InternalAdd<DdType::CUDD, ValueType>(this, cuddManager.addOne()); |
|||
} |
|||
|
|||
InternalBdd<DdType::CUDD> InternalDdManager<DdType::CUDD>::getBddZero() const { |
|||
return InternalBdd<DdType::CUDD>(this, cuddManager.bddZero()); |
|||
} |
|||
|
|||
template<typename ValueType> |
|||
InternalAdd<DdType::CUDD, ValueType> InternalDdManager<DdType::CUDD>::getAddZero() const { |
|||
return InternalAdd<DdType::CUDD, ValueType>(this, cuddManager.addZero()); |
|||
} |
|||
|
|||
template<typename ValueType> |
|||
InternalAdd<DdType::CUDD, ValueType> InternalDdManager<DdType::CUDD>::getConstant(ValueType const& value) const { |
|||
return InternalAdd<DdType::CUDD, ValueType>(this, cuddManager.constant(value)); |
|||
} |
|||
|
|||
std::pair<InternalBdd<DdType::CUDD>, InternalBdd<DdType::CUDD>> InternalDdManager<DdType::CUDD>::createNewDdVariablePair() { |
|||
std::pair<InternalBdd<DdType::CUDD>, InternalBdd<DdType::CUDD>> result; |
|||
result.first = InternalBdd<DdType::CUDD>(this, cuddManager.bddVar()); |
|||
result.second = InternalBdd<DdType::CUDD>(this, cuddManager.bddVar()); |
|||
|
|||
// Connect the two variables so they are not 'torn apart' during dynamic reordering.
|
|||
cuddManager.MakeTreeNode(result.first.getIndex(), 2, MTR_FIXED); |
|||
|
|||
return result; |
|||
} |
|||
|
|||
void InternalDdManager<DdType::CUDD>::allowDynamicReordering(bool value) { |
|||
if (value) { |
|||
this->getCuddManager().AutodynEnable(this->reorderingTechnique); |
|||
} else { |
|||
this->getCuddManager().AutodynDisable(); |
|||
} |
|||
} |
|||
|
|||
bool InternalDdManager<DdType::CUDD>::isDynamicReorderingAllowed() const { |
|||
Cudd_ReorderingType type; |
|||
return this->getCuddManager().ReorderingStatus(&type); |
|||
} |
|||
|
|||
void InternalDdManager<DdType::CUDD>::triggerReordering() { |
|||
this->getCuddManager().ReduceHeap(this->reorderingTechnique, 0); |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,119 @@ |
|||
#ifndef STORM_STORAGE_DD_INTERNALCUDDDDMANAGER_H_ |
|||
#define STORM_STORAGE_DD_INTERNALCUDDDDMANAGER_H_ |
|||
|
|||
#include "src/storage/dd/DdType.h" |
|||
#include "src/storage/dd/InternalDdManager.h" |
|||
|
|||
#include "src/storage/dd/cudd/InternalCuddBdd.h" |
|||
#include "src/storage/dd/cudd/InternalCuddAdd.h" |
|||
|
|||
#include "cuddObj.hh" |
|||
|
|||
namespace storm { |
|||
namespace dd { |
|||
template<DdType LibraryType, typename ValueType> |
|||
class InternalAdd; |
|||
|
|||
template<DdType LibraryType> |
|||
class InternalBdd; |
|||
|
|||
template<> |
|||
class InternalDdManager<DdType::CUDD> { |
|||
public: |
|||
friend class InternalAdd<DdType::CUDD, double>; |
|||
friend class InternalBdd<DdType::CUDD>; |
|||
|
|||
/*! |
|||
* Creates a new internal manager for CUDD DDs. |
|||
*/ |
|||
InternalDdManager(); |
|||
|
|||
/*! |
|||
* Retrieves a BDD representing the constant one function. |
|||
* |
|||
* @return A BDD representing the constant one function. |
|||
*/ |
|||
InternalBdd<DdType::CUDD> getBddOne() const; |
|||
|
|||
/*! |
|||
* Retrieves an ADD representing the constant one function. |
|||
* |
|||
* @return An ADD representing the constant one function. |
|||
*/ |
|||
template<typename ValueType> |
|||
InternalAdd<DdType::CUDD, ValueType> getAddOne() const; |
|||
|
|||
/*! |
|||
* Retrieves a BDD representing the constant zero function. |
|||
* |
|||
* @return A BDD representing the constant zero function. |
|||
*/ |
|||
InternalBdd<DdType::CUDD> getBddZero() const; |
|||
|
|||
/*! |
|||
* Retrieves an ADD representing the constant zero function. |
|||
* |
|||
* @return An ADD representing the constant zero function. |
|||
*/ |
|||
template<typename ValueType> |
|||
InternalAdd<DdType::CUDD, ValueType> getAddZero() const; |
|||
|
|||
/*! |
|||
* Retrieves an ADD representing the constant function with the given value. |
|||
* |
|||
* @return An ADD representing the constant function with the given value. |
|||
*/ |
|||
template<typename ValueType> |
|||
InternalAdd<DdType::CUDD, ValueType> getConstant(ValueType const& value) const; |
|||
|
|||
/*! |
|||
* Creates a new pair of DD variables and returns the two cubes as a result. |
|||
* |
|||
* @return The two cubes belonging to the DD variables. |
|||
*/ |
|||
std::pair<InternalBdd<DdType::CUDD>, InternalBdd<DdType::CUDD>> createNewDdVariablePair(); |
|||
|
|||
/*! |
|||
* Sets whether or not dynamic reordering is allowed for the DDs managed by this manager. |
|||
* |
|||
* @param value If set to true, dynamic reordering is allowed and forbidden otherwise. |
|||
*/ |
|||
void allowDynamicReordering(bool value); |
|||
|
|||
/*! |
|||
* Retrieves whether dynamic reordering is currently allowed. |
|||
* |
|||
* @return True iff dynamic reordering is currently allowed. |
|||
*/ |
|||
bool isDynamicReorderingAllowed() const; |
|||
|
|||
/*! |
|||
* Triggers a reordering of the DDs managed by this manager. |
|||
*/ |
|||
void triggerReordering(); |
|||
|
|||
private: |
|||
/*! |
|||
* Retrieves the underlying CUDD manager. |
|||
* |
|||
* @return The underlying CUDD manager. |
|||
*/ |
|||
Cudd& getCuddManager(); |
|||
|
|||
/*! |
|||
* Retrieves the underlying CUDD manager. |
|||
* |
|||
* @return The underlying CUDD manager. |
|||
*/ |
|||
Cudd const& getCuddManager() const; |
|||
|
|||
// The manager responsible for the DDs created/modified with this DdManager. |
|||
Cudd cuddManager; |
|||
|
|||
// The technique that is used for dynamic reordering. |
|||
Cudd_ReorderingType reorderingTechnique; |
|||
}; |
|||
} |
|||
} |
|||
|
|||
#endif /* STORM_STORAGE_DD_INTERNALCUDDDDMANAGER_H_ */ |
Write
Preview
Loading…
Cancel
Save
Reference in new issue