docs: protected void computeINFLO(Relation<O> relation, ModifiableDBIDs pruned, KNNQuery<O> knnq, WritableDataStore<ModifiableDBIDs> rNNminuskNNs, WritableDoubleDataStore inflos, DoubleMinMax inflominmax) {
      FiniteProgress prog = LOG.isVerbose() ? new FiniteProgress("Computing INFLOs", relation.size(), LOG) : null;
      HashSetModifiableDBIDs set = DBIDUtil.newHashSet();
      for(DBIDIter iter = relation.iterDBIDs(); iter.valid(); iter.advance()) {
        if(pruned.contains(iter)) {
          inflos.putDouble(iter, 1.);
          inflominmax.put(1.);
          LOG.incrementProcessed(prog);
          continue;
        }
        final KNNList knn = knnq.getKNNForDBID(iter, kplus1);
        if(knn.getKNNDistance() == 0.) {
          inflos.putDouble(iter, 1.);
          inflominmax.put(1.);
          LOG.incrementProcessed(prog);
          continue;
        }
        set.clear();
        set.addDBIDs(knn);
        set.addDBIDs(rNNminuskNNs.get(iter));
        // Compute mean density of NN \cup RNN
        double sum = 0.;
        int c = 0;
        for(DBIDIter niter = set.iter(); niter.valid(); niter.advance()) {
          if(DBIDUtil.equal(iter, niter)) {
            continue;
          }
          final double kdist = knnq.getKNNForDBID(niter, kplus1).getKNNDistance();
          if(kdist <= 0) {
            sum = Double.POSITIVE_INFINITY;
            c++;
            break;
          }
          sum += 1. / kdist;
          c++;
        }
        sum *= knn.getKNNDistance();
        final double inflo = sum == 0 ? 1. : sum / c;
        inflos.putDouble(iter, inflo);
        inflominmax.put(inflo);
        LOG.incrementProcessed(prog);
      }
      LOG.ensureCompleted(prog);
    }