private Clustering joinClusters()

in samoa-api/src/main/java/org/apache/samoa/moa/clusterers/ClusterGenerator.java [275:322]


  private Clustering joinClusters(Clustering clustering) {

    double radiusFactor = joinClustersOption.getValue();
    boolean[] merged = new boolean[clustering.size()];

    Clustering mclustering = new Clustering();

    if (radiusFactor > 0) {
      for (int c1 = 0; c1 < clustering.size(); c1++) {
        SphereCluster sc1 = (SphereCluster) clustering.get(c1);
        double minDist = Double.MAX_VALUE;
        int maxIndexCon = -1;
        for (int c2 = 0; c2 < clustering.size(); c2++) {
          SphereCluster sc2 = (SphereCluster) clustering.get(c2);
          // double over = sc1.overlapRadiusDegree(sc2);
          // if(over > 0 && over < minOver){
          // minOver = over;
          // maxindexOver = c2;
          // }
          double dist = sc1.getHullDistance(sc2);
          double threshold = Math.min(sc1.getRadius(), sc2.getRadius()) * radiusFactor;
          if (dist > 0 && dist < minDist && dist < threshold) {
            minDist = dist;
            maxIndexCon = c2;
          }
        }
        int maxindex;
        maxindex = maxIndexCon;

        if (maxindex != -1 && !merged[c1]) {
          merged[c1] = true;
          merged[maxindex] = true;
          SphereCluster scnew = new SphereCluster(sc1.getCenter(), sc1.getRadius(), sc1.getWeight());
          SphereCluster sc2 = (SphereCluster) clustering.get(maxindex);
          scnew.merge(sc2);
          mclustering.add(scnew);
        }
      }
    }

    for (int i = 0; i < merged.length; i++) {
      if (!merged[i])
        mclustering.add(clustering.get(i));
    }

    return mclustering;

  }