docs: public OutlierResult run(Database db, Relation<V> relation) {
      ArrayDBIDs ids = DBIDUtil.ensureArray(relation.getDBIDs());
      // Build a kernel matrix, to make O(n^3) slightly less bad.
      SimilarityQuery<V> sq = db.getSimilarityQuery(relation, kernelFunction);
      KernelMatrix kernelMatrix = new KernelMatrix(sq, relation, ids);
  
      WritableDoubleDataStore abodvalues = DataStoreUtil.makeDoubleStorage(ids, DataStoreFactory.HINT_STATIC);
      DoubleMinMax minmaxabod = new DoubleMinMax();
  
      MeanVariance s = new MeanVariance();
      DBIDArrayIter pA = ids.iter(), pB = ids.iter(), pC = ids.iter();
      for(; pA.valid(); pA.advance()) {
        final double abof = computeABOF(kernelMatrix, pA, pB, pC, s);
        minmaxabod.put(abof);
        abodvalues.putDouble(pA, abof);
      }
  
      // Build result representation.
      DoubleRelation scoreResult = new MaterializedDoubleRelation("Angle-Based Outlier Degree", "abod-outlier", abodvalues, relation.getDBIDs());
      OutlierScoreMeta scoreMeta = new InvertedOutlierScoreMeta(minmaxabod.getMin(), minmaxabod.getMax(), 0.0, Double.POSITIVE_INFINITY);
      return new OutlierResult(scoreMeta, scoreResult);
    }