Quintiq file version 2.0 
 | 
#parent: #root 
 | 
Method StartIteration (LibOpt_Task task, LibOpt_TaskContextIterator context, LibOpt_Link link,  
 | 
  LibOpt_Scope scope) as stream[JSON] 
 | 
{ 
 | 
  Description: 'Start a new iteration by calling the next component correctly.' 
 | 
  TextBody: 
 | 
  [* 
 | 
    reactive_calls := LibOpt_CurrentTransaction::GetSpawnedReactiveCalls(); 
 | 
    time := OS::PrecisionCounter(); 
 | 
     
 | 
    continue := stream[JSON]::Success(); 
 | 
    // After aborting the optimizer, we still have to execute any post-processing links and their downstream tasks.  
 | 
    if( not task.IsAborted()  
 | 
        or link.IsPostProcessing()  
 | 
        or task.IsPostProcessing() ) 
 | 
    { 
 | 
      continue := this.Continue( task, link, scope ); 
 | 
    } 
 | 
     
 | 
    result := stream[JSON]::Success(); 
 | 
    if( this.ForceInOneTransaction() or this.Run().InOneTransaction() or reactive_calls = LibOpt_CurrentTransaction::GetSpawnedReactiveCalls() ) 
 | 
    { 
 | 
      context.NrOfIterations( context.NrOfIterations() + 1 ); 
 | 
       
 | 
      if( reactive_calls <> LibOpt_CurrentTransaction::GetSpawnedReactiveCalls() ) 
 | 
      { 
 | 
        LibOpt_SnapshotWarning::Throw( task, 
 | 
                                       Translations::LibOpt_Iterator_NotInOneTransaction( this.Name(), LibOpt_CurrentTransaction::GetSpawnedReactiveCallNames( time ) ), 
 | 
                                       Translations::LibOpt_Iterator_NotInOneTransaction_Solution() ); 
 | 
      } 
 | 
    } 
 | 
    else 
 | 
    { 
 | 
      finish := continue->| 
 | 
                this->Repeat( task, context ); 
 | 
      result := continue->Merge( finish ); 
 | 
      context.NrOfSubtasks( context.NrOfSubtasks() + 1 ); 
 | 
    } 
 | 
     
 | 
    return result; 
 | 
  *] 
 | 
} 
 |