package cc.mallet.cluster.neighbor_evaluator;
import cc.mallet.cluster.Clustering;
import cc.mallet.util.ArrayUtils;
/**
* A {@link Neighbor} created by merging two clusters of the original
* Clustering.
*
* @author "Aron Culotta" <culotta@degas.cs.umass.edu>
* @version 1.0
* @since 1.0
*/
public class AgglomerativeNeighbor extends Neighbor {
private static final long serialVersionUID = 1L;
/**
* Instance indices in the new, merged cluster.
*/
int[] newCluster;
/**
* Instance indices in the old, pre-merged clusters.
*/
int[][] oldClusters;
/**
*
* @param original
* @param modified
* @param cluster1 Instance indices for one cluster that was merged.
* @param cluster2 Instance indices for other cluster that was merged.
* @return
*/
public AgglomerativeNeighbor (Clustering original,
Clustering modified,
int[][] oldClusters) {
super(original, modified);
if (oldClusters.length != 2)
throw new IllegalArgumentException("Agglomerations of more than 2 clusters not yet implemented.");
this.oldClusters = oldClusters;
this.newCluster = ArrayUtils.append(oldClusters[0], oldClusters[1]);
}
public AgglomerativeNeighbor (Clustering original,
Clustering modified,
int[] oldCluster1, int[] oldCluster2) {
this(original, modified, new int[][]{oldCluster1, oldCluster2});
}
public AgglomerativeNeighbor (Clustering original,
Clustering modified,
int oldCluster1, int oldCluster2) {
this(original, modified, new int[][]{{oldCluster1}, {oldCluster2}});
}
public int[] getNewCluster () { return newCluster; }
public int[][] getOldClusters () { return oldClusters; }
public String toString () {
String ret = super.toString() + "\nnewcluster=";
for (int i = 0; i < newCluster.length; i++)
ret += newCluster[i] + " ";
return ret;
}
}