Quintiq file version 2.0 
 | 
#parent: #root 
 | 
MethodOverride PostHandleResult ( 
 | 
  LibOpt_Task task, 
 | 
  RealVector kpi_pre 
 | 
) 
 | 
{ 
 | 
  TextBody: 
 | 
  [* 
 | 
    runcontext := RunContextForCapacityPlanning::GetRunContextCapacityPlanning( task.Run() );  
 | 
    if ( isnull( this.CurrentSubOptimizerLevel() )                                      // when done we make sure current ptr is null 
 | 
         or ( runcontext.IsMetaIteration() and not this.IsBeyondFirstIteration() ) )  
 | 
    { 
 | 
      snapshot := this.LogKPI( task, Translations::LibOpt_SnapshotKPI_CommentPostHandleResult() ); 
 | 
      if( isnull( this.RollbackKPI() ) ) 
 | 
      { 
 | 
        // Throw a warning if it has not been thrown before in this snapshot. 
 | 
        if( not isnull( kpi_pre ) ) 
 | 
        { 
 | 
          LibOpt_SnapshotWarning::Throw( task, Translations::LibOpt_Suboptimizer_NoRollbackKPI() ); 
 | 
        } 
 | 
      } 
 | 
      else 
 | 
      { 
 | 
        kpi_post := RealVector::Construct( snapshot.astype( SnapshotMacroPlannerOptimizer ).RollbackKPI() );  
 | 
        change := construct(  RealVector );  
 | 
        message := '';  
 | 
        isaccepted := this.RollbackKPI().CurrentScoreIsAccepted( task, kpi_pre, &kpi_post, &change, this.FocusLevel(), message );  
 | 
         
 | 
        should_rollback := not isaccepted;  
 | 
         
 | 
        // Store rollback KPI difference 
 | 
        if( task.Run().HasSnapshots() and not this.IsFullPlanMetaPriorFocus() ) 
 | 
        { 
 | 
          LibOpt_SnapshotSuboptimizer::Create( task.Run(), kpi_pre, kpi_post, this.RollbackKPI(), should_rollback ); 
 | 
        } 
 | 
         
 | 
        if( should_rollback ) 
 | 
        { 
 | 
          if( not isnull( snapshot ) ) 
 | 
          { 
 | 
            snapshot.IsRolledBack( true ); 
 | 
          } 
 | 
          rcm := RunContextMeta::GetRunContextMeta( this.Run() );  
 | 
          if ( rcm.OptionStopOnRollback() )  
 | 
          { 
 | 
            this.Run().BreakpointEvent( relnew ); 
 | 
          } 
 | 
          else 
 | 
          { 
 | 
            this.Rollback( kpi_pre, kpi_post, task ); 
 | 
          } 
 | 
        } 
 | 
      } 
 | 
    } 
 | 
    this.IsBeyondFirstIteration( true ); // used for meta optimizer to make the first iteration of each focus level void planning ( only record KPIs) 
 | 
  *] 
 | 
} 
 |