StringBuffer msg = new StringBuffer();
if(logger.isDebugging()) {
msg.append("interval ").append(interval);
}
ModifiableDBIDs childIDs = DBIDUtil.newHashSet(superSetIDs.size());
Map<DBID, Double> minima = f_minima.get(interval);
Map<DBID, Double> maxima = f_maxima.get(interval);
if(minima == null || maxima == null) {
minima = new HashMap<DBID, Double>();
f_minima.put(interval, minima);
maxima = new HashMap<DBID, Double>();
f_maxima.put(interval, maxima);
}
for(DBID id : superSetIDs) {
Double f_min = minima.get(id);
Double f_max = maxima.get(id);
if(f_min == null) {
ParameterizationFunction f = database.get(id);
HyperBoundingBox minMax = f.determineAlphaMinMax(interval);
f_min = f.function(SpatialUtil.getMin(minMax));
f_max = f.function(SpatialUtil.getMax(minMax));
minima.put(id, f_min);
maxima.put(id, f_max);
}
if(logger.isDebugging()) {
msg.append("\n\nf_min ").append(f_min);
msg.append("\nf_max ").append(f_max);
msg.append("\nd_min ").append(d_min);
msg.append("\nd_max ").append(d_max);
}
if(f_min - f_max > ParameterizationFunction.DELTA) {
throw new IllegalArgumentException("Houston, we have a problem: f_min > f_max! " + "\nf_min[" + FormatUtil.format(SpatialUtil.centroid(interval)) + "] = " + f_min + "\nf_max[" + FormatUtil.format(SpatialUtil.centroid(interval)) + "] = " + f_max + "\nf " + database.get(id));
}
if(f_min <= d_max && f_max >= d_min) {
childIDs.add(id);
if(logger.isDebugging()) {
msg.append("\nid ").append(id).append(" appended");
}
}
else {
if(logger.isDebugging()) {
msg.append("\nid ").append(id).append(" NOT appended");
}
}
}
if(logger.isDebugging()) {
msg.append("\nchildIds ").append(childIDs.size());
logger.debugFine(msg.toString());
}
if(childIDs.size() < minPts) {
return null;
}
else {
return childIDs;
}