Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
07/19/20 19:07:40 (4 years ago)
Author:
fbaching
Message:

#1837: merged changes from trunk

  • apply changes from Attic release to all SlidingWindow specific code files (replace StorableClass with StorableType)
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/1837_Sliding Window GP/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SymbolicRegressionPruningOperator.cs

    r10469 r17687  
    1 using System.Linq;
     1#region License Information
     2
     3/* HeuristicLab
     4 * Copyright (C) Heuristic and Evolutionary Algorithms Laboratory (HEAL)
     5 *
     6 * This file is part of HeuristicLab.
     7 *
     8 * HeuristicLab is free software: you can redistribute it and/or modify
     9 * it under the terms of the GNU General Public License as published by
     10 * the Free Software Foundation, either version 3 of the License, or
     11 * (at your option) any later version.
     12 *
     13 * HeuristicLab is distributed in the hope that it will be useful,
     14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
     15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     16 * GNU General Public License for more details.
     17 *
     18 * You should have received a copy of the GNU General Public License
     19 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
     20 */
     21
     22#endregion
     23
     24using System.Collections.Generic;
     25using System.Linq;
    226using HeuristicLab.Common;
    327using HeuristicLab.Core;
     28using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
    429using HeuristicLab.Parameters;
    5 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
     30using HEAL.Attic;
    631
    732namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Regression {
    8   [StorableClass]
     33  [StorableType("75843B4E-C69C-423A-87BD-A64619D380BB")]
    934  [Item("SymbolicRegressionPruningOperator", "An operator which prunes symbolic regression trees.")]
    1035  public class SymbolicRegressionPruningOperator : SymbolicDataAnalysisExpressionPruningOperator {
    11     private const string ImpactValuesCalculatorParameterName = "ImpactValuesCalculator";
    12     private const string ImpactValuesCalculatorParameterDescription = "The impact values calculator to be used for figuring out the node impacts.";
    13 
    1436    private const string EvaluatorParameterName = "Evaluator";
    1537
     38    #region parameter properties
    1639    public ILookupParameter<ISymbolicRegressionSingleObjectiveEvaluator> EvaluatorParameter {
    1740      get { return (ILookupParameter<ISymbolicRegressionSingleObjectiveEvaluator>)Parameters[EvaluatorParameterName]; }
    1841    }
     42    #endregion
    1943
    2044    protected SymbolicRegressionPruningOperator(SymbolicRegressionPruningOperator original, Cloner cloner)
     
    2650
    2751    [StorableConstructor]
    28     protected SymbolicRegressionPruningOperator(bool deserializing) : base(deserializing) { }
     52    protected SymbolicRegressionPruningOperator(StorableConstructorFlag _) : base(_) { }
    2953
    30     public SymbolicRegressionPruningOperator() {
    31       var impactValuesCalculator = new SymbolicRegressionSolutionImpactValuesCalculator();
    32       Parameters.Add(new ValueParameter<ISymbolicDataAnalysisSolutionImpactValuesCalculator>(ImpactValuesCalculatorParameterName, ImpactValuesCalculatorParameterDescription, impactValuesCalculator));
     54    public SymbolicRegressionPruningOperator(ISymbolicDataAnalysisSolutionImpactValuesCalculator impactValuesCalculator)
     55      : base(impactValuesCalculator) {
    3356      Parameters.Add(new LookupParameter<ISymbolicRegressionSingleObjectiveEvaluator>(EvaluatorParameterName));
    3457    }
    3558
    36     protected override ISymbolicDataAnalysisModel CreateModel() {
    37       return new SymbolicRegressionModel(SymbolicExpressionTree, Interpreter, EstimationLimits.Lower, EstimationLimits.Upper);
     59    [StorableHook(HookType.AfterDeserialization)]
     60    private void AfterDeserialization() {
     61      // BackwardsCompatibility3.3
     62      #region Backwards compatible code, remove with 3.4
     63      base.ImpactValuesCalculator = new SymbolicRegressionSolutionImpactValuesCalculator();
     64      if (!Parameters.ContainsKey(EvaluatorParameterName)) {
     65        Parameters.Add(new LookupParameter<ISymbolicRegressionSingleObjectiveEvaluator>(EvaluatorParameterName));
     66      }
     67      #endregion
     68    }
     69
     70    protected override ISymbolicDataAnalysisModel CreateModel(ISymbolicExpressionTree tree, ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, IDataAnalysisProblemData problemData, DoubleLimit estimationLimits) {
     71      var regressionProblemData = (IRegressionProblemData)problemData;
     72      return new SymbolicRegressionModel(regressionProblemData.TargetVariable, tree, interpreter, estimationLimits.Lower, estimationLimits.Upper);
    3873    }
    3974
    4075    protected override double Evaluate(IDataAnalysisModel model) {
    41       var regressionModel = (IRegressionModel)model;
    42       var regressionProblemData = (IRegressionProblemData)ProblemData;
    43       var trainingIndices = ProblemData.TrainingIndices.ToList();
    44       var estimatedValues = regressionModel.GetEstimatedValues(ProblemData.Dataset, trainingIndices); // also bounds the values
    45       var targetValues = ProblemData.Dataset.GetDoubleValues(regressionProblemData.TargetVariable, trainingIndices);
    46       OnlineCalculatorError errorState;
    47       var quality = OnlinePearsonsRSquaredCalculator.Calculate(targetValues, estimatedValues, out errorState);
    48       if (errorState != OnlineCalculatorError.None) return double.NaN;
    49       return quality;
     76      var regressionModel = (ISymbolicRegressionModel)model;
     77      var regressionProblemData = (IRegressionProblemData)ProblemDataParameter.ActualValue;
     78      var evaluator = EvaluatorParameter.ActualValue;
     79      var fitnessEvaluationPartition = FitnessCalculationPartitionParameter.ActualValue;
     80      var rows = Enumerable.Range(fitnessEvaluationPartition.Start, fitnessEvaluationPartition.Size);
     81      return evaluator.Evaluate(this.ExecutionContext, regressionModel.SymbolicExpressionTree, regressionProblemData, rows);
     82    }
     83
     84    public static ISymbolicExpressionTree Prune(ISymbolicExpressionTree tree, SymbolicRegressionSolutionImpactValuesCalculator impactValuesCalculator, ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, IRegressionProblemData problemData, DoubleLimit estimationLimits, IEnumerable<int> rows, double nodeImpactThreshold = 0.0, bool pruneOnlyZeroImpactNodes = false) {
     85      var clonedTree = (ISymbolicExpressionTree)tree.Clone();
     86      var model = new SymbolicRegressionModel(problemData.TargetVariable, clonedTree, interpreter, estimationLimits.Lower, estimationLimits.Upper);
     87      var nodes = clonedTree.Root.GetSubtree(0).GetSubtree(0).IterateNodesPrefix().ToList(); // skip the nodes corresponding to the ProgramRootSymbol and the StartSymbol
     88
     89      double qualityForImpactsCalculation = double.NaN; // pass a NaN value initially so the impact calculator will calculate the quality
     90
     91      for (int i = 0; i < nodes.Count; ++i) {
     92        var node = nodes[i];
     93        if (node is ConstantTreeNode) continue;
     94
     95        double impactValue, replacementValue;
     96        double newQualityForImpactsCalculation;
     97        impactValuesCalculator.CalculateImpactAndReplacementValues(model, node, problemData, rows, out impactValue, out replacementValue, out newQualityForImpactsCalculation, qualityForImpactsCalculation);
     98
     99        if (pruneOnlyZeroImpactNodes && !impactValue.IsAlmost(0.0)) continue;
     100        if (!pruneOnlyZeroImpactNodes && impactValue > nodeImpactThreshold) continue;
     101
     102        var constantNode = (ConstantTreeNode)node.Grammar.GetSymbol("Constant").CreateTreeNode();
     103        constantNode.Value = replacementValue;
     104
     105        ReplaceWithConstant(node, constantNode);
     106        i += node.GetLength() - 1; // skip subtrees under the node that was folded
     107
     108        qualityForImpactsCalculation = newQualityForImpactsCalculation;
     109      }
     110      return model.SymbolicExpressionTree;
    50111    }
    51112  }
Note: See TracChangeset for help on using the changeset viewer.