package joshua.discriminative.feature_related.feature_function;
import java.util.List;
import java.util.logging.Logger;
import joshua.decoder.ff.DefaultStatelessFF;
import joshua.decoder.ff.tm.Rule;
import joshua.decoder.hypergraph.HyperEdge;
import joshua.decoder.hypergraph.WithModelLogPsHyperEdge;
/*This model implements a combined feature, which combines a set of baseline feature
**/
public class BaselineComboFF extends DefaultStatelessFF {
List<Integer> featPos;
List<Double> interWeights;
private static Logger logger = Logger.getLogger(BaselineComboFF.class.getName());
public BaselineComboFF(final int featID, final double weight, List<Integer> featPos, List<Double> interWeights) {
super(weight, -1, featID);//TODO: owner
this.featPos = featPos;
this.interWeights = interWeights;
if(featPos.size()!=interWeights.size()){
System.out.println("in BaselineComboFF: number of pos does not number of inter weights");
System.exit(0);
}
}
public double estimateLogP(Rule rule, int sentID) {
logger.severe("unimplement function");
System.exit(1);
return 0;
}
@Override
public double transitionLogP(HyperEdge edge, int spanStart, int spanEnd, int sentID){
return this.getCombinedLogP(edge);
}
@Override
public double finalTransitionLogP(HyperEdge edge, int spanStart, int spanEnd, int sentID){
return this.getCombinedLogP(edge);
}
private double getCombinedLogP(HyperEdge edge){
double res = 0;
for(int i=0; i<featPos.size(); i++){
int pos = featPos.get(i);
double weight = interWeights.get(i);
res += weight*((WithModelLogPsHyperEdge)edge).modeLogPs[pos];
}
return res;
}
}