Free cookie consent management tool by TermsFeed Policy Generator

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

Last change on this file since 5212 was 5212, checked in by cneumuel, 13 years ago

#1215

  • added normalization for quality values of individuals
File size: 7.0 KB
Line 
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;
10using System.Collections;
11
12namespace HeuristicLab.Problems.MetaOptimization {
13  // todo: storable, name, descr, ...
14  [StorableClass]
15  public class ParameterConfigurationTree : ValueConfiguration, IEnumerable {
16
17    [Storable]
18    private DoubleValue averageQualityNormalized;
19    public DoubleValue AverageQualityNormalized {
20      get { return averageQualityNormalized; }
21      set {
22        if (averageQualityNormalized != value) {
23          averageQualityNormalized = value;
24          OnQualityChanged();
25        }
26      }
27    }
28
29    [Storable]
30    private DoubleArray qualitiesNormalized;
31    public DoubleArray QualitiesNormalized {
32      get { return qualitiesNormalized; }
33      set {
34        if (qualitiesNormalized != value) {
35          qualitiesNormalized = value;
36        }
37      }
38    }
39
40    [Storable]
41    private DoubleArray bestQualities;
42    public DoubleArray BestQualities {
43      get { return bestQualities; }
44      set {
45        if (bestQualities != value) {
46          bestQualities = value;
47        }
48      }
49    }
50
51    [Storable]
52    private DoubleArray averageQualities;
53    public DoubleArray AverageQualities {
54      get { return averageQualities; }
55      set { averageQualities = value; }
56    }
57
58    [Storable]
59    private DoubleArray worstQualities;
60    public DoubleArray WorstQualities {
61      get { return worstQualities; }
62      set { worstQualities = value; }
63    }
64
65    [Storable]
66    private DoubleArray qualityVariances;
67    public DoubleArray QualityVariances {
68      get { return qualityVariances; }
69      set { qualityVariances = value; }
70    }
71
72    [Storable]
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]
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; }
98    }
99
100    [Storable]
101    protected IDictionary<string, IItem> parameters;
102    public IDictionary<string, IItem> Parameters {
103      get { return parameters; }
104      set { parameters = value; }
105    }
106
107    #region constructors and cloning
108    public ParameterConfigurationTree(EngineAlgorithm algorithm)
109      : base(null, algorithm.GetType()) {
110      this.Optimize = true; // root must always be optimized
111      this.parameters = new Dictionary<string, IItem>();
112
113      PopulateParameterConfigurations(algorithm);
114    }
115    public ParameterConfigurationTree() {
116    }
117    [StorableConstructor]
118    protected ParameterConfigurationTree(bool deserializing) : base(deserializing) { }
119    protected ParameterConfigurationTree(ParameterConfigurationTree original, Cloner cloner)
120      : base(original, cloner) {
121      this.bestQualities = cloner.Clone(original.BestQualities);
122      this.averageQualities = cloner.Clone(original.averageQualities);
123      this.worstQualities = cloner.Clone(original.worstQualities);
124      this.qualityStandardDeviations = cloner.Clone(original.qualityStandardDeviations);
125      this.qualityVariances = cloner.Clone(original.qualityVariances);
126      this.averageExecutionTimes = cloner.Clone(original.averageExecutionTimes);
127      this.repetitions = cloner.Clone(original.repetitions);
128      this.runs = cloner.Clone(original.runs);
129      this.parameters = new Dictionary<string, IItem>();
130      foreach (var p in original.parameters) {
131        this.parameters.Add(p.Key, cloner.Clone(p.Value));
132      }
133    }
134    public override IDeepCloneable Clone(Cloner cloner) {
135      return new ParameterConfigurationTree(this, cloner);
136    }
137    [StorableHook(HookType.AfterDeserialization)]
138    private void AfterDeserialization() {
139    }
140    #endregion
141
142    public virtual void CollectResultValues(IDictionary<string, IItem> values) {
143      values.Add("RunsAverageExecutionTimes", AverageExecutionTimes);
144      values.Add("Repetitions", Repetitions);
145      values.Add("RunsBestQualities", BestQualities);
146      values.Add("RunsAverageQualities", AverageQualities);
147      values.Add("RunsWorstQualities", WorstQualities);
148      values.Add("RunsQualityVariances", QualityVariances);
149      values.Add("RunsQualityStandardDeviations", QualityStandardDeviations);
150      values.Add("QualitiesNormalized", QualitiesNormalized);
151      values.Add("AverageQualityNormalized", AverageQualityNormalized);
152      values.Add("Runs", Runs);
153    }
154
155    public virtual void CollectParameterValues(IDictionary<string, IItem> values) {
156      foreach (var p in parameters) {
157        values.Add(p);
158      }
159    }
160
161    #region Events
162    public event EventHandler QualityChanged;
163    private void OnQualityChanged() {
164      var handler = QualityChanged;
165      if (handler != null) handler(this, EventArgs.Empty);
166    }
167
168    private void Quality_ValueChanged(object sender, EventArgs e) {
169      OnQualityChanged();
170    }
171    #endregion
172
173    public override void Parameterize(IParameterizedItem item) {
174      this.parameters.Clear();
175      base.Parameterize(item);
176      ((IAlgorithm)item).CollectParameterValues(this.Parameters);
177    }
178
179    public Experiment GenerateExperiment(IAlgorithm algorithm, bool createBatchRuns, int repetitions) {
180      Experiment experiment = new Experiment();
181      foreach (IValueConfiguration combination in this) {
182        IAlgorithm clonedAlg = (IAlgorithm)algorithm.Clone();
183        clonedAlg.Name = combination.ParameterInfoString;
184        combination.Parameterize(clonedAlg);
185        clonedAlg.StoreAlgorithmInEachRun = false;
186        if (createBatchRuns) {
187          BatchRun batchRun = new BatchRun(string.Format("BatchRun: {0}", combination.ParameterInfoString));
188          batchRun.Algorithm = clonedAlg;
189          batchRun.Repetitions = repetitions;
190          experiment.Optimizers.Add(batchRun);
191        } else {
192          experiment.Optimizers.Add(clonedAlg);
193        }
194      }
195      return experiment;
196    }
197
198    public Experiment GenerateExperiment(IAlgorithm algorithm) {
199      return GenerateExperiment(algorithm, false, 0);
200    }
201
202    public IEnumerator GetEnumerator() {
203      IEnumerator enumerator = new ParameterCombinationsEnumerator(this);
204      enumerator.Reset();
205      return enumerator;
206    }
207
208    public long GetCombinationCount() {
209      long cnt = 0;
210      foreach (var c in this) {
211        cnt++;
212      }
213      return cnt;
214    }
215  }
216}
Note: See TracBrowser for help on using the repository browser.