@ -213,7 +213,7 @@ namespace storm { 
		
	
		
			
				            }             }  
		
	
		
			
				                         
		
	
		
			
				            template < typename  ValueType >             template < typename  ValueType >  
		
	
		
			
				            std : : vector < ValueType >  SparseMarkovAutomatonCslHelper : : computeLongRunAverageProbabilities ( OptimizationDirection  dir ,  storm : : storage : : SparseMatrix < ValueType >  const &  transitionMatrix ,  storm : : storage : : SparseMatrix < ValueType >  const &  backwardTransitions ,  std : : vector < ValueType >  const &  exitRateVector ,  storm : : storage : : BitVector  const &  markovianStates ,  storm : : storage : : BitVector  const &  psiStates ,  storm : : solver : : MinMaxLinearEquationSolverFactory < ValueType >  const &  minMaxLinearEquationSolverFactory )  {  
		
	
		
			
				            std : : vector < ValueType >  SparseMarkovAutomatonCslHelper : : computeLongRunAverageProbabilities ( OptimizationDirection  dir ,  storm : : storage : : SparseMatrix < ValueType >  const &  transitionMatrix ,  storm : : storage : : SparseMatrix < ValueType >  const &  backwardTransitions ,  std : : vector < ValueType >  const &  exitRateVector ,  storm : : storage : : BitVector  const &  markovianStates ,  storm : : storage : : BitVector  const &  psiStates ,  storm : : solver : : MinMaxLinearEquationSolverFactory < ValueType >  const &  minMaxLinearEquationSolverFactory ,  bool  useLpBasedTechnique )  {  
		
	
		
			
				                         
		
	
		
			
				                uint_fast64_t  numberOfStates  =  transitionMatrix . getRowGroupCount ( ) ;                 uint_fast64_t  numberOfStates  =  transitionMatrix . getRowGroupCount ( ) ;  
		
	
		
			
				
 
		
	
	
		
			
				
					
					
					
						
							 
					
				 
				@ -228,31 +228,17 @@ namespace storm { 
		
	
		
			
				                }                 }  
		
	
		
			
				                                 
		
	
		
			
				                // Otherwise, reduce the long run average probabilities to long run average rewards.
                 // Otherwise, reduce the long run average probabilities to long run average rewards.
  
		
	
		
			
				                // Every Markovian goal state s gets 1/E(s) reward for its (unique) action.
  
		
	
		
			
				                std : : vector < ValueType >  totalActionRewards ( transitionMatrix . getRowCount ( ) ,  storm : : utility : : zero < ValueType > ( ) ) ;  
		
	
		
			
				                storm : : storage : : BitVector  markovianGoalStates  =  markovianStates  &  psiStates ;  
		
	
		
			
				                for  ( auto  const &  state  :  markovianGoalStates )  {  
		
	
		
			
				                    totalActionRewards [ transitionMatrix . getRowGroupIndices ( ) [ state ] ]  =  storm : : utility : : one < ValueType > ( )  /  exitRateVector [ state ] ;  
		
	
		
			
				                }  
		
	
		
			
				                return  computeLongRunAverageRewards ( dir ,  transitionMatrix ,  backwardTransitions ,  exitRateVector ,  markovianStates ,  totalActionRewards ,  minMaxLinearEquationSolverFactory ) ;  
		
	
		
			
				                 
		
	
		
			
				            }  
		
	
		
			
				                // Every Markovian goal state gets reward one.
  
		
	
		
			
				                std : : vector < ValueType >  stateRewards ( transitionMatrix . getRowGroupCount ( ) ,  storm : : utility : : zero < ValueType > ( ) ) ;  
		
	
		
			
				                storm : : utility : : vector : : setVectorValues ( stateRewards ,  markovianStates  &  psiStates ,  storm : : utility : : one < ValueType > ( ) ) ;  
		
	
		
			
				                storm : : models : : sparse : : StandardRewardModel < ValueType >  rewardModel ( std : : move ( stateRewards ) ) ;  
		
	
		
			
				                                 
		
	
		
			
				            template < typename  ValueType ,  typename  RewardModelType >  
		
	
		
			
				            std : : vector < ValueType >  SparseMarkovAutomatonCslHelper : : computeLongRunAverageRewards ( OptimizationDirection  dir ,  storm : : storage : : SparseMatrix < ValueType >  const &  transitionMatrix ,  storm : : storage : : SparseMatrix < ValueType >  const &  backwardTransitions ,  std : : vector < ValueType >  const &  exitRateVector ,  storm : : storage : : BitVector  const &  markovianStates ,  RewardModelType  const &  rewardModel ,  storm : : solver : : MinMaxLinearEquationSolverFactory < ValueType >  const &  minMaxLinearEquationSolverFactory )  {  
		
	
		
			
				                return  computeLongRunAverageRewards ( dir ,  transitionMatrix ,  backwardTransitions ,  exitRateVector ,  markovianStates ,  rewardModel ,  minMaxLinearEquationSolverFactory ,  useLpBasedTechnique ) ;  
		
	
		
			
				                                 
		
	
		
			
				                // Obtain the total action reward vector where the state rewards are scaled accordingly
  
		
	
		
			
				                std : : vector < ValueType >  stateRewardWeights ( transitionMatrix . getRowGroupCount ( ) ,  storm : : utility : : zero < ValueType > ( ) ) ;  
		
	
		
			
				                for  ( auto  const  markovianState  :  markovianStates )  {  
		
	
		
			
				                    stateRewardWeights [ markovianState ]  =  storm : : utility : : one < ValueType > ( )  /  exitRateVector [ markovianState ] ;  
		
	
		
			
				            }             }  
		
	
		
			
				                std : : vector < ValueType >  totalRewardVector  =  rewardModel . getTotalActionRewardVector ( transitionMatrix ,  stateRewardWeights ) ;  
		
	
		
			
				                         
		
	
		
			
				                return  computeLongRunAverageRewards ( dir ,  transitionMatrix ,  backwardTransitions ,  exitRateVector ,  markovianStates ,  totalRewardVector ,  minMaxLinearEquationSolverFactory ) ;  
		
	
		
			
				           }  
		
	
		
			
				             
		
	
		
			
				            template < typename  ValueType >  
		
	
		
			
				            std : : vector < ValueType >  SparseMarkovAutomatonCslHelper : : computeLongRunAverageRewards ( OptimizationDirection  dir ,  storm : : storage : : SparseMatrix < ValueType >  const &  transitionMatrix ,  storm : : storage : : SparseMatrix < ValueType >  const &  backwardTransitions ,  std : : vector < ValueType >  const &  exitRateVector ,  storm : : storage : : BitVector  const &  markovianStates ,  std : : vector < ValueType >  const &  totalActionRewards ,  storm : : solver : : MinMaxLinearEquationSolverFactory < ValueType >  const &  minMaxLinearEquationSolverFactory )  {  
		
	
		
			
				            template < typename  ValueType ,  typename  RewardModelType >  
		
	
		
			
				            std : : vector < ValueType >  SparseMarkovAutomatonCslHelper : : computeLongRunAverageRewards ( OptimizationDirection  dir ,  storm : : storage : : SparseMatrix < ValueType >  const &  transitionMatrix ,  storm : : storage : : SparseMatrix < ValueType >  const &  backwardTransitions ,  std : : vector < ValueType >  const &  exitRateVector ,  storm : : storage : : BitVector  const &  markovianStates ,  RewardModelType  const &  rewardModel ,  storm : : solver : : MinMaxLinearEquationSolverFactory < ValueType >  const &  minMaxLinearEquationSolverFactory ,  bool  useLpBasedTechnique )  {  
		
	
		
			
				                                 
		
	
		
			
				                uint_fast64_t  numberOfStates  =  transitionMatrix . getRowGroupCount ( ) ;                 uint_fast64_t  numberOfStates  =  transitionMatrix . getRowGroupCount ( ) ;  
		
	
		
			
				
 
		
	
	
		
			
				
					
						
							 
					
					
						
							 
					
					
				 
				@ -281,7 +267,7 @@ namespace storm { 
		
	
		
			
				                    }                     }  
		
	
		
			
				                                         
		
	
		
			
				                    // Compute the LRA value for the current MEC.
                     // Compute the LRA value for the current MEC.
  
		
	
		
			
				                    lraValuesForEndComponents . push_back ( computeLraForMaximalEndComponent ( dir ,  transitionMatrix ,  exitRateVector ,  markovianStates ,  totalActionRewards ,  mec ) ) ;  
		
	
		
			
				                    lraValuesForEndComponents . push_back ( computeLraForMaximalEndComponent ( dir ,  transitionMatrix ,  exitRateVector ,  markovianStates ,  rewardModel ,  mec ,  minMaxLinearEquationSolverFactory ,  useLpBasedTechnique ) ) ;  
		
	
		
			
				                }                 }  
		
	
		
			
				                                 
		
	
		
			
				                // For fast transition rewriting, we build some auxiliary data structures.
                 // For fast transition rewriting, we build some auxiliary data structures.
  
		
	
	
		
			
				
					
						
							 
					
					
						
							 
					
					
				 
				@ -410,8 +396,31 @@ namespace storm { 
		
	
		
			
				                return  SparseMdpPrctlHelper < ValueType > : : computeReachabilityRewards ( dir ,  transitionMatrix ,  backwardTransitions ,  rewardModel ,  psiStates ,  false ,  false ,  minMaxLinearEquationSolverFactory ) . values ;                 return  SparseMdpPrctlHelper < ValueType > : : computeReachabilityRewards ( dir ,  transitionMatrix ,  backwardTransitions ,  rewardModel ,  psiStates ,  false ,  false ,  minMaxLinearEquationSolverFactory ) . values ;  
		
	
		
			
				            }             }  
		
	
		
			
				
 
		
	
		
			
				            template < typename  ValueType >  
		
	
		
			
				            ValueType  SparseMarkovAutomatonCslHelper : : computeLraForMaximalEndComponent ( OptimizationDirection  dir ,  storm : : storage : : SparseMatrix < ValueType >  const &  transitionMatrix ,  std : : vector < ValueType >  const &  exitRateVector ,  storm : : storage : : BitVector  const &  markovianStates ,  std : : vector < ValueType >  const &  totalActionRewards ,  storm : : storage : : MaximalEndComponent  const &  mec )  {  
		
	
		
			
				            template < typename  ValueType ,  typename  RewardModelType >  
		
	
		
			
				            ValueType  SparseMarkovAutomatonCslHelper : : computeLraForMaximalEndComponent ( OptimizationDirection  dir ,  storm : : storage : : SparseMatrix < ValueType >  const &  transitionMatrix ,  std : : vector < ValueType >  const &  exitRateVector ,  storm : : storage : : BitVector  const &  markovianStates ,  RewardModelType  const &  rewardModel ,  storm : : storage : : MaximalEndComponent  const &  mec ,  storm : : solver : : MinMaxLinearEquationSolverFactory < ValueType >  const &  minMaxLinearEquationSolverFactory ,  bool  useLpBasedTechnique )  {  
		
	
		
			
				                 
		
	
		
			
				                // If the mec only consists of a single state, we compute the LRA value directly
  
		
	
		
			
				                if  ( + + mec . begin ( )  = =  mec . end ( ) )  {  
		
	
		
			
				                    uint_fast64_t  state  =  mec . begin ( ) - > first ;  
		
	
		
			
				                    STORM_LOG_THROW ( markovianStates . get ( state ) ,  storm : : exceptions : : InvalidOperationException ,  " Markov Automaton has Zeno behavior. Computation of Long Run Average values not supported. " ) ;  
		
	
		
			
				                    ValueType  result  =  rewardModel . hasStateRewards ( )  ?  rewardModel . getStateReward ( state )  :  storm : : utility : : zero < ValueType > ( ) ;  
		
	
		
			
				                    if  ( rewardModel . hasStateActionRewards ( )  | |  rewardModel . hasTransitionRewards ( ) )  {  
		
	
		
			
				                        STORM_LOG_ASSERT ( mec . begin ( ) - > second . size ( )  = =  1 ,  " Markovian state has nondeterministic behavior. " ) ;  
		
	
		
			
				                        uint_fast64_t  choice  =  * mec . begin ( ) - > second . begin ( ) ;  
		
	
		
			
				                        result  + =  exitRateVector [ state ]  *  rewardModel . getTotalStateActionReward ( state ,  choice ,  transitionMatrix ,  storm : : utility : : zero < ValueType > ( ) ) ;  
		
	
		
			
				                    }  
		
	
		
			
				                    return  result ;  
		
	
		
			
				                }  
		
	
		
			
				                 
		
	
		
			
				                if  ( useLpBasedTechnique )  {  
		
	
		
			
				                    return  computeLraForMaximalEndComponentLP ( dir ,  transitionMatrix ,  exitRateVector ,  markovianStates ,  rewardModel ,  mec ) ;  
		
	
		
			
				                }  else  {  
		
	
		
			
				                    return  computeLraForMaximalEndComponentVI ( dir ,  transitionMatrix ,  exitRateVector ,  markovianStates ,  rewardModel ,  mec ,  minMaxLinearEquationSolverFactory ) ;  
		
	
		
			
				                }  
		
	
		
			
				            }  
		
	
		
			
				             
		
	
		
			
				            template < typename  ValueType ,  typename  RewardModelType >  
		
	
		
			
				            ValueType  SparseMarkovAutomatonCslHelper : : computeLraForMaximalEndComponentLP ( OptimizationDirection  dir ,  storm : : storage : : SparseMatrix < ValueType >  const &  transitionMatrix ,  std : : vector < ValueType >  const &  exitRateVector ,  storm : : storage : : BitVector  const &  markovianStates ,  RewardModelType  const &  rewardModel ,  storm : : storage : : MaximalEndComponent  const &  mec )  {  
		
	
		
			
				                std : : unique_ptr < storm : : utility : : solver : : LpSolverFactory >  lpSolverFactory ( new  storm : : utility : : solver : : LpSolverFactory ( ) ) ;                 std : : unique_ptr < storm : : utility : : solver : : LpSolverFactory >  lpSolverFactory ( new  storm : : utility : : solver : : LpSolverFactory ( ) ) ;  
		
	
		
			
				                std : : unique_ptr < storm : : solver : : LpSolver >  solver  =  lpSolverFactory - > create ( " LRA for MEC " ) ;                 std : : unique_ptr < storm : : solver : : LpSolver >  solver  =  lpSolverFactory - > create ( " LRA for MEC " ) ;  
		
	
		
			
				                solver - > setOptimizationDirection ( invert ( dir ) ) ;                 solver - > setOptimizationDirection ( invert ( dir ) ) ;  
		
	
	
		
			
				
					
						
							 
					
					
						
							 
					
					
				 
				@ -442,7 +451,8 @@ namespace storm { 
		
	
		
			
				                        }                         }  
		
	
		
			
				                                                 
		
	
		
			
				                        constraint  =  constraint  +  solver - > getManager ( ) . rational ( storm : : utility : : one < ValueType > ( )  /  exitRateVector [ state ] )  *  k ;                         constraint  =  constraint  +  solver - > getManager ( ) . rational ( storm : : utility : : one < ValueType > ( )  /  exitRateVector [ state ] )  *  k ;  
		
	
		
			
				                        storm : : expressions : : Expression  rightHandSide  =  solver - > getManager ( ) . rational ( totalActionRewards [ choice ] ) ;  
		
	
		
			
				                         
		
	
		
			
				                        storm : : expressions : : Expression  rightHandSide  =  solver - > getManager ( ) . rational ( rewardModel . getTotalStateActionReward ( state ,  choice ,  transitionMatrix ,  ( ValueType )  ( storm : : utility : : one < ValueType > ( )  /  exitRateVector [ state ] ) ) ) ;  
		
	
		
			
				                        if  ( dir  = =  OptimizationDirection : : Minimize )  {                         if  ( dir  = =  OptimizationDirection : : Minimize )  {  
		
	
		
			
				                            constraint  =  constraint  < =  rightHandSide ;                             constraint  =  constraint  < =  rightHandSide ;  
		
	
		
			
				                        }  else  {                         }  else  {  
		
	
	
		
			
				
					
					
					
						
							 
					
				 
				@ -459,7 +469,7 @@ namespace storm { 
		
	
		
			
				                                constraint  =  constraint  -  stateToVariableMap . at ( element . getColumn ( ) )  *  solver - > getManager ( ) . rational ( element . getValue ( ) ) ;                                 constraint  =  constraint  -  stateToVariableMap . at ( element . getColumn ( ) )  *  solver - > getManager ( ) . rational ( element . getValue ( ) ) ;  
		
	
		
			
				                            }                             }  
		
	
		
			
				
 
		
	
		
			
				                            storm : : expressions : : Expression  rightHandSide  =  solver - > getManager ( ) . rational ( totalActionRewards [ choice ] ) ;  
		
	
		
			
				                            storm : : expressions : : Expression  rightHandSide  =  solver - > getManager ( ) . rational ( rewardModel . getTotalStateActionReward ( state ,  choice ,  transitionMatrix ,  storm : : utility : : zero < ValueType > ( ) ) ) ;  
		
	
		
			
				                            if  ( dir  = =  OptimizationDirection : : Minimize )  {                             if  ( dir  = =  OptimizationDirection : : Minimize )  {  
		
	
		
			
				                                constraint  =  constraint  < =  rightHandSide ;                                 constraint  =  constraint  < =  rightHandSide ;  
		
	
		
			
				                            }  else  {                             }  else  {  
		
	
	
		
			
				
					
					
					
						
							 
					
				 
				@ -474,7 +484,127 @@ namespace storm { 
		
	
		
			
				                return  storm : : utility : : convertNumber < ValueType > ( solver - > getContinuousValue ( k ) ) ;                 return  storm : : utility : : convertNumber < ValueType > ( solver - > getContinuousValue ( k ) ) ;  
		
	
		
			
				            }             }  
		
	
		
			
				                         
		
	
		
			
				            template < typename  ValueType ,  typename  RewardModelType >  
		
	
		
			
				            ValueType  SparseMarkovAutomatonCslHelper : : computeLraForMaximalEndComponentVI ( OptimizationDirection  dir ,  storm : : storage : : SparseMatrix < ValueType >  const &  transitionMatrix ,  std : : vector < ValueType >  const &  exitRateVector ,  storm : : storage : : BitVector  const &  markovianStates ,  RewardModelType  const &  rewardModel ,  storm : : storage : : MaximalEndComponent  const &  mec ,  storm : : solver : : MinMaxLinearEquationSolverFactory < ValueType >  const &  minMaxLinearEquationSolverFactory )  {  
		
	
		
			
				                                 
		
	
		
			
				                // Initialize data about the mec
  
		
	
		
			
				                 
		
	
		
			
				                storm : : storage : : BitVector  mecStates ( transitionMatrix . getRowGroupCount ( ) ,  false ) ;  
		
	
		
			
				                storm : : storage : : BitVector  mecChoices ( transitionMatrix . getRowCount ( ) ,  false ) ;  
		
	
		
			
				                for  ( auto  const &  stateChoicesPair  :  mec )  {  
		
	
		
			
				                    mecStates . set ( stateChoicesPair . first ) ;  
		
	
		
			
				                    for  ( auto  const &  choice  :  stateChoicesPair . second )  {  
		
	
		
			
				                        mecChoices . set ( choice ) ;  
		
	
		
			
				                    }  
		
	
		
			
				                }  
		
	
		
			
				                storm : : storage : : BitVector  markovianMecStates  =  mecStates  &  markovianStates ;  
		
	
		
			
				                storm : : storage : : BitVector  probabilisticMecStates  =  mecStates  &  ~ markovianStates ;  
		
	
		
			
				                storm : : storage : : BitVector  probabilisticMecChoices  =  transitionMatrix . getRowFilter ( probabilisticMecStates )  &  mecChoices ;  
		
	
		
			
				                STORM_LOG_THROW ( ! markovianMecStates . empty ( ) ,  storm : : exceptions : : InvalidOperationException ,  " Markov Automaton has Zeno behavior. Computation of Long Run Average values not supported. " ) ;  
		
	
		
			
				                 
		
	
		
			
				                // Get the uniformization rate
  
		
	
		
			
				                 
		
	
		
			
				                ValueType  uniformizationRate  =  storm : : utility : : vector : : max_if ( exitRateVector ,  markovianMecStates ) ;  
		
	
		
			
				                // To ensure that the model is aperiodic, we need to make sure that every Markovian state gets a self loop.
  
		
	
		
			
				                // Hence, we increase the uniformization rate a little.
  
		
	
		
			
				                uniformizationRate  + =  storm : : utility : : one < ValueType > ( ) ;  // Todo: try other values such as *=1.01
  
		
	
		
			
				
 
		
	
		
			
				                // Get the transitions of the submodel, that is
  
		
	
		
			
				                // * a matrix aMarkovian with all (uniformized) transitions from Markovian mec states to all Markovian mec states.
  
		
	
		
			
				                // * a matrix aMarkovianToProbabilistic with all (uniformized) transitions from Markovian mec states to all probabilistic mec states.
  
		
	
		
			
				                // * a matrix aProbabilistic with all transitions from probabilistic mec states to other probabilistic mec states.
  
		
	
		
			
				                // * a matrix aProbabilisticToMarkovian with all  transitions from probabilistic mec states to all Markovian mec states.
  
		
	
		
			
				                typename  storm : : storage : : SparseMatrix < ValueType >  aMarkovian  =  transitionMatrix . getSubmatrix ( true ,  markovianMecStates ,  markovianMecStates ,  true ) ;  
		
	
		
			
				                typename  storm : : storage : : SparseMatrix < ValueType >  aMarkovianToProbabilistic  =  transitionMatrix . getSubmatrix ( true ,  markovianMecStates ,  probabilisticMecStates ) ;  
		
	
		
			
				                typename  storm : : storage : : SparseMatrix < ValueType >  aProbabilistic  =  transitionMatrix . getSubmatrix ( false ,  probabilisticMecChoices ,  probabilisticMecStates ) ;  
		
	
		
			
				                typename  storm : : storage : : SparseMatrix < ValueType >  aProbabilisticToMarkovian  =  transitionMatrix . getSubmatrix ( false ,  probabilisticMecChoices ,  markovianMecStates ) ;  
		
	
		
			
				                // The matrices with transitions from Markovian states need to be uniformized.
  
		
	
		
			
				                uint_fast64_t  subState  =  0 ;  
		
	
		
			
				                for  ( auto  state  :  markovianMecStates )  {  
		
	
		
			
				                    ValueType  uniformizationFactor  =  exitRateVector [ state ]  /  uniformizationRate ;  
		
	
		
			
				                    for  ( auto &  entry  :  aMarkovianToProbabilistic . getRow ( subState ) )  {  
		
	
		
			
				                        entry . setValue ( entry . getValue ( )  *  uniformizationFactor ) ;  
		
	
		
			
				                    }  
		
	
		
			
				                    for  ( auto &  entry  :  aMarkovian . getRow ( subState ) )  {  
		
	
		
			
				                        if  ( entry . getColumn ( )  = =  subState )  {  
		
	
		
			
				                            entry . setValue ( storm : : utility : : one < ValueType > ( )  -  uniformizationFactor  *  ( storm : : utility : : one < ValueType > ( )  -  entry . getValue ( ) ) ) ;  
		
	
		
			
				                        }  else  {  
		
	
		
			
				                            entry . setValue ( entry . getValue ( )  *  uniformizationFactor ) ;  
		
	
		
			
				                        }  
		
	
		
			
				                    }  
		
	
		
			
				                    + + subState ;  
		
	
		
			
				                }  
		
	
		
			
				
 
		
	
		
			
				                // Compute the rewards obtained in a single uniformization step
  
		
	
		
			
				                 
		
	
		
			
				                std : : vector < ValueType >  markovianChoiceRewards ;  
		
	
		
			
				                markovianChoiceRewards . reserve ( aMarkovian . getRowCount ( ) ) ;  
		
	
		
			
				                for  ( auto  const &  state  :  markovianMecStates )  {  
		
	
		
			
				                    ValueType  stateRewardScalingFactor  =  storm : : utility : : one < ValueType > ( )  /  uniformizationRate ;  
		
	
		
			
				                    ValueType  actionRewardScalingFactor  =  exitRateVector [ state ]  /  uniformizationRate ;  
		
	
		
			
				                    assert ( transitionMatrix . getRowGroupSize ( state )  = =  1 ) ;  
		
	
		
			
				                    uint_fast64_t  choice  =  transitionMatrix . getRowGroupIndices ( ) [ state ] ;  
		
	
		
			
				                    markovianChoiceRewards . push_back ( rewardModel . getTotalStateActionReward ( state ,  choice ,  transitionMatrix ,  stateRewardScalingFactor ,  actionRewardScalingFactor ) ) ;  
		
	
		
			
				                }  
		
	
		
			
				                 
		
	
		
			
				                std : : vector < ValueType >  probabilisticChoiceRewards ;  
		
	
		
			
				                probabilisticChoiceRewards . reserve ( aProbabilistic . getRowCount ( ) ) ;  
		
	
		
			
				                for  ( auto  const &  state  :  probabilisticMecStates )  {  
		
	
		
			
				                    uint_fast64_t  groupStart  =  transitionMatrix . getRowGroupIndices ( ) [ state ] ;  
		
	
		
			
				                    uint_fast64_t  groupEnd  =  transitionMatrix . getRowGroupIndices ( ) [ state  +  1 ] ;  
		
	
		
			
				                    for  ( uint_fast64_t  choice  =  probabilisticMecChoices . getNextSetIndex ( groupStart ) ;  choice  <  groupEnd ;  choice  =  probabilisticMecChoices . getNextSetIndex ( choice  +  1 ) )  {  
		
	
		
			
				                        probabilisticChoiceRewards . push_back ( rewardModel . getTotalStateActionReward ( state ,  choice ,  transitionMatrix ,  storm : : utility : : zero < ValueType > ( ) ) ) ;  
		
	
		
			
				                    }  
		
	
		
			
				                }  
		
	
		
			
				                 
		
	
		
			
				                // start the iterations
  
		
	
		
			
				                 
		
	
		
			
				                ValueType  precision  =  storm : : utility : : convertNumber < ValueType > ( storm : : settings : : getModule < storm : : settings : : modules : : GeneralSettings > ( ) . getPrecision ( ) )  /  uniformizationRate ;  
		
	
		
			
				                std : : vector < ValueType >  v ( aMarkovian . getRowCount ( ) ,  storm : : utility : : zero < ValueType > ( ) ) ;  
		
	
		
			
				                std : : vector < ValueType >  vOld  =  v ;  
		
	
		
			
				                std : : vector < ValueType >  w  =  v ;  
		
	
		
			
				                std : : vector < ValueType >  x ( aProbabilistic . getRowGroupCount ( ) ,  storm : : utility : : zero < ValueType > ( ) ) ;  
		
	
		
			
				                std : : vector < ValueType >  xPrime  =  x ;  
		
	
		
			
				                std : : vector < ValueType >  b  =  probabilisticChoiceRewards ;  
		
	
		
			
				                auto  solver  =  minMaxLinearEquationSolverFactory . create ( std : : move ( aProbabilistic ) ) ;  
		
	
		
			
				                solver - > setCachingEnabled ( true ) ;  
		
	
		
			
				                 
		
	
		
			
				                while  ( true )  {  
		
	
		
			
				
 
		
	
		
			
				                    // Compute the expected total rewards for the probabilistic states
  
		
	
		
			
				                    solver - > solveEquations ( dir ,  x ,  b ) ;  
		
	
		
			
				                     
		
	
		
			
				                    // now compute the values for the markovian states
  
		
	
		
			
				                    for  ( uint_fast64_t  row  =  0 ;  row  <  aMarkovian . getRowCount ( ) ;  + + row )  {  
		
	
		
			
				                        v [ row ]  =  markovianChoiceRewards [ row ]  +  aMarkovianToProbabilistic . multiplyRowWithVector ( row ,  x )  +  aMarkovian . multiplyRowWithVector ( row ,  w ) ;  
		
	
		
			
				                    }  
		
	
		
			
				
 
		
	
		
			
				                    // Check for convergence
  
		
	
		
			
				                    auto  vIt  =  v . begin ( ) ;  
		
	
		
			
				                    auto  vEndIt  =  v . end ( ) ;  
		
	
		
			
				                    auto  vOldIt  =  vOld . begin ( ) ;  
		
	
		
			
				                    ValueType  maxDiff  =  * vIt  -  * vOldIt ;  
		
	
		
			
				                    ValueType  minDiff  =  maxDiff ;  
		
	
		
			
				                    for  ( + + vIt ,  + + vOldIt ;  vIt  ! =  vEndIt ;  + + vIt ,  + + vOldIt )  {  
		
	
		
			
				                        ValueType  diff  =  * vIt  -  * vOldIt ;  
		
	
		
			
				                        maxDiff  =  std : : max ( maxDiff ,  diff ) ;  
		
	
		
			
				                        minDiff  =  std : : min ( minDiff ,  diff ) ;  
		
	
		
			
				                    }  
		
	
		
			
				                    if  ( maxDiff  -  minDiff  <  precision )  {  
		
	
		
			
				                        break ;  
		
	
		
			
				                    }  
		
	
		
			
				                     
		
	
		
			
				                    // update the rhs of the MinMax equation system
  
		
	
		
			
				                    ValueType  referenceValue  =  v . front ( ) ;  
		
	
		
			
				                    storm : : utility : : vector : : applyPointwise < ValueType ,  ValueType > ( v ,  w ,  [ & referenceValue ]  ( ValueType  const &  v_i )  - >  ValueType  {  return  v_i  -  referenceValue ;  } ) ;  
		
	
		
			
				                    aProbabilisticToMarkovian . multiplyWithVector ( w ,  b ) ;  
		
	
		
			
				                    storm : : utility : : vector : : addVectors ( b ,  probabilisticChoiceRewards ,  b ) ;  
		
	
		
			
				
 
		
	
		
			
				                    vOld  =  v ;  
		
	
		
			
				                }  
		
	
		
			
				                return  v . front ( )  *  uniformizationRate ;  
		
	
		
			
				             
		
	
		
			
				            }  
		
	
		
			
				                         
		
	
		
			
				            template  std : : vector < double >  SparseMarkovAutomatonCslHelper : : computeBoundedUntilProbabilities ( OptimizationDirection  dir ,  storm : : storage : : SparseMatrix < double >  const &  transitionMatrix ,  std : : vector < double >  const &  exitRateVector ,  storm : : storage : : BitVector  const &  markovianStates ,  storm : : storage : : BitVector  const &  psiStates ,  std : : pair < double ,  double >  const &  boundsPair ,  storm : : solver : : MinMaxLinearEquationSolverFactory < double >  const &  minMaxLinearEquationSolverFactory ) ;             template  std : : vector < double >  SparseMarkovAutomatonCslHelper : : computeBoundedUntilProbabilities ( OptimizationDirection  dir ,  storm : : storage : : SparseMatrix < double >  const &  transitionMatrix ,  std : : vector < double >  const &  exitRateVector ,  storm : : storage : : BitVector  const &  markovianStates ,  storm : : storage : : BitVector  const &  psiStates ,  std : : pair < double ,  double >  const &  boundsPair ,  storm : : solver : : MinMaxLinearEquationSolverFactory < double >  const &  minMaxLinearEquationSolverFactory ) ;  
		
	
		
			
				                                 
		
	
	
		
			
				
					
					
					
						
							 
					
				 
				@ -482,17 +612,19 @@ namespace storm { 
		
	
		
			
				                                 
		
	
		
			
				            template  std : : vector < double >  SparseMarkovAutomatonCslHelper : : computeReachabilityRewards ( OptimizationDirection  dir ,  storm : : storage : : SparseMatrix < double >  const &  transitionMatrix ,  storm : : storage : : SparseMatrix < double >  const &  backwardTransitions ,  std : : vector < double >  const &  exitRateVector ,  storm : : storage : : BitVector  const &  markovianStates ,  storm : : models : : sparse : : StandardRewardModel < double >  const &  rewardModel ,  storm : : storage : : BitVector  const &  psiStates ,  storm : : solver : : MinMaxLinearEquationSolverFactory < double >  const &  minMaxLinearEquationSolverFactory ) ;             template  std : : vector < double >  SparseMarkovAutomatonCslHelper : : computeReachabilityRewards ( OptimizationDirection  dir ,  storm : : storage : : SparseMatrix < double >  const &  transitionMatrix ,  storm : : storage : : SparseMatrix < double >  const &  backwardTransitions ,  std : : vector < double >  const &  exitRateVector ,  storm : : storage : : BitVector  const &  markovianStates ,  storm : : models : : sparse : : StandardRewardModel < double >  const &  rewardModel ,  storm : : storage : : BitVector  const &  psiStates ,  storm : : solver : : MinMaxLinearEquationSolverFactory < double >  const &  minMaxLinearEquationSolverFactory ) ;  
		
	
		
			
				
 
		
	
		
			
				            template  std : : vector < double >  SparseMarkovAutomatonCslHelper : : computeLongRunAverageProbabilities ( OptimizationDirection  dir ,  storm : : storage : : SparseMatrix < double >  const &  transitionMatrix ,  storm : : storage : : SparseMatrix < double >  const &  backwardTransitions ,  std : : vector < double >  const &  exitRateVector ,  storm : : storage : : BitVector  const &  markovianStates ,  storm : : storage : : BitVector  const &  psiStates ,  storm : : solver : : MinMaxLinearEquationSolverFactory < double >  const &  minMaxLinearEquationSolverFactory ) ;  
		
	
		
			
				                 
		
	
		
			
				            template  std : : vector < double >  SparseMarkovAutomatonCslHelper : : computeLongRunAverageRewards ( OptimizationDirection  dir ,  storm : : storage : : SparseMatrix < double >  const &  transitionMatrix ,  storm : : storage : : SparseMatrix < double >  const &  backwardTransitions ,  std : : vector < double >  const &  exitRateVector ,  storm : : storage : : BitVector  const &  markovianStates ,  storm : : models : : sparse : : StandardRewardModel < double >  const &  rewardModel ,  storm : : solver : : MinMaxLinearEquationSolverFactory < double >  const &  minMaxLinearEquationSolverFactory ) ;  
		
	
		
			
				            template  std : : vector < double >  SparseMarkovAutomatonCslHelper : : computeLongRunAverageProbabilities ( OptimizationDirection  dir ,  storm : : storage : : SparseMatrix < double >  const &  transitionMatrix ,  storm : : storage : : SparseMatrix < double >  const &  backwardTransitions ,  std : : vector < double >  const &  exitRateVector ,  storm : : storage : : BitVector  const &  markovianStates ,  storm : : storage : : BitVector  const &  psiStates ,  storm : : solver : : MinMaxLinearEquationSolverFactory < double >  const &  minMaxLinearEquationSolverFactory ,  bool  useLpBasedTechnique ) ;  
		
	
		
			
				                                 
		
	
		
			
				            template  std : : vector < double >  SparseMarkovAutomatonCslHelper : : computeLongRunAverageRewards ( OptimizationDirection  dir ,  storm : : storage : : SparseMatrix < double >  const &  transitionMatrix ,  storm : : storage : : SparseMatrix < double >  const &  backwardTransitions ,  std : : vector < double >  const &  exitRateVector ,  storm : : storage : : BitVector  const &  markovianStates ,  std : : vector < double >  const &  totalActionRewards ,  storm : : solver : : MinMaxLinearEquationSolverFactory < double >  const &  minMaxLinearEquationSolverFactory ) ;  
		
	
		
			
				            template  std : : vector < double >  SparseMarkovAutomatonCslHelper : : computeLongRunAverageRewards ( OptimizationDirection  dir ,  storm : : storage : : SparseMatrix < double >  const &  transitionMatrix ,  storm : : storage : : SparseMatrix < double >  const &  backwardTransitions ,  std : : vector < double >  const &  exitRateVector ,  storm : : storage : : BitVector  const &  markovianStates ,  storm : : models : : sparse : : StandardRewardModel < double >  const &  rewardModel ,  storm : : solver : : MinMaxLinearEquationSolverFactory < double >  const &  minMaxLinearEquationSolverFactory ,  bool  useLpBasedTechnique ) ;  
		
	
		
			
				                         
		
	
		
			
				            template  std : : vector < double >  SparseMarkovAutomatonCslHelper : : computeReachabilityTimes ( OptimizationDirection  dir ,  storm : : storage : : SparseMatrix < double >  const &  transitionMatrix ,  storm : : storage : : SparseMatrix < double >  const &  backwardTransitions ,  std : : vector < double >  const &  exitRateVector ,  storm : : storage : : BitVector  const &  markovianStates ,  storm : : storage : : BitVector  const &  psiStates ,  storm : : solver : : MinMaxLinearEquationSolverFactory < double >  const &  minMaxLinearEquationSolverFactory ) ;             template  std : : vector < double >  SparseMarkovAutomatonCslHelper : : computeReachabilityTimes ( OptimizationDirection  dir ,  storm : : storage : : SparseMatrix < double >  const &  transitionMatrix ,  storm : : storage : : SparseMatrix < double >  const &  backwardTransitions ,  std : : vector < double >  const &  exitRateVector ,  storm : : storage : : BitVector  const &  markovianStates ,  storm : : storage : : BitVector  const &  psiStates ,  storm : : solver : : MinMaxLinearEquationSolverFactory < double >  const &  minMaxLinearEquationSolverFactory ) ;  
		
	
		
			
				                                 
		
	
		
			
				            template  void  SparseMarkovAutomatonCslHelper : : computeBoundedReachabilityProbabilities ( OptimizationDirection  dir ,  storm : : storage : : SparseMatrix < double >  const &  transitionMatrix ,  std : : vector < double >  const &  exitRates ,  storm : : storage : : BitVector  const &  goalStates ,  storm : : storage : : BitVector  const &  markovianNonGoalStates ,  storm : : storage : : BitVector  const &  probabilisticNonGoalStates ,  std : : vector < double > &  markovianNonGoalValues ,  std : : vector < double > &  probabilisticNonGoalValues ,  double  delta ,  uint_fast64_t  numberOfSteps ,  storm : : solver : : MinMaxLinearEquationSolverFactory < double >  const &  minMaxLinearEquationSolverFactory ) ;             template  void  SparseMarkovAutomatonCslHelper : : computeBoundedReachabilityProbabilities ( OptimizationDirection  dir ,  storm : : storage : : SparseMatrix < double >  const &  transitionMatrix ,  std : : vector < double >  const &  exitRates ,  storm : : storage : : BitVector  const &  goalStates ,  storm : : storage : : BitVector  const &  markovianNonGoalStates ,  storm : : storage : : BitVector  const &  probabilisticNonGoalStates ,  std : : vector < double > &  markovianNonGoalValues ,  std : : vector < double > &  probabilisticNonGoalValues ,  double  delta ,  uint_fast64_t  numberOfSteps ,  storm : : solver : : MinMaxLinearEquationSolverFactory < double >  const &  minMaxLinearEquationSolverFactory ) ;  
		
	
		
			
				                                 
		
	
		
			
				            template  double  SparseMarkovAutomatonCslHelper : : computeLraForMaximalEndComponent ( OptimizationDirection  dir ,  storm : : storage : : SparseMatrix < double >  const &  transitionMatrix ,  std : : vector < double >  const &  exitRateVector ,  storm : : storage : : BitVector  const &  markovianStates ,  std : : vector < double >  const &  totalActionRewards ,  storm : : storage : : MaximalEndComponent  const &  mec ) ;  
		
	
		
			
				            template  double  SparseMarkovAutomatonCslHelper : : computeLraForMaximalEndComponent ( OptimizationDirection  dir ,  storm : : storage : : SparseMatrix < double >  const &  transitionMatrix ,  std : : vector < double >  const &  exitRateVector ,  storm : : storage : : BitVector  const &  markovianStates ,  storm : : models : : sparse : : StandardRewardModel < double >  const &  rewardModel ,  storm : : storage : : MaximalEndComponent  const &  mec ,  storm : : solver : : MinMaxLinearEquationSolverFactory < double >  const &  minMaxLinearEquationSolverFactory ,  bool  useLpBasedTechnique ) ;  
		
	
		
			
				                 
		
	
		
			
				            template  double  SparseMarkovAutomatonCslHelper : : computeLraForMaximalEndComponentLP ( OptimizationDirection  dir ,  storm : : storage : : SparseMatrix < double >  const &  transitionMatrix ,  std : : vector < double >  const &  exitRateVector ,  storm : : storage : : BitVector  const &  markovianStates ,  storm : : models : : sparse : : StandardRewardModel < double >  const &  rewardModel ,  storm : : storage : : MaximalEndComponent  const &  mec ) ;  
		
	
		
			
				             
		
	
		
			
				            template  double  SparseMarkovAutomatonCslHelper : : computeLraForMaximalEndComponentVI ( OptimizationDirection  dir ,  storm : : storage : : SparseMatrix < double >  const &  transitionMatrix ,  std : : vector < double >  const &  exitRateVector ,  storm : : storage : : BitVector  const &  markovianStates ,  storm : : models : : sparse : : StandardRewardModel < double >  const &  rewardModel ,  storm : : storage : : MaximalEndComponent  const &  mec ,  storm : : solver : : MinMaxLinearEquationSolverFactory < double >  const &  minMaxLinearEquationSolverFactory ) ;  
		
	
		
			
				                         
		
	
		
			
				            template  std : : vector < storm : : RationalNumber >  SparseMarkovAutomatonCslHelper : : computeBoundedUntilProbabilities ( OptimizationDirection  dir ,  storm : : storage : : SparseMatrix < storm : : RationalNumber >  const &  transitionMatrix ,  std : : vector < storm : : RationalNumber >  const &  exitRateVector ,  storm : : storage : : BitVector  const &  markovianStates ,  storm : : storage : : BitVector  const &  psiStates ,  std : : pair < double ,  double >  const &  boundsPair ,  storm : : solver : : MinMaxLinearEquationSolverFactory < storm : : RationalNumber >  const &  minMaxLinearEquationSolverFactory ) ;             template  std : : vector < storm : : RationalNumber >  SparseMarkovAutomatonCslHelper : : computeBoundedUntilProbabilities ( OptimizationDirection  dir ,  storm : : storage : : SparseMatrix < storm : : RationalNumber >  const &  transitionMatrix ,  std : : vector < storm : : RationalNumber >  const &  exitRateVector ,  storm : : storage : : BitVector  const &  markovianStates ,  storm : : storage : : BitVector  const &  psiStates ,  std : : pair < double ,  double >  const &  boundsPair ,  storm : : solver : : MinMaxLinearEquationSolverFactory < storm : : RationalNumber >  const &  minMaxLinearEquationSolverFactory ) ;  
		
	
		
			
				                                 
		
	
	
		
			
				
					
					
					
						
							 
					
				 
				@ -500,17 +632,19 @@ namespace storm { 
		
	
		
			
				                                 
		
	
		
			
				            template  std : : vector < storm : : RationalNumber >  SparseMarkovAutomatonCslHelper : : computeReachabilityRewards ( OptimizationDirection  dir ,  storm : : storage : : SparseMatrix < storm : : RationalNumber >  const &  transitionMatrix ,  storm : : storage : : SparseMatrix < storm : : RationalNumber >  const &  backwardTransitions ,  std : : vector < storm : : RationalNumber >  const &  exitRateVector ,  storm : : storage : : BitVector  const &  markovianStates ,  storm : : models : : sparse : : StandardRewardModel < storm : : RationalNumber >  const &  rewardModel ,  storm : : storage : : BitVector  const &  psiStates ,  storm : : solver : : MinMaxLinearEquationSolverFactory < storm : : RationalNumber >  const &  minMaxLinearEquationSolverFactory ) ;             template  std : : vector < storm : : RationalNumber >  SparseMarkovAutomatonCslHelper : : computeReachabilityRewards ( OptimizationDirection  dir ,  storm : : storage : : SparseMatrix < storm : : RationalNumber >  const &  transitionMatrix ,  storm : : storage : : SparseMatrix < storm : : RationalNumber >  const &  backwardTransitions ,  std : : vector < storm : : RationalNumber >  const &  exitRateVector ,  storm : : storage : : BitVector  const &  markovianStates ,  storm : : models : : sparse : : StandardRewardModel < storm : : RationalNumber >  const &  rewardModel ,  storm : : storage : : BitVector  const &  psiStates ,  storm : : solver : : MinMaxLinearEquationSolverFactory < storm : : RationalNumber >  const &  minMaxLinearEquationSolverFactory ) ;  
		
	
		
			
				
 
		
	
		
			
				            template  std : : vector < storm : : RationalNumber >  SparseMarkovAutomatonCslHelper : : computeLongRunAverageProbabilities ( OptimizationDirection  dir ,  storm : : storage : : SparseMatrix < storm : : RationalNumber >  const &  transitionMatrix ,  storm : : storage : : SparseMatrix < storm : : RationalNumber >  const &  backwardTransitions ,  std : : vector < storm : : RationalNumber >  const &  exitRateVector ,  storm : : storage : : BitVector  const &  markovianStates ,  storm : : storage : : BitVector  const &  psiStates ,  storm : : solver : : MinMaxLinearEquationSolverFactory < storm : : RationalNumber >  const &  minMaxLinearEquationSolverFactory ) ;  
		
	
		
			
				            template  std : : vector < storm : : RationalNumber >  SparseMarkovAutomatonCslHelper : : computeLongRunAverageProbabilities ( OptimizationDirection  dir ,  storm : : storage : : SparseMatrix < storm : : RationalNumber >  const &  transitionMatrix ,  storm : : storage : : SparseMatrix < storm : : RationalNumber >  const &  backwardTransitions ,  std : : vector < storm : : RationalNumber >  const &  exitRateVector ,  storm : : storage : : BitVector  const &  markovianStates ,  storm : : storage : : BitVector  const &  psiStates ,  storm : : solver : : MinMaxLinearEquationSolverFactory < storm : : RationalNumber >  const &  minMaxLinearEquationSolverFactory ,  bool  useLpBasedTechnique ) ;  
		
	
		
			
				                         
		
	
		
			
				            template  std : : vector < storm : : RationalNumber >  SparseMarkovAutomatonCslHelper : : computeLongRunAverageRewards ( OptimizationDirection  dir ,  storm : : storage : : SparseMatrix < storm : : RationalNumber >  const &  transitionMatrix ,  storm : : storage : : SparseMatrix < storm : : RationalNumber >  const &  backwardTransitions ,  std : : vector < storm : : RationalNumber >  const &  exitRateVector ,  storm : : storage : : BitVector  const &  markovianStates ,  storm : : models : : sparse : : StandardRewardModel < storm : : RationalNumber >  const &  rewardModel ,  storm : : solver : : MinMaxLinearEquationSolverFactory < storm : : RationalNumber >  const &  minMaxLinearEquationSolverFactory ) ;  
		
	
		
			
				             
		
	
		
			
				            template  std : : vector < storm : : RationalNumber >  SparseMarkovAutomatonCslHelper : : computeLongRunAverageRewards ( OptimizationDirection  dir ,  storm : : storage : : SparseMatrix < storm : : RationalNumber >  const &  transitionMatrix ,  storm : : storage : : SparseMatrix < storm : : RationalNumber >  const &  backwardTransitions ,  std : : vector < storm : : RationalNumber >  const &  exitRateVector ,  storm : : storage : : BitVector  const &  markovianStates ,  std : : vector < storm : : RationalNumber >  const &  totalActionRewards ,  storm : : solver : : MinMaxLinearEquationSolverFactory < storm : : RationalNumber >  const &  minMaxLinearEquationSolverFactory ) ;  
		
	
		
			
				            template  std : : vector < storm : : RationalNumber >  SparseMarkovAutomatonCslHelper : : computeLongRunAverageRewards ( OptimizationDirection  dir ,  storm : : storage : : SparseMatrix < storm : : RationalNumber >  const &  transitionMatrix ,  storm : : storage : : SparseMatrix < storm : : RationalNumber >  const &  backwardTransitions ,  std : : vector < storm : : RationalNumber >  const &  exitRateVector ,  storm : : storage : : BitVector  const &  markovianStates ,  storm : : models : : sparse : : StandardRewardModel < storm : : RationalNumber >  const &  rewardModel ,  storm : : solver : : MinMaxLinearEquationSolverFactory < storm : : RationalNumber >  const &  minMaxLinearEquationSolverFactory ,  bool  useLpBasedTechnique ) ;  
		
	
		
			
				                         
		
	
		
			
				            template  std : : vector < storm : : RationalNumber >  SparseMarkovAutomatonCslHelper : : computeReachabilityTimes ( OptimizationDirection  dir ,  storm : : storage : : SparseMatrix < storm : : RationalNumber >  const &  transitionMatrix ,  storm : : storage : : SparseMatrix < storm : : RationalNumber >  const &  backwardTransitions ,  std : : vector < storm : : RationalNumber >  const &  exitRateVector ,  storm : : storage : : BitVector  const &  markovianStates ,  storm : : storage : : BitVector  const &  psiStates ,  storm : : solver : : MinMaxLinearEquationSolverFactory < storm : : RationalNumber >  const &  minMaxLinearEquationSolverFactory ) ;             template  std : : vector < storm : : RationalNumber >  SparseMarkovAutomatonCslHelper : : computeReachabilityTimes ( OptimizationDirection  dir ,  storm : : storage : : SparseMatrix < storm : : RationalNumber >  const &  transitionMatrix ,  storm : : storage : : SparseMatrix < storm : : RationalNumber >  const &  backwardTransitions ,  std : : vector < storm : : RationalNumber >  const &  exitRateVector ,  storm : : storage : : BitVector  const &  markovianStates ,  storm : : storage : : BitVector  const &  psiStates ,  storm : : solver : : MinMaxLinearEquationSolverFactory < storm : : RationalNumber >  const &  minMaxLinearEquationSolverFactory ) ;  
		
	
		
			
				                                 
		
	
		
			
				            template  void  SparseMarkovAutomatonCslHelper : : computeBoundedReachabilityProbabilities ( OptimizationDirection  dir ,  storm : : storage : : SparseMatrix < storm : : RationalNumber >  const &  transitionMatrix ,  std : : vector < storm : : RationalNumber >  const &  exitRates ,  storm : : storage : : BitVector  const &  goalStates ,  storm : : storage : : BitVector  const &  markovianNonGoalStates ,  storm : : storage : : BitVector  const &  probabilisticNonGoalStates ,  std : : vector < storm : : RationalNumber > &  markovianNonGoalValues ,  std : : vector < storm : : RationalNumber > &  probabilisticNonGoalValues ,  storm : : RationalNumber  delta ,  uint_fast64_t  numberOfSteps ,  storm : : solver : : MinMaxLinearEquationSolverFactory < storm : : RationalNumber >  const &  minMaxLinearEquationSolverFactory ) ;             template  void  SparseMarkovAutomatonCslHelper : : computeBoundedReachabilityProbabilities ( OptimizationDirection  dir ,  storm : : storage : : SparseMatrix < storm : : RationalNumber >  const &  transitionMatrix ,  std : : vector < storm : : RationalNumber >  const &  exitRates ,  storm : : storage : : BitVector  const &  goalStates ,  storm : : storage : : BitVector  const &  markovianNonGoalStates ,  storm : : storage : : BitVector  const &  probabilisticNonGoalStates ,  std : : vector < storm : : RationalNumber > &  markovianNonGoalValues ,  std : : vector < storm : : RationalNumber > &  probabilisticNonGoalValues ,  storm : : RationalNumber  delta ,  uint_fast64_t  numberOfSteps ,  storm : : solver : : MinMaxLinearEquationSolverFactory < storm : : RationalNumber >  const &  minMaxLinearEquationSolverFactory ) ;  
		
	
		
			
				                                 
		
	
		
			
				            template  storm : : RationalNumber  SparseMarkovAutomatonCslHelper : : computeLraForMaximalEndComponent ( OptimizationDirection  dir ,  storm : : storage : : SparseMatrix < storm : : RationalNumber >  const &  transitionMatrix ,  std : : vector < storm : : RationalNumber >  const &  exitRateVector ,  storm : : storage : : BitVector  const &  markovianStates ,  std : : vector < storm : : RationalNumber >  const &  totalActionRewards ,   storm : : storage : : MaximalEndComponent  const &  mec ) ;  
		
	
		
			
				            template  storm : : RationalNumber  SparseMarkovAutomatonCslHelper : : computeLraForMaximalEndComponent ( OptimizationDirection  dir ,  storm : : storage : : SparseMatrix < storm : : RationalNumber >  const &  transitionMatrix ,  std : : vector < storm : : RationalNumber >  const &  exitRateVector ,  storm : : storage : : BitVector  const &  markovianStates ,  storm : : models : : sparse : : StandardRewardModel < storm : : RationalNumber >  const &  rewardModel ,  storm : : storage : : MaximalEndComponent  const &  mec ,  storm : : solver : : MinMaxLinearEquationSolverFactory < storm : : RationalNumber >  const &  minMaxLinearEquationSolverFactory ,  bool  useLpBasedTechnique ) ;  
		
	
		
			
				             
		
	
		
			
				            template  storm : : RationalNumber  SparseMarkovAutomatonCslHelper : : computeLraForMaximalEndComponentLP ( OptimizationDirection  dir ,  storm : : storage : : SparseMatrix < storm : : RationalNumber >  const &  transitionMatrix ,  std : : vector < storm : : RationalNumber >  const &  exitRateVector ,  storm : : storage : : BitVector  const &  markovianStates ,  storm : : models : : sparse : : StandardRewardModel < storm : : RationalNumber >  const &  rewardModel ,  storm : : storage : : MaximalEndComponent  const &  mec ) ;  
		
	
		
			
				             
		
	
		
			
				            template  storm : : RationalNumber  SparseMarkovAutomatonCslHelper : : computeLraForMaximalEndComponentVI ( OptimizationDirection  dir ,  storm : : storage : : SparseMatrix < storm : : RationalNumber >  const &  transitionMatrix ,  std : : vector < storm : : RationalNumber >  const &  exitRateVector ,  storm : : storage : : BitVector  const &  markovianStates ,  storm : : models : : sparse : : StandardRewardModel < storm : : RationalNumber >  const &  rewardModel ,  storm : : storage : : MaximalEndComponent  const &  mec ,  storm : : solver : : MinMaxLinearEquationSolverFactory < storm : : RationalNumber >  const &  minMaxLinearEquationSolverFactory ) ;  
		
	
		
			
				                                 
		
	
		
			
				        }         }  
		
	
		
			
				    }     }