#include "storm/storage/dd/Dd.h" #include #include "storm/storage/dd/DdManager.h" #include "storm/utility/macros.h" #include "storm/exceptions/InvalidArgumentException.h" namespace storm { namespace dd { template Dd::Dd(DdManager const& ddManager, std::set const& containedMetaVariables) : ddManager(const_cast*>(&ddManager)), containedMetaVariables(containedMetaVariables) { // Intentionally left empty. } template bool Dd::containsMetaVariable(storm::expressions::Variable const& metaVariable) const { return containedMetaVariables.find(metaVariable) != containedMetaVariables.end(); } template bool Dd::containsMetaVariables(std::set const& metaVariables) const { return std::includes(containedMetaVariables.begin(), containedMetaVariables.end(), metaVariables.begin(), metaVariables.end()); } template std::set const& Dd::getContainedMetaVariables() const { return this->containedMetaVariables; } template std::set& Dd::getContainedMetaVariables() { return this->containedMetaVariables; } template DdManager& Dd::getDdManager() const { return *this->ddManager; } template void Dd::addMetaVariables(std::set const& metaVariables) { std::set result; std::set_union(containedMetaVariables.begin(), containedMetaVariables.end(), metaVariables.begin(), metaVariables.end(), std::inserter(result, result.begin())); containedMetaVariables = std::move(result); } template void Dd::addMetaVariable(storm::expressions::Variable const& metaVariable) { this->getContainedMetaVariables().insert(metaVariable); } template void Dd::removeMetaVariable(storm::expressions::Variable const& metaVariable) { this->getContainedMetaVariables().erase(metaVariable); } template void Dd::removeMetaVariables(std::set const& metaVariables) { std::set result; std::set_difference(containedMetaVariables.begin(), containedMetaVariables.end(), metaVariables.begin(), metaVariables.end(), std::inserter(result, result.begin())); containedMetaVariables = std::move(result); } template std::vector Dd::getSortedVariableIndices() const { return this->getDdManager().getSortedVariableIndices(this->getContainedMetaVariables()); } template std::set Dd::joinMetaVariables(storm::dd::Dd const& first, storm::dd::Dd const& second) { std::set metaVariables; std::set_union(first.getContainedMetaVariables().begin(), first.getContainedMetaVariables().end(), second.getContainedMetaVariables().begin(), second.getContainedMetaVariables().end(), std::inserter(metaVariables, metaVariables.begin())); return metaVariables; } template std::set Dd::subtractMetaVariables(storm::dd::Dd const& first, storm::dd::Dd const& second) { bool includesAllMetaVariables = std::includes(first.getContainedMetaVariables().begin(), first.getContainedMetaVariables().end(), second.getContainedMetaVariables().begin(), second.getContainedMetaVariables().end()); STORM_LOG_THROW(includesAllMetaVariables, storm::exceptions::InvalidArgumentException, "Cannot subtract meta variables that are not contained in the DD."); std::set metaVariables; std::set_difference(first.getContainedMetaVariables().begin(), first.getContainedMetaVariables().end(), second.getContainedMetaVariables().begin(), second.getContainedMetaVariables().end(), std::inserter(metaVariables, metaVariables.begin())); return metaVariables; } template class Dd; template class Dd; } }