Free cookie consent management tool by TermsFeed Policy Generator

source: addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/UpDownWalkAnalyzer.cs @ 16573

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

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

File size: 10.4 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System.Collections.Generic;
23using System.Drawing;
24using System.Linq;
25using HeuristicLab.Collections;
26using HeuristicLab.Common;
27using HeuristicLab.Core;
28using HeuristicLab.Data;
29using HeuristicLab.Operators;
30using HeuristicLab.Optimization.Operators;
31using HeuristicLab.Parameters;
32using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
33using HEAL.Attic;
34
35namespace HeuristicLab.Analysis.FitnessLandscape.Analysis {
36
37  [StorableType("0D054A87-A040-4DC5-A722-0952EE96C924")]
38  public class UpDownWalkAnalyzer : AlgorithmOperator, IQualityTrailAnalyzer {
39    public bool EnabledByDefault {
40      get { return false; }
41    }
42
43    #region Parameters
44    public LookupParameter<DataTable> QualityTrailParameter {
45      get { return (LookupParameter<DataTable>)Parameters["Quality Trail"]; }
46    }
47    public LookupParameter<VariableCollection> ResultsParameter {
48      get { return (LookupParameter<VariableCollection>)Parameters["Results"]; }
49    }
50    public LookupParameter<DataTable> UpDownStepsParameter {
51      get { return (LookupParameter<DataTable>)Parameters["UpDownSteps"]; }
52    }
53    public LookupParameter<DataTable> UpDownLevelsParameter {
54      get { return (LookupParameter<DataTable>)Parameters["UpDownLevels"]; }
55    }
56    public LookupParameter<DoubleValue> UpWalkLengthParameter {
57      get { return (LookupParameter<DoubleValue>)Parameters["UpWalkLength"]; }
58    }
59    public LookupParameter<DoubleValue> DownWalkLengthParameter {
60      get { return (LookupParameter<DoubleValue>)Parameters["DownWalkLength"]; }
61    }
62    public LookupParameter<DoubleValue> UpWalkLenVarParameter {
63      get { return (LookupParameter<DoubleValue>)Parameters["UpWalkLenVar"]; }
64    }
65    public LookupParameter<DoubleValue> DownWalkLenVarParameter {
66      get { return (LookupParameter<DoubleValue>)Parameters["DownWalkLenVar"]; }
67    }
68    public LookupParameter<DoubleValue> UpperLevelParameter {
69      get { return (LookupParameter<DoubleValue>)Parameters["UpperLevel"]; }
70    }
71    public LookupParameter<DoubleValue> LowerLevelParameter {
72      get { return (LookupParameter<DoubleValue>)Parameters["LowerLevel"]; }
73    }
74    public LookupParameter<DoubleValue> UpperVarianceParameter {
75      get { return (LookupParameter<DoubleValue>)Parameters["UpperVariance"]; }
76    }
77    public LookupParameter<DoubleValue> LowerVarianceParameter {
78      get { return (LookupParameter<DoubleValue>)Parameters["LowerVariance"]; }
79    }
80    #endregion
81
82    [StorableConstructor]
83    protected UpDownWalkAnalyzer(StorableConstructorFlag _) : base(_) { }
84    protected UpDownWalkAnalyzer(UpDownWalkAnalyzer original, Cloner cloner) : base(original, cloner) { }
85
86    public UpDownWalkAnalyzer() {
87      Parameters.Add(new LookupParameter<DataTable>("Quality Trail", "The qualities of the solutions"));
88      Parameters.Add(new LookupParameter<VariableCollection>("Results", "The collection of all results of this algorithm"));
89      Parameters.Add(new LookupParameter<DataTable>("UpDownSteps", "Distribution of upward and downward steps between extremes."));
90      Parameters.Add(new LookupParameter<DataTable>("UpDownLevels", "Distribution of upper and lower levels in up-down walks."));
91      Parameters.Add(new LookupParameter<DoubleValue>("DownWalkLength", "Average downward walk length."));
92      Parameters.Add(new LookupParameter<DoubleValue>("UpWalkLength", "Average updward walk length."));
93      Parameters.Add(new LookupParameter<DoubleValue>("UpWalkLenVar", "Upward walk length variance."));
94      Parameters.Add(new LookupParameter<DoubleValue>("DownWalkLenVar", "Downward walk length variance."));
95      Parameters.Add(new LookupParameter<DoubleValue>("UpperLevel", "Average maximum fitness value."));
96      Parameters.Add(new LookupParameter<DoubleValue>("LowerLevel", "Average minimum fitness value."));
97      Parameters.Add(new LookupParameter<DoubleValue>("LowerVariance", "Lower level variance."));
98      Parameters.Add(new LookupParameter<DoubleValue>("UpperVariance", "Upper level variance."));
99   
100
101      var resultsCollector = new ResultsCollector();
102      resultsCollector.CollectedValues.Add(new LookupParameter<DataTable>(UpDownStepsParameter.Name));
103      resultsCollector.CollectedValues.Add(new LookupParameter<DataTable>(UpDownLevelsParameter.Name));
104      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>(DownWalkLengthParameter.Name));
105      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>(UpWalkLengthParameter.Name));
106      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>(UpWalkLenVarParameter.Name));
107      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>(DownWalkLenVarParameter.Name));
108      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>(UpperLevelParameter.Name));
109      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>(LowerLevelParameter.Name));
110      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>(UpperVarianceParameter.Name));
111      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleValue>(LowerVarianceParameter.Name));
112
113      OperatorGraph.InitialOperator = resultsCollector;
114      resultsCollector.Successor = null;
115    }
116
117    public override IDeepCloneable Clone(Cloner cloner) {
118      return new UpDownWalkAnalyzer(this, cloner);
119    }
120
121    public override IOperation Apply() {
122      var stepsTable = GetOrCreateTable(UpDownStepsParameter, "Up", "Down");
123      var levelsTable = GetOrCreateTable(UpDownLevelsParameter, "Top", "Bottom");
124      DataTable qualityTrail = QualityTrailParameter.ActualValue;
125      if (qualityTrail != null && qualityTrail.Rows.Count > 0) {
126        var qualities = qualityTrail.Rows.First().Values.ToList();
127        if (qualities.Count > 2) {
128          var extremes = qualities
129            .Delta((a, b) => new {a, b, diff = b - a})
130            .Select((p, i) => new {p.a, p.b, p.diff, i = i+1})
131            .Delta((s1, s2) => new {
132              s1.i,
133              value = s2.a,
134              top = s1.diff >= 0 && s2.diff < 0,
135              bottom = s1.diff <= 0 && s2.diff > 0
136            })
137            .Where(x => x.top || x.bottom)
138            .GroupConsecutive(x => x.bottom)
139            .Select(g => g.Count() == 1
140                           ? g.First()
141                           : (g.First().bottom
142                                ? g.OrderBy(x => x.value).First()
143                                : g.OrderByDescending(x => x.value).First())).ToList();
144          var maxima = extremes.Where(x => x.top).ToList();
145          var minima = extremes.Where(x => x.bottom).ToList();
146          var tops = Enumerable.Repeat(new {length = 0, value = 0.0}, 0).ToList();
147          var bottoms = tops;
148          if (maxima.Count > 0 && minima.Count > 0) {
149            if (maxima.First().i < minima.First().i) {
150              bottoms = maxima.Zip(minima, (t, b) => new {length = b.i - t.i, b.value}).ToList();
151              minima.Insert(0, new {i = -1, value = 0.0, top = false, bottom = false});
152              tops = maxima.Zip(minima, (t, b) => new {length = t.i - b.i, t.value}).ToList();
153            } else {
154              tops = maxima.Zip(minima, (t, b) => new {length = t.i - b.i, t.value}).ToList();
155              maxima.Insert(0, new {i = -1, value = 0.0, top = false, bottom = false});
156              bottoms = maxima.Zip(minima, (t, b) => new {length = b.i - t.i, b.value}).ToList();
157            }
158            if (tops.Count > 0) {
159              var topLengths = tops.Select(t => (double) t.length).ToList();
160              var topVals = tops.Select(t => t.value).ToList();
161              ReplaceHistogram(stepsTable.Rows["Up"], topLengths);
162              ReplaceHistogram(levelsTable.Rows["Top"], topVals);
163              UpperLevelParameter.ActualValue = new DoubleValue(topVals.Average());
164              UpperVarianceParameter.ActualValue = new DoubleValue(topVals.Variance());
165              UpWalkLengthParameter.ActualValue = new DoubleValue(topLengths.Average());
166              UpWalkLenVarParameter.ActualValue = new DoubleValue(topLengths.Variance());
167            }
168            if (bottoms.Count > 0) {
169              var bottomLengths = bottoms.Select(b => (double) b.length).ToList();
170              var bottomVals = bottoms.Select(b => b.value).ToList();
171              ReplaceHistogram(stepsTable.Rows["Down"], bottomLengths);
172              ReplaceHistogram(levelsTable.Rows["Bottom"], bottomVals);
173              LowerLevelParameter.ActualValue = new DoubleValue(bottomVals.Average());
174              LowerVarianceParameter.ActualValue = new DoubleValue(bottomVals.Variance());
175              DownWalkLengthParameter.ActualValue = new DoubleValue(bottomLengths.Average());
176              DownWalkLenVarParameter.ActualValue = new DoubleValue(bottomLengths.Variance());
177            }
178          }
179        }
180      }
181      return base.Apply();
182    }
183
184    private void ReplaceHistogram(DataRow row, IEnumerable<double> values) {
185      row.VisualProperties.ChartType = DataRowVisualProperties.DataRowChartType.Histogram;
186      row.Values.Clear();
187      row.Values.AddRange(values);
188    }
189
190    private DataTable GetOrCreateTable(LookupParameter<DataTable> tableParameter, params string[] rowNames) {
191      DataTable table = tableParameter.ActualValue;
192      if (table == null) {
193        table = new DataTable(tableParameter.Name, tableParameter.Description) {
194          VisualProperties = { HistogramBins = 25 }
195        };
196        tableParameter.ActualValue = table;
197        foreach (var name in rowNames) {
198          table.Rows.Add(new DataRow(name));
199        }
200      }
201      return table;
202    }
203  }
204}
Note: See TracBrowser for help on using the repository browser.