Julius 4.2
libsent/src/phmm/gprune_none.c
説明を見る。
00001 
00036 /*
00037  * Copyright (c) 1991-2011 Kawahara Lab., Kyoto University
00038  * Copyright (c) 2000-2005 Shikano Lab., Nara Institute of Science and Technology
00039  * Copyright (c) 2005-2011 Julius project team, Nagoya Institute of Technology
00040  * All rights reserved
00041  */
00042 
00043 #include <sent/stddefs.h>
00044 #include <sent/htk_hmm.h>
00045 #include <sent/htk_param.h>
00046 #include <sent/hmm.h>
00047 #include <sent/hmm_calc.h>
00048 
00058 LOGPROB
00059 compute_g_base(HMMWork *wrk, HTK_HMM_Dens *binfo)
00060 {
00061   VECT tmp, x;
00062   VECT *mean;
00063   VECT *var;
00064   VECT *vec = wrk->OP_vec;
00065   short veclen = wrk->OP_veclen;
00066 
00067   if (binfo == NULL) return(LOG_ZERO);
00068   mean = binfo->mean;
00069   var = binfo->var->vec;
00070   tmp = binfo->gconst;
00071   for (; veclen > 0; veclen--) {
00072 #ifdef ENABLE_MSD
00073     if (*vec == LZERO) {
00074       vec++;
00075       continue;
00076     }
00077 #endif
00078     x = *(vec++) - *(mean++);
00079     tmp += x * x * *(var++);
00080   }
00081   return(tmp * -0.5);
00082 }
00083 
00091 boolean
00092 gprune_none_init(HMMWork *wrk)
00093 {
00094   /* maximum Gaussian set size = maximum mixture size * nstream */
00095   wrk->OP_calced_maxnum = wrk->OP_hmminfo->maxmixturenum * wrk->OP_nstream;
00096   wrk->OP_calced_score = (LOGPROB *)mymalloc(sizeof(LOGPROB) * wrk->OP_calced_maxnum);
00097   wrk->OP_calced_id = (int *)mymalloc(sizeof(int) * wrk->OP_calced_maxnum);
00098   /* force gprune_num to the max number */
00099   wrk->OP_gprune_num = wrk->OP_calced_maxnum;
00100   return TRUE;
00101 }
00102 
00109 void
00110 gprune_none_free(HMMWork *wrk)
00111 {
00112   free(wrk->OP_calced_score);
00113   free(wrk->OP_calced_id);
00114 }
00115 
00132 void
00133 gprune_none(HMMWork *wrk, HTK_HMM_Dens **g, int num, int *last_id, int lnum)
00134 {
00135   int i;
00136   HTK_HMM_Dens *dens;
00137   LOGPROB *prob = wrk->OP_calced_score;
00138   int *id = wrk->OP_calced_id;
00139 #ifdef ENABLE_MSD
00140   int valid_dim;
00141   int calced_num;
00142 #endif
00143 
00144 #ifdef ENABLE_MSD
00145 
00146   valid_dim = 0;
00147   for(i=0; i<wrk->OP_veclen; i++) {
00148     if (wrk->OP_vec[i] != LZERO) valid_dim++;
00149   }
00150   calced_num = 0;
00151   for(i=0; i<num; i++) {
00152     dens = *(g++);
00153     if (dens->meanlen != valid_dim) continue;
00154     if (dens->meanlen == 0) {
00155       *(prob++) = 0.0;
00156     } else {
00157       *(prob++) = compute_g_base(wrk, dens);
00158     }
00159     *(id++) = i;
00160     calced_num++;
00161   }
00162   if (calced_num == 0) {
00163     jlog("Error: MSD: input data dim = %d / %d, but no Gaussian defined for it\n", valid_dim, wrk->OP_veclen);
00164     jlog("Error: MSD: Gaussian dimensions in this mixture:");
00165     for(i=0;i<num;i++) {
00166       jlog(" %d", g[i]->meanlen);
00167     }
00168     jlog("\n");
00169   }
00170   wrk->OP_calced_num = calced_num;
00171 
00172 #else
00173 
00174   for(i=0; i<num; i++) {
00175     dens = *(g++);
00176     *(prob++) = compute_g_base(wrk, dens);
00177     *(id++) = i;
00178   }
00179   wrk->OP_calced_num = num;
00180 
00181 #endif
00182 }