| 
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -19,7 +19,66 @@ namespace storm { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					         | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        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."); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            uint_fast64_t offset = 0; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            return InternalBdd<DdType::Sylvan>(ddManager, sylvan::Bdd(fromVectorRec(offset, 0, sortedDdVariableIndices.size(), values, odd, sortedDdVariableIndices, filter))); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					         | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        template<typename ValueType> | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        BDD InternalBdd<DdType::Sylvan>::fromVectorRec(uint_fast64_t& currentOffset, uint_fast64_t currentLevel, uint_fast64_t maxLevel, std::vector<ValueType> const& values, Odd const& odd, std::vector<uint_fast64_t> const& ddVariableIndices, std::function<bool (ValueType const&)> const& filter) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            if (currentLevel == maxLevel) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                // If we are in a terminal node of the ODD, we need to check whether the then-offset of the ODD is one
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                // (meaning the encoding is a valid one) or zero (meaning the encoding is not valid). Consequently, we
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                // need to copy the next value of the vector iff the then-offset is greater than zero.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                if (odd.getThenOffset() > 0) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    if (filter(values[currentOffset++])) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        return mtbdd_true; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    } else { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        return mtbdd_false; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                } else { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    return mtbdd_false; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            } else { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                // If the total offset is zero, we can just return the constant zero DD.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                if (odd.getThenOffset() + odd.getElseOffset() == 0) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    return mtbdd_false; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                // Determine the new else-successor.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                BDD elseSuccessor; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                if (odd.getElseOffset() > 0) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    elseSuccessor = fromVectorRec(currentOffset, currentLevel + 1, maxLevel, values, odd.getElseSuccessor(), ddVariableIndices, filter); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                } else { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    elseSuccessor = mtbdd_false; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                sylvan_ref(elseSuccessor); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                // Determine the new then-successor.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                BDD thenSuccessor; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                if (odd.getThenOffset() > 0) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    thenSuccessor = fromVectorRec(currentOffset, currentLevel + 1, maxLevel, values, odd.getThenSuccessor(), ddVariableIndices, filter); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                } else { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    thenSuccessor = mtbdd_false; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                sylvan_ref(thenSuccessor); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                // Create a node representing ITE(currentVar, thenSuccessor, elseSuccessor);
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                BDD result = sylvan_ithvar(static_cast<BDDVAR>(ddVariableIndices[currentLevel])); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                sylvan_ref(result); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                LACE_ME; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                BDD newResult = sylvan_ite(result, thenSuccessor, elseSuccessor); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                sylvan_ref(newResult); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                // Dispose of the intermediate results
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                sylvan_deref(result); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                sylvan_deref(thenSuccessor); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                sylvan_deref(elseSuccessor); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                // Before returning, we remove the protection imposed by the previous call to sylvan_ref.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                sylvan_deref(newResult); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                return newResult; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					         | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        bool InternalBdd<DdType::Sylvan>::operator==(InternalBdd<DdType::Sylvan> const& other) const { | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
				 | 
				
					
  |