/** EdgeLinearHistFeatures.java
*
* @author Sunita Sarawagi
* @version 1.3
*
* Suppose if history size is H and number of edges in the model graph
* is E, this will generate HE features (for each history position
* generate features for each possible edge).
*/
package iitb.Model;
import iitb.CRF.DataSequence;
public class EdgeLinearHistFeatures extends FeatureTypes {
/**
*
*/
private static final long serialVersionUID = 1362878603460516882L;
Object fnames[][];
int histsize;
boolean allDone;
int histArr[];
int histPos;
int pos;
transient EdgeIterator edgeIter;
Edge edge;
int edgeNum;
public EdgeLinearHistFeatures(FeatureGenImpl m, Object labels[][], int histsize) {
super(m);
fnames=labels;
edgeIter = model.edgeIterator();
this.histsize = histsize;
histArr = new int[histsize];
//System.err.println("Using debugged version of EdgeLinearHistFeatures");
}
public boolean startScanFeaturesAt(DataSequence data, int prevPos, int pos) {
this.pos = pos;
allDone = false;
edgeIter.start();
if ((pos < 2) || !edgeIter.hasNext())
allDone = true;
histPos = 1;
edge = edgeIter.next();
edgeNum=0;
return allDone;
}
public boolean hasNext() {
return (histsize > 1) && !allDone;
}
public void next(FeatureImpl f) {
// zero all other pos..
for (int i = 0; i < histArr.length; histArr[i++] = -1);
histArr[histPos] = edge.start;
f.yend = edge.end;
f.historyArray = histArr;
f.val = 1;
Object fname = null;
if (featureCollectMode()) {
if (fnames == null) {
fname = "H."+histPos+"."+edge.start+"."+edge.end;
} else {
fname = fnames[histPos][f.yend];
}
}
setFeatureIdentifier(edgeNum*histsize + histPos, f.yend,fname,f);
if (edgeIter.hasNext()) {
edge = edgeIter.next();
edgeNum++;
} else {
histPos++;
if (histPos+1 > histsize || pos - histPos <= 0) {
allDone = true;
} else {
edgeIter.start();
edgeNum = 0;
edge = edgeIter.next();
}
}
}
};