return dendrogram;
}
private Cluster<DendrogramModel<D>> root(Map<DBID, ModifiableDBIDs> cluster_ids, Map<DBID, D> cluster_distances, final DataStore<DBID> pi, final DataStore<D> lambda, ModifiableHierarchy<Cluster<DendrogramModel<D>>> hier, FiniteProgress progress) {
if(cluster_ids.size() == 1) {
DBID id = cluster_ids.keySet().iterator().next();
String name = "cluster_" + id + "_" + cluster_distances.get(id);
return new Cluster<DendrogramModel<D>>(name, cluster_ids.get(id), new DendrogramModel<D>(cluster_distances.get(id)), hier);
}
// sort leafs by lambda
List<Pair<DBID, D>> leafs = new ArrayList<Pair<DBID, D>>(cluster_ids.size());
for(DBID id : cluster_ids.keySet()) {
leafs.add(new Pair<DBID, D>(id, lambda.get(id)));
}
Collections.sort(leafs, new Comparator<Pair<DBID, D>>() {
@Override
public int compare(Pair<DBID, D> o1, Pair<DBID, D> o2) {
D k1 = lambda.get(o1.first);
D k2 = lambda.get(o2.first);
if(k1 == null && k2 == null) {
return 0;
}
else if(k1 == null) {
return -1;
}
else if(k2 == null) {
return 1;
}
else {
return k1.compareTo(k2);
}
}
});
// create nodes of the dendrogram
Cluster<DendrogramModel<D>> parent = null;
Map<DBID, Cluster<DendrogramModel<D>>> nodes = new HashMap<DBID, Cluster<DendrogramModel<D>>>();
int nodeCount = 0;
int clusterCount = 0;
while(!leafs.isEmpty()) {
// left child
Pair<DBID, D> leaf = leafs.remove(0);
DBID leftID = leaf.first;
Cluster<DendrogramModel<D>> left = nodes.get(leftID);
if(left == null) {
// String name = "cluster_" + leftID + "_" +
// cluster_distances.get(leftID);
String name = "cluster_" + (++clusterCount);
left = new Cluster<DendrogramModel<D>>(name, cluster_ids.get(leftID), new DendrogramModel<D>(cluster_distances.get(leftID)), hier);
nodes.put(leftID, left);
}
// right child
DBID rightID = pi.get(leftID);
if(leftID.equals(rightID)) {
break;
}
Cluster<DendrogramModel<D>> right = nodes.get(rightID);
if(right == null) {