void ngram_model_set_map_words(ngram_model_t * base, const char **words, int32 n_words) { ngram_model_set_t *set = (ngram_model_set_t *) base; int32 i; /* Recreate the word mapping. */ if (base->writable) { for (i = 0; i < base->n_words; ++i) { ckd_free(base->word_str[i]); } } ckd_free(base->word_str); ckd_free_2d((void **) set->widmap); base->writable = TRUE; base->n_words = base->n_1g_alloc = n_words; base->word_str = ckd_calloc(n_words, sizeof(*base->word_str)); set->widmap = (int32 **) ckd_calloc_2d(n_words, set->n_models, sizeof(**set->widmap)); hash_table_empty(base->wid); for (i = 0; i < n_words; ++i) { int32 j; base->word_str[i] = ckd_salloc(words[i]); (void) hash_table_enter_int32(base->wid, base->word_str[i], i); for (j = 0; j < set->n_models; ++j) { set->widmap[i][j] = ngram_wid(set->lms[j], base->word_str[i]); } } }
int32 ngram_model_init(ngram_model_t *base, ngram_funcs_t *funcs, logmath_t *lmath, int32 n, int32 n_unigram) { base->refcount = 1; base->funcs = funcs; base->n = n; /* If this was previously initialized... */ if (base->n_counts == NULL) base->n_counts = ckd_calloc(3, sizeof(*base->n_counts)); /* Don't reset weights if logmath object hasn't changed. */ if (base->lmath != lmath) { /* Set default values for weights. */ base->lw = 1.0; base->log_wip = 0; /* i.e. 1.0 */ base->log_uw = 0; /* i.e. 1.0 */ base->log_uniform = logmath_log(lmath, 1.0 / n_unigram); base->log_uniform_weight = logmath_get_zero(lmath); base->log_zero = logmath_get_zero(lmath); base->lmath = lmath; } /* Allocate or reallocate space for word strings. */ if (base->word_str) { /* Free all previous word strings if they were allocated. */ if (base->writable) { int32 i; for (i = 0; i < base->n_words; ++i) { ckd_free(base->word_str[i]); base->word_str[i] = NULL; } } base->word_str = ckd_realloc(base->word_str, n_unigram * sizeof(char *)); } else base->word_str = ckd_calloc(n_unigram, sizeof(char *)); /* NOTE: They are no longer case-insensitive since we are allowing * other encodings for word strings. Beware. */ if (base->wid) hash_table_empty(base->wid); else base->wid = hash_table_new(n_unigram, FALSE); base->n_counts[0] = base->n_1g_alloc = base->n_words = n_unigram; return 0; }
static void ps_free_searches(ps_decoder_t *ps) { if (ps->searches) { /* Release keys manually as we used ckd_salloc to add them, release every search too. */ hash_iter_t *search_it; for (search_it = hash_table_iter(ps->searches); search_it; search_it = hash_table_iter_next(search_it)) { ckd_free((char *) hash_entry_key(search_it->ent)); ps_search_free(hash_entry_val(search_it->ent)); } hash_table_empty(ps->searches); hash_table_free(ps->searches); } ps->searches = NULL; ps->search = NULL; }