Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.GP.StructureIdentification/3.3/Evaluators/GPEvaluatorBase.cs @ 1803

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

Refactored GP evaluation to make it possible to use different evaluators to interpret function trees. #615 (Evaluation of HL3 function trees should be equivalent to evaluation in HL2)

File size: 4.9 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.Linq;
25using System.Text;
26using HeuristicLab.Core;
27using HeuristicLab.Data;
28using HeuristicLab.Operators;
29using HeuristicLab.DataAnalysis;
30
31namespace HeuristicLab.GP.StructureIdentification {
32  public abstract class GPEvaluatorBase : OperatorBase {
33    public GPEvaluatorBase()
34      : base() {
35      AddVariableInfo(new VariableInfo("TreeEvaluator", "The evaluator that should be used to evaluate the expression tree", typeof(ITreeEvaluator), VariableKind.In));
36      AddVariableInfo(new VariableInfo("FunctionTree", "The function tree that should be evaluated", typeof(IFunctionTree), VariableKind.In));
37      AddVariableInfo(new VariableInfo("TreeSize", "Size (number of nodes) of the tree to evaluate", typeof(IntData), VariableKind.In));
38      AddVariableInfo(new VariableInfo("Dataset", "Dataset with all samples on which to apply the function", typeof(Dataset), VariableKind.In));
39      AddVariableInfo(new VariableInfo("TargetVariable", "Index of the column of the dataset that holds the target variable", typeof(IntData), VariableKind.In));
40      AddVariableInfo(new VariableInfo("PunishmentFactor", "Punishment factor for invalid estimations", typeof(DoubleData), VariableKind.In));
41      AddVariableInfo(new VariableInfo("TotalEvaluatedNodes", "Number of evaluated nodes", typeof(DoubleData), VariableKind.In | VariableKind.Out));
42      AddVariableInfo(new VariableInfo("SamplesStart", "Start index of samples in dataset to evaluate", typeof(IntData), VariableKind.In));
43      AddVariableInfo(new VariableInfo("SamplesEnd", "End index of samples in dataset to evaluate", typeof(IntData), VariableKind.In));
44      AddVariableInfo(new VariableInfo("UseEstimatedTargetValue", "Wether to use the original (measured) or the estimated (calculated) value for the targat variable when doing autoregressive modelling", typeof(BoolData), VariableKind.In));
45    }
46
47    public override IOperation Apply(IScope scope) {
48      // get all variable values
49      int targetVariable = GetVariableValue<IntData>("TargetVariable", scope, true).Data;
50      Dataset dataset = GetVariableValue<Dataset>("Dataset", scope, true);
51      IFunctionTree functionTree = GetVariableValue<IFunctionTree>("FunctionTree", scope, true);
52      double punishmentFactor = GetVariableValue<DoubleData>("PunishmentFactor", scope, true).Data;
53      int treeSize = scope.GetVariableValue<IntData>("TreeSize", false).Data;
54      double totalEvaluatedNodes = scope.GetVariableValue<DoubleData>("TotalEvaluatedNodes", true).Data;
55      int start = GetVariableValue<IntData>("SamplesStart", scope, true).Data;
56      int end = GetVariableValue<IntData>("SamplesEnd", scope, true).Data;
57      bool useEstimatedValues = GetVariableValue<BoolData>("UseEstimatedTargetValue", scope, true).Data;
58      ITreeEvaluator evaluator = GetVariableValue<ITreeEvaluator>("TreeEvaluator", scope, true);
59
60      double[] backupValues = null;
61      // prepare for autoregressive modelling by saving the original values of the target-variable to a backup array
62      if (useEstimatedValues &&
63        (backupValues == null || backupValues.Length != end - start)) {
64        backupValues = new double[end - start];
65        for (int i = start; i < end; i++) {
66          backupValues[i - start] = dataset.GetValue(i, targetVariable);
67        }
68      }
69
70      Evaluate(scope, evaluator, functionTree, dataset, targetVariable, start, end, useEstimatedValues);
71
72      // restore the values of the target variable from the backup array if necessary
73      if (useEstimatedValues) {
74        for (int i = start; i < end; i++) {
75          dataset.SetValue(i, targetVariable, backupValues[i - start]);
76        }
77      }
78
79      // update the value of total evaluated nodes
80      scope.GetVariableValue<DoubleData>("TotalEvaluatedNodes", true).Data = totalEvaluatedNodes + treeSize * (end - start);
81      return null;
82    }
83
84    public abstract void Evaluate(IScope scope, ITreeEvaluator evaluator, IFunctionTree tree, Dataset dataset, int targetVariable, int start, int end, bool updateTargetValues);
85  }
86}
Note: See TracBrowser for help on using the repository browser.