protected AttributeSplitSuggestion searchForBestSplitOption()

in samoa-api/src/main/java/org/apache/samoa/moa/classifiers/core/attributeclassobservers/BinaryTreeNumericAttributeClassObserver.java [114:166]


  protected AttributeSplitSuggestion searchForBestSplitOption(
      Node currentNode, AttributeSplitSuggestion currentBestOption,
      double[] actualParentLeft,
      double[] parentLeft, double[] parentRight, boolean leftChild,
      SplitCriterion criterion, double[] preSplitDist, int attIndex) {
    if (currentNode == null) {
      return currentBestOption;
    }
    DoubleVector leftDist = new DoubleVector();
    DoubleVector rightDist = new DoubleVector();
    if (parentLeft == null) {
      leftDist.addValues(currentNode.classCountsLeft);
      rightDist.addValues(currentNode.classCountsRight);
    } else {
      leftDist.addValues(parentLeft);
      rightDist.addValues(parentRight);
      if (leftChild) {
        // get the exact statistics of the parent value
        DoubleVector exactParentDist = new DoubleVector();
        exactParentDist.addValues(actualParentLeft);
        exactParentDist.subtractValues(currentNode.classCountsLeft);
        exactParentDist.subtractValues(currentNode.classCountsRight);

        // move the subtrees
        leftDist.subtractValues(currentNode.classCountsRight);
        rightDist.addValues(currentNode.classCountsRight);

        // move the exact value from the parent
        rightDist.addValues(exactParentDist);
        leftDist.subtractValues(exactParentDist);

      } else {
        leftDist.addValues(currentNode.classCountsLeft);
        rightDist.subtractValues(currentNode.classCountsLeft);
      }
    }
    double[][] postSplitDists = new double[][] { leftDist.getArrayRef(),
        rightDist.getArrayRef() };
    double merit = criterion.getMeritOfSplit(preSplitDist, postSplitDists);
    if ((currentBestOption == null) || (merit > currentBestOption.merit)) {
      currentBestOption = new AttributeSplitSuggestion(
          new NumericAttributeBinaryTest(attIndex,
              currentNode.cut_point, true), postSplitDists, merit);

    }
    currentBestOption = searchForBestSplitOption(currentNode.left,
        currentBestOption, currentNode.classCountsLeft.getArrayRef(), postSplitDists[0], postSplitDists[1], true,
        criterion, preSplitDist, attIndex);
    currentBestOption = searchForBestSplitOption(currentNode.right,
        currentBestOption, currentNode.classCountsLeft.getArrayRef(), postSplitDists[0], postSplitDists[1], false,
        criterion, preSplitDist, attIndex);
    return currentBestOption;
  }