/* UpdateMeans: use acc values to calc new estimate of means */ static int UpdateMeans(HMMSet *hset, int px, HLink hmm) { int i,s,m,k,M,N,vSize,nmapped; float occim; MuAcc *ma; StateElem *se; StreamElem *ste; MixtureElem *me; Vector mean; N = hmm->numStates; nmapped=0; se = hmm->svec+2; for (i=2; i<N; i++,se++){ ste = se->info->pdf+1; for (s=1;s<=S;s++,ste++){ vSize = hset->swidth[s]; me = ste->spdf.cpdf + 1; M = ste->nMix; for (m=1;m<=M;m++,me++) if (MixWeight(hset,me->weight) > MINMIX){ mean = me->mpdf->mean; ma = (MuAcc*)GetHook(mean); if (ma != NULL){ occim = ma->occ; if (occim > 0.0) { if (occim > minObs) nmapped++; for (k=1; k<=vSize; k++) mean[k] = ( mean[k] * mapTau + (ma->mu[k] + mean[k]*occim) )/( mapTau + occim ); } SetHook(mean,NULL); } } } } return(nmapped); }
HError(2319,"HERest: Label File format expected"); if((lff = Str2Format(GetStrArg())) == ALIEN) HError(-2389,"HERest: Warning ALIEN Label file format set"); break; case 'H': if (NextArg() != STRINGARG) HError(2319,"HERest: HMM macro file name expected"); strcpy(up_hmmMMF,GetStrArg()); AddMMF(&hset,up_hmmMMF); break; case 'I':
/* UpdateVars: use acc values to calc new estimate of variances */ static void UpdateVars(HMMSet *hset, int px, HLink hmm) { int i,s,m,k,M,N,vSize; float occim,x,muDiffk,dmu; Vector minV; VaAcc *va; MuAcc *ma; StateElem *se; StreamElem *ste; MixtureElem *me; Vector mean,var; Covariance cov; Boolean mixFloored,shared; N = hmm->numStates; se = hmm->svec+2; for (i=2; i<N; i++,se++){ ste = se->info->pdf+1; for (s=1;s<=S;s++,ste++){ minV = vFloor[s]; me = ste->info->spdf.cpdf + 1; M = ste->info->nMix; for (m=1;m<=M;m++,me++) if (MixWeight(hset,me->weight) > MINMIX){ cov = me->mpdf->cov; va = GetHook(cov.var); mean = me->mpdf->mean; vSize = VectorSize(mean); ma = GetHook(mean); if (va != NULL){ occim = va->occ; mixFloored = FALSE; if (occim > 0.0){ shared = (GetUse(cov.var)>1 || ma==NULL || ma->occ<=0.0) ? TRUE : FALSE; if (me->mpdf->ckind==DIAGC) { var = cov.var; for (k=1; k<=vSize; k++){ if (shared) muDiffk = 0.0; else { dmu = (ma->mu[k])/(mapTau+occim); muDiffk = 2*dmu*ma->mu[k] - dmu*dmu*occim; } x = (mapTau*var[k] + va->cov.var[k] - muDiffk) / (mapTau + occim); if (applyVFloor && x<minV[k]) { x = minV[k]; nFloorVar++; mixFloored = TRUE; } cov.var[k] = x; } } else { /* FULLC */ HError(999,"MAP estimation of full covariance matrices not supported"); } } if (mixFloored == TRUE) nFloorVarMix++; SetHook(cov.var,NULL); } } } } }