/// <summary> /// Runs a single iteration of the message queue runner. /// This waits until it receives a new message (containing a new parameter set to run), /// deserializes this message, re-parameterises the model definition and runs a single /// model run. The process completes by saving the result before sending a complete message /// back on the queue. /// </summary> /// <returns> /// Returns whether an iteration was successful /// </returns> public bool RunIteration(out ParameterSet resultParameters) { resultParameters = null; //#if DEBUG // Debugger.Launch(); //#endif try { Message receivedMessage = queues.PestToTridentQueue.Receive(new TimeSpan(0, 0, TIMEOUT)); ParameterSet pSet = this.processMessage(receivedMessage); pSet.applyParametersTo(modelRunner.Model); TimeSeries output = new TimeSeries(); modelRunner.record(this.outputTimeSeriesName, output); modelRunner.execute(); NonInteractiveIO.Save(this.outputTimeSeriesFile, output); // save output time series to specified location // send resulting set so we can calculate score on parameters resultParameters = pSet; this.result = pSet; //this.queue.Send("Iteration Complete"); this.queues.TridentToPestQueue.Send(null); } catch (MessageQueueException e) { if (e.MessageQueueErrorCode == MessageQueueErrorCode.IOTimeout) { queues.Close(); // return the last given result resultParameters = this.result; return(false); } else { throw e; } } // iteration ran successfully return(true); }