Free cookie consent management tool by TermsFeed Policy Generator

source: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterConfigurationTree.cs @ 5522

Last change on this file since 5522 was 5359, checked in by cneumuel, 14 years ago

#1215

  • renamed RunsAnalyzer to SolutionCacheAnalyzer
  • only most recent results will stay in cache to avoid memory problems
  • some minor tweaks and bugfixes
File size: 8.0 KB
RevLine 
[5112]1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using HeuristicLab.Core;
6using HeuristicLab.Common;
7using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
8using HeuristicLab.Optimization;
9using HeuristicLab.Data;
[5144]10using System.Collections;
[5112]11
12namespace HeuristicLab.Problems.MetaOptimization {
13  // todo: storable, name, descr, ...
14  [StorableClass]
[5144]15  public class ParameterConfigurationTree : ValueConfiguration, IEnumerable {
[5212]16
[5112]17    [Storable]
[5212]18    private DoubleValue averageQualityNormalized;
19    public DoubleValue AverageQualityNormalized {
20      get { return averageQualityNormalized; }
[5112]21      set {
[5212]22        if (averageQualityNormalized != value) {
23          averageQualityNormalized = value;
[5112]24          OnQualityChanged();
25        }
26      }
27    }
28
29    [Storable]
[5212]30    private DoubleArray qualitiesNormalized;
31    public DoubleArray QualitiesNormalized {
32      get { return qualitiesNormalized; }
33      set {
34        if (qualitiesNormalized != value) {
35          qualitiesNormalized = value;
36        }
37      }
[5112]38    }
39
40    [Storable]
[5212]41    private DoubleArray bestQualities;
42    public DoubleArray BestQualities {
43      get { return bestQualities; }
44      set {
45        if (bestQualities != value) {
46          bestQualities = value;
47        }
48      }
[5112]49    }
50
51    [Storable]
[5212]52    private DoubleArray averageQualities;
53    public DoubleArray AverageQualities {
54      get { return averageQualities; }
55      set { averageQualities = value; }
[5112]56    }
57
58    [Storable]
[5212]59    private DoubleArray worstQualities;
60    public DoubleArray WorstQualities {
61      get { return worstQualities; }
62      set { worstQualities = value; }
[5112]63    }
64
65    [Storable]
[5212]66    private DoubleArray qualityVariances;
67    public DoubleArray QualityVariances {
68      get { return qualityVariances; }
69      set { qualityVariances = value; }
[5112]70    }
71
72    [Storable]
[5212]73    private DoubleArray qualityStandardDeviations;
74    public DoubleArray QualityStandardDeviations {
75      get { return qualityStandardDeviations; }
76      set { qualityStandardDeviations = value; }
77    }
78
79    [Storable]
80    private ItemList<TimeSpanValue> averageExecutionTimes;
81    public ItemList<TimeSpanValue> AverageExecutionTimes {
82      get { return averageExecutionTimes; }
83      set { averageExecutionTimes = value; }
84    }
85
86    [Storable]
[5112]87    private IntValue repetitions;
88    public IntValue Repetitions {
89      get { return repetitions; }
90      set { repetitions = value; }
91    }
92
93    [Storable]
94    protected RunCollection runs;
95    public RunCollection Runs {
96      get { return runs; }
97      set { runs = value; }
[5184]98    }
[5112]99
[5184]100    [Storable]
[5112]101    protected IDictionary<string, IItem> parameters;
102    public IDictionary<string, IItem> Parameters {
103      get { return parameters; }
104      set { parameters = value; }
105    }
106
[5313]107    [Storable]
108    protected string name;
109    public string Name {
110      get { return name; }
111      set { name = value; }
112    }
113
[5112]114    #region constructors and cloning
[5337]115    public ParameterConfigurationTree(IAlgorithm algorithm)
[5112]116      : base(null, algorithm.GetType()) {
117      this.Optimize = true; // root must always be optimized
118      this.parameters = new Dictionary<string, IItem>();
[5313]119      this.Name = algorithm.ItemName;
[5112]120      PopulateParameterConfigurations(algorithm);
121    }
122    public ParameterConfigurationTree() {
123    }
124    [StorableConstructor]
125    protected ParameterConfigurationTree(bool deserializing) : base(deserializing) { }
126    protected ParameterConfigurationTree(ParameterConfigurationTree original, Cloner cloner)
127      : base(original, cloner) {
[5359]128      this.averageQualityNormalized = cloner.Clone(original.averageQualityNormalized);
129      this.qualitiesNormalized = cloner.Clone(original.qualitiesNormalized);
[5212]130      this.bestQualities = cloner.Clone(original.BestQualities);
131      this.averageQualities = cloner.Clone(original.averageQualities);
132      this.worstQualities = cloner.Clone(original.worstQualities);
133      this.qualityStandardDeviations = cloner.Clone(original.qualityStandardDeviations);
134      this.qualityVariances = cloner.Clone(original.qualityVariances);
135      this.averageExecutionTimes = cloner.Clone(original.averageExecutionTimes);
[5184]136      this.repetitions = cloner.Clone(original.repetitions);
137      this.runs = cloner.Clone(original.runs);
[5112]138      this.parameters = new Dictionary<string, IItem>();
139      foreach (var p in original.parameters) {
140        this.parameters.Add(p.Key, cloner.Clone(p.Value));
141      }
[5359]142      this.name = original.name;
[5112]143    }
144    public override IDeepCloneable Clone(Cloner cloner) {
145      return new ParameterConfigurationTree(this, cloner);
146    }
147    [StorableHook(HookType.AfterDeserialization)]
148    private void AfterDeserialization() {
149    }
150    #endregion
151
152    public virtual void CollectResultValues(IDictionary<string, IItem> values) {
[5212]153      values.Add("RunsAverageExecutionTimes", AverageExecutionTimes);
[5112]154      values.Add("Repetitions", Repetitions);
[5212]155      values.Add("RunsBestQualities", BestQualities);
156      values.Add("RunsAverageQualities", AverageQualities);
157      values.Add("RunsWorstQualities", WorstQualities);
158      values.Add("RunsQualityVariances", QualityVariances);
159      values.Add("RunsQualityStandardDeviations", QualityStandardDeviations);
160      values.Add("QualitiesNormalized", QualitiesNormalized);
161      values.Add("AverageQualityNormalized", AverageQualityNormalized);
[5112]162      values.Add("Runs", Runs);
163    }
164
165    public virtual void CollectParameterValues(IDictionary<string, IItem> values) {
166      foreach (var p in parameters) {
167        values.Add(p);
168      }
169    }
170
171    #region Events
172    public event EventHandler QualityChanged;
173    private void OnQualityChanged() {
174      var handler = QualityChanged;
175      if (handler != null) handler(this, EventArgs.Empty);
176    }
177
178    private void Quality_ValueChanged(object sender, EventArgs e) {
179      OnQualityChanged();
180    }
181    #endregion
182
183    public override void Parameterize(IParameterizedItem item) {
[5207]184      this.parameters.Clear();
[5112]185      base.Parameterize(item);
186      ((IAlgorithm)item).CollectParameterValues(this.Parameters);
187    }
[5144]188
[5184]189    public Experiment GenerateExperiment(IAlgorithm algorithm, bool createBatchRuns, int repetitions) {
[5144]190      Experiment experiment = new Experiment();
191      foreach (IValueConfiguration combination in this) {
192        IAlgorithm clonedAlg = (IAlgorithm)algorithm.Clone();
[5184]193        clonedAlg.Name = combination.ParameterInfoString;
[5144]194        combination.Parameterize(clonedAlg);
[5184]195        clonedAlg.StoreAlgorithmInEachRun = false;
196        if (createBatchRuns) {
197          BatchRun batchRun = new BatchRun(string.Format("BatchRun: {0}", combination.ParameterInfoString));
[5313]198          batchRun.Optimizer = clonedAlg;
[5184]199          batchRun.Repetitions = repetitions;
200          experiment.Optimizers.Add(batchRun);
201        } else {
202          experiment.Optimizers.Add(clonedAlg);
203        }
[5144]204      }
205      return experiment;
206    }
207
[5184]208    public Experiment GenerateExperiment(IAlgorithm algorithm) {
209      return GenerateExperiment(algorithm, false, 0);
210    }
211
[5144]212    public IEnumerator GetEnumerator() {
213      IEnumerator enumerator = new ParameterCombinationsEnumerator(this);
214      enumerator.Reset();
215      return enumerator;
216    }
217
[5328]218    /// <summary>
219    /// returns the number of possible parameter combinations
220    /// </summary>
221    /// <param name="max">algorithm stops counting when max is reached. zero for infinite counting</param>
222    /// <returns></returns>
223    public long GetCombinationCount(long max) {
[5144]224      long cnt = 0;
225      foreach (var c in this) {
226        cnt++;
[5328]227        if (max > 0 && cnt >= max) {
228          return cnt;
229        }
[5144]230      }
231      return cnt;
232    }
[5303]233
234    public IOptimizable GetRandomOptimizable(IRandom random) {
235      List<IOptimizable> allOptimizables = GetAllOptimizables();
236      return allOptimizables[random.Next(allOptimizables.Count)];
237    }
[5313]238
239    public override string ToString() {
240      return this.Name;
241    }
[5112]242  }
243}
Note: See TracBrowser for help on using the repository browser.