logger.verbose(msg.toString());
}
// get the ''best'' d-dimensional intervals at max level
while(!heap.isEmpty()) {
CASHInterval interval = determineNextIntervalAtMaxLevel(heap);
if(logger.isDebugging()) {
logger.debugFine("next interval in dim " + dim + ": " + interval);
}
else if(logger.isVerbose()) {
logger.verbose("next interval in dim " + dim + ": " + interval);
}
// only noise left
if(interval == null) {
break;
}
// do a dim-1 dimensional run
ModifiableDBIDs clusterIDs = DBIDUtil.newHashSet();
if(dim > minDim + 1) {
ModifiableDBIDs ids;
Matrix basis_dim_minus_1;
if(adjust) {
ids = DBIDUtil.newHashSet();
basis_dim_minus_1 = runDerivator(relation, dim, interval, ids);
}
else {
ids = interval.getIDs();
basis_dim_minus_1 = determineBasis(SpatialUtil.centroid(interval));
}
if(ids.size() != 0) {
MaterializedRelation<ParameterizationFunction> db = buildDB(dim, basis_dim_minus_1, ids, relation);
// add result of dim-1 to this result
Clustering<Model> res_dim_minus_1 = doRun(db, progress);
for(Cluster<Model> cluster : res_dim_minus_1.getAllClusters()) {
res.addCluster(cluster);
noiseIDs.removeDBIDs(cluster.getIDs());
clusterIDs.addDBIDs(cluster.getIDs());
processedIDs.addDBIDs(cluster.getIDs());
}
}
}
// dim == minDim
else {
LinearEquationSystem les = runDerivator(relation, dim - 1, interval.getIDs());
Cluster<Model> c = new Cluster<Model>(interval.getIDs(), new LinearEquationModel(les));
res.addCluster(c);
noiseIDs.removeDBIDs(interval.getIDs());
clusterIDs.addDBIDs(interval.getIDs());
processedIDs.addDBIDs(interval.getIDs());
}
// Rebuild heap
List<IntegerPriorityObject<CASHInterval>> heapVector = heap.toSortedArrayList();
for(IntegerPriorityObject<CASHInterval> pair : heapVector) {
CASHInterval currentInterval = pair.getObject();
currentInterval.removeIDs(clusterIDs);
if(currentInterval.getIDs().size() >= minPts) {
heap.add(new IntegerPriorityObject<CASHInterval>(currentInterval.priority(), currentInterval));
}
}
if(progress != null) {
progress.setProcessed(processedIDs.size(), logger);