Index: branches/2817-BinPackingSpeedup/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SymbolicClassificationSolutionImpactValuesCalculator.cs
===================================================================
--- branches/2817-BinPackingSpeedup/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SymbolicClassificationSolutionImpactValuesCalculator.cs	(revision 15303)
+++ branches/2817-BinPackingSpeedup/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SymbolicClassificationSolutionImpactValuesCalculator.cs	(revision 16140)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -20,9 +20,7 @@
 #endregion
 
-using System;
 using System.Collections.Generic;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
@@ -40,59 +38,13 @@
     protected SymbolicClassificationSolutionImpactValuesCalculator(bool deserializing) : base(deserializing) { }
 
-    public override void CalculateImpactAndReplacementValues(ISymbolicDataAnalysisModel model,
-      ISymbolicExpressionTreeNode node,
-      IDataAnalysisProblemData problemData, IEnumerable<int> rows, out double impactValue, out double replacementValue,
-      out double newQualityForImpactsCalculation,
-      double qualityForImpactsCalculation = Double.NaN) {
+    protected override double CalculateQualityForImpacts(ISymbolicDataAnalysisModel model, IDataAnalysisProblemData problemData, IEnumerable<int> rows) {
       var classificationModel = (ISymbolicClassificationModel)model;
       var classificationProblemData = (IClassificationProblemData)problemData;
-
-      if (double.IsNaN(qualityForImpactsCalculation))
-        qualityForImpactsCalculation = CalculateQualityForImpacts(classificationModel, classificationProblemData, rows);
-
-
-      var cloner = new Cloner();
-      var tempModel = cloner.Clone(classificationModel);
-      var tempModelNode = (ISymbolicExpressionTreeNode)cloner.GetClone(node);
-
-      var tempModelParentNode = tempModelNode.Parent;
-      int i = tempModelParentNode.IndexOfSubtree(tempModelNode);
-      double bestReplacementValue = 0.0;
-      double bestImpactValue = double.PositiveInfinity;
-      newQualityForImpactsCalculation = qualityForImpactsCalculation; // initialize
-      // try the potentially reasonable replacement values and use the best one
-      foreach (var repValue in CalculateReplacementValues(node, classificationModel.SymbolicExpressionTree, classificationModel.Interpreter, classificationProblemData.Dataset, classificationProblemData.TrainingIndices)) {
-        tempModelParentNode.RemoveSubtree(i);
-
-        var constantNode = new ConstantTreeNode(new Constant()) { Value = repValue };
-        tempModelParentNode.InsertSubtree(i, constantNode);
-
-        var dataset = classificationProblemData.Dataset;
-        var targetClassValues = dataset.GetDoubleValues(classificationProblemData.TargetVariable, rows);
-        var estimatedClassValues = tempModel.GetEstimatedClassValues(dataset, rows);
-        OnlineCalculatorError errorState;
-        newQualityForImpactsCalculation = OnlineAccuracyCalculator.Calculate(targetClassValues, estimatedClassValues,
-          out errorState);
-        if (errorState != OnlineCalculatorError.None) newQualityForImpactsCalculation = 0.0;
-
-        impactValue = qualityForImpactsCalculation - newQualityForImpactsCalculation;
-
-        if (impactValue < bestImpactValue) {
-          bestImpactValue = impactValue;
-          bestReplacementValue = repValue;
-        }
-      }
-      replacementValue = bestReplacementValue;
-      impactValue = bestImpactValue;
-    }
-
-    public static double CalculateQualityForImpacts(ISymbolicClassificationModel model, IClassificationProblemData problemData, IEnumerable<int> rows) {
       OnlineCalculatorError errorState;
       var dataset = problemData.Dataset;
-      var targetClassValues = dataset.GetDoubleValues(problemData.TargetVariable, rows);
-      var originalClassValues = model.GetEstimatedClassValues(dataset, rows);
+      var targetClassValues = dataset.GetDoubleValues(classificationProblemData.TargetVariable, rows);
+      var originalClassValues = classificationModel.GetEstimatedClassValues(dataset, rows);
       var qualityForImpactsCalculation = OnlineAccuracyCalculator.Calculate(targetClassValues, originalClassValues, out errorState);
       if (errorState != OnlineCalculatorError.None) qualityForImpactsCalculation = 0.0;
-
       return qualityForImpactsCalculation;
     }
