@Override
protected void preprocess() {
DistanceQuery<O, D> distanceQuery = relation.getDatabase().getDistanceQuery(relation, distanceFunction);
storage = DataStoreUtil.makeStorage(relation.getDBIDs(), DataStoreFactory.HINT_STATIC, KNNResult.class);
FiniteProgress progress = getLogger().isVerbose() ? new FiniteProgress("Materializing random-sample k nearest neighbors (k=" + k + ")", relation.size(), getLogger()) : null;
final ArrayDBIDs ids = DBIDUtil.ensureArray(relation.getDBIDs());
final int samplesize = (int) (ids.size() * share);
final long iseed = (seed != null) ? seed : (new Random()).nextLong();
int i = 0;
for(DBID id : ids) {
KNNHeap<D> kNN = new KNNHeap<D>(k, distanceQuery.infiniteDistance());
long rseed = i * 0x7FFFFFFFFFFFFFE7L + iseed;
DBIDs rsamp = DBIDUtil.randomSample(ids, samplesize, rseed);
for(DBID oid : rsamp) {
D dist = distanceQuery.distance(id, oid);
kNN.add(new GenericDistanceResultPair<D>(dist, oid));
}
storage.put(id, kNN.toKNNList());
if(progress != null) {
progress.incrementProcessed(getLogger());
}
}
if(progress != null) {
progress.ensureCompleted(getLogger());
}
}