* @return Clustering result
*/
public Clustering<CorrelationModel<V>> run(Relation<V> relation) throws IllegalStateException {
final int dimensionality = DatabaseUtil.dimensionality(relation);
StepProgress stepprog = logger.isVerbose() ? new StepProgress(3) : null;
// run COPAC
if(stepprog != null) {
stepprog.beginStep(1, "Preprocessing local correlation dimensionalities and partitioning data", logger);
}
Clustering<Model> copacResult = copacAlgorithm.run(relation);
DistanceQuery<V, IntegerDistance> query = copacAlgorithm.getPartitionDistanceQuery();
// extract correlation clusters
if(stepprog != null) {
stepprog.beginStep(2, "Extract correlation clusters", logger);
}
SortedMap<Integer, List<Cluster<CorrelationModel<V>>>> clusterMap = extractCorrelationClusters(copacResult, relation, dimensionality);
if(logger.isDebugging()) {
StringBuffer msg = new StringBuffer("Step 2: Extract correlation clusters...");
for(Integer corrDim : clusterMap.keySet()) {
List<Cluster<CorrelationModel<V>>> correlationClusters = clusterMap.get(corrDim);
msg.append("\n\ncorrDim ").append(corrDim);
for(Cluster<CorrelationModel<V>> cluster : correlationClusters) {
msg.append("\n cluster ").append(cluster).append(", ids: ").append(cluster.getIDs().size());
// .append(", level: ").append(cluster.getLevel()).append(", index: ").append(cluster.getLevelIndex());
// msg.append("\n basis " +
// cluster.getPCA().getWeakEigenvectors().toString(" ", NF) +
// " ids " + cluster.getIDs().size());
}
}
logger.debugFine(msg.toString());
}
if(logger.isVerbose()) {
int clusters = 0;
for(List<Cluster<CorrelationModel<V>>> correlationClusters : clusterMap.values()) {
clusters += correlationClusters.size();
}
logger.verbose(clusters + " clusters extracted.");
}
// build hierarchy
if(stepprog != null) {
stepprog.beginStep(3, "Building hierarchy", logger);
}
buildHierarchy(clusterMap, query);
if(logger.isDebugging()) {
StringBuffer msg = new StringBuffer("Step 3: Build hierarchy");
for(Integer corrDim : clusterMap.keySet()) {
List<Cluster<CorrelationModel<V>>> correlationClusters = clusterMap.get(corrDim);
for(Cluster<CorrelationModel<V>> cluster : correlationClusters) {
msg.append("\n cluster ").append(cluster).append(", ids: ").append(cluster.getIDs().size());
// .append(", level: ").append(cluster.getLevel()).append(", index: ").append(cluster.getLevelIndex());
for(int i = 0; i < cluster.getParents().size(); i++) {
msg.append("\n parent ").append(cluster.getParents().get(i));
}
for(int i = 0; i < cluster.numChildren(); i++) {
msg.append("\n child ").append(cluster.getChildren().get(i));
}
}
}
logger.debugFine(msg.toString());
}
if(stepprog != null) {
stepprog.setCompleted(logger);
}
Clustering<CorrelationModel<V>> result = new Clustering<CorrelationModel<V>>("ERiC clustering", "eric-clustering");
for(Cluster<CorrelationModel<V>> rc : clusterMap.get(clusterMap.lastKey())) {
result.addCluster(rc);