docs: public Clustering<SubspaceModel> run(Database database, Relation<V> relation) {
      // Dimensionality of our set.
      final int d = RelationUtil.dimensionality(relation);
  
      // Get available DBIDs as a set we can remove items from.
      ArrayModifiableDBIDs S = DBIDUtil.newArray(relation.getDBIDs());
  
      // Precompute values as described in Figure 2.
      double r = Math.abs(FastMath.log(d + d) / FastMath.log(beta * .5));
      // Outer loop count.
      int n = (int) (2. / alpha);
      // Inner loop count.
      int m = (int) (FastMath.pow(2. / alpha, r) * FastMath.log(4));
      m = Math.min(m, Math.min(1000000, d * d)); // TODO: This should only apply
                                                 // for FastDOC.
  
      // Minimum size for a cluster for it to be accepted.
      int minClusterSize = (int) (alpha * S.size());
  
      // List of all clusters we found.
      Clustering<SubspaceModel> result = new Clustering<>("DOC Clusters", "DOC");
  
      // Inform the user about the number of actual clusters found so far.
      IndefiniteProgress cprogress = LOG.isVerbose() ? new IndefiniteProgress("Number of clusters", LOG) : null;
  
      // To not only find a single cluster, we continue running until our set
      // of points is empty.
      while(S.size() > minClusterSize) {
        Cluster<SubspaceModel> C = runDOC(database, relation, S, d, n, m, (int) r, minClusterSize);
  
        if(C == null) {
          // Stop trying if we couldn't find a cluster.
          break;
        }
        // Found a cluster, remember it, remove its points from the set.
        result.addToplevelCluster(C);
  
        // Remove all points of the cluster from the set and continue.
        S.removeDBIDs(C.getIDs());
  
        if(cprogress != null) {
          cprogress.setProcessed(result.getAllClusters().size(), LOG);
        }
      }
  
      // Add the remainder as noise.
      if(S.size() > 0) {
        long[] alldims = BitsUtil.ones(d);
        result.addToplevelCluster(new Cluster<>(S, true, new SubspaceModel(new Subspace(alldims), Centroid.make(relation, S).getArrayRef())));
      }
      LOG.setCompleted(cprogress);
      return result;
    }