static void vithist_enter (vithist_t *vh, kbcore_t *kbc, vithist_entry_t *tve) { vithist_entry_t *ve; int32 vhid; /* Check if an entry with this LM state already exists in current frame */ vhid = vh_lmstate_find (vh, &(tve->lmstate)); if (vhid < 0) { /* Not found; allocate new entry */ vhid = vh->n_entry; ve = vithist_entry_alloc (vh); *ve = *tve; vithist_lmstate_enter (vh, vhid, ve); /* Enter new vithist info into LM state tree */ } else { ve = vh->entry[VITHIST_ID2BLK(vhid)] + VITHIST_ID2BLKOFFSET(vhid); if (ve->score < tve->score) *ve = *tve; } /* Update best exit score in this frame */ if (vh->bestscore[vh->n_frm] < tve->score) { vh->bestscore[vh->n_frm] = tve->score; vh->bestvh[vh->n_frm] = vhid; } }
/* Rclist is separate from tve because C structure copying is used in *ve = *tve */ void vithist_enter(vithist_t * vh, /**< The history table */ s3dict_t *dict, /**< Dictionary */ dict2pid_t *dict2pid, /**< Context table mapping thing */ vithist_entry_t * tve, /**< an input vithist element */ int32 comp_rc /**< a compressed rc. If it is the actual rc, it won't work. */ ) { vithist_entry_t *ve; int32 vhid; int32 n_ci; int32 n_rc_info; int32 old_n_rc_info; n_ci = vh->n_ci; /* Check if an entry with this LM state already exists in current frame */ vhid = vh_lmstate_find(vh, &(tve->lmstate)); n_rc_info = 0; /* Just fill in something if not using crossword triphon */ assert(comp_rc < n_rc_info); if (vhid < 0) { /* Not found; allocate new entry */ vhid = vh->n_entry; ve = vithist_entry_alloc(vh); vithist_entry_dirty_cp(ve, tve, n_rc_info); vithist_lmstate_enter(vh, vhid, ve); /* Enter new vithist info into LM state tree */ /* E_INFO("Start a new entry wid %d\n",ve->wid); */ if (ve->rc != NULL) clean_up_rc_info(ve->rc, ve->n_rc); if (comp_rc != -1) { if (ve->rc == NULL) { ve->n_rc = get_rc_nssid(dict2pid, ve->wid, dict); /* Always allocate n_ci for rc_info */ ve->rc = ckd_calloc(vh->n_ci, sizeof(*ve->rc)); clean_up_rc_info(ve->rc, ve->n_rc); } assert(comp_rc < ve->n_rc); if (ve->rc[comp_rc].score < tve->path.score) { ve->rc[comp_rc].score = tve->path.score; ve->rc[comp_rc].pred = tve->path.pred; } } } else { ve = vithist_id2entry(vh, vhid); /* E_INFO("Replace the old entry\n"); */ /* E_INFO("Old entry wid %d, New entry wid %d\n",ve->wid, tve->wid); */ if (comp_rc == -1) { if (ve->path.score < tve->path.score) { vithist_entry_dirty_cp(ve, tve, n_rc_info); assert(comp_rc < n_rc_info); if (ve->rc != NULL) clean_up_rc_info(ve->rc, ve->n_rc); } } else { /* This is wrong, the score Alright, how vhid was searched in the first place? */ if (ve->path.score < tve->path.score) { old_n_rc_info = ve->n_rc; vithist_entry_dirty_cp(ve, tve, n_rc_info); assert(comp_rc < n_rc_info); assert(ve->rc); clean_up_rc_info(ve->rc, ve->n_rc); ve->rc[comp_rc].score = tve->path.score; ve->rc[comp_rc].pred = tve->path.pred; } } } /* Update best exit score in this frame */ if (vh->bestscore[vh->n_frm] < tve->path.score) { vh->bestscore[vh->n_frm] = tve->path.score; vh->bestvh[vh->n_frm] = vhid; } }