62    InternalAdd(InternalDdManager<DdType::CUDD> const* ddManager, cudd::ADD cuddAdd);
 
   66    InternalAdd(InternalAdd<DdType::CUDD, ValueType> const& other) = default;
 
   67    InternalAdd& operator=(InternalAdd<DdType::CUDD, ValueType> const& other) = default;
 
   68    InternalAdd(InternalAdd<DdType::CUDD, ValueType>&& other) = default;
 
   69    InternalAdd& operator=(InternalAdd<DdType::CUDD, ValueType>&& other) = default;
 
   78    bool operator==(InternalAdd<DdType::CUDD, ValueType> const& other) const;
 
   86    bool operator!=(InternalAdd<DdType::CUDD, ValueType> const& other) const;
 
   94    InternalAdd<DdType::CUDD, ValueType> operator+(InternalAdd<DdType::CUDD, ValueType> const& other) const;
 
  102    InternalAdd<DdType::CUDD, ValueType>& operator+=(InternalAdd<DdType::CUDD, ValueType> const& other);
 
  110    InternalAdd<DdType::CUDD, ValueType> operator*(InternalAdd<DdType::CUDD, ValueType> const& other) const;
 
  118    InternalAdd<DdType::CUDD, ValueType>& operator*=(InternalAdd<DdType::CUDD, ValueType> const& other);
 
  126    InternalAdd<DdType::CUDD, ValueType> operator-(InternalAdd<DdType::CUDD, ValueType> const& other) const;
 
  134    InternalAdd<DdType::CUDD, ValueType>& operator-=(InternalAdd<DdType::CUDD, ValueType> const& other);
 
  142    InternalAdd<DdType::CUDD, ValueType> operator/(InternalAdd<DdType::CUDD, ValueType> const& other) const;
 
  150    InternalAdd<DdType::CUDD, ValueType>& operator/=(InternalAdd<DdType::CUDD, ValueType> const& other);
 
  158    InternalBdd<DdType::CUDD> 
equals(InternalAdd<DdType::CUDD, ValueType> const& other) const;
 
  166    InternalBdd<DdType::CUDD> notEquals(InternalAdd<DdType::CUDD, ValueType> const& other) const;
 
  175    InternalBdd<DdType::CUDD> 
less(InternalAdd<DdType::CUDD, ValueType> const& other) const;
 
  193    InternalBdd<DdType::CUDD> 
greater(InternalAdd<DdType::CUDD, ValueType> const& other) const;
 
  210    InternalAdd<DdType::CUDD, ValueType> 
pow(InternalAdd<DdType::CUDD, ValueType> const& other) const;
 
  218    InternalAdd<DdType::CUDD, ValueType> 
mod(InternalAdd<DdType::CUDD, ValueType> const& other) const;
 
  227    InternalAdd<DdType::CUDD, ValueType> 
logxy(InternalAdd<DdType::CUDD, ValueType> const& other) const;
 
  248    InternalAdd<DdType::CUDD, storm::RationalNumber> sharpenKwekMehlhorn(size_t precision) const;
 
  256    InternalAdd<DdType::CUDD, ValueType> 
minimum(InternalAdd<DdType::CUDD, ValueType> const& other) const;
 
  264    InternalAdd<DdType::CUDD, ValueType> 
maximum(InternalAdd<DdType::CUDD, ValueType> const& other) const;
 
  271    template<typename TargetValueType>
 
  272    typename std::enable_if<std::is_same<ValueType, TargetValueType>::value, InternalAdd<DdType::CUDD, TargetValueType>>::type 
toValueType() const;
 
  273    template<typename TargetValueType>
 
  274    typename std::enable_if<!std::is_same<ValueType, TargetValueType>::value, InternalAdd<DdType::CUDD, TargetValueType>>::type 
toValueType() const;
 
  320    bool 
