package iitb.Model;
import iitb.CRF.DataSequence;
import iitb.Utils.Counters;
/**
*
* @author Sunita Sarawagi
* @since 1.1
* @version 1.3
*
* Suppose if history size is H and number of labels in the model
* graph is m, this will generate m^(H+1) features
*/
public class EdgeHistFeatures extends FeatureTypes {
/**
*
*/
private static final long serialVersionUID = 9015553082100153318L;
String fname;
String labelNames[];
int histsize;
Counters ctr;
boolean allDone;
int histArr[];
public EdgeHistFeatures(FeatureGenImpl m,String name, String labels[], int histsize) {
super(m);
fname=name;
labelNames=labels;
ctr = new Counters(histsize+1, m.numStates());
this.histsize = histsize;
histArr = new int[histsize];
}
public boolean startScanFeaturesAt(DataSequence data, int prevPos, int pos) {
ctr.clear();
allDone = false;
if (pos < histsize)
allDone = true;
return allDone;
}
public boolean hasNext() {
return (histsize > 1) && !allDone;
}
public void next(FeatureImpl f) {
f.ystart = ctr.value(1,1);
f.yend = ctr.value(0,0);
ctr.arrayCopy(histsize-1,1,histArr);
f.historyArray = histArr;
f.val = 1;
allDone = !ctr.advance();
String name="";
for (int i = 0; i < histArr.length; i++) {
if (histArr[i] != -1) {
if (labelNames == null) {
name += ctr.value(histsize-1,1);
} else {
int index = i + 1;
name += fname+"."+index+"."+labelNames[model.label(f.ystart)];
}
}
}
setFeatureIdentifier(ctr.value(histsize-1,0), model.label(f.yend),name,f);
}
};