package edu.harvard.mcb.leschziner.classify;
import java.io.IOException;
import java.util.concurrent.BlockingQueue;
import com.hazelcast.core.MultiMap;
import edu.harvard.mcb.leschziner.analyze.Clusters;
import edu.harvard.mcb.leschziner.analyze.CvPrincipalComponentAnalyzer;
import edu.harvard.mcb.leschziner.analyze.KMeansClusterer;
import edu.harvard.mcb.leschziner.analyze.PrincipalComponents;
import edu.harvard.mcb.leschziner.core.Particle;
import edu.harvard.mcb.leschziner.distributed.DistributedProcessingTask;
import edu.harvard.mcb.leschziner.storage.DefaultStorageEngine;
import edu.harvard.mcb.leschziner.storage.StorageEngine;
public class PCAClassifierTask extends DistributedProcessingTask {
private final String targetQueueName;
private final CvPrincipalComponentAnalyzer pcAnalyzer;
private final KMeansClusterer clusterer;
private final String classesMapName;
public PCAClassifierTask(String targetQueueName,
CvPrincipalComponentAnalyzer pcAnalyzer,
KMeansClusterer clusterer,
String classesMapName,
String executorName) {
super(executorName);
this.targetQueueName = targetQueueName;
this.pcAnalyzer = pcAnalyzer;
this.clusterer = clusterer;
this.classesMapName = classesMapName;
}
/**
*
*/
private static final long serialVersionUID = 868914623793845509L;
@Override public void process() {
StorageEngine storage = DefaultStorageEngine.getStorageEngine();
// Fetch the targets
BlockingQueue<Particle> targets = storage.getQueue(targetQueueName);
// Clear any existing classes
MultiMap<Long, Particle> classes = storage.getMultiMap(classesMapName);
classes.clear();
// Run PCA
PrincipalComponents pComponents = pcAnalyzer.analyze(targets);
if (pComponents != null) {
System.out.print("["
+ this.getClass().getSimpleName()
+ "]: Eigenvalues: ");
// Some info about the principal components
for (int i = 0; i < pComponents.componentCount(); i++) {
System.out.print(pComponents.getEigenValue(i) + " ");
Particle eigenParticle = new Particle(pComponents.getEigenImage(i));
// write the eigenParticle
try {
eigenParticle.toFile("processed/eigen_" + i + ".png");
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println();
// Run Clustering
System.out.println("["
+ this.getClass().getSimpleName()
+ "]: Clustering classes");
Clusters clusters = clusterer.cluster(pComponents.getSubSpace());
int i = 0;
// Group the original images
for (Particle target : targets) {
// Get the cluster label for this particle
long cluster = clusters.getClusterForSample(i);
// Put the particle in the right class
classes.put(cluster, target);
i++;
}
System.out.println("["
+ this.getClass().getSimpleName()
+ "]: Completed Clustering");
}
}
}