/* * Created on Mar 7, 2007 * @author sunita */ package iitb.Model; import java.util.Vector; import iitb.CRF.DataSequence; import iitb.CRF.Feature; import iitb.CRF.FeatureGenerator; import iitb.CRF.FeatureGeneratorNested; public class FeatureGenUnion extends Vector<FeatureGeneratorNested> implements FeatureGeneratorNested { int currentId=-1; FeatureGenerator currentFGen; int currentFeatureOffset; FeatureImpl savedFeature = new FeatureImpl(); public String featureName(int featureIndex) { int numF=0; for (FeatureGenerator fgen : this) { if (featureIndex < numF+fgen.numFeatures()) { return fgen.featureName(featureIndex-numF); } numF += fgen.numFeatures(); } return null; } public boolean hasNext() { return currentFGen.hasNext(); } private void advance() { if (currentFGen.hasNext()) return; for (currentId++;currentId < size();currentId++) { currentFGen = get(currentId); currentFeatureOffset += get(currentId-1).numFeatures(); if (currentFGen.hasNext()) return; } } public Feature next() { Feature f = currentFGen.next(); savedFeature.copy(f); savedFeature.id += currentFeatureOffset; advance(); return savedFeature; } public int numFeatures() { int numF=0; for (FeatureGenerator fgen : this) { numF += fgen.numFeatures(); } return numF; } public void startScanFeaturesAt(DataSequence data, int pos) { startScanFeaturesAt(data, pos-1,pos); } public void startScanFeaturesAt(DataSequence data, int prevPos, int pos) { for (int i = 0; i < size(); i++) { get(i).startScanFeaturesAt(data,prevPos, pos); } currentId = 0; currentFeatureOffset=0; currentFGen = get(currentId); advance(); } public int maxMemory() { return get(0).maxMemory(); } }