Free cookie consent management tool by TermsFeed Policy Generator

source: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterConfigurationTree.cs @ 16574

Last change on this file since 16574 was 16574, checked in by gkronber, 5 years ago

#2520: changed HeuristicLab.MetaOptimization addon to compile with new HL.Persistence

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