Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.GP.StructureIdentification/3.3/BaseClasses/AlgorithmBase.cs @ 2328

Last change on this file since 2328 was 2328, checked in by gkronber, 15 years ago

this is the remaining part of changeset r2327.
Applied changes in modeling plugins that are necessary for the new model analyzer (#722)

  • predictor has properties for the lower and upper limit of the predicted value
  • added views for predictors that show the limits (also added a new view for GeneticProgrammingModel that shows the size and height of the model)
  • Reintroduced TreeEvaluatorInjectors that read a PunishmentFactor and calculate the lower and upper limits for estimated values (limits are set in the tree evaluators)
  • Added operators to create Predictors. Changed modeling algorithms to use the predictors for the calculation of final model qualities and variable impacts (to be compatible with the new model analyzer the predictors use a very large PunishmentFactor)
  • replaced all private implementations of double.IsAlmost and use HL.Commons instead (see #733 r2324)
  • Implemented operator SolutionExtractor and moved BestSolutionStorer from HL.Logging to HL.Modeling (fixes #734)
File size: 35.8 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2008 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.Collections.Generic;
24using System.Xml;
25using HeuristicLab.Core;
26using HeuristicLab.Data;
27using HeuristicLab.DataAnalysis;
28using HeuristicLab.Evolutionary;
29using HeuristicLab.GP.Interfaces;
30using HeuristicLab.Logging;
31using HeuristicLab.Modeling;
32using HeuristicLab.Operators;
33using HeuristicLab.Random;
34using HeuristicLab.Selection;
35using HeuristicLab.Operators.Programmable;
36
37namespace HeuristicLab.GP.StructureIdentification {
38  public abstract class AlgorithmBase : ItemBase, IAlgorithm, IStochasticAlgorithm {
39    public virtual string Name { get { return "GP"; } }
40    public virtual string Description { get { return "TODO"; } }
41
42    public abstract Dataset Dataset { get; set; }
43    public abstract int TargetVariable { get; set; }
44
45    public virtual double MutationRate {
46      get { return GetVariableInjector().GetVariable("MutationRate").GetValue<DoubleData>().Data; }
47      set { GetVariableInjector().GetVariable("MutationRate").GetValue<DoubleData>().Data = value; }
48    }
49    public virtual int PopulationSize {
50      get { return GetVariableInjector().GetVariable("PopulationSize").GetValue<IntData>().Data; }
51      set { GetVariableInjector().GetVariable("PopulationSize").GetValue<IntData>().Data = value; }
52    }
53
54    public virtual bool SetSeedRandomly {
55      get { return GetRandomInjector().GetVariable("SetSeedRandomly").GetValue<BoolData>().Data; }
56      set { GetRandomInjector().GetVariable("SetSeedRandomly").GetValue<BoolData>().Data = value; }
57    }
58
59    public virtual int RandomSeed {
60      get { return GetRandomInjector().GetVariable("Seed").GetValue<IntData>().Data; }
61      set { GetRandomInjector().GetVariable("Seed").GetValue<IntData>().Data = value; }
62    }
63
64    public virtual IOperator ProblemInjector {
65      get { return algorithm.SubOperators[1]; }
66      set {
67        value.Name = "ProblemInjector";
68        algorithm.RemoveSubOperator(1);
69        algorithm.AddSubOperator(value, 1);
70      }
71    }
72
73    private IAnalyzerModel model;
74    public virtual IAnalyzerModel Model {
75      get {
76        if (!engine.Terminated) throw new InvalidOperationException("The algorithm is still running. Wait until the algorithm is terminated to retrieve the result.");
77        if (model == null) {
78          IScope bestModelScope = engine.GlobalScope.SubScopes[0];
79          model = CreateGPModel(bestModelScope);
80        }
81        return model;
82      }
83    }
84
85    public virtual int Elites {
86      get { return GetVariableInjector().GetVariable("Elites").GetValue<IntData>().Data; }
87      set { GetVariableInjector().GetVariable("Elites").GetValue<IntData>().Data = value; }
88    }
89
90    public virtual int MaxTreeSize {
91      get { return GetVariableInjector().GetVariable("MaxTreeSize").GetValue<IntData>().Data; }
92      set { GetVariableInjector().GetVariable("MaxTreeSize").GetValue<IntData>().Data = value; }
93    }
94
95    public virtual int MaxTreeHeight {
96      get { return GetVariableInjector().GetVariable("MaxTreeHeight").GetValue<IntData>().Data; }
97      set { GetVariableInjector().GetVariable("MaxTreeHeight").GetValue<IntData>().Data = value; }
98    }
99
100    public virtual int Parents {
101      get { return GetVariableInjector().GetVariable("Parents").GetValue<IntData>().Data; }
102      set { GetVariableInjector().GetVariable("Parents").GetValue<IntData>().Data = value; }
103    }
104
105    public virtual bool UseEstimatedTargetValue {
106      get { return GetVariableInjector().GetVariable("UseEstimatedTargetValue").GetValue<BoolData>().Data; }
107      set { GetVariableInjector().GetVariable("UseEstimatedTargetValue").GetValue<BoolData>().Data = value; }
108    }
109
110    private IOperator algorithm;
111
112    private SequentialEngine.SequentialEngine engine;
113    public IEngine Engine {
114      get { return engine; }
115      protected set { engine = (SequentialEngine.SequentialEngine)value; }
116    }
117
118    public AlgorithmBase() {
119      engine = new SequentialEngine.SequentialEngine();
120      CombinedOperator algo = CreateAlgorithm();
121      engine.OperatorGraph.AddOperator(algo);
122      engine.OperatorGraph.InitialOperator = algo;
123      SetSeedRandomly = true;
124      Elites = 1;
125      MutationRate = 0.15;
126      PopulationSize = 1000;
127      MaxTreeSize = 100;
128      MaxTreeHeight = 10;
129      Parents = 2000;
130      UseEstimatedTargetValue = false;
131    }
132
133    protected internal virtual CombinedOperator CreateAlgorithm() {
134      CombinedOperator algo = new CombinedOperator();
135      algo.Name = "GP";
136      SequentialProcessor seq = new SequentialProcessor();
137      IOperator problemInjector = CreateProblemInjector();
138
139      RandomInjector randomInjector = new RandomInjector();
140      randomInjector.Name = "Random Injector";
141
142      IOperator globalInjector = CreateGlobalInjector();
143      IOperator treeEvaluatorInjector = new HL2TreeEvaluatorInjector();
144      IOperator initialization = CreateInitialization();
145      IOperator funLibInjector = CreateFunctionLibraryInjector();
146
147      IOperator mainLoop = CreateMainLoop();
148      mainLoop.Name = "Main loop";
149
150      IOperator treeCreator = CreateTreeCreator();
151
152      MeanSquaredErrorEvaluator evaluator = new MeanSquaredErrorEvaluator();
153      evaluator.GetVariableInfo("MSE").ActualName = "Quality";
154      evaluator.GetVariableInfo("SamplesStart").ActualName = "ActualTrainingSamplesStart";
155      evaluator.GetVariableInfo("SamplesEnd").ActualName = "ActualTrainingSamplesEnd";
156      evaluator.Name = "Evaluator";
157
158      IOperator crossover = CreateCrossover();
159      IOperator manipulator = CreateManipulator();
160
161      IOperator selector = CreateSelector();
162      LeftReducer cleanUp = new LeftReducer();
163
164      seq.AddSubOperator(randomInjector);
165      seq.AddSubOperator(problemInjector);
166      seq.AddSubOperator(globalInjector);
167      seq.AddSubOperator(treeEvaluatorInjector);
168      seq.AddSubOperator(funLibInjector);
169      seq.AddSubOperator(initialization);
170      seq.AddSubOperator(mainLoop);
171      seq.AddSubOperator(cleanUp);
172      seq.AddSubOperator(CreateModelAnalysisOperator());
173
174      initialization.AddSubOperator(treeCreator);
175      initialization.AddSubOperator(evaluator);
176
177      mainLoop.AddSubOperator(selector);
178      mainLoop.AddSubOperator(crossover);
179      mainLoop.AddSubOperator(manipulator);
180      mainLoop.AddSubOperator(evaluator);
181      algo.OperatorGraph.AddOperator(seq);
182      algo.OperatorGraph.InitialOperator = seq;
183      this.algorithm = seq;
184      return algo;
185    }
186
187    protected internal virtual IOperator CreateModelAnalysisOperator() {
188      CombinedOperator op = new CombinedOperator();
189      SequentialProcessor seq = new SequentialProcessor();
190      SolutionExtractor extractor = new SolutionExtractor();
191      extractor.GetVariableInfo("Scope").ActualName = "BestValidationSolution";
192      SequentialSubScopesProcessor seqSubScopeProc = new SequentialSubScopesProcessor();
193      SequentialProcessor solutionProc = new SequentialProcessor();
194
195      seq.AddSubOperator(extractor);
196      seq.AddSubOperator(seqSubScopeProc);
197      seqSubScopeProc.AddSubOperator(solutionProc);
198
199      HL2TreeEvaluatorInjector evaluatorInjector = new HL2TreeEvaluatorInjector();
200      evaluatorInjector.AddVariable(new HeuristicLab.Core.Variable("PunishmentFactor", new DoubleData(1000.0)));
201      evaluatorInjector.GetVariableInfo("TreeEvaluator").ActualName = "ModelAnalysisTreeEvaluator";
202
203      #region MSE
204      MeanSquaredErrorEvaluator trainingMseEvaluator = new MeanSquaredErrorEvaluator();
205      trainingMseEvaluator.Name = "TrainingMseEvaluator";
206      trainingMseEvaluator.GetVariableInfo("TreeEvaluator").ActualName = "ModelAnalysisTreeEvaluator";
207      trainingMseEvaluator.GetVariableInfo("MSE").ActualName = "TrainingMSE";
208      trainingMseEvaluator.GetVariableInfo("SamplesStart").ActualName = "TrainingSamplesStart";
209      trainingMseEvaluator.GetVariableInfo("SamplesEnd").ActualName = "TrainingSamplesEnd";
210      MeanSquaredErrorEvaluator validationMseEvaluator = new MeanSquaredErrorEvaluator();
211      validationMseEvaluator.Name = "ValidationMseEvaluator";
212      validationMseEvaluator.GetVariableInfo("TreeEvaluator").ActualName = "ModelAnalysisTreeEvaluator";
213      validationMseEvaluator.GetVariableInfo("MSE").ActualName = "ValidationMSE";
214      validationMseEvaluator.GetVariableInfo("SamplesStart").ActualName = "ValidationSamplesStart";
215      validationMseEvaluator.GetVariableInfo("SamplesEnd").ActualName = "ValidationSamplesEnd";
216      MeanSquaredErrorEvaluator testMseEvaluator = new MeanSquaredErrorEvaluator();
217      testMseEvaluator.Name = "TestMeanSquaredErrorEvaluator";
218      testMseEvaluator.GetVariableInfo("TreeEvaluator").ActualName = "ModelAnalysisTreeEvaluator";
219      testMseEvaluator.GetVariableInfo("MSE").ActualName = "TestMSE";
220      testMseEvaluator.GetVariableInfo("SamplesStart").ActualName = "TestSamplesStart";
221      testMseEvaluator.GetVariableInfo("SamplesEnd").ActualName = "TestSamplesEnd";
222      #endregion
223      #region MAPE
224      MeanAbsolutePercentageErrorEvaluator trainingMapeEvaluator = new MeanAbsolutePercentageErrorEvaluator();
225      trainingMapeEvaluator.Name = "TrainingMapeEvaluator";
226      trainingMapeEvaluator.GetVariableInfo("TreeEvaluator").ActualName = "ModelAnalysisTreeEvaluator";
227      trainingMapeEvaluator.GetVariableInfo("MAPE").ActualName = "TrainingMAPE";
228      trainingMapeEvaluator.GetVariableInfo("SamplesStart").ActualName = "ActualTrainingSamplesStart";
229      trainingMapeEvaluator.GetVariableInfo("SamplesEnd").ActualName = "ActualTrainingSamplesEnd";
230      MeanAbsolutePercentageErrorEvaluator validationMapeEvaluator = new MeanAbsolutePercentageErrorEvaluator();
231      validationMapeEvaluator.GetVariableInfo("TreeEvaluator").ActualName = "ModelAnalysisTreeEvaluator";
232      validationMapeEvaluator.Name = "ValidationMapeEvaluator";
233      validationMapeEvaluator.GetVariableInfo("MAPE").ActualName = "ValidationMAPE";
234      validationMapeEvaluator.GetVariableInfo("SamplesStart").ActualName = "ValidationSamplesStart";
235      validationMapeEvaluator.GetVariableInfo("SamplesEnd").ActualName = "ValidationSamplesEnd";
236      MeanAbsolutePercentageErrorEvaluator testMapeEvaluator = new MeanAbsolutePercentageErrorEvaluator();
237      testMapeEvaluator.GetVariableInfo("TreeEvaluator").ActualName = "ModelAnalysisTreeEvaluator";
238      testMapeEvaluator.Name = "TestMapeEvaluator";
239      testMapeEvaluator.GetVariableInfo("MAPE").ActualName = "TestMAPE";
240      testMapeEvaluator.GetVariableInfo("SamplesStart").ActualName = "TestSamplesStart";
241      testMapeEvaluator.GetVariableInfo("SamplesEnd").ActualName = "TestSamplesEnd";
242      #endregion
243      #region MAPRE
244      MeanAbsolutePercentageOfRangeErrorEvaluator trainingMapreEvaluator = new MeanAbsolutePercentageOfRangeErrorEvaluator();
245      trainingMapreEvaluator.GetVariableInfo("TreeEvaluator").ActualName = "ModelAnalysisTreeEvaluator";
246      trainingMapreEvaluator.Name = "TrainingMapreEvaluator";
247      trainingMapreEvaluator.GetVariableInfo("MAPRE").ActualName = "TrainingMAPRE";
248      trainingMapreEvaluator.GetVariableInfo("SamplesStart").ActualName = "ActualTrainingSamplesStart";
249      trainingMapreEvaluator.GetVariableInfo("SamplesEnd").ActualName = "ActualTrainingSamplesEnd";
250      MeanAbsolutePercentageOfRangeErrorEvaluator validationMapreEvaluator = new MeanAbsolutePercentageOfRangeErrorEvaluator();
251      validationMapreEvaluator.GetVariableInfo("TreeEvaluator").ActualName = "ModelAnalysisTreeEvaluator";
252      validationMapreEvaluator.Name = "ValidationMapreEvaluator";
253      validationMapreEvaluator.GetVariableInfo("MAPRE").ActualName = "ValidationMAPRE";
254      validationMapreEvaluator.GetVariableInfo("SamplesStart").ActualName = "ValidationSamplesStart";
255      validationMapreEvaluator.GetVariableInfo("SamplesEnd").ActualName = "ValidationSamplesEnd";
256      MeanAbsolutePercentageOfRangeErrorEvaluator testMapreEvaluator = new MeanAbsolutePercentageOfRangeErrorEvaluator();
257      testMapreEvaluator.GetVariableInfo("TreeEvaluator").ActualName = "ModelAnalysisTreeEvaluator";
258      testMapreEvaluator.Name = "TestMapreEvaluator";
259      testMapreEvaluator.GetVariableInfo("MAPRE").ActualName = "TestMAPRE";
260      testMapreEvaluator.GetVariableInfo("SamplesStart").ActualName = "TestSamplesStart";
261      testMapreEvaluator.GetVariableInfo("SamplesEnd").ActualName = "TestSamplesEnd";
262      #endregion MAPRE
263      #region R2
264      CoefficientOfDeterminationEvaluator trainingR2Evaluator = new CoefficientOfDeterminationEvaluator();
265      trainingR2Evaluator.GetVariableInfo("TreeEvaluator").ActualName = "ModelAnalysisTreeEvaluator";
266      trainingR2Evaluator.Name = "TrainingR2Evaluator";
267      trainingR2Evaluator.GetVariableInfo("R2").ActualName = "TrainingR2";
268      trainingR2Evaluator.GetVariableInfo("SamplesStart").ActualName = "ActualTrainingSamplesStart";
269      trainingR2Evaluator.GetVariableInfo("SamplesEnd").ActualName = "ActualTrainingSamplesEnd";
270      CoefficientOfDeterminationEvaluator validationR2Evaluator = new CoefficientOfDeterminationEvaluator();
271      validationR2Evaluator.GetVariableInfo("TreeEvaluator").ActualName = "ModelAnalysisTreeEvaluator";
272      validationR2Evaluator.Name = "ValidationR2Evaluator";
273      validationR2Evaluator.GetVariableInfo("R2").ActualName = "ValidationR2";
274      validationR2Evaluator.GetVariableInfo("SamplesStart").ActualName = "ValidationSamplesStart";
275      validationR2Evaluator.GetVariableInfo("SamplesEnd").ActualName = "ValidationSamplesEnd";
276      CoefficientOfDeterminationEvaluator testR2Evaluator = new CoefficientOfDeterminationEvaluator();
277      testR2Evaluator.GetVariableInfo("TreeEvaluator").ActualName = "ModelAnalysisTreeEvaluator";
278      testR2Evaluator.Name = "TestR2Evaluator";
279      testR2Evaluator.GetVariableInfo("R2").ActualName = "TestR2";
280      testR2Evaluator.GetVariableInfo("SamplesStart").ActualName = "TestSamplesStart";
281      testR2Evaluator.GetVariableInfo("SamplesEnd").ActualName = "TestSamplesEnd";
282      #endregion
283      #region VAF
284      VarianceAccountedForEvaluator trainingVAFEvaluator = new VarianceAccountedForEvaluator();
285      trainingVAFEvaluator.GetVariableInfo("TreeEvaluator").ActualName = "ModelAnalysisTreeEvaluator";
286      trainingVAFEvaluator.Name = "TrainingVAFEvaluator";
287      trainingVAFEvaluator.GetVariableInfo("VAF").ActualName = "TrainingVAF";
288      trainingVAFEvaluator.GetVariableInfo("SamplesStart").ActualName = "ActualTrainingSamplesStart";
289      trainingVAFEvaluator.GetVariableInfo("SamplesEnd").ActualName = "ActualTrainingSamplesEnd";
290      VarianceAccountedForEvaluator validationVAFEvaluator = new VarianceAccountedForEvaluator();
291      validationVAFEvaluator.GetVariableInfo("TreeEvaluator").ActualName = "ModelAnalysisTreeEvaluator";
292      validationVAFEvaluator.Name = "ValidationVAFEvaluator";
293      validationVAFEvaluator.GetVariableInfo("VAF").ActualName = "ValidationVAF";
294      validationVAFEvaluator.GetVariableInfo("SamplesStart").ActualName = "ValidationSamplesStart";
295      validationVAFEvaluator.GetVariableInfo("SamplesEnd").ActualName = "ValidationSamplesEnd";
296      VarianceAccountedForEvaluator testVAFEvaluator = new VarianceAccountedForEvaluator();
297      testVAFEvaluator.GetVariableInfo("TreeEvaluator").ActualName = "ModelAnalysisTreeEvaluator";
298      testVAFEvaluator.Name = "TestVAFEvaluator";
299      testVAFEvaluator.GetVariableInfo("VAF").ActualName = "TestVAF";
300      testVAFEvaluator.GetVariableInfo("SamplesStart").ActualName = "TestSamplesStart";
301      testVAFEvaluator.GetVariableInfo("SamplesEnd").ActualName = "TestSamplesEnd";
302      #endregion
303
304      solutionProc.AddSubOperator(evaluatorInjector);
305      solutionProc.AddSubOperator(trainingMseEvaluator);
306      solutionProc.AddSubOperator(validationMseEvaluator);
307      solutionProc.AddSubOperator(testMseEvaluator);
308      solutionProc.AddSubOperator(trainingMapeEvaluator);
309      solutionProc.AddSubOperator(validationMapeEvaluator);
310      solutionProc.AddSubOperator(testMapeEvaluator);
311      solutionProc.AddSubOperator(trainingMapreEvaluator);
312      solutionProc.AddSubOperator(validationMapreEvaluator);
313      solutionProc.AddSubOperator(testMapreEvaluator);
314      solutionProc.AddSubOperator(trainingR2Evaluator);
315      solutionProc.AddSubOperator(validationR2Evaluator);
316      solutionProc.AddSubOperator(testR2Evaluator);
317      solutionProc.AddSubOperator(trainingVAFEvaluator);
318      solutionProc.AddSubOperator(validationVAFEvaluator);
319      solutionProc.AddSubOperator(testVAFEvaluator);
320
321      #region variable impacts
322      // calculate and set variable impacts
323      VariableNamesExtractor namesExtractor = new VariableNamesExtractor();
324      namesExtractor.GetVariableInfo("VariableNames").ActualName = "InputVariableNames";
325      PredictorBuilder predictorBuilder = new PredictorBuilder();
326      predictorBuilder.GetVariableInfo("TreeEvaluator").ActualName = "ModelAnalysisTreeEvaluator";
327      predictorBuilder.AddVariable(new HeuristicLab.Core.Variable("PunishmentFactor", new DoubleData(1000.0)));
328
329      VariableEvaluationImpactCalculator evaluationImpactCalculator = new VariableEvaluationImpactCalculator();
330      evaluationImpactCalculator.GetVariableInfo("SamplesStart").ActualName = "ActualTrainingSamplesStart";
331      evaluationImpactCalculator.GetVariableInfo("SamplesEnd").ActualName = "ActualTrainingSamplesEnd";
332      VariableQualityImpactCalculator qualityImpactCalculator = new VariableQualityImpactCalculator();
333      qualityImpactCalculator.GetVariableInfo("SamplesStart").ActualName = "ActualTrainingSamplesStart";
334      qualityImpactCalculator.GetVariableInfo("SamplesEnd").ActualName = "ActualTrainingSamplesEnd";
335
336      solutionProc.AddSubOperator(namesExtractor);
337      solutionProc.AddSubOperator(predictorBuilder);
338      solutionProc.AddSubOperator(evaluationImpactCalculator);
339      solutionProc.AddSubOperator(qualityImpactCalculator);
340      #endregion
341
342      op.OperatorGraph.AddOperator(seq);
343      op.OperatorGraph.InitialOperator = seq;
344      return op;
345    }
346
347    protected internal virtual IOperator CreateProblemInjector() {
348      return new EmptyOperator();
349    }
350
351    protected internal abstract IOperator CreateSelector();
352
353    protected internal abstract IOperator CreateCrossover();
354
355    protected internal abstract IOperator CreateTreeCreator();
356
357    protected internal abstract IOperator CreateFunctionLibraryInjector();
358
359    protected internal virtual IOperator CreateGlobalInjector() {
360      VariableInjector injector = new VariableInjector();
361      injector.Name = "Global Injector";
362      injector.AddVariable(new HeuristicLab.Core.Variable("Generations", new IntData(0)));
363      injector.AddVariable(new HeuristicLab.Core.Variable("MutationRate", new DoubleData()));
364      injector.AddVariable(new HeuristicLab.Core.Variable("PopulationSize", new IntData()));
365      injector.AddVariable(new HeuristicLab.Core.Variable("Elites", new IntData()));
366      injector.AddVariable(new HeuristicLab.Core.Variable("Maximization", new BoolData(false)));
367      injector.AddVariable(new HeuristicLab.Core.Variable("MaxTreeHeight", new IntData()));
368      injector.AddVariable(new HeuristicLab.Core.Variable("MaxTreeSize", new IntData()));
369      injector.AddVariable(new HeuristicLab.Core.Variable("EvaluatedSolutions", new IntData(0)));
370      injector.AddVariable(new HeuristicLab.Core.Variable("TotalEvaluatedNodes", new DoubleData(0)));
371      injector.AddVariable(new HeuristicLab.Core.Variable("Parents", new IntData()));
372      injector.AddVariable(new HeuristicLab.Core.Variable("UseEstimatedTargetValue", new BoolData()));
373      injector.AddVariable(new HeuristicLab.Core.Variable("PunishmentFactor", new DoubleData(10.0)));
374      return injector;
375    }
376
377    protected internal abstract IOperator CreateManipulator();
378
379    protected internal virtual IOperator CreateInitialization() {
380      CombinedOperator init = new CombinedOperator();
381      init.Name = "Initialization";
382      SequentialProcessor seq = new SequentialProcessor();
383      SubScopesCreater subScopesCreater = new SubScopesCreater();
384      subScopesCreater.GetVariableInfo("SubScopes").ActualName = "PopulationSize";
385      UniformSequentialSubScopesProcessor subScopesProc = new UniformSequentialSubScopesProcessor();
386      SequentialProcessor individualSeq = new SequentialProcessor();
387      OperatorExtractor treeCreater = new OperatorExtractor();
388      treeCreater.Name = "Tree generator (extr.)";
389      treeCreater.GetVariableInfo("Operator").ActualName = "Tree generator";
390      OperatorExtractor evaluator = new OperatorExtractor();
391      evaluator.Name = "Evaluator (extr.)";
392      evaluator.GetVariableInfo("Operator").ActualName = "Evaluator";
393      MeanSquaredErrorEvaluator validationEvaluator = new MeanSquaredErrorEvaluator();
394      validationEvaluator.GetVariableInfo("MSE").ActualName = "ValidationQuality";
395      validationEvaluator.GetVariableInfo("SamplesStart").ActualName = "ValidationSamplesStart";
396      validationEvaluator.GetVariableInfo("SamplesEnd").ActualName = "ValidationSamplesEnd";
397      Counter evalCounter = new Counter();
398      evalCounter.GetVariableInfo("Value").ActualName = "EvaluatedSolutions";
399      Sorter sorter = new Sorter();
400      sorter.GetVariableInfo("Descending").ActualName = "Maximization";
401      sorter.GetVariableInfo("Value").ActualName = "Quality";
402
403      seq.AddSubOperator(subScopesCreater);
404      seq.AddSubOperator(subScopesProc);
405      seq.AddSubOperator(sorter);
406
407      subScopesProc.AddSubOperator(individualSeq);
408      individualSeq.AddSubOperator(treeCreater);
409      individualSeq.AddSubOperator(evaluator);
410      individualSeq.AddSubOperator(validationEvaluator);
411      individualSeq.AddSubOperator(evalCounter);
412
413      init.OperatorGraph.AddOperator(seq);
414      init.OperatorGraph.InitialOperator = seq;
415      return init;
416    }
417
418    protected internal virtual IOperator CreateMainLoop() {
419      CombinedOperator main = new CombinedOperator();
420      SequentialProcessor seq = new SequentialProcessor();
421      IOperator childCreater = CreateChildCreater();
422      IOperator replacement = CreateReplacement();
423
424      BestSolutionStorer solutionStorer = new BestSolutionStorer();
425      solutionStorer.GetVariableInfo("Quality").ActualName = "ValidationQuality";
426      solutionStorer.GetVariableInfo("BestSolution").ActualName = "BestValidationSolution";
427      solutionStorer.AddSubOperator(CreateBestSolutionProcessor());
428
429      BestAverageWorstQualityCalculator qualityCalculator = new BestAverageWorstQualityCalculator();
430      BestAverageWorstQualityCalculator validationQualityCalculator = new BestAverageWorstQualityCalculator();
431      validationQualityCalculator.Name = "BestAverageWorstValidationQualityCalculator";
432      validationQualityCalculator.GetVariableInfo("Quality").ActualName = "ValidationQuality";
433      validationQualityCalculator.GetVariableInfo("BestQuality").ActualName = "BestValidationQuality";
434      validationQualityCalculator.GetVariableInfo("AverageQuality").ActualName = "AverageValidationQuality";
435      validationQualityCalculator.GetVariableInfo("WorstQuality").ActualName = "WorstValidationQuality";
436      IOperator loggingOperator = CreateLoggingOperator();
437      Counter counter = new Counter();
438      counter.GetVariableInfo("Value").ActualName = "Generations";
439      IOperator loopCondition = CreateLoopCondition(seq);
440
441      seq.AddSubOperator(childCreater);
442      seq.AddSubOperator(replacement);
443      seq.AddSubOperator(solutionStorer);
444      seq.AddSubOperator(qualityCalculator);
445      seq.AddSubOperator(validationQualityCalculator);
446      seq.AddSubOperator(loggingOperator);
447      seq.AddSubOperator(counter);
448      seq.AddSubOperator(loopCondition);
449
450      main.OperatorGraph.AddOperator(seq);
451      main.OperatorGraph.InitialOperator = seq;
452      return main;
453    }
454
455    protected internal virtual IOperator CreateLoggingOperator() {
456      return new EmptyOperator();
457    }
458
459    protected internal virtual IOperator CreateLoopCondition(IOperator loop) {
460      SequentialProcessor seq = new SequentialProcessor();
461      seq.Name = "Loop Condition";
462      LessThanComparator comparator = new LessThanComparator();
463      comparator.GetVariableInfo("LeftSide").ActualName = "Generations";
464      comparator.GetVariableInfo("RightSide").ActualName = "MaxGenerations";
465      comparator.GetVariableInfo("Result").ActualName = "GenerationsCondition";
466      ConditionalBranch cond = new ConditionalBranch();
467      cond.GetVariableInfo("Condition").ActualName = "GenerationsCondition";
468
469      seq.AddSubOperator(comparator);
470      seq.AddSubOperator(cond);
471
472      cond.AddSubOperator(loop);
473      return seq;
474    }
475
476    protected internal virtual IOperator CreateBestSolutionProcessor() {
477      SequentialProcessor seq = new SequentialProcessor();
478      ProgrammableOperator progOperator = new ProgrammableOperator();
479      progOperator.RemoveVariableInfo("Result");
480      progOperator.AddVariableInfo(new HeuristicLab.Core.VariableInfo("EvaluatedSolutions", "", typeof(IntData), VariableKind.In));
481      progOperator.Code = @"
482int evalSolutions = EvaluatedSolutions.Data;
483scope.AddVariable(new Variable(""EvaluatedSolutions"", new IntData(evalSolutions)));
484";
485      seq.AddSubOperator(progOperator);
486      return seq;
487    }
488
489    protected internal virtual IOperator CreateReplacement() {
490      CombinedOperator replacement = new CombinedOperator();
491      replacement.Name = "Replacement";
492      SequentialProcessor seq = new SequentialProcessor();
493      SequentialSubScopesProcessor seqScopeProc = new SequentialSubScopesProcessor();
494      SequentialProcessor selectedProc = new SequentialProcessor();
495      LeftSelector leftSelector = new LeftSelector();
496      leftSelector.GetVariableInfo("Selected").ActualName = "Elites";
497      RightReducer rightReducer = new RightReducer();
498
499      SequentialProcessor remainingProc = new SequentialProcessor();
500      RightSelector rightSelector = new RightSelector();
501      rightSelector.GetVariableInfo("Selected").ActualName = "Elites";
502      LeftReducer leftReducer = new LeftReducer();
503      MergingReducer mergingReducer = new MergingReducer();
504      Sorter sorter = new Sorter();
505      sorter.GetVariableInfo("Descending").ActualName = "Maximization";
506      sorter.GetVariableInfo("Value").ActualName = "Quality";
507
508      seq.AddSubOperator(seqScopeProc);
509      seqScopeProc.AddSubOperator(selectedProc);
510      selectedProc.AddSubOperator(leftSelector);
511      selectedProc.AddSubOperator(rightReducer);
512
513      seqScopeProc.AddSubOperator(remainingProc);
514      remainingProc.AddSubOperator(rightSelector);
515      remainingProc.AddSubOperator(leftReducer);
516      seq.AddSubOperator(mergingReducer);
517      seq.AddSubOperator(sorter);
518      replacement.OperatorGraph.AddOperator(seq);
519      replacement.OperatorGraph.InitialOperator = seq;
520      return replacement;
521    }
522
523    protected internal virtual IOperator CreateChildCreater() {
524      CombinedOperator childCreater = new CombinedOperator();
525      childCreater.Name = "Create children";
526      SequentialProcessor seq = new SequentialProcessor();
527      OperatorExtractor selector = new OperatorExtractor();
528      selector.Name = "Selector (extr.)";
529      selector.GetVariableInfo("Operator").ActualName = "Selector";
530
531      SequentialSubScopesProcessor seqScopesProc = new SequentialSubScopesProcessor();
532      EmptyOperator emptyOpt = new EmptyOperator();
533      SequentialProcessor selectedProc = new SequentialProcessor();
534      ChildrenInitializer childInitializer = new ChildrenInitializer();
535      ((IntData)childInitializer.GetVariable("ParentsPerChild").Value).Data = 2;
536
537      OperatorExtractor crossover = new OperatorExtractor();
538      crossover.Name = "Crossover (extr.)";
539      crossover.GetVariableInfo("Operator").ActualName = "Crossover";
540      UniformSequentialSubScopesProcessor individualProc = new UniformSequentialSubScopesProcessor();
541      SequentialProcessor individualSeqProc = new SequentialProcessor();
542      StochasticBranch cond = new StochasticBranch();
543      cond.GetVariableInfo("Probability").ActualName = "MutationRate";
544      OperatorExtractor manipulator = new OperatorExtractor();
545      manipulator.Name = "Manipulator (extr.)";
546      manipulator.GetVariableInfo("Operator").ActualName = "Manipulator";
547      OperatorExtractor evaluator = new OperatorExtractor();
548      evaluator.Name = "Evaluator (extr.)";
549      evaluator.GetVariableInfo("Operator").ActualName = "Evaluator";
550      MeanSquaredErrorEvaluator validationEvaluator = new MeanSquaredErrorEvaluator();
551      validationEvaluator.GetVariableInfo("MSE").ActualName = "ValidationQuality";
552      validationEvaluator.GetVariableInfo("SamplesStart").ActualName = "ValidationSamplesStart";
553      validationEvaluator.GetVariableInfo("SamplesEnd").ActualName = "ValidationSamplesEnd";
554      Counter evalCounter = new Counter();
555      evalCounter.GetVariableInfo("Value").ActualName = "EvaluatedSolutions";
556      SubScopesRemover parentRefRemover = new SubScopesRemover();
557
558      Sorter sorter = new Sorter();
559      sorter.GetVariableInfo("Descending").ActualName = "Maximization";
560      sorter.GetVariableInfo("Value").ActualName = "Quality";
561
562
563      seq.AddSubOperator(selector);
564      seq.AddSubOperator(seqScopesProc);
565      seqScopesProc.AddSubOperator(emptyOpt);
566      seqScopesProc.AddSubOperator(selectedProc);
567      selectedProc.AddSubOperator(childInitializer);
568      selectedProc.AddSubOperator(individualProc);
569      individualProc.AddSubOperator(individualSeqProc);
570      individualSeqProc.AddSubOperator(crossover);
571      individualSeqProc.AddSubOperator(cond);
572      cond.AddSubOperator(manipulator);
573      individualSeqProc.AddSubOperator(evaluator);
574      individualSeqProc.AddSubOperator(validationEvaluator);
575      individualSeqProc.AddSubOperator(evalCounter);
576      individualSeqProc.AddSubOperator(parentRefRemover);
577      selectedProc.AddSubOperator(sorter);
578
579      childCreater.OperatorGraph.AddOperator(seq);
580      childCreater.OperatorGraph.InitialOperator = seq;
581      return childCreater;
582    }
583
584    protected internal virtual IAnalyzerModel CreateGPModel(IScope bestModelScope) {
585      IAnalyzerModel model = new AnalyzerModel();
586      model.Predictor = bestModelScope.GetVariableValue<IPredictor>("Predictor", true);
587      Dataset ds = bestModelScope.GetVariableValue<Dataset>("Dataset", true);
588      model.Dataset = ds;
589      model.TargetVariable = ds.GetVariableName(bestModelScope.GetVariableValue<IntData>("TargetVariable", true).Data);
590      model.TrainingSamplesStart = bestModelScope.GetVariableValue<IntData>("TrainingSamplesStart", true).Data;
591      model.TrainingSamplesEnd = bestModelScope.GetVariableValue<IntData>("TrainingSamplesEnd", true).Data;
592      model.ValidationSamplesStart = bestModelScope.GetVariableValue<IntData>("ValidationSamplesStart", true).Data;
593      model.ValidationSamplesEnd = bestModelScope.GetVariableValue<IntData>("ValidationSamplesEnd", true).Data;
594      model.TestSamplesStart = bestModelScope.GetVariableValue<IntData>("TestSamplesStart", true).Data;
595      model.TestSamplesEnd = bestModelScope.GetVariableValue<IntData>("TestSamplesEnd", true).Data;
596
597      model.TrainingMeanSquaredError = bestModelScope.GetVariableValue<DoubleData>("TrainingMSE", false).Data;
598      model.ValidationMeanSquaredError = bestModelScope.GetVariableValue<DoubleData>("ValidationMSE", false).Data;
599      model.TestMeanSquaredError = bestModelScope.GetVariableValue<DoubleData>("TestMSE", false).Data;
600      model.TrainingCoefficientOfDetermination = bestModelScope.GetVariableValue<DoubleData>("TrainingR2", false).Data;
601      model.ValidationCoefficientOfDetermination = bestModelScope.GetVariableValue<DoubleData>("ValidationR2", false).Data;
602      model.TestCoefficientOfDetermination = bestModelScope.GetVariableValue<DoubleData>("TestR2", false).Data;
603      model.TrainingMeanAbsolutePercentageError = bestModelScope.GetVariableValue<DoubleData>("TrainingMAPE", false).Data;
604      model.ValidationMeanAbsolutePercentageError = bestModelScope.GetVariableValue<DoubleData>("ValidationMAPE", false).Data;
605      model.TestMeanAbsolutePercentageError = bestModelScope.GetVariableValue<DoubleData>("TestMAPE", false).Data;
606      model.TrainingMeanAbsolutePercentageOfRangeError = bestModelScope.GetVariableValue<DoubleData>("TrainingMAPRE", false).Data;
607      model.ValidationMeanAbsolutePercentageOfRangeError = bestModelScope.GetVariableValue<DoubleData>("ValidationMAPRE", false).Data;
608      model.TestMeanAbsolutePercentageOfRangeError = bestModelScope.GetVariableValue<DoubleData>("TestMAPRE", false).Data;
609      model.TrainingVarianceAccountedFor = bestModelScope.GetVariableValue<DoubleData>("TrainingVAF", false).Data;
610      model.ValidationVarianceAccountedFor = bestModelScope.GetVariableValue<DoubleData>("ValidationVAF", false).Data;
611      model.TestVarianceAccountedFor = bestModelScope.GetVariableValue<DoubleData>("TestVAF", false).Data;
612
613      ItemList evaluationImpacts = bestModelScope.GetVariableValue<ItemList>("VariableEvaluationImpacts", false);
614      ItemList qualityImpacts = bestModelScope.GetVariableValue<ItemList>("VariableQualityImpacts", false);
615      foreach (ItemList row in evaluationImpacts) {
616        string variableName = ((StringData)row[0]).Data;
617        double impact = ((DoubleData)row[1]).Data;
618        model.SetVariableEvaluationImpact(variableName, impact);
619        model.AddInputVariable(variableName);
620      }
621      foreach (ItemList row in qualityImpacts) {
622        string variableName = ((StringData)row[0]).Data;
623        double impact = ((DoubleData)row[1]).Data;
624        model.SetVariableQualityImpact(variableName, impact);
625        model.AddInputVariable(variableName);
626      }
627
628      return model;
629    }
630
631    public override object Clone(IDictionary<Guid, object> clonedObjects) {
632      AlgorithmBase clone = (AlgorithmBase)base.Clone(clonedObjects);
633      clonedObjects.Add(Guid, clone);
634      clone.engine = (SequentialEngine.SequentialEngine)Auxiliary.Clone(Engine, clonedObjects);
635      return clone;
636    }
637
638    protected VariableInjector GetVariableInjector() {
639      CombinedOperator co1 = (CombinedOperator)Engine.OperatorGraph.InitialOperator;
640      // SequentialProcessor in GP
641      algorithm = (SequentialProcessor)co1.OperatorGraph.InitialOperator;
642      return (VariableInjector)algorithm.SubOperators[2];
643    }
644
645    protected RandomInjector GetRandomInjector() {
646      CombinedOperator co1 = (CombinedOperator)Engine.OperatorGraph.InitialOperator;
647      // SequentialProcessor in GP
648      algorithm = (SequentialProcessor)co1.OperatorGraph.InitialOperator;
649      return (RandomInjector)algorithm.SubOperators[0];
650    }
651
652    #region Persistence Methods
653    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
654      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
655      node.AppendChild(PersistenceManager.Persist("Engine", Engine, document, persistedObjects));
656      return node;
657    }
658    public override void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
659      base.Populate(node, restoredObjects);
660      engine = (SequentialEngine.SequentialEngine)PersistenceManager.Restore(node.SelectSingleNode("Engine"), restoredObjects);
661    }
662    #endregion
663
664
665  }
666}
Note: See TracBrowser for help on using the repository browser.