60 InternalAdd(InternalDdManager<DdType::CUDD> const* ddManager, cudd::ADD cuddAdd);
65 InternalAdd(InternalAdd<DdType::CUDD, ValueType> const& other) = default;
66 InternalAdd& operator=(InternalAdd<DdType::CUDD, ValueType> const& other) = default;
67 InternalAdd(InternalAdd<DdType::CUDD, ValueType>&& other) = default;
68 InternalAdd& operator=(InternalAdd<DdType::CUDD, ValueType>&& other) = default;
77 bool operator==(InternalAdd<DdType::CUDD, ValueType> const& other) const;
85 bool operator!=(InternalAdd<DdType::CUDD, ValueType> const& other) const;
93 InternalAdd<DdType::CUDD, ValueType> operator+(InternalAdd<DdType::CUDD, ValueType> const& other) const;
101 InternalAdd<DdType::CUDD, ValueType>& operator+=(InternalAdd<DdType::CUDD, ValueType> const& other);
109 InternalAdd<DdType::CUDD, ValueType> operator*(InternalAdd<DdType::CUDD, ValueType> const& other) const;
117 InternalAdd<DdType::CUDD, ValueType>& operator*=(InternalAdd<DdType::CUDD, ValueType> const& other);
125 InternalAdd<DdType::CUDD, ValueType> operator-(InternalAdd<DdType::CUDD, ValueType> const& other) const;
133 InternalAdd<DdType::CUDD, ValueType>& operator-=(InternalAdd<DdType::CUDD, ValueType> const& other);
141 InternalAdd<DdType::CUDD, ValueType> operator/(InternalAdd<DdType::CUDD, ValueType> const& other) const;
149 InternalAdd<DdType::CUDD, ValueType>& operator/=(InternalAdd<DdType::CUDD, ValueType> const& other);
157 InternalBdd<DdType::CUDD>
equals(InternalAdd<DdType::CUDD, ValueType> const& other) const;
174 InternalBdd<DdType::CUDD>
less(InternalAdd<DdType::CUDD, ValueType> const& other) const;
192 InternalBdd<DdType::CUDD>
greater(InternalAdd<DdType::CUDD, ValueType> const& other) const;
209 InternalAdd<DdType::CUDD, ValueType>
pow(InternalAdd<DdType::CUDD, ValueType> const& other) const;
217 InternalAdd<DdType::CUDD, ValueType>
mod(InternalAdd<DdType::CUDD, ValueType> const& other) const;
226 InternalAdd<DdType::CUDD, ValueType>
logxy(InternalAdd<DdType::CUDD, ValueType> const& other) const;
255 InternalAdd<DdType::CUDD, ValueType>
minimum(InternalAdd<DdType::CUDD, ValueType> const& other) const;
263 InternalAdd<DdType::CUDD, ValueType>
maximum(InternalAdd<DdType::CUDD, ValueType> const& other) const;
270 template<typename TargetValueType>
271 typename std::enable_if<std::is_same<ValueType, TargetValueType>::value, InternalAdd<DdType::CUDD, TargetValueType>>::type
toValueType() const;
272 template<typename TargetValueType>
273 typename std::enable_if<!std::is_same<ValueType, TargetValueType>::value, InternalAdd<DdType::CUDD, TargetValueType>>::type
toValueType() const;
319 bool
equalModuloPrecision(InternalAdd<DdType::CUDD, ValueType> const& other, ValueType const& precision, bool relative = true) const;
330 std::vector<InternalBdd<DdType::CUDD>> const& to) const;
341 std::vector<InternalBdd<DdType::CUDD>> const& to) const;
352 std::vector<InternalBdd<DdType::CUDD>> const& summationDdVariables) const;
363 std::vector<InternalBdd<DdType::CUDD>> const& summationDdVariables) const;
417 InternalAdd<DdType::CUDD, ValueType>
constrain(InternalAdd<DdType::CUDD, ValueType> const& constraint) const;
427 InternalAdd<DdType::CUDD, ValueType>
restrict(InternalAdd<DdType::CUDD, ValueType> const& constraint) const;
442 uint_fast64_t
getNonZeroCount(uint_fast64_t numberOfDdVariables) const;
520 void
exportToDot(std::string const& filename, std::vector<std::string> const& ddVariableNamesAsStrings, bool showVariablesIfPossible = true) const;
539 AddIterator<DdType::CUDD, ValueType>
begin(DdManager<DdType::CUDD> const& fullDdManager, InternalBdd<DdType::CUDD> const& variableCube,
540 uint_fast64_t numberOfDdVariables, std::set<storm::expressions::Variable> const& metaVariables,
541 bool enumerateDontCareMetaVariables = true) const;
549 AddIterator<DdType::CUDD, ValueType>
end(DdManager<DdType::CUDD> const& fullDdManager) const;
561 void
composeWithExplicitVector(Odd const& odd, std::vector<uint_fast64_t> const& ddVariableIndices, std::vector<ValueType>& targetVector,
562 std::function<ValueType(ValueType const&, ValueType const&)> const& function) const;
574 void
forEach(Odd const& odd, std::vector<uint_fast64_t> const& ddVariableIndices,
575 std::function<void(uint64_t const&, ValueType const&)> const& function) const;
588 void
composeWithExplicitVector(Odd const& odd, std::vector<uint_fast64_t> const& ddVariableIndices, std::vector<uint_fast64_t> const& offsets,
589 std::vector<ValueType>& targetVector, std::function<ValueType(ValueType const&, ValueType const&)> const& function) const;
597 std::vector<InternalAdd<DdType::CUDD, ValueType>>
splitIntoGroups(std::vector<uint_fast64_t> const& ddGroupVariableIndices) const;
607 std::vector<uint64_t>
decodeGroupLabels(std::vector<uint_fast64_t> const& ddGroupVariableIndices,
608 storm::storage::BitVector const& ddLabelVariableIndices) const;
619 std::vector<std::pair<InternalAdd<DdType::CUDD, ValueType>, InternalAdd<DdType::CUDD, ValueType>>>
splitIntoGroups(
620 InternalAdd<DdType::CUDD, ValueType> vector, std::vector<uint_fast64_t> const& ddGroupVariableIndices) const;
631 std::vector<std::vector<InternalAdd<DdType::CUDD, ValueType>>>
splitIntoGroups(std::vector<InternalAdd<DdType::CUDD, ValueType>> const& vectors,
632 std::vector<uint_fast64_t> const& ddGroupVariableIndices) const;
647 void
toMatrixComponents(std::vector<uint_fast64_t> const& rowGroupIndices, std::vector<uint_fast64_t>& rowIndications,
648 std::vector<storm::storage::MatrixEntry<uint_fast64_t, ValueType>>& columnsAndValues, Odd const& rowOdd, Odd const& columnOdd,
649 std::vector<uint_fast64_t> const& ddRowVariableIndices, std::vector<uint_fast64_t> const& ddColumnVariableIndices,
650 bool writeValues) const;
660 static
InternalAdd<DdType::CUDD, ValueType>
fromVector(InternalDdManager<DdType::CUDD> const* ddManager, std::vector<ValueType> const& values,
661 storm::dd::Odd const& odd, std::vector<uint_fast64_t> const& ddVariableIndices);
668 Odd createOdd(std::vector<uint_fast64_t> const& ddVariableIndices) const;
672#ifdef STORM_HAVE_CUDD
678 cudd::ADD getCuddAdd() const;
685 DdNode* getCuddDdNode() const;
694#ifdef STORM_HAVE_CUDD
707 void forEachRec(DdNode const* dd, uint_fast64_t currentLevel, uint_fast64_t maxLevel, uint_fast64_t currentOffset, Odd const& odd,
708 std::vector<uint_fast64_t> const& ddVariableIndices, std::function<void(uint64_t const&, ValueType const&)> const& function) const;
720 void splitIntoGroupsRec(DdNode* dd, std::vector<InternalAdd<DdType::CUDD, ValueType>>& groups, std::vector<uint_fast64_t> const& ddGroupVariableIndices,
721 uint_fast64_t currentLevel, uint_fast64_t maxLevel) const;
735 void decodeGroupLabelsRec(DdNode* dd, std::vector<uint64_t>& labels, std::vector<uint_fast64_t> const& ddGroupVariableIndices,
736 storm::storage::BitVector const& ddLabelVariableIndices, uint_fast64_t currentLevel, uint_fast64_t maxLevel,
737 uint64_t label) const;
750 void splitIntoGroupsRec(DdNode* dd1, DdNode* dd2,
751 std::vector<std::pair<InternalAdd<DdType::CUDD, ValueType>, InternalAdd<DdType::CUDD, ValueType>>>& groups,
752 std::vector<uint_fast64_t> const& ddGroupVariableIndices, uint_fast64_t currentLevel, uint_fast64_t maxLevel) const;
764 void splitIntoGroupsRec(std::vector<DdNode*> const& dds, std::vector<std::vector<InternalAdd<DdType::CUDD, ValueType>>>& groups,
765 std::vector<uint_fast64_t> const& ddGroupVariableIndices, uint_fast64_t currentLevel, uint_fast64_t maxLevel) const;
792 void toMatrixComponentsRec(DdNode const* dd, std::vector<uint_fast64_t> const& rowGroupOffsets, std::vector<uint_fast64_t>& rowIndications,
793 std::vector<storm::storage::MatrixEntry<uint_fast64_t, ValueType>>& columnsAndValues, Odd const& rowOdd, Odd const& columnOdd,
794 uint_fast64_t currentRowLevel, uint_fast64_t currentColumnLevel, uint_fast64_t maxLevel, uint_fast64_t currentRowOffset,
795 uint_fast64_t currentColumnOffset, std::vector<uint_fast64_t> const& ddRowVariableIndices,
796 std::vector<uint_fast64_t> const& ddColumnVariableIndices, bool writeValues) const;
810 static DdNode* fromVectorRec(::DdManager* manager, uint_fast64_t& currentOffset, uint_fast64_t currentLevel, uint_fast64_t maxLevel,
811 std::vector<ValueType> const& values, Odd const& odd, std::vector<uint_fast64_t> const& ddVariableIndices);
825 static std::shared_ptr<Odd> createOddRec(DdNode* dd, cudd::Cudd const& manager, uint_fast64_t currentLevel, uint_fast64_t maxLevel,
826 std::vector<uint_fast64_t> const& ddVariableIndices,
827 std::vector<std::unordered_map<DdNode*, std::shared_ptr<Odd>>>& uniqueTableForLevels);