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");
}
}