@ -157,31 +157,52 @@ namespace storm { 
			
		
	
		
			
				
					                 
			
		
	
		
			
				
					                // We then build the submatrix that only has the transitions of the maybe states.
  
			
		
	
		
			
				
					                storm : : storage : : SparseMatrix < ValueType >  submatrix  =  dtmc . getTransitionMatrix ( ) . getSubmatrix ( false ,  maybeStates ,  maybeStates ) ;  
			
		
	
		
			
				
					                storm : : storage : : SparseMatrix < ValueType >  submatrixTransposed  =  submatrix . transpose ( ) ;  
			
		
	
		
			
				
					                 
			
		
	
		
			
				
					                // Before starting the model checking process, we assign priorities to states so we can use them to
  
			
		
	
		
			
				
					                // impose ordering constraints later.
  
			
		
	
		
			
				
					                std : : vector < std : : size_t >  statePriorities ( submatrix . getRowCount ( ) ) ;  
			
		
	
		
			
				
					                std : : vector < std : : size_t >  states ( submatrix . getRowCount ( ) ) ;  
			
		
	
		
			
				
					                for  ( std : : size_t  index  =  0 ;  index  <  states . size ( ) ;  + + index )  {  
			
		
	
		
			
				
					                    states [ index ]  =  index ;  
			
		
	
		
			
				
					                }  
			
		
	
		
			
				
					                if  ( storm : : settings : : parametricSettings ( ) . getEliminationOrder ( )  = =  storm : : settings : : modules : : ParametricSettings : : EliminationOrder : : Random )  {  
			
		
	
		
			
				
					                    std : : vector < std : : size_t >  states ( submatrix . getRowCount ( ) ) ;  
			
		
	
		
			
				
					                    for  ( std : : size_t  index  =  0 ;  index  <  states . size ( ) ;  + + index )  {  
			
		
	
		
			
				
					                        states [ index ]  =  index ;  
			
		
	
		
			
				
					                    }  
			
		
	
		
			
				
					                     
			
		
	
		
			
				
					                    std : : random_shuffle ( states . begin ( ) ,  states . end ( ) ) ;  
			
		
	
		
			
				
					                }  else  {  
			
		
	
		
			
				
					                    std : : vector < std : : size_t >  distances ;  
			
		
	
		
			
				
					                    if  ( storm : : settings : : parametricSettings ( ) . getEliminationOrder ( )  = =  storm : : settings : : modules : : ParametricSettings : : EliminationOrder : : Forward  | |  storm : : settings : : parametricSettings ( ) . getEliminationOrder ( )  = =  storm : : settings : : modules : : ParametricSettings : : EliminationOrder : : ForwardReversed )  {  
			
		
	
		
			
				
					                        distances  =  storm : : utility : : graph : : getDistances ( submatrix ,  newInitialStates ) ;  
			
		
	
		
			
				
					                    }  else  if  ( storm : : settings : : parametricSettings ( ) . getEliminationOrder ( )  = =  storm : : settings : : modules : : ParametricSettings : : EliminationOrder : : Backward  | |  storm : : settings : : parametricSettings ( ) . getEliminationOrder ( )  = =  storm : : settings : : modules : : ParametricSettings : : EliminationOrder : : BackwardReversed )  {  
			
		
	
		
			
				
					                        // Since the target states were eliminated from the matrix already, we construct a replacement by
  
			
		
	
		
			
				
					                        // treating all states that have some non-zero probability to go to a target state in one step.
  
			
		
	
		
			
				
					                        storm : : utility : : ConstantsComparator < ValueType >  comparator ;  
			
		
	
		
			
				
					                        storm : : storage : : BitVector  pseudoTargetStates ( submatrix . getRowCount ( ) ) ;  
			
		
	
		
			
				
					                        for  ( std : : size_t  index  =  0 ;  index  <  oneStepProbabilities . size ( ) ;  + + index )  {  
			
		
	
		
			
				
					                            if  ( ! comparator . isZero ( oneStepProbabilities [ index ] ) )  {  
			
		
	
		
			
				
					                                pseudoTargetStates . set ( index ) ;  
			
		
	
		
			
				
					                            }  
			
		
	
		
			
				
					                        }  
			
		
	
		
			
				
					                         
			
		
	
		
			
				
					                        distances  =  storm : : utility : : graph : : getDistances ( submatrixTransposed ,  pseudoTargetStates ) ;  
			
		
	
		
			
				
					                    }  else  {  
			
		
	
		
			
				
					                        STORM_LOG_ASSERT ( false ,  " Illegal sorting order selected. " ) ;  
			
		
	
		
			
				
					                    }  
			
		
	
		
			
				
					                     
			
		
	
		
			
				
					                    for  ( std : : size_t  index  =  0 ;  index  <  states . size ( ) ;  + + index )  {  
			
		
	
		
			
				
					                        statePriorities [ states [ index ] ]  =  index ;  
			
		
	
		
			
				
					                    // In case of the forward or backward ordering, we can sort the states according to the distances.
  
			
		
	
		
			
				
					                    if  ( storm : : settings : : parametricSettings ( ) . getEliminationOrder ( )  = =  storm : : settings : : modules : : ParametricSettings : : EliminationOrder : : Forward  | |  storm : : settings : : parametricSettings ( ) . getEliminationOrder ( )  = =  storm : : settings : : modules : : ParametricSettings : : EliminationOrder : : Backward )  {  
			
		
	
		
			
				
					                        std : : sort ( states . begin ( ) ,  states . end ( ) ,  [ & distances ]  ( storm : : storage : : sparse : : state_type  const &  state1 ,  storm : : storage : : sparse : : state_type  const &  state2 )  {  return  distances [ state1 ]  <  distances [ state2 ] ;  }  ) ;  
			
		
	
		
			
				
					                    }  else  {  
			
		
	
		
			
				
					                        // Otherwise, we sort them according to descending distances.
  
			
		
	
		
			
				
					                        std : : sort ( states . begin ( ) ,  states . end ( ) ,  [ & distances ]  ( storm : : storage : : sparse : : state_type  const &  state1 ,  storm : : storage : : sparse : : state_type  const &  state2 )  {  return  distances [ state1 ]  >  distances [ state2 ] ;  }  ) ;  
			
		
	
		
			
				
					                    }  
			
		
	
		
			
				
					                }  else  if  ( storm : : settings : : parametricSettings ( ) . getEliminationOrder ( )  = =  storm : : settings : : modules : : ParametricSettings : : EliminationOrder : : Forward )  {  
			
		
	
		
			
				
					                    std : : size_t  distances  =  storm : : utility : : graph : : getDistances ( submatrix ,  initialStates ) ;  
			
		
	
		
			
				
					                }  
			
		
	
		
			
				
					                 
			
		
	
		
			
				
					                // Now convert the ordering of the states to priorities.
  
			
		
	
		
			
				
					                for  ( std : : size_t  index  =  0 ;  index  <  states . size ( ) ;  + + index )  {  
			
		
	
		
			
				
					                    statePriorities [ states [ index ] ]  =  index ;  
			
		
	
		
			
				
					                }  
			
		
	
		
			
				
					                 
			
		
	
		
			
				
					                // To be able to apply heuristics later, we now determine the distance of each state to the initial state.
  
			
		
	
		
			
				
					                // We start by setting up the data structures.
  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                 
			
		
	
		
			
				
					                return  computeReachabilityProbability ( submatrix ,  oneStepProbabilities ,  submatrix . transpose ( ) ,  newInitialStates ,  phiStates ,  psiStates ,  distances ) ;  
			
		
	
		
			
				
					                return  computeReachabilityProbability ( submatrix ,  oneStepProbabilities ,  submatrixTransposed ,  newInitialStates ,  phiStates ,  psiStates ,  statePriorities ) ;  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					             
			
		
	
		
			
				
					            template < typename  ValueType >