package edu.cmu.minorthird.classify.sequential; import java.util.Collections; import java.util.Iterator; import javax.swing.JComponent; import edu.cmu.minorthird.classify.Feature; import edu.cmu.minorthird.classify.Instance; import edu.cmu.minorthird.classify.algorithms.linear.Hyperplane; import edu.cmu.minorthird.util.gui.ComponentViewer; import edu.cmu.minorthird.util.gui.Viewer; /** * Wrap a hyperplane to that it supports the Instance interface. */ public class HyperplaneInstance implements Instance { private Hyperplane hyperplane; private String subpopulationId; private Object source; public HyperplaneInstance(Hyperplane hyperplane,String subpopulationId,Object source) { // compensate for automatic increment of bias term by linear learners // for some reason it seems to work better to have the bias be linear in length // than always zero hyperplane.incrementBias(-1.0); this.hyperplane = hyperplane; this.subpopulationId = subpopulationId; this.source = source; } @Override public Viewer toGUI() { Viewer v = new ComponentViewer() { static final long serialVersionUID=20080202L; @Override public JComponent componentFor(Object o) { HyperplaneInstance hi = (HyperplaneInstance)o; return hi.hyperplane.toGUI(); } }; v.setContent(this); return v; } @Override public double getWeight(Feature f) { return hyperplane.featureScore(f); } @Override public Iterator<Feature> binaryFeatureIterator() { return Collections.EMPTY_SET.iterator(); } @Override public Iterator<Feature> numericFeatureIterator() { return hyperplane.featureIterator(); } @Override public Iterator<Feature> featureIterator() { return hyperplane.featureIterator(); } @Override public int numFeatures() { throw new UnsupportedOperationException();} public double getWeight() { return 1.0; } @Override public Object getSource() { return source; } @Override public String getSubpopulationId() { return subpopulationId; } // iterate over all hyperplane features except the bias feature // where is it used? - frank // private class MyIterator implements Iterator<Feature> // { // private Iterator<Feature> i; // private Feature myNext = null; // buffers the next nonbias feature produced by i // public MyIterator() { this.i = hyperplane.featureIterator(); advance(); } // private void advance() // { // if (!i.hasNext()) myNext = null; // else { // myNext = i.next(); // if (myNext.equals(Hyperplane.BIAS_TERM)) advance(); // } // } // public void remove() { throw new UnsupportedOperationException("can't remove"); } // public boolean hasNext() { return myNext!=null; } // public Feature next() { Feature result=myNext; advance(); return result; } // } }