* @param relation the database storing the parameterization functions
* @param dim the dimensionality of the database
* @param ids the ids of the database
*/
private void initHeap(Heap<IntegerPriorityObject<CASHInterval>> heap, Relation<ParameterizationFunction> relation, int dim, DBIDs ids) {
CASHIntervalSplit split = new CASHIntervalSplit(relation, minPts);
// determine minimum and maximum function value of all functions
double[] minMax = determineMinMaxDistance(relation, dim);
double d_min = minMax[0];
double d_max = minMax[1];
double dIntervalLength = d_max - d_min;
int numDIntervals = (int) Math.ceil(dIntervalLength / jitter);
double dIntervalSize = dIntervalLength / numDIntervals;
double[] d_mins = new double[numDIntervals];
double[] d_maxs = new double[numDIntervals];
if(logger.isDebugging()) {
StringBuffer msg = new StringBuffer();
msg.append("d_min ").append(d_min);
msg.append("\nd_max ").append(d_max);
msg.append("\nnumDIntervals ").append(numDIntervals);
msg.append("\ndIntervalSize ").append(dIntervalSize);
logger.debugFine(msg.toString());
}
else if(logger.isVerbose()) {
StringBuffer msg = new StringBuffer();
msg.append("d_min ").append(d_min);
msg.append("\nd_max ").append(d_max);
msg.append("\nnumDIntervals ").append(numDIntervals);
msg.append("\ndIntervalSize ").append(dIntervalSize);
logger.verbose(msg.toString());
}
// alpha intervals
double[] alphaMin = new double[dim - 1];
double[] alphaMax = new double[dim - 1];
Arrays.fill(alphaMax, Math.PI);
for(int i = 0; i < numDIntervals; i++) {
if(i == 0) {
d_mins[i] = d_min;
}
else {
d_mins[i] = d_maxs[i - 1];
}
if(i < numDIntervals - 1) {
d_maxs[i] = d_mins[i] + dIntervalSize;
}
else {
d_maxs[i] = d_max - d_mins[i];
}
HyperBoundingBox alphaInterval = new HyperBoundingBox(alphaMin, alphaMax);
ModifiableDBIDs intervalIDs = split.determineIDs(ids, alphaInterval, d_mins[i], d_maxs[i]);
if(intervalIDs != null && intervalIDs.size() >= minPts) {
CASHInterval rootInterval = new CASHInterval(alphaMin, alphaMax, split, intervalIDs, 0, 0, d_mins[i], d_maxs[i]);
heap.add(new IntegerPriorityObject<CASHInterval>(rootInterval.priority(), rootInterval));
}
}