private void mergeCluster()

in samoa-api/src/main/java/org/apache/samoa/evaluation/measures/CMM_GTAnalysis.java [383:441]


    private void mergeCluster(int mergeID) {
      if (mergeID < gt0Clusters.size()) {
        // track merging (debugging)
        for (int i = 0; i < numGTClasses; i++) {
          if (mergeMap[i] == mergeID)
            mergeMap[i] = workclass;
          if (mergeMap[i] > mergeID)
            mergeMap[i]--;
        }
        GTCluster gtcMerge = gt0Clusters.get(mergeID);
        if (debug)
          System.out.println("Merging C" + gtcMerge.workclass + " into C" + workclass +
              " with Con " + connections.get(mergeID) + " / " + gtcMerge.connections.get(workclass));

        // update mapTrueLabelToWorkLabel
        mapTrueLabelToWorkLabel.put(gtcMerge.label, workclass);
        Iterator iterator = mapTrueLabelToWorkLabel.keySet().iterator();
        while (iterator.hasNext()) {
          Integer key = (Integer) iterator.next();
          // update pointer of already merged cluster
          int value = mapTrueLabelToWorkLabel.get(key);
          if (value == mergeID)
            mapTrueLabelToWorkLabel.put(key, workclass);
          if (value > mergeID)
            mapTrueLabelToWorkLabel.put(key, value - 1);
        }

        // merge points from B into A
        points.addAll(gtcMerge.points);
        clusterRepresentations.addAll(gtcMerge.clusterRepresentations);
        if (mergedWorkLabels == null) {
          mergedWorkLabels = new ArrayList<Integer>();
        }
        mergedWorkLabels.add(gtcMerge.orgWorkClass);
        if (gtcMerge.mergedWorkLabels != null)
          mergedWorkLabels.addAll(gtcMerge.mergedWorkLabels);

        gt0Clusters.remove(mergeID);

        // update workclass labels
        for (int c = mergeID; c < gt0Clusters.size(); c++) {
          gt0Clusters.get(c).workclass = c;
        }

        // update knn distances
        calculateKnn();
        for (int c = 0; c < gt0Clusters.size(); c++) {
          gt0Clusters.get(c).connections.remove(mergeID);

          // recalculate connection from other clusters to the new merged one
          gt0Clusters.get(c).calculateClusterConnection(workclass, false);
          // and from new merged one to other clusters
          gt0Clusters.get(workclass).calculateClusterConnection(c, false);
        }
      }
      else {
        System.out.println("Merge indices are not valid");
      }
    }