public static double[] computeLocalKLDirichletBinary(EF_Dirichlet dirichletQ, EF_Dirichlet dirichletP) {
double[] localKL = new double[dirichletP.sizeOfSufficientStatistics()];
int nstates = localKL.length;
double sumCountsQ = dirichletQ.getNaturalParameters().sum();
double sumCountsP = dirichletP.getNaturalParameters().sum();
ParameterVariables parameterVariables = new ParameterVariables(0);
Variable binary = parameterVariables.newDirichletParameter("Local",2);
EF_Dirichlet localQ = new EF_Dirichlet(binary);
EF_Dirichlet localP = new EF_Dirichlet(binary);
for (int i = 0; i < localKL.length; i++) {
double alphaQ = dirichletQ.getNaturalParameters().get(i);
double alphaP = dirichletP.getNaturalParameters().get(i);
localQ.getNaturalParameters().set(0,alphaQ);
localQ.getNaturalParameters().set(1,sumCountsQ-alphaQ);
localQ.fixNumericalInstability();
localQ.updateMomentFromNaturalParameters();
localP.getNaturalParameters().set(0,alphaP);
localP.getNaturalParameters().set(1,sumCountsP-alphaP);
localP.fixNumericalInstability();
localP.updateMomentFromNaturalParameters();
localKL[i] = localQ.kl(localP.getNaturalParameters(),localP.computeLogNormalizer());
}
return localKL;
}