#include "storm/storage/dd/DdMetaVariable.h" #include "storm/utility/macros.h" namespace storm { namespace dd { template DdMetaVariable::DdMetaVariable(std::string const& name, int_fast64_t low, int_fast64_t high, std::vector> const& ddVariables) : name(name), type(MetaVariableType::Int), low(low), high(high), ddVariables(ddVariables) { this->createCube(); } template DdMetaVariable::DdMetaVariable(std::string const& name, std::vector> const& ddVariables) : name(name), type(MetaVariableType::Bool), low(0), high(1), ddVariables(ddVariables) { this->createCube(); } template std::string const& DdMetaVariable::getName() const { return this->name; } template MetaVariableType DdMetaVariable::getType() const { return this->type; } template int_fast64_t DdMetaVariable::getLow() const { return this->low; } template int_fast64_t DdMetaVariable::getHigh() const { return this->high; } template std::size_t DdMetaVariable::getNumberOfDdVariables() const { return this->ddVariables.size(); } template std::vector> const& DdMetaVariable::getDdVariables() const { return this->ddVariables; } template Bdd const& DdMetaVariable::getCube() const { return this->cube; } template std::vector DdMetaVariable::getIndices() const { std::vector> indicesAndLevels = this->getIndicesAndLevels(); std::sort(indicesAndLevels.begin(), indicesAndLevels.end(), [] (std::pair const& a, std::pair const& b) { return a.second < b.second; }); std::vector indices; for (auto const& e : indicesAndLevels) { indices.emplace_back(e.first); } return indices; } template std::vector> DdMetaVariable::getIndicesAndLevels() const { std::vector> indicesAndLevels; for (auto const& v : ddVariables) { indicesAndLevels.emplace_back(v.getIndex(), v.getLevel()); } return indicesAndLevels; } template uint64_t DdMetaVariable::getHighestLevel() const { uint64_t result = 0; bool first = true; for (auto const& v : ddVariables) { if (first) { result = v.getLevel(); } else { result = std::max(result, v.getLevel()); } } return result; } template void DdMetaVariable::createCube() { STORM_LOG_ASSERT(!this->ddVariables.empty(), "The DD variables must not be empty."); auto it = this->ddVariables.begin(); this->cube = *it; ++it; for (auto ite = this->ddVariables.end(); it != ite; ++it) { this->cube &= *it; } } template class DdMetaVariable; template class DdMetaVariable; } }