@ -45,7 +45,7 @@ namespace storm { 
			
		
	
		
			
				
					        template < typename  SparseMdpModelType >  
			
		
	
		
			
				
					        bool  SparseMdpPrctlModelChecker < SparseMdpModelType > : : canHandleStatic ( CheckTask < storm : : logic : : Formula ,  ValueType >  const &  checkTask ,  bool *  requiresSingleInitialState )  {  
			
		
	
		
			
				
					            storm : : logic : : Formula  const &  formula  =  checkTask . getFormula ( ) ;  
			
		
	
		
			
				
					            if  ( formula . isInFragment ( storm : : logic : : prctlstar ( ) . setLongRunAverageRewardFormulasAllowed ( true ) . setLongRunAverageProbabilitiesAllowed ( true ) . setConditionalProbabilityFormulasAllowed ( true ) . setOnlyEventuallyFormuluasInConditionalFormulasAllowed ( true ) . setTotalRewardFormulasAllowed ( true ) . setRewardBoundedUntilFormulasAllowed ( true ) . setRewardBoundedCumulativeRewardFormulasAllowed ( true ) . setMultiDimensionalBoundedUntilFormulasAllowed ( true ) . setMultiDimensionalCumulativeRewardFormulasAllowed ( true ) . setTimeOperatorsAllowed ( true ) . setReachbilityTimeFormulasAllowed ( true ) . setRewardAccumulationAllowed ( true ) ) )  {  
			
		
	
		
			
				
					            if  ( formula . isInFragment ( storm : : logic : : prctlstar ( ) . setLongRunAverageRewardFormulasAllowed ( true ) . setLongRunAverageProbabilitiesAllowed ( true ) . setConditionalProbabilityFormulasAllowed ( true ) . setOnlyEventuallyFormuluasInConditionalFormulasAllowed ( true ) . setTotalRewardFormulasAllowed ( true ) . setRewardBoundedUntilFormulasAllowed ( true ) . setRewardBoundedCumulativeRewardFormulasAllowed ( true ) . setMultiDimensionalBoundedUntilFormulasAllowed ( true ) . setBoundedGloballyFormulasAllowed ( true ) . set MultiDimensionalCumulativeRewardFormulasAllowed ( true ) . setTimeOperatorsAllowed ( true ) . setReachbilityTimeFormulasAllowed ( true ) . setRewardAccumulationAllowed ( true ) ) )  {  
			
		
	
		
			
				
					                return  true ;  
			
		
	
		
			
				
					            }  else  if  ( checkTask . isOnlyInitialStatesRelevantSet ( ) )  {  
			
		
	
		
			
				
					                auto  multiObjectiveFragment  =  storm : : logic : : multiObjective ( ) . setCumulativeRewardFormulasAllowed ( true ) . setTimeBoundedCumulativeRewardFormulasAllowed ( true ) . setStepBoundedCumulativeRewardFormulasAllowed ( true ) . setRewardBoundedCumulativeRewardFormulasAllowed ( true ) . setTimeBoundedUntilFormulasAllowed ( true ) . setStepBoundedUntilFormulasAllowed ( true ) . setRewardBoundedUntilFormulasAllowed ( true ) . setMultiDimensionalBoundedUntilFormulasAllowed ( true ) . setMultiDimensionalCumulativeRewardFormulasAllowed ( true ) . setRewardAccumulationAllowed ( true ) ;  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -69,6 +69,34 @@ namespace storm { 
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        template < typename  SparseMdpModelType >  
			
		
	
		
			
				
					        std : : unique_ptr < CheckResult >  SparseMdpPrctlModelChecker < SparseMdpModelType > : : computeBoundedGloballyProbabilities ( Environment  const &  env ,  CheckTask < storm : : logic : : BoundedGloballyFormula ,  ValueType >  const &  checkTask )  {  
			
		
	
		
			
				
					            storm : : logic : : BoundedGloballyFormula  const &  pathFormula  =  checkTask . getFormula ( ) ;  
			
		
	
		
			
				
					            STORM_LOG_THROW ( checkTask . isOptimizationDirectionSet ( ) ,  storm : : exceptions : : InvalidPropertyException ,  " Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model. " ) ;  
			
		
	
		
			
				
					            STORM_LOG_THROW ( pathFormula . hasUpperBound ( ) ,  storm : : exceptions : : InvalidPropertyException ,  " Formula needs to have (a single) upper step bound. " ) ;  
			
		
	
		
			
				
					            STORM_LOG_THROW ( pathFormula . hasIntegerLowerBound ( ) ,  storm : : exceptions : : InvalidPropertyException ,  " Formula lower step bound must be discrete/integral. " ) ;  
			
		
	
		
			
				
					            STORM_LOG_THROW ( pathFormula . hasIntegerUpperBound ( ) ,  storm : : exceptions : : InvalidPropertyException ,  " Formula needs to have discrete upper time bound. " ) ;  
			
		
	
		
			
				
					            std : : unique_ptr < CheckResult >  subResultPointer  =  this - > check ( env ,  pathFormula . getSubformula ( ) ) ;  
			
		
	
		
			
				
					            ExplicitQualitativeCheckResult  const &  subResult  =  subResultPointer - > asExplicitQualitativeCheckResult ( ) ;  
			
		
	
		
			
				
					            storm : : modelchecker : : helper : : SparseNondeterministicStepBoundedHorizonHelper < ValueType >  helper ;  
			
		
	
		
			
				
					            std : : vector < ValueType >  numericResult ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					            //This works only with empty vectors, no nullptr
  
			
		
	
		
			
				
					            storm : : storage : : BitVector  resultMaybeStates ;  
			
		
	
		
			
				
					            std : : vector < ValueType >  choiceValues ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					            storm : : storage : : BitVector  allStatesBv  =  storm : : storage : : BitVector ( this - > getModel ( ) . getTransitionMatrix ( ) . getRowGroupCount ( ) ,  true ) ;  
			
		
	
		
			
				
					            numericResult  =  helper . compute ( env ,  storm : : solver : : SolveGoal < ValueType > ( this - > getModel ( ) ,  checkTask ) ,  this - > getModel ( ) . getTransitionMatrix ( ) ,  this - > getModel ( ) . getBackwardTransitions ( ) ,  allStatesBv ,  ~ subResult . getTruthValuesVector ( ) ,  pathFormula . getNonStrictLowerBound < uint64_t > ( ) ,  pathFormula . getNonStrictUpperBound < uint64_t > ( ) ,  resultMaybeStates ,  choiceValues ,  checkTask . getHint ( ) ) ;  
			
		
	
		
			
				
					            // flip directions TODO
  
			
		
	
		
			
				
					            std : : unique_ptr < CheckResult >  result ( new  ExplicitQuantitativeCheckResult < ValueType > ( std : : move ( numericResult ) ) ) ;  
			
		
	
		
			
				
					            if ( checkTask . isShieldingTask ( ) )  {  
			
		
	
		
			
				
					                auto  shield  =  tempest : : shields : : createShield < ValueType > ( std : : make_shared < storm : : models : : sparse : : Mdp < ValueType > > ( this - > getModel ( ) ) ,  std : : move ( choiceValues ) ,  checkTask . getShieldingExpression ( ) ,  checkTask . getOptimizationDirection ( ) ,  std : : move ( resultMaybeStates ) ,  storm : : storage : : BitVector ( resultMaybeStates . size ( ) ,  true ) ) ;  
			
		
	
		
			
				
					                result - > asExplicitQuantitativeCheckResult < ValueType > ( ) . setShield ( std : : move ( shield ) ) ;  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					            return  result ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        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 ( ) ;  
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -103,9 +131,9 @@ namespace storm { 
			
		
	
		
			
				
					                std : : unique_ptr < CheckResult >  result ( new  ExplicitQuantitativeCheckResult < ValueType > ( std : : move ( numericResult ) ) ) ;  
			
		
	
		
			
				
					                if ( checkTask . isShieldingTask ( ) )  {  
			
		
	
		
			
				
					                   auto  shield  =  tempest : : shields : : createShield < ValueType > ( std : : make_shared < storm : : models : : sparse : : Mdp < ValueType > > ( this - > getModel ( ) ) ,  std : : move ( choiceValues ) ,  checkTask . getShieldingExpression ( ) ,  checkTask . getOptimizationDirection ( ) ,  std : : move ( resultMaybeStates ) ,  storm : : storage : : BitVector ( resultMaybeStates . size ( ) ,  true ) ) ;  
			
		
	
		
			
				
					                    result - > asExplicitQuantitativeCheckResult < ValueType > ( ) . setShield ( std : : move ( shield ) ) ;            
			
		
	
		
			
				
					                    result - > asExplicitQuantitativeCheckResult < ValueType > ( ) . setShield ( std : : move ( shield ) ) ;  
			
		
	
		
			
				
					                }  
			
		
	
		
			
				
					                              
			
		
	
		
			
				
					
  
			
		
	
		
			
				
					                return  result ;  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					        }  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -120,7 +148,7 @@ namespace storm { 
			
		
	
		
			
				
					            std : : unique_ptr < CheckResult >  result ( new  ExplicitQuantitativeCheckResult < ValueType > ( std : : move ( ret . values ) ) ) ;  
			
		
	
		
			
				
					            if ( checkTask . isShieldingTask ( ) )  {  
			
		
	
		
			
				
					                auto  shield  =  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 ) ) ;  
			
		
	
		
			
				
					                result - > asExplicitQuantitativeCheckResult < ValueType > ( ) . setShield ( std : : move ( shield ) ) ;            
			
		
	
		
			
				
					                result - > asExplicitQuantitativeCheckResult < ValueType > ( ) . setShield ( std : : move ( shield ) ) ;  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					            if  ( checkTask . isProduceSchedulersSet ( )  & &  ret . scheduler )  {  
			
		
	
		
			
				
					                result - > asExplicitQuantitativeCheckResult < ValueType > ( ) . setScheduler ( std : : move ( ret . scheduler ) ) ;  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -139,10 +167,10 @@ namespace storm { 
			
		
	
		
			
				
					            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 ( ) ) ;  
			
		
	
		
			
				
					            std : : unique_ptr < CheckResult >  result ( new  ExplicitQuantitativeCheckResult < ValueType > ( std : : move ( ret . values ) ) ) ;  
			
		
	
		
			
				
					            if ( checkTask . isShieldingTask ( ) )  {  
			
		
	
		
			
				
					                  
			
		
	
		
			
				
					
  
			
		
	
		
			
				
					                auto  shield  =  tempest : : shields : : createShield < ValueType > ( std : : make_shared < storm : : models : : sparse : : Mdp < ValueType > > ( this - > getModel ( ) ) ,  std : : move ( ret . choiceValues ) ,  checkTask . getShieldingExpression ( ) ,  checkTask . getOptimizationDirection ( ) ,  storm : : storage : : BitVector ( this - > getModel ( ) . getTransitionMatrix ( ) . getRowGroupCount ( ) ,  true ) ,  storm : : storage : : BitVector ( this - > getModel ( ) . getTransitionMatrix ( ) . getRowGroupCount ( ) ,  true ) ) ;  
			
		
	
		
			
				
					                result - > asExplicitQuantitativeCheckResult < ValueType > ( ) . setShield ( std : : move ( shield ) ) ;                       
			
		
	
		
			
				
					            }    
			
		
	
		
			
				
					                result - > asExplicitQuantitativeCheckResult < ValueType > ( ) . setShield ( std : : move ( shield ) ) ;  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					            if  ( checkTask . isProduceSchedulersSet ( )  & &  ret . scheduler )  {  
			
		
	
		
			
				
					                result - > asExplicitQuantitativeCheckResult < ValueType > ( ) . setScheduler ( std : : move ( ret . scheduler ) ) ;  
			
		
	
		
			
				
					            }  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -160,9 +188,9 @@ namespace storm { 
			
		
	
		
			
				
					            std : : unique_ptr < CheckResult >  result ( new  ExplicitQuantitativeCheckResult < ValueType > ( std : : move ( ret . values ) ) ) ;  
			
		
	
		
			
				
					            if ( checkTask . isShieldingTask ( ) )  {  
			
		
	
		
			
				
					                auto  shield  =  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 ) ) ;  
			
		
	
		
			
				
					                result - > asExplicitQuantitativeCheckResult < ValueType > ( ) . setShield ( std : : move ( shield ) ) ;                       
			
		
	
		
			
				
					                  
			
		
	
		
			
				
					            }    
			
		
	
		
			
				
					                result - > asExplicitQuantitativeCheckResult < ValueType > ( ) . setShield ( std : : move ( shield ) ) ;  
			
		
	
		
			
				
					
  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					            if  ( checkTask . isProduceSchedulersSet ( )  & &  ret . scheduler )  {  
			
		
	
		
			
				
					                result - > asExplicitQuantitativeCheckResult < ValueType > ( ) . setScheduler ( std : : move ( ret . scheduler ) ) ;  
			
		
	
		
			
				
					            }  
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -313,7 +341,7 @@ namespace storm { 
			
		
	
		
			
				
					            if ( checkTask . isShieldingTask ( ) )  {  
			
		
	
		
			
				
					                storm : : storage : : BitVector  allStatesBv  =  storm : : storage : : BitVector ( this - > getModel ( ) . getTransitionMatrix ( ) . getRowGroupCount ( ) ,  true ) ;  
			
		
	
		
			
				
					                auto  shield  =  tempest : : shields : : createQuantitativeShield < ValueType > ( std : : make_shared < storm : : models : : sparse : : Mdp < ValueType > > ( this - > getModel ( ) ) ,  helper . getChoiceValues ( ) ,  checkTask . getShieldingExpression ( ) ,  checkTask . getOptimizationDirection ( ) ,  allStatesBv ,  allStatesBv ) ;  
			
		
	
		
			
				
					                result - > asExplicitQuantitativeCheckResult < ValueType > ( ) . setShield ( std : : move ( shield ) ) ;                       
			
		
	
		
			
				
					                result - > asExplicitQuantitativeCheckResult < ValueType > ( ) . setShield ( std : : move ( shield ) ) ;  
			
		
	
		
			
				
					            }  else  if  ( checkTask . isProduceSchedulersSet ( ) )  {  
			
		
	
		
			
				
					                result - > asExplicitQuantitativeCheckResult < ValueType > ( ) . setScheduler ( std : : make_unique < storm : : storage : : Scheduler < ValueType > > ( helper . extractScheduler ( ) ) ) ;  
			
		
	
		
			
				
					            }  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -326,7 +354,7 @@ namespace storm { 
			
		
	
		
			
				
					            auto  rewardModel  =  storm : : utility : : createFilteredRewardModel ( this - > getModel ( ) ,  checkTask ) ;  
			
		
	
		
			
				
					            storm : : modelchecker : : helper : : SparseNondeterministicInfiniteHorizonHelper < ValueType >  helper ( this - > getModel ( ) . getTransitionMatrix ( ) ) ;  
			
		
	
		
			
				
					            storm : : modelchecker : : helper : : setInformationFromCheckTaskNondeterministic ( helper ,  checkTask ,  this - > getModel ( ) ) ;  
			
		
	
		
			
				
								auto  values  =  helper . computeLongRunAverageRewards ( env ,  rewardModel . get ( ) ) ;  
			
		
	
		
			
				
								       auto  values  =  helper . computeLongRunAverageRewards ( env ,  rewardModel . get ( ) ) ;  
			
		
	
		
			
				
					            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 ( ) ) ) ;