package edu.cmu.minorthird.classify.transform; import java.util.Iterator; import java.util.Set; import java.util.SortedMap; import java.util.SortedSet; import java.util.TreeSet; import edu.cmu.minorthird.classify.AbstractInstance; import edu.cmu.minorthird.classify.Feature; import edu.cmu.minorthird.classify.GUI; import edu.cmu.minorthird.classify.Instance; import edu.cmu.minorthird.classify.WeightedSet; import edu.cmu.minorthird.util.UnionIterator; import edu.cmu.minorthird.util.gui.Viewer; /** * @author Edoardo Airoldi * Date: Dec 5, 2003 */ public class MaskedInstance extends AbstractInstance{ // static private Logger log=Logger.getLogger(MaskedInstance.class); private Instance instance; private Set<Feature> available; public MaskedInstance(Instance instance,Set<Feature> availableFeatures){ this.instance=instance; this.available=availableFeatures; } public MaskedInstance(Instance instance,SortedMap<Feature,?> availableFeatures){ this(instance,availableFeatures.keySet()); } @Override final public Object getSource(){ return instance.getSource(); } @Override final public String getSubpopulationId(){ return instance.getSubpopulationId(); } @Override public Viewer toGUI(){ return new GUI.InstanceViewer(this); } // // extend the binary feature set // @Override public double getWeight(Feature f){ if(available.contains(f)) return instance.getWeight(f); else return 0.0; } /** Return an iterator over all available features */ @Override public Iterator<Feature> featureIterator(){ SortedSet<Feature> set=new TreeSet<Feature>(); WeightedSet<Feature> wset=new WeightedSet<Feature>(); for(Iterator<Feature> i=instance.binaryFeatureIterator();i.hasNext();){ Feature f=i.next(); if(available.contains(f)){ set.add(f); } } for(Iterator<Feature> i=instance.numericFeatureIterator();i.hasNext();){ Feature f=i.next(); if(available.contains(f)){ wset.add(f,instance.getWeight(f)); } } return new UnionIterator<Feature>(set.iterator(),wset.asSet().iterator()); } /** Return an iterator over numeric features */ @Override final public Iterator<Feature> numericFeatureIterator(){ WeightedSet<Feature> wset=new WeightedSet<Feature>(); for(Iterator<Feature> i=instance.numericFeatureIterator();i.hasNext();){ Feature f=i.next(); if(available.contains(f)){ wset.add(f,instance.getWeight(f)); } } return wset.asSet().iterator(); } /** Return an iterator over binary features */ @Override final public Iterator<Feature> binaryFeatureIterator(){ SortedSet<Feature> set=new TreeSet<Feature>(); for(Iterator<Feature> i=instance.binaryFeatureIterator();i.hasNext();){ Feature f=i.next(); if(available.contains(f)){ set.add(f); } } return set.iterator(); } @Override final public int numFeatures(){ System.err.println("Not implemented: numFeatures()"); return -1; } @Override public String toString(){ return "[masked "+instance+" av:"+available+"]"; } }