package context.arch.enactor;
import java.util.Collection;
import context.arch.discoverer.query.AbstractQueryItem;
import context.arch.discoverer.query.ClassifierWrapper;
import context.arch.intelligibility.weka.WekaExplainer;
/**
* Enactor that uses a WEKA classifier to model reasoning.
* Only one EnactorReference allowed that is automatically set up in the constructor.
*
* @author Brian Y. Lim
*
*/
public class ClassifierEnactor extends Enactor {
protected ClassifierWrapper classifier;
protected ClassifierEnactorReference classifierER;
/**
* Creates an enactor with the reference already set up
* @param inWidgetSubscriptionQuery
* @param outWidgetSubscriptionQuery
* @param outcomeName
* @param classifier
* @param shortId
*/
public ClassifierEnactor(AbstractQueryItem<?,?> inWidgetSubscriptionQuery, AbstractQueryItem<?,?> outWidgetSubscriptionQuery,
String outcomeName, ClassifierWrapper classifier, String shortId) {
super(inWidgetSubscriptionQuery, outWidgetSubscriptionQuery, outcomeName, shortId);
this.classifier = classifier;
// set up for enactor reference, so subclass does not have to
classifierER = new ClassifierEnactorReference(this);
setReference(classifierER);
// set up explainer
try {
setExplainer(WekaExplainer.instance(this, classifier));
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Refers to ClassifierWrapper to get the outcome values instead of multiple EnactorReferences, which this does not have
*/
@Override
public Collection<String> getOutcomeValues() {
return classifier.getOutcomeValues();
}
/**
* Really this is now a setReference(EnactorReference er),
* since ClassifierEnactor can only have one EnactorReference.
* @param er
* @return may be false if exceeded more than one EnactorReference, and would override existing one.
* @see #setReference(EnactorReference) which subclasses should use instead
*/
@Override
@Deprecated
public void addReference(EnactorReference er) {
// throw new InvalidMethodException("ClassifierEnactor can only take one EnactorReference. Use setEnactorReference(EnactorReference er) instead.");
// too troublesome to throw exception, though that is good design.
if (enactorReferences.size() >= 1) {
enactorReferences.clear(); // remove previous entry
}
super.addReference(er);
}
protected void setReference(ClassifierEnactorReference er) {
addReference(er);
}
public EnactorReference getReference() {
return enactorReferences.values().iterator().next().get(0); // get the only (first) entry
}
public ClassifierWrapper getClassifier() {
return classifier;
}
}