@ -458,6 +458,12 @@ namespace storm { 
		
	
		
			
				                                         
		
	
		
			
				                    / /  Now  check  for  possible  backward  cuts .                     / /  Now  check  for  possible  backward  cuts .  
		
	
		
			
				                    for  ( auto  const &  labelSetAndPrecedingLabelSetsPair  :  precedingLabels )  {                     for  ( auto  const &  labelSetAndPrecedingLabelSetsPair  :  precedingLabels )  {  
		
	
		
			
				                        bool  backwardImplicationAdded  =  false ;  
		
	
		
			
				/ /                         std : : cout  < <  " labelSetAndPrecedingLabelSetsPair.first  " ;  
		
	
		
			
				/ /                         for  ( auto  const &  e  :  labelSetAndPrecedingLabelSetsPair . first )  {  
		
	
		
			
				/ /                             std : : cout  < <  e  < <  " ,  " ;  
		
	
		
			
				/ /                         }  
		
	
		
			
				/ /                         std : : cout  < <  std : : endl ;  
		
	
		
			
				                        / /  Find  out  the  commands  for  the  currently  considered  label  set .                         / /  Find  out  the  commands  for  the  currently  considered  label  set .  
		
	
		
			
				                        storm : : expressions : : Expression  guardConjunction ;                         storm : : expressions : : Expression  guardConjunction ;  
		
	
		
			
				                                                 
		
	
	
		
			
				
					
						
							 
					
					
						
							 
					
					
				 
				@ -511,14 +517,17 @@ namespace storm { 
		
	
		
			
				                        if  ( checkResult  = =  storm : : solver : : SmtSolver : : CheckResult : : Unsat )  {                         if  ( checkResult  = =  storm : : solver : : SmtSolver : : CheckResult : : Unsat )  {  
		
	
		
			
				                            STORM_LOG_DEBUG ( " Selection not enabled in initial state. " ) ;                             STORM_LOG_DEBUG ( " Selection not enabled in initial state. " ) ;  
		
	
		
			
				
 
		
	
		
			
				                            / / std : : cout  < <  " not gc:  "  < <  ! guardConjunction  < <  std : : endl ;  
		
	
		
			
				                            localSolver - > add ( ! guardConjunction ) ;                             localSolver - > add ( ! guardConjunction ) ;  
		
	
		
			
				                            STORM_LOG_DEBUG ( " Asserted disjunction of negated guards. " ) ;                             STORM_LOG_DEBUG ( " Asserted disjunction of negated guards. " ) ;  
		
	
		
			
				                                                         
		
	
		
			
				                                                         
		
	
		
			
				                            / /  Now  check  the  possible  preceding  label  sets  for  the  essential  ones .                             / /  Now  check  the  possible  preceding  label  sets  for  the  essential  ones .  
		
	
		
			
				                            for  ( auto  const &  precedingLabelSet  :  labelSetAndPrecedingLabelSetsPair . second )  {                             for  ( auto  const &  precedingLabelSet  :  labelSetAndPrecedingLabelSetsPair . second )  {  
		
	
		
			
				
 
		
	
		
			
				                                if  ( labelSetAndPrecedingLabelSetsPair . first  = =  precedingLabelSet )  continue ;                                 if  ( labelSetAndPrecedingLabelSetsPair . first  = =  precedingLabelSet )  continue ;  
		
	
		
			
				
 
		
	
		
			
				                                / / std : : cout  < <  " push "  < <  std : : endl ;  
		
	
		
			
				                                / /  Create  a  restore  point  so  we  can  easily  pop - off  all  weakest  precondition  expressions .                                 / /  Create  a  restore  point  so  we  can  easily  pop - off  all  weakest  precondition  expressions .  
		
	
		
			
				                                localSolver - > push ( ) ;                                 localSolver - > push ( ) ;  
		
	
		
			
				                                                                 
		
	
	
		
			
				
					
						
							 
					
					
						
							 
					
					
				 
				@ -577,6 +586,8 @@ namespace storm { 
		
	
		
			
				                                    }                                     }  
		
	
		
			
				                                }                                 }  
		
	
		
			
				
 
		
	
		
			
				                                / / std : : cout  < <  " pgc:  "  < <  preceedingGuardConjunction  < <  std : : endl ;  
		
	
		
			
				
 
		
	
		
			
				                                / /  Assert  all  the  guards  of  the  preceding  command  set .                                 / /  Assert  all  the  guards  of  the  preceding  command  set .  
		
	
		
			
				                                localSolver - > add ( preceedingGuardConjunction ) ;                                 localSolver - > add ( preceedingGuardConjunction ) ;  
		
	
		
			
				                                                                 
		
	
	
		
			
				
					
						
							 
					
					
						
							 
					
					
				 
				@ -624,9 +635,13 @@ namespace storm { 
		
	
		
			
				                                assertDisjunction ( * localSolver ,  formulae ,  symbolicModel . isPrismProgram ( )  ?  symbolicModel . asPrismProgram ( ) . getManager ( )  :  symbolicModel . asJaniModel ( ) . getManager ( ) ) ;                                 assertDisjunction ( * localSolver ,  formulae ,  symbolicModel . isPrismProgram ( )  ?  symbolicModel . asPrismProgram ( ) . getManager ( )  :  symbolicModel . asJaniModel ( ) . getManager ( ) ) ;  
		
	
		
			
				                                                                 
		
	
		
			
				                                STORM_LOG_DEBUG ( " Asserted disjunction of all weakest preconditions. " ) ;                                 STORM_LOG_DEBUG ( " Asserted disjunction of all weakest preconditions. " ) ;  
		
	
		
			
				                                storm : : solver : : SmtSolver : : CheckResult  result  =  localSolver - > check ( ) ;  
		
	
		
			
				
 
		
	
		
			
				                                if  ( localSolver - > check ( ) = =  storm : : solver : : SmtSolver : : CheckResult : : Sat )  {  
		
	
		
			
				                                if  ( result = =  storm : : solver : : SmtSolver : : CheckResult : : Sat )  {  
		
	
		
			
				                                    backwardImplications [ labelSetAndPrecedingLabelSetsPair . first ] . insert ( precedingLabelSet ) ;                                     backwardImplications [ labelSetAndPrecedingLabelSetsPair . first ] . insert ( precedingLabelSet ) ;  
		
	
		
			
				                                    backwardImplicationAdded  =  true ;  
		
	
		
			
				                                }  else  if  ( result  = =  storm : : solver : : SmtSolver : : CheckResult : : Unknown )  {  
		
	
		
			
				                                    STORM_LOG_ERROR ( " The SMT solver does not come to a conclusive answer. Does your model contain integer division? " ) ;  
		
	
		
			
				                                }                                 }  
		
	
		
			
				
 
		
	
		
			
				                                localSolver - > pop ( ) ;                                 localSolver - > pop ( ) ;  
		
	
	
		
			
				
					
					
					
						
							 
					
				 
				@ -637,6 +652,7 @@ namespace storm { 
		
	
		
			
				                        }  else  {                         }  else  {  
		
	
		
			
				                            STORM_LOG_DEBUG ( " Selection is enabled in initial state. " ) ;                             STORM_LOG_DEBUG ( " Selection is enabled in initial state. " ) ;  
		
	
		
			
				                        }                         }  
		
	
		
			
				                        STORM_LOG_ERROR_COND ( backwardImplicationAdded ,  " Error in adding cuts for counterexample generation (backward implication misses a label set). " ) ;  
		
	
		
			
				                    }                     }  
		
	
		
			
				                }  else  if  ( symbolicModel . isJaniModel ( ) )  {                 }  else  if  ( symbolicModel . isJaniModel ( ) )  {  
		
	
		
			
				                    STORM_LOG_WARN ( " Model uses assignment levels, did not assert backward implications. " ) ;                     STORM_LOG_WARN ( " Model uses assignment levels, did not assert backward implications. " ) ;  
		
	
	
		
			
				
					
						
							 
					
					
						
							 
					
					
				 
				@ -1697,6 +1713,7 @@ namespace storm { 
		
	
		
			
				                        labelSets [ choice ]  =  choiceOrigins . getEdgeIndexSet ( choice ) ;                         labelSets [ choice ]  =  choiceOrigins . getEdgeIndexSet ( choice ) ;  
		
	
		
			
				                    }                     }  
		
	
		
			
				                }                 }  
		
	
		
			
				                assert ( labelSets . size ( )  = =  model . getNumberOfChoices ( ) ) ;  
		
	
		
			
				                                 
		
	
		
			
				                / /  ( 1 )  Check  whether  its  possible  to  exceed  the  threshold  if  checkThresholdFeasible  is  set .                 / /  ( 1 )  Check  whether  its  possible  to  exceed  the  threshold  if  checkThresholdFeasible  is  set .  
		
	
		
			
				                double  maximalReachabilityProbability  =  0 ;                 double  maximalReachabilityProbability  =  0 ;  
		
	
	
		
			
				
					
						
							 
					
					
						
							 
					
					
				 
				@ -1764,7 +1781,7 @@ namespace storm { 
		
	
		
			
				                    solverClock  =  std : : chrono : : high_resolution_clock : : now ( ) ;                     solverClock  =  std : : chrono : : high_resolution_clock : : now ( ) ;  
		
	
		
			
				                    commandSet  =  findSmallestCommandSet ( * solver ,  variableInformation ,  currentBound ) ;                     commandSet  =  findSmallestCommandSet ( * solver ,  variableInformation ,  currentBound ) ;  
		
	
		
			
				                    totalSolverTime  + =  std : : chrono : : high_resolution_clock : : now ( )  -  solverClock ;                     totalSolverTime  + =  std : : chrono : : high_resolution_clock : : now ( )  -  solverClock ;  
		
	
		
			
				                    STORM_LOG_DEBUG ( " Computed minimal command set of size  "  < <  ( commandSet . size ( )  +  relevancyInformation . knownLabels . size ( ) )  < <  " . " ) ;  
		
	
		
			
				                    STORM_LOG_DEBUG ( " Computed minimal command set of size  "  < <    commandSet . size ( )  +  relevancyInformation . knownLabels . size ( )  < <  "  ( "  < <  commandSet . size (  )  < <  "  +  "  < <  relevancyInformation . knownLabels . size ( )  < <  " )  " ) ;  
		
	
		
			
				                                         
		
	
		
			
				                    / /  Restrict  the  given  model  to  the  current  set  of  labels  and  compute  the  reachability  probability .                     / /  Restrict  the  given  model  to  the  current  set  of  labels  and  compute  the  reachability  probability .  
		
	
		
			
				                    modelCheckingClock  =  std : : chrono : : high_resolution_clock : : now ( ) ;                     modelCheckingClock  =  std : : chrono : : high_resolution_clock : : now ( ) ;