#region License Information
/* HeuristicLab
* Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
*
* This file is part of HeuristicLab.
*
* HeuristicLab is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* HeuristicLab is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with HeuristicLab. If not, see .
*/
#endregion
using System;
using System.Collections.Generic;
using HeuristicLab.Common;
using HeuristicLab.Core;
using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
using System.Drawing;
namespace HeuristicLab.Optimization {
///
/// Represents the parameters and results of an algorithm run.
///
[Item("Run", "The parameters and results of an algorithm run.")]
[StorableClass]
public sealed class Run : NamedItem, IRun {
[Storable]
private IAlgorithm algorithm;
public IAlgorithm Algorithm {
get { return algorithm; }
}
[Storable]
private Dictionary parameters;
public IDictionary Parameters {
get { return parameters; }
}
[Storable]
private Dictionary results;
public IDictionary Results {
get { return results; }
}
private Color color = Color.Black;
public Color Color {
get { return this.color; }
set {
if (color != value) {
this.color = value;
this.OnChanged();
}
}
}
private bool visible = true;
public bool Visible {
get { return this.visible; }
set {
if (visible != value) {
this.visible = value;
this.OnChanged();
}
}
}
public event EventHandler Changed;
private void OnChanged() {
EventHandler handler = Changed;
if (handler != null)
handler(this, EventArgs.Empty);
}
public Run()
: base() {
name = ItemName;
description = ItemDescription;
algorithm = null;
parameters = new Dictionary();
results = new Dictionary();
}
public Run(IAlgorithm algorithm)
: base() {
if (algorithm == null) throw new ArgumentNullException();
name = algorithm.Name + " Run (" + algorithm.ExecutionTime.ToString() + ")";
description = ItemDescription;
Initialize((IAlgorithm)algorithm.Clone());
}
public Run(string name, IAlgorithm algorithm)
: base(name) {
if (algorithm == null) throw new ArgumentNullException();
description = ItemDescription;
Initialize((IAlgorithm)algorithm.Clone());
}
public Run(string name, string description, IAlgorithm algorithm)
: base(name, description) {
if (algorithm == null) throw new ArgumentNullException();
Initialize((IAlgorithm)algorithm.Clone());
}
private void Initialize(IAlgorithm algorithm) {
this.algorithm = algorithm;
parameters = new Dictionary();
results = new Dictionary();
this.algorithm.CollectParameterValues(parameters);
this.algorithm.CollectResultValues(results);
this.algorithm.Prepare(true);
}
public override IDeepCloneable Clone(Cloner cloner) {
Run clone = (Run)base.Clone(cloner);
clone.algorithm = (IAlgorithm)cloner.Clone(algorithm);
foreach (string key in parameters.Keys)
clone.parameters.Add(key, (IItem)cloner.Clone(parameters[key]));
foreach (string key in results.Keys)
clone.results.Add(key, (IItem)cloner.Clone(results[key]));
return clone;
}
}
}