#include "src/storage/dd/sylvan/InternalSylvanAdd.h" #include #include "src/storage/dd/sylvan/InternalSylvanDdManager.h" #include "src/utility/macros.h" #include "src/exceptions/NotImplementedException.h" namespace storm { namespace dd { template InternalAdd::InternalAdd(InternalDdManager const* ddManager, sylvan::Mtbdd const& sylvanMtbdd) : ddManager(ddManager), sylvanMtbdd(sylvanMtbdd) { // Intentionally left empty. } template bool InternalAdd::operator==(InternalAdd const& other) const { return this->sylvanMtbdd == other.sylvanMtbdd; } template bool InternalAdd::operator!=(InternalAdd const& other) const { return this->sylvanMtbdd != other.sylvanMtbdd; } template InternalAdd InternalAdd::ite(InternalAdd const& thenDd, InternalAdd const& elseDd) const { return InternalAdd(ddManager, sylvan::Mtbdd(static_cast(this->sylvanMtbdd.NotZero().GetBDD())).Ite(thenDd.sylvanMtbdd, elseDd.sylvanMtbdd)); } template InternalAdd InternalAdd::operator+(InternalAdd const& other) const { return InternalAdd(ddManager, this->sylvanMtbdd.Plus(other.sylvanMtbdd)); } template InternalAdd& InternalAdd::operator+=(InternalAdd const& other) { this->sylvanMtbdd = this->sylvanMtbdd.Plus(other.sylvanMtbdd); return *this; } template InternalAdd InternalAdd::operator*(InternalAdd const& other) const { return InternalAdd(ddManager, this->sylvanMtbdd.Times(other.sylvanMtbdd)); } template InternalAdd& InternalAdd::operator*=(InternalAdd const& other) { this->sylvanMtbdd = this->sylvanMtbdd.Times(other.sylvanMtbdd); return *this; } template InternalAdd InternalAdd::operator-(InternalAdd const& other) const { return InternalAdd(ddManager, this->sylvanMtbdd.Minus(other.sylvanMtbdd)); } template InternalAdd& InternalAdd::operator-=(InternalAdd const& other) { this->sylvanMtbdd = this->sylvanMtbdd.Minus(other.sylvanMtbdd); return *this; } template InternalAdd InternalAdd::operator/(InternalAdd const& other) const { return InternalAdd(ddManager, this->sylvanMtbdd.Divide(other.sylvanMtbdd)); } template InternalAdd& InternalAdd::operator/=(InternalAdd const& other) { this->sylvanMtbdd = this->sylvanMtbdd.Divide(other.sylvanMtbdd); return *this; } template InternalBdd InternalAdd::equals(InternalAdd const& other) const { return InternalBdd(ddManager, this->sylvanMtbdd.Equals(other.sylvanMtbdd)); } template InternalBdd InternalAdd::notEquals(InternalAdd const& other) const { return !this->equals(other); } template InternalBdd InternalAdd::less(InternalAdd const& other) const { return InternalBdd(ddManager, this->sylvanMtbdd.Less(other.sylvanMtbdd)); } template InternalBdd InternalAdd::lessOrEqual(InternalAdd const& other) const { return InternalBdd(ddManager, this->sylvanMtbdd.LessOrEqual(other.sylvanMtbdd)); } template InternalBdd InternalAdd::greater(InternalAdd const& other) const { return !this->lessOrEqual(other); } template InternalBdd InternalAdd::greaterOrEqual(InternalAdd const& other) const { return !this->less(other); } template InternalAdd InternalAdd::pow(InternalAdd const& other) const { return InternalAdd(ddManager, this->sylvanMtbdd.Pow(other.sylvanMtbdd)); } template InternalAdd InternalAdd::mod(InternalAdd const& other) const { return InternalAdd(ddManager, this->sylvanMtbdd.Mod(other.sylvanMtbdd)); } template InternalAdd InternalAdd::logxy(InternalAdd const& other) const { return InternalAdd(ddManager, this->sylvanMtbdd.Logxy(other.sylvanMtbdd)); } template InternalAdd InternalAdd::floor() const { return InternalAdd(ddManager, this->sylvanMtbdd.Floor()); } template InternalAdd InternalAdd::ceil() const { return InternalAdd(ddManager, this->sylvanMtbdd.Ceil()); } template InternalAdd InternalAdd::minimum(InternalAdd const& other) const { return InternalAdd(ddManager, this->sylvanMtbdd.Min(other.sylvanMtbdd)); } template InternalAdd InternalAdd::maximum(InternalAdd const& other) const { return InternalAdd(ddManager, this->sylvanMtbdd.Max(other.sylvanMtbdd)); } template InternalAdd InternalAdd::sumAbstract(InternalBdd const& cube) const { return InternalAdd(ddManager, this->sylvanMtbdd.AbstractPlus(cube.sylvanBdd)); } template InternalAdd InternalAdd::minAbstract(InternalBdd const& cube) const { return InternalAdd(ddManager, this->sylvanMtbdd.AbstractMin(cube.sylvanBdd)); } template InternalAdd InternalAdd::maxAbstract(InternalBdd const& cube) const { return InternalAdd(ddManager, this->sylvanMtbdd.AbstractMax(cube.sylvanBdd)); } template bool InternalAdd::equalModuloPrecision(InternalAdd const& other, double precision, bool relative) const { if (relative) { return this->sylvanMtbdd.EqualNormRel(other.sylvanMtbdd, precision); } else { return this->sylvanMtbdd.EqualNorm(other.sylvanMtbdd, precision); } } template InternalAdd InternalAdd::swapVariables(std::vector> const& from, std::vector> const& to) const { std::vector fromIndices; std::vector toIndices; for (auto it1 = from.begin(), ite1 = from.end(), it2 = to.begin(); it1 != ite1; ++it1, ++it2) { fromIndices.push_back(it1->getIndex()); fromIndices.push_back(it2->getIndex()); toIndices.push_back(it2->getIndex()); toIndices.push_back(it1->getIndex()); } return InternalAdd(ddManager, this->sylvanMtbdd.Permute(fromIndices, toIndices)); } template InternalAdd InternalAdd::multiplyMatrix(InternalAdd const& otherMatrix, std::vector> const& summationDdVariables) const { InternalBdd summationVariables = ddManager->getBddOne(); for (auto const& ddVariable : summationDdVariables) { summationVariables &= ddVariable; } return InternalAdd(ddManager, this->sylvanMtbdd.AndExists(otherMatrix.sylvanMtbdd, summationVariables.getSylvanBdd())); } template InternalBdd InternalAdd::greater(ValueType const& value) const { return InternalBdd(ddManager, this->sylvanMtbdd.BddStrictThreshold(value)); } template InternalBdd InternalAdd::greaterOrEqual(ValueType const& value) const { return InternalBdd(ddManager, this->sylvanMtbdd.BddThreshold(value)); } template InternalBdd InternalAdd::less(ValueType const& value) const { return !this->greaterOrEqual(value); } template InternalBdd InternalAdd::lessOrEqual(ValueType const& value) const { return !this->greater(value); } template InternalBdd InternalAdd::notZero() const { return InternalBdd(ddManager, this->sylvanMtbdd.NotZero()); } template InternalAdd InternalAdd::constrain(InternalAdd const& constraint) const { STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); } template InternalAdd InternalAdd::restrict(InternalAdd const& constraint) const { STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); } template InternalBdd InternalAdd::getSupport() const { return InternalBdd(ddManager, sylvan::Bdd(static_cast(this->sylvanMtbdd.Support().GetMTBDD()))); } template uint_fast64_t InternalAdd::getNonZeroCount(uint_fast64_t numberOfDdVariables) const { if (numberOfDdVariables == 0) { return 0; } return static_cast(this->sylvanMtbdd.NonZeroCount(numberOfDdVariables)); } template uint_fast64_t InternalAdd::getLeafCount() const { return static_cast(this->sylvanMtbdd.CountLeaves()); } template uint_fast64_t InternalAdd::getNodeCount() const { return static_cast(this->sylvanMtbdd.NodeCount()); } template ValueType InternalAdd::getMin() const { return static_cast(this->sylvanMtbdd.getDoubleMin()); } template ValueType InternalAdd::getMax() const { return static_cast(this->sylvanMtbdd.getDoubleMax()); } template bool InternalAdd::isOne() const { return *this == ddManager->getAddOne(); } template bool InternalAdd::isZero() const { return *this == ddManager->getAddZero(); } template bool InternalAdd::isConstant() const { return this->sylvanMtbdd.isTerminal(); } template uint_fast64_t InternalAdd::getIndex() const { return static_cast(this->sylvanMtbdd.TopVar()); } template void InternalAdd::exportToDot(std::string const& filename, std::vector const& ddVariableNamesAsStrings) const { // Open the file, dump the DD and close it again. FILE* filePointer = fopen(filename.c_str() , "w"); mtbdd_fprintdot(filePointer, this->sylvanMtbdd.GetMTBDD(), nullptr); fclose(filePointer); } template AddIterator InternalAdd::begin(DdManager const& fullDdManager, std::set const& metaVariables, bool enumerateDontCareMetaVariables) const { STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); } template AddIterator InternalAdd::end(DdManager const& fullDdManager, bool enumerateDontCareMetaVariables) const { STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); } template Odd InternalAdd::createOdd(std::vector const& ddVariableIndices) const { STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); } template void InternalAdd::composeWithExplicitVector(storm::dd::Odd const& odd, std::vector const& ddVariableIndices, std::vector& targetVector, std::function const& function) const { STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); } template void InternalAdd::composeWithExplicitVector(storm::dd::Odd const& odd, std::vector const& ddVariableIndices, std::vector const& offsets, std::vector& targetVector, std::function const& function) const { STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); } template std::vector> InternalAdd::splitIntoGroups(std::vector const& ddGroupVariableIndices) const { STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); } template std::vector, InternalAdd>> InternalAdd::splitIntoGroups(InternalAdd vector, std::vector const& ddGroupVariableIndices) const { STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); } template void InternalAdd::toMatrixComponents(std::vector const& rowGroupIndices, std::vector& rowIndications, std::vector>& columnsAndValues, Odd const& rowOdd, Odd const& columnOdd, std::vector const& ddRowVariableIndices, std::vector const& ddColumnVariableIndices, bool writeValues) const { STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); } template InternalAdd InternalAdd::fromVector(InternalDdManager const* ddManager, std::vector const& values, storm::dd::Odd const& odd, std::vector const& ddVariableIndices) { STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); } template sylvan::Mtbdd InternalAdd::getSylvanMtbdd() const { return sylvanMtbdd; } template class InternalAdd; template class InternalAdd; } }