package edu.cmu.minorthird.classify.multi; import java.awt.Component; import java.io.Serializable; import javax.swing.BoxLayout; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import edu.cmu.minorthird.classify.ClassLabel; import edu.cmu.minorthird.classify.Classifier; import edu.cmu.minorthird.classify.Explanation; import edu.cmu.minorthird.classify.Instance; import edu.cmu.minorthird.util.gui.ComponentViewer; import edu.cmu.minorthird.util.gui.SmartVanillaViewer; import edu.cmu.minorthird.util.gui.Viewer; import edu.cmu.minorthird.util.gui.Visible; /** * Interface for a multi label classifier. * * @author Cameron Williams */ public class MultiClassifier implements Classifier,Visible,Serializable{ static final long serialVersionUID=20080130L; public Classifier[] classifiers; public MultiClassifier(Classifier[] classifiers){ this.classifiers=classifiers; } /** Returqn a predicted type for each element of the sequence. */ public MultiClassLabel multiLabelClassification(Instance instance){ ClassLabel[] labels=new ClassLabel[classifiers.length]; for(int i=0;i<classifiers.length;i++){ labels[i]=classifiers[i].classification(instance); } MultiClassLabel multiLabel=new MultiClassLabel(labels); return multiLabel; } public int getNumDim(){ return classifiers.length; } /** Give you the class label for the first dimension */ @Override public ClassLabel classification(Instance instance){ ClassLabel classLabel=classifiers[0].classification(instance); return classLabel; } @Override public String explain(Instance instance){ StringBuffer buf=new StringBuffer(""); for(int i=0;i<classifiers.length;i++){ buf.append(classifiers[i].explain(instance)); buf.append("\n"); } buf.append("classification = "+classification(instance).toString()); return buf.toString(); } @Override public Explanation getExplanation(Instance instance){ Explanation.Node top=new Explanation.Node("MultiClassifier Explanation"); for(int i=0;i<classifiers.length;i++){ Explanation.Node classEx= classifiers[i].getExplanation(instance).getTopNode(); top.add(classEx); } Explanation.Node score= new Explanation.Node("classification = "+ classification(instance).toString()); top.add(score); Explanation ex=new Explanation(top); return ex; } public Classifier[] getClassifiers(){ return classifiers; } @Override public String toString(){ StringBuffer buf=new StringBuffer("[MultiClassifier:\n"); for(int i=0;i<classifiers.length;i++){ buf.append(classifiers[i]+"\n"); } buf.append("end MultiClassifier]\n"); return buf.toString(); } @Override public Viewer toGUI(){ final Viewer v=new ComponentViewer(){ static final long serialVersionUID=20080130L; @Override public JComponent componentFor(Object o){ MultiClassifier c=(MultiClassifier)o; JPanel panel=new JPanel(); panel.setLayout(new BoxLayout(panel,BoxLayout.Y_AXIS)); for(int i=0;i<c.classifiers.length;i++){ JLabel label=new JLabel("Dimension: "+i); label.setAlignmentX(Component.CENTER_ALIGNMENT); panel.add(label); Viewer subView=new SmartVanillaViewer(); subView.setContent(c.classifiers[i]); subView.setSuperView(this); panel.add(subView); } return new JScrollPane(panel); } }; v.setContent(this); return v; } }