@ -44,7 +44,7 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        SparseMdpPrctlModelChecker < SparseMdpModelType > : : SparseMdpPrctlModelChecker ( SparseMdpModelType  const &  model )  :  SparsePropositionalModelChecker < SparseMdpModelType > ( model )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            // Intentionally left empty.
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					          
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        template < typename  SparseMdpModelType >  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        bool  SparseMdpPrctlModelChecker < SparseMdpModelType > : : canHandleStatic ( CheckTask < storm : : logic : : Formula ,  ValueType >  const &  checkTask ,  bool *  requiresSingleInitialState )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            storm : : logic : : Formula  const &  formula  =  checkTask . getFormula ( ) ;  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				
					@ -61,7 +61,7 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            return  false ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					          
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        template < typename  SparseMdpModelType >  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        bool  SparseMdpPrctlModelChecker < SparseMdpModelType > : : canHandle ( CheckTask < storm : : logic : : Formula ,  ValueType >  const &  checkTask )  const  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            bool  requiresSingleInitialState  =  false ;  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				
					@ -71,7 +71,7 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                return  false ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					          
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        template < typename  SparseMdpModelType >  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        std : : unique_ptr < CheckResult >  SparseMdpPrctlModelChecker < SparseMdpModelType > : : computeBoundedUntilProbabilities ( Environment  const &  env ,  CheckTask < storm : : logic : : BoundedUntilFormula ,  ValueType >  const &  checkTask )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            storm : : logic : : BoundedUntilFormula  const &  pathFormula  =  checkTask . getFormula ( ) ;  
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				
					@ -117,7 +117,6 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : unique_ptr < CheckResult >  subResultPointer  =  this - > check ( env ,  pathFormula . getSubformula ( ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            ExplicitQualitativeCheckResult  const &  subResult  =  subResultPointer - > asExplicitQualitativeCheckResult ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            auto  ret  =  storm : : modelchecker : : helper : : SparseMdpPrctlHelper < ValueType > : : computeNextProbabilities ( env ,  storm : : solver : : SolveGoal < ValueType > ( this - > getModel ( ) ,  checkTask ) ,  checkTask . getOptimizationDirection ( ) ,  this - > getModel ( ) . getTransitionMatrix ( ) ,  subResult . getTruthValuesVector ( ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            STORM_LOG_DEBUG ( ret . values ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : unique_ptr < CheckResult >  result ( new  ExplicitQuantitativeCheckResult < ValueType > ( std : : move ( ret . values ) ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            if ( checkTask . isShieldingTask ( ) )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                tempest : : shields : : createShield < ValueType > ( std : : make_shared < storm : : models : : sparse : : Mdp < ValueType > > ( this - > getModel ( ) ) ,  std : : move ( ret . choiceValues ) ,  checkTask . getShieldingExpression ( ) ,  checkTask . getOptimizationDirection ( ) ,  std : : move ( ret . maybeStates ) ,  storm : : storage : : BitVector ( ret . maybeStates . size ( ) ,  true ) ) ;  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				
					@ -126,7 +125,7 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            return  result ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					          
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        template < typename  SparseMdpModelType >  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        std : : unique_ptr < CheckResult >  SparseMdpPrctlModelChecker < SparseMdpModelType > : : computeUntilProbabilities ( Environment  const &  env ,  CheckTask < storm : : logic : : UntilFormula ,  ValueType >  const &  checkTask )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            storm : : logic : : UntilFormula  const &  pathFormula  =  checkTask . getFormula ( ) ;  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				
					@ -136,7 +135,6 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            ExplicitQualitativeCheckResult  const &  leftResult  =  leftResultPointer - > asExplicitQualitativeCheckResult ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            ExplicitQualitativeCheckResult  const &  rightResult  =  rightResultPointer - > asExplicitQualitativeCheckResult ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            auto  ret  =  storm : : modelchecker : : helper : : SparseMdpPrctlHelper < ValueType > : : computeUntilProbabilities ( env ,  storm : : solver : : SolveGoal < ValueType > ( this - > getModel ( ) ,  checkTask ) ,  this - > getModel ( ) . getTransitionMatrix ( ) ,  this - > getModel ( ) . getBackwardTransitions ( ) ,  leftResult . getTruthValuesVector ( ) ,  rightResult . getTruthValuesVector ( ) ,  checkTask . isQualitativeSet ( ) ,  checkTask . isProduceSchedulersSet ( ) ,  checkTask . getHint ( ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            STORM_LOG_DEBUG ( ret . values ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : unique_ptr < CheckResult >  result ( new  ExplicitQuantitativeCheckResult < ValueType > ( std : : move ( ret . values ) ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            if ( checkTask . isShieldingTask ( ) )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                tempest : : shields : : createShield < ValueType > ( std : : make_shared < storm : : models : : sparse : : Mdp < ValueType > > ( this - > getModel ( ) ) ,  std : : move ( ret . choiceValues ) ,  checkTask . getShieldingExpression ( ) ,  checkTask . getOptimizationDirection ( ) ,  std : : move ( ret . maybeStates ) ,  storm : : storage : : BitVector ( ret . maybeStates . size ( ) ,  true ) ) ;  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				
					@ -145,7 +143,7 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            return  result ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					          
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        template < typename  SparseMdpModelType >  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        std : : unique_ptr < CheckResult >  SparseMdpPrctlModelChecker < SparseMdpModelType > : : computeGloballyProbabilities ( Environment  const &  env ,  CheckTask < storm : : logic : : GloballyFormula ,  ValueType >  const &  checkTask )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            storm : : logic : : GloballyFormula  const &  pathFormula  =  checkTask . getFormula ( ) ;  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				
					@ -153,17 +151,15 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : unique_ptr < CheckResult >  subResultPointer  =  this - > check ( env ,  pathFormula . getSubformula ( ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            ExplicitQualitativeCheckResult  const &  subResult  =  subResultPointer - > asExplicitQualitativeCheckResult ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            auto  ret  =  storm : : modelchecker : : helper : : SparseMdpPrctlHelper < ValueType > : : computeGloballyProbabilities ( env ,  storm : : solver : : SolveGoal < ValueType > ( this - > getModel ( ) ,  checkTask ) ,  this - > getModel ( ) . getTransitionMatrix ( ) ,  this - > getModel ( ) . getBackwardTransitions ( ) ,  subResult . getTruthValuesVector ( ) ,  checkTask . isQualitativeSet ( ) ,  checkTask . isProduceSchedulersSet ( ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            STORM_LOG_DEBUG ( ret . values ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : unique_ptr < CheckResult >  result ( new  ExplicitQuantitativeCheckResult < ValueType > ( std : : move ( ret . values ) ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            if ( checkTask . isShieldingTask ( ) )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                STORM_LOG_DEBUG ( ret . choiceValues ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                tempest : : shields : : createShield < ValueType > ( std : : make_shared < storm : : models : : sparse : : Mdp < ValueType > > ( this - > getModel ( ) ) ,  std : : move ( ret . choiceValues ) ,  checkTask . getShieldingExpression ( ) ,  checkTask . getOptimizationDirection ( ) , subResult . getTruthValuesVector ( ) ,  storm : : storage : : BitVector ( ret . maybeStates . size ( ) ,  true ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  else  if  ( checkTask . isProduceSchedulersSet ( )  & &  ret . scheduler )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                result - > asExplicitQuantitativeCheckResult < ValueType > ( ) . setScheduler ( std : : move ( ret . scheduler ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            return  result ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					          
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        template < typename  SparseMdpModelType >  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        std : : unique_ptr < CheckResult >  SparseMdpPrctlModelChecker < SparseMdpModelType > : : computeConditionalProbabilities ( Environment  const &  env ,  CheckTask < storm : : logic : : ConditionalFormula ,  ValueType >  const &  checkTask )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            storm : : logic : : ConditionalFormula  const &  conditionalFormula  =  checkTask . getFormula ( ) ;  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				
					@ -179,7 +175,7 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            return  storm : : modelchecker : : helper : : SparseMdpPrctlHelper < ValueType > : : computeConditionalProbabilities ( env ,  storm : : solver : : SolveGoal < ValueType > ( this - > getModel ( ) ,  checkTask ) ,  this - > getModel ( ) . getTransitionMatrix ( ) ,  this - > getModel ( ) . getBackwardTransitions ( ) ,  leftResult . getTruthValuesVector ( ) ,  rightResult . getTruthValuesVector ( ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					          
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        template < typename  SparseMdpModelType >  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        std : : unique_ptr < CheckResult >  SparseMdpPrctlModelChecker < SparseMdpModelType > : : computeCumulativeRewards ( Environment  const &  env ,  storm : : logic : : RewardMeasureType ,  CheckTask < storm : : logic : : CumulativeRewardFormula ,  ValueType >  const &  checkTask )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            storm : : logic : : CumulativeRewardFormula  const &  rewardPathFormula  =  checkTask . getFormula ( ) ;  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				
					@ -203,7 +199,7 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                return  std : : unique_ptr < CheckResult > ( new  ExplicitQuantitativeCheckResult < ValueType > ( std : : move ( numericResult ) ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					          
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        template < typename  SparseMdpModelType >  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        std : : unique_ptr < CheckResult >  SparseMdpPrctlModelChecker < SparseMdpModelType > : : computeInstantaneousRewards ( Environment  const &  env ,  storm : : logic : : RewardMeasureType ,  CheckTask < storm : : logic : : InstantaneousRewardFormula ,  ValueType >  const &  checkTask )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            storm : : logic : : InstantaneousRewardFormula  const &  rewardPathFormula  =  checkTask . getFormula ( ) ;  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				
					@ -212,7 +208,7 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : vector < ValueType >  numericResult  =  storm : : modelchecker : : helper : : SparseMdpPrctlHelper < ValueType > : : computeInstantaneousRewards ( env ,  storm : : solver : : SolveGoal < ValueType > ( this - > getModel ( ) ,  checkTask ) ,  this - > getModel ( ) . getTransitionMatrix ( ) ,  checkTask . isRewardModelSet ( )  ?  this - > getModel ( ) . getRewardModel ( checkTask . getRewardModel ( ) )  :  this - > getModel ( ) . getRewardModel ( " " ) ,  rewardPathFormula . getBound < uint64_t > ( ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            return  std : : unique_ptr < CheckResult > ( new  ExplicitQuantitativeCheckResult < ValueType > ( std : : move ( numericResult ) ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        template < typename  SparseMdpModelType >  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        std : : unique_ptr < CheckResult >  SparseMdpPrctlModelChecker < SparseMdpModelType > : : computeReachabilityRewards ( Environment  const &  env ,  storm : : logic : : RewardMeasureType ,  CheckTask < storm : : logic : : EventuallyFormula ,  ValueType >  const &  checkTask )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            storm : : logic : : EventuallyFormula  const &  eventuallyFormula  =  checkTask . getFormula ( ) ;  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				
					@ -227,7 +223,7 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            return  result ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					          
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        template < typename  SparseMdpModelType >  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        std : : unique_ptr < CheckResult >  SparseMdpPrctlModelChecker < SparseMdpModelType > : : computeReachabilityTimes ( Environment  const &  env ,  storm : : logic : : RewardMeasureType ,  CheckTask < storm : : logic : : EventuallyFormula ,  ValueType >  const &  checkTask )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            storm : : logic : : EventuallyFormula  const &  eventuallyFormula  =  checkTask . getFormula ( ) ;  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				
					@ -241,7 +237,7 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            return  result ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					          
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        template < typename  SparseMdpModelType >  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        std : : unique_ptr < CheckResult >  SparseMdpPrctlModelChecker < SparseMdpModelType > : : computeTotalRewards ( Environment  const &  env ,  storm : : logic : : RewardMeasureType ,  CheckTask < storm : : logic : : TotalRewardFormula ,  ValueType >  const &  checkTask )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            STORM_LOG_THROW ( checkTask . isOptimizationDirectionSet ( ) ,  storm : : exceptions : : InvalidPropertyException ,  " Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model. " ) ;  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				
					@ -260,18 +256,18 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								STORM_LOG_THROW ( checkTask . isOptimizationDirectionSet ( ) ,  storm : : exceptions : : InvalidPropertyException ,  " Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model. " ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								std : : unique_ptr < CheckResult >  subResultPointer  =  this - > check ( env ,  stateFormula ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								ExplicitQualitativeCheckResult  const &  subResult  =  subResultPointer - > asExplicitQualitativeCheckResult ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								storm : : modelchecker : : helper : : SparseNondeterministicInfiniteHorizonHelper < ValueType >  helper ( this - > getModel ( ) . getTransitionMatrix ( ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            storm : : modelchecker : : helper : : setInformationFromCheckTaskNondeterministic ( helper ,  checkTask ,  this - > getModel ( ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								auto  values  =  helper . computeLongRunAverageProbabilities ( env ,  subResult . getTruthValuesVector ( ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : unique_ptr < CheckResult >  result ( new  ExplicitQuantitativeCheckResult < ValueType > ( std : : move ( values ) ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            if  ( checkTask . isProduceSchedulersSet ( ) )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                result - > asExplicitQuantitativeCheckResult < ValueType > ( ) . setScheduler ( std : : make_unique < storm : : storage : : Scheduler < ValueType > > ( helper . extractScheduler ( ) ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            return  result ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					          
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        template < typename  SparseMdpModelType >  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        std : : unique_ptr < CheckResult >  SparseMdpPrctlModelChecker < SparseMdpModelType > : : computeLongRunAverageRewards ( Environment  const &  env ,  storm : : logic : : RewardMeasureType  rewardMeasureType ,  CheckTask < storm : : logic : : LongRunAverageRewardFormula ,  ValueType >  const &  checkTask )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            STORM_LOG_THROW ( checkTask . isOptimizationDirectionSet ( ) ,  storm : : exceptions : : InvalidPropertyException ,  " Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model. " ) ;  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				
					@ -285,12 +281,12 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            return  result ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					          
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        template < typename  SparseMdpModelType >  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        std : : unique_ptr < CheckResult >  SparseMdpPrctlModelChecker < SparseMdpModelType > : : checkMultiObjectiveFormula ( Environment  const &  env ,  CheckTask < storm : : logic : : MultiObjectiveFormula ,  ValueType >  const &  checkTask )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            return  multiobjective : : performMultiObjectiveModelChecking ( env ,  this - > getModel ( ) ,  checkTask . getFormula ( ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					          
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        template < typename  SparseMdpModelType >  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        std : : unique_ptr < CheckResult >  SparseMdpPrctlModelChecker < SparseMdpModelType > : : checkQuantileFormula ( Environment  const &  env ,  CheckTask < storm : : logic : : QuantileFormula ,  ValueType >  const &  checkTask )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            STORM_LOG_THROW ( checkTask . isOnlyInitialStatesRelevantSet ( ) ,  storm : : exceptions : : InvalidOperationException ,  " Computing quantiles is only supported for the initial states of a model. " ) ;  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				
					@ -299,14 +295,14 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            helper : : rewardbounded : : QuantileHelper < SparseMdpModelType >  qHelper ( this - > getModel ( ) ,  checkTask . getFormula ( ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            auto  res  =  qHelper . computeQuantile ( env ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					              
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            if  ( res . size ( )  = =  1  & &  res . front ( ) . size ( )  = =  1 )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                return  std : : unique_ptr < CheckResult > ( new  ExplicitQuantitativeCheckResult < ValueType > ( initialState ,  std : : move ( res . front ( ) . front ( ) ) ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  else  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                return  std : : unique_ptr < CheckResult > ( new  ExplicitParetoCurveCheckResult < ValueType > ( initialState ,  std : : move ( res ) ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					          
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        template  class  SparseMdpPrctlModelChecker < storm : : models : : sparse : : Mdp < double > > ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					# ifdef STORM_HAVE_CARL