private Instances newCentersAfterSplit(double [] pbic, double [] cbic,
protected Instances newCentersAfterSplit(double[] pbic, double[] cbic,
  private Instances newCentersAfterSplit(double [] pbic, 					 double [] cbic,					 double cutoffFactor,					 Instances splitCenters) {    // store if split won    boolean splitPerCutoff = false;    boolean takeSomeAway = false;    boolean [] splitWon = initBoolArray(m_ClusterCenters.numInstances());    int numToSplit = 0;    Instances newCenters = null;        // how many would be split, because the children have a better bic value    for (int i = 0; i < cbic.length; i++) {      if (cbic[i] > pbic[i]) {	// decide for splitting ----------------------------------------	splitWon[i] = true; numToSplit++;	PFD(D_FOLLOWSPLIT, "Center " + i + " decide for children");      }      else {	// decide for parents and finished stays true  -----------------	PFD(D_FOLLOWSPLIT, "Center " + i + " decide for parent");      }    }    // no splits yet so split per cutoff factor    if ((numToSplit == 0) && (cutoffFactor > 0)) {      splitPerCutoff = true;            // how many to split per cutoff factor      numToSplit = (int)         ((double) m_ClusterCenters.numInstances() * m_CutOffFactor);     }    // prepare indexes of values in ascending order      double [] diff = new double [m_NumClusters];    for (int j = 0; j < diff.length; j++) {      diff[j] = pbic[j] - cbic[j];    }        int [] sortOrder = Utils.sort(diff);        // check if maxNumClusters would be exceeded    int possibleToSplit = m_MaxNumClusters - m_NumClusters;     if (possibleToSplit > numToSplit) {      // still enough possible, do the whole amount      possibleToSplit = numToSplit;    }    else      takeSomeAway = true;    // prepare for splitting the one that are supposed to be split    if (splitPerCutoff) {      for (int j = 0; (j < possibleToSplit) && (cbic[sortOrder[j]] > 0.0);	   j++) {	splitWon[sortOrder[j]] = true;      }      m_NumSplitsStillDone += possibleToSplit;    }     else {      // take some splits away if max number of clusters would be exceeded      if (takeSomeAway) {	int count = 0;	int j = 0;	for (;j < splitWon.length && count < possibleToSplit; j++){	  if (splitWon[sortOrder[j]] == true) count++;	}		while (j < splitWon.length) {	  splitWon[sortOrder[j]] = false;	  j++;	}      }    }       // finally split    if (possibleToSplit > 0)       newCenters = newCentersAfterSplit(splitWon, splitCenters);    else      newCenters = m_ClusterCenters;    return newCenters;  }