Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
08/12/15 10:35:02 (9 years ago)
Author:
mkommend
Message:

#2175: Merged trunk changes and extracted parameters of evaluators to their base class.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/DataAnalysis.ComplexityAnalyzer/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SymbolicRegressionPruningOperator.cs

    r12547 r12848  
    2727using HeuristicLab.Core;
    2828using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
     29using HeuristicLab.Parameters;
    2930using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    3031
     
    3334  [Item("SymbolicRegressionPruningOperator", "An operator which prunes symbolic regression trees.")]
    3435  public class SymbolicRegressionPruningOperator : SymbolicDataAnalysisExpressionPruningOperator {
     36    private const string EvaluatorParameterName = "Evaluator";
     37
     38    #region parameter properties
     39    public ILookupParameter<ISymbolicRegressionSingleObjectiveEvaluator> EvaluatorParameter {
     40      get { return (ILookupParameter<ISymbolicRegressionSingleObjectiveEvaluator>)Parameters[EvaluatorParameterName]; }
     41    }
     42    #endregion
     43
    3544    protected SymbolicRegressionPruningOperator(SymbolicRegressionPruningOperator original, Cloner cloner)
    3645      : base(original, cloner) {
     
    4554    public SymbolicRegressionPruningOperator(ISymbolicDataAnalysisSolutionImpactValuesCalculator impactValuesCalculator)
    4655      : base(impactValuesCalculator) {
     56      Parameters.Add(new LookupParameter<ISymbolicRegressionSingleObjectiveEvaluator>(EvaluatorParameterName));
     57    }
     58
     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
    4768    }
    4869
     
    5273
    5374    protected override double Evaluate(IDataAnalysisModel model) {
    54       var regressionModel = (IRegressionModel)model;
     75      var regressionModel = (ISymbolicRegressionModel)model;
    5576      var regressionProblemData = (IRegressionProblemData)ProblemDataParameter.ActualValue;
    56       var rows = Enumerable.Range(FitnessCalculationPartitionParameter.ActualValue.Start, FitnessCalculationPartitionParameter.ActualValue.Size);
    57       return Evaluate(regressionModel, regressionProblemData, rows);
    58     }
    59 
    60     private static double Evaluate(IRegressionModel model, IRegressionProblemData problemData,
    61       IEnumerable<int> rows) {
    62       var estimatedValues = model.GetEstimatedValues(problemData.Dataset, rows); // also bounds the values
    63       var targetValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows);
    64       OnlineCalculatorError errorState;
    65       var quality = OnlinePearsonsRSquaredCalculator.Calculate(targetValues, estimatedValues, out errorState);
    66       if (errorState != OnlineCalculatorError.None) return double.NaN;
    67       return quality;
     77      var evaluator = EvaluatorParameter.ActualValue;
     78      var fitnessEvaluationPartition = FitnessCalculationPartitionParameter.ActualValue;
     79      var rows = Enumerable.Range(fitnessEvaluationPartition.Start, fitnessEvaluationPartition.Size);
     80      return evaluator.Evaluate(this.ExecutionContext, regressionModel.SymbolicExpressionTree, regressionProblemData, rows);
    6881    }
    6982
     
    7285      var model = new SymbolicRegressionModel(clonedTree, interpreter, estimationLimits.Lower, estimationLimits.Upper);
    7386      var nodes = clonedTree.Root.GetSubtree(0).GetSubtree(0).IterateNodesPrefix().ToList(); // skip the nodes corresponding to the ProgramRootSymbol and the StartSymbol
    74       double quality = Evaluate(model, problemData, rows);
     87
     88      double qualityForImpactsCalculation = double.NaN; // pass a NaN value initially so the impact calculator will calculate the quality
    7589
    7690      for (int i = 0; i < nodes.Count; ++i) {
     
    7993
    8094        double impactValue, replacementValue;
    81         impactValuesCalculator.CalculateImpactAndReplacementValues(model, node, problemData, rows, out impactValue, out replacementValue, quality);
     95        double newQualityForImpactsCalculation;
     96        impactValuesCalculator.CalculateImpactAndReplacementValues(model, node, problemData, rows, out impactValue, out replacementValue, out newQualityForImpactsCalculation, qualityForImpactsCalculation);
    8297
    8398        if (pruneOnlyZeroImpactNodes && !impactValue.IsAlmost(0.0)) continue;
     
    90105        i += node.GetLength() - 1; // skip subtrees under the node that was folded
    91106
    92         quality -= impactValue;
     107        qualityForImpactsCalculation = newQualityForImpactsCalculation;
    93108      }
    94109      return model.SymbolicExpressionTree;
Note: See TracChangeset for help on using the changeset viewer.