docs: public Result run(Database database, Relation<NumberVector> relation) {
      final int dim = RelationUtil.dimensionality(relation);
      final DistanceQuery<NumberVector> distanceQuery = database.getDistanceQuery(relation, getDistanceFunction());
      final KNNQuery<NumberVector> knnQuery = database.getKNNQuery(distanceQuery, k + 1);
  
      final double[] min = new double[dim], extend = new double[dim];
      initializeDataExtends(relation, dim, min, extend);
  
      if(!LOG.isStatistics()) {
        LOG.warning("This algorithm must be used with at least logging level " + Level.STATISTICS);
      }
  
      MeanVariance hmean = new MeanVariance(), umean = new MeanVariance(),
          wmean = new MeanVariance();
      // compute the hopkins value several times and use the average value for a
      // more stable result
      for(int j = 0; j < this.rep; j++) {
        // Compute NN distances for random objects from within the database
        double w = computeNNForRealData(knnQuery, relation, dim);
        // Compute NN distances for randomly created new uniform objects
        double u = computeNNForUniformData(knnQuery, min, extend);
        // compute hopkins statistik
        double h = u / (u + w); // = a / (1+a)
        hmean.put(h);
        umean.put(u);
        wmean.put(w);
      }
      final String prefix = this.getClass().getName();
      LOG.statistics(new LongStatistic(prefix + ".samplesize", sampleSize));
      LOG.statistics(new LongStatistic(prefix + ".dim", dim));
      LOG.statistics(new LongStatistic(prefix + ".hopkins.nearest-neighbor", k));
      LOG.statistics(new DoubleStatistic(prefix + ".hopkins.h.mean", hmean.getMean()));
      LOG.statistics(new DoubleStatistic(prefix + ".hopkins.u.mean", umean.getMean()));
      LOG.statistics(new DoubleStatistic(prefix + ".hopkins.w.mean", wmean.getMean()));
      if(rep > 1) {
        LOG.statistics(new DoubleStatistic(prefix + ".hopkins.h.std", hmean.getSampleStddev()));
        LOG.statistics(new DoubleStatistic(prefix + ".hopkins.u.std", umean.getSampleStddev()));
        LOG.statistics(new DoubleStatistic(prefix + ".hopkins.w.std", wmean.getSampleStddev()));
      }
      // Evaluate:
      double x = hmean.getMean();
      // See Hopkins for a proof that x is supposedly Beta distributed.
      double ix = BetaDistribution.regularizedIncBeta(x, sampleSize, sampleSize);
      double p = (x > .5) ? (1. - ix) : ix;
      LOG.statistics(new DoubleStatistic(prefix + ".hopkins.p", p));
      return null;
    }