Changeset 12848 for branches/DataAnalysis.ComplexityAnalyzer/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SymbolicRegressionPruningOperator.cs
- Timestamp:
- 08/12/15 10:35:02 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/DataAnalysis.ComplexityAnalyzer/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SymbolicRegressionPruningOperator.cs
r12547 r12848 27 27 using HeuristicLab.Core; 28 28 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding; 29 using HeuristicLab.Parameters; 29 30 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 30 31 … … 33 34 [Item("SymbolicRegressionPruningOperator", "An operator which prunes symbolic regression trees.")] 34 35 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 35 44 protected SymbolicRegressionPruningOperator(SymbolicRegressionPruningOperator original, Cloner cloner) 36 45 : base(original, cloner) { … … 45 54 public SymbolicRegressionPruningOperator(ISymbolicDataAnalysisSolutionImpactValuesCalculator impactValuesCalculator) 46 55 : 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 47 68 } 48 69 … … 52 73 53 74 protected override double Evaluate(IDataAnalysisModel model) { 54 var regressionModel = (I RegressionModel)model;75 var regressionModel = (ISymbolicRegressionModel)model; 55 76 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); 68 81 } 69 82 … … 72 85 var model = new SymbolicRegressionModel(clonedTree, interpreter, estimationLimits.Lower, estimationLimits.Upper); 73 86 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 75 89 76 90 for (int i = 0; i < nodes.Count; ++i) { … … 79 93 80 94 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); 82 97 83 98 if (pruneOnlyZeroImpactNodes && !impactValue.IsAlmost(0.0)) continue; … … 90 105 i += node.GetLength() - 1; // skip subtrees under the node that was folded 91 106 92 quality -= impactValue;107 qualityForImpactsCalculation = newQualityForImpactsCalculation; 93 108 } 94 109 return model.SymbolicExpressionTree;
Note: See TracChangeset
for help on using the changeset viewer.