public Dendrogram cluster() {

    Dendrogram dnd = new Dendrogram("Distance");
    double d = 0.0;

    // initially load all elements as individual clusters
    for (DataPoint e : elements) {
      Cluster c = new Cluster(e);
      allClusters.add(c);
    }

    dnd.addLevel(String.valueOf(d), allClusters.getAllClusters());

    d = 1.0;

    while (allClusters.size() > 1) {
      int K = allClusters.size();
      mergeClusters(d);
      // it is possible that there were no clusters to merge for current
      // d.
      if (K > allClusters.size()) {
        dnd.addLevel(String.valueOf(d), allClusters.getAllClusters());
        K = allClusters.size();
      }

      d = d + 0.5;
    }
    return dnd;
  }