/* * Created on Apr 12, 2005 * */ package iitb.BSegment; import iitb.CRF.DataSequence; import iitb.Model.FeatureImpl; import iitb.Model.FeatureTypes; import java.io.Serializable; /** * @author sunita * @since 1.2 * @version 1.3 */ public class BFeatureEachPosition extends BFeatureTypes { /** * */ private static final long serialVersionUID = -5443203053730870354L; int pos; FeatureTypes single; transient DataSequence data; static class TypePos implements BoundaryFeatureFunctions, Serializable { FeatureTypes ftype; int pos; private static final long serialVersionUID = 1L; TypePos(FeatureTypes ftype) { this.ftype = ftype; } public void next(BFeatureImpl feature) { ftype.next(feature); assignBoundary(feature,pos); } public void assignBoundary(BFeatureImpl feature, int pos) { feature._startOpen = true; feature._endOpen = true; feature._endB = feature._startB = pos; } public int maxBoundaryGap() {return 1;} /* (non-Javadoc) * @see iitb.BSegment.BoundaryFeatureFunctions#startScanFeaturesAt(iitb.CRF.DataSequence, int) */ public boolean startScanFeaturesAt(DataSequence data, int pos) { this.pos=pos; return ftype.startScanFeaturesAt(data,pos); } }; public static class TypePosEndOpen extends TypePos { /** * */ private static final long serialVersionUID = 7566849608695659821L; /** * @param ftype */ public TypePosEndOpen(FeatureTypes ftype) { super(ftype); } public void assignBoundary(BFeatureImpl feature, int pos) { super.assignBoundary(feature,pos); feature._startOpen = false; feature._endOpen = true; } }; public static class TypePosStartOpen extends TypePos { /** * */ private static final long serialVersionUID = -3328637175240373276L; /** * @param ftype */ public TypePosStartOpen(FeatureTypes ftype) { super(ftype); } public void assignBoundary(BFeatureImpl feature, int pos) { super.assignBoundary(feature,pos); feature._startOpen = true; feature._endOpen = false; } }; BoundaryFeatureFunctions type; /** * */ public BFeatureEachPosition(FeatureTypes single, BoundaryFeatureFunctions type) { super(single); this.single = single; this.type = type; } public BFeatureEachPosition(FeatureTypes single) { this(single,(BoundaryFeatureFunctions)single); } public BFeatureEachPosition(TypePos type) { this(type.ftype,type); } /* (non-Javadoc) * @see iitb.BSegmentCRF.BFeatureGenerator#startScanFeaturesAt(iitb.BSegmentCRF.BDataSequence) */ public boolean startScanFeaturesAt(DataSequence data) { pos = data.length()-1; this.data = data; type.startScanFeaturesAt(data,pos); return advance(); } /** * */ protected boolean advance() { while (!single.hasNext()) { pos--; if (pos < 0) return false; type.startScanFeaturesAt(data,pos); } return true; } /* (non-Javadoc) * @see iitb.BSegmentCRF.BFeatureGenerator#hasNext() */ public boolean hasNext() { return single.hasNext(); } public void next(BFeatureImpl feature) { //single.next(feature); //type.assignBoundary(feature,pos); type.next(feature); advance(); } public int maxBoundaryGap() {return type.maxBoundaryGap();} /* (non-Javadoc) * @see iitb.BSegment.BoundaryFeatureFunctions#assignBoundary(iitb.BSegment.BFeatureImpl, int) */ public void assignBoundary(BFeatureImpl feature, int pos) { // TODO Auto-generated method stub } public boolean fixedTransitionFeatures() { return single.fixedTransitionFeatures(); } public void next(FeatureImpl feature) { single.next(feature); } /* (non-Javadoc) * @see iitb.Model.FeatureTypes#startScanFeaturesAt(iitb.CRF.DataSequence, int, int) */ public boolean startScanFeaturesAt(DataSequence data, int prevPos, int pos) { return single.startScanFeaturesAt(data,prevPos,pos); } public boolean requiresTraining() { return single.requiresTraining(); } public void train(DataSequence data, int pos) { single.train(data, pos); } public boolean needsCaching() { return single.needsCaching(); } }