/** * Make the cluster for the given object * * @param clustering Parent clustering * @param parent Parent cluster (for hierarchical output) * @param flatten Flag to flatten all clusters below. * @param hierarchical Hierarchical outpu */ private void finalizeCluster(Clustering<DendrogramModel> clustering, Cluster<DendrogramModel> parent, boolean flatten, boolean hierarchical) { final String name = "C_" + FormatUtil.NF6.format(dist); Cluster<DendrogramModel> clus = new Cluster<>(name, members, new DendrogramModel(dist)); if(hierarchical && parent != null) { // Hierarchical output clustering.addChildCluster(parent, clus); } else { clustering.addToplevelCluster(clus); } collectChildren(clustering, this, clus, flatten, hierarchical); members = null; children = null; }
/** * Recursive flattening of clusters. * * @param clustering Output clustering * @param cur Current temporary cluster * @param clus Output cluster * @param flatten Flag to indicate everything below should be flattened. * @param hierarchical Hierarchical output */ private void collectChildren(Clustering<DendrogramModel> clustering, TempCluster cur, Cluster<DendrogramModel> clus, boolean flatten, boolean hierarchical) { for(TempCluster child : cur.children) { if(flatten || child.totalStability() < 0) { members.addDBIDs(child.members); collectChildren(clustering, child, clus, flatten, hierarchical); } else { child.finalizeCluster(clustering, clus, true, hierarchical); } } } }