docs: public Clustering<MeanModel> run(Relation<NumberVector> relation) {
      final int dim = RelationUtil.dimensionality(relation);
      CFTree tree = cffactory.newTree(relation.getDBIDs(), relation);
      // The CFTree does not store points. We have to reassign them (and the
      // quality is better than if we used the initial assignment, because centers
      // move in particular in the beginning, so we always had many outliers.
      Map<ClusteringFeature, ModifiableDBIDs> idmap = new HashMap<ClusteringFeature, ModifiableDBIDs>(tree.leaves);
      for(DBIDIter iter = relation.iterDBIDs(); iter.valid(); iter.advance()) {
        ClusteringFeature cf = tree.findLeaf(relation.get(iter));
        ModifiableDBIDs ids = idmap.get(cf);
        if(ids == null) {
          idmap.put(cf, ids = DBIDUtil.newArray(cf.n));
        }
        ids.add(iter);
      }
      Clustering<MeanModel> result = new Clustering<>("BIRCH-leaves", "BIRCH leaves");
      for(Map.Entry<ClusteringFeature, ModifiableDBIDs> ent : idmap.entrySet()) {
        ClusteringFeature leaf = ent.getKey();
        double[] center = new double[dim];
        for(int i = 0; i < dim; i++) {
          center[i] = leaf.centroid(i);
        }
        result.addToplevelCluster(new Cluster<>(ent.getValue(), new MeanModel(center)));
      }
      return result;
    }