Browse Source
			
			
			added 'empty' framework for sylvan-based implementation of DD abstraction layer
			
				
		added 'empty' framework for sylvan-based implementation of DD abstraction layer
	
		
	
			
				Former-commit-id: c0f781a515
			
			
				main
			
			
		
				 20 changed files with 1669 additions and 14 deletions
			
			
		- 
					2src/CMakeLists.txt
 - 
					5src/storage/dd/Add.cpp
 - 
					5src/storage/dd/Add.h
 - 
					12src/storage/dd/Bdd.cpp
 - 
					1src/storage/dd/Bdd.h
 - 
					1src/storage/dd/Dd.cpp
 - 
					27src/storage/dd/DdManager.cpp
 - 
					1src/storage/dd/DdManager.h
 - 
					1src/storage/dd/DdMetaVariable.cpp
 - 
					4src/storage/dd/DdMetaVariable.h
 - 
					6src/storage/dd/cudd/CuddAddIterator.h
 - 
					2src/storage/dd/cudd/InternalCuddAdd.cpp
 - 
					317src/storage/dd/sylvan/InternalSylvanAdd.cpp
 - 
					581src/storage/dd/sylvan/InternalSylvanAdd.h
 - 
					150src/storage/dd/sylvan/InternalSylvanBdd.cpp
 - 
					301src/storage/dd/sylvan/InternalSylvanBdd.h
 - 
					61src/storage/dd/sylvan/InternalSylvanDdManager.cpp
 - 
					101src/storage/dd/sylvan/InternalSylvanDdManager.h
 - 
					36src/storage/dd/sylvan/SylvanAddIterator.cpp
 - 
					69src/storage/dd/sylvan/SylvanAddIterator.h
 
@ -0,0 +1,317 @@ | 
				
			|||
#include "src/storage/dd/sylvan/InternalSylvanAdd.h"
 | 
				
			|||
 | 
				
			|||
#include "src/utility/macros.h"
 | 
				
			|||
#include "src/exceptions/NotImplementedException.h"
 | 
				
			|||
 | 
				
			|||
namespace storm { | 
				
			|||
    namespace dd { | 
				
			|||
        template<typename ValueType> | 
				
