@ -72,11 +72,11 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            STORM_LOG_THROW ( this - > canHandle ( formula ) ,  storm : : exceptions : : InvalidArgumentException ,  " Tried to specify a formula that can not be handled. " ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					             
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            this - > hasOnlyLinearFunctions = false ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            this - > isReachProbFunctionComputed = false ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            this - > isResultConstant = false ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            this - > smtSolver = nullptr ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            this - > approximationModel = nullptr ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            this - > samplingModel = nullptr ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            this - > reachProbFunction = nullptr ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					             
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            //Get subformula, target states
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            //Note: canHandle already ensures that the formula has the right shape and that the model has a single initial state.
  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				
					@ -87,28 +87,24 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					             
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            // get a more simple model with a single target state, a single sink state and where states with constant outgoing transitions have been removed
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            // Note: also checks for linear functions and a constant result
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : chrono : : high_resolution_clock : : time_point  timeComputeSimplifiedModelStart  =  std : : chrono : : high_resolution_clock : : now ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            computeSimplifiedModel ( targetStates ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : chrono : : high_resolution_clock : : time_point  timeComputeSimplifiedModelEnd  =  std : : chrono : : high_resolution_clock : : now ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            //now create the model used for Approximation
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : chrono : : high_resolution_clock : : time_point  timeInitApproxModelStart  =  std : : chrono : : high_resolution_clock : : now ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            if ( storm : : settings : : regionSettings ( ) . doApprox ( ) ) {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                this - > approximationModel = std : : make_shared < ApproximationModel > ( * this - > simplifiedModel ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                initializeApproximationModel ( * this - > simplifiedModel ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : chrono : : high_resolution_clock : : time_point  timeInitApproxModelEnd  =  std : : chrono : : high_resolution_clock : : now ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            //now create the model used for Sampling
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : chrono : : high_resolution_clock : : time_point  timeInitSamplingModelStart  =  std : : chrono : : high_resolution_clock : : now ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            if ( storm : : settings : : regionSettings ( ) . doSample ( )  | |  ( storm : : settings : : regionSettings ( ) . getApproxMode ( ) = = storm : : settings : : modules : : RegionSettings : : ApproxMode : : TESTFIRST ) ) {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                this - > samplingModel = std : : make_shared < SamplingModel > ( * this - > simplifiedModel ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                initializeSamplingModel ( * this - > simplifiedModel ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            //Check if the reachability probability function needs to be computed
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            if ( ( storm : : settings : : regionSettings ( ) . getSmtMode ( ) = = storm : : settings : : modules : : RegionSettings : : SmtMode : : FUNCTION )  | |   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    ( storm : : settings : : regionSettings ( ) . getSampleMode ( ) = = storm : : settings : : modules : : RegionSettings : : SampleMode : : EVALUATE ) ) {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                computeReachProbFunction ( * this - > simplifiedModel ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : chrono : : high_resolution_clock : : time_point  timeInitSamplingModelEnd  =  std : : chrono : : high_resolution_clock : : now ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					             
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            //some information for statistics...
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : chrono : : high_resolution_clock : : time_point  timePreprocessingEnd  =  std : : chrono : : high_resolution_clock : : now ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            this - > timePreprocessing =  timePreprocessingEnd  -  timePreprocessingStart ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            this - > timeComputeSimplifiedModel  =  timeComputeSimplifiedModelEnd  -  timeComputeSimplifiedModelStart ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            this - > timeInitSamplingModel  =  timeInitSamplingModelEnd  -  timeInitSamplingModelStart ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            this - > timeInitApproxModel = timeInitApproxModelEnd  -  timeInitApproxModelStart ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            this - > numOfCheckedRegions = 0 ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            this - > numOfRegionsSolvedThroughSampling = 0 ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            this - > numOfRegionsSolvedThroughApproximation = 0 ;  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				
					@ -125,7 +121,7 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					         
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        template < typename  ParametricType ,  typename  ConstantType >  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        void  SparseDtmcRegionModelChecker < ParametricType ,  ConstantType > : : computeSimplifiedModel ( storm : : storage : : BitVector  const &  targetStates ) {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                           
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : chrono : : high_resolution_clock : : time_point   timeComputeSimplifiedModelStart  =  std : : chrono : : high_resolution_clock : : now ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            //Compute the subset of states that have a probability of 0 or 1, respectively and reduce the considered states accordingly.
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : pair < storm : : storage : : BitVector ,  storm : : storage : : BitVector >  statesWithProbability01  =  storm : : utility : : graph : : performProb01 ( this - > model ,  storm : : storage : : BitVector ( this - > model . getNumberOfStates ( ) , true ) ,  targetStates ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            storm : : storage : : BitVector  statesWithProbability0  =  statesWithProbability01 . first ;  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				
					@ -134,8 +130,7 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            // If the initial state is known to have either probability 0 or 1, we can directly set the reachProbFunction.
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            if  ( this - > model . getInitialStates ( ) . isDisjointFrom ( maybeStates ) )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                STORM_LOG_WARN ( " The probability of the initial state is constant (0 or 1) " ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                this - > reachProbFunction  =  statesWithProbability0 . get ( * ( this - > model . getInitialStates ( ) . begin ( ) ) )  ?  storm : : utility : : zero < ParametricType > ( )  :  storm : : utility : : one < ParametricType > ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                this - > isReachProbFunctionComputed = true ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                this - > reachProbFunction  =  std : : make_shared < ParametricType > ( statesWithProbability0 . get ( * ( this - > model . getInitialStates ( ) . begin ( ) ) )  ?  storm : : utility : : zero < ParametricType > ( )  :  storm : : utility : : one < ParametricType > ( ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                this - > isResultConstant = true ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                this - > hasOnlyLinearFunctions = true ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				
					@ -183,7 +178,6 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            subsystem . set ( initialState ,  true ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            STORM_LOG_DEBUG ( " Eliminated  "  < <  subsystem . size ( )  -  subsystem . getNumberOfSetBits ( )  < <  "  of  "  < <  subsystem . size ( )  < <  "  states that had constant outgoing transitions. "  < <  std : : endl ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : cout  < <  " Eliminated  "  < <  subsystem . size ( )  -  subsystem . getNumberOfSetBits ( )  < <  "  of  "  < <  subsystem . size ( )  < <  "  states that had constant outgoing transitions. "  < <  std : : endl ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					             
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            if ( allReachableFunctionsAreConstant ) {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                //Check if this is also the case for the initial state
  
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				
					@ -248,6 +242,58 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            boost : : optional < std : : vector < boost : : container : : flat_set < uint_fast64_t > > >  noChoiceLabeling ;              
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            // the final model
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            this - > simplifiedModel  =  std : : make_shared < storm : : models : : sparse : : Dtmc < ParametricType > > ( matrixBuilder . build ( ) ,  std : : move ( labeling ) ,  std : : move ( noStateRewards ) ,  std : : move ( noTransitionRewards ) ,  std : : move ( noChoiceLabeling ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : chrono : : high_resolution_clock : : time_point  timeComputeSimplifiedModelEnd  =  std : : chrono : : high_resolution_clock : : now ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            this - > timeComputeSimplifiedModel  =  timeComputeSimplifiedModelEnd  -  timeComputeSimplifiedModelStart ;              
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        template < typename  ParametricType ,  typename  ConstantType >  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        void  SparseDtmcRegionModelChecker < ParametricType ,  ConstantType > : : initializeApproximationModel ( storm : : models : : sparse : : Dtmc < ParametricType >  const &  simpleModel )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : chrono : : high_resolution_clock : : time_point  timeInitApproxModelStart  =  std : : chrono : : high_resolution_clock : : now ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            this - > approximationModel = std : : make_shared < ApproximationModel > ( simpleModel ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : chrono : : high_resolution_clock : : time_point  timeInitApproxModelEnd  =  std : : chrono : : high_resolution_clock : : now ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            this - > timeInitApproxModel = timeInitApproxModelEnd  -  timeInitApproxModelStart ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            STORM_LOG_DEBUG ( " Initialized Approximation Model " ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					         
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        template < typename  ParametricType ,  typename  ConstantType >  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        void  SparseDtmcRegionModelChecker < ParametricType ,  ConstantType > : : initializeSamplingModel ( storm : : models : : sparse : : Dtmc < ParametricType >  const &  simpleModel )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : chrono : : high_resolution_clock : : time_point  timeInitSamplingModelStart  =  std : : chrono : : high_resolution_clock : : now ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            this - > samplingModel = std : : make_shared < SamplingModel > ( simpleModel ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : chrono : : high_resolution_clock : : time_point  timeInitSamplingModelEnd  =  std : : chrono : : high_resolution_clock : : now ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            this - > timeInitSamplingModel  =  timeInitSamplingModelEnd  -  timeInitSamplingModelStart ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            STORM_LOG_DEBUG ( " Initialized Sampling Model " ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        template < typename  ParametricType ,  typename  ConstantType >  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        void  SparseDtmcRegionModelChecker < ParametricType ,  ConstantType > : : computeReachProbFunction ( storm : : models : : sparse : : Dtmc < ParametricType >  const &  simpleModel ) {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : chrono : : high_resolution_clock : : time_point  timeComputeReachProbFunctionStart  =  std : : chrono : : high_resolution_clock : : now ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            //get the one step probabilities and the transition matrix of the simplified model without target/sink state
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            //TODO check if this takes long... we could also store the oneSteps while creating the simplified model. Or(?) we keep the matrix the way it is and give the target state one step probability 1.
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            storm : : storage : : SparseMatrix < ParametricType >  backwardTransitions ( simpleModel . getBackwardTransitions ( ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : vector < ParametricType >  oneStepProbabilities ( simpleModel . getNumberOfStates ( ) - 2 ,  storm : : utility : : zero < ParametricType > ( ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            for ( auto  const &  entry  :  backwardTransitions . getRow ( * ( simpleModel . getStates ( " target " ) . begin ( ) ) ) ) {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                if ( entry . getColumn ( ) < oneStepProbabilities . size ( ) ) {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    oneStepProbabilities [ entry . getColumn ( ) ] = entry . getValue ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                }  //else case: only holds for the entry that corresponds to the selfloop on the target state..
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            storm : : storage : : BitVector  maybeStates = ~ ( simpleModel . getStates ( " target " )  |  simpleModel . getStates ( " sink " ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            backwardTransitions = backwardTransitions . getSubmatrix ( false , maybeStates , maybeStates ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            storm : : storage : : SparseMatrix < ParametricType >  forwardTransitions = simpleModel . getTransitionMatrix ( ) . getSubmatrix ( false , maybeStates , maybeStates ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            //now compute the functions using methods from elimination model checker
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            storm : : storage : : BitVector  newInitialStates  =  simpleModel . getInitialStates ( )  %  maybeStates ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            storm : : storage : : BitVector  phiStates ( simpleModel . getNumberOfStates ( ) ,  true ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            boost : : optional < std : : vector < ParametricType > >  noStateRewards ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					             
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : vector < std : : size_t >  statePriorities  =  this - > eliminationModelChecker . getStatePriorities ( forwardTransitions , backwardTransitions , newInitialStates , oneStepProbabilities ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            this - > reachProbFunction = std : : make_shared < ParametricType > ( this - > eliminationModelChecker . computeReachabilityValue ( forwardTransitions ,  oneStepProbabilities ,  backwardTransitions ,  newInitialStates  ,  phiStates ,  simpleModel . getStates ( " target " ) ,  noStateRewards ,  statePriorities ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            /*    std::string funcStr = " (/ " +
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                this - > reachProbFunction - > nominator ( ) . toString ( false ,  true )  +  "   "  +  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                this - > reachProbFunction - > denominator ( ) . toString ( false ,  true )  +  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                            "  ) " ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                std : : cout  < <  std : : endl  < < " the resulting reach prob function is  "  < <  std : : endl  < <  funcStr  < <  std : : endl  < <  std : : endl ; */  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            STORM_LOG_DEBUG ( " Computed reachProbFunction " ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : chrono : : high_resolution_clock : : time_point  timeComputeReachProbFunctionEnd  =  std : : chrono : : high_resolution_clock : : now ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            this - > timeComputeReachProbFunction  =  timeComputeReachProbFunctionEnd - timeComputeReachProbFunctionStart ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                     
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        template < typename  ParametricType ,  typename  ConstantType >  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				
					@ -268,8 +314,8 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					             
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            if ( ! done  & &  this - > isResultConstant ) {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                STORM_LOG_DEBUG ( " Checking a region although the result is constant, i.e., independent of the region. This makes sense none. " ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                STORM_LOG_THROW ( this - > parametricTypeComparator . isConstant ( getReachProbFunction ( ) ) ,  storm : : exceptions : : UnexpectedException ,  " The result was assumed to be constant but it isn't. " ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                if ( valueIsInBoundOfFormula ( storm : : utility : : regions : : getConstantPart ( getReachProbFunction ( ) ) ) ) {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                STORM_LOG_THROW ( this - > parametricTypeComparator . isConstant ( * getReachProbFunction ( ) ) ,  storm : : exceptions : : UnexpectedException ,  " The result was assumed to be constant but it isn't. " ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                if ( valueIsInBoundOfFormula ( storm : : utility : : regions : : getConstantPart ( * getReachProbFunction ( ) ) ) ) {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    region . setCheckResult ( RegionCheckResult : : ALLSAT ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                else {  
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				
					@ -356,8 +402,7 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        bool  SparseDtmcRegionModelChecker < ParametricType ,  ConstantType > : : checkApproximativeProbabilities ( ParameterRegion &  region ,  std : : vector < ConstantType > &  lowerBounds ,  std : : vector < ConstantType > &  upperBounds )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            STORM_LOG_THROW ( this - > hasOnlyLinearFunctions ,  storm : : exceptions : : UnexpectedException ,  " Tried to perform approximative method (only applicable if all functions are linear), but there are nonlinear functions. " ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : chrono : : high_resolution_clock : : time_point  timeMDPBuildStart  =  std : : chrono : : high_resolution_clock : : now ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            STORM_LOG_THROW ( this - > approximationModel ! = nullptr ,  storm : : exceptions : : UnexpectedException ,  " Approximation model not initialized " ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            this - > approximationModel - > instantiate ( region ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            getApproximationModel ( ) - > instantiate ( region ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : chrono : : high_resolution_clock : : time_point  timeMDPBuildEnd  =  std : : chrono : : high_resolution_clock : : now ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            this - > timeMDPBuild  + =  timeMDPBuildEnd - timeMDPBuildStart ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					             
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				
					@ -404,15 +449,15 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            bool  formulaSatisfied ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            if ( ( formulaHasUpperBound  & &  proveAllSat )  | |  ( ! formulaHasUpperBound  & &  ! proveAllSat ) ) {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                //these are the cases in which we need to compute upper bounds
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                upperBounds  =  this - > approximationModel - > computeReachabilityProbabilities ( storm : : logic : : OptimalityType : : Maximize ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                upperBounds  =  getApproximationModel ( ) - > computeReachabilityProbabilities ( storm : : logic : : OptimalityType : : Maximize ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                lowerBounds  =  std : : vector < ConstantType > ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                formulaSatisfied  =  valueIsInBoundOfFormula ( upperBounds [ * this - > approximationModel - > getModel ( ) - > getInitialStates ( ) . begin ( ) ] ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                formulaSatisfied  =  valueIsInBoundOfFormula ( upperBounds [ * getApproximationModel ( ) - > getModel ( ) - > getInitialStates ( ) . begin ( ) ] ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            else {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                //for the remaining cases we compute lower bounds
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                lowerBounds  =  this - > approximationModel - > computeReachabilityProbabilities ( storm : : logic : : OptimalityType : : Minimize ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                lowerBounds  =  getApproximationModel ( ) - > computeReachabilityProbabilities ( storm : : logic : : OptimalityType : : Minimize ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                upperBounds  =  std : : vector < ConstantType > ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                formulaSatisfied  =  valueIsInBoundOfFormula ( lowerBounds [ * this - > approximationModel - > getModel ( ) - > getInitialStates ( ) . begin ( ) ] ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                formulaSatisfied  =  valueIsInBoundOfFormula ( lowerBounds [ * getApproximationModel ( ) - > getModel ( ) - > getInitialStates ( ) . begin ( ) ] ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					             
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            //check if approximation was conclusive
  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				
					@ -430,12 +475,12 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                proveAllSat = ! proveAllSat ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                if ( lowerBounds . empty ( ) ) {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    lowerBounds  =  this - > approximationModel - > computeReachabilityProbabilities ( storm : : logic : : OptimalityType : : Minimize ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    formulaSatisfied = valueIsInBoundOfFormula ( lowerBounds [ * this - > approximationModel - > getModel ( ) - > getInitialStates ( ) . begin ( ) ] ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    lowerBounds  =  getApproximationModel ( ) - > computeReachabilityProbabilities ( storm : : logic : : OptimalityType : : Minimize ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    formulaSatisfied = valueIsInBoundOfFormula ( lowerBounds [ * getApproximationModel ( ) - > getModel ( ) - > getInitialStates ( ) . begin ( ) ] ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                else {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    upperBounds  =  this - > approximationModel - > computeReachabilityProbabilities ( storm : : logic : : OptimalityType : : Maximize ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    formulaSatisfied = valueIsInBoundOfFormula ( upperBounds [ * this - > approximationModel - > getModel ( ) - > getInitialStates ( ) . begin ( ) ] ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    upperBounds  =  getApproximationModel ( ) - > computeReachabilityProbabilities ( storm : : logic : : OptimalityType : : Maximize ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    formulaSatisfied = valueIsInBoundOfFormula ( upperBounds [ * getApproximationModel ( ) - > getModel ( ) - > getInitialStates ( ) . begin ( ) ] ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                     
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                //check if approximation was conclusive
  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				
					@ -452,6 +497,15 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            return  false ;              
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					         
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        template < typename  ParametricType ,  typename  ConstantType >  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        std : : shared_ptr < typename  SparseDtmcRegionModelChecker < ParametricType ,  ConstantType > : : ApproximationModel >  const &  SparseDtmcRegionModelChecker < ParametricType ,  ConstantType > : : getApproximationModel ( )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            if ( this - > approximationModel = = nullptr ) {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                STORM_LOG_WARN ( " Approximation model requested but it has not been initialized when specifying the formula. Will initialize it now. " ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                initializeApproximationModel ( * this - > simplifiedModel ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            return  this - > approximationModel ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					         
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					              template < typename  ParametricType ,  typename  ConstantType >  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        bool  SparseDtmcRegionModelChecker < ParametricType ,  ConstantType > : : checkSamplePoints ( ParameterRegion &  region )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            auto  samplingPoints  =  region . getVerticesOfRegion ( region . getVariables ( ) ) ;  //test the 4 corner points
  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				
					@ -468,12 +522,11 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            bool  valueInBoundOfFormula ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            if ( ( storm : : settings : : regionSettings ( ) . getSampleMode ( ) = = storm : : settings : : modules : : RegionSettings : : SampleMode : : EVALUATE )  | |  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    ( ! storm : : settings : : regionSettings ( ) . doSample ( )  & &  viaReachProbFunction ) ) {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                valueInBoundOfFormula  =  this - > valueIsInBoundOfFormula ( storm : : utility : : regions : : evaluateFunction ( getReachProbFunction ( ) ,  point ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                valueInBoundOfFormula  =  this - > valueIsInBoundOfFormula ( storm : : utility : : regions : : evaluateFunction ( * getReachProbFunction ( ) ,  point ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            else {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                STORM_LOG_THROW ( this - > samplingModel ! = nullptr ,  storm : : exceptions : : UnexpectedException ,  " Sampling model not initialized " ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                this - > samplingModel - > instantiate ( point ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                valueInBoundOfFormula = this - > valueIsInBoundOfFormula ( this - > samplingModel - > computeReachabilityProbabilities ( ) [ * this - > samplingModel - > getModel ( ) - > getInitialStates ( ) . begin ( ) ] ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                getSamplingModel ( ) - > instantiate ( point ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                valueInBoundOfFormula = this - > valueIsInBoundOfFormula ( getSamplingModel ( ) - > computeReachabilityProbabilities ( ) [ * getSamplingModel ( ) - > getModel ( ) - > getInitialStates ( ) . begin ( ) ] ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            if ( valueInBoundOfFormula ) {  
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				
					@ -500,36 +553,19 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					          
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        template < typename  ParametricType ,  typename  ConstantType >  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        ParametricType  SparseDtmcRegionModelChecker < ParametricType ,  ConstantType > : : getReachProbFunction ( )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            if ( ! this - > isReachProbFunctionComputed ) {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                std : : chrono : : high_resolution_clock : : time_point  timeComputeReachProbFunctionStart  =  std : : chrono : : high_resolution_clock : : now ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                //get the one step probabilities and the transition matrix of the simplified model without target/sink state
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                //TODO check if this takes long... we could also store the oneSteps while creating the simplified model. Or(?) we keep the matrix the way it is and give the target state one step probability 1.
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                storm : : storage : : SparseMatrix < ParametricType >  backwardTransitions ( this - > simplifiedModel - > getBackwardTransitions ( ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                std : : vector < ParametricType >  oneStepProbabilities ( this - > simplifiedModel - > getNumberOfStates ( ) - 2 ,  storm : : utility : : zero < ParametricType > ( ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                for ( auto  const &  entry  :  backwardTransitions . getRow ( * ( this - > simplifiedModel - > getStates ( " target " ) . begin ( ) ) ) ) {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    if ( entry . getColumn ( ) < oneStepProbabilities . size ( ) ) {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        oneStepProbabilities [ entry . getColumn ( ) ] = entry . getValue ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    }  //else case: only holds for the entry that corresponds to the selfloop on the target state..
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        std : : shared_ptr < typename  SparseDtmcRegionModelChecker < ParametricType ,  ConstantType > : : SamplingModel >  const &  SparseDtmcRegionModelChecker < ParametricType ,  ConstantType > : : getSamplingModel ( )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            if ( this - > samplingModel = = nullptr ) {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                STORM_LOG_WARN ( " Sampling model requested but it has not been initialized when specifying the formula. Will initialize it now. " ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                initializeSamplingModel ( * this - > simplifiedModel ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                storm : : storage : : BitVector  maybeStates = ~ ( this - > simplifiedModel - > getStates ( " target " )  |  this - > simplifiedModel - > getStates ( " sink " ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                backwardTransitions = backwardTransitions . getSubmatrix ( false , maybeStates , maybeStates ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                storm : : storage : : SparseMatrix < ParametricType >  forwardTransitions = this - > simplifiedModel - > getTransitionMatrix ( ) . getSubmatrix ( false , maybeStates , maybeStates ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                //now compute the functions using methods from elimination model checker
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                storm : : storage : : BitVector  newInitialStates  =  this - > simplifiedModel - > getInitialStates ( )  %  maybeStates ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                storm : : storage : : BitVector  phiStates ( this - > simplifiedModel - > getNumberOfStates ( ) ,  true ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                boost : : optional < std : : vector < ParametricType > >  noStateRewards ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                std : : vector < std : : size_t >  statePriorities  =  this - > eliminationModelChecker . getStatePriorities ( forwardTransitions , backwardTransitions , newInitialStates , oneStepProbabilities ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                this - > reachProbFunction = this - > eliminationModelChecker . computeReachabilityValue ( forwardTransitions ,  oneStepProbabilities ,  backwardTransitions ,  newInitialStates  ,  phiStates ,  this - > simplifiedModel - > getStates ( " target " ) ,  noStateRewards ,  statePriorities ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                std : : chrono : : high_resolution_clock : : time_point  timeComputeReachProbFunctionEnd  =  std : : chrono : : high_resolution_clock : : now ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            /*    std::string funcStr = " (/ " +
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                    this - > reachProbFunction . nominator ( ) . toString ( false ,  true )  +  "   "  +  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                    this - > reachProbFunction . denominator ( ) . toString ( false ,  true )  +  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                "  ) " ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                std : : cout  < <  std : : endl  < < " the resulting reach prob function is  "  < <  std : : endl  < <  funcStr  < <  std : : endl  < <  std : : endl ; */  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                STORM_LOG_DEBUG ( " Computed reachProbFunction " ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                this - > isReachProbFunctionComputed = true ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                this - > timeComputeReachProbFunction  =  timeComputeReachProbFunctionEnd - timeComputeReachProbFunctionStart ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            return  this - > samplingModel ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					         
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        template < typename  ParametricType ,  typename  ConstantType >  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        std : : shared_ptr < ParametricType >  const &  SparseDtmcRegionModelChecker < ParametricType ,  ConstantType > : : getReachProbFunction ( )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            if ( this - > reachProbFunction = = nullptr ) {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                STORM_LOG_WARN ( " Reachability Probability Function requested but it has not been computed when specifying the formula. Will compute it now. " ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                computeReachProbFunction ( * this - > simplifiedModel ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            return  this - > reachProbFunction ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        }  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				
					@ -543,7 +579,7 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					             
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            if ( this - > smtSolver = = nullptr ) {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                initializeSMTSolver ( this - > smtSolver ,  getReachProbFunction ( ) , * this - > probabilityOperatorFormula ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                initializeSMTSolver ( this - > smtSolver ,  * getReachProbFunction ( ) , * this - > probabilityOperatorFormula ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					             
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            this - > smtSolver - > push ( ) ;  
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				
					@ -624,7 +660,7 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                default :  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    STORM_LOG_WARN ( " The SMT solver was not able to compute a result for this region. (Timeout? Memout?) " ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    if ( this - > smtSolver - > isNeedsRestart ( ) ) {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        initializeSMTSolver ( this - > smtSolver , getReachProbFunction ( ) ,  * this - > probabilityOperatorFormula ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        initializeSMTSolver ( this - > smtSolver , * getReachProbFunction ( ) ,  * this - > probabilityOperatorFormula ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    return  false ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				
					@ -741,17 +777,17 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            outstream  < <  "    "  < <  this - > numOfRegionsSolvedThroughFullSmt  < <  "  regions solved through FullSmt "  < <  std : : endl ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            outstream  < <  std : : endl ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            outstream  < <  " Running times: "  < <  std : : endl ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            outstream  < <  "    "  < <  timeOverallInMilliseconds . count ( )  < <  " ms overall (excluding model parsing) "  < <  std : : endl ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            outstream  < <  "    "  < <  timeOverallInMilliseconds . count ( )  < <  " ms overall (excluding model parsing, bisimulation (if applied) ) "  < <  std : : endl ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            outstream  < <  "    "  < <  timePreprocessingInMilliseconds . count ( )  < <  " ms Preprocessing including...  "  < <  std : : endl ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            outstream  < <  "      "  < <  timeComputeSimplifiedModelInMilliseconds . count ( )  < <  " ms to obtain a simplified model (state elimination of const transitions) "  < <  std : : endl ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            outstream  < <  "      "  < <  timeInitApproxModelInMilliseconds . count ( )  < <  " ms to initialize the Approximation Model "  < <  std : : endl ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            outstream  < <  "      "  < <  timeInitSamplingModelInMilliseconds . count ( )  < <  " ms to initialize the Sampling Model "  < <  std : : endl ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            outstream  < <  "      "  < <  timeComputeReachProbFunctionInMilliseconds . count ( )  < <  " ms to compute the reachability probability function "  < <  std : : endl ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            outstream  < <  "    "  < <  timeCheckRegionInMilliseconds . count ( )  < <  " ms Region Check including...  "  < <  std : : endl ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            outstream  < <  "      "  < <  timeApproximationInMilliseconds . count ( )  < <  " ms Approximation including...  "  < <  std : : endl ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            outstream  < <  "      "  < <  timeSammplingInMilliseconds . count ( )  < <  " ms Sampling  "  < <  std : : endl ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            outstream  < <  "        "  < <  timeMDPBuildInMilliseconds . count ( )  < <  " ms to build the MDP "  < <  std : : endl ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            outstream  < <  "      "  < <  timeSammplingInMilliseconds . count ( )  < <  " ms Sampling  "  < <  std : : endl ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            outstream  < <  "      "  < <  timeFullSmtInMilliseconds . count ( )  < <  " ms Smt solving "  < <  std : : endl ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            outstream  < <  "    "  < <  timeComputeReachProbFunctionInMilliseconds . count ( )  < <  " ms to compute the reachability probability function (already included in one of the above) "  < <  std : : endl ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            outstream  < <  " ----------------------------------------------- "  < <  std : : endl ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					             
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        }