equalModuloPrecision(InternalAdd<DdType::CUDD, ValueType> const& other, ValueType const& precision, bool relative = true) const;
 
  330    InternalAdd<DdType::CUDD, ValueType> swapVariables(std::vector<InternalBdd<DdType::CUDD>> const& from,
 
  331                                                       std::vector<InternalBdd<DdType::CUDD>> const& to) const;
 
  341    InternalAdd<DdType::CUDD, ValueType> permuteVariables(std::vector<InternalBdd<DdType::CUDD>> const& from,
 
  342                                                          std::vector<InternalBdd<DdType::CUDD>> const& to) const;
 
  353                                                        std::vector<InternalBdd<DdType::CUDD>> const& summationDdVariables) const;
 
  364                                                        std::vector<InternalBdd<DdType::CUDD>> const& summationDdVariables) const;
 
  418    InternalAdd<DdType::CUDD, ValueType> constrain(InternalAdd<DdType::CUDD, ValueType> const& constraint) const;
 
  428    InternalAdd<DdType::CUDD, ValueType> restrict(InternalAdd<DdType::CUDD, ValueType> const& constraint) const;
 
  443    uint_fast64_t getNonZeroCount(uint_fast64_t numberOfDdVariables) const;
 
  450    virtual uint_fast64_t getLeafCount() const;
 
  457    virtual uint_fast64_t getNodeCount() const;
 
  499    bool isConstant() const;
 
  506    uint_fast64_t getIndex() const;
 
  513    uint_fast64_t getLevel() const;
 
  521    void exportToDot(std::string const& filename, std::vector<std::string> const& ddVariableNamesAsStrings, bool showVariablesIfPossible = true) const;
 
  528    void exportToText(std::string const& filename) const;
 
  540    AddIterator<DdType::CUDD, ValueType> begin(DdManager<DdType::CUDD> const& fullDdManager, InternalBdd<DdType::CUDD> const& variableCube,
 
  541                                               uint_fast64_t numberOfDdVariables, std::set<storm::expressions::Variable> const& metaVariables,
 
  542                                               bool enumerateDontCareMetaVariables = true) const;
 
  550    AddIterator<DdType::CUDD, ValueType> end(DdManager<DdType::CUDD> const& fullDdManager) const;
 
  562    void composeWithExplicitVector(Odd const& odd, std::vector<uint_fast64_t> const& ddVariableIndices, std::vector<ValueType>& targetVector,
 
  563                                   std::function<ValueType(ValueType const&, ValueType const&)> const& function) const;
 
  575    void forEach(Odd const& odd, std::vector<uint_fast64_t> const& ddVariableIndices,
 
  576                 std::function<void(uint64_t const&, ValueType const&)> const& function) const;
 
  589    void composeWithExplicitVector(Odd const& odd, std::vector<uint_fast64_t> const& ddVariableIndices, std::vector<uint_fast64_t> const& offsets,
 
  590                                   std::vector<ValueType>& targetVector, std::function<ValueType(ValueType const&, ValueType const&)> const& function) const;
 
  598    std::vector<InternalAdd<DdType::CUDD, ValueType>> splitIntoGroups(std::vector<uint_fast64_t> const& ddGroupVariableIndices) const;
 
  608    std::vector<uint64_t> decodeGroupLabels(std::vector<uint_fast64_t> const& ddGroupVariableIndices,
 
  609                                            storm::storage::BitVector const& ddLabelVariableIndices) const;
 
  620    std::vector<std::pair<InternalAdd<DdType::CUDD, ValueType>, InternalAdd<DdType::CUDD, ValueType>>> splitIntoGroups(
 
  621        InternalAdd<DdType::CUDD, ValueType> vector, std::vector<uint_fast64_t> const& ddGroupVariableIndices) const;
 
  632    std::vector<std::vector<InternalAdd<DdType::CUDD, ValueType>>> splitIntoGroups(std::vector<InternalAdd<DdType::CUDD, ValueType>> const& vectors,
 
  633                                                                                   std::vector<uint_fast64_t> const& ddGroupVariableIndices) const;
 
  648    void toMatrixComponents(std::vector<uint_fast64_t> const& rowGroupIndices, std::vector<uint_fast64_t>& rowIndications,
 
  649                            std::vector<storm::storage::MatrixEntry<uint_fast64_t, ValueType>>& columnsAndValues, Odd const& rowOdd, Odd const& columnOdd,
 
  650                            std::vector<uint_fast64_t> const& ddRowVariableIndices, std::vector<uint_fast64_t> const& ddColumnVariableIndices,
 
  651                            bool writeValues) const;
 
  661    static 
