Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.Optimization/3.3/Experiment.cs @ 3276

Last change on this file since 3276 was 3276, checked in by swagner, 14 years ago

Continued work on algorithm batch processing (#947).

File size: 13.2 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
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;
23using System.Drawing;
24using System.Linq;
25using HeuristicLab.Collections;
26using HeuristicLab.Common;
27using HeuristicLab.Core;
28using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
29
30namespace HeuristicLab.Optimization {
31  /// <summary>
32  /// An experiment which contains multiple batch runs of algorithms.
33  /// </summary>
34  [Item("Experiment", "An experiment which contains multiple batch runs of algorithms.")]
35  [Creatable("Testing & Analysis")]
36  [StorableClass]
37  public sealed class Experiment : NamedItem, IOptimizer {
38    public override Image ItemImage {
39      get { return HeuristicLab.Common.Resources.VS2008ImageLibrary.Event; }
40    }
41
42    [Storable]
43    private ExecutionState executionState;
44    public ExecutionState ExecutionState {
45      get { return executionState; }
46      private set {
47        if (executionState != value) {
48          executionState = value;
49          OnExecutionStateChanged();
50        }
51      }
52    }
53
54    [Storable]
55    private TimeSpan executionTime;
56    public TimeSpan ExecutionTime {
57      get { return executionTime; }
58      private set {
59        executionTime = value;
60        OnExecutionTimeChanged();
61      }
62    }
63
64    private OptimizerList optimizers;
65    [Storable]
66    public OptimizerList Optimizers {
67      get { return optimizers; }
68      private set {
69        if (optimizers != value) {
70          if (optimizers != null) DeregisterOptimizersEvents();
71          optimizers = value;
72          if (optimizers != null) RegisterOptimizersEvents();
73          foreach (IOptimizer optimizer in optimizers)
74            RegisterOptimizerEvents(optimizer);
75        }
76      }
77    }
78
79    [Storable]
80    private RunCollection runs;
81    public RunCollection Runs {
82      get { return runs; }
83    }
84
85    private bool stopPending;
86
87    public Experiment()
88      : base() {
89      executionState = ExecutionState.Stopped;
90      executionTime = TimeSpan.Zero;
91      Optimizers = new OptimizerList();
92      runs = new RunCollection();
93      stopPending = false;
94    }
95    public Experiment(string name) : base(name) {
96      executionState = ExecutionState.Stopped;
97      executionTime = TimeSpan.Zero;
98      Optimizers = new OptimizerList();
99      runs = new RunCollection();
100      stopPending = false;
101    }
102    public Experiment(string name, string description) : base(name, description) {
103      executionState = ExecutionState.Stopped;
104      executionTime = TimeSpan.Zero;
105      Optimizers = new OptimizerList();
106      runs = new RunCollection();
107      stopPending = false;
108    }
109
110    public override IDeepCloneable Clone(Cloner cloner) {
111      Experiment clone = (Experiment)base.Clone(cloner);
112      clone.executionState = executionState;
113      clone.executionTime = executionTime;
114      clone.Optimizers = (OptimizerList)cloner.Clone(optimizers);
115      clone.runs = (RunCollection)cloner.Clone(runs);
116      clone.stopPending = stopPending;
117      return clone;
118    }
119
120    public void Prepare() {
121      Prepare(false);
122    }
123    public void Prepare(bool clearRuns) {
124      if ((ExecutionState != ExecutionState.Prepared) && (ExecutionState != ExecutionState.Paused) && (ExecutionState != ExecutionState.Stopped))
125        throw new InvalidOperationException(string.Format("Prepare not allowed in execution state \"{0}\".", ExecutionState));
126      if (Optimizers.Count > 0) {
127        if (clearRuns) runs.Clear();
128        foreach (IOptimizer optimizer in Optimizers.Where(x => x.ExecutionState != ExecutionState.Started))
129          optimizer.Prepare(clearRuns);
130      }
131    }
132    public void Start() {
133      if ((ExecutionState != ExecutionState.Prepared) && (ExecutionState != ExecutionState.Paused))
134        throw new InvalidOperationException(string.Format("Start not allowed in execution state \"{0}\".", ExecutionState));
135      stopPending = false;
136      if (Optimizers.Count > 0) {
137        IOptimizer optimizer = Optimizers.FirstOrDefault(x => (x.ExecutionState == ExecutionState.Prepared) || (x.ExecutionState == ExecutionState.Paused));
138        if (optimizer != null) optimizer.Start();
139      }
140    }
141    public void Pause() {
142      if (ExecutionState != ExecutionState.Started)
143        throw new InvalidOperationException(string.Format("Pause not allowed in execution state \"{0}\".", ExecutionState));
144      if (Optimizers.Count > 0) {
145        foreach (IOptimizer optimizer in Optimizers.Where(x => x.ExecutionState == ExecutionState.Started))
146          optimizer.Pause();
147      }
148    }
149    public void Stop() {
150      if ((ExecutionState != ExecutionState.Started) && (ExecutionState != ExecutionState.Paused))
151        throw new InvalidOperationException(string.Format("Stop not allowed in execution state \"{0}\".", ExecutionState));
152      stopPending = true;
153      if (Optimizers.Count > 0) {
154        foreach (IOptimizer optimizer in Optimizers.Where(x => (x.ExecutionState == ExecutionState.Started) || (x.ExecutionState == ExecutionState.Paused)))
155          optimizer.Stop();
156      }
157    }
158
159    #region Events
160    public event EventHandler ExecutionStateChanged;
161    private void OnExecutionStateChanged() {
162      EventHandler handler = ExecutionStateChanged;
163      if (handler != null) handler(this, EventArgs.Empty);
164    }
165    public event EventHandler ExecutionTimeChanged;
166    private void OnExecutionTimeChanged() {
167      EventHandler handler = ExecutionTimeChanged;
168      if (handler != null) handler(this, EventArgs.Empty);
169    }
170    public event EventHandler Prepared;
171    private void OnPrepared() {
172      ExecutionState = ExecutionState.Prepared;
173      EventHandler handler = Prepared;
174      if (handler != null) handler(this, EventArgs.Empty);
175    }
176    public event EventHandler Started;
177    private void OnStarted() {
178      ExecutionState = ExecutionState.Started;
179      EventHandler handler = Started;
180      if (handler != null) handler(this, EventArgs.Empty);
181    }
182    public event EventHandler Paused;
183    private void OnPaused() {
184      ExecutionState = ExecutionState.Paused;
185      EventHandler handler = Paused;
186      if (handler != null) handler(this, EventArgs.Empty);
187    }
188    public event EventHandler Stopped;
189    private void OnStopped() {
190      ExecutionState = ExecutionState.Stopped;
191      EventHandler handler = Stopped;
192      if (handler != null) handler(this, EventArgs.Empty);
193    }
194    public event EventHandler<EventArgs<Exception>> ExceptionOccurred;
195    private void OnExceptionOccurred(Exception exception) {
196      EventHandler<EventArgs<Exception>> handler = ExceptionOccurred;
197      if (handler != null) handler(this, new EventArgs<Exception>(exception));
198    }
199
200    private void RegisterOptimizersEvents() {
201      Optimizers.CollectionReset += new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_CollectionReset);
202      Optimizers.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsAdded);
203      Optimizers.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsRemoved);
204      Optimizers.ItemsReplaced += new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsReplaced);
205    }
206    private void DeregisterOptimizersEvents() {
207      Optimizers.CollectionReset -= new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_CollectionReset);
208      Optimizers.ItemsAdded -= new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsAdded);
209      Optimizers.ItemsRemoved -= new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsRemoved);
210      Optimizers.ItemsReplaced -= new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsReplaced);
211    }
212    private void Optimizers_CollectionReset(object sender, CollectionItemsChangedEventArgs<IndexedItem<IOptimizer>> e) {
213      foreach (IndexedItem<IOptimizer> item in e.OldItems) {
214        DeregisterOptimizerEvents(item.Value);
215      }
216      foreach (IndexedItem<IOptimizer> item in e.Items) {
217        RegisterOptimizerEvents(item.Value);
218      }
219    }
220    private void Optimizers_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<IOptimizer>> e) {
221      foreach (IndexedItem<IOptimizer> item in e.Items) {
222        RegisterOptimizerEvents(item.Value);
223      }
224    }
225    private void Optimizers_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<IOptimizer>> e) {
226      foreach (IndexedItem<IOptimizer> item in e.Items) {
227        DeregisterOptimizerEvents(item.Value);
228      }
229    }
230    private void Optimizers_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<IOptimizer>> e) {
231      foreach (IndexedItem<IOptimizer> item in e.OldItems) {
232        DeregisterOptimizerEvents(item.Value);
233      }
234      foreach (IndexedItem<IOptimizer> item in e.Items) {
235        RegisterOptimizerEvents(item.Value);
236      }
237    }
238
239    private void RegisterOptimizerEvents(IOptimizer optimizer) {
240      optimizer.ExceptionOccurred += new EventHandler<EventArgs<Exception>>(optimizer_ExceptionOccurred);
241      optimizer.ExecutionTimeChanged += new EventHandler(optimizer_ExecutionTimeChanged);
242      optimizer.Paused += new EventHandler(optimizer_Paused);
243      optimizer.Prepared += new EventHandler(optimizer_Prepared);
244      optimizer.Started += new EventHandler(optimizer_Started);
245      optimizer.Stopped += new EventHandler(optimizer_Stopped);
246      optimizer.Runs.CollectionReset += new CollectionItemsChangedEventHandler<Run>(optimizer_Runs_CollectionReset);
247      optimizer.Runs.ItemsAdded += new CollectionItemsChangedEventHandler<Run>(optimizer_Runs_ItemsAdded);
248      optimizer.Runs.ItemsRemoved += new CollectionItemsChangedEventHandler<Run>(optimizer_Runs_ItemsRemoved);
249    }
250    private void DeregisterOptimizerEvents(IOptimizer optimizer) {
251      optimizer.ExceptionOccurred -= new EventHandler<EventArgs<Exception>>(optimizer_ExceptionOccurred);
252      optimizer.ExecutionTimeChanged -= new EventHandler(optimizer_ExecutionTimeChanged);
253      optimizer.Paused -= new EventHandler(optimizer_Paused);
254      optimizer.Prepared -= new EventHandler(optimizer_Prepared);
255      optimizer.Started -= new EventHandler(optimizer_Started);
256      optimizer.Stopped -= new EventHandler(optimizer_Stopped);
257      optimizer.Runs.CollectionReset -= new CollectionItemsChangedEventHandler<Run>(optimizer_Runs_CollectionReset);
258      optimizer.Runs.ItemsAdded -= new CollectionItemsChangedEventHandler<Run>(optimizer_Runs_ItemsAdded);
259      optimizer.Runs.ItemsRemoved -= new CollectionItemsChangedEventHandler<Run>(optimizer_Runs_ItemsRemoved);
260    }
261    private void optimizer_ExceptionOccurred(object sender, EventArgs<Exception> e) {
262      OnExceptionOccurred(e.Value);
263    }
264    private void optimizer_ExecutionTimeChanged(object sender, EventArgs e) {
265      ExecutionTime = Optimizers.Aggregate(TimeSpan.Zero, (t, o) => t + o.ExecutionTime);
266    }
267    private void optimizer_Paused(object sender, EventArgs e) {
268      if (Optimizers.All(x => x.ExecutionState != ExecutionState.Started))
269        OnPaused();
270    }
271    private void optimizer_Prepared(object sender, EventArgs e) {
272      if (ExecutionState == ExecutionState.Stopped)
273        OnPrepared();
274    }
275    private void optimizer_Started(object sender, EventArgs e) {
276      if (ExecutionState != ExecutionState.Started)
277        OnStarted();
278    }
279    private void optimizer_Stopped(object sender, EventArgs e) {
280      if (!stopPending && Optimizers.Any(x => (x.ExecutionState == ExecutionState.Prepared) || (x.ExecutionState == ExecutionState.Paused))) {
281        Optimizers.First(x => (x.ExecutionState == ExecutionState.Prepared) || (x.ExecutionState == ExecutionState.Paused)).Start();
282      } else {
283        if (Optimizers.All(x => (x.ExecutionState != ExecutionState.Started) && (x.ExecutionState != ExecutionState.Paused))) {
284          stopPending = false;
285          OnStopped();
286        }
287      }
288    }
289    private void optimizer_Runs_CollectionReset(object sender, CollectionItemsChangedEventArgs<Run> e) {
290      Runs.RemoveRange(e.OldItems);
291      Runs.AddRange(e.Items);
292    }
293    private void optimizer_Runs_ItemsAdded(object sender, CollectionItemsChangedEventArgs<Run> e) {
294      Runs.AddRange(e.Items);
295    }
296    private void optimizer_Runs_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<Run> e) {
297      Runs.RemoveRange(e.Items);
298    }
299    #endregion
300  }
301}
Note: See TracBrowser for help on using the repository browser.