@ -11,7 +11,7 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        static  std : : size_t  globalId  =  0 ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					         
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        template < typename  ValueType >  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        BisimulationDecomposition2 < ValueType > : : Block : : Block ( storm : : storage : : sparse : : state_type  begin ,  storm : : storage : : sparse : : state_type  end ,  Block *  prev ,  Block *  next )  :  next ( next ) ,  prev ( prev ) ,  begin ( begin ) ,  end ( end ) ,  markedAsSplitter ( false ) ,  markedPosition ( begin ) ,  id ( globalId + + )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        BisimulationDecomposition2 < ValueType > : : Block : : Block ( storm : : storage : : sparse : : state_type  begin ,  storm : : storage : : sparse : : state_type  end ,  Block *  prev ,  Block *  next )  :  next ( next ) ,  prev ( prev ) ,  begin ( begin ) ,  end ( end ) ,  markedAsSplitter ( false ) ,  markedAsPredecessorBlock ( false ) ,  marked Position ( begin ) ,  id ( globalId + + )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            if  ( next  ! =  nullptr )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                next - > prev  =  this ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				
					@ -232,11 +232,10 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					         
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        template < typename  ValueType >  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        void  BisimulationDecomposition2 < ValueType > : : Partition : : swapStates ( storm : : storage : : sparse : : state_type  state1 ,  storm : : storage : : sparse : : state_type  state2 )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : cout  < <  " swapping states  "  < <  state1  < <  "  and  "  < <  state2  < <  std : : endl ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : cout  < <  " swapping states  "  < <  state1  < <  "  and  "  < <  state2  < <  "  at positions  "  < <  this - > positions [ state1 ]  < <  "  and  "  < <  this - > positions [ state2 ]  < <  std : : endl ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : swap ( this - > states [ this - > positions [ state1 ] ] ,  this - > states [ this - > positions [ state2 ] ] ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : swap ( this - > values [ this - > positions [ state1 ] ] ,  this - > values [ this - > positions [ state2 ] ] ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : swap ( this - > positions [ state1 ] ,  this - > positions [ state2 ] ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            assert ( this - > check ( ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					         
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        template < typename  ValueType >  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				
					@ -252,7 +251,6 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            this - > positions [ state2 ]  =  position1 ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : cout  < <  " pos of  "  < <  state1  < <  "  is now  "  < <  position2  < <  "  and pos of  "  < <  state2  < <  "  is now  "  < <  position1  < <  std : : endl ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : cout  < <  this - > states [ position1 ]  < <  "  vs  "  < <  state2  < <  "  and  "  < <  this - > states [ position2 ]  < <  "  vs  "  < <  state1  < <  std : : endl ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            assert ( this - > check ( ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					         
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        template < typename  ValueType >  
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				
					@ -559,7 +557,7 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            // Now we can check whether the block needs to be split, which is the case iff the probabilities for the
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            // first and the last state are different.
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : size_t  createdBlocks  =  0 ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            while  ( std : : abs ( partition . getValueAtPosition ( beginIndex )  -  partition . getValueAtPosition ( endIndex ) )  > =  1e-6 )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            while  ( std : : abs ( partition . getValueAtPosition ( beginIndex )  -  partition . getValueAtPosition ( endIndex  -  1  ) )  > =  1e-6 )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                // Now we scan for the first state in the block that disagrees on the probability value.
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                // Note that we do not have to check currentIndex for staying within bounds, because we know the matching
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                // state is within bounds.
  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				
					@ -575,9 +573,9 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                // Now we split the block and mark it as a potential splitter.
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                + + createdBlocks ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                Block &  newBlock  =  partition . splitBlock ( block ,  currentIndex ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                if  ( ! newBlock . isMarkedAsPredecessor ( ) )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    newBlock . markAsSplitter ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                if  ( ! newBlock . isMarkedAsSplitter ( ) )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    splitterQueue . push_back ( & newBlock ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    newBlock . markAsSplitter ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                beginIndex  =  currentIndex ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				
					@ -658,8 +656,11 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                     
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    if  ( ! predecessorBlock . isMarkedAsPredecessor ( ) )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        std : : cout  < <  " not already in there "  < <  std : : endl ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        predecessorBlocks . emplace_back ( & predecessorBlock ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        predecessorBlock . markAsPredecessorBlock ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    }  else  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        std : : cout  < <  " already in there "  < <  std : : endl ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                 
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				
					@ -671,6 +672,8 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					             
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : cout  < <  " (1)having  "  < <  predecessorBlocks . size ( )  < <  "  pred blocks  "  < <  std : : endl ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					             
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            // Now we can traverse the list of states of the splitter whose predecessors we have not yet explored.
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            for  ( auto  stateIterator  =  partition . getStates ( ) . begin ( )  +  splitter . getOriginalBegin ( ) ,  stateIte  =  partition . getStates ( ) . begin ( )  +  splitter . getMarkedPosition ( ) ;  stateIterator  ! =  stateIte ;  + + stateIterator )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                storm : : storage : : sparse : : state_type  currentState  =  * stateIterator ;  
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				
					@ -699,7 +702,7 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					             
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : list < Block * >  blocksToSplit ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					             
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : cout  < <  " having  "  < <  predecessorBlocks . size ( )  < <  "  pred blocks  "  < <  std : : endl ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : cout  < <  " (2) having "  < <  predecessorBlocks . size ( )  < <  "  pred blocks  "  < <  std : : endl ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					             
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            // Now, we can iterate over the predecessor blocks and see whether we have to create a new block for
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            // predecessors of the splitter.
  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				
					@ -714,9 +717,12 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    std : : cout  < <  " moved begin of block  "  < <  block . getId ( )  < <  "  to  "  < <  block . getBegin ( )  < <  "  and end to  "  < <  block . getEnd ( )  < <  std : : endl ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                     
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    Block &  newBlock  =  partition . insertBlock ( block ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    std : : cout  < <  " created new block  "  < <  std : : endl ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    std : : cout  < <  " created new block  "  < <  newBlock . getId ( )  < <  "  from block  "  < <  block . getId ( )  < <  std : : endl ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    newBlock . print ( partition ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    splitterQueue . push_back ( & newBlock ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    if  ( ! newBlock . isMarkedAsSplitter ( ) )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        splitterQueue . push_back ( & newBlock ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        newBlock . markAsSplitter ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                }  else  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    std : : cout  < <  " all states are predecessors "  < <  std : : endl ;