HMM data structure and operation. More...
Go to the source code of this file.
Classes | |
struct | hmm_context_s |
struct | hmm_state_t |
A single state in the HMM. More... | |
struct | hmm_s |
Macros | |
#define | MAX_HMM_NSTATE 5 |
#define | hmm_context(h) ((hmm_t *)(h))->ctx |
#define | hmm_is_mpx(h) ((hmm_t *)(h))->mpx |
#define | hmm_state(h, st) ((hmm_t *)(h))->state[st] |
#define | hmm_in_score(h) hmm_state(h,0).score |
#define | hmm_score(h, st) hmm_state(h,st).score |
#define | hmm_out_score(h) ((hmm_t *)(h))->out.score |
#define | hmm_in_history(h) hmm_state(h,0).history.id |
#define | hmm_history(h, st) hmm_state(h,st).history.id |
#define | hmm_out_history(h) ((hmm_t *)(h))->out.history.id |
#define | hmm_in_histobj(h) hmm_state(h,0).history.ptr |
#define | hmm_histobj(h, st) hmm_state(h,st).history.ptr |
#define | hmm_out_histobj(h) ((hmm_t *)(h))->out.history.ptr |
#define | hmm_bestscore(h) ((hmm_t *)(h))->bestscore |
#define | hmm_frame(h) ((hmm_t *)(h))->frame |
#define | hmm_mpx_ssid(h, st) ((hmm_t *)(h))->s.mpx_ssid[st] |
#define | hmm_nonmpx_ssid(h) ((hmm_t *)(h))->s.ssid |
#define | hmm_ssid(h, st) |
#define | hmm_senid(h, st) |
#define | hmm_senscr(h, st) |
#define | hmm_tmatid(h) ((hmm_t *)(h))->tmatid |
#define | hmm_tprob(h, i, j) ((hmm_t *)(h))->ctx->tp[hmm_tmatid(h)][i][j] |
#define | hmm_n_emit_state(h) (((hmm_t *)(h))->n_emit_state) |
#define | hmm_n_state(h) (((hmm_t *)(h))->n_emit_state + 1) |
#define | hmm_context_set_senscore(ctx, senscr) ((ctx)->senscore = (senscr)) |
Typedefs | |
typedef struct hmm_context_s | hmm_context_t |
typedef struct hmm_s | hmm_t |
Functions | |
hmm_context_t * | hmm_context_init (int32 n_emit_state, int32 ***tp, int32 *senscore, s3senid_t **sseq) |
void | hmm_context_free (hmm_context_t *ctx) |
void | hmm_init (hmm_context_t *ctx, hmm_t *hmm, int mpx, int32 ssid, s3tmatid_t tmatid) |
void | hmm_deinit (hmm_t *hmm) |
void | hmm_clear (hmm_t *h) |
void | hmm_clear_scores (hmm_t *h) |
void | hmm_normalize (hmm_t *h, int32 bestscr) |
void | hmm_enter (hmm_t *h, int32 score, int32 histid, int32 frame) |
void | hmm_enter_obj (hmm_t *h, int32 score, void *histobj, int32 frame) |
int32 | hmm_vit_eval (hmm_t *hmm) |
int32 | hmm_dump_vit_eval (hmm_t *hmm, FILE *fp) |
void | hmm_dump (hmm_t *h, FILE *fp) |
HMM data structure and operation.
For efficiency, this version is hardwired for two possible HMM topologies, but will fall back to others:
5-state left-to-right HMMs: (0 is the emitting entry state and E is a non-emitting exit state; the x's indicate allowed transitions between source and destination states):
0 1 2 3 4 E (destination-states) 0 x x x 1 x x x 2 x x x 3 x x x 4 x x
(source-states) 5-state topologies that contain a subset of the above transitions should work as well.
3-state left-to-right HMMs (similar notation as the 5-state topology above):
0 1 2 E (destination-states) 0 x x x 1 x x x 2 x x
(source-states) 3-state topologies that contain a subset of the above transitions should work as well.
#define hmm_bestscore | ( | h | ) | ((hmm_t *)(h))->bestscore |
Referenced by whmm_exit().
#define hmm_context | ( | h | ) | ((hmm_t *)(h))->ctx |
Access macros.
#define hmm_context_set_senscore | ( | ctx, | |
senscr | |||
) | ((ctx)->senscore = (senscr)) |
Change the senone score array for a context.
Referenced by whmm_eval().
#define hmm_frame | ( | h | ) | ((hmm_t *)(h))->frame |
Referenced by whmm_eval(), and whmm_exit().
#define hmm_histobj | ( | h, | |
st | |||
) | hmm_state(h,st).history.ptr |
#define hmm_history | ( | h, | |
st | |||
) | hmm_state(h,st).history.id |
#define hmm_in_histobj | ( | h | ) | hmm_state(h,0).history.ptr |
#define hmm_in_history | ( | h | ) | hmm_state(h,0).history.id |
#define hmm_in_score | ( | h | ) | hmm_state(h,0).score |
Referenced by whmm_transition(), and word_enter().
#define hmm_is_mpx | ( | h | ) | ((hmm_t *)(h))->mpx |
Referenced by whmm_eval(), and word_enter().
#define hmm_mpx_ssid | ( | h, | |
st | |||
) | ((hmm_t *)(h))->s.mpx_ssid[st] |
Referenced by word_enter().
#define hmm_n_emit_state | ( | h | ) | (((hmm_t *)(h))->n_emit_state) |
#define hmm_n_state | ( | h | ) | (((hmm_t *)(h))->n_emit_state + 1) |
#define hmm_nonmpx_ssid | ( | h | ) | ((hmm_t *)(h))->s.ssid |
Referenced by word_enter().
#define hmm_out_histobj | ( | h | ) | ((hmm_t *)(h))->out.history.ptr |
#define hmm_out_history | ( | h | ) | ((hmm_t *)(h))->out.history.id |
Referenced by whmm_exit(), and whmm_transition().
#define hmm_out_score | ( | h | ) | ((hmm_t *)(h))->out.score |
Referenced by dump_all_word(), whmm_exit(), and whmm_transition().
#define hmm_score | ( | h, | |
st | |||
) | hmm_state(h,st).score |
#define hmm_senid | ( | h, | |
st | |||
) |
#define hmm_senscr | ( | h, | |
st | |||
) |
#define hmm_ssid | ( | h, | |
st | |||
) |
#define hmm_state | ( | h, | |
st | |||
) | ((hmm_t *)(h))->state[st] |
#define hmm_tmatid | ( | h | ) | ((hmm_t *)(h))->tmatid |
#define hmm_tprob | ( | h, | |
i, | |||
j | |||
) | ((hmm_t *)(h))->ctx->tp[hmm_tmatid(h)][i][j] |
#define MAX_HMM_NSTATE 5 |
Hardcoded limit on the number of states (temporary)
typedef struct hmm_context_s hmm_context_t |
void hmm_clear | ( | hmm_t * | h | ) |
Reset the states of the HMM to the invalid condition; i.e., scores to WORST_SCORE and hist to undefined.
void hmm_clear_scores | ( | hmm_t * | h | ) |
Reset the scores of the HMM.
void hmm_context_free | ( | hmm_context_t * | ctx | ) |
Free an HMM context.
hmm_context_t* hmm_context_init | ( | int32 | n_emit_state, |
int32 *** | tp, | ||
int32 * | senscore, | ||
s3senid_t ** | sseq | ||
) |
Create an HMM context.
void hmm_deinit | ( | hmm_t * | hmm | ) |
Free an HMM structure, releasing internal data (but not the HMM structure itself).
void hmm_dump | ( | hmm_t * | h, |
FILE * | fp | ||
) |
For debugging, dump the whole HMM out.
h | In/Out: HMM being updated |
fp | An output file pointer |
int32 hmm_dump_vit_eval | ( | hmm_t * | hmm, |
FILE * | fp | ||
) |
Like hmm_vit_eval, but dump HMM state and relevant senscr to fp first, for debugging;.
hmm | In/Out: HMM being updated |
fp | An output file pointer |
void hmm_enter | ( | hmm_t * | h, |
int32 | score, | ||
int32 | histid, | ||
int32 | frame | ||
) |
Enter an HMM with the given path score and history ID.
Referenced by whmm_transition(), and word_enter().
void hmm_enter_obj | ( | hmm_t * | h, |
int32 | score, | ||
void * | histobj, | ||
int32 | frame | ||
) |
Enter an HMM with the given path score and history object.
void hmm_init | ( | hmm_context_t * | ctx, |
hmm_t * | hmm, | ||
int | mpx, | ||
int32 | ssid, | ||
s3tmatid_t | tmatid | ||
) |
Populate a previously-allocated HMM structure, allocating internal data.
void hmm_normalize | ( | hmm_t * | h, |
int32 | bestscr | ||
) |
Renormalize the scores in this HMM based on the given best score.
Referenced by whmm_renorm().
int32 hmm_vit_eval | ( | hmm_t * | hmm | ) |
Viterbi evaluation of given HMM. (NOTE that if this module were being used for tracking state segmentations, the dummy, non-emitting exit state would have to be updated separately. In the Viterbi DP diagram, transitions to the exit state occur from the current time; they are vertical transitions. Hence they should be made only after the history has been logged for the emitting states. But we're not bothered with state segmentations, for now. So, we update the exit state as well.)
Referenced by whmm_eval().