package edu.stanford.nlp.classify;
import edu.stanford.nlp.optimization.AbstractCachingDiffFunction;
/**
* Maximizes the conditional likelihood with a given prior.
*
* @author Jenny Finkel
* @author Sarah Spikes (Templatization)
* @author Ramesh Nallapati (Made the function more general to support other AbstractCachingDiffFunctions involving the summation of two objective functions)
*/
public class SemiSupervisedLogConditionalObjectiveFunction extends AbstractCachingDiffFunction {
AbstractCachingDiffFunction objFunc;
//BiasedLogConditionalObjectiveFunction biasedObjFunc;
AbstractCachingDiffFunction biasedObjFunc;
double convexComboFrac = 0.5;
LogPrior prior;
public void setPrior(LogPrior prior) {
this.prior = prior;
}
@Override
public int domainDimension() {
return objFunc.domainDimension();
}
@Override
protected void calculate(double[] x) {
if (derivative == null) {
derivative = new double[domainDimension()];
}
value = convexComboFrac*objFunc.valueAt(x) + (1.0-convexComboFrac)*biasedObjFunc.valueAt(x);
//value = objFunc.valueAt(x) + biasedObjFunc.valueAt(x);
double[] d1 = objFunc.derivativeAt(x);
double[] d2 = biasedObjFunc.derivativeAt(x);
for (int i = 0; i < domainDimension(); i++) {
derivative[i] = convexComboFrac*d1[i] + (1.0-convexComboFrac)*d2[i];
//derivative[i] = d1[i] + d2[i];
}
if(prior != null)
value += prior.compute(x, derivative);
}
public SemiSupervisedLogConditionalObjectiveFunction(AbstractCachingDiffFunction objFunc, AbstractCachingDiffFunction biasedObjFunc, LogPrior prior, double convexComboFrac) {
this.objFunc = objFunc;
this.biasedObjFunc = biasedObjFunc;
this.prior = prior;
this.convexComboFrac = convexComboFrac;
if(convexComboFrac < 0 || convexComboFrac > 1.0)
throw new RuntimeException ("convexComboFrac has to lie between 0 and 1 (both inclusive).");
}
public SemiSupervisedLogConditionalObjectiveFunction(AbstractCachingDiffFunction objFunc, AbstractCachingDiffFunction biasedObjFunc, LogPrior prior) {
//this.objFunc = objFunc;
//this.biasedObjFunc = biasedObjFunc;
//this.prior = prior;
this(objFunc,biasedObjFunc,prior,0.5);
}
}