@ -119,13 +119,11 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                STORM_LOG_TRACE ( " Model in iteration  "  < <  iterations  < <  "  has  "  < <  abstractModel - > getNumberOfStates ( )  < <  "  states and  "  < <  abstractModel - > getNumberOfTransitions ( )  < <  "  transitions (retrieved in  "  < <  std : : chrono : : duration_cast < std : : chrono : : milliseconds > ( abstractionEnd  -  abstractionStart ) . count ( )  < <  " ms). " ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                // Obtain lower and upper bounds from the abstract model.
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                std : : pair < std : : unique_ptr < CheckResult > ,  std : : unique_ptr < CheckResult > >  bounds  =  computeBounds ( * abstractModel ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                computeBounds ( * abstractModel ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                // Try to derive the final result from the obtained bounds.
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                std : : unique_ptr < CheckResult >  finalResult  =  tryToObtainResultFromBounds ( abstractModel ,  bounds ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                if  ( finalResult )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    result  =  std : : move ( finalResult ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                }  else  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                result  =  tryToObtainResultFromBounds ( abstractModel ,  this - > bounds ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                if  ( ! result )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    auto  refinementStart  =  std : : chrono : : high_resolution_clock : : now ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    this - > refineAbstractModel ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    auto  refinementEnd  =  std : : chrono : : high_resolution_clock : : now ( ) ;  
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				
					@ -161,6 +159,55 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            bool  doSkipQuantitativeSolution  =  skipQuantitativeSolution ( abstractModel ,  qualitativeResults ,  checkTask ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            STORM_LOG_TRACE ( " "  < <  ( doSkipQuantitativeSolution  ?  " Skipping "  :  " Not skipping " )  < <  "  quantitative solution. " ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            // Phase (2): solve quantitatively.
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            if  ( ! doSkipQuantitativeSolution )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                result  =  computeQuantitativeResult ( abstractModel ,  checkTask ,  constraintTargetStates . first ,  constraintTargetStates . second ,  qualitativeResults ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					//                storm::modelchecker::SymbolicQualitativeCheckResult<DdType> initialStateFilter(quotient.getReachableStates(), quotient.getInitialStates());
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					//                result.first->filter(initialStateFilter);
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					//                result.second->filter(initialStateFilter);
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					//                printBoundsInformation(result);
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					//
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					//                // Check whether the answer can be given after the quantitative solution.
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					//                if (checkForResult(abstractModel, true, result.first->asQuantitativeCheckResult<ValueType>(), checkTask)) {
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					//                    result.second = nullptr;
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					//                }
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					//                if (checkForResult(abstractModel, false, result.second->asQuantitativeCheckResult<ValueType>(), checkTask)) {
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					//                    result.first = nullptr;
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					//                }
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  else  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                // In this case, we construct the full results from the qualitative results.
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					             
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            //
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            fullResults  =  result ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					             
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            return  result ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					         
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        template < typename  ModelType >  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        bool  AbstractAbstractionRefinementModelChecker < ModelType > : : skipQuantitativeSolution ( storm : : models : : Model < ValueType >  const &  abstractModel )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            STORM_LOG_THROW ( abstractModel . isSymbolicModel ( ) ,  storm : : exceptions : : NotSupportedException ,  " Expected symbolic model. " ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					             
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            return  skipQuantitativeSolution ( * abstractModel . template  as < storm : : models : : symbolic : : Model < DdType ,  ValueType > > ( ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        template < typename  ModelType >  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        bool  AbstractAbstractionRefinementModelChecker < ModelType > : : skipQuantitativeSolution ( storm : : models : : symbolic : : Model < DdType ,  ValueType >  const &  abstractModel )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            bool  isRewardFormula  =  checkTask - > getFormula ( ) . isEventuallyFormula ( )  & &  checkTask - > getFormula ( ) . asEventuallyFormula ( ) . getContext ( )  = =  storm : : logic : : FormulaContext : : Reward ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            if  ( isRewardFormula )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                if  ( ( abstractModel . getInitialStates ( )  & &  qualitativeResults - > asSymbolicQualitativeResultMinMax < DdType > ( ) . getProb1Min ( ) . getStates ( ) )  ! =  ( abstractModel . getInitialStates ( )  & &  qualitativeResults - > asSymbolicQualitativeResultMinMax < DdType > ( ) . getProb1Max ( ) . getStates ( ) ) )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    return  true ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  else  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                if  ( ( abstractModel . getInitialStates ( )  & &  qualitativeResults - > asSymbolicQualitativeResultMinMax < DdType > ( ) . getProb0Min ( ) . getStates ( ) )  ! =  ( abstractModel . getInitialStates ( )  & &  qualitativeResults - > asSymbolicQualitativeResultMinMax < DdType > ( ) . getProb0Max ( ) . getStates ( ) ) )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    return  true ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                }  else  if  ( ( abstractModel . getInitialStates ( )  & &  qualitativeResults - > asSymbolicQualitativeResultMinMax < DdType > ( ) . getProb1Min ( ) . getStates ( ) )  ! =  ( abstractModel . getInitialStates ( )  & &  qualitativeResults - > asSymbolicQualitativeResultMinMax < DdType > ( ) . getProb1Max ( ) . getStates ( ) ) )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    return  true ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            return  false ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					         
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        template < typename  ModelType >  
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				
					@ -390,7 +437,7 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					         
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        template < typename  ModelType >  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        std : : unique_ptr < CheckResult >  AbstractAbstractionRefinementModelChecker < ModelType > : : tryToObtainResultFromBounds ( std : : shared_ptr < st orm : : models : : Model < ValueType > >  const &  abstractModel ,  std : : pair < std : : unique_ptr < CheckResult > ,  std : : unique_ptr < CheckResult > > &  bounds )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        std : : unique_ptr < CheckResult >  AbstractAbstractionRefinementModelChecker < ModelType > : : tryToObtainResultFromBounds ( storm : : models : : Model < ValueType >  const &  abstractModel ,  std : : pair < std : : unique_ptr < CheckResult > ,  std : : unique_ptr < CheckResult > > &  bounds )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : unique_ptr < CheckResult >  result ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					             
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            if  ( bounds . first  = =  nullptr  | |  bounds . second  = =  nullptr )  {  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				
					@ -408,7 +455,7 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					             
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            if  ( result )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                abstractModel - > printModelInformationToStream ( std : : cout ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                abstractModel . printModelInformationToStream ( std : : cout ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					             
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            return  result ;