Julius 4.2
|
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 }