@ -164,36 +164,10 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        template < typename  SparseDtmcModelType >  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        std : : vector < typename  SparseDtmcPrctlModelChecker < SparseDtmcModelType > : : ValueType >  SparseDtmcPrctlModelChecker < SparseDtmcModelType > : : computeCumulativeRewardsHelper ( RewardModelType  const &  rewardModel ,  uint_fast64_t  stepBound )  const  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            // Compute the reward vector to add in each step based on the available reward models.
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : vector < ValueType >  totalRewardVector ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            if  ( rewardModel . hasTransitionRewards ( ) )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                totalRewardVector  =  this - > getModel ( ) . getTransitionMatrix ( ) . getPointwiseProductRowSumVector ( rewardModel . getTransitionRewardMatrix ( ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                if  ( rewardModel . hasStateRewards ( ) )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    storm : : utility : : vector : : addVectors ( totalRewardVector ,  rewardModel . getStateRewardVector ( ) ,  totalRewardVector ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                if  ( rewardModel . hasStateActionRewards ( ) )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    storm : : utility : : vector : : addVectors ( totalRewardVector ,  rewardModel . getStateActionRewardVector ( ) ,  totalRewardVector ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  else  if  ( rewardModel . hasStateRewards ( ) )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                totalRewardVector  =  std : : vector < ValueType > ( rewardModel . getStateRewardVector ( ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                if  ( rewardModel . hasStateActionRewards ( ) )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    storm : : utility : : vector : : addVectors ( totalRewardVector ,  rewardModel . getStateActionRewardVector ( ) ,  totalRewardVector ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  else  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                totalRewardVector  =  std : : vector < ValueType > ( rewardModel . getStateActionRewardVector ( ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : vector < ValueType >  totalRewardVector  =  rewardModel . getTotalRewardVector ( this - > getModel ( ) . getTransitionMatrix ( ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					             
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            // Initialize result to either the state rewards of the model or the null vector.
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : vector < ValueType >  result ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            if  ( rewardModel . hasStateRewards ( ) )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                result  =  std : : vector < ValueType > ( rewardModel . getStateRewardVector ( ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                if  ( rewardModel . hasStateActionRewards ( ) )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    storm : : utility : : vector : : addVectors ( result ,  rewardModel . getStateActionRewardVector ( ) ,  result ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  else  if  ( rewardModel . hasStateActionRewards ( ) )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                result  =  std : : vector < ValueType > ( rewardModel . getStateRewardVector ( ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  else  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                result . resize ( this - > getModel ( ) . getNumberOfStates ( ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : vector < ValueType >  result  =  rewardModel . getTotalStateActionRewardVector ( this - > getModel ( ) . getNumberOfStates ( ) ,  this - > getModel ( ) . getTransitionMatrix ( ) . getRowGroupIndices ( ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					             
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            // Perform the matrix vector multiplication as often as required by the formula bound.
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            STORM_LOG_THROW ( linearEquationSolverFactory  ! =  nullptr ,  storm : : exceptions : : InvalidStateException ,  " No valid linear equation solver available. " ) ;  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				
					@ -215,15 +189,7 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            STORM_LOG_THROW ( rewardModel . hasStateRewards ( )  | |  rewardModel . hasStateActionRewards ( ) ,  storm : : exceptions : : InvalidPropertyException ,  " Missing reward model for formula. Skipping formula. " ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					             
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            // Initialize result to state rewards of the model.
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : vector < ValueType >  result ( this - > getModel ( ) . getNumberOfStates ( ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            if  ( rewardModel . hasStateRewards ( ) )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                if  ( rewardModel . hasStateRewards ( ) )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    storm : : utility : : vector : : addVectors ( result ,  rewardModel . getStateRewardVector ( ) ,  result ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                if  ( rewardModel . hasStateActionRewards ( ) )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    storm : : utility : : vector : : addVectors ( result ,  rewardModel . getStateActionRewardVector ( ) ,  result ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : vector < ValueType >  result  =  rewardModel . getTotalStateActionRewardVector ( this - > getModel ( ) . getNumberOfStates ( ) ,  this - > getModel ( ) . getTransitionMatrix ( ) . getRowGroupIndices ( ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					             
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            // Perform the matrix vector multiplication as often as required by the formula bound.
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            STORM_LOG_THROW ( linearEquationSolverFactory  ! =  nullptr ,  storm : : exceptions : : InvalidStateException ,  " No valid linear equation solver available. " ) ;  
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				
					@ -273,44 +239,7 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                std : : vector < ValueType >  x ( submatrix . getColumnCount ( ) ,  storm : : utility : : one < ValueType > ( ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                // Prepare the right-hand side of the equation system.
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                std : : vector < ValueType >  b ( submatrix . getRowCount ( ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                if  ( rewardModel . hasTransitionRewards ( ) )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    // If a transition-based reward model is available, we initialize the right-hand
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    // side to the vector resulting from summing the rows of the pointwise product
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    // of the transition probability matrix and the transition reward matrix.
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    std : : vector < ValueType >  pointwiseProductRowSumVector  =  transitionMatrix . getPointwiseProductRowSumVector ( rewardModel . getTransitionRewardMatrix ( ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    storm : : utility : : vector : : selectVectorValues ( b ,  maybeStates ,  pointwiseProductRowSumVector ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                     
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    if  ( rewardModel . hasStateRewards ( )  | |  rewardModel . hasStateActionRewards ( ) )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        // If a state-based reward model is also available, we need to add this vector
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        // as well. As the state reward vector contains entries not just for the states
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        // that we still consider (i.e. maybeStates), we need to extract these values
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        // first.
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        std : : vector < ValueType >  subStateRewards ( b . size ( ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        if  ( rewardModel . hasStateRewards ( ) )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                            storm : : utility : : vector : : selectVectorValues ( subStateRewards ,  maybeStates ,  rewardModel . getStateRewardVector ( ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                            storm : : utility : : vector : : addVectors ( b ,  subStateRewards ,  b ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        if  ( rewardModel . hasStateActionRewards ( ) )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                            storm : : utility : : vector : : selectVectorValues ( subStateRewards ,  maybeStates ,  rewardModel . getStateActionRewardVector ( ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                            storm : : utility : : vector : : addVectors ( b ,  subStateRewards ,  b ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                }  else  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    // If only a state-based reward model is  available, we take this vector as the
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    // right-hand side. As the state reward vector contains entries not just for the
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    // states that we still consider (i.e. maybeStates), we need to extract these values
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    // first.
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    std : : vector < ValueType >  subStateRewards ( b . size ( ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    if  ( rewardModel . hasStateRewards ( ) )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        storm : : utility : : vector : : selectVectorValues ( subStateRewards ,  maybeStates ,  rewardModel . getStateRewardVector ( ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        storm : : utility : : vector : : addVectors ( b ,  subStateRewards ,  b ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    if  ( rewardModel . hasStateActionRewards ( ) )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        storm : : utility : : vector : : selectVectorValues ( subStateRewards ,  maybeStates ,  rewardModel . getStateActionRewardVector ( ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        storm : : utility : : vector : : addVectors ( b ,  subStateRewards ,  b ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                std : : vector < ValueType >  b  =  rewardModel . getTotalRewardVector ( submatrix . getRowCount ( ) ,  transitionMatrix ,  maybeStates ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                // Now solve the resulting equation system.
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                std : : unique_ptr < storm : : solver : : LinearEquationSolver < ValueType > >  solver  =  linearEquationSolverFactory . create ( submatrix ) ;