Ejemplo n.º 1
0
/* EXPORT->ConvDiagC Convert Diagonal Covariance Kind
  Converts all the HMMs in hset to INVDIAGC from DIAGC
  or vice versa. If convData is TRUE then each variance element is
  replaced by its reciprocal - otherwise only the CovKind in each HMM
  is changed and no data conversions are performed. */
void ConvDiagC(HMMSet *hset, Boolean convData)
{
   HMMScanState hss;
   SVector v;
   int k;

   if (hset->hsKind == DISCRETEHS || hset->hsKind == TIEDHS)
      return;
   NewHMMScan(hset, &hss);
   while (GoNextMix(&hss,FALSE)) {
      if (hss.mp->ckind == DIAGC || hss.mp->ckind == INVDIAGC){
         hss.mp->ckind = (hss.mp->ckind == DIAGC)?INVDIAGC:DIAGC;
         if (convData){
            v = hss.mp->cov.var;
            if (! IsSeenV(v)) {
               for (k=1; k<=hset->swidth[hss.s]; k++) {
                  if (v[k] > MAXVAR) v[k] = MAXVAR;
                  if (v[k] < MINVAR) v[k] = MINVAR;
                  v[k] = 1/v[k];
               }
               TouchV(v);
            }
         }
      }
   }
   EndHMMScan(&hss);
   ClearSeenFlags(hset,CLR_ALL);
}
/* SetCovs: set covariance values in hmm */
void SetCovs(void)
{
   int i,s,m;
   StateElem *se;
   StreamElem *ste;
   MixtureElem *me;
   MixPDF *mp;

   CalcCovs();
   if (trace&T_TOP) {
      printf("Updating HMM ");
      if (meanUpdate) printf("Means and ");
      printf("Covariances\n");
   }
   for (i=2,se=hmmLink->svec+2; i < hmmLink->numStates; i++,se++)
      for (s=1,ste=se->info->pdf+1; s <= hset.swidth[0]; s++,ste++)
         for (m=1,me = ste->spdf.cpdf+1; m<=ste->nMix; m++, me++) {
            mp = me->mpdf;
            if (meanUpdate && !IsSeenV(mp->mean)){      /* meanSum now holds mean */
               CopyVector(accs[s].meanSum,mp->mean); 
               TouchV(mp->mean);
            }
            if (!IsSeenV(mp->cov.var)){
               if (mp->ckind==FULLC)
                  CopyMatrix(accs[s].fixed.inv,mp->cov.inv);
               else if (fullcNeeded[s])  /* dont need full cov, but its all we have */                
                  TriDiag2Vector(accs[s].fixed.inv,mp->cov.var);
               else
                  CopyVector(accs[s].fixed.var,mp->cov.var);
               TouchV(mp->cov.var);
            }
         }
   ClearSeenFlags(&hset,CLR_ALL);
}
Ejemplo n.º 3
0
/* EXPORT->EndHMMScan: terminate scan and restore nUse flags */
void EndHMMScan(HMMScanState *hss)
{
   ClearSeenFlags(hss->hset,CLR_ALL);
   hss->hmm = NULL; hss->se = NULL; hss->ste = NULL; hss->me = NULL;
}
Ejemplo n.º 4
0
                       printf("Loading alignment HMM set %s\n",q);

                   }

                   AddMMF(&al_hset,q);

                   if (eos)

                       break;

                   q=p+1;

               }

               p++;

           }

       }

       if (strlen(al_hmmLst) > 0 ) 

           MakeHMMSet(&al_hset, al_hmmLst );

       else /* use same hmmList */

           MakeHMMSet(&al_hset, hmmListFn );

       if (strlen(al_hmmDir) > 0 )

           LoadHMMSet(&al_hset,al_hmmDir,al_hmmExt);

       else

           LoadHMMSet(&al_hset,NULL,NULL);



       /* switch model set */

       UseAlignHMMSet(fbInfo,x,&al_hset);

       if (parMode != 0) {

	  ConvDiagC(&al_hset,TRUE);

	  ConvLogWt(&al_hset);

       }



       /* and echo status */

       if (trace&T_TOP) { 

           if (strlen(al_hmmDir) > 0 )

               printf(" HMM Dir %s",al_hmmDir);

           if (strlen(al_hmmExt) > 0 )

               printf(" Ext %s",al_hmmExt);