49 #include <sphinxbase/ckd_alloc.h> 50 #include <sphinxbase/err.h> 58 int16
const *senscore,
63 assert(n_emit_state > 0);
65 E_ERROR(
"Number of emitting states must be <= %d\n",
HMM_MAX_NSTATE);
69 ctx = ckd_calloc(1,
sizeof(*ctx));
70 ctx->n_emit_state = n_emit_state;
72 ctx->senscore = senscore;
74 ctx->st_sen_scr = ckd_calloc(n_emit_state,
sizeof(*ctx->st_sen_scr));
84 ckd_free(ctx->st_sen_scr);
93 hmm->n_emit_state = ctx->n_emit_state;
98 for (i = 1; i < hmm_n_emit_state(hmm); ++i) {
104 memcpy(hmm->senid, ctx->sseq[ssid], hmm->n_emit_state *
sizeof(*hmm->senid));
106 hmm->tmatid = tmatid;
121 if (hmm_is_mpx(hmm)) {
123 for (i = 0; i < hmm_n_emit_state(hmm); i++)
124 fprintf(fp,
" %11d", hmm_senid(hmm, i));
126 for (i = 0; i < hmm_n_emit_state(hmm); i++)
127 fprintf(fp,
"%d ", hmm_ssid(hmm, i));
131 fprintf(fp,
"SSID ");
132 for (i = 0; i < hmm_n_emit_state(hmm); i++)
133 fprintf(fp,
" %11d", hmm_senid(hmm, i));
134 fprintf(fp,
" (%d)\n", hmm_ssid(hmm, 0));
137 if (hmm->ctx->senscore) {
138 fprintf(fp,
"SENSCR");
139 for (i = 0; i < hmm_n_emit_state(hmm); i++)
140 fprintf(fp,
" %11d", hmm_senscr(hmm, i));
144 fprintf(fp,
"SCORES %11d", hmm_in_score(hmm));
145 for (i = 1; i < hmm_n_emit_state(hmm); i++)
146 fprintf(fp,
" %11d", hmm_score(hmm, i));
147 fprintf(fp,
" %11d", hmm_out_score(hmm));
150 fprintf(fp,
"HISTID %11d", hmm_in_history(hmm));
151 for (i = 1; i < hmm_n_emit_state(hmm); i++)
152 fprintf(fp,
" %11d", hmm_history(hmm, i));
153 fprintf(fp,
" %11d", hmm_out_history(hmm));
156 if (hmm_in_score(hmm) > 0)
158 "ALERT!! The input score %d is large than 0. Probably wrap around.\n",
160 if (hmm_out_score(hmm) > 0)
162 "ALERT!! The output score %d is large than 0. Probably wrap around\n.",
175 for (i = 1; i < hmm_n_emit_state(h); i++)
188 hmm_in_history(h) = -1;
189 for (i = 1; i < hmm_n_emit_state(h); i++) {
191 hmm_history(h, i) = -1;
194 hmm_out_history(h) = -1;
203 hmm_in_score(h) = score;
204 hmm_in_history(h) = histid;
205 hmm_frame(h) = frame;
213 for (i = 0; i < hmm_n_emit_state(h); i++) {
215 hmm_score(h, i) -= bestscr;
218 hmm_out_score(h) -= bestscr;
221 #define hmm_tprob_5st(i, j) (-tp[(i)*6+(j)]) 222 #define nonmpx_senscr(i) (-senscore[sseq[i]]) 225 hmm_vit_eval_5st_lr(
hmm_t * hmm)
227 int16
const *senscore = hmm->ctx->senscore;
228 uint8
const *tp = hmm->ctx->tp[hmm->tmatid][0];
229 uint16
const *sseq = hmm->senid;
230 int32 s5, s4, s3, s2, s1, s0, t2, t1, t0, bestScore;
236 s4 = hmm_score(hmm, 4) + nonmpx_senscr(4);
237 s3 = hmm_score(hmm, 3) + nonmpx_senscr(3);
240 t1 = s4 + hmm_tprob_5st(4, 5);
241 t2 = s3 + hmm_tprob_5st(3, 5);
244 hmm_out_history(hmm) = hmm_history(hmm, 4);
247 hmm_out_history(hmm) = hmm_history(hmm, 3);
250 hmm_out_score(hmm) = s5;
254 s2 = hmm_score(hmm, 2) + nonmpx_senscr(2);
257 t0 = s4 + hmm_tprob_5st(4, 4);
258 t1 = s3 + hmm_tprob_5st(3, 4);
259 t2 = s2 + hmm_tprob_5st(2, 4);
263 hmm_history(hmm, 4) = hmm_history(hmm, 2);
269 hmm_history(hmm, 4) = hmm_history(hmm, 2);
272 hmm_history(hmm, 4) = hmm_history(hmm, 3);
277 hmm_score(hmm, 4) = s4;
280 s1 = hmm_score(hmm, 1) + nonmpx_senscr(1);
283 t0 = s3 + hmm_tprob_5st(3, 3);
284 t1 = s2 + hmm_tprob_5st(2, 3);
285 t2 = s1 + hmm_tprob_5st(1, 3);
289 hmm_history(hmm, 3) = hmm_history(hmm, 1);
295 hmm_history(hmm, 3) = hmm_history(hmm, 1);
298 hmm_history(hmm, 3) = hmm_history(hmm, 2);
303 hmm_score(hmm, 3) = s3;
306 s0 = hmm_in_score(hmm) + nonmpx_senscr(0);
308 t0 = s2 + hmm_tprob_5st(2, 2);
309 t1 = s1 + hmm_tprob_5st(1, 2);
310 t2 = s0 + hmm_tprob_5st(0, 2);
314 hmm_history(hmm, 2) = hmm_in_history(hmm);
320 hmm_history(hmm, 2) = hmm_in_history(hmm);
323 hmm_history(hmm, 2) = hmm_history(hmm, 1);
328 hmm_score(hmm, 2) = s2;
332 t0 = s1 + hmm_tprob_5st(1, 1);
333 t1 = s0 + hmm_tprob_5st(0, 1);
338 hmm_history(hmm, 1) = hmm_in_history(hmm);
342 hmm_score(hmm, 1) = s1;
345 s0 = s0 + hmm_tprob_5st(0, 0);
348 hmm_in_score(hmm) = s0;
350 hmm_bestscore(hmm) = bestScore;
354 #define mpx_senid(st) sseq[ssid[st]][st] 355 #define mpx_senscr(st) (-senscore[mpx_senid(st)]) 358 hmm_vit_eval_5st_lr_mpx(
hmm_t * hmm)
360 uint8
const *tp = hmm->ctx->tp[hmm->tmatid][0];
361 int16
const *senscore = hmm->ctx->senscore;
362 uint16 *
const *sseq = hmm->ctx->sseq;
363 uint16 *ssid = hmm->senid;