Free cookie consent management tool by TermsFeed Policy Generator

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

Last change on this file since 15318 was 10720, checked in by bburlacu, 11 years ago

#1837: Moved quality calculation inside the SlidingWindowBestSolutionsCollection so that data can be cached across views. Added background worker for calculating qualities for each solution on all intervals. Added method for updating the qualities on the fly during the run (without recalculating). Added progress indicator for views.

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