docs: public OutlierResult run(Database database, Relation<? extends NumberVector> relation) {
      @SuppressWarnings("unchecked")
      PrimitiveDistanceQuery<? super NumberVector> distq = (PrimitiveDistanceQuery<? super NumberVector>) database.getDistanceQuery(relation, distanceFunction);
      Collection<? extends NumberVector> refPoints = refp.getReferencePoints(relation);
      if(refPoints.isEmpty()) {
        throw new AbortException("Cannot compute ROS without reference points!");
      }
  
      DBIDs ids = relation.getDBIDs();
      if(k >= ids.size()) {
        throw new AbortException("k must not be chosen larger than the database size!");
      }
      // storage of distance/score values.
      WritableDoubleDataStore rbod_score = DataStoreUtil.makeDoubleStorage(ids, DataStoreFactory.HINT_STATIC | DataStoreFactory.HINT_HOT, Double.NaN);
  
      // Compute density estimation:
      for(NumberVector refPoint : refPoints) {
        DoubleDBIDList referenceDists = computeDistanceVector(refPoint, relation, distq);
        updateDensities(rbod_score, referenceDists);
      }
      // compute maximum density
      DoubleMinMax mm = new DoubleMinMax();
      for(DBIDIter iditer = relation.iterDBIDs(); iditer.valid(); iditer.advance()) {
        mm.put(rbod_score.doubleValue(iditer));
      }
      // compute ROS
      double scale = mm.getMax() > 0. ? 1. / mm.getMax() : 1.;
      mm.reset(); // Reuse
      for(DBIDIter iditer = relation.iterDBIDs(); iditer.valid(); iditer.advance()) {
        double score = 1 - (rbod_score.doubleValue(iditer) * scale);
        mm.put(score);
        rbod_score.putDouble(iditer, score);
      }
  
      DoubleRelation scoreResult = new MaterializedDoubleRelation("Reference-points Outlier Scores", "reference-outlier", rbod_score, relation.getDBIDs());
      OutlierScoreMeta scoreMeta = new BasicOutlierScoreMeta(mm.getMin(), mm.getMax(), 0., 1., 0.);
      OutlierResult result = new OutlierResult(scoreMeta, scoreResult);
      // adds reference points to the result. header information for the
      // visualizer to find the reference points in the result
      result.addChildResult(new ReferencePointsResult<>("Reference points", "reference-points", refPoints));
      return result;
    }