InternalAdd<DdType::CUDD, ValueType> fromVector(InternalDdManager<DdType::CUDD> const* ddManager, std::vector<ValueType> const& values,
 
  662                                                           storm::dd::Odd const& odd, std::vector<uint_fast64_t> const& ddVariableIndices);
 
  669    Odd createOdd(std::vector<uint_fast64_t> const& ddVariableIndices) const;
 
  678    cudd::ADD getCuddAdd() const;
 
  685    DdNode* getCuddDdNode() const;
 
  690    std::string getStringId() const;
 
  705    void forEachRec(DdNode const* dd, uint_fast64_t currentLevel, uint_fast64_t maxLevel, uint_fast64_t currentOffset, Odd const& odd,
 
  706                    std::vector<uint_fast64_t> const& ddVariableIndices, std::function<void(uint64_t const&, ValueType const&)> const& function) const;
 
  718    void splitIntoGroupsRec(DdNode* dd, std::vector<InternalAdd<DdType::CUDD, ValueType>>& groups, std::vector<uint_fast64_t> const& ddGroupVariableIndices,
 
  719                            uint_fast64_t currentLevel, uint_fast64_t maxLevel) const;
 
  733    void decodeGroupLabelsRec(DdNode* dd, std::vector<uint64_t>& labels, std::vector<uint_fast64_t> const& ddGroupVariableIndices,
 
  734                              storm::storage::BitVector const& ddLabelVariableIndices, uint_fast64_t currentLevel, uint_fast64_t maxLevel,
 
  735                              uint64_t label) const;
 
  748    void splitIntoGroupsRec(DdNode* dd1, DdNode* dd2,
 
  749                            std::vector<std::pair<InternalAdd<DdType::CUDD, ValueType>, InternalAdd<DdType::CUDD, ValueType>>>& groups,
 
  750                            std::vector<uint_fast64_t> const& ddGroupVariableIndices, uint_fast64_t currentLevel, uint_fast64_t maxLevel) const;
 
  762    void splitIntoGroupsRec(std::vector<DdNode*> const& dds, std::vector<std::vector<InternalAdd<DdType::CUDD, ValueType>>>& groups,
 
  763                            std::vector<uint_fast64_t> const& ddGroupVariableIndices, uint_fast64_t currentLevel, uint_fast64_t maxLevel) const;
 
  790    void toMatrixComponentsRec(DdNode const* dd, std::vector<uint_fast64_t> const& rowGroupOffsets, std::vector<uint_fast64_t>& rowIndications,
 
  791                               std::vector<storm::storage::MatrixEntry<uint_fast64_t, ValueType>>& columnsAndValues, Odd const& rowOdd, Odd const& columnOdd,
 
  792                               uint_fast64_t currentRowLevel, uint_fast64_t currentColumnLevel, uint_fast64_t maxLevel, uint_fast64_t currentRowOffset,
 
  793                               uint_fast64_t currentColumnOffset, std::vector<uint_fast64_t> const& ddRowVariableIndices,
 
  794                               std::vector<uint_fast64_t> const& ddColumnVariableIndices, bool writeValues) const;
 
  808    static DdNode* 
fromVectorRec(::DdManager* manager, uint_fast64_t& currentOffset, uint_fast64_t currentLevel, uint_fast64_t maxLevel,
 
  809                                 std::vector<ValueType> const& values, Odd const& odd, std::vector<uint_fast64_t> const& ddVariableIndices);
 
  823    static std::shared_ptr<Odd> createOddRec(DdNode* dd, cudd::Cudd const& manager, uint_fast64_t currentLevel, uint_fast64_t maxLevel,
 
  824                                             std::vector<uint_fast64_t> const& ddVariableIndices,
 
  825                                             std::vector<std::unordered_map<DdNode*, std::shared_ptr<Odd>>>& uniqueTableForLevels);