protected internal void accumulate(int num, TrainerScore[] array, TrainerScore[] array2) { TrainerScore trainerScore = array[num]; this.currentLogLikelihood = 0f; this.logLikelihood -= array[0].getScalingFactor(); SenoneHMMState senoneHMMState = (SenoneHMMState)trainerScore.getState(); if (senoneHMMState == null) { int num2 = trainerScore.getSenoneID(); if (num2 == -1) { this.accumulateMean(num2, array[num]); this.accumulateVariance(num2, array[num]); this.accumulateMixture(num2, array[num]); this.accumulateTransition(num2, num, array, array2); } } else if (senoneHMMState.isEmitting()) { int num2 = this.senonePool.indexOf(senoneHMMState.getSenone()); this.accumulateMixture(num2, array[num]); this.accumulateTransition(num2, num, array, array2); } }
private void accumulateMixture(int num, TrainerScore trainerScore) { if (num == -1) { for (int i = 0; i < this.senonePool.size(); i++) { this.accumulateMixture(i, trainerScore); } } else { Buffer buffer = (Buffer)this.mixtureWeightsBufferPool.get(num); for (int j = 0; j < this.mixtureWeights.getGauPerState(); j++) { float num2 = trainerScore.getComponentGamma()[j]; num2 -= this.currentLogLikelihood; buffer.logAccumulate(num2, j, this.logMath); } } }
private void accumulateMean(int num, TrainerScore trainerScore) { if (num == -1) { for (int i = 0; i < this.senonePool.size(); i++) { this.accumulateMean(i, trainerScore); } } else { GaussianMixture gaussianMixture = (GaussianMixture)this.senonePool.get(num); MixtureComponent[] mixtureComponents = gaussianMixture.getMixtureComponents(); for (int j = 0; j < mixtureComponents.Length; j++) { float[] mean = mixtureComponents[j].getMean(); int num2 = ((Integer)this.indexMap.get(mean)).intValue(); if (!HMMPoolManager.assertionsDisabled && num2 < 0) { throw new AssertionError(); } if (!HMMPoolManager.assertionsDisabled && num2 != num) { throw new AssertionError(); } Buffer buffer = (Buffer)this.meansBufferPool.get(num2); float[] values = ((FloatData)trainerScore.getData()).getValues(); double[] array = new double[values.Length]; float num3 = trainerScore.getComponentGamma()[j]; num3 -= this.currentLogLikelihood; double num4 = this.logMath.logToLinear(num3); for (int k = 0; k < array.Length; k++) { array[k] = (double)values[k] * num4; } buffer.accumulate(array, num4); } } }
private void accumulateVariance(int num, TrainerScore trainerScore) { if (num == -1) { for (int i = 0; i < this.senonePool.size(); i++) { this.accumulateVariance(i, trainerScore); } } else { GaussianMixture gaussianMixture = (GaussianMixture)this.senonePool.get(num); MixtureComponent[] mixtureComponents = gaussianMixture.getMixtureComponents(); for (int j = 0; j < mixtureComponents.Length; j++) { float[] mean = mixtureComponents[j].getMean(); float[] variance = mixtureComponents[j].getVariance(); int id = ((Integer)this.indexMap.get(variance)).intValue(); Buffer buffer = (Buffer)this.varianceBufferPool.get(id); float[] values = ((FloatData)trainerScore.getData()).getValues(); double[] array = new double[values.Length]; float num2 = trainerScore.getComponentGamma()[j]; num2 -= this.currentLogLikelihood; double num3 = this.logMath.logToLinear(num2); for (int k = 0; k < array.Length; k++) { array[k] = (double)(values[k] - mean[k]); double[] array2 = array; int num4 = k; double[] array3 = array2; array3[num4] *= array[k] * num3; } buffer.accumulate(array, num3); } } }