use of de.lmu.ifi.dbs.elki.data.spatial.SpatialComparable in project elki by elki-project.
the class ApproximativeLeastOverlapInsertionStrategy method choose.
@Override
public <A> int choose(A options, ArrayAdapter<? extends SpatialComparable, A> getter, SpatialComparable obj, int height, int depth) {
final int size = getter.size(options);
assert (size > 0) : "Choose from empty set?";
if (size <= numCandidates) {
// Skip building the heap.
return super.choose(options, getter, obj, height, depth);
}
// Heap of candidates
TopBoundedHeap<DoubleIntPair> candidates = new TopBoundedHeap<>(numCandidates, Collections.reverseOrder());
for (int i = 0; i < size; i++) {
// Existing object and extended rectangle:
SpatialComparable entry = getter.get(options, i);
HyperBoundingBox mbr = SpatialUtil.union(entry, obj);
// Area increase
final double inc_area = SpatialUtil.volume(mbr) - SpatialUtil.volume(entry);
candidates.add(new DoubleIntPair(inc_area, i));
}
// R*-Tree: overlap increase for leaves.
int best = -1;
double least_overlap = Double.POSITIVE_INFINITY;
double least_areainc = Double.POSITIVE_INFINITY;
double least_area = Double.POSITIVE_INFINITY;
// least overlap increase, on reduced candidate set:
while (!candidates.isEmpty()) {
DoubleIntPair pair = candidates.poll();
final double inc_area = pair.first;
// Existing object and extended rectangle:
SpatialComparable entry = getter.get(options, pair.second);
HyperBoundingBox mbr = SpatialUtil.union(entry, obj);
// Compute relative overlap increase.
double overlap_wout = 0.0;
double overlap_with = 0.0;
for (int k = 0; k < size; k++) {
if (pair.second != k) {
SpatialComparable other = getter.get(options, k);
overlap_wout += SpatialUtil.relativeOverlap(entry, other);
overlap_with += SpatialUtil.relativeOverlap(mbr, other);
}
}
double inc_overlap = overlap_with - overlap_wout;
if (inc_overlap < least_overlap) {
final double area = SpatialUtil.volume(entry);
// Volume increase and overlap increase:
least_overlap = inc_overlap;
least_areainc = inc_area;
least_area = area;
best = pair.second;
} else if (inc_overlap == least_overlap) {
final double area = SpatialUtil.volume(entry);
if (inc_area < least_areainc || (inc_area == least_areainc && area < least_area)) {
least_overlap = inc_overlap;
least_areainc = inc_area;
least_area = area;
best = pair.second;
}
}
}
assert (best > -1) : "No split found? Volume outside of double precision?";
return best;
}
use of de.lmu.ifi.dbs.elki.data.spatial.SpatialComparable in project elki by elki-project.
the class LeastOverlapInsertionStrategy method choose.
@Override
public <A> int choose(A options, ArrayAdapter<? extends SpatialComparable, A> getter, SpatialComparable obj, int height, int depth) {
final int size = getter.size(options);
assert (size > 0) : "Choose from empty set?";
// R*-Tree: overlap increase for leaves.
int best = -1;
double least_overlap = Double.POSITIVE_INFINITY;
double least_areainc = Double.POSITIVE_INFINITY;
double least_area = Double.POSITIVE_INFINITY;
// least overlap increase, on reduced candidate set:
for (int i = 0; i < size; i++) {
// Existing object and extended rectangle:
SpatialComparable entry = getter.get(options, i);
HyperBoundingBox mbr = SpatialUtil.union(entry, obj);
// Compute relative overlap increase.
double overlap_wout = 0.0;
double overlap_with = 0.0;
for (int k = 0; k < size; k++) {
if (i != k) {
SpatialComparable other = getter.get(options, k);
overlap_wout += SpatialUtil.relativeOverlap(entry, other);
overlap_with += SpatialUtil.relativeOverlap(mbr, other);
}
}
double inc_overlap = overlap_with - overlap_wout;
if (inc_overlap < least_overlap) {
final double area = SpatialUtil.volume(entry);
final double inc_area = SpatialUtil.volume(mbr) - area;
// Volume increase and overlap increase:
least_overlap = inc_overlap;
least_areainc = inc_area;
least_area = area;
best = i;
} else if (inc_overlap == least_overlap) {
final double area = SpatialUtil.volume(entry);
final double inc_area = SpatialUtil.volume(mbr) - area;
if (inc_area < least_areainc || (inc_area == least_areainc && area < least_area)) {
least_overlap = inc_overlap;
least_areainc = inc_area;
least_area = area;
best = i;
}
}
}
assert (best > -1) : "No split found? Volume outside of double precision?";
return best;
}
Aggregations