docs: private void computeNeighborhoods(Relation<O> relation, DataStore<SetDBIDs> knns, ModifiableDBIDs pruned, WritableDataStore<ModifiableDBIDs> rNNminuskNNs) {
      FiniteProgress prog = LOG.isVerbose() ? new FiniteProgress("Finding RkNN", relation.size(), LOG) : null;
      for(DBIDIter iter = relation.iterDBIDs(); iter.valid(); iter.advance()) {
        DBIDs knn = knns.get(iter);
        int count = 1; // The point itself.
        for(DBIDIter niter = knn.iter(); niter.valid(); niter.advance()) {
          // Ignore the query point itself.
          if(DBIDUtil.equal(iter, niter)) {
            continue;
          }
          // As we did not initialize count with the rNN size, we check all
          // neighbors here.
          if(knns.get(niter).contains(iter)) {
            count++;
          }
          else {
            // In contrast to INFLO pseudocode, we only update if it is not found,
            // i.e., if it is in RkNN \setminus kNN, to save memory.
            rNNminuskNNs.get(niter).add(iter);
          }
        }
        // INFLO pruning rule
        if(count >= knn.size() * m) {
          pruned.add(iter);
        }
        LOG.incrementProcessed(prog);
      }
      LOG.ensureCompleted(prog);
    }