package edu.harvard.mcb.leschziner.classify;
import java.util.Collection;
import java.util.Map;
import com.hazelcast.core.AtomicNumber;
import edu.harvard.mcb.leschziner.core.Particle;
import edu.harvard.mcb.leschziner.storage.DefaultStorageEngine;
import edu.harvard.mcb.leschziner.storage.StorageEngine;
/**
* A Classifier that compares particles to a set of template particles, sorting
* them into classes by greatest similarity (determined by Pearson cross
* correlation).
*
* @author spartango
*
*/
public class CrossCorClassifier extends DistributedClassifier {
// The set of templates keyed by UUID
private final String templateSetName;
private final AtomicNumber currentTemplateId;
private final Map<Long, Particle> templates;
// Gates classification with a minimum correlation
private final double matchThreshold;
/**
* Builds a Cross Correlating Classifier with no minimum correlation
* required for sorting
*/
public CrossCorClassifier() {
this(0.0);
}
/**
* Builds a Cross Correlating Classifier that only adds a particle to a
* class when its correlation to the template is above a certain value
*
* @param minimumCorrelation
* : minimum score necessary to sort a particle
*/
public CrossCorClassifier(double minimumCorrelation) {
super();
matchThreshold = minimumCorrelation;
templateSetName = "ClassTemplates_" + this.hashCode();
StorageEngine storage = DefaultStorageEngine.getStorageEngine();
currentTemplateId = storage.getAtomicNumber(templateSetName);
templates = storage.getMap(templateSetName);
}
/**
* Classifies a particle
*/
@Override public void processParticle(final Particle target) {
// Classify the particle asynchronously in a distributed way
execute(new CrossCorClassifierTask(target,
matchThreshold,
classesMapName,
averagesMapName,
templateSetName,
executorName));
}
/**
* Adds a template to compare particles against
*/
public void addTemplate(Particle template) {
long id = currentTemplateId.incrementAndGet();
templates.put(id, template);
}
/**
* Add a bunch of templates to compare particles against
*
* @param templates
*/
public void addTemplates(Collection<Particle> templates) {
for (Particle template : templates) {
addTemplate(template);
}
}
/**
* Get all the templates being used for classification
*/
public Collection<Particle> getTemplates() {
return templates.values();
}
@Override public void classifyAll() {
// Doesn't do anything, due to streaming classification
}
}