Free cookie consent management tool by TermsFeed Policy Generator

source: branches/Sliding Window GP/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SlidingWindow/SlidingWindowAnalyzer.cs @ 10413

Last change on this file since 10413 was 10413, checked in by bburlacu, 10 years ago

#1837: Modified the SlidingWindowBestSolutionsCollection to use a dictionary for sliding window positions mapped to best solutions, because the last sliding window position before the algorithm reached its stop was not registered correctly.

File size: 10.8 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2012 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;
23using System.Linq;
24using HeuristicLab.Common;
25using HeuristicLab.Core;
26using HeuristicLab.Data;
27using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
28using HeuristicLab.Operators;
29using HeuristicLab.Optimization;
30using HeuristicLab.Parameters;
31using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
32
33namespace HeuristicLab.Problems.DataAnalysis.Symbolic {
34  [StorableClass]
35  [Item("Sliding Window GP Analyzer", "Base class for concrete sliding window GP analyzers.")]
36  public abstract class SlidingWindowAnalyzer : SymbolicDataAnalysisSingleObjectiveAnalyzer {
37    private const string ProblemDataParameterName = "ProblemData";
38    private const string EvaluatorParameterName = "Evaluator";
39    private const string FitnessCalculationPartitionParameterName = "FitnessCalculationPartition";
40    private const string ValidationPartitionParameterName = "ValidationPartition";
41    private const string SlidingWindowSizeParameterName = "Sliding Window Size";
42    private const string ValidationSlidingWindowSizeParameterName = "Validation Sliding Window Size";
43    private const string SlidingWindowStepWidthParameterName = "Sliding Window Step Width";
44    private const string InitialSlidingWindowParameterName = "Initial Sliding Window";
45    private const string TerminateSlidingWindowParameterName = "TerminateSlidingWindow";
46    private const string InterpreterParameterName = "SymbolicExpressionTreeInterpreter";
47
48    #region parameter properties
49    private ILookupParameter<ISymbolicDataAnalysisExpressionTreeInterpreter> InterpreterParameter {
50      get { return (ILookupParameter<ISymbolicDataAnalysisExpressionTreeInterpreter>)Parameters[InterpreterParameterName]; }
51    }
52    public IValueLookupParameter<IDataAnalysisProblemData> ProblemDataParameter {
53      get { return (IValueLookupParameter<IDataAnalysisProblemData>)Parameters[ProblemDataParameterName]; }
54    }
55    public ILookupParameter<IntRange> FitnessCalculationPartitionParameter {
56      get { return (ILookupParameter<IntRange>)Parameters[FitnessCalculationPartitionParameterName]; }
57    }
58    public ILookupParameter<IntRange> ValidationPartitionParameter {
59      get { return (ILookupParameter<IntRange>)Parameters[ValidationPartitionParameterName]; }
60    }
61    public IFixedValueParameter<IntValue> SlidingWindowSizeParameter {
62      get { return (IFixedValueParameter<IntValue>)Parameters[SlidingWindowSizeParameterName]; }
63    }
64    public IFixedValueParameter<IntValue> ValidationSlidingWindowSizeParameter {
65      get { return (IFixedValueParameter<IntValue>)Parameters[ValidationSlidingWindowSizeParameterName]; }
66    }
67    public IFixedValueParameter<IntValue> SlidingWindowStepWidthParameter {
68      get { return (IFixedValueParameter<IntValue>)Parameters[SlidingWindowStepWidthParameterName]; }
69    }
70    public IFixedValueParameter<IntRange> InitialSlidingWindowParameter {
71      get { return (IFixedValueParameter<IntRange>)Parameters[InitialSlidingWindowParameterName]; }
72    }
73    public ILookupParameter<BoolValue> TerminateSlidingWindowParameter {
74      get { return (ILookupParameter<BoolValue>)Parameters[TerminateSlidingWindowParameterName]; }
75    }
76    public ILookupParameter<IEvaluator> EvaluatorParameter {
77      get { return (ILookupParameter<IEvaluator>)Parameters[EvaluatorParameterName]; }
78    }
79    #endregion
80
81    #region properties
82    public override bool EnabledByDefault { get { return false; } }
83    public IntValue SlidingWindowSize { get { return SlidingWindowSizeParameter.Value; } }
84    public IntValue ValidationSlidingWindowSize { get { return ValidationSlidingWindowSizeParameter.Value; } }
85    public IntValue SlidingWindowStepWidth { get { return SlidingWindowStepWidthParameter.Value; } }
86    public IntRange InitialSlidingWindow { get { return InitialSlidingWindowParameter.Value; } }
87    public ISymbolicDataAnalysisExpressionTreeInterpreter Interpreter { get { return InterpreterParameter.ActualValue; } }
88    public IDataAnalysisProblemData ProblemData { get { return ProblemDataParameter.ActualValue; } }
89    #endregion
90
91    [StorableConstructor]
92    protected SlidingWindowAnalyzer(bool deserializing) : base(deserializing) { }
93    protected SlidingWindowAnalyzer(SlidingWindowAnalyzer original, Cloner cloner)
94      : base(original, cloner) { }
95
96    protected SlidingWindowAnalyzer()
97      : base() {
98      Parameters.Add(new ValueLookupParameter<IDataAnalysisProblemData>(ProblemDataParameterName, "The problem data on which the symbolic data analysis solution should be evaluated."));
99      Parameters.Add(new LookupParameter<IEvaluator>(EvaluatorParameterName, ""));
100      Parameters.Add(new LookupParameter<IntRange>(FitnessCalculationPartitionParameterName, ""));
101      Parameters.Add(new LookupParameter<IntRange>(ValidationPartitionParameterName, ""));
102      Parameters.Add(new FixedValueParameter<IntValue>(SlidingWindowSizeParameterName, "", new IntValue(1)));
103      Parameters.Add(new FixedValueParameter<IntValue>(ValidationSlidingWindowSizeParameterName, "", new IntValue(0)));
104      Parameters.Add(new FixedValueParameter<IntValue>(SlidingWindowStepWidthParameterName, "", new IntValue(1)));
105      Parameters.Add(new FixedValueParameter<IntRange>(InitialSlidingWindowParameterName, "", new IntRange(0, 1)));
106      Parameters.Add(new LookupParameter<BoolValue>(TerminateSlidingWindowParameterName, ""));
107      if (!Parameters.ContainsKey(InterpreterParameterName))
108        Parameters.Add(new LookupParameter<ISymbolicDataAnalysisExpressionTreeInterpreter>(InterpreterParameterName, ""));
109      if (!Parameters.ContainsKey("Quality"))
110        Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", ""));
111      if (!Parameters.ContainsKey("Maximization"))
112        Parameters.Add(new LookupParameter<BoolValue>("Maximization", "The direction of optimization."));
113      ProblemDataParameter.Hidden = true;
114
115    }
116
117    [StorableHook(HookType.AfterDeserialization)]
118    private void AfterDeserialization() {
119      if (!Parameters.ContainsKey(EvaluatorParameterName))
120        Parameters.Add(new LookupParameter<IEvaluator>(EvaluatorParameterName, ""));
121      if (!Parameters.ContainsKey(InterpreterParameterName))
122        Parameters.Add(new LookupParameter<ISymbolicDataAnalysisExpressionTreeInterpreter>(InterpreterParameterName, ""));
123      if (!Parameters.ContainsKey("Quality"))
124        Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", ""));
125      if (!Parameters.ContainsKey("Maximization"))
126        Parameters.Add(new LookupParameter<BoolValue>("Maximization", "The direction of optimization."));
127      if (!Parameters.ContainsKey(ProblemDataParameterName))
128        Parameters.Add(new LookupParameter<IDataAnalysisProblemData>(ProblemDataParameterName));
129    }
130
131    public override IOperation Apply() {
132      //intialize sliding window
133      if (FitnessCalculationPartitionParameter.ActualValue == null) {
134        TerminateSlidingWindowParameter.ActualValue = new BoolValue(false);
135        FitnessCalculationPartitionParameter.ActualValue = (IntRange)InitialSlidingWindow.Clone();
136        ValidationPartitionParameter.ActualValue = new IntRange(InitialSlidingWindow.End, InitialSlidingWindow.End + ValidationSlidingWindowSize.Value);
137        return base.Apply();
138      }
139
140      SaveBestSolution();
141
142      if (!CheckForUpdate()) return base.Apply();
143
144      //update necessary - move sliding window
145      var fitnessPartition = (IntRange)FitnessCalculationPartitionParameter.ActualValue.Clone();
146      if (fitnessPartition.End - fitnessPartition.Start == SlidingWindowSize.Value)
147        fitnessPartition.Start += SlidingWindowStepWidth.Value;
148
149      fitnessPartition.End += SlidingWindowStepWidth.Value;
150      if (fitnessPartition.End - fitnessPartition.Start > SlidingWindowSize.Value)
151        fitnessPartition.End = fitnessPartition.Start + SlidingWindowSize.Value;
152
153      //check if update should be performed or if the algorithm should stop
154      if (fitnessPartition.End > ProblemDataParameter.ActualValue.TrainingPartition.End) {
155        TerminateSlidingWindowParameter.ActualValue.Value = true;
156        return base.Apply();
157      }
158
159      FitnessCalculationPartitionParameter.ActualValue.Start = fitnessPartition.Start;
160      FitnessCalculationPartitionParameter.ActualValue.End = fitnessPartition.End;
161      ValidationPartitionParameter.ActualValue.Start = fitnessPartition.End;
162      ValidationPartitionParameter.ActualValue.End = ValidationPartitionParameter.ActualValue.Start + ValidationSlidingWindowSize.Value;
163
164      //reevaluate all individuals with new sliding window
165      UniformSubScopesProcessor subScopesProcessor = new UniformSubScopesProcessor();
166      subScopesProcessor.Operator = EvaluatorParameter.ActualValue;
167      subScopesProcessor.Depth.Value = 1;
168      var operation = ExecutionContext.CreateChildOperation(subScopesProcessor);
169      var successor = base.Apply();
170      return new OperationCollection() { operation, successor };
171    }
172
173    private ISymbolicExpressionTree FindBestIndividual() {
174      var pop = SymbolicExpressionTree.Zip(Quality, (t, q) => new { Tree = t, Quality = q.Value }).ToList();
175      Func<double, double, int> comparer = (a, b) => Maximization.Value ? a.CompareTo(b) : b.CompareTo(a);
176      pop.Sort((a, b) => comparer(a.Quality, b.Quality));
177      return pop.Last().Tree;
178    }
179
180    private void SaveBestSolution() {
181      var bestSolutionsCollection = (SlidingWindowBestSolutionsCollection)ResultCollection["Best Solutions"].Value;
182
183      if (bestSolutionsCollection.ProblemData == null)
184        bestSolutionsCollection.ProblemData = ProblemData;
185
186      if (bestSolutionsCollection.Interpreter == null)
187        bestSolutionsCollection.Interpreter = Interpreter;
188
189      var fitnessPartition = FitnessCalculationPartitionParameter.ActualValue;
190      var best = FindBestIndividual();
191      var range = new Tuple<int, int>(fitnessPartition.Start, fitnessPartition.End);
192
193      bestSolutionsCollection[range] = best;
194    }
195
196    protected abstract bool CheckForUpdate();
197  }
198}
Note: See TracBrowser for help on using the repository browser.