/* EXPORT->GoNextMix: move to next unseen mixture component */ Boolean GoNextMix(HMMScanState *hss, Boolean noSkip) { Boolean ok = TRUE; if (hss->isCont){ while (IsSeen(hss->mp->nUse) && ok){ if (hss->m < hss->M) { ++hss->m; ++hss->me; hss->mp = hss->me->mpdf; } else if (noSkip) return FALSE; else ok = GoNextStream(hss,FALSE); } if (ok) { Touch(&hss->mp->nUse); return TRUE; } } else { if (hss->m < hss->M) { ++hss->m; } else if (noSkip) return FALSE; else ok = GoNextStream(hss,FALSE); if (ok) return TRUE; } hss->me = NULL; return FALSE; }
/* UpdateParameters: in hmm using counts in accumulators */ void UpdateParameters(void) { HMMScanState hss; int size; StreamInfo *sti; WtAcc *wa; MuAcc *ma = NULL; VaAcc *va; TrAcc *ta; Boolean hFound = FALSE,shared; NewHMMScan(&hset,&hss); do if (hmmLink == hss.hmm){ hFound = TRUE; while (GoNextState(&hss,TRUE)) { while (GoNextStream(&hss,TRUE)) { sti = hss.sti; if (hss.M>1 && (uFlags&UPMIXES)){ wa = (WtAcc *)sti->hook; if (hset.hsKind == DISCRETEHS) UpDProbs(hss.i,hss.s,hss.M,wa,sti->spdf.dpdf); else UpWeights(hss.i,hss.s,hss.M,wa,sti); } if (hss.isCont && (uFlags&(UPMEANS|UPVARS)))/*PLAINHS or SHAREDHS*/ while (GoNextMix(&hss,TRUE)) { size = VectorSize(hss.mp->mean); if (!IsSeenV(hss.mp->mean)) { ma = (MuAcc *)GetHook(hss.mp->mean); if (ma->occ!=0.0) UpMeans(hss.i,hss.s,hss.m,size,ma,hss.mp->mean); /* NB old mean left in ma->mu */ TouchV(hss.mp->mean); } if (!IsSeenV(hss.mp->cov.var)) { if (uFlags&UPVARS) { va = (VaAcc *)GetHook(hss.mp->cov.var); shared = (GetUse(hss.mp->cov.var) > 1) ? TRUE:FALSE; if (va->occ!=0.0) UpVars(hss.i,hss.s,hss.m,size,va,ma->mu,hss.mp->mean,shared,hss.mp); } TouchV(hss.mp->cov.var); } } } } if (!IsSeenV(hmmLink->transP)) { if (uFlags&UPTRANS){ ta = (TrAcc *)GetHook(hmmLink->transP); UpTrans(ta,hmmLink->transP); } TouchV(hmmLink->transP); } } while (!hFound && GoNextHMM(&hss)); EndHMMScan(&hss); if (!hFound) HError(2129,"UpdateParameters: hmm not found"); }
static int TotMixInSet(HMMSet *hset) { HMMScanState hss; HLink hmm; int nmix=0; NewHMMScan(hset,&hss); do { hmm = hss.hmm; while (GoNextState(&hss,TRUE)) { while (GoNextStream(&hss,TRUE)) { if (hss.isCont) /* PLAINHS or SHAREDHS */ while (GoNextMix(&hss,TRUE)) { if (!IsSeenV(hss.mp->mean)) { nmix++; TouchV(hss.mp->mean); } } } } } while (GoNextHMM(&hss)); EndHMMScan(&hss); return(nmix); }