docs: public OutlierResult run(Relation<V> relation) {
      DoubleMinMax mm = new DoubleMinMax();
      // resulting scores
      WritableDoubleDataStore oscores = DataStoreUtil.makeDoubleStorage(relation.getDBIDs(), DataStoreFactory.HINT_TEMP | DataStoreFactory.HINT_HOT);
  
      // Compute mean and covariance Matrix
      CovarianceMatrix temp = CovarianceMatrix.make(relation);
      double[] mean = temp.getMeanVector(relation).toArray();
      // debugFine(mean.toString());
      double[][] covarianceMatrix = temp.destroyToPopulationMatrix();
      // debugFine(covarianceMatrix.toString());
      double[][] covarianceTransposed = inverse(covarianceMatrix);
  
      // Normalization factors for Gaussian PDF
      double det = new LUDecomposition(covarianceMatrix).det();
      final double fakt = 1.0 / FastMath.sqrt(MathUtil.powi(MathUtil.TWOPI, RelationUtil.dimensionality(relation)) * det);
  
      // for each object compute Mahalanobis distance
      for(DBIDIter iditer = relation.iterDBIDs(); iditer.valid(); iditer.advance()) {
        double[] x = minusEquals(relation.get(iditer).toArray(), mean);
        // Gaussian PDF
        final double mDist = transposeTimesTimes(x, covarianceTransposed, x);
        final double prob = fakt * FastMath.exp(-mDist * .5);
  
        mm.put(prob);
        oscores.putDouble(iditer, prob);
      }
  
      final OutlierScoreMeta meta;
      if(invert) {
        double max = mm.getMax() != 0 ? mm.getMax() : 1.;
        for(DBIDIter iditer = relation.iterDBIDs(); iditer.valid(); iditer.advance()) {
          oscores.putDouble(iditer, (max - oscores.doubleValue(iditer)) / max);
        }
        meta = new BasicOutlierScoreMeta(0.0, 1.0);
      }
      else {
        meta = new InvertedOutlierScoreMeta(mm.getMin(), mm.getMax(), 0.0, Double.POSITIVE_INFINITY);
      }
      DoubleRelation res = new MaterializedDoubleRelation("Gaussian Model Outlier Score", "gaussian-model-outlier", oscores, relation.getDBIDs());
      return new OutlierResult(meta, res);
    }