Quintiq file version 2.0 
 | 
#parent: #root 
 | 
MethodOverride Operation (LibOpt_Task task) as stream[JSON] 
 | 
{ 
 | 
  TextBody: 
 | 
  [* 
 | 
    result := stream[JSON]::Success(); 
 | 
     
 | 
    if( task.CanContinue() ) 
 | 
    { 
 | 
      context := task.TaskContext().astype( LibOpt_TaskContextIterator ); 
 | 
      if( isnull( context ) ) 
 | 
      { 
 | 
        context := task.TaskContext( relnew, LibOpt_TaskContextIterator ); 
 | 
      } 
 | 
       
 | 
      stopcriterion := this.StopCriterion(); 
 | 
       
 | 
      result := stream[JSON]::Success(); 
 | 
      count := this.MaxParallel() - context.NrOfSubtasks(); 
 | 
      for( i := count; i > 0 
 | 
                       and stopcriterion.CanStartIteration( task )  
 | 
                       and not stopcriterion.ShouldStop( task ); i-- ) 
 | 
      { 
 | 
        reactive_calls := LibOpt_CurrentTransaction::GetSpawnedReactiveCalls(); 
 | 
        time := OS::PrecisionCounter(); 
 | 
        continue := this.Continue( task ); 
 | 
        if( this.ForceInOneTransaction() or this.Run().InOneTransaction() or reactive_calls = LibOpt_CurrentTransaction::GetSpawnedReactiveCalls() ) 
 | 
        { 
 | 
          i++; 
 | 
          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(), 
 | 
                                           LibOpt_Issue::Severity_4_High() 
 | 
                                         ); 
 | 
          } 
 | 
        } 
 | 
        else 
 | 
        { 
 | 
          finish := continue->| 
 | 
                    this->Repeat( task, context ); 
 | 
          result := result->Merge( continue, finish ); 
 | 
          context.NrOfSubtasks( context.NrOfSubtasks() + 1 ); 
 | 
        } 
 | 
      } 
 | 
    } 
 | 
     
 | 
    return result; 
 | 
  *] 
 | 
} 
 |