package iitb.MaxentClassifier; import iitb.CRF.DataSequence; import iitb.CRF.Feature; import iitb.CRF.FeatureGenerator; /** * * @author Sunita Sarawagi * @since 1.0 * @version 1.3 */ public class FeatureGenRecord implements FeatureGenerator { /** * */ private static final long serialVersionUID = -8292490593455124019L; protected int numCols; protected int numLabels; DataRecord dataRecord; public int addBias=0; class FeatureColumn implements Feature { int colId; int _y; float val; void copy(FeatureColumn f) { colId = f.colId; _y = f._y; val = f.val; } public int index() {return colId + _y*(numCols+addBias);} public int y() {return _y;} public int yprev() {return -1;} public float value() {return val;} public int[] yprevArray() {return null;} }; FeatureColumn feature, featureToReturn; protected FeatureGenRecord(int numColumns, int numYs) { numCols = numColumns; numLabels = numYs; feature = new FeatureColumn(); featureToReturn = new FeatureColumn(); } public int numFeatures() {return (numCols+addBias)*numLabels;} public void startScanFeaturesAt(DataSequence data, int pos) { dataRecord = (DataRecord)data; assert (pos == 0); feature.colId = firstColumnId(); feature._y = 0; } public boolean hasNext() { return (feature.y() < numLabels); } protected int lastColumnIdp1() {return numCols+addBias;} protected int firstColumnId() {return 0;} public Feature next() { featureToReturn.copy(feature); feature.colId++; if (feature.colId >= lastColumnIdp1()) { feature.colId = firstColumnId(); feature._y++; } if ((addBias==1) && (featureToReturn.colId == 0)) featureToReturn.val = 1; else featureToReturn.val = dataRecord.getColumn(featureToReturn.colId-addBias); return featureToReturn; } /* (non-Javadoc) * @see iitb.CRF.FeatureGenerator#featureName(int) */ public String featureName(int featureIndex) { return "ColumnId=" + (featureIndex % (numCols+addBias)) + " label="+(featureIndex/(numCols+addBias)); } public int xFeatureIdCurrent() { return feature.colId; } };