Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.Optimization/3.3/BatchRun.cs @ 7105

Last change on this file since 7105 was 6816, checked in by mkommend, 13 years ago

#1573: BatchRuns prepared the included optimizer if they were resumed from pause state.#1479: Adapted symbolic expression encoding unit tests.

File size: 16.4 KB
RevLine 
[3226]1#region License Information
2/* HeuristicLab
[5445]3 * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
[3226]4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System;
[4533]23using System.Collections.Generic;
[3226]24using System.Drawing;
[3716]25using HeuristicLab.Collections;
[3265]26using HeuristicLab.Common;
[3226]27using HeuristicLab.Core;
[3716]28using HeuristicLab.Data;
[3226]29using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
30
31namespace HeuristicLab.Optimization {
32  /// <summary>
[5300]33  /// A run in which an optimizer is executed a given number of times.
[3226]34  /// </summary>
[5300]35  [Item("Batch Run", "A run in which an optimizer is executed a given number of times.")]
[3226]36  [Creatable("Testing & Analysis")]
37  [StorableClass]
[4419]38  public sealed class BatchRun : NamedItem, IOptimizer, IStorableContent {
39    public string Filename { get; set; }
40
[3226]41    public override Image ItemImage {
[3351]42      get {
[6534]43        if (ExecutionState == ExecutionState.Prepared) return HeuristicLab.Common.Resources.VSImageLibrary.BatchRunPrepared;
44        else if (ExecutionState == ExecutionState.Started) return HeuristicLab.Common.Resources.VSImageLibrary.BatchRunStarted;
45        else if (ExecutionState == ExecutionState.Paused) return HeuristicLab.Common.Resources.VSImageLibrary.BatchRunPaused;
46        else if (ExecutionState == ExecutionState.Stopped) return HeuristicLab.Common.Resources.VSImageLibrary.BatchRunStopped;
[5287]47        else return HeuristicLab.Common.Resources.VSImageLibrary.Event;
[3351]48      }
[3226]49    }
50
[3265]51    [Storable]
52    private ExecutionState executionState;
53    public ExecutionState ExecutionState {
54      get { return executionState; }
55      private set {
56        if (executionState != value) {
57          executionState = value;
58          OnExecutionStateChanged();
[3351]59          OnItemImageChanged();
[3265]60        }
61      }
62    }
63
64    [Storable]
65    private TimeSpan executionTime;
66    public TimeSpan ExecutionTime {
67      get {
[5300]68        if ((Optimizer != null) && (Optimizer.ExecutionState != ExecutionState.Stopped))
69          return executionTime + Optimizer.ExecutionTime;
[3265]70        else
71          return executionTime;
72      }
73      private set {
74        executionTime = value;
75        OnExecutionTimeChanged();
76      }
77    }
78
[3280]79    [Storable]
[5300]80    private IOptimizer optimizer;
81    public IOptimizer Optimizer {
82      get { return optimizer; }
[3226]83      set {
[5300]84        if (optimizer != value) {
85          if (optimizer != null) {
86            DeregisterOptimizerEvents();
87            IEnumerable<IRun> runs = optimizer.Runs;
88            optimizer = null; //necessary to avoid removing the runs from the old optimizer
[4115]89            Runs.RemoveRange(runs);
90          }
[5300]91          optimizer = value;
92          if (optimizer != null) {
93            RegisterOptimizerEvents();
94            Runs.AddRange(optimizer.Runs);
[4115]95          }
[5300]96          OnOptimizerChanged();
[3716]97          Prepare();
[3226]98        }
99      }
100    }
[5300]101    // BackwardsCompatibility3.3
102    #region Backwards compatible code (remove with 3.4)
[5409]103    [Storable(AllowOneWay = true)]
[5300]104    private IAlgorithm algorithm {
105      set { optimizer = value; }
106    }
107    #endregion
[3226]108
109    [Storable]
110    private int repetitions;
111    public int Repetitions {
112      get { return repetitions; }
113      set {
114        if (repetitions != value) {
115          repetitions = value;
116          OnRepetitionsChanged();
[5300]117          if ((Optimizer != null) && (Optimizer.ExecutionState == ExecutionState.Stopped))
[3275]118            Prepare();
[3226]119        }
120      }
121    }
[3716]122    [Storable]
123    private int repetitionsCounter;
[3226]124
125    [Storable]
[3260]126    private RunCollection runs;
127    public RunCollection Runs {
128      get { return runs; }
[3716]129      private set {
130        if (value == null) throw new ArgumentNullException();
131        if (runs != value) {
132          if (runs != null) DeregisterRunsEvents();
133          runs = value;
134          if (runs != null) RegisterRunsEvents();
135        }
136      }
[3226]137    }
138
[5419]139    public IEnumerable<IOptimizer> NestedOptimizers {
140      get {
141        if (Optimizer == null) yield break;
142
143        yield return Optimizer;
144        foreach (IOptimizer opt in Optimizer.NestedOptimizers)
145          yield return opt;
146      }
147    }
148
[6767]149    private bool batchRunStarted = false;
150    private bool batchRunPaused = false;
151    private bool batchRunStopped = false;
[3226]152
153    public BatchRun()
154      : base() {
[3280]155      name = ItemName;
156      description = ItemDescription;
[3265]157      executionState = ExecutionState.Stopped;
158      executionTime = TimeSpan.Zero;
[3226]159      repetitions = 10;
[3716]160      repetitionsCounter = 0;
161      Runs = new RunCollection();
[3226]162    }
[3280]163    public BatchRun(string name)
164      : base(name) {
165      description = ItemDescription;
[3265]166      executionState = ExecutionState.Stopped;
167      executionTime = TimeSpan.Zero;
[3226]168      repetitions = 10;
[3716]169      repetitionsCounter = 0;
170      Runs = new RunCollection();
[3226]171    }
[3280]172    public BatchRun(string name, string description)
173      : base(name, description) {
[3265]174      executionState = ExecutionState.Stopped;
175      executionTime = TimeSpan.Zero;
[3226]176      repetitions = 10;
[3716]177      repetitionsCounter = 0;
178      Runs = new RunCollection();
[3226]179    }
[3280]180    [StorableConstructor]
[6767]181    private BatchRun(bool deserializing) : base(deserializing) { }
[3280]182    [StorableHook(HookType.AfterDeserialization)]
[4722]183    private void AfterDeserialization() {
184      Initialize();
[3280]185    }
186
[4722]187    private BatchRun(BatchRun original, Cloner cloner)
188      : base(original, cloner) {
189      executionState = original.executionState;
190      executionTime = original.executionTime;
[5300]191      optimizer = cloner.Clone(original.optimizer);
[4722]192      repetitions = original.repetitions;
193      repetitionsCounter = original.repetitionsCounter;
194      runs = cloner.Clone(original.runs);
[6767]195      batchRunStarted = original.batchRunStarted;
196      batchRunPaused = original.batchRunPaused;
197      batchRunStopped = original.batchRunStopped;
[4722]198      Initialize();
199    }
[3226]200    public override IDeepCloneable Clone(Cloner cloner) {
[3280]201      if (ExecutionState == ExecutionState.Started) throw new InvalidOperationException(string.Format("Clone not allowed in execution state \"{0}\".", ExecutionState));
[4722]202      return new BatchRun(this, cloner);
[3226]203    }
204
[4722]205    private void Initialize() {
[5300]206      if (optimizer != null) RegisterOptimizerEvents();
[4722]207      if (runs != null) RegisterRunsEvents();
208    }
209
[3226]210    public void Prepare() {
[3275]211      Prepare(false);
[3226]212    }
[3275]213    public void Prepare(bool clearRuns) {
[3265]214      if ((ExecutionState != ExecutionState.Prepared) && (ExecutionState != ExecutionState.Paused) && (ExecutionState != ExecutionState.Stopped))
215        throw new InvalidOperationException(string.Format("Prepare not allowed in execution state \"{0}\".", ExecutionState));
[5300]216      if (Optimizer != null) {
[3716]217        repetitionsCounter = 0;
218        if (clearRuns) runs.Clear();
[5300]219        Optimizer.Prepare(clearRuns);
[6471]220      } else {
221        ExecutionState = ExecutionState.Stopped;
[3261]222      }
[3226]223    }
[3265]224    public void Start() {
225      if ((ExecutionState != ExecutionState.Prepared) && (ExecutionState != ExecutionState.Paused))
226        throw new InvalidOperationException(string.Format("Start not allowed in execution state \"{0}\".", ExecutionState));
[6767]227      if (Optimizer == null) return;
228
229      batchRunStarted = true;
230      batchRunPaused = false;
231      batchRunStopped = false;
[6816]232      if (Optimizer.ExecutionState == ExecutionState.Stopped) Optimizer.Prepare();
[6767]233      Optimizer.Start();
[3265]234    }
235    public void Pause() {
236      if (ExecutionState != ExecutionState.Started)
237        throw new InvalidOperationException(string.Format("Pause not allowed in execution state \"{0}\".", ExecutionState));
[6767]238      if (Optimizer == null) return;
239      if (Optimizer.ExecutionState != ExecutionState.Started) return;
240
241      batchRunStarted = false;
242      batchRunPaused = true;
243      batchRunStopped = false;
244      Optimizer.Pause();
[3265]245    }
[3226]246    public void Stop() {
[3265]247      if ((ExecutionState != ExecutionState.Started) && (ExecutionState != ExecutionState.Paused))
248        throw new InvalidOperationException(string.Format("Stop not allowed in execution state \"{0}\".", ExecutionState));
[6767]249      if (Optimizer == null) return;
250      if (Optimizer.ExecutionState != ExecutionState.Started && Optimizer.ExecutionState != ExecutionState.Paused) return;
251      batchRunStarted = false;
252      batchRunPaused = false;
253      batchRunStopped = true;
254      Optimizer.Stop();
[3226]255    }
256
257    #region Events
[3265]258    public event EventHandler ExecutionStateChanged;
259    private void OnExecutionStateChanged() {
260      EventHandler handler = ExecutionStateChanged;
261      if (handler != null) handler(this, EventArgs.Empty);
262    }
263    public event EventHandler ExecutionTimeChanged;
264    private void OnExecutionTimeChanged() {
265      EventHandler handler = ExecutionTimeChanged;
266      if (handler != null) handler(this, EventArgs.Empty);
267    }
[5300]268    public event EventHandler OptimizerChanged;
269    private void OnOptimizerChanged() {
270      EventHandler handler = OptimizerChanged;
[3265]271      if (handler != null) handler(this, EventArgs.Empty);
[3226]272    }
273    public event EventHandler RepetitionsChanged;
274    private void OnRepetitionsChanged() {
[3265]275      EventHandler handler = RepetitionsChanged;
276      if (handler != null) handler(this, EventArgs.Empty);
[3226]277    }
278    public event EventHandler Prepared;
279    private void OnPrepared() {
[3265]280      ExecutionState = ExecutionState.Prepared;
281      EventHandler handler = Prepared;
282      if (handler != null) handler(this, EventArgs.Empty);
[3226]283    }
284    public event EventHandler Started;
285    private void OnStarted() {
[3265]286      ExecutionState = ExecutionState.Started;
287      EventHandler handler = Started;
288      if (handler != null) handler(this, EventArgs.Empty);
[3226]289    }
[3265]290    public event EventHandler Paused;
291    private void OnPaused() {
292      ExecutionState = ExecutionState.Paused;
293      EventHandler handler = Paused;
294      if (handler != null) handler(this, EventArgs.Empty);
295    }
[3226]296    public event EventHandler Stopped;
297    private void OnStopped() {
[3265]298      ExecutionState = ExecutionState.Stopped;
299      EventHandler handler = Stopped;
300      if (handler != null) handler(this, EventArgs.Empty);
[3226]301    }
[3265]302    public event EventHandler<EventArgs<Exception>> ExceptionOccurred;
[3226]303    private void OnExceptionOccurred(Exception exception) {
[3265]304      EventHandler<EventArgs<Exception>> handler = ExceptionOccurred;
305      if (handler != null) handler(this, new EventArgs<Exception>(exception));
[3226]306    }
307
[5300]308    private void RegisterOptimizerEvents() {
309      optimizer.ExceptionOccurred += new EventHandler<EventArgs<Exception>>(Optimizer_ExceptionOccurred);
310      optimizer.ExecutionTimeChanged += new EventHandler(Optimizer_ExecutionTimeChanged);
311      optimizer.Paused += new EventHandler(Optimizer_Paused);
312      optimizer.Prepared += new EventHandler(Optimizer_Prepared);
313      optimizer.Started += new EventHandler(Optimizer_Started);
314      optimizer.Stopped += new EventHandler(Optimizer_Stopped);
315      optimizer.Runs.CollectionReset += new CollectionItemsChangedEventHandler<IRun>(Optimizer_Runs_CollectionReset);
316      optimizer.Runs.ItemsAdded += new CollectionItemsChangedEventHandler<IRun>(Optimizer_Runs_ItemsAdded);
317      optimizer.Runs.ItemsRemoved += new CollectionItemsChangedEventHandler<IRun>(Optimizer_Runs_ItemsRemoved);
[3261]318    }
[5300]319    private void DeregisterOptimizerEvents() {
320      optimizer.ExceptionOccurred -= new EventHandler<EventArgs<Exception>>(Optimizer_ExceptionOccurred);
321      optimizer.ExecutionTimeChanged -= new EventHandler(Optimizer_ExecutionTimeChanged);
322      optimizer.Paused -= new EventHandler(Optimizer_Paused);
323      optimizer.Prepared -= new EventHandler(Optimizer_Prepared);
324      optimizer.Started -= new EventHandler(Optimizer_Started);
325      optimizer.Stopped -= new EventHandler(Optimizer_Stopped);
326      optimizer.Runs.CollectionReset -= new CollectionItemsChangedEventHandler<IRun>(Optimizer_Runs_CollectionReset);
327      optimizer.Runs.ItemsAdded -= new CollectionItemsChangedEventHandler<IRun>(Optimizer_Runs_ItemsAdded);
328      optimizer.Runs.ItemsRemoved -= new CollectionItemsChangedEventHandler<IRun>(Optimizer_Runs_ItemsRemoved);
[3226]329    }
[5300]330    private void Optimizer_ExceptionOccurred(object sender, EventArgs<Exception> e) {
[3261]331      OnExceptionOccurred(e.Value);
[3226]332    }
[5300]333    private void Optimizer_ExecutionTimeChanged(object sender, EventArgs e) {
[3265]334      OnExecutionTimeChanged();
335    }
[5300]336    private void Optimizer_Paused(object sender, EventArgs e) {
[6767]337      if (ExecutionState == ExecutionState.Started) {
338        batchRunStarted = false;
339        batchRunPaused = true;
340        batchRunStopped = false;
341        OnPaused();
342      }
[3265]343    }
[5300]344    private void Optimizer_Prepared(object sender, EventArgs e) {
[6767]345      if (ExecutionState == ExecutionState.Stopped || !batchRunStarted) {
[3276]346        OnPrepared();
[6767]347      }
[3265]348    }
[5300]349    private void Optimizer_Started(object sender, EventArgs e) {
[3276]350      if (ExecutionState != ExecutionState.Started)
351        OnStarted();
[3261]352    }
[5300]353    private void Optimizer_Stopped(object sender, EventArgs e) {
[3716]354      repetitionsCounter++;
[3265]355
[6767]356      if (batchRunStopped) OnStopped();
357      else if (repetitionsCounter >= repetitions) OnStopped();
358      else if (batchRunPaused) OnPaused();
359      else if (batchRunStarted) {
[5300]360        Optimizer.Prepare();
361        Optimizer.Start();
[6767]362      } else OnStopped();
[3226]363    }
[5300]364    private void Optimizer_Runs_CollectionReset(object sender, CollectionItemsChangedEventArgs<IRun> e) {
[3275]365      Runs.RemoveRange(e.OldItems);
366      Runs.AddRange(e.Items);
367    }
[5300]368    private void Optimizer_Runs_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IRun> e) {
[3275]369      Runs.AddRange(e.Items);
370    }
[5300]371    private void Optimizer_Runs_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IRun> e) {
[3275]372      Runs.RemoveRange(e.Items);
373    }
[3716]374
375    private void RegisterRunsEvents() {
376      runs.CollectionReset += new CollectionItemsChangedEventHandler<IRun>(Runs_CollectionReset);
[4115]377      runs.ItemsAdded += new CollectionItemsChangedEventHandler<IRun>(Runs_ItemsAdded);
[3716]378      runs.ItemsRemoved += new CollectionItemsChangedEventHandler<IRun>(Runs_ItemsRemoved);
379    }
[4115]380
[3716]381    private void DeregisterRunsEvents() {
382      runs.CollectionReset -= new CollectionItemsChangedEventHandler<IRun>(Runs_CollectionReset);
[4115]383      runs.ItemsAdded -= new CollectionItemsChangedEventHandler<IRun>(Runs_ItemsAdded);
[3716]384      runs.ItemsRemoved -= new CollectionItemsChangedEventHandler<IRun>(Runs_ItemsRemoved);
385    }
386    private void Runs_CollectionReset(object sender, CollectionItemsChangedEventArgs<IRun> e) {
387      foreach (IRun run in e.OldItems) {
388        IItem item;
389        run.Results.TryGetValue("Execution Time", out item);
390        TimeSpanValue executionTime = item as TimeSpanValue;
391        if (executionTime != null) ExecutionTime -= executionTime.Value;
392      }
[5300]393      if (Optimizer != null) Optimizer.Runs.RemoveRange(e.OldItems);
[3716]394      foreach (IRun run in e.Items) {
395        IItem item;
396        run.Results.TryGetValue("Execution Time", out item);
397        TimeSpanValue executionTime = item as TimeSpanValue;
398        if (executionTime != null) ExecutionTime += executionTime.Value;
399      }
400    }
[4115]401    private void Runs_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IRun> e) {
402      foreach (IRun run in e.Items) {
403        IItem item;
404        run.Results.TryGetValue("Execution Time", out item);
405        TimeSpanValue executionTime = item as TimeSpanValue;
406        if (executionTime != null) ExecutionTime += executionTime.Value;
407      }
408    }
[3716]409    private void Runs_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IRun> e) {
410      foreach (IRun run in e.Items) {
411        IItem item;
412        run.Results.TryGetValue("Execution Time", out item);
413        TimeSpanValue executionTime = item as TimeSpanValue;
414        if (executionTime != null) ExecutionTime -= executionTime.Value;
415      }
[5300]416      if (Optimizer != null) Optimizer.Runs.RemoveRange(e.Items);
[3716]417    }
[3226]418    #endregion
419  }
420}
Note: See TracBrowser for help on using the repository browser.