#include "src/storage/dd/sylvan/InternalSylvanDdManager.h" #include "src/utility/constants.h" #include "src/utility/macros.h" #include "src/exceptions/NotImplementedException.h" #include "src/exceptions/NotSupportedException.h" namespace storm { namespace dd { uint_fast64_t InternalDdManager::numberOfInstances = 0; // We let the variables start at an odd offset, since some functions provided by sylvan assume that the source/row // variables are at odd levels. uint_fast64_t InternalDdManager::nextFreeVariableIndex = 1; InternalDdManager::InternalDdManager() { if (numberOfInstances == 0) { // Initialize lace: auto-detect number of workers. lace_init(0, 1000000); lace_startup(0, 0, 0); sylvan::Sylvan::initPackage(1ull << 16, 1ull << 32, 1ull << 16, 1ull << 32); sylvan::Sylvan::initBdd(1); sylvan::Sylvan::initMtbdd(); } ++numberOfInstances; } InternalDdManager::~InternalDdManager() { --numberOfInstances; if (numberOfInstances == 0) { sylvan::Sylvan::quitPackage(); lace_exit(); } } InternalBdd InternalDdManager::getBddOne() const { return InternalBdd(this, sylvan::Bdd::bddOne()); } template<> InternalAdd InternalDdManager::getAddOne() const { return InternalAdd(this, sylvan::Mtbdd::doubleTerminal(storm::utility::one())); } template<> InternalAdd InternalDdManager::getAddOne() const { return InternalAdd(this, sylvan::Mtbdd::uint64Terminal(storm::utility::one())); } InternalBdd InternalDdManager::getBddZero() const { return InternalBdd(this, sylvan::Bdd::bddZero()); } template<> InternalAdd InternalDdManager::getAddZero() const { return InternalAdd(this, sylvan::Mtbdd::doubleTerminal(storm::utility::zero())); } template<> InternalAdd InternalDdManager::getAddZero() const { return InternalAdd(this, sylvan::Mtbdd::uint64Terminal(storm::utility::zero())); } template<> InternalAdd InternalDdManager::getConstant(double const& value) const { return InternalAdd(this, sylvan::Mtbdd::doubleTerminal(value)); } template<> InternalAdd InternalDdManager::getConstant(uint_fast64_t const& value) const { return InternalAdd(this, sylvan::Mtbdd::uint64Terminal(value)); } std::pair, InternalBdd> InternalDdManager::createNewDdVariablePair() { InternalBdd first = InternalBdd(this, sylvan::Bdd::bddVar(nextFreeVariableIndex)); InternalBdd second = InternalBdd(this, sylvan::Bdd::bddVar(nextFreeVariableIndex + 1)); nextFreeVariableIndex += 2; return std::make_pair(first, second); } void InternalDdManager::allowDynamicReordering(bool value) { STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "Operation is not supported by sylvan."); } bool InternalDdManager::isDynamicReorderingAllowed() const { STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "Operation is not supported by sylvan."); } void InternalDdManager::triggerReordering() { STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "Operation is not supported by sylvan."); } template InternalAdd InternalDdManager::getAddOne() const; template InternalAdd InternalDdManager::getAddOne() const; template InternalAdd InternalDdManager::getAddZero() const; template InternalAdd InternalDdManager::getAddZero() const; template InternalAdd InternalDdManager::getConstant(double const& value) const; template InternalAdd InternalDdManager::getConstant(uint_fast64_t const& value) const; } }