package hmm; import gnu.trove.TIntArrayList; import optimization.gradientBasedMethods.ProjectedGradientDescent; import optimization.gradientBasedMethods.ProjectedObjective; import optimization.gradientBasedMethods.stats.OptimizerStats; import optimization.linesearch.ArmijoLineSearchMinimizationAlongProjectionArc; import optimization.linesearch.InterpolationPickFirstStep; import optimization.linesearch.LineSearchMethod; import optimization.projections.SimplexProjection; import optimization.stopCriteria.CompositeStopingCriteria; import optimization.stopCriteria.ProjectedGradientL2Norm; import optimization.stopCriteria.StopingCriteria; import optimization.stopCriteria.ValueDifference; public class HMMObjective extends ProjectedObjective{ private static final double GRAD_DIFF = 3; public static double INIT_STEP_SIZE=10; public static double VAL_DIFF=1000; private HMM hmm; double[] newPoint ; //posterior[sent num][tok num][tag]=index into lambda private int posteriorMap[][][]; //projection[word][tag].get(occurence)=index into lambda private TIntArrayList projectionMap[][]; //Size of the simplex public double scale=10; private SimplexProjection projection; private int wordFreq[]; private static int MIN_FREQ=10; private int numWordsToProject=0; private int n_param; public double loglikelihood; public HMMObjective(HMM h){ hmm=h; countWords(); buildMap(); gradient=new double [n_param]; projection = new SimplexProjection(scale); newPoint = new double[n_param]; setInitialParameters(new double[n_param]); } /**@brief counts word frequency in the corpus * */ private void countWords(){ wordFreq=new int [hmm.emit[0].length]; for(int i=0;i