package iitb.Model;
import iitb.CRF.DataSequence;
/**
*
* @author Sunita Sarawagi
* @since 1.0
* @version 1.3
*/
public class EdgeFeatures extends FeatureTypes {
/**
*
*/
private static final long serialVersionUID = -6098103393225258231L;
transient protected EdgeIterator edgeIter = null;
protected int edgeNum;
transient boolean edgeIsOuter;
Object labelNames[];
public EdgeFeatures(FeatureGenImpl m, Object labels[]) {
super(m);
labelNames=labels;
}
public EdgeFeatures(FeatureGenImpl m) {
this(m,null);
}
protected void setEdgeIter() {
edgeIter = model.edgeIterator();
}
public boolean startScanFeaturesAt(DataSequence data, int prevPos, int pos) {
if (prevPos < 0) {
edgeNum = model.numEdges();
return false;
} else {
edgeNum = 0;
if (edgeIter == null) {
setEdgeIter();
}
if (edgeIter != null)
edgeIter.start();
return hasNext();
}
}
public boolean hasNext() {
return (edgeIter != null) && (edgeIter.hasNext());
}
public boolean lastEdgeWasOuter() {return edgeIsOuter;}
public void next(FeatureImpl f) {
edgeIsOuter = edgeIter.nextIsOuter();
Edge e = edgeIter.next();
Object name="";
if (featureCollectMode()) {
if (labelNames == null) {
name = "E."+(edgeIsOuter?(""+model.label(e.start)):("I." + e.start));
} else {
name = labelNames[model.label(e.start)];
}
}
if (edgeIsOuter) {
setFeatureIdentifier(model.label(e.start)*model.numberOfLabels()+model.label(e.end) + model.numEdges(), e.end,name,f);
} else {
setFeatureIdentifier(edgeNum,e.end,name,f);
}
f.ystart = e.start;
f.yend = e.end;
f.val = 1;
edgeNum++;
}
public boolean fixedTransitionFeatures() {
return true;
/*((model.numStartStates()==model.numStates())&&
(model.numEndStates()==model.numEndStates()));
*/
}
};