docs: public OutlierResult run(Database database, Relation<O> relation) {
      StepProgress stepprog = LOG.isVerbose() ? new StepProgress("IDOS", 3) : null;
      if(stepprog != null) {
        stepprog.beginStep(1, "Precomputing neighborhoods", LOG);
      }
      KNNQuery<O> knnQ = DatabaseUtil.precomputedKNNQuery(database, relation, getDistanceFunction(), Math.max(k_c, k_r) + 1);
      DBIDs ids = relation.getDBIDs();
  
      if(stepprog != null) {
        stepprog.beginStep(2, "Computing intrinsic dimensionalities", LOG);
      }
      DoubleDataStore intDims = computeIDs(ids, knnQ);
      if(stepprog != null) {
        stepprog.beginStep(3, "Computing IDOS scores", LOG);
      }
      DoubleMinMax idosminmax = new DoubleMinMax();
      DoubleDataStore ldms = computeIDOS(ids, knnQ, intDims, idosminmax);
      if(stepprog != null) {
        stepprog.setCompleted(LOG);
      }
      DoubleRelation scoreResult = new MaterializedDoubleRelation("Intrinsic Dimensionality Outlier Score", "idos", ldms, ids);
      OutlierScoreMeta scoreMeta = new QuotientOutlierScoreMeta(idosminmax.getMin(), idosminmax.getMax(), 0.0, Double.POSITIVE_INFINITY, 1.0);
      return new OutlierResult(scoreMeta, scoreResult);
    }