docs: public OutlierResult run(Database database, Relation<O> relation) {
      StepProgress stepprog = LOG.isVerbose() ? new StepProgress("INFLO", 3) : null;
  
      // Step one: find the kNN
      LOG.beginStep(stepprog, 1, "Materializing nearest-neighbor sets.");
      KNNQuery<O> knnq = DatabaseUtil.precomputedKNNQuery(database, relation, getDistanceFunction(), kplus1);
  
      // Step two: find the RkNN, minus kNN.
      LOG.beginStep(stepprog, 2, "Materialize reverse NN.");
      ModifiableDBIDs pruned = DBIDUtil.newHashSet();
      // kNNS
      WritableDataStore<SetDBIDs> knns = DataStoreUtil.makeStorage(relation.getDBIDs(), DataStoreFactory.HINT_TEMP | DataStoreFactory.HINT_HOT, SetDBIDs.class);
      // We first need to convert the kNN into sets, because of performance below.
      for(DBIDIter iditer = relation.iterDBIDs(); iditer.valid(); iditer.advance()) {
        knns.put(iditer, DBIDUtil.ensureSet(knnq.getKNNForDBID(iditer, kplus1)));
      }
      // RNNS
      WritableDataStore<ModifiableDBIDs> rnnMinusKNNs = DataStoreUtil.makeStorage(relation.getDBIDs(), DataStoreFactory.HINT_TEMP | DataStoreFactory.HINT_HOT, ModifiableDBIDs.class);
      // init the rNN
      for(DBIDIter iditer = relation.iterDBIDs(); iditer.valid(); iditer.advance()) {
        rnnMinusKNNs.put(iditer, DBIDUtil.newArray());
      }
      computeNeighborhoods(relation, knns, pruned, rnnMinusKNNs);
      // We do not need the set-copy of the knns anymore
      knns.clear();
  
      // Step three: compute INFLO scores
      LOG.beginStep(stepprog, 3, "Compute INFLO scores.");
      // Calculate INFLO for any Object
      DoubleMinMax inflominmax = new DoubleMinMax();
      WritableDoubleDataStore inflos = DataStoreUtil.makeDoubleStorage(relation.getDBIDs(), DataStoreFactory.HINT_STATIC);
      computeINFLO(relation, pruned, knnq, rnnMinusKNNs, inflos, inflominmax);
      LOG.setCompleted(stepprog);
      LOG.statistics(new LongStatistic(INFLO.class.getName() + ".pruned", pruned.size()));
  
      // Build result representation.
      DoubleRelation scoreResult = new MaterializedDoubleRelation("Influence Outlier Score", "inflo-outlier", inflos, relation.getDBIDs());
      OutlierScoreMeta scoreMeta = new QuotientOutlierScoreMeta(inflominmax.getMin(), inflominmax.getMax(), 0., Double.POSITIVE_INFINITY, 1.);
      return new OutlierResult(scoreMeta, scoreResult);
    }