package edu.cmu.minorthird.classify.transform; import edu.cmu.minorthird.classify.*; import edu.cmu.minorthird.util.*; import edu.cmu.minorthird.util.gui.*; import java.util.*; /** * Add some features to an instance. * * @author William Cohen */ public class AugmentedInstance implements Instance{ private Instance instance; private Feature[] newFeatures; private double[] newValues; public AugmentedInstance(Instance instance,String[] newFeatureNames, double[] newVals){ if(instance==null) throw new IllegalArgumentException("can't use null instance!"); this.instance=instance; this.newFeatures=new Feature[newFeatureNames.length]; this.newValues=new double[newVals.length]; for(int i=0;i<newFeatureNames.length;i++){ this.newFeatures[i]=new Feature(newFeatureNames[i]); this.newValues[i]=newVals[i]; } } // // delegate to wrapped instance // @Override final public Object getSource(){ return instance.getSource(); } @Override final public String getSubpopulationId(){ return instance.getSubpopulationId(); } @Override final public Iterator<Feature> binaryFeatureIterator(){ return instance.binaryFeatureIterator(); } // // extend the numeric feature set // @Override final public Iterator<Feature> numericFeatureIterator(){ return new UnionIterator<Feature>(new MyIterator(),instance .numericFeatureIterator()); } @Override final public Iterator<Feature> featureIterator(){ return new UnionIterator<Feature>(new MyIterator(),instance .featureIterator()); } @Override final public int numFeatures(){ return newFeatures.length+instance.numFeatures(); } @Override final public double getWeight(Feature f){ for(int i=0;i<newFeatures.length;i++){ if(newFeatures[i].equals(f)){ return newValues[i]; } } return instance.getWeight(f); } @Override public String toString(){ return "[AugmentedInstance: "+instance+StringUtil.toString(newFeatures)+ StringUtil.toString(newValues)+"]"; } @Override final public Viewer toGUI(){ return new GUI.InstanceViewer(this); } public class MyIterator implements Iterator<Feature>{ private int i=0; @Override public void remove(){ throw new UnsupportedOperationException("can't remove"); } @Override public boolean hasNext(){ return i<newFeatures.length; } @Override public Feature next(){ return newFeatures[i++]; } } static public void main(String[] argv){ MutableInstance inst=new MutableInstance(); inst.addBinary(new Feature("william")); double[] vals=new double[argv.length]; for(int i=0;i<vals.length;i++) vals[i]=i+1; AugmentedInstance aug=new AugmentedInstance(inst,argv,vals); System.out.println(aug.toString()); for(int i=0;i<argv.length;i++){ Feature f=new Feature(argv[i]); System.out.println("weight of "+f+"="+aug.getWeight(f)); } for(Iterator<Feature> i=aug.featureIterator();i.hasNext();){ Feature f=i.next(); System.out.println("in aug: weight of "+f+"="+aug.getWeight(f)); } } }