docs: public Clustering<Model> run(Relation<O> relation) {
      final int size = relation.size();
      if(size < minpts) {
        Clustering<Model> result = new Clustering<>("DBSCAN Clustering", "dbscan-clustering");
        result.addToplevelCluster(new Cluster<Model>(relation.getDBIDs(), true, ClusterModel.CLUSTER));
        return result;
      }
  
      RangeQuery<O> rangeQuery = QueryUtil.getRangeQuery(relation, getDistanceFunction());
      resultList = new ArrayList<>();
      noise = DBIDUtil.newHashSet();
      runDBSCAN(relation, rangeQuery);
  
      double averagen = ncounter / (double) relation.size();
      LOG.statistics(new DoubleStatistic(DBSCAN.class.getName() + ".average-neighbors", averagen));
      if(averagen < 1 + 0.1 * (minpts - 1)) {
        LOG.warning("There are very few neighbors found. Epsilon may be too small.");
      }
      if(averagen > 100 * minpts) {
        LOG.warning("There are very many neighbors found. Epsilon may be too large.");
      }
  
      Clustering<Model> result = new Clustering<>("DBSCAN Clustering", "dbscan-clustering");
      for(ModifiableDBIDs res : resultList) {
        result.addToplevelCluster(new Cluster<Model>(res, ClusterModel.CLUSTER));
      }
      result.addToplevelCluster(new Cluster<Model>(noise, true, ClusterModel.CLUSTER));
      return result;
    }