Free cookie consent management tool by TermsFeed Policy Generator

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

Last change on this file since 9823 was 9823, checked in by jkarder, 11 years ago

#1099: adapted MetaOpt NamedItems

File size: 11.9 KB
Line 
1using System;
2using System.Collections;
3using System.Collections.Generic;
4using System.Linq;
5using System.Text;
6using HeuristicLab.Common;
7using HeuristicLab.Core;
8using HeuristicLab.Data;
9using HeuristicLab.Optimization;
10using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
11
12namespace HeuristicLab.Problems.MetaOptimization {
13  // todo: storable, name, descr, ...
14  [StorableClass]
15  public class ParameterConfigurationTree : ParameterizedValueConfiguration, IEnumerable {
16
17    [Storable]
18    private DoubleValue quality;
19    public DoubleValue Quality {
20      get { return quality; }
21      set {
22        if (quality != value) {
23          quality = value;
24          OnQualityChanged();
25        }
26      }
27    }
28
29    [Storable]
30    private DoubleArray normalizedQualityAverages;
31    public DoubleArray NormalizedQualityAverages {
32      get { return normalizedQualityAverages; }
33      set {
34        if (normalizedQualityAverages != value) {
35          normalizedQualityAverages = value;
36        }
37      }
38    }
39
40    [Storable]
41    private DoubleArray normalizedQualityDeviations;
42    public DoubleArray NormalizedQualityDeviations {
43      get { return normalizedQualityDeviations; }
44      set {
45        if (normalizedQualityDeviations != value) {
46          normalizedQualityDeviations = value;
47        }
48      }
49    }
50
51    [Storable]
52    private DoubleArray normalizedEvaluatedSolutions;
53    public DoubleArray NormalizedEvaluatedSolutions {
54      get { return normalizedEvaluatedSolutions; }
55      set {
56        if (normalizedEvaluatedSolutions != value) {
57          normalizedEvaluatedSolutions = value;
58        }
59      }
60    }
61
62    [Storable]
63    private DoubleArray bestQualities;
64    public DoubleArray BestQualities {
65      get { return bestQualities; }
66      set {
67        if (bestQualities != value) {
68          bestQualities = value;
69        }
70      }
71    }
72
73    [Storable]
74    private DoubleArray averageQualities;
75    public DoubleArray AverageQualities {
76      get { return averageQualities; }
77      set { averageQualities = value; }
78    }
79
80    [Storable]
81    private DoubleArray worstQualities;
82    public DoubleArray WorstQualities {
83      get { return worstQualities; }
84      set { worstQualities = value; }
85    }
86
87    [Storable]
88    private DoubleArray qualityVariances;
89    public DoubleArray QualityVariances {
90      get { return qualityVariances; }
91      set { qualityVariances = value; }
92    }
93
94    [Storable]
95    private DoubleArray qualityStandardDeviations;
96    public DoubleArray QualityStandardDeviations {
97      get { return qualityStandardDeviations; }
98      set { qualityStandardDeviations = value; }
99    }
100
101    [Storable]
102    private ItemList<TimeSpanValue> averageExecutionTimes;
103    public ItemList<TimeSpanValue> AverageExecutionTimes {
104      get { return averageExecutionTimes; }
105      set { averageExecutionTimes = value; }
106    }
107
108    [Storable]
109    private DoubleArray averageEvaluatedSolutions;
110    public DoubleArray AverageEvaluatedSolutions {
111      get { return averageEvaluatedSolutions; }
112      set { averageEvaluatedSolutions = value; }
113    }
114
115    [Storable]
116    private IntValue repetitions;
117    public IntValue Repetitions {
118      get { return repetitions; }
119      set { repetitions = value; }
120    }
121
122    [Storable]
123    protected RunCollection runs;
124    public RunCollection Runs {
125      get { return runs; }
126      set { runs = value; }
127    }
128
129    [Storable]
130    protected IDictionary<string, IItem> parameters;
131    public IDictionary<string, IItem> Parameters {
132      get { return parameters; }
133      set { parameters = value; }
134    }
135
136    public ParameterizedValueConfiguration AlgorithmConfiguration {
137      get {
138        return this.ParameterConfigurations.ElementAt(0).ValueConfigurations.First() as ParameterizedValueConfiguration;
139      }
140    }
141
142    public ParameterizedValueConfiguration ProblemConfiguration {
143      get {
144        return this.ParameterConfigurations.ElementAt(1).ValueConfigurations.First() as ParameterizedValueConfiguration;
145      }
146    }
147
148    #region constructors and cloning
149    public ParameterConfigurationTree(IAlgorithm algorithm, IProblem problem)
150      : base(null, algorithm.GetType(), false) {
151      this.Optimize = false;
152      this.IsOptimizable = false;
153      this.parameters = new Dictionary<string, IItem>();
154      this.Name = algorithm.ItemName;
155
156      var algproblemitem = new AlgorithmProblemItem();
157      algproblemitem.AlgorithmParameter.Value = algorithm;
158      algproblemitem.ProblemParameter.Value = problem;
159      this.discoverValidValues = false;
160
161      this.parameterConfigurations.Add(new SingleValuedParameterConfiguration("Algorithm", algproblemitem.AlgorithmParameter));
162      this.parameterConfigurations.Add(new SingleValuedParameterConfiguration("Problem", algproblemitem.ProblemParameter));
163
164      // problems can be modified in the list of problem instances, so the parameters which are not Optimize=true,
165      // must not be modifiable in the parameter configuration tree. otherwise the parameter values would be ambiguous
166      ProblemConfiguration.ValuesReadOnly = true;
167    }
168
169    public ParameterConfigurationTree()
170      : base() {
171      Name = "Parameter Configuration Tree";
172    }
173    [StorableConstructor]
174    protected ParameterConfigurationTree(bool deserializing) : base(deserializing) { }
175    protected ParameterConfigurationTree(ParameterConfigurationTree original, Cloner cloner)
176      : base(original, cloner) {
177      this.quality = cloner.Clone(original.quality);
178      this.normalizedQualityAverages = cloner.Clone(original.normalizedQualityAverages);
179      this.normalizedQualityDeviations = cloner.Clone(original.normalizedQualityDeviations);
180      this.normalizedEvaluatedSolutions = cloner.Clone(original.normalizedEvaluatedSolutions);
181      this.bestQualities = cloner.Clone(original.BestQualities);
182      this.averageQualities = cloner.Clone(original.averageQualities);
183      this.worstQualities = cloner.Clone(original.worstQualities);
184      this.qualityStandardDeviations = cloner.Clone(original.qualityStandardDeviations);
185      this.qualityVariances = cloner.Clone(original.qualityVariances);
186      this.averageExecutionTimes = cloner.Clone(original.averageExecutionTimes);
187      this.averageEvaluatedSolutions = cloner.Clone(original.averageEvaluatedSolutions);
188      this.repetitions = cloner.Clone(original.repetitions);
189      this.runs = cloner.Clone(original.runs);
190      this.parameters = new Dictionary<string, IItem>();
191      if (original.parameters != null) {
192        foreach (var p in original.parameters) {
193          this.parameters.Add(p.Key, cloner.Clone(p.Value));
194        }
195      }
196    }
197    public override IDeepCloneable Clone(Cloner cloner) {
198      return new ParameterConfigurationTree(this, cloner);
199    }
200    [StorableHook(HookType.AfterDeserialization)]
201    private void AfterDeserialization() {
202      if (ProblemConfiguration != null) ProblemConfiguration.ValuesReadOnly = true;
203    }
204    #endregion
205
206    public virtual void CollectResultValues(IDictionary<string, IItem> values) {
207      values.Add("RunsAverageExecutionTimes", AverageExecutionTimes);
208      values.Add("RunsAverageEvaluatedSolutions", AverageEvaluatedSolutions);
209      values.Add("Repetitions", Repetitions);
210      values.Add("RunsBestQualities", BestQualities);
211      values.Add("RunsAverageQualities", AverageQualities);
212      values.Add("RunsWorstQualities", WorstQualities);
213      values.Add("RunsQualityVariances", QualityVariances);
214      values.Add("RunsQualityStandardDeviations", QualityStandardDeviations);
215      values.Add("QualitiesNormalized", NormalizedQualityAverages);
216      values.Add("AverageQualityNormalized", Quality);
217      values.Add("Runs", Runs);
218    }
219
220    public virtual void CollectParameterValues(IDictionary<string, IItem> values) {
221      foreach (var p in parameters) {
222        values.Add(p);
223      }
224    }
225
226    #region Events
227    public event EventHandler QualityChanged;
228    private void OnQualityChanged() {
229      var handler = QualityChanged;
230      if (handler != null) handler(this, EventArgs.Empty);
231    }
232
233    private void Quality_ValueChanged(object sender, EventArgs e) {
234      OnQualityChanged();
235    }
236    #endregion
237
238    public override void Parameterize(IParameterizedItem item) {
239      this.parameters.Clear();
240      var algorithm = item as IAlgorithm;
241      var problem = algorithm.Problem;
242
243      ProblemConfiguration.Parameterize(problem);
244      AlgorithmConfiguration.Parameterize(algorithm);
245
246      algorithm.CollectParameterValues(this.Parameters);
247    }
248
249    public Experiment GenerateExperiment(IAlgorithm algorithm, bool createBatchRuns, int repetitions) {
250      Experiment experiment = new Experiment();
251      foreach (ParameterizedValueConfiguration combination in this) {
252        IAlgorithm clonedAlg = (IAlgorithm)algorithm.Clone();
253        clonedAlg.Name = combination.ParameterInfoString;
254        combination.Parameterize(clonedAlg);
255        clonedAlg.StoreAlgorithmInEachRun = false;
256        if (createBatchRuns) {
257          BatchRun batchRun = new BatchRun(string.Format("BatchRun: {0}", combination.ParameterInfoString));
258          batchRun.Optimizer = clonedAlg;
259          batchRun.Repetitions = repetitions;
260          experiment.Optimizers.Add(batchRun);
261        } else {
262          experiment.Optimizers.Add(clonedAlg);
263        }
264      }
265      return experiment;
266    }
267
268    public Experiment GenerateExperiment(IAlgorithm algorithm) {
269      return GenerateExperiment(algorithm, false, 0);
270    }
271
272    public IEnumerator GetEnumerator() {
273      IEnumerator enumerator = new ParameterCombinationsEnumerator(this);
274      enumerator.Reset();
275      return enumerator;
276    }
277
278    /// <summary>
279    /// returns the number of possible parameter combinations
280    /// </summary>
281    /// <param name="max">algorithm stops counting when max is reached. zero for infinite counting</param>
282    /// <returns></returns>
283    public long GetCombinationCount(long max) {
284      long cnt = 0;
285      foreach (var c in this) {
286        cnt++;
287        if (max > 0 && cnt >= max) {
288          return cnt;
289        }
290      }
291      return cnt;
292    }
293
294    public IOptimizable GetRandomOptimizable(IRandom random) {
295      List<IOptimizable> allOptimizables = GetAllOptimizables();
296      return allOptimizables[random.Next(allOptimizables.Count)];
297    }
298
299    public override string ToString() {
300      return this.Name;
301    }
302
303    public IRun ToRun(bool clearParameters) {
304      return ToRun(this.ParameterInfoString, clearParameters);
305    }
306
307    public IRun ToRun(string name, bool clearParameters) {
308      IRun run = new Run();
309      run.Name = name;
310      this.CollectResultValues(run.Results);
311      this.CollectParameterValues(run.Parameters);
312      if (clearParameters) MetaOptimizationUtil.ClearParameters(run, this.GetOptimizedParameterNames());
313      return run;
314    }
315
316    public override string ParameterInfoString {
317      get {
318        string algorithmInfo = this.AlgorithmConfiguration.ParameterInfoString;
319        string problemInfo = this.ProblemConfiguration.ParameterInfoString;
320        var sb = new StringBuilder();
321        if (!string.IsNullOrEmpty(algorithmInfo)) {
322          sb.Append("Algorithm (");
323          sb.Append(algorithmInfo);
324          sb.Append(")");
325        }
326        if (!string.IsNullOrEmpty(problemInfo)) {
327          if (sb.Length > 0)
328            sb.Append(", ");
329          sb.Append("Problem( ");
330          sb.Append(problemInfo);
331          sb.Append(")");
332        }
333        return sb.ToString();
334      }
335    }
336
337    public override void CollectOptimizedParameterNames(List<string> parameterNames, string prefix) {
338      AlgorithmConfiguration.CollectOptimizedParameterNames(parameterNames, string.Empty);
339      ProblemConfiguration.CollectOptimizedParameterNames(parameterNames, string.Empty);
340    }
341  }
342}
Note: See TracBrowser for help on using the repository browser.