@ -394,11 +394,8 @@ namespace storm { 
		
	
		
			
				                         
		
	
		
			
				            // Derive predicates from lower choice.
             // Derive predicates from lower choice.
  
		
	
		
			
				            storm : : dd : : Bdd < Type >  lowerChoice  =  pivotState  & &  game . getExtendedTransitionMatrix ( ) . toBdd ( )  & &  minPlayer1Strategy ;             storm : : dd : : Bdd < Type >  lowerChoice  =  pivotState  & &  game . getExtendedTransitionMatrix ( ) . toBdd ( )  & &  minPlayer1Strategy ;  
		
	
		
			
				            lowerChoice . template  toAdd < ValueType > ( ) . exportToDot ( " lower.dot " ) ;  
		
	
		
			
				            storm : : dd : : Bdd < Type >  lowerChoice1  =  ( lowerChoice  & &  minPlayer2Strategy ) . existsAbstract ( variablesToAbstract ) ;             storm : : dd : : Bdd < Type >  lowerChoice1  =  ( lowerChoice  & &  minPlayer2Strategy ) . existsAbstract ( variablesToAbstract ) ;  
		
	
		
			
				            lowerChoice1 . template  toAdd < ValueType > ( ) . exportToDot ( " lower1.dot " ) ;  
		
	
		
			
				            storm : : dd : : Bdd < Type >  lowerChoice2  =  ( lowerChoice  & &  maxPlayer2Strategy ) . existsAbstract ( variablesToAbstract ) ;             storm : : dd : : Bdd < Type >  lowerChoice2  =  ( lowerChoice  & &  maxPlayer2Strategy ) . existsAbstract ( variablesToAbstract ) ;  
		
	
		
			
				            lowerChoice2 . template  toAdd < ValueType > ( ) . exportToDot ( " lower2.dot " ) ;  
		
	
		
			
				
 
		
	
		
			
				            bool  lowerChoicesDifferent  =  ! lowerChoice1 . exclusiveOr ( lowerChoice2 ) . isZero ( )  & &  ! lowerChoice1 . isZero ( )  & &  ! lowerChoice2 . isZero ( ) ;             bool  lowerChoicesDifferent  =  ! lowerChoice1 . exclusiveOr ( lowerChoice2 ) . isZero ( )  & &  ! lowerChoice1 . isZero ( )  & &  ! lowerChoice2 . isZero ( ) ;  
		
	
		
			
				            if  ( lowerChoicesDifferent )  {             if  ( lowerChoicesDifferent )  {  
		
	
	
		
			
				
					
						
							 
					
					
						
							 
					
					
				 
				@ -610,7 +607,7 @@ namespace storm { 
		
	
		
			
				                                 
		
	
		
			
				                // Add variable update expression.
                 // Add variable update expression.
  
		
	
		
			
				                predicates . back ( ) . emplace_back ( allVariableUpdateExpression ) ;                 predicates . back ( ) . emplace_back ( allVariableUpdateExpression ) ;  
		
	
		
			
				                  
		
	
		
			
				
  
		
	
		
			
				                // Add the guard of the choice.
                 // Add the guard of the choice.
  
		
	
		
			
				                predicates . back ( ) . emplace_back ( abstractor . get ( ) . getGuard ( currentAction ) . changeManager ( expressionManager ) . substitute ( substitution ) ) ;                 predicates . back ( ) . emplace_back ( abstractor . get ( ) . getGuard ( currentAction ) . changeManager ( expressionManager ) . substitute ( substitution ) ) ;  
		
	
		
			
				                                 
		
	
	
		
			
				
					
						
							 
					
					
						
							 
					
					
				 
				@ -649,14 +646,14 @@ namespace storm { 
		
	
		
			
				                for  ( auto  const &  predicate  :  step )  {                 for  ( auto  const &  predicate  :  step )  {  
		
	
		
			
				                    interpolatingSolver . add ( predicate ) ;                     interpolatingSolver . add ( predicate ) ;  
		
	
		
			
				                }                 }  
		
	
		
			
				                + + stepCounter ;  
		
	
		
			
				                 
		
	
		
			
				                storm : : solver : : SmtSolver : : CheckResult  result  =  interpolatingSolver . check ( ) ;                 storm : : solver : : SmtSolver : : CheckResult  result  =  interpolatingSolver . check ( ) ;  
		
	
		
			
				                // If the result already became unsatisfiable
                 // If the result already became unsatisfiable
  
		
	
		
			
				                if  ( result  = =  storm : : solver : : SmtSolver : : CheckResult : : Unsat )  {                 if  ( result  = =  storm : : solver : : SmtSolver : : CheckResult : : Unsat )  {  
		
	
		
			
				                    STORM_LOG_TRACE ( " Trace formula became unsatisfiable after step  "  < <  ( stepCounter  -  1 )   < <  " . " ) ;  
		
	
		
			
				                    STORM_LOG_TRACE ( " Trace formula became unsatisfiable after step  "  < <  stepCounter  < <  " . " ) ;  
		
	
		
			
				                    break ;                     break ;  
		
	
		
			
				                }                 }  
		
	
		
			
				
 
		
	
		
			
				                + + stepCounter ;  
		
	
		
			
				            }             }  
		
	
		
			
				                         
		
	
		
			
				            // Now encode the trace as an SMT problem.
             // Now encode the trace as an SMT problem.
  
		
	
	
		
			
				
					
					
					
						
							 
					
				 
				@ -666,14 +663,14 @@ namespace storm { 
		
	
		
			
				                                 
		
	
		
			
				                std : : vector < storm : : expressions : : Expression >  interpolants ;                 std : : vector < storm : : expressions : : Expression >  interpolants ;  
		
	
		
			
				                std : : vector < uint64_t >  prefix ;                 std : : vector < uint64_t >  prefix ;  
		
	
		
			
				                for  ( uint64_t  step  =  0 ;  step  +  1  <  stepCounter ;  + + step )  {  
		
	
		
			
				                for  ( uint64_t  step  =  0 ;  step  <  stepCounter ;  + + step )  {  
		
	
		
			
				                    prefix . push_back ( step ) ;                     prefix . push_back ( step ) ;  
		
	
		
			
				                    storm : : expressions : : Expression  interpolant  =  interpolatingSolver . getInterpolant ( prefix ) . substitute ( variableSubstitution ) . changeManager ( abstractionInformation . getExpressionManager ( ) ) ;                     storm : : expressions : : Expression  interpolant  =  interpolatingSolver . getInterpolant ( prefix ) . substitute ( variableSubstitution ) . changeManager ( abstractionInformation . getExpressionManager ( ) ) ;  
		
	
		
			
				                    if  ( ! interpolant . isTrue ( )  & &  ! interpolant . isFalse ( ) )  {                     if  ( ! interpolant . isTrue ( )  & &  ! interpolant . isFalse ( ) )  {  
		
	
		
			
				                        STORM_LOG_DEBUG ( " Derived new predicate (based on interpolation):  "  < <  interpolant ) ;                         STORM_LOG_DEBUG ( " Derived new predicate (based on interpolation):  "  < <  interpolant ) ;  
		
	
		
			
				                        interpolants . push_back ( interpolant ) ;                         interpolants . push_back ( interpolant ) ;  
		
	
		
			
				                    }  else  {                     }  else  {  
		
	
		
			
				                        STORM_LOG_TRACE ( " F ound interpolant is ' "  < <  interpolant  < <  " '. " ) ;  
		
	
		
			
				                        STORM_LOG_ASSERT ( false ,  " The f ound interpolant is ' "  < <  interpolant  < <  " ', which shouldn't happen . " ) ;  
		
	
		
			
				                    }                     }  
		
	
		
			
				                }                 }  
		
	
		
			
				                return  boost : : make_optional ( RefinementPredicates ( RefinementPredicates : : Source : : Interpolation ,  interpolants ) ) ;                 return  boost : : make_optional ( RefinementPredicates ( RefinementPredicates : : Source : : Interpolation ,  interpolants ) ) ;  
		
	
	
		
			
				
					
						
							 
					
					
						
							 
					
					
				 
				@ -843,6 +840,7 @@ namespace storm { 
		
	
		
			
				            bool  considerDeviation  =  ( pivotSelectionHeuristic  = =  storm : : settings : : modules : : AbstractionSettings : : PivotSelectionHeuristic : : NearestMaximalDeviation  | |  pivotSelectionHeuristic  = =  storm : : settings : : modules : : AbstractionSettings : : PivotSelectionHeuristic : : MaxWeightedDeviation )  & &  lowerValues  & &  upperValues ;             bool  considerDeviation  =  ( pivotSelectionHeuristic  = =  storm : : settings : : modules : : AbstractionSettings : : PivotSelectionHeuristic : : NearestMaximalDeviation  | |  pivotSelectionHeuristic  = =  storm : : settings : : modules : : AbstractionSettings : : PivotSelectionHeuristic : : MaxWeightedDeviation )  & &  lowerValues  & &  upperValues ;  
		
	
		
			
				            bool  foundPivotState  =  false ;             bool  foundPivotState  =  false ;  
		
	
		
			
				            ValueType  pivotStateDeviation  =  storm : : utility : : zero < ValueType > ( ) ;             ValueType  pivotStateDeviation  =  storm : : utility : : zero < ValueType > ( ) ;  
		
	
		
			
				            auto  const &  player2Grouping  =  transitionMatrix . getRowGroupIndices ( ) ;  
		
	
		
			
				                         
		
	
		
			
				            while  ( ! dijkstraQueue . empty ( ) )  {             while  ( ! dijkstraQueue . empty ( ) )  {  
		
	
		
			
				                auto  distanceStatePair  =  * dijkstraQueue . begin ( ) ;                 auto  distanceStatePair  =  * dijkstraQueue . begin ( ) ;  
		
	
	
		
			
				
					
						
							 
					
					
						
							 
					
					
				 
				@ -875,8 +873,7 @@ namespace storm { 
		
	
		
			
				                    if  ( minStrategyPair . getPlayer2Strategy ( ) . hasDefinedChoice ( player2Successor )  & &  maxStrategyPair . getPlayer2Strategy ( ) . hasDefinedChoice ( player2Successor )  & &  minStrategyPair . getPlayer2Strategy ( ) . getChoice ( player2Successor )  ! =  maxStrategyPair . getPlayer2Strategy ( ) . getChoice ( player2Successor ) )  {                     if  ( minStrategyPair . getPlayer2Strategy ( ) . hasDefinedChoice ( player2Successor )  & &  maxStrategyPair . getPlayer2Strategy ( ) . hasDefinedChoice ( player2Successor )  & &  minStrategyPair . getPlayer2Strategy ( ) . getChoice ( player2Successor )  ! =  maxStrategyPair . getPlayer2Strategy ( ) . getChoice ( player2Successor ) )  {  
		
	
		
			
				                        isPivotState  =  true ;                         isPivotState  =  true ;  
		
	
		
			
				                    }                     }  
		
	
		
			
				                }  
		
	
		
			
				                 
		
	
		
			
				                }                  
		
	
		
			
				                // If it is indeed a pivot state, we can abort the search here.
                 // If it is indeed a pivot state, we can abort the search here.
  
		
	
		
			
				                if  ( isPivotState )  {                 if  ( isPivotState )  {  
		
	
		
			
				                    if  ( considerDeviation  & &  foundPivotState )  {                     if  ( considerDeviation  & &  foundPivotState )  {  
		
	
	
		
			
				
					
						
							 
					
					
						
							 
					
					
				 
				@ -905,7 +902,8 @@ namespace storm { 
		
	
		
			
				                if  ( minStrategyPair . getPlayer1Strategy ( ) . hasDefinedChoice ( currentState ) )  {                 if  ( minStrategyPair . getPlayer1Strategy ( ) . hasDefinedChoice ( currentState ) )  {  
		
	
		
			
				                    uint64_t  minPlayer2Successor  =  minStrategyPair . getPlayer1Strategy ( ) . getChoice ( currentState ) ;                     uint64_t  minPlayer2Successor  =  minStrategyPair . getPlayer1Strategy ( ) . getChoice ( currentState ) ;  
		
	
		
			
				                    uint64_t  minPlayer2Choice  =  minStrategyPair . getPlayer2Strategy ( ) . getChoice ( minPlayer2Successor ) ;                     uint64_t  minPlayer2Choice  =  minStrategyPair . getPlayer2Strategy ( ) . getChoice ( minPlayer2Successor ) ;  
		
	
		
			
				                     
		
	
		
			
				                    STORM_LOG_ASSERT ( player2Grouping [ minPlayer2Successor ]  < =  minPlayer2Choice  & &  minPlayer2Choice  <  player2Grouping [ minPlayer2Successor  +  1 ] ,  " Illegal choice for player 2. " ) ;  
		
	
		
			
				
 
		
	
		
			
				                    for  ( auto  const &  entry  :  transitionMatrix . getRow ( minPlayer2Choice ) )  {                     for  ( auto  const &  entry  :  transitionMatrix . getRow ( minPlayer2Choice ) )  {  
		
	
		
			
				                        uint64_t  player1Successor  =  entry . getColumn ( ) ;                         uint64_t  player1Successor  =  entry . getColumn ( ) ;  
		
	
		
			
				                        if  ( ! relevantStates . get ( player1Successor ) )  {                         if  ( ! relevantStates . get ( player1Successor ) )  {  
		
	
	
		
			
				
					
					
					
						
							 
					
				 
				@ -925,7 +923,8 @@ namespace storm { 
		
	
		
			
				                if  ( maxStrategyPair . getPlayer1Strategy ( ) . hasDefinedChoice ( currentState ) )  {                 if  ( maxStrategyPair . getPlayer1Strategy ( ) . hasDefinedChoice ( currentState ) )  {  
		
	
		
			
				                    uint64_t  maxPlayer2Successor  =  maxStrategyPair . getPlayer1Strategy ( ) . getChoice ( currentState ) ;                     uint64_t  maxPlayer2Successor  =  maxStrategyPair . getPlayer1Strategy ( ) . getChoice ( currentState ) ;  
		
	
		
			
				                    uint64_t  maxPlayer2Choice  =  maxStrategyPair . getPlayer2Strategy ( ) . getChoice ( maxPlayer2Successor ) ;                     uint64_t  maxPlayer2Choice  =  maxStrategyPair . getPlayer2Strategy ( ) . getChoice ( maxPlayer2Successor ) ;  
		
	
		
			
				                     
		
	
		
			
				                    STORM_LOG_ASSERT ( player2Grouping [ maxPlayer2Successor ]  < =  maxPlayer2Choice  & &  maxPlayer2Choice  <  player2Grouping [ maxPlayer2Successor  +  1 ] ,  " Illegal choice for player 2. " ) ;  
		
	
		
			
				
 
		
	
		
			
				                    for  ( auto  const &  entry  :  transitionMatrix . getRow ( maxPlayer2Choice ) )  {                     for  ( auto  const &  entry  :  transitionMatrix . getRow ( maxPlayer2Choice ) )  {  
		
	
		
			
				                        uint64_t  player1Successor  =  entry . getColumn ( ) ;                         uint64_t  player1Successor  =  entry . getColumn ( ) ;  
		
	
		
			
				                        if  ( ! relevantStates . get ( player1Successor ) )  {                         if  ( ! relevantStates . get ( player1Successor ) )  {  
		
	
	
		
			
				
					
					
					
						
							 
					
				 
				@ -936,7 +935,7 @@ namespace storm { 
		
	
		
			
				                        if  ( ( probabilityDistances  & &  alternateDistance  >  distances [ player1Successor ] )  | |  ( ! probabilityDistances  & &  alternateDistance  <  distances [ player1Successor ] ) )  {                         if  ( ( probabilityDistances  & &  alternateDistance  >  distances [ player1Successor ] )  | |  ( ! probabilityDistances  & &  alternateDistance  <  distances [ player1Successor ] ) )  {  
		
	
		
			
				                            distances [ player1Successor ]  =  alternateDistance ;                             distances [ player1Successor ]  =  alternateDistance ;  
		
	
		
			
				                            if  ( generatePredecessors )  {                             if  ( generatePredecessors )  {  
		
	
		
			
				                                result . predecessors [ player1Successor ]  =  std : : make_pair ( currentState ,  maxPlayer2Successor ) ;  
		
	
		
			
				                                result . predecessors [ player1Successor ]  =  std : : make_pair ( currentState ,  player1Labeling [ maxPlayer2Successor ] ) ;  
		
	
		
			
				                            }                             }  
		
	
		
			
				                            dijkstraQueue . emplace ( alternateDistance ,  player1Successor ) ;                             dijkstraQueue . emplace ( alternateDistance ,  player1Successor ) ;  
		
	
		
			
				                        }                         }  
		
	
	
		
			
				
					
						
							 
					
					
						
							 
					
					
				 
				@ -977,7 +976,8 @@ namespace storm { 
		
	
		
			
				            storm : : dd : : Bdd < Type >  maxPlayer2Strategy  =  game . getManager ( ) . getBddZero ( ) ;             storm : : dd : : Bdd < Type >  maxPlayer2Strategy  =  game . getManager ( ) . getBddZero ( ) ;  
		
	
		
			
				            if  ( minStrategyPair . getPlayer1Strategy ( ) . hasDefinedChoice ( pivotState ) )  {             if  ( minStrategyPair . getPlayer1Strategy ( ) . hasDefinedChoice ( pivotState ) )  {  
		
	
		
			
				                uint64_t  player2State  =  minStrategyPair . getPlayer1Strategy ( ) . getChoice ( pivotState ) ;                 uint64_t  player2State  =  minStrategyPair . getPlayer1Strategy ( ) . getChoice ( pivotState ) ;  
		
	
		
			
				                minPlayer1Strategy  | =  symbolicPivotState  & &  abstractionInformation . encodePlayer1Choice ( player1Labeling [ transitionMatrix . getRowGroupIndices ( ) [ player2State ] ] ,  abstractionInformation . getPlayer1VariableCount ( ) ) ;  
		
	
		
			
				                STORM_LOG_ASSERT ( player1Grouping [ pivotState ]  < =  player2State  & &  player2State  <  player1Grouping [ pivotState  +  1 ] ,  " Illegal choice for player 1. " ) ;  
		
	
		
			
				                minPlayer1Strategy  | =  symbolicPivotState  & &  abstractionInformation . encodePlayer1Choice ( player1Labeling [ player2State ] ,  abstractionInformation . getPlayer1VariableCount ( ) ) ;  
		
	
		
			
				                                 
		
	
		
			
				                if  ( minStrategyPair . getPlayer2Strategy ( ) . hasDefinedChoice ( player2State ) )  {                 if  ( minStrategyPair . getPlayer2Strategy ( ) . hasDefinedChoice ( player2State ) )  {  
		
	
		
			
				                    uint64_t  player2Choice  =  minStrategyPair . getPlayer2Strategy ( ) . getChoice ( player2State ) ;                     uint64_t  player2Choice  =  minStrategyPair . getPlayer2Strategy ( ) . getChoice ( player2State ) ;  
		
	
	
		
			
				
					
					
					
						
							 
					
				 
				@ -990,7 +990,8 @@ namespace storm { 
		
	
		
			
				            }             }  
		
	
		
			
				            if  ( maxStrategyPair . getPlayer1Strategy ( ) . hasDefinedChoice ( pivotState ) )  {             if  ( maxStrategyPair . getPlayer1Strategy ( ) . hasDefinedChoice ( pivotState ) )  {  
		
	
		
			
				                uint64_t  player2State  =  maxStrategyPair . getPlayer1Strategy ( ) . getChoice ( pivotState ) ;                 uint64_t  player2State  =  maxStrategyPair . getPlayer1Strategy ( ) . getChoice ( pivotState ) ;  
		
	
		
			
				                maxPlayer1Strategy  | =  symbolicPivotState  & &  abstractionInformation . encodePlayer1Choice ( player1Labeling [ transitionMatrix . getRowGroupIndices ( ) [ player2State ] ] ,  abstractionInformation . getPlayer1VariableCount ( ) ) ;  
		
	
		
			
				                STORM_LOG_ASSERT ( player1Grouping [ pivotState ]  < =  player2State  & &  player2State  <  player1Grouping [ pivotState  +  1 ] ,  " Illegal choice for player 1. " ) ;  
		
	
		
			
				                maxPlayer1Strategy  | =  symbolicPivotState  & &  abstractionInformation . encodePlayer1Choice ( player1Labeling [ player2State ] ,  abstractionInformation . getPlayer1VariableCount ( ) ) ;  
		
	
		
			
				                                 
		
	
		
			
				                if  ( minStrategyPair . getPlayer2Strategy ( ) . hasDefinedChoice ( player2State ) )  {                 if  ( minStrategyPair . getPlayer2Strategy ( ) . hasDefinedChoice ( player2State ) )  {  
		
	
		
			
				                    uint64_t  player2Choice  =  minStrategyPair . getPlayer2Strategy ( ) . getChoice ( player2State ) ;                     uint64_t  player2Choice  =  minStrategyPair . getPlayer2Strategy ( ) . getChoice ( player2State ) ;  
		
	
	
		
			
				
					
					
					
						
							 
					
				 
				@ -1001,6 +1002,11 @@ namespace storm { 
		
	
		
			
				                    maxPlayer2Strategy  | =  maxPlayer1Strategy  & &  abstractionInformation . encodePlayer2Choice ( player2Labeling [ player2Choice ] ,  0 ,  game . getPlayer2Variables ( ) . size ( ) ) ;                     maxPlayer2Strategy  | =  maxPlayer1Strategy  & &  abstractionInformation . encodePlayer2Choice ( player2Labeling [ player2Choice ] ,  0 ,  game . getPlayer2Variables ( ) . size ( ) ) ;  
		
	
		
			
				                }                 }  
		
	
		
			
				            }             }  
		
	
		
			
				//            symbolicPivotState.template toAdd<ValueType>().exportToDot("pivot.dot");
  
		
	
		
			
				//            minPlayer1Strategy.template toAdd<ValueType>().exportToDot("minpl1.dot");
  
		
	
		
			
				//            minPlayer2Strategy.template toAdd<ValueType>().exportToDot("minpl2.dot");
  
		
	
		
			
				//            maxPlayer1Strategy.template toAdd<ValueType>().exportToDot("maxpl1.dot");
  
		
	
		
			
				//            maxPlayer2Strategy.template toAdd<ValueType>().exportToDot("maxpl2.dot");
  
		
	
		
			
				            boost : : optional < RefinementPredicates >  predicates ;             boost : : optional < RefinementPredicates >  predicates ;  
		
	
		
			
				            if  ( useInterpolation )  {             if  ( useInterpolation )  {  
		
	
		
			
				                predicates  =  derivePredicatesFromInterpolation ( game ,  pivotStateResult ,  odd ) ;                 predicates  =  derivePredicatesFromInterpolation ( game ,  pivotStateResult ,  odd ) ;