@ -61,7 +61,7 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            template < typename  ValueType >  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            class  InternalSignatureRefiner < storm : : dd : : DdType : : CUDD ,  ValueType >  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            public :  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                InternalSignatureRefiner ( storm : : dd : : DdManager < storm : : dd : : DdType : : CUDD >  const &  manager ,  storm : : expressions : : Variable  const &  blockVariable ,  storm : : dd : : Bdd < storm : : dd : : DdType : : CUDD >  const &  nondeterminismVariables ,  storm : : dd : : Bdd < storm : : dd : : DdType : : CUDD >  const &  nonBlockVariables )  :  manager ( manager ) ,  internalDdManager ( manager . getInternalDdManager ( ) ) ,  ddman ( internalDdManager . getCuddManager ( ) . getManager ( ) ) ,  blockVariable ( blockVariable ) ,  nondeterminismVariables ( nondeterminismVariables ) ,  nonBlockVariables ( nonBlockVariables ) ,  nextFreeBlockIndex ( 0 ) ,  numberOfRefinements ( 0 ) ,  lastNumberOfVisitedNodes ( 10000 ) ,  signatureCache ( lastNumberOfVisitedNodes ) ,  reuseBlocksCache ( lastNumberOfVisitedNodes )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                InternalSignatureRefiner ( storm : : dd : : DdManager < storm : : dd : : DdType : : CUDD >  const &  manager ,  storm : : expressions : : Variable  const &  blockVariable ,  storm : : dd : : Bdd < storm : : dd : : DdType : : CUDD >  const &  nondeterminismVariables ,  storm : : dd : : Bdd < storm : : dd : : DdType : : CUDD >  const &  nonBlockVariables ,  bool  shiftStateVariables )  :  manager ( manager ) ,  internalDdManager ( manager . getInternalDdManager ( ) ) ,  ddman ( internalDdManager . getCuddManager ( ) . getManager ( ) ) ,  blockVariable ( blockVariable ) ,  nondeterminismVariables ( nondeterminismVariables ) ,  nonBlockVariables ( nonBlockVariables ) ,  shiftStateVariables ( shiftState Variables ) ,  nextFreeBlockIndex ( 0 ) ,  numberOfRefinements ( 0 ) ,  lastNumberOfVisitedNodes ( 10000 ) ,  signatureCache ( lastNumberOfVisitedNodes ) ,  reuseBlocksCache ( lastNumberOfVisitedNodes )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    // Initialize precomputed data.
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    auto  const &  ddMetaVariable  =  manager . getMetaVariable ( blockVariable ) ;  
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				
					@ -147,12 +147,14 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        DdNode *  partitionElse ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        DdNode *  signatureThen ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        DdNode *  signatureElse ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        short  offset  =  1 ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        short  offset ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        bool  isNondeterminismVariable  =  false ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        while  ( skippedBoth  & &  ! Cudd_IsConstant ( nonBlockVariablesNode ) )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                            // Remember an offset that indicates whether the top variable is a nondeterminism variable or not.
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                            offset  =  1 ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                            offset  =  shiftStateVariables  ?  1  :  0  ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                            if  ( ! Cudd_IsConstant ( nondeterminismVariablesNode )  & &  Cudd_NodeReadIndex ( nondeterminismVariablesNode )  = =  Cudd_NodeReadIndex ( nonBlockVariablesNode ) )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                offset  =  0 ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                isNondeterminismVariable  =  true ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                            }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                             
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                            if  ( Cudd_NodeReadIndex ( partitionNode )  -  offset  = =  Cudd_NodeReadIndex ( nonBlockVariablesNode ) )  {  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				
					@ -175,7 +177,7 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                            if  ( skippedBoth )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                // If the current variable is a nondeterminism variable, we need to advance both variable sets otherwise just the non-block variables.
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                nonBlockVariablesNode  =  Cudd_T ( nonBlockVariablesNode ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                if  ( offset  = =  0 )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                if  ( isNondeterminismVariable )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                    nondeterminismVariablesNode  =  Cudd_T ( nondeterminismVariablesNode ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                            }  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				
					@ -186,9 +188,9 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                            return  refine ( partitionNode ,  signatureNode ,  nondeterminismVariablesNode ,  nonBlockVariablesNode ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                         
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        DdNode *  thenResult  =  refine ( partitionThen ,  signatureThen ,  offset  = =  0   ?  Cudd_T ( nondeterminismVariablesNode )  :  nondeterminismVariablesNode ,  Cudd_T ( nonBlockVariablesNode ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        DdNode *  thenResult  =  refine ( partitionThen ,  signatureThen ,  isNondeterminismVariable   ?  Cudd_T ( nondeterminismVariablesNode )  :  nondeterminismVariablesNode ,  Cudd_T ( nonBlockVariablesNode ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        Cudd_Ref ( thenResult ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        DdNode *  elseResult  =  refine ( partitionElse ,  signatureElse ,  offset  = =  0   ?  Cudd_T ( nondeterminismVariablesNode )  :  nondeterminismVariablesNode ,  Cudd_T ( nonBlockVariablesNode ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        DdNode *  elseResult  =  refine ( partitionElse ,  signatureElse ,  isNondeterminismVariable   ?  Cudd_T ( nondeterminismVariablesNode )  :  nondeterminismVariablesNode ,  Cudd_T ( nonBlockVariablesNode ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        Cudd_Ref ( elseResult ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        DdNode *  result ;  
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				
					@ -223,6 +225,9 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                storm : : dd : : Bdd < storm : : dd : : DdType : : CUDD >  nondeterminismVariables ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                storm : : dd : : Bdd < storm : : dd : : DdType : : CUDD >  nonBlockVariables ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                // A flag indicating whether we are to shift the state variables by one.
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                bool  shiftStateVariables ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                // The indices of the DD variables associated with the block variable.
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                std : : vector < uint64_t >  blockDdVariableIndices ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                 
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				
					@ -248,7 +253,7 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            template < typename  ValueType >  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            class  InternalSignatureRefiner < storm : : dd : : DdType : : Sylvan ,  ValueType >  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            public :  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                InternalSignatureRefiner ( storm : : dd : : DdManager < storm : : dd : : DdType : : Sylvan >  const &  manager ,  storm : : expressions : : Variable  const &  blockVariable ,  storm : : dd : : Bdd < storm : : dd : : DdType : : Sylvan >  const &  nondeterminismVariables ,  storm : : dd : : Bdd < storm : : dd : : DdType : : Sylvan >  const &  nonBlockVariables )  :  manager ( manager ) ,  internalDdManager ( manager . getInternalDdManager ( ) ) ,  blockVariable ( blockVariable ) ,  nondeterminismVariables ( nondeterminismVariables ) ,  nonBlockVariables ( nonBlockVariables ) ,  numberOfBlockVariables ( manager . getMetaVariable ( blockVariable ) . getNumberOfDdVariables ( ) ) ,  blockCube ( manager . getMetaVariable ( blockVariable ) . getCube ( ) ) ,  nextFreeBlockIndex ( 0 ) ,  numberOfRefinements ( 0 ) ,  signatureCache ( )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                InternalSignatureRefiner ( storm : : dd : : DdManager < storm : : dd : : DdType : : Sylvan >  const &  manager ,  storm : : expressions : : Variable  const &  blockVariable ,  storm : : dd : : Bdd < storm : : dd : : DdType : : Sylvan >  const &  nondeterminismVariables ,  storm : : dd : : Bdd < storm : : dd : : DdType : : Sylvan >  const &  nonBlockVariables ,  bool  shiftStateVariables )  :  manager ( manager ) ,  internalDdManager ( manager . getInternalDdManager ( ) ) ,  blockVariable ( blockVariable ) ,  nondeterminismVariables ( nondeterminismVariables ) ,  nonBlockVariables ( nonBlockVariables ) ,  shiftStateVariables ( shiftState Variables ) ,  numberOfBlockVariables ( manager . getMetaVariable ( blockVariable ) . getNumberOfDdVariables ( ) ) ,  blockCube ( manager . getMetaVariable ( blockVariable ) . getCube ( ) ) ,  nextFreeBlockIndex ( 0 ) ,  numberOfRefinements ( 0 ) ,  signatureCache ( )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    // Perform garbage collection to clean up stuff not needed anymore.
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    LACE_ME ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    sylvan_gc ( ) ;  
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				
					@ -363,12 +368,14 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        BDD  partitionElse ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        MTBDD  signatureThen ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        MTBDD  signatureElse ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        short  offset  =  1 ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        short  offset ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        bool  isNondeterminismVariable  =  false ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        while  ( skippedBoth  & &  ! sylvan_isconst ( nonBlockVariablesNode ) )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                            // Remember an offset that indicates whether the top variable is a nondeterminism variable or not.
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                            offset  =  1 ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                            offset  =  shiftStateVariables  ?  1  :  0  ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                            if  ( ! sylvan_isconst ( nondeterminismVariablesNode )  & &  sylvan_var ( nondeterminismVariablesNode )  = =  sylvan_var ( nonBlockVariablesNode ) )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                offset  =  0 ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                isNondeterminismVariable  =  true ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                            }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                            if  ( storm : : dd : : InternalAdd < storm : : dd : : DdType : : Sylvan ,  ValueType > : : matchesVariableIndex ( partitionNode ,  sylvan_var ( nonBlockVariablesNode ) ,  - offset ) )  {  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				
					@ -391,7 +398,7 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                            if  ( skippedBoth )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                // If the current variable is a nondeterminism variable, we need to advance both variable sets otherwise just the non-block variables.
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                nonBlockVariablesNode  =  sylvan_high ( nonBlockVariablesNode ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                if  ( offset  = =  0 )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                if  ( isNondeterminismVariable )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                    nondeterminismVariablesNode  =  sylvan_high ( nondeterminismVariablesNode ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                            }  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				
					@ -402,9 +409,9 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                            return  refine ( partitionNode ,  signatureNode ,  nondeterminismVariablesNode ,  nonBlockVariablesNode ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                         
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        BDD  thenResult  =  refine ( partitionThen ,  signatureThen ,  offset  = =  0   ?  sylvan_high ( nondeterminismVariablesNode )  :  nondeterminismVariablesNode ,  sylvan_high ( nonBlockVariablesNode ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        BDD  thenResult  =  refine ( partitionThen ,  signatureThen ,  isNondeterminismVariable   ?  sylvan_high ( nondeterminismVariablesNode )  :  nondeterminismVariablesNode ,  sylvan_high ( nonBlockVariablesNode ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        bdd_refs_push ( thenResult ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        BDD  elseResult  =  refine ( partitionElse ,  signatureElse ,  offset  = =  0   ?  sylvan_high ( nondeterminismVariablesNode )  :  nondeterminismVariablesNode ,  sylvan_high ( nonBlockVariablesNode ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        BDD  elseResult  =  refine ( partitionElse ,  signatureElse ,  isNondeterminismVariable   ?  sylvan_high ( nondeterminismVariablesNode )  :  nondeterminismVariablesNode ,  sylvan_high ( nonBlockVariablesNode ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        bdd_refs_push ( elseResult ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                         
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        BDD  result ;  
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				
					@ -432,6 +439,8 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                storm : : dd : : Bdd < storm : : dd : : DdType : : Sylvan >  nondeterminismVariables ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                storm : : dd : : Bdd < storm : : dd : : DdType : : Sylvan >  nonBlockVariables ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                bool  shiftStateVariables ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                uint64_t  numberOfBlockVariables ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                storm : : dd : : Bdd < storm : : dd : : DdType : : Sylvan >  blockCube ;  
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				
					@ -462,7 +471,7 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            } ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					             
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            template < storm : : dd : : DdType  DdType ,  typename  ValueType >  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            SignatureRefiner < DdType ,  ValueType > : : SignatureRefiner ( storm : : dd : : DdManager < DdType >  const &  manager ,  storm : : expressions : : Variable  const &  blockVariable ,  std : : set < storm : : expressions : : Variable >  const &  stateVariables ,  std : : set < storm : : expressions : : Variable >  const &  nondeterminismVariables )  :  manager ( & manager ) ,  stateVariables ( stateVariables )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            SignatureRefiner < DdType ,  ValueType > : : SignatureRefiner ( storm : : dd : : DdManager < DdType >  const &  manager ,  storm : : expressions : : Variable  const &  blockVariable ,  std : : set < storm : : expressions : : Variable >  const &  stateVariables ,  bool  shiftStateVariables ,  std : : set < storm : : expressions : : Variable >  const &  nondeterminismVariables )  :  manager ( & manager ) ,  stateVariables ( stateVariables )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                storm : : dd : : Bdd < DdType >  nonBlockVariablesCube  =  manager . getBddOne ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                storm : : dd : : Bdd < DdType >  nondeterminismVariablesCube  =  manager . getBddOne ( ) ;  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				
					@ -476,7 +485,7 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    nonBlockVariablesCube  & =  cube ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                internalRefiner  =  std : : make_unique < InternalSignatureRefiner < DdType ,  ValueType > > ( manager ,  blockVariable ,  nondeterminismVariablesCube ,  nonBlockVariablesCube ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                internalRefiner  =  std : : make_unique < InternalSignatureRefiner < DdType ,  ValueType > > ( manager ,  blockVariable ,  nondeterminismVariablesCube ,  nonBlockVariablesCube ,  shiftStateVariables ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					             
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            template < storm : : dd : : DdType  DdType ,  typename  ValueType >