00001
00036
00037
00038
00039
00040
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
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
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 }