package org.seqcode.ml.clustering.affinitypropagation;
import java.io.PrintStream;
import org.seqcode.ml.clustering.Clusterable;
import org.seqcode.ml.clustering.ClusterablePair;
import org.seqcode.ml.clustering.PairwiseElementMetric;
/**
*
* @author reeder
*
*/
public abstract class SimilarityMeasure<X extends Clusterable> implements PairwiseElementMetric<X> {
protected boolean noiseAdded;
public static final double NEGINF = -Double.MAX_VALUE;
protected int[] assgn;
protected int[] exidx;
public abstract void addNoise();
public abstract double get(int idx1, int idx2);
public abstract int size();
public abstract String getName(int idx);
public abstract boolean exists(ClusterablePair p);
public abstract double evaluate(ClusterablePair p);
/**
*
* @param assgn an array of the index of the exemplar for each point
*/
public void putAssignments(int[] assgn) {
this.assgn = assgn;
}
/**
*
* @param ex an array of the indices of the exemplars
*/
public void putExemplars(int[] exidx) {
this.exidx = exidx;
}
public void printAssignments(PrintStream p) {
for (int i=0; i<this.size(); i++) {
p.println(getName(i)+": "+assgn[i]);
}
}
public void printExemplars(PrintStream p) {
p.println("Number of clusters: "+exidx.length);
for (int i=0; i<exidx.length; i++) {
p.println("Cluster "+i+": "+getName(exidx[i]));
}
}
public void printClusterCenterIndices(PrintStream p) {
for (int i=0; i<this.size(); i++) {
p.println(exidx[assgn[i]]+1);
}
}
}