14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*---------------------------------------------------------------------------*
24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  srec_initialize.c  *
34a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
44a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
54a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
64a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the 'License');          *
74a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  you may not use this file except in compliance with the License.         *
84a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
94a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  You may obtain a copy of the License at                                  *
104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0                           *
114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software      *
134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  distributed under the License is distributed on an 'AS IS' BASIS,        *
144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  See the License for the specific language governing permissions and      *
164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  limitations under the License.                                           *
174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *---------------------------------------------------------------------------*/
194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifndef _RTT
214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "pstdio.h"
224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <stdlib.h>
244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <string.h>
254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <math.h>
264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "passert.h"
274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "portable.h"
294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "hmm_desc.h"
314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "utteranc.h"
324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "hmmlib.h"
334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "srec_sizes.h"
354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "srec.h"
364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "word_lattice.h"
374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "swimodel.h"
384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "c42mul.h"
404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*this file contains code which handles the initialization of the srec data structures*/
424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*allocates an srec -
444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectinput args come from config and are:
464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int         viterbi_prune_thresh;  score-based pruning threshold - only keep paths within this delta of best cost
484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int         max_hmm_tokens;       controls the maximum number of HMM's alive in any frame.  If number
504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     exceeded, pruning gets tightened.  So, this threshold can be used
514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     to tradeoff accuracy for computation an memory
524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int         max_fsmnode_tokens;   controls the maximum number of FSMs alive in any frame.  If number,
534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     exceeded, pruning gets tightened.  So, this threshold can be used
544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     to tradeoff accuracy for computation an memory
554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int         max_word_tokens;      controls the maximum number of word tokens kept in the word lattice.
564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     if number exceeded, the word lattice is pruned more tightly (less word
574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     ends per frame
584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int         max_altword_tokens;     controls the maximum number of alternative paths to propagate for proper nbest
604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int         num_wordends_per_frame; controls the size of the word lattice - the number of word ends to
624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project       keep at each time frame
634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int         max_fsm_nodes;        allocation size of a few arrays in the search - needs to be big enough
644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     to handle any grammar that the search needs to run.  Initialization fails
654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     if num exceeded
664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int         max_fsm_arcs;         allocation size of a few arrays in the search - needs to be big enough
674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     to handle any grammar that the search needs to run.  Initialization fails
684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     if num exceeded
694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project*/
714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic void allocate_recognition1(srec *rec,
734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                  int viterbi_prune_thresh,  /*score-based pruning threshold - only keep paths within this delta of best cost*/
744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                  int max_hmm_tokens,
754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                  int max_fsmnode_tokens,
764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                  int max_word_tokens,
774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                  int max_altword_tokens,
784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                  int num_wordends_per_frame,
794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                  int max_frames,
804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                  int max_model_states)
814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef SREC_ENGINE_VERBOSE_LOGGING
834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  PLogMessage("allocating recognition arrays2 prune %d max_hmm_tokens %d max_fsmnode_tokens %d max_word_tokens %d max_altword_tokens %d max_wordends_per_frame %d\n",
844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              viterbi_prune_thresh,
854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              max_hmm_tokens,
864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              max_fsmnode_tokens,
874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              max_word_tokens,
884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              max_altword_tokens,
894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              num_wordends_per_frame);
904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rec->current_model_scores = (costdata*) CALLOC_CLR(max_model_states, sizeof(costdata), "search.srec.current_model_scores"); /*FIX - either get NUM_MODELS from acoustic models, or check this someplace to make sure we have enough room*/
924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rec->num_model_slots_allocated = (modelID)max_model_states;
934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rec->fsmarc_token_array_size = (stokenID)max_hmm_tokens;
954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rec->fsmarc_token_array = (fsmarc_token*) CALLOC_CLR(rec->fsmarc_token_array_size , sizeof(fsmarc_token), "search.srec.fsmarc_token_array");
974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rec->max_new_states = (stokenID)max_hmm_tokens;
984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rec->word_token_array = (word_token*) CALLOC_CLR(max_word_tokens, sizeof(word_token), "search.srec.word_token_array");
1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rec->word_token_array_size = (wtokenID)max_word_tokens;
1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* todo: change this to a bit array later */
1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rec->word_token_array_flags = (asr_int16_t*) CALLOC_CLR(max_word_tokens, sizeof(asr_int16_t), "search.srec.word_token_array_flags");
1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rec->fsmnode_token_array = (fsmnode_token*) CALLOC_CLR(max_fsmnode_tokens, sizeof(fsmnode_token), "search.srec.fsmnode_token_array");
1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rec->fsmnode_token_array_size = (ftokenID)max_fsmnode_tokens;
1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rec->altword_token_array = (altword_token*) CALLOC_CLR(max_altword_tokens, sizeof(altword_token), "search.srec.altword_token_array");
1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rec->altword_token_array_size = (wtokenID)max_altword_tokens;
1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rec->prune_delta = (costdata)viterbi_prune_thresh;
1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rec->max_frames   = (frameID)max_frames;
1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rec->best_model_cost_for_frame = (costdata*)CALLOC_CLR(max_frames, sizeof(costdata), "search.srec.best_model_cost_for_frame");
1144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rec->word_lattice = allocate_word_lattice((frameID)max_frames);
1154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rec->word_priority_q = allocate_priority_q(num_wordends_per_frame);
1174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rec->best_fsmarc_token = MAXstokenID;
1184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define ASTAR_NBEST_LEN 10
1204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rec->astar_stack = astar_stack_make(rec, ASTAR_NBEST_LEN);
1214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rec->context = NULL;
1224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic int check_parameter_range(int parval, int parmin, int parmax, const char* parname)
1254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (parval > parmax)
1274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
1284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    log_report("Error: %s value %d is out-of-range [%d,%d]\n", parname,
1294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project               parval, parmin, parmax);
1304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return 1;
1314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else
1334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
1344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return 0;
1354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint allocate_recognition(multi_srec *rec,
1394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                         int viterbi_prune_thresh,  /*score-based pruning threshold - only keep paths within this delta of best cost*/
1404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                         int max_hmm_tokens,
1414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                         int max_fsmnode_tokens,
1424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                         int max_word_tokens,
1434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                         int max_altword_tokens,
1444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                         int num_wordends_per_frame,
1454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                         int max_fsm_nodes,
1464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                         int max_fsm_arcs,
1474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                         int max_frames,
1484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                         int max_model_states,
1494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                         int max_searches)
1504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int i;
1524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (check_parameter_range(max_fsm_nodes, 1, MAXnodeID, "max_fsm_nodes"))
1544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return 1;
1554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (check_parameter_range(max_fsm_arcs, 1, MAXarcID, "max_fsm_arcs"))
1564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return 1;
1574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (check_parameter_range(max_frames, 1, MAXframeID, "max_frames"))
1584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return 1;
1594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (check_parameter_range(max_model_states, 1, MAXmodelID, "max_model_states"))
1604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return 1;
1614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (check_parameter_range(max_hmm_tokens, 1, MAXstokenID, "max_hmm_tokens"))
1624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return 1;
1634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (check_parameter_range(max_fsmnode_tokens, 1, MAXftokenID, "max_fsmnode_tokens"))
1644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return 1;
1654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (check_parameter_range(viterbi_prune_thresh, 1, MAXcostdata, "viterbi_prune_thresh"))
1664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return 1;
1674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (check_parameter_range(max_altword_tokens, 0, MAXftokenID, "max_altword_tokens"))
1684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return 1;
1694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (check_parameter_range(max_searches, 1, 2, "max_searches"))
1704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return 1;
1714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rec->rec = (srec*)CALLOC_CLR(max_searches, sizeof(srec), "search.srec.base");
1734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rec->num_allocated_recs = max_searches;
1744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rec->num_swimodels      = 0;
1754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* best_token_for_arc and best_token_for_node are shared across
1774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     multiple searches */
1784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rec->best_token_for_arc = (stokenID*)CALLOC_CLR(max_fsm_arcs, sizeof(stokenID), "search.srec.best_token_for_arc");
1794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rec->max_fsm_arcs = (arcID)max_fsm_arcs;
1804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rec->best_token_for_node = (ftokenID*)CALLOC_CLR(max_fsm_nodes, sizeof(ftokenID), "search.srec.best_token_for_node");
1824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rec->max_fsm_nodes = (nodeID)max_fsm_nodes;
1834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* cost offsets and accumulated cost offsets are pooled for all
1854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     different searches, this saves memory and enables each search
1864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     to know it's total scores */
1874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rec->cost_offset_for_frame = (costdata*)CALLOC_CLR(max_frames, sizeof(costdata), "search.srec.current_best_costs");
1884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rec->accumulated_cost_offset = (bigcostdata*)CALLOC_CLR(max_frames, sizeof(bigcostdata), "search.srec.accumulated_cost_offset");
1894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rec->max_frames = (frameID)max_frames;
1904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i = 0; i < max_frames; i++)
1914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rec->accumulated_cost_offset[i] = 0;
1924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* now copy the shared data down to individual recogs */
1944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i = 0; i < rec->num_allocated_recs; i++)
1954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
1964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    allocate_recognition1(&rec->rec[i], viterbi_prune_thresh, max_hmm_tokens, max_fsmnode_tokens, max_word_tokens, max_altword_tokens, num_wordends_per_frame, max_frames, max_model_states);
1974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rec->rec[i].best_token_for_node     = rec->best_token_for_node;
1984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rec->rec[i].max_fsm_nodes           = rec->max_fsm_nodes;
1994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rec->rec[i].best_token_for_arc      = rec->best_token_for_arc;
2004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rec->rec[i].max_fsm_arcs            = rec->max_fsm_arcs;
2014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rec->rec[i].max_frames              = rec->max_frames;
2024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rec->rec[i].cost_offset_for_frame   = rec->cost_offset_for_frame;
2034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rec->rec[i].accumulated_cost_offset = rec->accumulated_cost_offset;
2044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rec->rec[i].id = (asr_int16_t)i;
2054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rec->eos_status = VALID_SPEECH_NOT_YET_DETECTED;
2074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return 0;
2084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
2094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic void free_recognition1(srec *rec)
2124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
2134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  FREE(rec->current_model_scores);
2144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  FREE(rec->fsmarc_token_array);
2154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  FREE(rec->word_token_array);
2164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  FREE(rec->word_token_array_flags);
2174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  FREE(rec->fsmnode_token_array);
2184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  FREE(rec->altword_token_array);
2194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  FREE(rec->best_model_cost_for_frame);
2204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  destroy_word_lattice(rec->word_lattice);
2214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  free_priority_q(rec->word_priority_q);
2224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  astar_stack_destroy(rec);
2234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
2244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid free_recognition(multi_srec *rec)
2264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
2274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int i;
2284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i = 0; i < rec->num_allocated_recs; i++)
2294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    free_recognition1(&rec->rec[i]);
2304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  FREE(rec->accumulated_cost_offset);
2314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  FREE(rec->cost_offset_for_frame);
2324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  FREE(rec->best_token_for_node);
2334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  FREE(rec->best_token_for_arc);
2344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  FREE(rec->rec);
2354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
2364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
237