			|||
        bool InternalAdd<DdType::Sylvan, ValueType>::operator==(InternalAdd<DdType::Sylvan, ValueType> const& other) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        bool InternalAdd<DdType::Sylvan, ValueType>::operator!=(InternalAdd<DdType::Sylvan, ValueType> const& other) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        InternalAdd<DdType::Sylvan, ValueType> InternalAdd<DdType::Sylvan, ValueType>::ite(InternalAdd<DdType::Sylvan, ValueType> const& thenDd, InternalAdd<DdType::Sylvan, ValueType> const& elseDd) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        InternalAdd<DdType::Sylvan, ValueType> InternalAdd<DdType::Sylvan, ValueType>::operator!() const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        InternalAdd<DdType::Sylvan, ValueType> InternalAdd<DdType::Sylvan, ValueType>::operator||(InternalAdd<DdType::Sylvan, ValueType> const& other) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        InternalAdd<DdType::Sylvan, ValueType>& InternalAdd<DdType::Sylvan, ValueType>::operator|=(InternalAdd<DdType::Sylvan, ValueType> const& other) { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
 | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        InternalAdd<DdType::Sylvan, ValueType> InternalAdd<DdType::Sylvan, ValueType>::operator+(InternalAdd<DdType::Sylvan, ValueType> const& other) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        InternalAdd<DdType::Sylvan, ValueType>& InternalAdd<DdType::Sylvan, ValueType>::operator+=(InternalAdd<DdType::Sylvan, ValueType> const& other) { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        InternalAdd<DdType::Sylvan, ValueType> InternalAdd<DdType::Sylvan, ValueType>::operator*(InternalAdd<DdType::Sylvan, ValueType> const& other) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        InternalAdd<DdType::Sylvan, ValueType>& InternalAdd<DdType::Sylvan, ValueType>::operator*=(InternalAdd<DdType::Sylvan, ValueType> const& other) { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        InternalAdd<DdType::Sylvan, ValueType> InternalAdd<DdType::Sylvan, ValueType>::operator-(InternalAdd<DdType::Sylvan, ValueType> const& other) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        InternalAdd<DdType::Sylvan, ValueType>& InternalAdd<DdType::Sylvan, ValueType>::operator-=(InternalAdd<DdType::Sylvan, ValueType> const& other) { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        InternalAdd<DdType::Sylvan, ValueType> InternalAdd<DdType::Sylvan, ValueType>::operator/(InternalAdd<DdType::Sylvan, ValueType> const& other) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        InternalAdd<DdType::Sylvan, ValueType>& InternalAdd<DdType::Sylvan, ValueType>::operator/=(InternalAdd<DdType::Sylvan, ValueType> const& other) { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        InternalAdd<DdType::Sylvan, ValueType> InternalAdd<DdType::Sylvan, ValueType>::equals(InternalAdd<DdType::Sylvan, ValueType> const& other) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        InternalAdd<DdType::Sylvan, ValueType> InternalAdd<DdType::Sylvan, ValueType>::notEquals(InternalAdd<DdType::Sylvan, ValueType> const& other) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        InternalAdd<DdType::Sylvan, ValueType> InternalAdd<DdType::Sylvan, ValueType>::less(InternalAdd<DdType::Sylvan, ValueType> const& other) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        InternalAdd<DdType::Sylvan, ValueType> InternalAdd<DdType::Sylvan, ValueType>::lessOrEqual(InternalAdd<DdType::Sylvan, ValueType> const& other) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        InternalAdd<DdType::Sylvan, ValueType> InternalAdd<DdType::Sylvan, ValueType>::greater(InternalAdd<DdType::Sylvan, ValueType> const& other) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        InternalAdd<DdType::Sylvan, ValueType> InternalAdd<DdType::Sylvan, ValueType>::greaterOrEqual(InternalAdd<DdType::Sylvan, ValueType> const& other) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        InternalAdd<DdType::Sylvan, ValueType> InternalAdd<DdType::Sylvan, ValueType>::pow(InternalAdd<DdType::Sylvan, ValueType> const& other) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        InternalAdd<DdType::Sylvan, ValueType> InternalAdd<DdType::Sylvan, ValueType>::mod(InternalAdd<DdType::Sylvan, ValueType> const& other) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        InternalAdd<DdType::Sylvan, ValueType> InternalAdd<DdType::Sylvan, ValueType>::logxy(InternalAdd<DdType::Sylvan, ValueType> const& other) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        InternalAdd<DdType::Sylvan, ValueType> InternalAdd<DdType::Sylvan, ValueType>::floor() const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        InternalAdd<DdType::Sylvan, ValueType> InternalAdd<DdType::Sylvan, ValueType>::ceil() const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        InternalAdd<DdType::Sylvan, ValueType> InternalAdd<DdType::Sylvan, ValueType>::minimum(InternalAdd<DdType::Sylvan, ValueType> const& other) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        InternalAdd<DdType::Sylvan, ValueType> InternalAdd<DdType::Sylvan, ValueType>::maximum(InternalAdd<DdType::Sylvan, ValueType> const& other) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        InternalAdd<DdType::Sylvan, ValueType> InternalAdd<DdType::Sylvan, ValueType>::sumAbstract(InternalBdd<DdType::Sylvan> const& cube) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        InternalAdd<DdType::Sylvan, ValueType> InternalAdd<DdType::Sylvan, ValueType>::minAbstract(InternalBdd<DdType::Sylvan> const& cube) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        InternalAdd<DdType::Sylvan, ValueType> InternalAdd<DdType::Sylvan, ValueType>::maxAbstract(InternalBdd<DdType::Sylvan> const& cube) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        bool InternalAdd<DdType::Sylvan, ValueType>::equalModuloPrecision(InternalAdd<DdType::Sylvan, ValueType> const& other, double precision, bool relative) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        InternalAdd<DdType::Sylvan, ValueType> InternalAdd<DdType::Sylvan, ValueType>::swapVariables(std::vector<InternalAdd<DdType::Sylvan, ValueType>> const& from, std::vector<InternalAdd<DdType::Sylvan, ValueType>> const& to) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        InternalAdd<DdType::Sylvan, ValueType> InternalAdd<DdType::Sylvan, ValueType>::multiplyMatrix(InternalAdd<DdType::Sylvan, ValueType> const& otherMatrix, std::vector<InternalAdd<DdType::Sylvan, ValueType>> const& summationDdVariables) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        InternalBdd<DdType::Sylvan> InternalAdd<DdType::Sylvan, ValueType>::greater(ValueType const& value) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        InternalBdd<DdType::Sylvan> InternalAdd<DdType::Sylvan, ValueType>::greaterOrEqual(ValueType const& value) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        InternalBdd<DdType::Sylvan> InternalAdd<DdType::Sylvan, ValueType>::less(ValueType const& value) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        InternalBdd<DdType::Sylvan> InternalAdd<DdType::Sylvan, ValueType>::lessOrEqual(ValueType const& value) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        InternalBdd<DdType::Sylvan> InternalAdd<DdType::Sylvan, ValueType>::notZero() const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        InternalAdd<DdType::Sylvan, ValueType> InternalAdd<DdType::Sylvan, ValueType>::constrain(InternalAdd<DdType::Sylvan, ValueType> const& constraint) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        InternalAdd<DdType::Sylvan, ValueType> InternalAdd<DdType::Sylvan, ValueType>::restrict(InternalAdd<DdType::Sylvan, ValueType> const& constraint) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        InternalBdd<DdType::Sylvan> InternalAdd<DdType::Sylvan, ValueType>::getSupport() const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        uint_fast64_t InternalAdd<DdType::Sylvan, ValueType>::getNonZeroCount(uint_fast64_t numberOfDdVariables) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        uint_fast64_t InternalAdd<DdType::Sylvan, ValueType>::getLeafCount() const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        uint_fast64_t InternalAdd<DdType::Sylvan, ValueType>::getNodeCount() const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        ValueType InternalAdd<DdType::Sylvan, ValueType>::getMin() const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        ValueType InternalAdd<DdType::Sylvan, ValueType>::getMax() const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        InternalBdd<DdType::Sylvan> InternalAdd<DdType::Sylvan, ValueType>::toBdd() const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        bool InternalAdd<DdType::Sylvan, ValueType>::isOne() const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        bool InternalAdd<DdType::Sylvan, ValueType>::isZero() const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        bool InternalAdd<DdType::Sylvan, ValueType>::isConstant() const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        uint_fast64_t InternalAdd<DdType::Sylvan, ValueType>::getIndex() const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        void InternalAdd<DdType::Sylvan, ValueType>::exportToDot(std::string const& filename, std::vector<std::string> const& ddVariableNamesAsStrings) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        AddIterator<DdType::Sylvan, ValueType> InternalAdd<DdType::Sylvan, ValueType>::begin(std::shared_ptr<DdManager<DdType::Sylvan> const> fullDdManager, std::set<storm::expressions::Variable> const& metaVariables, bool enumerateDontCareMetaVariables) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        AddIterator<DdType::Sylvan, ValueType> InternalAdd<DdType::Sylvan, ValueType>::end(std::shared_ptr<DdManager<DdType::Sylvan> const> fullDdManager, bool enumerateDontCareMetaVariables) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        Odd InternalAdd<DdType::Sylvan, ValueType>::createOdd(std::vector<uint_fast64_t> const& ddVariableIndices) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        void InternalAdd<DdType::Sylvan, ValueType>::composeWithExplicitVector(storm::dd::Odd const& odd, std::vector<uint_fast64_t> const& ddVariableIndices, std::vector<ValueType>& targetVector, std::function<ValueType (ValueType const&, ValueType const&)> const& function) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        void InternalAdd<DdType::Sylvan, ValueType>::composeWithExplicitVector(storm::dd::Odd const& odd, std::vector<uint_fast64_t> const& ddVariableIndices, std::vector<uint_fast64_t> const& offsets, std::vector<ValueType>& targetVector, std::function<ValueType (ValueType const&, ValueType const&)> const& function) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        std::vector<InternalAdd<DdType::Sylvan, ValueType>> InternalAdd<DdType::Sylvan, ValueType>::splitIntoGroups(std::vector<uint_fast64_t> const& ddGroupVariableIndices) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        std::vector<std::pair<InternalAdd<DdType::Sylvan, ValueType>, InternalAdd<DdType::Sylvan, ValueType>>> InternalAdd<DdType::Sylvan, ValueType>::splitIntoGroups(InternalAdd<DdType::Sylvan, ValueType> vector, std::vector<uint_fast64_t> const& ddGroupVariableIndices) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        void InternalAdd<DdType::Sylvan, ValueType>::toMatrixComponents(std::vector<uint_fast64_t> const& rowGroupIndices, std::vector<uint_fast64_t>& rowIndications, std::vector<storm::storage::MatrixEntry<uint_fast64_t, ValueType>>& columnsAndValues, Odd const& rowOdd, Odd const& columnOdd, std::vector<uint_fast64_t> const& ddRowVariableIndices, std::vector<uint_fast64_t> const& ddColumnVariableIndices, bool writeValues) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        InternalAdd<DdType::Sylvan, ValueType> InternalAdd<DdType::Sylvan, ValueType>::fromVector(InternalDdManager<DdType::Sylvan> const* ddManager, std::vector<ValueType> const& values, storm::dd::Odd const& odd, std::vector<uint_fast64_t> const& ddVariableIndices) { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template class InternalAdd<DdType::Sylvan, double>; | 
				
			|||
        template class InternalAdd<DdType::Sylvan, uint_fast64_t>; | 
				
			|||
    } | 
				
			|||
} | 
				
			|||
@ -0,0 +1,581 @@ | 
				
			|||
#ifndef STORM_STORAGE_DD_CUDD_INTERNALSYLVANADD_H_ | 
				
			|||
#define STORM_STORAGE_DD_CUDD_INTERNALSYLVANADD_H_ | 
				
			|||
 | 
				
			|||
#include <set> | 
				
			|||
#include <unordered_map> | 
				
			|||
 | 
				
			|||
#include "src/storage/dd/DdType.h" | 
				
			|||
#include "src/storage/dd/InternalAdd.h" | 
				
			|||
#include "src/storage/dd/Odd.h" | 
				
			|||
 | 
				
			|||
#include "src/storage/dd/sylvan/InternalSylvanBdd.h" | 
				
			|||
#include "src/storage/dd/sylvan/SylvanAddIterator.h" | 
				
			|||
 | 
				
			|||
#include "src/storage/expressions/Variable.h" | 
				
			|||
 | 
				
			|||
namespace storm { | 
				
			|||
    namespace storage { | 
				
			|||
        template<typename T> | 
				
			|||
        class SparseMatrix; | 
				
			|||
         | 
				
			|||
        class BitVector; | 
				
			|||
         | 
				
			|||
        template<typename E, typename V> | 
				
			|||
        class MatrixEntry; | 
				
			|||
    } | 
				
			|||
     | 
				
			|||
    namespace dd { | 
				
			|||
        template<DdType LibraryType> | 
				
			|||
        class DdManager; | 
				
			|||
         | 
				
			|||
        template<DdType LibraryType> | 
				
			|||
        class InternalDdManager; | 
				
			|||
         | 
				
			|||
        template<DdType LibraryType> | 
				
			|||
        class InternalBdd; | 
				
			|||
         | 
				
			|||
        template<DdType LibraryType, typename ValueType> | 
				
			|||
        class AddIterator; | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        class InternalAdd<DdType::Sylvan, ValueType> { | 
				
			|||
        public: | 
				
			|||
            // Instantiate all copy/move constructors/assignments with the default implementation. | 
				
			|||
            InternalAdd() = default; | 
				
			|||
            InternalAdd(InternalAdd<DdType::Sylvan, ValueType> const& other) = default; | 
				
			|||
            InternalAdd& operator=(InternalAdd<DdType::Sylvan, ValueType> const& other) = default; | 
				
			|||
            InternalAdd(InternalAdd<DdType::Sylvan, ValueType>&& other) = default; | 
				
			|||
            InternalAdd& operator=(InternalAdd<DdType::Sylvan, ValueType>&& other) = default; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Retrieves whether the two DDs represent the same function. | 
				
			|||
             * | 
				
			|||
             * @param other The DD that is to be compared with the current one. | 
				
			|||
             * @return True if the DDs represent the same function. | 
				
			|||
             */ | 
				
			|||
            bool operator==(InternalAdd<DdType::Sylvan, ValueType> const& other) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Retrieves whether the two DDs represent different functions. | 
				
			|||
             * | 
				
			|||
             * @param other The DD that is to be compared with the current one. | 
				
			|||
             * @return True if the DDs represent the different functions. | 
				
			|||
             */ | 
				
			|||
            bool operator!=(InternalAdd<DdType::Sylvan, ValueType> const& other) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Performs an if-then-else with the given operands, i.e. maps all valuations that are mapped to a non-zero | 
				
			|||
             * function value to the function values specified by the first DD and all others to the function values | 
				
			|||
             * specified by the second DD. | 
				
			|||
             * | 
				
			|||
             * @param thenDd The ADD specifying the 'then' part. | 
				
			|||
             * @param elseDd The ADD specifying the 'else' part. | 
				
			|||
             * @return The ADD corresponding to the if-then-else of the operands. | 
				
			|||
             */ | 
				
			|||
            InternalAdd<DdType::Sylvan, ValueType> ite(InternalAdd<DdType::Sylvan, ValueType> const& thenAdd, InternalAdd<DdType::Sylvan, ValueType> const& elseAdd) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Logically inverts the current ADD. That is, all inputs yielding non-zero values will be mapped to zero in | 
				
			|||
             * the result and vice versa. | 
				
			|||
             * | 
				
			|||
             * @return The resulting ADD. | 
				
			|||
             */ | 
				
			|||
            InternalAdd<DdType::Sylvan, ValueType> operator!() const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Performs a logical or of the current and the given ADD. As a prerequisite, the operand ADDs need to be | 
				
			|||
             * 0/1 ADDs. | 
				
			|||
             * | 
				
			|||
             * @param other The second ADD used for the operation. | 
				
			|||
             * @return The logical or of the operands. | 
				
			|||
             */ | 
				
			|||
            InternalAdd<DdType::Sylvan, ValueType> operator||(InternalAdd<DdType::Sylvan, ValueType> const& other) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Performs a logical or of the current and the given ADD and assigns it to the current ADD. As a | 
				
			|||
             * prerequisite, the operand ADDs need to be 0/1 ADDs. | 
				
			|||
             * | 
				
			|||
             * @param other The second ADD used for the operation. | 
				
			|||
             * @return A reference to the current ADD after the operation | 
				
			|||
             */ | 
				
			|||
            InternalAdd<DdType::Sylvan, ValueType>& operator|=(InternalAdd<DdType::Sylvan, ValueType> const& other); | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Adds the two ADDs. | 
				
			|||
             * | 
				
			|||
             * @param other The ADD to add to the current one. | 
				
			|||
             * @return The result of the addition. | 
				
			|||
             */ | 
				
			|||
            InternalAdd<DdType::Sylvan, ValueType> operator+(InternalAdd<DdType::Sylvan, ValueType> const& other) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Adds the given ADD to the current one. | 
				
			|||
             * | 
				
			|||
             * @param other The ADD to add to the current one. | 
				
			|||
             * @return A reference to the current ADD after the operation. | 
				
			|||
             */ | 
				
			|||
            InternalAdd<DdType::Sylvan, ValueType>& operator+=(InternalAdd<DdType::Sylvan, ValueType> const& other); | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Multiplies the two ADDs. | 
				
			|||
             * | 
				
			|||
             * @param other The ADD to multiply with the current one. | 
				
			|||
             * @return The result of the multiplication. | 
				
			|||
             */ | 
				
			|||
            InternalAdd<DdType::Sylvan, ValueType> operator*(InternalAdd<DdType::Sylvan, ValueType> const& other) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Multiplies the given ADD with the current one and assigns the result to the current ADD. | 
				
			|||
             * | 
				
			|||
             * @param other The ADD to multiply with the current one. | 
				
			|||
             * @return A reference to the current ADD after the operation. | 
				
			|||
             */ | 
				
			|||
            InternalAdd<DdType::Sylvan, ValueType>& operator*=(InternalAdd<DdType::Sylvan, ValueType> const& other); | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Subtracts the given ADD from the current one. | 
				
			|||
             * | 
				
			|||
             * @param other The ADD to subtract from the current one. | 
				
			|||
             * @return The result of the subtraction. | 
				
			|||
             */ | 
				
			|||
            InternalAdd<DdType::Sylvan, ValueType> operator-(InternalAdd<DdType::Sylvan, ValueType> const& other) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Subtracts the given ADD from the current one and assigns the result to the current ADD. | 
				
			|||
             * | 
				
			|||
             * @param other The ADD to subtract from the current one. | 
				
			|||
             * @return A reference to the current ADD after the operation. | 
				
			|||
             */ | 
				
			|||
            InternalAdd<DdType::Sylvan, ValueType>& operator-=(InternalAdd<DdType::Sylvan, ValueType> const& other); | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Divides the current ADD by the given one. | 
				
			|||
             * | 
				
			|||
             * @param other The ADD by which to divide the current one. | 
				
			|||
             * @return The result of the division. | 
				
			|||
             */ | 
				
			|||
            InternalAdd<DdType::Sylvan, ValueType> operator/(InternalAdd<DdType::Sylvan, ValueType> const& other) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Divides the current ADD by the given one and assigns the result to the current ADD. | 
				
			|||
             * | 
				
			|||
             * @param other The ADD by which to divide the current one. | 
				
			|||
             * @return A reference to the current ADD after the operation. | 
				
			|||
             */ | 
				
			|||
            InternalAdd<DdType::Sylvan, ValueType>& operator/=(InternalAdd<DdType::Sylvan, ValueType> const& other); | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Retrieves the function that maps all evaluations to one that have identical function values. | 
				
			|||
             * | 
				
			|||
             * @param other The ADD with which to perform the operation. | 
				
			|||
             * @return The resulting function represented as an ADD. | 
				
			|||
             */ | 
				
			|||
            InternalAdd<DdType::Sylvan, ValueType> equals(InternalAdd<DdType::Sylvan, ValueType> const& other) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Retrieves the function that maps all evaluations to one that have distinct function values. | 
				
			|||
             * | 
				
			|||
             * @param other The ADD with which to perform the operation. | 
				
			|||
             * @return The resulting function represented as an ADD. | 
				
			|||
             */ | 
				
			|||
            InternalAdd<DdType::Sylvan, ValueType> notEquals(InternalAdd<DdType::Sylvan, ValueType> const& other) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Retrieves the function that maps all evaluations to one whose function value in the first ADD are less | 
				
			|||
             * than the one in the given ADD. | 
				
			|||
             * | 
				
			|||
             * @param other The ADD with which to perform the operation. | 
				
			|||
             * @return The resulting function represented as an ADD. | 
				
			|||
             */ | 
				
			|||
            InternalAdd<DdType::Sylvan, ValueType> less(InternalAdd<DdType::Sylvan, ValueType> const& other) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Retrieves the function that maps all evaluations to one whose function value in the first ADD are less or | 
				
			|||
             * equal than the one in the given ADD. | 
				
			|||
             * | 
				
			|||
             * @param other The DD with which to perform the operation. | 
				
			|||
             * @return The resulting function represented as an ADD. | 
				
			|||
             */ | 
				
			|||
            InternalAdd<DdType::Sylvan, ValueType> lessOrEqual(InternalAdd<DdType::Sylvan, ValueType> const& other) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Retrieves the function that maps all evaluations to one whose function value in the first ADD are greater | 
				
			|||
             * than the one in the given ADD. | 
				
			|||
             * | 
				
			|||
             * @param other The ADD with which to perform the operation. | 
				
			|||
             * @return The resulting function represented as an ADD. | 
				
			|||
             */ | 
				
			|||
            InternalAdd<DdType::Sylvan, ValueType> greater(InternalAdd<DdType::Sylvan, ValueType> const& other) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Retrieves the function that maps all evaluations to one whose function value in the first ADD are greater | 
				
			|||
             * or equal than the one in the given ADD. | 
				
			|||
             * | 
				
			|||
             * @param other The ADD with which to perform the operation. | 
				
			|||
             * @return The resulting function represented as an ADD. | 
				
			|||
             */ | 
				
			|||
            InternalAdd<DdType::Sylvan, ValueType> greaterOrEqual(InternalAdd<DdType::Sylvan, ValueType> const& other) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Retrieves the function that represents the current ADD to the power of the given ADD. | 
				
			|||
             * | 
				
			|||
             * @other The exponent function (given as an ADD). | 
				
			|||
             * @retur The resulting ADD. | 
				
			|||
             */ | 
				
			|||
            InternalAdd<DdType::Sylvan, ValueType> pow(InternalAdd<DdType::Sylvan, ValueType> const& other) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Retrieves the function that represents the current ADD modulo the given ADD. | 
				
			|||
             * | 
				
			|||
             * @other The modul function (given as an ADD). | 
				
			|||
             * @retur The resulting ADD. | 
				
			|||
             */ | 
				
			|||
            InternalAdd<DdType::Sylvan, ValueType> mod(InternalAdd<DdType::Sylvan, ValueType> const& other) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Retrieves the function that represents the logarithm of the current ADD to the bases given by the second | 
				
			|||
             * ADD. | 
				
			|||
             * | 
				
			|||
             * @other The base function (given as an ADD). | 
				
			|||
             * @retur The resulting ADD. | 
				
			|||
             */ | 
				
			|||
            InternalAdd<DdType::Sylvan, ValueType> logxy(InternalAdd<DdType::Sylvan, ValueType> const& other) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Retrieves the function that floors all values in the current ADD. | 
				
			|||
             * | 
				
			|||
             * @retur The resulting ADD. | 
				
			|||
             */ | 
				
			|||
            InternalAdd<DdType::Sylvan, ValueType> floor() const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Retrieves the function that ceils all values in the current ADD. | 
				
			|||
             * | 
				
			|||
             * @retur The resulting ADD. | 
				
			|||
             */ | 
				
			|||
            InternalAdd<DdType::Sylvan, ValueType> ceil() const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Retrieves the function that maps all evaluations to the minimum of the function values of the two ADDs. | 
				
			|||
             * | 
				
			|||
             * @param other The ADD with which to perform the operation. | 
				
			|||
             * @return The resulting function represented as an ADD. | 
				
			|||
             */ | 
				
			|||
            InternalAdd<DdType::Sylvan, ValueType> minimum(InternalAdd<DdType::Sylvan, ValueType> const& other) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Retrieves the function that maps all evaluations to the maximum of the function values of the two ADDs. | 
				
			|||
             * | 
				
			|||
             * @param other The ADD with which to perform the operation. | 
				
			|||
             * @return The resulting function represented as an ADD. | 
				
			|||
             */ | 
				
			|||
            InternalAdd<DdType::Sylvan, ValueType> maximum(InternalAdd<DdType::Sylvan, ValueType> const& other) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Sum-abstracts from the given cube. | 
				
			|||
             * | 
				
			|||
             * @param cube The cube from which to abstract. | 
				
			|||
             */ | 
				
			|||
            InternalAdd<DdType::Sylvan, ValueType> sumAbstract(InternalBdd<DdType::Sylvan> const& cube) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Min-abstracts from the given cube. | 
				
			|||
             * | 
				
			|||
             * @param cube The cube from which to abstract. | 
				
			|||
             */ | 
				
			|||
            InternalAdd<DdType::Sylvan, ValueType> minAbstract(InternalBdd<DdType::Sylvan> const& cube) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Max-abstracts from the given cube. | 
				
			|||
             * | 
				
			|||
             * @param cube The cube from which to abstract. | 
				
			|||
             */ | 
				
			|||
            InternalAdd<DdType::Sylvan, ValueType> maxAbstract(InternalBdd<DdType::Sylvan> const& cube) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Checks whether the current and the given ADD represent the same function modulo some given precision. | 
				
			|||
             * | 
				
			|||
             * @param other The ADD with which to compare. | 
				
			|||
             * @param precision An upper bound on the maximal difference between any two function values that is to be | 
				
			|||
             * tolerated. | 
				
			|||
             * @param relative If set to true, not the absolute values have to be within the precision, but the relative | 
				
			|||
             * values. | 
				
			|||
             */ | 
				
			|||
            bool equalModuloPrecision(InternalAdd<DdType::Sylvan, ValueType> const& other, double precision, bool relative = true) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Swaps the given pairs of DD variables in the ADD. The pairs of meta variables have to be represented by | 
				
			|||
             * ADDs must have equal length. | 
				
			|||
             * | 
				
			|||
             * @param from The vector that specifies the 'from' part of the variable renaming. | 
				
			|||
             * @param to The vector that specifies the 'to' part of the variable renaming. | 
				
			|||
             * @return The resulting ADD. | 
				
			|||
             */ | 
				
			|||
            InternalAdd<DdType::Sylvan, ValueType> swapVariables(std::vector<InternalAdd<DdType::Sylvan, ValueType>> const& from, std::vector<InternalAdd<DdType::Sylvan, ValueType>> const& to) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Multiplies the current ADD (representing a matrix) with the given matrix by summing over the given meta | 
				
			|||
             * variables. | 
				
			|||
             * | 
				
			|||
             * @param otherMatrix The matrix with which to multiply. | 
				
			|||
             * @param summationDdVariables The DD variables (represented as ADDs) over which to sum. | 
				
			|||
             * @return An ADD representing the result of the matrix-matrix multiplication. | 
				
			|||
             */ | 
				
			|||
            InternalAdd<DdType::Sylvan, ValueType> multiplyMatrix(InternalAdd<DdType::Sylvan, ValueType> const& otherMatrix, std::vector<InternalAdd<DdType::Sylvan, ValueType>> const& summationDdVariables) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Computes a BDD that represents the function in which all assignments with a function value strictly | 
				
			|||
             * larger than the given value are mapped to one and all others to zero. | 
				
			|||
             * | 
				
			|||
             * @param value The value used for the comparison. | 
				
			|||
             * @return The resulting BDD. | 
				
			|||
             */ | 
				
			|||
            InternalBdd<DdType::Sylvan> greater(ValueType const& value) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Computes a BDD that represents the function in which all assignments with a function value larger or equal | 
				
			|||
             * to the given value are mapped to one and all others to zero. | 
				
			|||
             * | 
				
			|||
             * @param value The value used for the comparison. | 
				
			|||
             * @return The resulting BDD. | 
				
			|||
             */ | 
				
			|||
            InternalBdd<DdType::Sylvan> greaterOrEqual(ValueType const& value) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Computes a BDD that represents the function in which all assignments with a function value strictly | 
				
			|||
             * lower than the given value are mapped to one and all others to zero. | 
				
			|||
             * | 
				
			|||
             * @param value The value used for the comparison. | 
				
			|||
             * @return The resulting BDD. | 
				
			|||
             */ | 
				
			|||
            InternalBdd<DdType::Sylvan> less(ValueType const& value) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Computes a BDD that represents the function in which all assignments with a function value less or equal | 
				
			|||
             * to the given value are mapped to one and all others to zero. | 
				
			|||
             * | 
				
			|||
             * @param value The value used for the comparison. | 
				
			|||
             * @return The resulting BDD. | 
				
			|||
             */ | 
				
			|||
            InternalBdd<DdType::Sylvan> lessOrEqual(ValueType const& value) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Computes a BDD that represents the function in which all assignments with a function value unequal to | 
				
			|||
             * zero are mapped to one and all others to zero. | 
				
			|||
             * | 
				
			|||
             * @return The resulting DD. | 
				
			|||
             */ | 
				
			|||
            InternalBdd<DdType::Sylvan> notZero() const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Computes the constraint of the current ADD with the given constraint. That is, the function value of the | 
				
			|||
             * resulting ADD will be the same as the current ones for all assignments mapping to one in the constraint | 
				
			|||
             * and may be different otherwise. | 
				
			|||
             * | 
				
			|||
             * @param constraint The constraint to use for the operation. | 
				
			|||
             * @return The resulting ADD. | 
				
			|||
             */ | 
				
			|||
            InternalAdd<DdType::Sylvan, ValueType> constrain(InternalAdd<DdType::Sylvan, ValueType> const& constraint) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Computes the restriction of the current ADD with the given constraint. That is, the function value of the | 
				
			|||
             * resulting DD will be the same as the current ones for all assignments mapping to one in the constraint | 
				
			|||
             * and may be different otherwise. | 
				
			|||
             * | 
				
			|||
             * @param constraint The constraint to use for the operation. | 
				
			|||
             * @return The resulting ADD. | 
				
			|||
             */ | 
				
			|||
            InternalAdd<DdType::Sylvan, ValueType> restrict(InternalAdd<DdType::Sylvan, ValueType> const& constraint) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Retrieves the support of the current ADD. | 
				
			|||
             * | 
				
			|||
             * @return The support represented as a BDD. | 
				
			|||
             */ | 
				
			|||
            InternalBdd<DdType::Sylvan> getSupport() const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Retrieves the number of encodings that are mapped to a non-zero value. | 
				
			|||
             * | 
				
			|||
             * @param The number of DD variables contained in this ADD. | 
				
			|||
             * @return The number of encodings that are mapped to a non-zero value. | 
				
			|||
             */ | 
				
			|||
            virtual uint_fast64_t getNonZeroCount(uint_fast64_t numberOfDdVariables) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Retrieves the number of leaves of the ADD. | 
				
			|||
             * | 
				
			|||
             * @return The number of leaves of the ADD. | 
				
			|||
             */ | 
				
			|||
            virtual uint_fast64_t getLeafCount() const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Retrieves the number of nodes necessary to represent the DD. | 
				
			|||
             * | 
				
			|||
             * @return The number of nodes in this DD. | 
				
			|||
             */ | 
				
			|||
            virtual uint_fast64_t getNodeCount() const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Retrieves the lowest function value of any encoding. | 
				
			|||
             * | 
				
			|||
             * @return The lowest function value of any encoding. | 
				
			|||
             */ | 
				
			|||
            ValueType getMin() const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Retrieves the highest function value of any encoding. | 
				
			|||
             * | 
				
			|||
             * @return The highest function value of any encoding. | 
				
			|||
             */ | 
				
			|||
            ValueType getMax() const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Converts the ADD to a BDD by mapping all values unequal to zero to 1. This effectively does the same as | 
				
			|||
             * a call to notZero(). | 
				
			|||
             * | 
				
			|||
             * @return The corresponding BDD. | 
				
			|||
             */ | 
				
			|||
            InternalBdd<DdType::Sylvan> toBdd() const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Retrieves whether this ADD represents the constant one function. | 
				
			|||
             * | 
				
			|||
             * @return True if this ADD represents the constant one function. | 
				
			|||
             */ | 
				
			|||
            bool isOne() const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Retrieves whether this ADD represents the constant zero function. | 
				
			|||
             * | 
				
			|||
             * @return True if this ADD represents the constant zero function. | 
				
			|||
             */ | 
				
			|||
            bool isZero() const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Retrieves whether this ADD represents a constant function. | 
				
			|||
             * | 
				
			|||
             * @return True if this ADD represents a constants function. | 
				
			|||
             */ | 
				
			|||
            bool isConstant() const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Retrieves the index of the topmost variable in the DD. | 
				
			|||
             * | 
				
			|||
             * @return The index of the topmost variable in DD. | 
				
			|||
             */ | 
				
			|||
            virtual uint_fast64_t getIndex() const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Exports the DD to the given file in the dot format. | 
				
			|||
             * | 
				
			|||
             * @param filename The name of the file to which the DD is to be exported. | 
				
			|||
             * @param ddVariableNamesAsString The names of the DD variables to display in the dot file. | 
				
			|||
             */ | 
				
			|||
            void exportToDot(std::string const& filename, std::vector<std::string> const& ddVariableNamesAsStrings) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Retrieves an iterator that points to the first meta variable assignment with a non-zero function value. | 
				
			|||
             * | 
				
			|||
             * @param fullDdManager The DD manager responsible for this ADD. | 
				
			|||
             * @param metaVariables The meta variables contained in the ADD. | 
				
			|||
             * @param enumerateDontCareMetaVariables If set to true, all meta variable assignments are enumerated, even | 
				
			|||
             * if a meta variable does not at all influence the the function value. | 
				
			|||
             * @return An iterator that points to the first meta variable assignment with a non-zero function value. | 
				
			|||
             */ | 
				
			|||
            AddIterator<DdType::Sylvan, ValueType> begin(std::shared_ptr<DdManager<DdType::Sylvan> const> fullDdManager, std::set<storm::expressions::Variable> const& metaVariables, bool enumerateDontCareMetaVariables = true) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Retrieves an iterator that points past the end of the container. | 
				
			|||
             * | 
				
			|||
             * @param fullDdManager The DD manager responsible for this ADD. | 
				
			|||
             * @param enumerateDontCareMetaVariables If set to true, all meta variable assignments are enumerated, even | 
				
			|||
             * if a meta variable does not at all influence the the function value. | 
				
			|||
             * @return An iterator that points past the end of the container. | 
				
			|||
             */ | 
				
			|||
            AddIterator<DdType::Sylvan, ValueType> end(std::shared_ptr<DdManager<DdType::Sylvan> const> fullDdManager, bool enumerateDontCareMetaVariables = true) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Composes the ADD with an explicit vector by performing a specified function between the entries of this | 
				
			|||
             * ADD and the explicit vector. | 
				
			|||
             * | 
				
			|||
             * @param odd The ODD to use for the translation from symbolic to explicit positions. | 
				
			|||
             * @param ddVariableIndices The indices of the DD variables present in this ADD. | 
				
			|||
             * @param targetVector The explicit vector that is to be composed with the ADD. The results are written to | 
				
			|||
             * this vector again. | 
				
			|||
             * @param function The function to perform in the composition. | 
				
			|||
             */ | 
				
			|||
            void composeWithExplicitVector(Odd const& odd, std::vector<uint_fast64_t> const& ddVariableIndices, std::vector<ValueType>& targetVector, std::function<ValueType (ValueType const&, ValueType const&)> const& function) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Composes the (row-grouped) ADD with an explicit vector by performing a specified function between the | 
				
			|||
             * entries of this ADD and the explicit vector. | 
				
			|||
             * | 
				
			|||
             * @param odd The ODD to use for the translation from symbolic to explicit positions. | 
				
			|||
             * @param ddVariableIndices The indices of the DD variables present in this ADD. | 
				
			|||
             * @param offsets The offsets | 
				
			|||
             * @param targetVector The explicit vector that is to be composed with the ADD. The results are written to | 
				
			|||
             * this vector again. | 
				
			|||
             * @param function The function to perform in the composition. | 
				
			|||
             */ | 
				
			|||
            void composeWithExplicitVector(Odd const& odd, std::vector<uint_fast64_t> const& ddVariableIndices, std::vector<uint_fast64_t> const& offsets, std::vector<ValueType>& targetVector, std::function<ValueType (ValueType const&, ValueType const&)> const& function) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Splits the ADD into several ADDs that differ in the encoding of the given group variables (given via indices). | 
				
			|||
             * | 
				
			|||
             * @param ddGroupVariableIndices The indices of the variables that are used to distinguish the groups. | 
				
			|||
             * @return A vector of ADDs that are the separate groups (wrt. to the encoding of the given variables). | 
				
			|||
             */ | 
				
			|||
            std::vector<InternalAdd<DdType::Sylvan, ValueType>> splitIntoGroups(std::vector<uint_fast64_t> const& ddGroupVariableIndices) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Simultaneously splits the ADD and the given vector ADD into several ADDs that differ in the encoding of | 
				
			|||
             * the given group variables (given via indices). | 
				
			|||
             * | 
				
			|||
             * @param vector The vector to split (in addition to the current ADD). | 
				
			|||
             * @param ddGroupVariableIndices The indices of the variables that are used to distinguish the groups. | 
				
			|||
             * @return A vector of pairs of ADDs that are the separate groups of the current ADD and the vector, | 
				
			|||
             * respectively (wrt. to the encoding of the given variables). | 
				
			|||
             */ | 
				
			|||
            std::vector<std::pair<InternalAdd<DdType::Sylvan, ValueType>, InternalAdd<DdType::Sylvan, ValueType>>> splitIntoGroups(InternalAdd<DdType::Sylvan, ValueType> vector, std::vector<uint_fast64_t> const& ddGroupVariableIndices) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Translates the ADD into the components needed for constructing a matrix. | 
				
			|||
             * | 
				
			|||
             * @param rowGroupIndices The row group indices. | 
				
			|||
             * @param rowIndications The vector that is to be filled with the row indications. | 
				
			|||
             * @param columnsAndValues The vector that is to be filled with the non-zero entries of the matrix. | 
				
			|||
             * @param rowOdd The ODD used for translating the rows. | 
				
			|||
             * @param columnOdd The ODD used for translating the columns. | 
				
			|||
             * @param ddRowVariableIndices The variable indices of the row variables. | 
				
			|||
             * @param ddColumnVariableIndices The variable indices of the column variables. | 
				
			|||
             * @param writeValues A flag that indicates whether or not to write to the entry vector. If this is not set, | 
				
			|||
             * only the row indications are modified. | 
				
			|||
             */ | 
				
			|||
            void toMatrixComponents(std::vector<uint_fast64_t> const& rowGroupIndices, std::vector<uint_fast64_t>& rowIndications, std::vector<storm::storage::MatrixEntry<uint_fast64_t, ValueType>>& columnsAndValues, Odd const& rowOdd, Odd const& columnOdd, std::vector<uint_fast64_t> const& ddRowVariableIndices, std::vector<uint_fast64_t> const& ddColumnVariableIndices, bool writeValues) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Creates an ADD from the given explicit vector. | 
				
			|||
             * | 
				
			|||
             * @param ddManager The manager to use to built the ADD. | 
				
			|||
             * @param values The explicit vector to encode. | 
				
			|||
             * @param odd The ODD to use for the translation. | 
				
			|||
             * @param ddVariableIndices The indices of the variables to use in the ADD. | 
				
			|||
             */ | 
				
			|||
            static InternalAdd<DdType::Sylvan, ValueType> fromVector(InternalDdManager<DdType::Sylvan> const* ddManager, std::vector<ValueType> const& values, storm::dd::Odd const& odd, std::vector<uint_fast64_t> const& ddVariableIndices); | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Creates an ODD based on the current ADD. | 
				
			|||
             * | 
				
			|||
             * @return The corresponding ODD. | 
				
			|||
             */ | 
				
			|||
            Odd createOdd(std::vector<uint_fast64_t> const& ddVariableIndices) const; | 
				
			|||
             | 
				
			|||
        private: | 
				
			|||
            InternalDdManager<DdType::Sylvan> const* ddManager; | 
				
			|||
             | 
				
			|||
        }; | 
				
			|||
    } | 
				
			|||
} | 
				
			|||
 | 
				
			|||
#endif /* STORM_STORAGE_DD_CUDD_INTERNALSYLVANADD_H_ */ | 
				
			|||
@ -0,0 +1,150 @@ | 
				
			|||
#include "src/storage/dd/sylvan/InternalSylvanBdd.h"
 | 
				
			|||
 | 
				
			|||
#include "src/storage/dd/sylvan/InternalSylvanAdd.h"
 | 
				
			|||
#include "src/storage/dd/sylvan/SylvanAddIterator.h"
 | 
				
			|||
#
 | 
				
			|||
 | 
				
			|||
#include "src/storage/BitVector.h"
 | 
				
			|||
 | 
				
			|||
#include "src/utility/macros.h"
 | 
				
			|||
#include "src/exceptions/NotImplementedException.h"
 | 
				
			|||
 | 
				
			|||
namespace storm { | 
				
			|||
    namespace dd { | 
				
			|||
        template<typename ValueType> | 
				
			|||
        InternalBdd<DdType::Sylvan> InternalBdd<DdType::Sylvan>::fromVector(InternalDdManager<DdType::Sylvan> const* ddManager, std::vector<ValueType> const& values, Odd const& odd, std::vector<uint_fast64_t> const& sortedDdVariableIndices, std::function<bool (ValueType const&)> const& filter) { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        bool InternalBdd<DdType::Sylvan>::operator==(InternalBdd<DdType::Sylvan> const& other) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        bool InternalBdd<DdType::Sylvan>::operator!=(InternalBdd<DdType::Sylvan> const& other) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        InternalBdd<DdType::Sylvan> InternalBdd<DdType::Sylvan>::ite(InternalBdd<DdType::Sylvan> const& thenDd, InternalBdd<DdType::Sylvan> const& elseDd) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        InternalBdd<DdType::Sylvan> InternalBdd<DdType::Sylvan>::operator||(InternalBdd<DdType::Sylvan> const& other) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        InternalBdd<DdType::Sylvan>& InternalBdd<DdType::Sylvan>::operator|=(InternalBdd<DdType::Sylvan> const& other) { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        InternalBdd<DdType::Sylvan> InternalBdd<DdType::Sylvan>::operator&&(InternalBdd<DdType::Sylvan> const& other) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        InternalBdd<DdType::Sylvan>& InternalBdd<DdType::Sylvan>::operator&=(InternalBdd<DdType::Sylvan> const& other) { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        InternalBdd<DdType::Sylvan> InternalBdd<DdType::Sylvan>::iff(InternalBdd<DdType::Sylvan> const& other) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        InternalBdd<DdType::Sylvan> InternalBdd<DdType::Sylvan>::exclusiveOr(InternalBdd<DdType::Sylvan> const& other) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        InternalBdd<DdType::Sylvan> InternalBdd<DdType::Sylvan>::implies(InternalBdd<DdType::Sylvan> const& other) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        InternalBdd<DdType::Sylvan> InternalBdd<DdType::Sylvan>::operator!() const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        InternalBdd<DdType::Sylvan>& InternalBdd<DdType::Sylvan>::complement() { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        InternalBdd<DdType::Sylvan> InternalBdd<DdType::Sylvan>::existsAbstract(InternalBdd<DdType::Sylvan> const& cube) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        InternalBdd<DdType::Sylvan> InternalBdd<DdType::Sylvan>::universalAbstract(InternalBdd<DdType::Sylvan> const& cube) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        InternalBdd<DdType::Sylvan> InternalBdd<DdType::Sylvan>::andExists(InternalBdd<DdType::Sylvan> const& other, InternalBdd<DdType::Sylvan> const& cube) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        InternalBdd<DdType::Sylvan> InternalBdd<DdType::Sylvan>::constrain(InternalBdd<DdType::Sylvan> const& constraint) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        InternalBdd<DdType::Sylvan> InternalBdd<DdType::Sylvan>::restrict(InternalBdd<DdType::Sylvan> const& constraint) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        InternalBdd<DdType::Sylvan> InternalBdd<DdType::Sylvan>::swapVariables(std::vector<InternalBdd<DdType::Sylvan>> const& from, std::vector<InternalBdd<DdType::Sylvan>> const& to) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        InternalBdd<DdType::Sylvan> InternalBdd<DdType::Sylvan>::getSupport() const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        uint_fast64_t InternalBdd<DdType::Sylvan>::getNonZeroCount(uint_fast64_t numberOfDdVariables) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        uint_fast64_t InternalBdd<DdType::Sylvan>::getLeafCount() const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        uint_fast64_t InternalBdd<DdType::Sylvan>::getNodeCount() const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        bool InternalBdd<DdType::Sylvan>::isOne() const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        bool InternalBdd<DdType::Sylvan>::isZero() const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        uint_fast64_t InternalBdd<DdType::Sylvan>::getIndex() const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        void InternalBdd<DdType::Sylvan>::exportToDot(std::string const& filename, std::vector<std::string> const& ddVariableNamesAsStrings) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        InternalAdd<DdType::Sylvan, ValueType> InternalBdd<DdType::Sylvan>::toAdd() const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        storm::storage::BitVector InternalBdd<DdType::Sylvan>::toVector(storm::dd::Odd const& rowOdd, std::vector<uint_fast64_t> const& ddVariableIndices) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        Odd InternalBdd<DdType::Sylvan>::createOdd(std::vector<uint_fast64_t> const& ddVariableIndices) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        void InternalBdd<DdType::Sylvan>::filterExplicitVector(Odd const& odd, std::vector<uint_fast64_t> const& ddVariableIndices, std::vector<ValueType> const& sourceValues, std::vector<ValueType>& targetValues) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template InternalBdd<DdType::Sylvan> InternalBdd<DdType::Sylvan>::fromVector(InternalDdManager<DdType::Sylvan> const* ddManager, std::vector<double> const& values, Odd const& odd, std::vector<uint_fast64_t> const& sortedDdVariableIndices, std::function<bool (double const&)> const& filter); | 
				
			|||
        template InternalBdd<DdType::Sylvan> InternalBdd<DdType::Sylvan>::fromVector(InternalDdManager<DdType::Sylvan> const* ddManager, std::vector<uint_fast64_t> const& values, Odd const& odd, std::vector<uint_fast64_t> const& sortedDdVariableIndices, std::function<bool (uint_fast64_t const&)> const& filter); | 
				
			|||
         | 
				
			|||
        template InternalAdd<DdType::Sylvan, double> InternalBdd<DdType::Sylvan>::toAdd() const; | 
				
			|||
        template InternalAdd<DdType::Sylvan, uint_fast64_t> InternalBdd<DdType::Sylvan>::toAdd() const; | 
				
			|||
                 | 
				
			|||
        template void InternalBdd<DdType::Sylvan>::filterExplicitVector(Odd const& odd, std::vector<uint_fast64_t> const& ddVariableIndices, std::vector<double> const& sourceValues, std::vector<double>& targetValues) const; | 
				
			|||
        template void InternalBdd<DdType::Sylvan>::filterExplicitVector(Odd const& odd, std::vector<uint_fast64_t> const& ddVariableIndices, std::vector<uint_fast64_t> const& sourceValues, std::vector<uint_fast64_t>& targetValues) const; | 
				
			|||
    } | 
				
			|||
} | 
				
			|||
@ -0,0 +1,301 @@ | 
				
			|||
#ifndef STORM_STORAGE_DD_CUDD_INTERNALSYLVANBDD_H_ | 
				
			|||
#define STORM_STORAGE_DD_CUDD_INTERNALSYLVANBDD_H_ | 
				
			|||
 | 
				
			|||
#include <vector> | 
				
			|||
#include <functional> | 
				
			|||
 | 
				
			|||
#include "src/storage/dd/DdType.h" | 
				
			|||
#include "src/storage/dd/InternalBdd.h" | 
				
			|||
#include "src/storage/dd/InternalAdd.h" | 
				
			|||
 | 
				
			|||
namespace storm { | 
				
			|||
    namespace storage { | 
				
			|||
        class BitVector; | 
				
			|||
    } | 
				
			|||
     | 
				
			|||
    namespace dd { | 
				
			|||
        template<DdType LibraryType> | 
				
			|||
        class InternalDdManager; | 
				
			|||
         | 
				
			|||
        template<DdType LibraryType, typename ValueType> | 
				
			|||
        class InternalAdd; | 
				
			|||
         | 
				
			|||
        class Odd; | 
				
			|||
         | 
				
			|||
        template<> | 
				
			|||
        class InternalBdd<DdType::Sylvan> { | 
				
			|||
        public: | 
				
			|||
            friend class InternalAdd<DdType::Sylvan, double>; | 
				
			|||
             | 
				
			|||
            // Instantiate all copy/move constructors/assignments with the default implementation. | 
				
			|||
            InternalBdd() = default; | 
				
			|||
            InternalBdd(InternalBdd<DdType::Sylvan> const& other) = default; | 
				
			|||
            InternalBdd& operator=(InternalBdd<DdType::Sylvan> const& other) = default; | 
				
			|||
            InternalBdd(InternalBdd<DdType::Sylvan>&& other) = default; | 
				
			|||
            InternalBdd& operator=(InternalBdd<DdType::Sylvan>&& other) = default; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Builds a BDD representing the values that make the given filter function evaluate to true. | 
				
			|||
             * | 
				
			|||
             * @param ddManager The manager responsible for the BDD. | 
				
			|||
             * @param values The values that are to be checked against the filter function. | 
				
			|||
             * @param odd The ODD used for the translation. | 
				
			|||
             * @param metaVariables The meta variables used for the translation. | 
				
			|||
             * @param filter The filter that evaluates whether an encoding is to be mapped to 0 or 1. | 
				
			|||
             * @return The resulting BDD. | 
				
			|||
             */ | 
				
			|||
            template<typename ValueType> | 
				
			|||
            static InternalBdd<storm::dd::DdType::Sylvan> fromVector(InternalDdManager<DdType::Sylvan> const* ddManager, std::vector<ValueType> const& values, Odd const& odd, std::vector<uint_fast64_t> const& sortedDdVariableIndices, std::function<bool (ValueType const&)> const& filter); | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Retrieves whether the two BDDs represent the same function. | 
				
			|||
             * | 
				
			|||
             * @param other The BDD that is to be compared with the current one. | 
				
			|||
             * @return True if the BDDs represent the same function. | 
				
			|||
             */ | 
				
			|||
            bool operator==(InternalBdd<DdType::Sylvan> const& other) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Retrieves whether the two BDDs represent different functions. | 
				
			|||
             * | 
				
			|||
             * @param other The BDD that is to be compared with the current one. | 
				
			|||
             * @return True if the BDDs represent the different functions. | 
				
			|||
             */ | 
				
			|||
            bool operator!=(InternalBdd<DdType::Sylvan> const& other) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Performs an if-then-else with the given operands, i.e. maps all valuations that are mapped to a non-zero | 
				
			|||
             * function value to the function values specified by the first DD and all others to the function values | 
				
			|||
             * specified by the second DD. | 
				
			|||
             * | 
				
			|||
             * @param thenBdd The BDD defining the 'then' part. | 
				
			|||
             * @param elseBdd The BDD defining the 'else' part. | 
				
			|||
             * @return The resulting BDD. | 
				
			|||
             */ | 
				
			|||
            InternalBdd<DdType::Sylvan> ite(InternalBdd<DdType::Sylvan> const& thenBdd, InternalBdd<DdType::Sylvan> const& elseBdd) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Performs a logical or of the current and the given BDD. | 
				
			|||
             * | 
				
			|||
             * @param other The second BDD used for the operation. | 
				
			|||
             * @return The logical or of the operands. | 
				
			|||
             */ | 
				
			|||
            InternalBdd<DdType::Sylvan> operator||(InternalBdd<DdType::Sylvan> const& other) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Performs a logical or of the current and the given BDD and assigns it to the current BDD. | 
				
			|||
             * | 
				
			|||
             * @param other The second BDD used for the operation. | 
				
			|||
             * @return A reference to the current BDD after the operation | 
				
			|||
             */ | 
				
			|||
            InternalBdd<DdType::Sylvan>& operator|=(InternalBdd<DdType::Sylvan> const& other); | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Performs a logical and of the current and the given BDD. | 
				
			|||
             * | 
				
			|||
             * @param other The second BDD used for the operation. | 
				
			|||
             * @return The logical and of the operands. | 
				
			|||
             */ | 
				
			|||
            InternalBdd<DdType::Sylvan> operator&&(InternalBdd<DdType::Sylvan> const& other) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Performs a logical and of the current and the given BDD and assigns it to the current BDD. | 
				
			|||
             * | 
				
			|||
             * @param other The second BDD used for the operation. | 
				
			|||
             * @return A reference to the current BDD after the operation | 
				
			|||
             */ | 
				
			|||
            InternalBdd<DdType::Sylvan>& operator&=(InternalBdd<DdType::Sylvan> const& other); | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Performs a logical iff of the current and the given BDD. | 
				
			|||
             * | 
				
			|||
             * @param other The second BDD used for the operation. | 
				
			|||
             * @return The logical iff of the operands. | 
				
			|||
             */ | 
				
			|||
            InternalBdd<DdType::Sylvan> iff(InternalBdd<DdType::Sylvan> const& other) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Performs a logical exclusive-or of the current and the given BDD. | 
				
			|||
             * | 
				
			|||
             * @param other The second BDD used for the operation. | 
				
			|||
             * @return The logical exclusive-or of the operands. | 
				
			|||
             */ | 
				
			|||
            InternalBdd<DdType::Sylvan> exclusiveOr(InternalBdd<DdType::Sylvan> const& other) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Performs a logical implication of the current and the given BDD. | 
				
			|||
             * | 
				
			|||
             * @param other The second BDD used for the operation. | 
				
			|||
             * @return The logical implication of the operands. | 
				
			|||
             */ | 
				
			|||
            InternalBdd<DdType::Sylvan> implies(InternalBdd<DdType::Sylvan> const& other) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Logically inverts the current BDD. | 
				
			|||
             * | 
				
			|||
             * @return The resulting BDD. | 
				
			|||
             */ | 
				
			|||
            InternalBdd<DdType::Sylvan> operator!() const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Logically complements the current BDD. | 
				
			|||
             * | 
				
			|||
             * @return A reference to the current BDD after the operation. | 
				
			|||
             */ | 
				
			|||
            InternalBdd<DdType::Sylvan>& complement(); | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Existentially abstracts from the given cube. | 
				
			|||
             * | 
				
			|||
             * @param cube The cube from which to abstract. | 
				
			|||
             */ | 
				
			|||
            InternalBdd<DdType::Sylvan> existsAbstract(InternalBdd<DdType::Sylvan> const& cube) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Universally abstracts from the given cube. | 
				
			|||
             * | 
				
			|||
             * @param cube The cube from which to abstract. | 
				
			|||
             */ | 
				
			|||
            InternalBdd<DdType::Sylvan> universalAbstract(InternalBdd<DdType::Sylvan> const& cube) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Swaps the given pairs of DD variables in the BDD. The pairs of meta variables have to be represented by | 
				
			|||
             * BDDs must have equal length. | 
				
			|||
             * | 
				
			|||
             * @param from The vector that specifies the 'from' part of the variable renaming. | 
				
			|||
             * @param to The vector that specifies the 'to' part of the variable renaming. | 
				
			|||
             * @return The resulting BDD. | 
				
			|||
             */ | 
				
			|||
            InternalBdd<DdType::Sylvan> swapVariables(std::vector<InternalBdd<DdType::Sylvan>> const& from, std::vector<InternalBdd<DdType::Sylvan>> const& to) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Computes the logical and of the current and the given BDD and existentially abstracts from the given cube. | 
				
			|||
             * | 
				
			|||
             * @param other The second BDD for the logical and. | 
				
			|||
             * @param cube The cube to existentially abstract. | 
				
			|||
             * @return A BDD representing the result. | 
				
			|||
             */ | 
				
			|||
            InternalBdd<DdType::Sylvan> andExists(InternalBdd<DdType::Sylvan> const& other, InternalBdd<storm::dd::DdType::Sylvan> const& cube) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Computes the constraint of the current BDD with the given constraint. That is, the function value of the | 
				
			|||
             * resulting BDD will be the same as the current ones for all assignments mapping to one in the constraint | 
				
			|||
             * and may be different otherwise. | 
				
			|||
             * | 
				
			|||
             * @param constraint The constraint to use for the operation. | 
				
			|||
             * @return The resulting BDD. | 
				
			|||
             */ | 
				
			|||
            InternalBdd<DdType::Sylvan> constrain(InternalBdd<DdType::Sylvan> const& constraint) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Computes the restriction of the current BDD with the given constraint. That is, the function value of the | 
				
			|||
             * resulting DD will be the same as the current ones for all assignments mapping to one in the constraint | 
				
			|||
             * and may be different otherwise. | 
				
			|||
             * | 
				
			|||
             * @param constraint The constraint to use for the operation. | 
				
			|||
             * @return The resulting BDD. | 
				
			|||
             */ | 
				
			|||
            InternalBdd<DdType::Sylvan> restrict(InternalBdd<DdType::Sylvan> const& constraint) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Retrieves the support of the current BDD. | 
				
			|||
             * | 
				
			|||
             * @return The support represented as a BDD. | 
				
			|||
             */ | 
				
			|||
            InternalBdd<DdType::Sylvan> getSupport() const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Retrieves the number of encodings that are mapped to a non-zero value. | 
				
			|||
             * | 
				
			|||
             * @param The number of DD variables contained in this BDD. | 
				
			|||
             * @return The number of encodings that are mapped to a non-zero value. | 
				
			|||
             */ | 
				
			|||
            uint_fast64_t getNonZeroCount(uint_fast64_t numberOfDdVariables) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Retrieves the number of leaves of the DD. | 
				
			|||
             * | 
				
			|||
             * @return The number of leaves of the DD. | 
				
			|||
             */ | 
				
			|||
            uint_fast64_t getLeafCount() const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Retrieves the number of nodes necessary to represent the DD. | 
				
			|||
             * | 
				
			|||
             * @return The number of nodes in this DD. | 
				
			|||
             */ | 
				
			|||
            uint_fast64_t getNodeCount() const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Retrieves whether this DD represents the constant one function. | 
				
			|||
             * | 
				
			|||
             * @return True if this DD represents the constant one function. | 
				
			|||
             */ | 
				
			|||
            bool isOne() const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Retrieves whether this DD represents the constant zero function. | 
				
			|||
             * | 
				
			|||
             * @return True if this DD represents the constant zero function. | 
				
			|||
             */ | 
				
			|||
            bool isZero() const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Retrieves the index of the topmost variable in the BDD. | 
				
			|||
             * | 
				
			|||
             * @return The index of the topmost variable in BDD. | 
				
			|||
             */ | 
				
			|||
            uint_fast64_t getIndex() const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Exports the BDD to the given file in the dot format. | 
				
			|||
             * | 
				
			|||
             * @param filename The name of the file to which the BDD is to be exported. | 
				
			|||
             * @param ddVariableNamesAsStrings The names of the variables to display in the dot file. | 
				
			|||
             */ | 
				
			|||
            void exportToDot(std::string const& filename, std::vector<std::string> const& ddVariableNamesAsStrings) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Converts a BDD to an equivalent ADD. | 
				
			|||
             * | 
				
			|||
             * @return The corresponding ADD. | 
				
			|||
             */ | 
				
			|||
            template<typename ValueType> | 
				
			|||
            InternalAdd<DdType::Sylvan, ValueType> toAdd() const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Converts the BDD to a bit vector. The given offset-labeled DD is used to determine the correct row of | 
				
			|||
             * each entry. | 
				
			|||
             * | 
				
			|||
             * @param rowOdd The ODD used for determining the correct row. | 
				
			|||
             * @param ddVariableIndices The indices of the DD variables contained in this BDD. | 
				
			|||
             * @return The bit vector that is represented by this BDD. | 
				
			|||
             */ | 
				
			|||
            storm::storage::BitVector toVector(storm::dd::Odd const& rowOdd, std::vector<uint_fast64_t> const& ddVariableIndices) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Creates an ODD based on the current BDD. | 
				
			|||
             * | 
				
			|||
             * @param ddVariableIndices The indices of the DD variables contained in this BDD. | 
				
			|||
             * @return The corresponding ODD. | 
				
			|||
             */ | 
				
			|||
            Odd createOdd(std::vector<uint_fast64_t> const& ddVariableIndices) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Uses the current BDD to filter values from the explicit vector. | 
				
			|||
             * | 
				
			|||
             * @param odd The ODD used to determine which entries to select. | 
				
			|||
             * @param ddVariableIndices The indices of the DD variables contained in this BDD. | 
				
			|||
             * @param sourceValues The source vector. | 
				
			|||
             * @param targetValues The vector to which to write the selected values. | 
				
			|||
             */ | 
				
			|||
            template<typename ValueType> | 
				
			|||
            void filterExplicitVector(Odd const& odd, std::vector<uint_fast64_t> const& ddVariableIndices, std::vector<ValueType> const& sourceValues, std::vector<ValueType>& targetValues) const; | 
				
			|||
             | 
				
			|||
        private: | 
				
			|||
            InternalDdManager<DdType::Sylvan> const* ddManager; | 
				
			|||
        }; | 
				
			|||
    } | 
				
			|||
} | 
				
			|||
 | 
				
			|||
#endif /* STORM_STORAGE_DD_CUDD_INTERNALSYLVANBDD_H_ */ | 
				
			|||
@ -0,0 +1,61 @@ | 
				
			|||
#include "src/storage/dd/sylvan/InternalSylvanDdManager.h"
 | 
				
			|||
 | 
				
			|||
#include "src/utility/macros.h"
 | 
				
			|||
#include "src/exceptions/NotImplementedException.h"
 | 
				
			|||
 | 
				
			|||
namespace storm { | 
				
			|||
    namespace dd { | 
				
			|||
         | 
				
			|||
        InternalDdManager<DdType::Sylvan>::InternalDdManager() { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        InternalBdd<DdType::Sylvan> InternalDdManager<DdType::Sylvan>::getBddOne() const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        InternalAdd<DdType::Sylvan, ValueType> InternalDdManager<DdType::Sylvan>::getAddOne() const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        InternalBdd<DdType::Sylvan> InternalDdManager<DdType::Sylvan>::getBddZero() const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        InternalAdd<DdType::Sylvan, ValueType> InternalDdManager<DdType::Sylvan>::getAddZero() const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        InternalAdd<DdType::Sylvan, ValueType> InternalDdManager<DdType::Sylvan>::getConstant(ValueType const& value) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        std::pair<InternalBdd<DdType::Sylvan>, InternalBdd<DdType::Sylvan>> InternalDdManager<DdType::Sylvan>::createNewDdVariablePair() { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        void InternalDdManager<DdType::Sylvan>::allowDynamicReordering(bool value) { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        bool InternalDdManager<DdType::Sylvan>::isDynamicReorderingAllowed() const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        void InternalDdManager<DdType::Sylvan>::triggerReordering() { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
                 | 
				
			|||
        template InternalAdd<DdType::Sylvan, double> InternalDdManager<DdType::Sylvan>::getAddOne() const; | 
				
			|||
        template InternalAdd<DdType::Sylvan, uint_fast64_t> InternalDdManager<DdType::Sylvan>::getAddOne() const; | 
				
			|||
         | 
				
			|||
        template InternalAdd<DdType::Sylvan, double> InternalDdManager<DdType::Sylvan>::getAddZero() const; | 
				
			|||
        template InternalAdd<DdType::Sylvan, uint_fast64_t> InternalDdManager<DdType::Sylvan>::getAddZero() const; | 
				
			|||
         | 
				
			|||
        template InternalAdd<DdType::Sylvan, double> InternalDdManager<DdType::Sylvan>::getConstant(double const& value) const; | 
				
			|||
        template InternalAdd<DdType::Sylvan, uint_fast64_t> InternalDdManager<DdType::Sylvan>::getConstant(uint_fast64_t const& value) const; | 
				
			|||
    } | 
				
			|||
} | 
				
			|||
@ -0,0 +1,101 @@ | 
				
			|||
#ifndef STORM_STORAGE_DD_INTERNALSYLVANDDMANAGER_H_ | 
				
			|||
#define STORM_STORAGE_DD_INTERNALSYLVANDDMANAGER_H_ | 
				
			|||
 | 
				
			|||
#include "src/storage/dd/DdType.h" | 
				
			|||
#include "src/storage/dd/InternalDdManager.h" | 
				
			|||
 | 
				
			|||
#include "src/storage/dd/sylvan/InternalSylvanBdd.h" | 
				
			|||
#include "src/storage/dd/sylvan/InternalSylvanAdd.h" | 
				
			|||
 | 
				
			|||
namespace storm { | 
				
			|||
    namespace dd { | 
				
			|||
        template<DdType LibraryType, typename ValueType> | 
				
			|||
        class InternalAdd; | 
				
			|||
         | 
				
			|||
        template<DdType LibraryType> | 
				
			|||
        class InternalBdd; | 
				
			|||
         | 
				
			|||
        template<> | 
				
			|||
        class InternalDdManager<DdType::Sylvan> { | 
				
			|||
        public: | 
				
			|||
            friend class InternalBdd<DdType::Sylvan>; | 
				
			|||
             | 
				
			|||
            template<DdType LibraryType, typename ValueType> | 
				
			|||
            friend class InternalAdd; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Creates a new internal manager for CUDD DDs. | 
				
			|||
             */ | 
				
			|||
            InternalDdManager(); | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Retrieves a BDD representing the constant one function. | 
				
			|||
             * | 
				
			|||
             * @return A BDD representing the constant one function. | 
				
			|||
             */ | 
				
			|||
            InternalBdd<DdType::Sylvan> getBddOne() const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Retrieves an ADD representing the constant one function. | 
				
			|||
             * | 
				
			|||
             * @return An ADD representing the constant one function. | 
				
			|||
             */ | 
				
			|||
            template<typename ValueType> | 
				
			|||
            InternalAdd<DdType::Sylvan, ValueType> getAddOne() const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Retrieves a BDD representing the constant zero function. | 
				
			|||
             * | 
				
			|||
             * @return A BDD representing the constant zero function. | 
				
			|||
             */ | 
				
			|||
            InternalBdd<DdType::Sylvan> getBddZero() const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Retrieves an ADD representing the constant zero function. | 
				
			|||
             * | 
				
			|||
             * @return An ADD representing the constant zero function. | 
				
			|||
             */ | 
				
			|||
            template<typename ValueType> | 
				
			|||
            InternalAdd<DdType::Sylvan, ValueType> getAddZero() const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Retrieves an ADD representing the constant function with the given value. | 
				
			|||
             * | 
				
			|||
             * @return An ADD representing the constant function with the given value. | 
				
			|||
             */ | 
				
			|||
            template<typename ValueType> | 
				
			|||
            InternalAdd<DdType::Sylvan, ValueType> getConstant(ValueType const& value) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Creates a new pair of DD variables and returns the two cubes as a result. | 
				
			|||
             * | 
				
			|||
             * @return The two cubes belonging to the DD variables. | 
				
			|||
             */ | 
				
			|||
            std::pair<InternalBdd<DdType::Sylvan>, InternalBdd<DdType::Sylvan>> createNewDdVariablePair(); | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Sets whether or not dynamic reordering is allowed for the DDs managed by this manager. | 
				
			|||
             * | 
				
			|||
             * @param value If set to true, dynamic reordering is allowed and forbidden otherwise. | 
				
			|||
             */ | 
				
			|||
            void allowDynamicReordering(bool value); | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Retrieves whether dynamic reordering is currently allowed. | 
				
			|||
             * | 
				
			|||
             * @return True iff dynamic reordering is currently allowed. | 
				
			|||
             */ | 
				
			|||
            bool isDynamicReorderingAllowed() const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Triggers a reordering of the DDs managed by this manager. | 
				
			|||
             */ | 
				
			|||
            void triggerReordering(); | 
				
			|||
             | 
				
			|||
        private: | 
				
			|||
 | 
				
			|||
        }; | 
				
			|||
    } | 
				
			|||
} | 
				
			|||
 | 
				
			|||
#endif /* STORM_STORAGE_DD_INTERNALSYLVANDDMANAGER_H_ */ | 
				
			|||
@ -0,0 +1,36 @@ | 
				
			|||
#include "src/storage/dd/sylvan/SylvanAddIterator.h"
 | 
				
			|||
 | 
				
			|||
#include "src/utility/macros.h"
 | 
				
			|||
#include "src/exceptions/NotImplementedException.h"
 | 
				
			|||
 | 
				
			|||
namespace storm { | 
				
			|||
    namespace dd { | 
				
			|||
        template<typename ValueType> | 
				
			|||
        AddIterator<DdType::Sylvan, ValueType>::AddIterator() { | 
				
			|||
            // Intentionally left empty.
 | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        AddIterator<DdType::Sylvan, ValueType>& AddIterator<DdType::Sylvan, ValueType>::operator++() { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        bool AddIterator<DdType::Sylvan, ValueType>::operator==(AddIterator<DdType::Sylvan, ValueType> const& other) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        bool AddIterator<DdType::Sylvan, ValueType>::operator!=(AddIterator<DdType::Sylvan, ValueType> const& other) const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        std::pair<storm::expressions::SimpleValuation, ValueType> AddIterator<DdType::Sylvan, ValueType>::operator*() const { | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Not yet implemented."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template class AddIterator<DdType::Sylvan, double>; | 
				
			|||
        template class AddIterator<DdType::Sylvan, uint_fast64_t>; | 
				
			|||
    } | 
				
			|||
} | 
				
			|||
@ -0,0 +1,69 @@ | 
				
			|||
#ifndef STORM_STORAGE_DD_SYLVANADDITERATOR_H_ | 
				
			|||
#define STORM_STORAGE_DD_SYLVANADDITERATOR_H_ | 
				
			|||
 | 
				
			|||
#include "src/storage/dd/AddIterator.h" | 
				
			|||
#include "src/storage/expressions/SimpleValuation.h" | 
				
			|||
 | 
				
			|||
namespace storm { | 
				
			|||
    namespace dd { | 
				
			|||
        // Forward-declare the DdManager class. | 
				
			|||
        template<DdType Type> | 
				
			|||
        class DdManager; | 
				
			|||
         | 
				
			|||
        template<DdType Type, typename ValueType> | 
				
			|||
        class InternalAdd; | 
				
			|||
         | 
				
			|||
        template<typename ValueType> | 
				
			|||
        class AddIterator<DdType::Sylvan, ValueType> { | 
				
			|||
        public: | 
				
			|||
            friend class InternalAdd<DdType::Sylvan, ValueType>; | 
				
			|||
             | 
				
			|||
            // Default-instantiate the constructor. | 
				
			|||
            AddIterator(); | 
				
			|||
             | 
				
			|||
            // Forbid copy-construction and copy assignment, because ownership of the internal pointer is unclear then. | 
				
			|||
            AddIterator(AddIterator<DdType::Sylvan, ValueType> const& other) = delete; | 
				
			|||
            AddIterator& operator=(AddIterator<DdType::Sylvan, ValueType> const& other) = delete; | 
				
			|||
             | 
				
			|||
            // Provide move-construction and move-assignment, though. | 
				
			|||
            AddIterator(AddIterator<DdType::Sylvan, ValueType>&& other) = default; | 
				
			|||
            AddIterator& operator=(AddIterator<DdType::Sylvan, ValueType>&& other) = default; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Moves the iterator one position forward. | 
				
			|||
             */ | 
				
			|||
            AddIterator<DdType::Sylvan, ValueType>& operator++(); | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Returns a pair consisting of a valuation of meta variables and the value to which this valuation is | 
				
			|||
             * mapped. Note that the result is returned by value. | 
				
			|||
             * | 
				
			|||
             * @return A pair of a valuation and the function value. | 
				
			|||
             */ | 
				
			|||
            std::pair<storm::expressions::SimpleValuation, ValueType> operator*() const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Compares the iterator with the given one. Two iterators are considered equal when all their underlying | 
				
			|||
             * data members are the same or they both are at their end. | 
				
			|||
             * | 
				
			|||
             * @param other The iterator with which to compare. | 
				
			|||
             * @return True if the two iterators are considered equal. | 
				
			|||
             */ | 
				
			|||
            bool operator==(AddIterator<DdType::Sylvan, ValueType> const& other) const; | 
				
			|||
             | 
				
			|||
            /*! | 
				
			|||
             * Compares the iterator with the given one. Two iterators are considered unequal iff they are not | 
				
			|||
             * considered equal. | 
				
			|||
             * | 
				
			|||
             * @param other The iterator with which to compare. | 
				
			|||
             * @return True if the two iterators are considered unequal. | 
				
			|||
             */ | 
				
			|||
            bool operator!=(AddIterator<DdType::Sylvan, ValueType> const& other) const; | 
				
			|||
             | 
				
			|||
        private: | 
				
			|||
             | 
				
			|||
        }; | 
				
			|||
    } | 
				
			|||
} | 
				
			|||
 | 
				
			|||
#endif /* STORM_STORAGE_DD_SYLVANADDITERATOR_H_ */ | 
				
			|||
						Write
						Preview
					
					
					Loading…
					
					Cancel
						Save
					
		Reference in new issue