package context.arch.intelligibility.weka.j48; import java.util.HashMap; import java.util.Map; import weka.classifiers.trees.J48; import context.arch.discoverer.query.ClassifierWrapper; import context.arch.enactor.Enactor; import context.arch.intelligibility.StaticExplainerDelegate; import context.arch.intelligibility.expression.DNF; import context.arch.intelligibility.weka.WekaExplainer; /** * Explainer for the WEKA J48 decision tree classifier. * * TODO support dynamic changes to classifier * @author Brian Y. Lim * */ public class J48Explainer extends WekaExplainer<J48> { private StaticExplainerDelegate delegate; public J48Explainer(Enactor enactor, ClassifierWrapper classifierWrapper) throws Exception { super(enactor, classifierWrapper); /* * Create delegate to pre-generate explanations. */ delegate = new StaticExplainerDelegate(enactor) { @Override protected Map<String, DNF> initReasonsDNF() { try { return J48Parser.parse(classifier, header); // start parsing tree } catch (Exception e) { e.printStackTrace(); return new HashMap<String, DNF>(); } } }; } @Override public DNF getWhyExplanation() { return delegate.getWhyExplanation(); } @Override public DNF getWhyNotExplanation(String altOutcomeValue) { return delegate.getWhyNotExplanations(altOutcomeValue); } @Override public DNF getHowToExplanation(String altOutcomeValue) { return delegate.getHowToExplanations(altOutcomeValue); } }