@ -1,7 +1,11 @@ 
			
		
	
		
			
				
					# include  "src/modelchecker/abstraction/GameBasedMdpModelChecker.h" 
  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					# include  "src/models/symbolic/StandardRewardModel.h" 
  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					# include  "src/storage/expressions/ExpressionManager.h" 
  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					# include  "src/abstraction/prism/PrismMenuGameAbstractor.h" 
  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					# include  "src/logic/FragmentSpecification.h" 
  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					# include  "src/utility/macros.h" 
  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -14,7 +18,7 @@ 
			
		
	
		
			
				
					namespace  storm  {  
			
		
	
		
			
				
					    namespace  modelchecker  {  
			
		
	
		
			
				
					        template < storm : : dd : : DdType  Type ,  typename  ValueType >  
			
		
	
		
			
				
					        GameBasedMdpModelChecker < Type ,  ValueType > : : GameBasedMdpModelChecker ( storm : : prism : : Program  const &  program ,  std : : unique_ptr < storm : : utility : : solver : : SmtSolverFactory > & &  smtSolverFactory )  :  originalProgram ( program ) ,  smtSolverFactory ( std : : move ( smtSolverFactory ) )  {  
			
		
	
		
			
				
					        GameBasedMdpModelChecker < Type ,  ValueType > : : GameBasedMdpModelChecker ( storm : : expressions : : ExpressionManager &  expressionManager ,  storm : : prism : : Program  const &  program ,  std : : unique_ptr < storm : : utility : : solver : : SmtSolverFactory > & &  smtSolverFactory )  :  originalProgram ( program ) ,  expressionManager ( expressionManager ) ,  smtSolverFactory ( std : : move ( smtSolverFactory ) )  {  
			
		
	
		
			
				
					            STORM_LOG_THROW ( program . getModelType ( )  = =  storm : : prism : : Program : : ModelType : : DTMC  | |  program . getModelType ( )  = =  storm : : prism : : Program : : ModelType : : MDP ,  storm : : exceptions : : NotSupportedException ,  " Currently only DTMCs/MDPs are supported by the game-based model checker. " ) ;  
			
		
	
		
			
				
					                         
			
		
	
		
			
				
					            // Start by preparing the program. That is, we flatten the modules if there is more than one.
  
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -53,6 +57,13 @@ namespace storm { 
			
		
	
		
			
				
					        std : : unique_ptr < CheckResult >  GameBasedMdpModelChecker < Type ,  ValueType > : : performGameBasedAbstractionRefinement ( CheckTask < storm : : logic : : Formula >  const &  checkTask ,  storm : : expressions : : Expression  const &  constraintExpression ,  storm : : expressions : : Expression  const &  targetStateExpression )  {  
			
		
	
		
			
				
					            STORM_LOG_THROW ( checkTask . isOnlyInitialStatesRelevantSet ( ) ,  storm : : exceptions : : InvalidPropertyException ,  " The game-based abstraction refinement model checker can only compute the result for the initial states. " ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					            std : : vector < storm : : expressions : : Expression >  initialPredicates ;  
			
		
	
		
			
				
					            initialPredicates . push_back ( targetStateExpression ) ;  
			
		
	
		
			
				
					            if  ( ! constraintExpression . isTrue ( )  & &  ! constraintExpression . isFalse ( ) )  {  
			
		
	
		
			
				
					                initialPredicates . push_back ( constraintExpression ) ;  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					            storm : : abstraction : : prism : : PrismMenuGameAbstractor < Type ,  ValueType >  abstractor ( expressionManager ,  preprocessedProgram ,  initialPredicates ,  * smtSolverFactory ) ;  
			
		
	
		
			
				
					             
			
		
	
		
			
				
					            // 1. build initial abstraction based on the the constraint expression (if not 'true') and the target state expression.
  
			
		
	
		
			
				
					             
			
		
	
		
			
				
					            // 2. solve the game wrt. to min/max as given by checkTask and min/max for the abstraction player to obtain two bounds.