This file is indexed.

/usr/share/doc/pocketsphinx/html/ngram__search__fwdflat_8c_source.html is in pocketsphinx-doc 0.8.0+real5prealpha-1ubuntu2.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.11"/>
<title>PocketSphinx: src/libpocketsphinx/ngram_search_fwdflat.c Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
  $(document).ready(initResizable);
  $(window).load(resizeHeight);
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td id="projectalign" style="padding-left: 0.5em;">
   <div id="projectname">PocketSphinx
   &#160;<span id="projectnumber">5prealpha</span>
   </div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.11 -->
  <div id="navrow1" class="tabs">
    <ul class="tablist">
      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
      <li class="current"><a href="files.html"><span>Files</span></a></li>
    </ul>
  </div>
  <div id="navrow2" class="tabs2">
    <ul class="tablist">
      <li><a href="files.html"><span>File&#160;List</span></a></li>
      <li><a href="globals.html"><span>Globals</span></a></li>
    </ul>
  </div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
  <div id="nav-tree">
    <div id="nav-tree-contents">
      <div id="nav-sync" class="sync"></div>
    </div>
  </div>
  <div id="splitbar" style="-moz-user-select:none;" 
       class="ui-resizable-handle">
  </div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('ngram__search__fwdflat_8c_source.html','');});
</script>
<div id="doc-content">
<div class="header">
  <div class="headertitle">
<div class="title">ngram_search_fwdflat.c</div>  </div>
</div><!--header-->
<div class="contents">
<a href="ngram__search__fwdflat_8c.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;<span class="comment">/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */</span></div><div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;<span class="comment">/* ====================================================================</span></div><div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;<span class="comment"> * Copyright (c) 2008 Carnegie Mellon University.  All rights</span></div><div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;<span class="comment"> * reserved.</span></div><div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;<span class="comment"> * Redistribution and use in source and binary forms, with or without</span></div><div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;<span class="comment"> * modification, are permitted provided that the following conditions</span></div><div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;<span class="comment"> * are met:</span></div><div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="comment"> * 1. Redistributions of source code must retain the above copyright</span></div><div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;<span class="comment"> *    notice, this list of conditions and the following disclaimer. </span></div><div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;<span class="comment"> * 2. Redistributions in binary form must reproduce the above copyright</span></div><div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;<span class="comment"> *    notice, this list of conditions and the following disclaimer in</span></div><div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;<span class="comment"> *    the documentation and/or other materials provided with the</span></div><div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;<span class="comment"> *    distribution.</span></div><div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;<span class="comment"> * This work was supported in part by funding from the Defense Advanced </span></div><div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;<span class="comment"> * Research Projects Agency and the National Science Foundation of the </span></div><div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;<span class="comment"> * United States of America, and the CMU Sphinx Speech Consortium.</span></div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;<span class="comment"> * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS&#39;&#39; AND </span></div><div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;<span class="comment"> * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, </span></div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="comment"> * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR</span></div><div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;<span class="comment"> * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY</span></div><div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;<span class="comment"> * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</span></div><div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;<span class="comment"> * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT </span></div><div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;<span class="comment"> * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, </span></div><div class="line"><a name="l00029"></a><span class="lineno">   29</span>&#160;<span class="comment"> * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY </span></div><div class="line"><a name="l00030"></a><span class="lineno">   30</span>&#160;<span class="comment"> * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT </span></div><div class="line"><a name="l00031"></a><span class="lineno">   31</span>&#160;<span class="comment"> * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE </span></div><div class="line"><a name="l00032"></a><span class="lineno">   32</span>&#160;<span class="comment"> * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span></div><div class="line"><a name="l00033"></a><span class="lineno">   33</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00034"></a><span class="lineno">   34</span>&#160;<span class="comment"> * ====================================================================</span></div><div class="line"><a name="l00035"></a><span class="lineno">   35</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00036"></a><span class="lineno">   36</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00037"></a><span class="lineno">   37</span>&#160;</div><div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;<span class="comment">/* System headers. */</span></div><div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;<span class="preprocessor">#include &lt;string.h&gt;</span></div><div class="line"><a name="l00044"></a><span class="lineno">   44</span>&#160;<span class="preprocessor">#include &lt;assert.h&gt;</span></div><div class="line"><a name="l00045"></a><span class="lineno">   45</span>&#160;</div><div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;<span class="comment">/* SphinxBase headers. */</span></div><div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;<span class="preprocessor">#include &lt;sphinxbase/ckd_alloc.h&gt;</span></div><div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;<span class="preprocessor">#include &lt;sphinxbase/listelem_alloc.h&gt;</span></div><div class="line"><a name="l00049"></a><span class="lineno">   49</span>&#160;<span class="preprocessor">#include &lt;sphinxbase/err.h&gt;</span></div><div class="line"><a name="l00050"></a><span class="lineno">   50</span>&#160;</div><div class="line"><a name="l00051"></a><span class="lineno">   51</span>&#160;<span class="comment">/* Local headers. */</span></div><div class="line"><a name="l00052"></a><span class="lineno">   52</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="ngram__search_8h.html">ngram_search.h</a>&quot;</span></div><div class="line"><a name="l00053"></a><span class="lineno">   53</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="ps__lattice__internal_8h.html">ps_lattice_internal.h</a>&quot;</span></div><div class="line"><a name="l00054"></a><span class="lineno">   54</span>&#160;</div><div class="line"><a name="l00055"></a><span class="lineno">   55</span>&#160;<span class="comment">/* Turn this on to dump channels for debugging */</span></div><div class="line"><a name="l00056"></a><span class="lineno">   56</span>&#160;<span class="preprocessor">#define __CHAN_DUMP__           0</span></div><div class="line"><a name="l00057"></a><span class="lineno">   57</span>&#160;<span class="preprocessor">#if __CHAN_DUMP__</span></div><div class="line"><a name="l00058"></a><span class="lineno">   58</span>&#160;<span class="preprocessor">#define chan_v_eval(chan) hmm_dump_vit_eval(&amp;(chan)-&gt;hmm, stderr)</span></div><div class="line"><a name="l00059"></a><span class="lineno">   59</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00060"></a><span class="lineno">   60</span>&#160;<span class="preprocessor">#define chan_v_eval(chan) hmm_vit_eval(&amp;(chan)-&gt;hmm)</span></div><div class="line"><a name="l00061"></a><span class="lineno">   61</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00062"></a><span class="lineno">   62</span>&#160;</div><div class="line"><a name="l00063"></a><span class="lineno">   63</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span></div><div class="line"><a name="l00064"></a><span class="lineno">   64</span>&#160;ngram_fwdflat_expand_all(<a class="code" href="structngram__search__s.html">ngram_search_t</a> *ngs)</div><div class="line"><a name="l00065"></a><span class="lineno">   65</span>&#160;{</div><div class="line"><a name="l00066"></a><span class="lineno">   66</span>&#160;    <span class="keywordtype">int</span> n_words, i;</div><div class="line"><a name="l00067"></a><span class="lineno">   67</span>&#160;</div><div class="line"><a name="l00068"></a><span class="lineno">   68</span>&#160;    <span class="comment">/* For all &quot;real words&quot; (not fillers or &lt;s&gt;/&lt;/s&gt;) in the dictionary,</span></div><div class="line"><a name="l00069"></a><span class="lineno">   69</span>&#160;<span class="comment">     *</span></div><div class="line"><a name="l00070"></a><span class="lineno">   70</span>&#160;<span class="comment">     * 1) Add the ones which are in the LM to the fwdflat wordlist</span></div><div class="line"><a name="l00071"></a><span class="lineno">   71</span>&#160;<span class="comment">     * 2) And to the expansion list (since we are expanding all)</span></div><div class="line"><a name="l00072"></a><span class="lineno">   72</span>&#160;<span class="comment">     */</span></div><div class="line"><a name="l00073"></a><span class="lineno">   73</span>&#160;    ngs-&gt;n_expand_words = 0;</div><div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;    n_words = ps_search_n_words(ngs);</div><div class="line"><a name="l00075"></a><span class="lineno">   75</span>&#160;    bitvec_clear_all(ngs-&gt;expand_word_flag, ps_search_n_words(ngs));</div><div class="line"><a name="l00076"></a><span class="lineno">   76</span>&#160;    <span class="keywordflow">for</span> (i = 0; i &lt; n_words; ++i) {</div><div class="line"><a name="l00077"></a><span class="lineno">   77</span>&#160;        <span class="keywordflow">if</span> (!ngram_model_set_known_wid(ngs-&gt;<a class="code" href="structngram__search__s.html#a6127a6d8fb53832e67456c11aa6ad9c4">lmset</a>,</div><div class="line"><a name="l00078"></a><span class="lineno">   78</span>&#160;                                       dict_basewid(ps_search_dict(ngs),i)))</div><div class="line"><a name="l00079"></a><span class="lineno">   79</span>&#160;            <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00080"></a><span class="lineno">   80</span>&#160;        ngs-&gt;<a class="code" href="structngram__search__s.html#a774f1640c5ece856f4bef98d98e7c959">fwdflat_wordlist</a>[ngs-&gt;n_expand_words] = i;</div><div class="line"><a name="l00081"></a><span class="lineno">   81</span>&#160;        ngs-&gt;expand_word_list[ngs-&gt;n_expand_words] = i;</div><div class="line"><a name="l00082"></a><span class="lineno">   82</span>&#160;        bitvec_set(ngs-&gt;expand_word_flag, i);</div><div class="line"><a name="l00083"></a><span class="lineno">   83</span>&#160;        ngs-&gt;n_expand_words++;</div><div class="line"><a name="l00084"></a><span class="lineno">   84</span>&#160;    }</div><div class="line"><a name="l00085"></a><span class="lineno">   85</span>&#160;    E_INFO(<span class="stringliteral">&quot;Utterance vocabulary contains %d words\n&quot;</span>, ngs-&gt;n_expand_words);</div><div class="line"><a name="l00086"></a><span class="lineno">   86</span>&#160;    ngs-&gt;expand_word_list[ngs-&gt;n_expand_words] = -1;</div><div class="line"><a name="l00087"></a><span class="lineno">   87</span>&#160;    ngs-&gt;<a class="code" href="structngram__search__s.html#a774f1640c5ece856f4bef98d98e7c959">fwdflat_wordlist</a>[ngs-&gt;n_expand_words] = -1;</div><div class="line"><a name="l00088"></a><span class="lineno">   88</span>&#160;}</div><div class="line"><a name="l00089"></a><span class="lineno">   89</span>&#160;</div><div class="line"><a name="l00090"></a><span class="lineno">   90</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span></div><div class="line"><a name="l00091"></a><span class="lineno">   91</span>&#160;ngram_fwdflat_allocate_1ph(<a class="code" href="structngram__search__s.html">ngram_search_t</a> *ngs)</div><div class="line"><a name="l00092"></a><span class="lineno">   92</span>&#160;{</div><div class="line"><a name="l00093"></a><span class="lineno">   93</span>&#160;    <a class="code" href="structdict__t.html">dict_t</a> *dict = ps_search_dict(ngs);</div><div class="line"><a name="l00094"></a><span class="lineno">   94</span>&#160;    <span class="keywordtype">int</span> n_words = ps_search_n_words(ngs);</div><div class="line"><a name="l00095"></a><span class="lineno">   95</span>&#160;    <span class="keywordtype">int</span> i, w;</div><div class="line"><a name="l00096"></a><span class="lineno">   96</span>&#160;</div><div class="line"><a name="l00097"></a><span class="lineno">   97</span>&#160;    <span class="comment">/* Allocate single-phone words, since they won&#39;t have</span></div><div class="line"><a name="l00098"></a><span class="lineno">   98</span>&#160;<span class="comment">     * been allocated for us by fwdtree initialization. */</span></div><div class="line"><a name="l00099"></a><span class="lineno">   99</span>&#160;    ngs-&gt;<a class="code" href="structngram__search__s.html#a9168184c862d6f63bd7926e6581b25d9">n_1ph_words</a> = 0;</div><div class="line"><a name="l00100"></a><span class="lineno">  100</span>&#160;    <span class="keywordflow">for</span> (w = 0; w &lt; n_words; w++) {</div><div class="line"><a name="l00101"></a><span class="lineno">  101</span>&#160;        <span class="keywordflow">if</span> (dict_is_single_phone(dict, w))</div><div class="line"><a name="l00102"></a><span class="lineno">  102</span>&#160;            ++ngs-&gt;<a class="code" href="structngram__search__s.html#a9168184c862d6f63bd7926e6581b25d9">n_1ph_words</a>;</div><div class="line"><a name="l00103"></a><span class="lineno">  103</span>&#160;    }</div><div class="line"><a name="l00104"></a><span class="lineno">  104</span>&#160;    ngs-&gt;<a class="code" href="structngram__search__s.html#a1157923e0060b947e05caa819c8abe2c">single_phone_wid</a> = ckd_calloc(ngs-&gt;<a class="code" href="structngram__search__s.html#a9168184c862d6f63bd7926e6581b25d9">n_1ph_words</a>,</div><div class="line"><a name="l00105"></a><span class="lineno">  105</span>&#160;                                       <span class="keyword">sizeof</span>(*ngs-&gt;<a class="code" href="structngram__search__s.html#a1157923e0060b947e05caa819c8abe2c">single_phone_wid</a>));</div><div class="line"><a name="l00106"></a><span class="lineno">  106</span>&#160;    ngs-&gt;<a class="code" href="structngram__search__s.html#a1ffa3c9100252122ae8a2a713c50b527">rhmm_1ph</a> = ckd_calloc(ngs-&gt;<a class="code" href="structngram__search__s.html#a9168184c862d6f63bd7926e6581b25d9">n_1ph_words</a>, <span class="keyword">sizeof</span>(*ngs-&gt;<a class="code" href="structngram__search__s.html#a1ffa3c9100252122ae8a2a713c50b527">rhmm_1ph</a>));</div><div class="line"><a name="l00107"></a><span class="lineno">  107</span>&#160;    i = 0;</div><div class="line"><a name="l00108"></a><span class="lineno">  108</span>&#160;    <span class="keywordflow">for</span> (w = 0; w &lt; n_words; w++) {</div><div class="line"><a name="l00109"></a><span class="lineno">  109</span>&#160;        <span class="keywordflow">if</span> (!dict_is_single_phone(dict, w))</div><div class="line"><a name="l00110"></a><span class="lineno">  110</span>&#160;            <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00111"></a><span class="lineno">  111</span>&#160;</div><div class="line"><a name="l00112"></a><span class="lineno">  112</span>&#160;        <span class="comment">/* DICT2PID location */</span></div><div class="line"><a name="l00113"></a><span class="lineno">  113</span>&#160;        ngs-&gt;<a class="code" href="structngram__search__s.html#a1ffa3c9100252122ae8a2a713c50b527">rhmm_1ph</a>[i].<a class="code" href="structroot__chan__s.html#ad67c37bf4183f518acd7760c09a806f6">ciphone</a> = dict_first_phone(dict, w);</div><div class="line"><a name="l00114"></a><span class="lineno">  114</span>&#160;        ngs-&gt;<a class="code" href="structngram__search__s.html#a1ffa3c9100252122ae8a2a713c50b527">rhmm_1ph</a>[i].<a class="code" href="structroot__chan__s.html#a0c0cf22caf4c97879af86865764f1675">ci2phone</a> = bin_mdef_silphone(ps_search_acmod(ngs)-&gt;mdef);</div><div class="line"><a name="l00115"></a><span class="lineno">  115</span>&#160;        <a class="code" href="hmm_8h.html#aa911ae0d1c0eba562692fbeebca90d78">hmm_init</a>(ngs-&gt;<a class="code" href="structngram__search__s.html#acfbdd34e3dadbaa384818402f1dd59bf">hmmctx</a>, &amp;ngs-&gt;<a class="code" href="structngram__search__s.html#a1ffa3c9100252122ae8a2a713c50b527">rhmm_1ph</a>[i].<a class="code" href="structroot__chan__s.html#a9d4d92ffa8b4079202ddebe3ba0eb290">hmm</a>, TRUE,</div><div class="line"><a name="l00116"></a><span class="lineno">  116</span>&#160;                 <span class="comment">/* ssid */</span> bin_mdef_pid2ssid(ps_search_acmod(ngs)-&gt;mdef,</div><div class="line"><a name="l00117"></a><span class="lineno">  117</span>&#160;                                              ngs-&gt;<a class="code" href="structngram__search__s.html#a1ffa3c9100252122ae8a2a713c50b527">rhmm_1ph</a>[i].<a class="code" href="structroot__chan__s.html#ad67c37bf4183f518acd7760c09a806f6">ciphone</a>),</div><div class="line"><a name="l00118"></a><span class="lineno">  118</span>&#160;                 <span class="comment">/* tmatid */</span> bin_mdef_pid2tmatid(ps_search_acmod(ngs)-&gt;mdef,</div><div class="line"><a name="l00119"></a><span class="lineno">  119</span>&#160;                                                  ngs-&gt;<a class="code" href="structngram__search__s.html#a1ffa3c9100252122ae8a2a713c50b527">rhmm_1ph</a>[i].<a class="code" href="structroot__chan__s.html#ad67c37bf4183f518acd7760c09a806f6">ciphone</a>));</div><div class="line"><a name="l00120"></a><span class="lineno">  120</span>&#160;        ngs-&gt;<a class="code" href="structngram__search__s.html#a1ffa3c9100252122ae8a2a713c50b527">rhmm_1ph</a>[i].<a class="code" href="structroot__chan__s.html#ae0f0b90a7cb2fcb54cd7b30502dd497e">next</a> = NULL;</div><div class="line"><a name="l00121"></a><span class="lineno">  121</span>&#160;        ngs-&gt;<a class="code" href="structngram__search__s.html#a79deb7295a261cd82d2a6b48cb119e77">word_chan</a>[w] = (<a class="code" href="structchan__s.html">chan_t</a> *) &amp;(ngs-&gt;<a class="code" href="structngram__search__s.html#a1ffa3c9100252122ae8a2a713c50b527">rhmm_1ph</a>[i]);</div><div class="line"><a name="l00122"></a><span class="lineno">  122</span>&#160;        ngs-&gt;<a class="code" href="structngram__search__s.html#a1157923e0060b947e05caa819c8abe2c">single_phone_wid</a>[i] = w;</div><div class="line"><a name="l00123"></a><span class="lineno">  123</span>&#160;        i++;</div><div class="line"><a name="l00124"></a><span class="lineno">  124</span>&#160;    }</div><div class="line"><a name="l00125"></a><span class="lineno">  125</span>&#160;}</div><div class="line"><a name="l00126"></a><span class="lineno">  126</span>&#160;</div><div class="line"><a name="l00127"></a><span class="lineno">  127</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span></div><div class="line"><a name="l00128"></a><span class="lineno">  128</span>&#160;ngram_fwdflat_free_1ph(<a class="code" href="structngram__search__s.html">ngram_search_t</a> *ngs)</div><div class="line"><a name="l00129"></a><span class="lineno">  129</span>&#160;{</div><div class="line"><a name="l00130"></a><span class="lineno">  130</span>&#160;    <span class="keywordtype">int</span> i, w;</div><div class="line"><a name="l00131"></a><span class="lineno">  131</span>&#160;    <span class="keywordtype">int</span> n_words = ps_search_n_words(ngs);</div><div class="line"><a name="l00132"></a><span class="lineno">  132</span>&#160;</div><div class="line"><a name="l00133"></a><span class="lineno">  133</span>&#160;    <span class="keywordflow">for</span> (i = w = 0; w &lt; n_words; ++w) {</div><div class="line"><a name="l00134"></a><span class="lineno">  134</span>&#160;        <span class="keywordflow">if</span> (!dict_is_single_phone(ps_search_dict(ngs), w))</div><div class="line"><a name="l00135"></a><span class="lineno">  135</span>&#160;            <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00136"></a><span class="lineno">  136</span>&#160;        <a class="code" href="hmm_8h.html#a7440ced1649225beb6816bf62481e08b">hmm_deinit</a>(&amp;ngs-&gt;<a class="code" href="structngram__search__s.html#a1ffa3c9100252122ae8a2a713c50b527">rhmm_1ph</a>[i].<a class="code" href="structroot__chan__s.html#a9d4d92ffa8b4079202ddebe3ba0eb290">hmm</a>);</div><div class="line"><a name="l00137"></a><span class="lineno">  137</span>&#160;        ++i;</div><div class="line"><a name="l00138"></a><span class="lineno">  138</span>&#160;    }</div><div class="line"><a name="l00139"></a><span class="lineno">  139</span>&#160;    ckd_free(ngs-&gt;<a class="code" href="structngram__search__s.html#a1ffa3c9100252122ae8a2a713c50b527">rhmm_1ph</a>);</div><div class="line"><a name="l00140"></a><span class="lineno">  140</span>&#160;    ngs-&gt;<a class="code" href="structngram__search__s.html#a1ffa3c9100252122ae8a2a713c50b527">rhmm_1ph</a> = NULL;</div><div class="line"><a name="l00141"></a><span class="lineno">  141</span>&#160;    ckd_free(ngs-&gt;<a class="code" href="structngram__search__s.html#a1157923e0060b947e05caa819c8abe2c">single_phone_wid</a>);</div><div class="line"><a name="l00142"></a><span class="lineno">  142</span>&#160;}</div><div class="line"><a name="l00143"></a><span class="lineno">  143</span>&#160;</div><div class="line"><a name="l00144"></a><span class="lineno">  144</span>&#160;<span class="keywordtype">void</span></div><div class="line"><a name="l00145"></a><span class="lineno"><a class="line" href="ngram__search__fwdflat_8h.html#ad4b8ebd904c77f8a28f59cd5ca2c8307">  145</a></span>&#160;<a class="code" href="ngram__search__fwdflat_8c.html#ad4b8ebd904c77f8a28f59cd5ca2c8307">ngram_fwdflat_init</a>(<a class="code" href="structngram__search__s.html">ngram_search_t</a> *ngs)</div><div class="line"><a name="l00146"></a><span class="lineno">  146</span>&#160;{</div><div class="line"><a name="l00147"></a><span class="lineno">  147</span>&#160;    <span class="keywordtype">int</span> n_words;</div><div class="line"><a name="l00148"></a><span class="lineno">  148</span>&#160;</div><div class="line"><a name="l00149"></a><span class="lineno">  149</span>&#160;    n_words = ps_search_n_words(ngs);</div><div class="line"><a name="l00150"></a><span class="lineno">  150</span>&#160;    ngs-&gt;<a class="code" href="structngram__search__s.html#a774f1640c5ece856f4bef98d98e7c959">fwdflat_wordlist</a> = ckd_calloc(n_words + 1, <span class="keyword">sizeof</span>(*ngs-&gt;<a class="code" href="structngram__search__s.html#a774f1640c5ece856f4bef98d98e7c959">fwdflat_wordlist</a>));</div><div class="line"><a name="l00151"></a><span class="lineno">  151</span>&#160;    ngs-&gt;expand_word_flag = bitvec_alloc(n_words);</div><div class="line"><a name="l00152"></a><span class="lineno">  152</span>&#160;    ngs-&gt;expand_word_list = ckd_calloc(n_words + 1, <span class="keyword">sizeof</span>(*ngs-&gt;expand_word_list));</div><div class="line"><a name="l00153"></a><span class="lineno">  153</span>&#160;    ngs-&gt;<a class="code" href="structngram__search__s.html#aa54544457c363ccccb87fc7ec63a5f3e">frm_wordlist</a> = ckd_calloc(ngs-&gt;<a class="code" href="structngram__search__s.html#a38ea5de504b3d7ad2390a3f8966d502f">n_frame_alloc</a>, <span class="keyword">sizeof</span>(*ngs-&gt;<a class="code" href="structngram__search__s.html#aa54544457c363ccccb87fc7ec63a5f3e">frm_wordlist</a>));</div><div class="line"><a name="l00154"></a><span class="lineno">  154</span>&#160;    ngs-&gt;min_ef_width = cmd_ln_int32_r(ps_search_config(ngs), <span class="stringliteral">&quot;-fwdflatefwid&quot;</span>);</div><div class="line"><a name="l00155"></a><span class="lineno">  155</span>&#160;    ngs-&gt;max_sf_win = cmd_ln_int32_r(ps_search_config(ngs), <span class="stringliteral">&quot;-fwdflatsfwin&quot;</span>);</div><div class="line"><a name="l00156"></a><span class="lineno">  156</span>&#160;    E_INFO(<span class="stringliteral">&quot;fwdflat: min_ef_width = %d, max_sf_win = %d\n&quot;</span>,</div><div class="line"><a name="l00157"></a><span class="lineno">  157</span>&#160;           ngs-&gt;min_ef_width, ngs-&gt;max_sf_win);</div><div class="line"><a name="l00158"></a><span class="lineno">  158</span>&#160;</div><div class="line"><a name="l00159"></a><span class="lineno">  159</span>&#160;    <span class="comment">/* No tree-search; pre-build the expansion list, including all LM words. */</span></div><div class="line"><a name="l00160"></a><span class="lineno">  160</span>&#160;    <span class="keywordflow">if</span> (!ngs-&gt;fwdtree) {</div><div class="line"><a name="l00161"></a><span class="lineno">  161</span>&#160;        <span class="comment">/* Build full expansion list from LM words. */</span></div><div class="line"><a name="l00162"></a><span class="lineno">  162</span>&#160;        ngram_fwdflat_expand_all(ngs);</div><div class="line"><a name="l00163"></a><span class="lineno">  163</span>&#160;        <span class="comment">/* Allocate single phone words. */</span></div><div class="line"><a name="l00164"></a><span class="lineno">  164</span>&#160;        ngram_fwdflat_allocate_1ph(ngs);</div><div class="line"><a name="l00165"></a><span class="lineno">  165</span>&#160;    }</div><div class="line"><a name="l00166"></a><span class="lineno">  166</span>&#160;}</div><div class="line"><a name="l00167"></a><span class="lineno">  167</span>&#160;</div><div class="line"><a name="l00168"></a><span class="lineno">  168</span>&#160;<span class="keywordtype">void</span></div><div class="line"><a name="l00169"></a><span class="lineno"><a class="line" href="ngram__search__fwdflat_8h.html#a8faf467f90162a7273b23304fc6e8586">  169</a></span>&#160;<a class="code" href="ngram__search__fwdflat_8c.html#a8faf467f90162a7273b23304fc6e8586">ngram_fwdflat_deinit</a>(<a class="code" href="structngram__search__s.html">ngram_search_t</a> *ngs)</div><div class="line"><a name="l00170"></a><span class="lineno">  170</span>&#160;{</div><div class="line"><a name="l00171"></a><span class="lineno">  171</span>&#160;    <span class="keywordtype">double</span> n_speech = (double)ngs-&gt;n_tot_frame</div><div class="line"><a name="l00172"></a><span class="lineno">  172</span>&#160;            / cmd_ln_int32_r(ps_search_config(ngs), <span class="stringliteral">&quot;-frate&quot;</span>);</div><div class="line"><a name="l00173"></a><span class="lineno">  173</span>&#160;</div><div class="line"><a name="l00174"></a><span class="lineno">  174</span>&#160;    E_INFO(<span class="stringliteral">&quot;TOTAL fwdflat %.2f CPU %.3f xRT\n&quot;</span>,</div><div class="line"><a name="l00175"></a><span class="lineno">  175</span>&#160;           ngs-&gt;fwdflat_perf.t_tot_cpu,</div><div class="line"><a name="l00176"></a><span class="lineno">  176</span>&#160;           ngs-&gt;fwdflat_perf.t_tot_cpu / n_speech);</div><div class="line"><a name="l00177"></a><span class="lineno">  177</span>&#160;    E_INFO(<span class="stringliteral">&quot;TOTAL fwdflat %.2f wall %.3f xRT\n&quot;</span>,</div><div class="line"><a name="l00178"></a><span class="lineno">  178</span>&#160;           ngs-&gt;fwdflat_perf.t_tot_elapsed,</div><div class="line"><a name="l00179"></a><span class="lineno">  179</span>&#160;           ngs-&gt;fwdflat_perf.t_tot_elapsed / n_speech);</div><div class="line"><a name="l00180"></a><span class="lineno">  180</span>&#160;</div><div class="line"><a name="l00181"></a><span class="lineno">  181</span>&#160;    <span class="comment">/* Free single-phone words if we allocated them. */</span></div><div class="line"><a name="l00182"></a><span class="lineno">  182</span>&#160;    <span class="keywordflow">if</span> (!ngs-&gt;fwdtree) {</div><div class="line"><a name="l00183"></a><span class="lineno">  183</span>&#160;        ngram_fwdflat_free_1ph(ngs);</div><div class="line"><a name="l00184"></a><span class="lineno">  184</span>&#160;    }</div><div class="line"><a name="l00185"></a><span class="lineno">  185</span>&#160;    ckd_free(ngs-&gt;<a class="code" href="structngram__search__s.html#a774f1640c5ece856f4bef98d98e7c959">fwdflat_wordlist</a>);</div><div class="line"><a name="l00186"></a><span class="lineno">  186</span>&#160;    bitvec_free(ngs-&gt;expand_word_flag);</div><div class="line"><a name="l00187"></a><span class="lineno">  187</span>&#160;    ckd_free(ngs-&gt;expand_word_list);</div><div class="line"><a name="l00188"></a><span class="lineno">  188</span>&#160;    ckd_free(ngs-&gt;<a class="code" href="structngram__search__s.html#aa54544457c363ccccb87fc7ec63a5f3e">frm_wordlist</a>);</div><div class="line"><a name="l00189"></a><span class="lineno">  189</span>&#160;}</div><div class="line"><a name="l00190"></a><span class="lineno">  190</span>&#160;</div><div class="line"><a name="l00191"></a><span class="lineno">  191</span>&#160;<span class="keywordtype">int</span></div><div class="line"><a name="l00192"></a><span class="lineno"><a class="line" href="ngram__search__fwdflat_8h.html#aa4879c06ddbc455a6f355084a9c574b4">  192</a></span>&#160;<a class="code" href="ngram__search__fwdflat_8c.html#aa4879c06ddbc455a6f355084a9c574b4">ngram_fwdflat_reinit</a>(<a class="code" href="structngram__search__s.html">ngram_search_t</a> *ngs)</div><div class="line"><a name="l00193"></a><span class="lineno">  193</span>&#160;{</div><div class="line"><a name="l00194"></a><span class="lineno">  194</span>&#160;    <span class="comment">/* Reallocate things that depend on the number of words. */</span></div><div class="line"><a name="l00195"></a><span class="lineno">  195</span>&#160;    <span class="keywordtype">int</span> n_words;</div><div class="line"><a name="l00196"></a><span class="lineno">  196</span>&#160;</div><div class="line"><a name="l00197"></a><span class="lineno">  197</span>&#160;    ckd_free(ngs-&gt;<a class="code" href="structngram__search__s.html#a774f1640c5ece856f4bef98d98e7c959">fwdflat_wordlist</a>);</div><div class="line"><a name="l00198"></a><span class="lineno">  198</span>&#160;    ckd_free(ngs-&gt;expand_word_list);</div><div class="line"><a name="l00199"></a><span class="lineno">  199</span>&#160;    bitvec_free(ngs-&gt;expand_word_flag);</div><div class="line"><a name="l00200"></a><span class="lineno">  200</span>&#160;    n_words = ps_search_n_words(ngs);</div><div class="line"><a name="l00201"></a><span class="lineno">  201</span>&#160;    ngs-&gt;<a class="code" href="structngram__search__s.html#a774f1640c5ece856f4bef98d98e7c959">fwdflat_wordlist</a> = ckd_calloc(n_words + 1, <span class="keyword">sizeof</span>(*ngs-&gt;<a class="code" href="structngram__search__s.html#a774f1640c5ece856f4bef98d98e7c959">fwdflat_wordlist</a>));</div><div class="line"><a name="l00202"></a><span class="lineno">  202</span>&#160;    ngs-&gt;expand_word_flag = bitvec_alloc(n_words);</div><div class="line"><a name="l00203"></a><span class="lineno">  203</span>&#160;    ngs-&gt;expand_word_list = ckd_calloc(n_words + 1, <span class="keyword">sizeof</span>(*ngs-&gt;expand_word_list));</div><div class="line"><a name="l00204"></a><span class="lineno">  204</span>&#160;    </div><div class="line"><a name="l00205"></a><span class="lineno">  205</span>&#160;    <span class="comment">/* No tree-search; take care of the expansion list and single phone words. */</span></div><div class="line"><a name="l00206"></a><span class="lineno">  206</span>&#160;    <span class="keywordflow">if</span> (!ngs-&gt;fwdtree) {</div><div class="line"><a name="l00207"></a><span class="lineno">  207</span>&#160;        <span class="comment">/* Free single-phone words. */</span></div><div class="line"><a name="l00208"></a><span class="lineno">  208</span>&#160;        ngram_fwdflat_free_1ph(ngs);</div><div class="line"><a name="l00209"></a><span class="lineno">  209</span>&#160;        <span class="comment">/* Reallocate word_chan. */</span></div><div class="line"><a name="l00210"></a><span class="lineno">  210</span>&#160;        ckd_free(ngs-&gt;<a class="code" href="structngram__search__s.html#a79deb7295a261cd82d2a6b48cb119e77">word_chan</a>);</div><div class="line"><a name="l00211"></a><span class="lineno">  211</span>&#160;        ngs-&gt;<a class="code" href="structngram__search__s.html#a79deb7295a261cd82d2a6b48cb119e77">word_chan</a> = ckd_calloc(<a class="code" href="dict_8h.html#a361b948b42f9cfdf5c7fa9dfc8a71a94">dict_size</a>(ps_search_dict(ngs)),</div><div class="line"><a name="l00212"></a><span class="lineno">  212</span>&#160;                                    <span class="keyword">sizeof</span>(*ngs-&gt;<a class="code" href="structngram__search__s.html#a79deb7295a261cd82d2a6b48cb119e77">word_chan</a>));</div><div class="line"><a name="l00213"></a><span class="lineno">  213</span>&#160;        <span class="comment">/* Rebuild full expansion list from LM words. */</span></div><div class="line"><a name="l00214"></a><span class="lineno">  214</span>&#160;        ngram_fwdflat_expand_all(ngs);</div><div class="line"><a name="l00215"></a><span class="lineno">  215</span>&#160;        <span class="comment">/* Allocate single phone words. */</span></div><div class="line"><a name="l00216"></a><span class="lineno">  216</span>&#160;        ngram_fwdflat_allocate_1ph(ngs);</div><div class="line"><a name="l00217"></a><span class="lineno">  217</span>&#160;    }</div><div class="line"><a name="l00218"></a><span class="lineno">  218</span>&#160;    <span class="comment">/* Otherwise there is nothing to do since the wordlist is</span></div><div class="line"><a name="l00219"></a><span class="lineno">  219</span>&#160;<span class="comment">     * generated anew every utterance. */</span></div><div class="line"><a name="l00220"></a><span class="lineno">  220</span>&#160;    <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l00221"></a><span class="lineno">  221</span>&#160;}</div><div class="line"><a name="l00222"></a><span class="lineno">  222</span>&#160;</div><div class="line"><a name="l00226"></a><span class="lineno">  226</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span></div><div class="line"><a name="l00227"></a><span class="lineno">  227</span>&#160;build_fwdflat_wordlist(<a class="code" href="structngram__search__s.html">ngram_search_t</a> *ngs)</div><div class="line"><a name="l00228"></a><span class="lineno">  228</span>&#160;{</div><div class="line"><a name="l00229"></a><span class="lineno">  229</span>&#160;    int32 i, f, sf, ef, wid, nwd;</div><div class="line"><a name="l00230"></a><span class="lineno">  230</span>&#160;    <a class="code" href="structbptbl__s.html">bptbl_t</a> *bp;</div><div class="line"><a name="l00231"></a><span class="lineno">  231</span>&#160;    <a class="code" href="structps__latnode__s.html">ps_latnode_t</a> *node, *prevnode, *nextnode;</div><div class="line"><a name="l00232"></a><span class="lineno">  232</span>&#160;</div><div class="line"><a name="l00233"></a><span class="lineno">  233</span>&#160;    <span class="comment">/* No tree-search, use statically allocated wordlist. */</span></div><div class="line"><a name="l00234"></a><span class="lineno">  234</span>&#160;    <span class="keywordflow">if</span> (!ngs-&gt;fwdtree)</div><div class="line"><a name="l00235"></a><span class="lineno">  235</span>&#160;        <span class="keywordflow">return</span>;</div><div class="line"><a name="l00236"></a><span class="lineno">  236</span>&#160;</div><div class="line"><a name="l00237"></a><span class="lineno">  237</span>&#160;    memset(ngs-&gt;<a class="code" href="structngram__search__s.html#aa54544457c363ccccb87fc7ec63a5f3e">frm_wordlist</a>, 0, ngs-&gt;<a class="code" href="structngram__search__s.html#a38ea5de504b3d7ad2390a3f8966d502f">n_frame_alloc</a> * <span class="keyword">sizeof</span>(*ngs-&gt;<a class="code" href="structngram__search__s.html#aa54544457c363ccccb87fc7ec63a5f3e">frm_wordlist</a>));</div><div class="line"><a name="l00238"></a><span class="lineno">  238</span>&#160;</div><div class="line"><a name="l00239"></a><span class="lineno">  239</span>&#160;    <span class="comment">/* Scan the backpointer table for all active words and record</span></div><div class="line"><a name="l00240"></a><span class="lineno">  240</span>&#160;<span class="comment">     * their exit frames. */</span></div><div class="line"><a name="l00241"></a><span class="lineno">  241</span>&#160;    <span class="keywordflow">for</span> (i = 0, bp = ngs-&gt;bp_table; i &lt; ngs-&gt;bpidx; i++, bp++) {</div><div class="line"><a name="l00242"></a><span class="lineno">  242</span>&#160;        sf = (bp-&gt;<a class="code" href="structbptbl__s.html#a4ca45ebc4a1ac18fc0596195e7e03bc8">bp</a> &lt; 0) ? 0 : ngs-&gt;bp_table[bp-&gt;<a class="code" href="structbptbl__s.html#a4ca45ebc4a1ac18fc0596195e7e03bc8">bp</a>].<a class="code" href="structbptbl__s.html#ae52081dde905cf6e7d988cdeb4c9b8b3">frame</a> + 1;</div><div class="line"><a name="l00243"></a><span class="lineno">  243</span>&#160;        ef = bp-&gt;<a class="code" href="structbptbl__s.html#ae52081dde905cf6e7d988cdeb4c9b8b3">frame</a>;</div><div class="line"><a name="l00244"></a><span class="lineno">  244</span>&#160;        wid = bp-&gt;<a class="code" href="structbptbl__s.html#a143ff0891fafd471000df7c73123b8a7">wid</a>;</div><div class="line"><a name="l00245"></a><span class="lineno">  245</span>&#160;</div><div class="line"><a name="l00246"></a><span class="lineno">  246</span>&#160;        <span class="comment">/* Anything that can be transitioned to in the LM can go in</span></div><div class="line"><a name="l00247"></a><span class="lineno">  247</span>&#160;<span class="comment">         * the word list. */</span></div><div class="line"><a name="l00248"></a><span class="lineno">  248</span>&#160;        if (!ngram_model_set_known_wid(ngs-&gt;<a class="code" href="structngram__search__s.html#a6127a6d8fb53832e67456c11aa6ad9c4">lmset</a>,</div><div class="line"><a name="l00249"></a><span class="lineno">  249</span>&#160;                                       dict_basewid(ps_search_dict(ngs), wid)))</div><div class="line"><a name="l00250"></a><span class="lineno">  250</span>&#160;            <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00251"></a><span class="lineno">  251</span>&#160;</div><div class="line"><a name="l00252"></a><span class="lineno">  252</span>&#160;        <span class="comment">/* Look for it in the wordlist. */</span></div><div class="line"><a name="l00253"></a><span class="lineno">  253</span>&#160;        <span class="keywordflow">for</span> (node = ngs-&gt;<a class="code" href="structngram__search__s.html#aa54544457c363ccccb87fc7ec63a5f3e">frm_wordlist</a>[sf]; node &amp;&amp; (node-&gt;<a class="code" href="structps__latnode__s.html#afd85dbd410d6e6d970c73088bc6fb97e">wid</a> != wid);</div><div class="line"><a name="l00254"></a><span class="lineno">  254</span>&#160;             node = node-&gt;<a class="code" href="structps__latnode__s.html#aca6f3d543a1712a1ca3bb8ec60f71c84">next</a>);</div><div class="line"><a name="l00255"></a><span class="lineno">  255</span>&#160;</div><div class="line"><a name="l00256"></a><span class="lineno">  256</span>&#160;        <span class="comment">/* Update last end frame. */</span></div><div class="line"><a name="l00257"></a><span class="lineno">  257</span>&#160;        <span class="keywordflow">if</span> (node)</div><div class="line"><a name="l00258"></a><span class="lineno">  258</span>&#160;            node-&gt;<a class="code" href="structps__latnode__s.html#a5c7b9114d131151d6ce85228ea9f829d">lef</a> = ef;</div><div class="line"><a name="l00259"></a><span class="lineno">  259</span>&#160;        <span class="keywordflow">else</span> {</div><div class="line"><a name="l00260"></a><span class="lineno">  260</span>&#160;            <span class="comment">/* New node; link to head of list */</span></div><div class="line"><a name="l00261"></a><span class="lineno">  261</span>&#160;            node = listelem_malloc(ngs-&gt;<a class="code" href="structngram__search__s.html#a21600dc2e23744f0be9c64a4db8d7e50">latnode_alloc</a>);</div><div class="line"><a name="l00262"></a><span class="lineno">  262</span>&#160;            node-&gt;<a class="code" href="structps__latnode__s.html#afd85dbd410d6e6d970c73088bc6fb97e">wid</a> = wid;</div><div class="line"><a name="l00263"></a><span class="lineno">  263</span>&#160;            node-&gt;<a class="code" href="structps__latnode__s.html#a584ee5a303355d851ac903718998df14">fef</a> = node-&gt;<a class="code" href="structps__latnode__s.html#a5c7b9114d131151d6ce85228ea9f829d">lef</a> = ef;</div><div class="line"><a name="l00264"></a><span class="lineno">  264</span>&#160;</div><div class="line"><a name="l00265"></a><span class="lineno">  265</span>&#160;            node-&gt;<a class="code" href="structps__latnode__s.html#aca6f3d543a1712a1ca3bb8ec60f71c84">next</a> = ngs-&gt;<a class="code" href="structngram__search__s.html#aa54544457c363ccccb87fc7ec63a5f3e">frm_wordlist</a>[sf];</div><div class="line"><a name="l00266"></a><span class="lineno">  266</span>&#160;            ngs-&gt;<a class="code" href="structngram__search__s.html#aa54544457c363ccccb87fc7ec63a5f3e">frm_wordlist</a>[sf] = node;</div><div class="line"><a name="l00267"></a><span class="lineno">  267</span>&#160;        }</div><div class="line"><a name="l00268"></a><span class="lineno">  268</span>&#160;    }</div><div class="line"><a name="l00269"></a><span class="lineno">  269</span>&#160;</div><div class="line"><a name="l00270"></a><span class="lineno">  270</span>&#160;    <span class="comment">/* Eliminate &quot;unlikely&quot; words, for which there are too few end points */</span></div><div class="line"><a name="l00271"></a><span class="lineno">  271</span>&#160;    <span class="keywordflow">for</span> (f = 0; f &lt; ngs-&gt;<a class="code" href="structngram__search__s.html#a5255e56d28c239a4e1d9b1721e8a2f8d">n_frame</a>; f++) {</div><div class="line"><a name="l00272"></a><span class="lineno">  272</span>&#160;        prevnode = NULL;</div><div class="line"><a name="l00273"></a><span class="lineno">  273</span>&#160;        <span class="keywordflow">for</span> (node = ngs-&gt;<a class="code" href="structngram__search__s.html#aa54544457c363ccccb87fc7ec63a5f3e">frm_wordlist</a>[f]; node; node = nextnode) {</div><div class="line"><a name="l00274"></a><span class="lineno">  274</span>&#160;            nextnode = node-&gt;<a class="code" href="structps__latnode__s.html#aca6f3d543a1712a1ca3bb8ec60f71c84">next</a>;</div><div class="line"><a name="l00275"></a><span class="lineno">  275</span>&#160;            <span class="comment">/* Word has too few endpoints */</span></div><div class="line"><a name="l00276"></a><span class="lineno">  276</span>&#160;            <span class="keywordflow">if</span> ((node-&gt;<a class="code" href="structps__latnode__s.html#a5c7b9114d131151d6ce85228ea9f829d">lef</a> - node-&gt;<a class="code" href="structps__latnode__s.html#a584ee5a303355d851ac903718998df14">fef</a> &lt; ngs-&gt;min_ef_width) ||</div><div class="line"><a name="l00277"></a><span class="lineno">  277</span>&#160;                <span class="comment">/* Word is &lt;/s&gt; and doesn&#39;t actually end in last frame */</span></div><div class="line"><a name="l00278"></a><span class="lineno">  278</span>&#160;                ((node-&gt;<a class="code" href="structps__latnode__s.html#afd85dbd410d6e6d970c73088bc6fb97e">wid</a> == ps_search_finish_wid(ngs)) &amp;&amp; (node-&gt;<a class="code" href="structps__latnode__s.html#a5c7b9114d131151d6ce85228ea9f829d">lef</a> &lt; ngs-&gt;<a class="code" href="structngram__search__s.html#a5255e56d28c239a4e1d9b1721e8a2f8d">n_frame</a> - 1))) {</div><div class="line"><a name="l00279"></a><span class="lineno">  279</span>&#160;                <span class="keywordflow">if</span> (!prevnode)</div><div class="line"><a name="l00280"></a><span class="lineno">  280</span>&#160;                    ngs-&gt;<a class="code" href="structngram__search__s.html#aa54544457c363ccccb87fc7ec63a5f3e">frm_wordlist</a>[f] = nextnode;</div><div class="line"><a name="l00281"></a><span class="lineno">  281</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l00282"></a><span class="lineno">  282</span>&#160;                    prevnode-&gt;<a class="code" href="structps__latnode__s.html#aca6f3d543a1712a1ca3bb8ec60f71c84">next</a> = nextnode;</div><div class="line"><a name="l00283"></a><span class="lineno">  283</span>&#160;                listelem_free(ngs-&gt;<a class="code" href="structngram__search__s.html#a21600dc2e23744f0be9c64a4db8d7e50">latnode_alloc</a>, node);</div><div class="line"><a name="l00284"></a><span class="lineno">  284</span>&#160;            }</div><div class="line"><a name="l00285"></a><span class="lineno">  285</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l00286"></a><span class="lineno">  286</span>&#160;                prevnode = node;</div><div class="line"><a name="l00287"></a><span class="lineno">  287</span>&#160;        }</div><div class="line"><a name="l00288"></a><span class="lineno">  288</span>&#160;    }</div><div class="line"><a name="l00289"></a><span class="lineno">  289</span>&#160;</div><div class="line"><a name="l00290"></a><span class="lineno">  290</span>&#160;    <span class="comment">/* Form overall wordlist for 2nd pass */</span></div><div class="line"><a name="l00291"></a><span class="lineno">  291</span>&#160;    nwd = 0;</div><div class="line"><a name="l00292"></a><span class="lineno">  292</span>&#160;    bitvec_clear_all(ngs-&gt;<a class="code" href="structngram__search__s.html#aeb4c98851bf9b239ca607ca59f59ff4c">word_active</a>, ps_search_n_words(ngs));</div><div class="line"><a name="l00293"></a><span class="lineno">  293</span>&#160;    <span class="keywordflow">for</span> (f = 0; f &lt; ngs-&gt;<a class="code" href="structngram__search__s.html#a5255e56d28c239a4e1d9b1721e8a2f8d">n_frame</a>; f++) {</div><div class="line"><a name="l00294"></a><span class="lineno">  294</span>&#160;        <span class="keywordflow">for</span> (node = ngs-&gt;<a class="code" href="structngram__search__s.html#aa54544457c363ccccb87fc7ec63a5f3e">frm_wordlist</a>[f]; node; node = node-&gt;<a class="code" href="structps__latnode__s.html#aca6f3d543a1712a1ca3bb8ec60f71c84">next</a>) {</div><div class="line"><a name="l00295"></a><span class="lineno">  295</span>&#160;            <span class="keywordflow">if</span> (!bitvec_is_set(ngs-&gt;<a class="code" href="structngram__search__s.html#aeb4c98851bf9b239ca607ca59f59ff4c">word_active</a>, node-&gt;<a class="code" href="structps__latnode__s.html#afd85dbd410d6e6d970c73088bc6fb97e">wid</a>)) {</div><div class="line"><a name="l00296"></a><span class="lineno">  296</span>&#160;                bitvec_set(ngs-&gt;<a class="code" href="structngram__search__s.html#aeb4c98851bf9b239ca607ca59f59ff4c">word_active</a>, node-&gt;<a class="code" href="structps__latnode__s.html#afd85dbd410d6e6d970c73088bc6fb97e">wid</a>);</div><div class="line"><a name="l00297"></a><span class="lineno">  297</span>&#160;                ngs-&gt;<a class="code" href="structngram__search__s.html#a774f1640c5ece856f4bef98d98e7c959">fwdflat_wordlist</a>[nwd++] = node-&gt;<a class="code" href="structps__latnode__s.html#afd85dbd410d6e6d970c73088bc6fb97e">wid</a>;</div><div class="line"><a name="l00298"></a><span class="lineno">  298</span>&#160;            }</div><div class="line"><a name="l00299"></a><span class="lineno">  299</span>&#160;        }</div><div class="line"><a name="l00300"></a><span class="lineno">  300</span>&#160;    }</div><div class="line"><a name="l00301"></a><span class="lineno">  301</span>&#160;    ngs-&gt;<a class="code" href="structngram__search__s.html#a774f1640c5ece856f4bef98d98e7c959">fwdflat_wordlist</a>[nwd] = -1;</div><div class="line"><a name="l00302"></a><span class="lineno">  302</span>&#160;    E_INFO(<span class="stringliteral">&quot;Utterance vocabulary contains %d words\n&quot;</span>, nwd);</div><div class="line"><a name="l00303"></a><span class="lineno">  303</span>&#160;}</div><div class="line"><a name="l00304"></a><span class="lineno">  304</span>&#160;</div><div class="line"><a name="l00308"></a><span class="lineno">  308</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span></div><div class="line"><a name="l00309"></a><span class="lineno">  309</span>&#160;build_fwdflat_chan(<a class="code" href="structngram__search__s.html">ngram_search_t</a> *ngs)</div><div class="line"><a name="l00310"></a><span class="lineno">  310</span>&#160;{</div><div class="line"><a name="l00311"></a><span class="lineno">  311</span>&#160;    int32 i, wid, p;</div><div class="line"><a name="l00312"></a><span class="lineno">  312</span>&#160;    <a class="code" href="structroot__chan__s.html">root_chan_t</a> *rhmm;</div><div class="line"><a name="l00313"></a><span class="lineno">  313</span>&#160;    <a class="code" href="structchan__s.html">chan_t</a> *hmm, *prevhmm;</div><div class="line"><a name="l00314"></a><span class="lineno">  314</span>&#160;    <a class="code" href="structdict__t.html">dict_t</a> *dict;</div><div class="line"><a name="l00315"></a><span class="lineno">  315</span>&#160;    <a class="code" href="structdict2pid__t.html">dict2pid_t</a> *d2p;</div><div class="line"><a name="l00316"></a><span class="lineno">  316</span>&#160;</div><div class="line"><a name="l00317"></a><span class="lineno">  317</span>&#160;    dict = ps_search_dict(ngs);</div><div class="line"><a name="l00318"></a><span class="lineno">  318</span>&#160;    d2p = ps_search_dict2pid(ngs);</div><div class="line"><a name="l00319"></a><span class="lineno">  319</span>&#160;</div><div class="line"><a name="l00320"></a><span class="lineno">  320</span>&#160;    <span class="comment">/* Build word HMMs for each word in the lattice. */</span></div><div class="line"><a name="l00321"></a><span class="lineno">  321</span>&#160;    <span class="keywordflow">for</span> (i = 0; ngs-&gt;<a class="code" href="structngram__search__s.html#a774f1640c5ece856f4bef98d98e7c959">fwdflat_wordlist</a>[i] &gt;= 0; i++) {</div><div class="line"><a name="l00322"></a><span class="lineno">  322</span>&#160;        wid = ngs-&gt;<a class="code" href="structngram__search__s.html#a774f1640c5ece856f4bef98d98e7c959">fwdflat_wordlist</a>[i];</div><div class="line"><a name="l00323"></a><span class="lineno">  323</span>&#160;</div><div class="line"><a name="l00324"></a><span class="lineno">  324</span>&#160;        <span class="comment">/* Single-phone words are permanently allocated */</span></div><div class="line"><a name="l00325"></a><span class="lineno">  325</span>&#160;        <span class="keywordflow">if</span> (dict_is_single_phone(dict, wid))</div><div class="line"><a name="l00326"></a><span class="lineno">  326</span>&#160;            <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00327"></a><span class="lineno">  327</span>&#160;</div><div class="line"><a name="l00328"></a><span class="lineno">  328</span>&#160;        assert(ngs-&gt;<a class="code" href="structngram__search__s.html#a79deb7295a261cd82d2a6b48cb119e77">word_chan</a>[wid] == NULL);</div><div class="line"><a name="l00329"></a><span class="lineno">  329</span>&#160;</div><div class="line"><a name="l00330"></a><span class="lineno">  330</span>&#160;        <span class="comment">/* Multiplex root HMM for first phone (one root per word, flat</span></div><div class="line"><a name="l00331"></a><span class="lineno">  331</span>&#160;<span class="comment">         * lexicon).  diphone is irrelevant here, for the time being,</span></div><div class="line"><a name="l00332"></a><span class="lineno">  332</span>&#160;<span class="comment">         * at least. */</span></div><div class="line"><a name="l00333"></a><span class="lineno">  333</span>&#160;        rhmm = listelem_malloc(ngs-&gt;<a class="code" href="structngram__search__s.html#a576470858bfa44c671f0e677902ab424">root_chan_alloc</a>);</div><div class="line"><a name="l00334"></a><span class="lineno">  334</span>&#160;        rhmm-&gt;<a class="code" href="structroot__chan__s.html#a0c0cf22caf4c97879af86865764f1675">ci2phone</a> = dict_second_phone(dict, wid);</div><div class="line"><a name="l00335"></a><span class="lineno">  335</span>&#160;        rhmm-&gt;<a class="code" href="structroot__chan__s.html#ad67c37bf4183f518acd7760c09a806f6">ciphone</a> = dict_first_phone(dict, wid);</div><div class="line"><a name="l00336"></a><span class="lineno">  336</span>&#160;        rhmm-&gt;<a class="code" href="structroot__chan__s.html#ae0f0b90a7cb2fcb54cd7b30502dd497e">next</a> = NULL;</div><div class="line"><a name="l00337"></a><span class="lineno">  337</span>&#160;        <a class="code" href="hmm_8h.html#aa911ae0d1c0eba562692fbeebca90d78">hmm_init</a>(ngs-&gt;<a class="code" href="structngram__search__s.html#acfbdd34e3dadbaa384818402f1dd59bf">hmmctx</a>, &amp;rhmm-&gt;<a class="code" href="structroot__chan__s.html#a9d4d92ffa8b4079202ddebe3ba0eb290">hmm</a>, TRUE,</div><div class="line"><a name="l00338"></a><span class="lineno">  338</span>&#160;                 bin_mdef_pid2ssid(ps_search_acmod(ngs)-&gt;mdef, rhmm-&gt;<a class="code" href="structroot__chan__s.html#ad67c37bf4183f518acd7760c09a806f6">ciphone</a>),</div><div class="line"><a name="l00339"></a><span class="lineno">  339</span>&#160;                 bin_mdef_pid2tmatid(ps_search_acmod(ngs)-&gt;mdef, rhmm-&gt;<a class="code" href="structroot__chan__s.html#ad67c37bf4183f518acd7760c09a806f6">ciphone</a>));</div><div class="line"><a name="l00340"></a><span class="lineno">  340</span>&#160;</div><div class="line"><a name="l00341"></a><span class="lineno">  341</span>&#160;        <span class="comment">/* HMMs for word-internal phones */</span></div><div class="line"><a name="l00342"></a><span class="lineno">  342</span>&#160;        prevhmm = NULL;</div><div class="line"><a name="l00343"></a><span class="lineno">  343</span>&#160;        <span class="keywordflow">for</span> (p = 1; p &lt; dict_pronlen(dict, wid) - 1; p++) {</div><div class="line"><a name="l00344"></a><span class="lineno">  344</span>&#160;            hmm = listelem_malloc(ngs-&gt;<a class="code" href="structngram__search__s.html#abe9fe60f6e48b9a6e3d41856bb1dc109">chan_alloc</a>);</div><div class="line"><a name="l00345"></a><span class="lineno">  345</span>&#160;            hmm-&gt;<a class="code" href="structchan__s.html#a33da51d8524073abc792519d0738ca0b">ciphone</a> = <a class="code" href="dict_8h.html#a8785ab6264a5c6cf0b8da6bf79a46de4">dict_pron</a>(dict, wid, p);</div><div class="line"><a name="l00346"></a><span class="lineno">  346</span>&#160;            hmm-&gt;info.<a class="code" href="structchan__s.html#acf84a2fa662e7ff626769e7d8152a608">rc_id</a> = (p == dict_pronlen(dict, wid) - 1) ? 0 : -1;</div><div class="line"><a name="l00347"></a><span class="lineno">  347</span>&#160;            hmm-&gt;<a class="code" href="structchan__s.html#a260b68eff64150d0ae9ce4db7feb1300">next</a> = NULL;</div><div class="line"><a name="l00348"></a><span class="lineno">  348</span>&#160;            <a class="code" href="hmm_8h.html#aa911ae0d1c0eba562692fbeebca90d78">hmm_init</a>(ngs-&gt;<a class="code" href="structngram__search__s.html#acfbdd34e3dadbaa384818402f1dd59bf">hmmctx</a>, &amp;hmm-&gt;<a class="code" href="structchan__s.html#a742d6a125ac468b95a1ddd880a956e35">hmm</a>, FALSE,</div><div class="line"><a name="l00349"></a><span class="lineno">  349</span>&#160;                     <a class="code" href="dict2pid_8c.html#a720e15c92ef6930e722bccb014e11b7b">dict2pid_internal</a>(d2p,wid,p), </div><div class="line"><a name="l00350"></a><span class="lineno">  350</span>&#160;                     bin_mdef_pid2tmatid(ps_search_acmod(ngs)-&gt;mdef, hmm-&gt;<a class="code" href="structchan__s.html#a33da51d8524073abc792519d0738ca0b">ciphone</a>));</div><div class="line"><a name="l00351"></a><span class="lineno">  351</span>&#160;</div><div class="line"><a name="l00352"></a><span class="lineno">  352</span>&#160;            <span class="keywordflow">if</span> (prevhmm)</div><div class="line"><a name="l00353"></a><span class="lineno">  353</span>&#160;                prevhmm-&gt;<a class="code" href="structchan__s.html#a260b68eff64150d0ae9ce4db7feb1300">next</a> = hmm;</div><div class="line"><a name="l00354"></a><span class="lineno">  354</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l00355"></a><span class="lineno">  355</span>&#160;                rhmm-&gt;<a class="code" href="structroot__chan__s.html#ae0f0b90a7cb2fcb54cd7b30502dd497e">next</a> = hmm;</div><div class="line"><a name="l00356"></a><span class="lineno">  356</span>&#160;</div><div class="line"><a name="l00357"></a><span class="lineno">  357</span>&#160;            prevhmm = hmm;</div><div class="line"><a name="l00358"></a><span class="lineno">  358</span>&#160;        }</div><div class="line"><a name="l00359"></a><span class="lineno">  359</span>&#160;</div><div class="line"><a name="l00360"></a><span class="lineno">  360</span>&#160;        <span class="comment">/* Right-context phones */</span></div><div class="line"><a name="l00361"></a><span class="lineno">  361</span>&#160;        <a class="code" href="ngram__search_8c.html#a1ddcc1a9cb3e164ceb2140097ed23a3e">ngram_search_alloc_all_rc</a>(ngs, wid);</div><div class="line"><a name="l00362"></a><span class="lineno">  362</span>&#160;</div><div class="line"><a name="l00363"></a><span class="lineno">  363</span>&#160;        <span class="comment">/* Link in just allocated right-context phones */</span></div><div class="line"><a name="l00364"></a><span class="lineno">  364</span>&#160;        <span class="keywordflow">if</span> (prevhmm)</div><div class="line"><a name="l00365"></a><span class="lineno">  365</span>&#160;            prevhmm-&gt;<a class="code" href="structchan__s.html#a260b68eff64150d0ae9ce4db7feb1300">next</a> = ngs-&gt;<a class="code" href="structngram__search__s.html#a79deb7295a261cd82d2a6b48cb119e77">word_chan</a>[wid];</div><div class="line"><a name="l00366"></a><span class="lineno">  366</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l00367"></a><span class="lineno">  367</span>&#160;            rhmm-&gt;<a class="code" href="structroot__chan__s.html#ae0f0b90a7cb2fcb54cd7b30502dd497e">next</a> = ngs-&gt;<a class="code" href="structngram__search__s.html#a79deb7295a261cd82d2a6b48cb119e77">word_chan</a>[wid];</div><div class="line"><a name="l00368"></a><span class="lineno">  368</span>&#160;        ngs-&gt;<a class="code" href="structngram__search__s.html#a79deb7295a261cd82d2a6b48cb119e77">word_chan</a>[wid] = (<a class="code" href="structchan__s.html">chan_t</a> *) rhmm;</div><div class="line"><a name="l00369"></a><span class="lineno">  369</span>&#160;    }</div><div class="line"><a name="l00370"></a><span class="lineno">  370</span>&#160;</div><div class="line"><a name="l00371"></a><span class="lineno">  371</span>&#160;}</div><div class="line"><a name="l00372"></a><span class="lineno">  372</span>&#160;</div><div class="line"><a name="l00373"></a><span class="lineno">  373</span>&#160;<span class="keywordtype">void</span></div><div class="line"><a name="l00374"></a><span class="lineno"><a class="line" href="ngram__search__fwdflat_8h.html#a763c2c7aaa5d7f9c5107af73552a2149">  374</a></span>&#160;<a class="code" href="ngram__search__fwdflat_8c.html#a763c2c7aaa5d7f9c5107af73552a2149">ngram_fwdflat_start</a>(<a class="code" href="structngram__search__s.html">ngram_search_t</a> *ngs)</div><div class="line"><a name="l00375"></a><span class="lineno">  375</span>&#160;{</div><div class="line"><a name="l00376"></a><span class="lineno">  376</span>&#160;    <a class="code" href="structroot__chan__s.html">root_chan_t</a> *rhmm;</div><div class="line"><a name="l00377"></a><span class="lineno">  377</span>&#160;    <span class="keywordtype">int</span> i;</div><div class="line"><a name="l00378"></a><span class="lineno">  378</span>&#160;</div><div class="line"><a name="l00379"></a><span class="lineno">  379</span>&#160;    ptmr_reset(&amp;ngs-&gt;fwdflat_perf);</div><div class="line"><a name="l00380"></a><span class="lineno">  380</span>&#160;    ptmr_start(&amp;ngs-&gt;fwdflat_perf);</div><div class="line"><a name="l00381"></a><span class="lineno">  381</span>&#160;    build_fwdflat_wordlist(ngs);</div><div class="line"><a name="l00382"></a><span class="lineno">  382</span>&#160;    build_fwdflat_chan(ngs);</div><div class="line"><a name="l00383"></a><span class="lineno">  383</span>&#160;</div><div class="line"><a name="l00384"></a><span class="lineno">  384</span>&#160;    ngs-&gt;bpidx = 0;</div><div class="line"><a name="l00385"></a><span class="lineno">  385</span>&#160;    ngs-&gt;bss_head = 0;</div><div class="line"><a name="l00386"></a><span class="lineno">  386</span>&#160;</div><div class="line"><a name="l00387"></a><span class="lineno">  387</span>&#160;    <span class="keywordflow">for</span> (i = 0; i &lt; ps_search_n_words(ngs); i++)</div><div class="line"><a name="l00388"></a><span class="lineno">  388</span>&#160;        ngs-&gt;word_lat_idx[i] = NO_BP;</div><div class="line"><a name="l00389"></a><span class="lineno">  389</span>&#160;</div><div class="line"><a name="l00390"></a><span class="lineno">  390</span>&#160;    <span class="comment">/* Reset the permanently allocated single-phone words, since they</span></div><div class="line"><a name="l00391"></a><span class="lineno">  391</span>&#160;<span class="comment">     * may have junk left over in them from previous searches. */</span></div><div class="line"><a name="l00392"></a><span class="lineno">  392</span>&#160;    for (i = 0; i &lt; ngs-&gt;<a class="code" href="structngram__search__s.html#a9168184c862d6f63bd7926e6581b25d9">n_1ph_words</a>; i++) {</div><div class="line"><a name="l00393"></a><span class="lineno">  393</span>&#160;        int32 w = ngs-&gt;<a class="code" href="structngram__search__s.html#a1157923e0060b947e05caa819c8abe2c">single_phone_wid</a>[i];</div><div class="line"><a name="l00394"></a><span class="lineno">  394</span>&#160;        rhmm = (<a class="code" href="structroot__chan__s.html">root_chan_t</a> *) ngs-&gt;<a class="code" href="structngram__search__s.html#a79deb7295a261cd82d2a6b48cb119e77">word_chan</a>[w];</div><div class="line"><a name="l00395"></a><span class="lineno">  395</span>&#160;        <a class="code" href="hmm_8h.html#af4c0cefb23087a0b1731b34048cfdaf9">hmm_clear</a>(&amp;rhmm-&gt;<a class="code" href="structroot__chan__s.html#a9d4d92ffa8b4079202ddebe3ba0eb290">hmm</a>);</div><div class="line"><a name="l00396"></a><span class="lineno">  396</span>&#160;    }</div><div class="line"><a name="l00397"></a><span class="lineno">  397</span>&#160;</div><div class="line"><a name="l00398"></a><span class="lineno">  398</span>&#160;    <span class="comment">/* Start search with &lt;s&gt;; word_chan[&lt;s&gt;] is permanently allocated */</span></div><div class="line"><a name="l00399"></a><span class="lineno">  399</span>&#160;    rhmm = (<a class="code" href="structroot__chan__s.html">root_chan_t</a> *) ngs-&gt;<a class="code" href="structngram__search__s.html#a79deb7295a261cd82d2a6b48cb119e77">word_chan</a>[ps_search_start_wid(ngs)];</div><div class="line"><a name="l00400"></a><span class="lineno">  400</span>&#160;    <a class="code" href="hmm_8h.html#a7285d01d533996d750c78e0d96042716">hmm_enter</a>(&amp;rhmm-&gt;<a class="code" href="structroot__chan__s.html#a9d4d92ffa8b4079202ddebe3ba0eb290">hmm</a>, 0, NO_BP, 0);</div><div class="line"><a name="l00401"></a><span class="lineno">  401</span>&#160;    ngs-&gt;<a class="code" href="structngram__search__s.html#a5056573bf95990cc28c97a56cd76ce9a">active_word_list</a>[0][0] = ps_search_start_wid(ngs);</div><div class="line"><a name="l00402"></a><span class="lineno">  402</span>&#160;    ngs-&gt;<a class="code" href="structngram__search__s.html#a5c864f1fe331fc95c04e0d87a5bdf9ee">n_active_word</a>[0] = 1;</div><div class="line"><a name="l00403"></a><span class="lineno">  403</span>&#160;</div><div class="line"><a name="l00404"></a><span class="lineno">  404</span>&#160;    ngs-&gt;<a class="code" href="structngram__search__s.html#a150d99157e2f37a6f0dbb4b02682d9c3">best_score</a> = 0;</div><div class="line"><a name="l00405"></a><span class="lineno">  405</span>&#160;    ngs-&gt;renormalized = FALSE;</div><div class="line"><a name="l00406"></a><span class="lineno">  406</span>&#160;</div><div class="line"><a name="l00407"></a><span class="lineno">  407</span>&#160;    <span class="keywordflow">for</span> (i = 0; i &lt; ps_search_n_words(ngs); i++)</div><div class="line"><a name="l00408"></a><span class="lineno">  408</span>&#160;        ngs-&gt;last_ltrans[i].sf = -1;</div><div class="line"><a name="l00409"></a><span class="lineno">  409</span>&#160;</div><div class="line"><a name="l00410"></a><span class="lineno">  410</span>&#160;    if (!ngs-&gt;fwdtree)</div><div class="line"><a name="l00411"></a><span class="lineno">  411</span>&#160;        ngs-&gt;<a class="code" href="structngram__search__s.html#a5255e56d28c239a4e1d9b1721e8a2f8d">n_frame</a> = 0;</div><div class="line"><a name="l00412"></a><span class="lineno">  412</span>&#160;</div><div class="line"><a name="l00413"></a><span class="lineno">  413</span>&#160;    ngs-&gt;<a class="code" href="structngram__search__s.html#a5758d167fbb48e824a6a58186620e06d">st</a>.n_fwdflat_chan = 0;</div><div class="line"><a name="l00414"></a><span class="lineno">  414</span>&#160;    ngs-&gt;<a class="code" href="structngram__search__s.html#a5758d167fbb48e824a6a58186620e06d">st</a>.n_fwdflat_words = 0;</div><div class="line"><a name="l00415"></a><span class="lineno">  415</span>&#160;    ngs-&gt;<a class="code" href="structngram__search__s.html#a5758d167fbb48e824a6a58186620e06d">st</a>.n_fwdflat_word_transition = 0;</div><div class="line"><a name="l00416"></a><span class="lineno">  416</span>&#160;    ngs-&gt;<a class="code" href="structngram__search__s.html#a5758d167fbb48e824a6a58186620e06d">st</a>.n_senone_active_utt = 0;</div><div class="line"><a name="l00417"></a><span class="lineno">  417</span>&#160;}</div><div class="line"><a name="l00418"></a><span class="lineno">  418</span>&#160;</div><div class="line"><a name="l00419"></a><span class="lineno">  419</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span></div><div class="line"><a name="l00420"></a><span class="lineno">  420</span>&#160;compute_fwdflat_sen_active(<a class="code" href="structngram__search__s.html">ngram_search_t</a> *ngs, <span class="keywordtype">int</span> frame_idx)</div><div class="line"><a name="l00421"></a><span class="lineno">  421</span>&#160;{</div><div class="line"><a name="l00422"></a><span class="lineno">  422</span>&#160;    int32 i, nw, w;</div><div class="line"><a name="l00423"></a><span class="lineno">  423</span>&#160;    int32 *awl;</div><div class="line"><a name="l00424"></a><span class="lineno">  424</span>&#160;    <a class="code" href="structroot__chan__s.html">root_chan_t</a> *rhmm;</div><div class="line"><a name="l00425"></a><span class="lineno">  425</span>&#160;    <a class="code" href="structchan__s.html">chan_t</a> *hmm;</div><div class="line"><a name="l00426"></a><span class="lineno">  426</span>&#160;</div><div class="line"><a name="l00427"></a><span class="lineno">  427</span>&#160;    <a class="code" href="acmod_8c.html#aed43f033f434e34fd90c975909d81cb2">acmod_clear_active</a>(ps_search_acmod(ngs));</div><div class="line"><a name="l00428"></a><span class="lineno">  428</span>&#160;</div><div class="line"><a name="l00429"></a><span class="lineno">  429</span>&#160;    nw = ngs-&gt;<a class="code" href="structngram__search__s.html#a5c864f1fe331fc95c04e0d87a5bdf9ee">n_active_word</a>[frame_idx &amp; 0x1];</div><div class="line"><a name="l00430"></a><span class="lineno">  430</span>&#160;    awl = ngs-&gt;<a class="code" href="structngram__search__s.html#a5056573bf95990cc28c97a56cd76ce9a">active_word_list</a>[frame_idx &amp; 0x1];</div><div class="line"><a name="l00431"></a><span class="lineno">  431</span>&#160;</div><div class="line"><a name="l00432"></a><span class="lineno">  432</span>&#160;    <span class="keywordflow">for</span> (i = 0; i &lt; nw; i++) {</div><div class="line"><a name="l00433"></a><span class="lineno">  433</span>&#160;        w = *(awl++);</div><div class="line"><a name="l00434"></a><span class="lineno">  434</span>&#160;        rhmm = (<a class="code" href="structroot__chan__s.html">root_chan_t</a> *)ngs-&gt;<a class="code" href="structngram__search__s.html#a79deb7295a261cd82d2a6b48cb119e77">word_chan</a>[w];</div><div class="line"><a name="l00435"></a><span class="lineno">  435</span>&#160;        if (hmm_frame(&amp;rhmm-&gt;<a class="code" href="structroot__chan__s.html#a9d4d92ffa8b4079202ddebe3ba0eb290">hmm</a>) == frame_idx) {</div><div class="line"><a name="l00436"></a><span class="lineno">  436</span>&#160;            <a class="code" href="acmod_8c.html#a2a7f67d462279b2bc4774c7967ae61c7">acmod_activate_hmm</a>(ps_search_acmod(ngs), &amp;rhmm-&gt;<a class="code" href="structroot__chan__s.html#a9d4d92ffa8b4079202ddebe3ba0eb290">hmm</a>);</div><div class="line"><a name="l00437"></a><span class="lineno">  437</span>&#160;        }</div><div class="line"><a name="l00438"></a><span class="lineno">  438</span>&#160;</div><div class="line"><a name="l00439"></a><span class="lineno">  439</span>&#160;        <span class="keywordflow">for</span> (hmm = rhmm-&gt;<a class="code" href="structroot__chan__s.html#ae0f0b90a7cb2fcb54cd7b30502dd497e">next</a>; hmm; hmm = hmm-&gt;<a class="code" href="structchan__s.html#a260b68eff64150d0ae9ce4db7feb1300">next</a>) {</div><div class="line"><a name="l00440"></a><span class="lineno">  440</span>&#160;            <span class="keywordflow">if</span> (hmm_frame(&amp;hmm-&gt;<a class="code" href="structchan__s.html#a742d6a125ac468b95a1ddd880a956e35">hmm</a>) == frame_idx) {</div><div class="line"><a name="l00441"></a><span class="lineno">  441</span>&#160;                <a class="code" href="acmod_8c.html#a2a7f67d462279b2bc4774c7967ae61c7">acmod_activate_hmm</a>(ps_search_acmod(ngs), &amp;hmm-&gt;<a class="code" href="structchan__s.html#a742d6a125ac468b95a1ddd880a956e35">hmm</a>);</div><div class="line"><a name="l00442"></a><span class="lineno">  442</span>&#160;            }</div><div class="line"><a name="l00443"></a><span class="lineno">  443</span>&#160;        }</div><div class="line"><a name="l00444"></a><span class="lineno">  444</span>&#160;    }</div><div class="line"><a name="l00445"></a><span class="lineno">  445</span>&#160;}</div><div class="line"><a name="l00446"></a><span class="lineno">  446</span>&#160;</div><div class="line"><a name="l00447"></a><span class="lineno">  447</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span></div><div class="line"><a name="l00448"></a><span class="lineno">  448</span>&#160;fwdflat_eval_chan(<a class="code" href="structngram__search__s.html">ngram_search_t</a> *ngs, <span class="keywordtype">int</span> frame_idx)</div><div class="line"><a name="l00449"></a><span class="lineno">  449</span>&#160;{</div><div class="line"><a name="l00450"></a><span class="lineno">  450</span>&#160;    int32 i, w, nw, bestscore;</div><div class="line"><a name="l00451"></a><span class="lineno">  451</span>&#160;    int32 *awl;</div><div class="line"><a name="l00452"></a><span class="lineno">  452</span>&#160;    <a class="code" href="structroot__chan__s.html">root_chan_t</a> *rhmm;</div><div class="line"><a name="l00453"></a><span class="lineno">  453</span>&#160;    <a class="code" href="structchan__s.html">chan_t</a> *hmm;</div><div class="line"><a name="l00454"></a><span class="lineno">  454</span>&#160;</div><div class="line"><a name="l00455"></a><span class="lineno">  455</span>&#160;    nw = ngs-&gt;<a class="code" href="structngram__search__s.html#a5c864f1fe331fc95c04e0d87a5bdf9ee">n_active_word</a>[frame_idx &amp; 0x1];</div><div class="line"><a name="l00456"></a><span class="lineno">  456</span>&#160;    awl = ngs-&gt;<a class="code" href="structngram__search__s.html#a5056573bf95990cc28c97a56cd76ce9a">active_word_list</a>[frame_idx &amp; 0x1];</div><div class="line"><a name="l00457"></a><span class="lineno">  457</span>&#160;    bestscore = <a class="code" href="hmm_8h.html#a833f100ee293ad0f1c03f2a5ef9be77a">WORST_SCORE</a>;</div><div class="line"><a name="l00458"></a><span class="lineno">  458</span>&#160;</div><div class="line"><a name="l00459"></a><span class="lineno">  459</span>&#160;    ngs-&gt;<a class="code" href="structngram__search__s.html#a5758d167fbb48e824a6a58186620e06d">st</a>.n_fwdflat_words += nw;</div><div class="line"><a name="l00460"></a><span class="lineno">  460</span>&#160;</div><div class="line"><a name="l00461"></a><span class="lineno">  461</span>&#160;    <span class="comment">/* Scan all active words. */</span></div><div class="line"><a name="l00462"></a><span class="lineno">  462</span>&#160;    <span class="keywordflow">for</span> (i = 0; i &lt; nw; i++) {</div><div class="line"><a name="l00463"></a><span class="lineno">  463</span>&#160;        w = *(awl++);</div><div class="line"><a name="l00464"></a><span class="lineno">  464</span>&#160;        rhmm = (<a class="code" href="structroot__chan__s.html">root_chan_t</a> *) ngs-&gt;<a class="code" href="structngram__search__s.html#a79deb7295a261cd82d2a6b48cb119e77">word_chan</a>[w];</div><div class="line"><a name="l00465"></a><span class="lineno">  465</span>&#160;        if (hmm_frame(&amp;rhmm-&gt;<a class="code" href="structroot__chan__s.html#a9d4d92ffa8b4079202ddebe3ba0eb290">hmm</a>) == frame_idx) {</div><div class="line"><a name="l00466"></a><span class="lineno">  466</span>&#160;            int32 score = chan_v_eval(rhmm);</div><div class="line"><a name="l00467"></a><span class="lineno">  467</span>&#160;            <span class="keywordflow">if</span> ((score <a class="code" href="hmm_8h.html#a2874ab52613ff781c96f570ec0eb0d98">BETTER_THAN</a> bestscore) &amp;&amp; (w != ps_search_finish_wid(ngs)))</div><div class="line"><a name="l00468"></a><span class="lineno">  468</span>&#160;                bestscore = score;</div><div class="line"><a name="l00469"></a><span class="lineno">  469</span>&#160;            ngs-&gt;<a class="code" href="structngram__search__s.html#a5758d167fbb48e824a6a58186620e06d">st</a>.n_fwdflat_chan++;</div><div class="line"><a name="l00470"></a><span class="lineno">  470</span>&#160;        }</div><div class="line"><a name="l00471"></a><span class="lineno">  471</span>&#160;</div><div class="line"><a name="l00472"></a><span class="lineno">  472</span>&#160;        <span class="keywordflow">for</span> (hmm = rhmm-&gt;<a class="code" href="structroot__chan__s.html#ae0f0b90a7cb2fcb54cd7b30502dd497e">next</a>; hmm; hmm = hmm-&gt;<a class="code" href="structchan__s.html#a260b68eff64150d0ae9ce4db7feb1300">next</a>) {</div><div class="line"><a name="l00473"></a><span class="lineno">  473</span>&#160;            <span class="keywordflow">if</span> (hmm_frame(&amp;hmm-&gt;<a class="code" href="structchan__s.html#a742d6a125ac468b95a1ddd880a956e35">hmm</a>) == frame_idx) {</div><div class="line"><a name="l00474"></a><span class="lineno">  474</span>&#160;                int32 score = chan_v_eval(hmm);</div><div class="line"><a name="l00475"></a><span class="lineno">  475</span>&#160;                <span class="keywordflow">if</span> (score <a class="code" href="hmm_8h.html#a2874ab52613ff781c96f570ec0eb0d98">BETTER_THAN</a> bestscore)</div><div class="line"><a name="l00476"></a><span class="lineno">  476</span>&#160;                    bestscore = score;</div><div class="line"><a name="l00477"></a><span class="lineno">  477</span>&#160;                ngs-&gt;<a class="code" href="structngram__search__s.html#a5758d167fbb48e824a6a58186620e06d">st</a>.n_fwdflat_chan++;</div><div class="line"><a name="l00478"></a><span class="lineno">  478</span>&#160;            }</div><div class="line"><a name="l00479"></a><span class="lineno">  479</span>&#160;        }</div><div class="line"><a name="l00480"></a><span class="lineno">  480</span>&#160;    }</div><div class="line"><a name="l00481"></a><span class="lineno">  481</span>&#160;</div><div class="line"><a name="l00482"></a><span class="lineno">  482</span>&#160;    ngs-&gt;<a class="code" href="structngram__search__s.html#a150d99157e2f37a6f0dbb4b02682d9c3">best_score</a> = bestscore;</div><div class="line"><a name="l00483"></a><span class="lineno">  483</span>&#160;}</div><div class="line"><a name="l00484"></a><span class="lineno">  484</span>&#160;</div><div class="line"><a name="l00485"></a><span class="lineno">  485</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span></div><div class="line"><a name="l00486"></a><span class="lineno">  486</span>&#160;fwdflat_prune_chan(<a class="code" href="structngram__search__s.html">ngram_search_t</a> *ngs, <span class="keywordtype">int</span> frame_idx)</div><div class="line"><a name="l00487"></a><span class="lineno">  487</span>&#160;{</div><div class="line"><a name="l00488"></a><span class="lineno">  488</span>&#160;    int32 i, nw, cf, nf, w, pip, newscore, thresh, wordthresh;</div><div class="line"><a name="l00489"></a><span class="lineno">  489</span>&#160;    int32 *awl;</div><div class="line"><a name="l00490"></a><span class="lineno">  490</span>&#160;    <a class="code" href="structroot__chan__s.html">root_chan_t</a> *rhmm;</div><div class="line"><a name="l00491"></a><span class="lineno">  491</span>&#160;    <a class="code" href="structchan__s.html">chan_t</a> *hmm, *nexthmm;</div><div class="line"><a name="l00492"></a><span class="lineno">  492</span>&#160;</div><div class="line"><a name="l00493"></a><span class="lineno">  493</span>&#160;    cf = frame_idx;</div><div class="line"><a name="l00494"></a><span class="lineno">  494</span>&#160;    nf = cf + 1;</div><div class="line"><a name="l00495"></a><span class="lineno">  495</span>&#160;    nw = ngs-&gt;<a class="code" href="structngram__search__s.html#a5c864f1fe331fc95c04e0d87a5bdf9ee">n_active_word</a>[cf &amp; 0x1];</div><div class="line"><a name="l00496"></a><span class="lineno">  496</span>&#160;    awl = ngs-&gt;<a class="code" href="structngram__search__s.html#a5056573bf95990cc28c97a56cd76ce9a">active_word_list</a>[cf &amp; 0x1];</div><div class="line"><a name="l00497"></a><span class="lineno">  497</span>&#160;    bitvec_clear_all(ngs-&gt;<a class="code" href="structngram__search__s.html#aeb4c98851bf9b239ca607ca59f59ff4c">word_active</a>, ps_search_n_words(ngs));</div><div class="line"><a name="l00498"></a><span class="lineno">  498</span>&#160;</div><div class="line"><a name="l00499"></a><span class="lineno">  499</span>&#160;    thresh = ngs-&gt;<a class="code" href="structngram__search__s.html#a150d99157e2f37a6f0dbb4b02682d9c3">best_score</a> + ngs-&gt;fwdflatbeam;</div><div class="line"><a name="l00500"></a><span class="lineno">  500</span>&#160;    wordthresh = ngs-&gt;<a class="code" href="structngram__search__s.html#a150d99157e2f37a6f0dbb4b02682d9c3">best_score</a> + ngs-&gt;fwdflatwbeam;</div><div class="line"><a name="l00501"></a><span class="lineno">  501</span>&#160;    pip = ngs-&gt;pip;</div><div class="line"><a name="l00502"></a><span class="lineno">  502</span>&#160;    E_DEBUG(3,(<span class="stringliteral">&quot;frame %d thresh %d wordthresh %d\n&quot;</span>, frame_idx, thresh, wordthresh));</div><div class="line"><a name="l00503"></a><span class="lineno">  503</span>&#160;</div><div class="line"><a name="l00504"></a><span class="lineno">  504</span>&#160;    <span class="comment">/* Scan all active words. */</span></div><div class="line"><a name="l00505"></a><span class="lineno">  505</span>&#160;    <span class="keywordflow">for</span> (i = 0; i &lt; nw; i++) {</div><div class="line"><a name="l00506"></a><span class="lineno">  506</span>&#160;        w = *(awl++);</div><div class="line"><a name="l00507"></a><span class="lineno">  507</span>&#160;        rhmm = (<a class="code" href="structroot__chan__s.html">root_chan_t</a> *) ngs-&gt;<a class="code" href="structngram__search__s.html#a79deb7295a261cd82d2a6b48cb119e77">word_chan</a>[w];</div><div class="line"><a name="l00508"></a><span class="lineno">  508</span>&#160;        <span class="comment">/* Propagate active root channels */</span></div><div class="line"><a name="l00509"></a><span class="lineno">  509</span>&#160;        if (hmm_frame(&amp;rhmm-&gt;<a class="code" href="structroot__chan__s.html#a9d4d92ffa8b4079202ddebe3ba0eb290">hmm</a>) == cf</div><div class="line"><a name="l00510"></a><span class="lineno">  510</span>&#160;            &amp;&amp; hmm_bestscore(&amp;rhmm-&gt;<a class="code" href="structroot__chan__s.html#a9d4d92ffa8b4079202ddebe3ba0eb290">hmm</a>) <a class="code" href="hmm_8h.html#a2874ab52613ff781c96f570ec0eb0d98">BETTER_THAN</a> thresh) {</div><div class="line"><a name="l00511"></a><span class="lineno">  511</span>&#160;            hmm_frame(&amp;rhmm-&gt;<a class="code" href="structroot__chan__s.html#a9d4d92ffa8b4079202ddebe3ba0eb290">hmm</a>) = nf;</div><div class="line"><a name="l00512"></a><span class="lineno">  512</span>&#160;            bitvec_set(ngs-&gt;<a class="code" href="structngram__search__s.html#aeb4c98851bf9b239ca607ca59f59ff4c">word_active</a>, w);</div><div class="line"><a name="l00513"></a><span class="lineno">  513</span>&#160;</div><div class="line"><a name="l00514"></a><span class="lineno">  514</span>&#160;            <span class="comment">/* Transitions out of root channel */</span></div><div class="line"><a name="l00515"></a><span class="lineno">  515</span>&#160;            newscore = hmm_out_score(&amp;rhmm-&gt;<a class="code" href="structroot__chan__s.html#a9d4d92ffa8b4079202ddebe3ba0eb290">hmm</a>);</div><div class="line"><a name="l00516"></a><span class="lineno">  516</span>&#160;            <span class="keywordflow">if</span> (rhmm-&gt;<a class="code" href="structroot__chan__s.html#ae0f0b90a7cb2fcb54cd7b30502dd497e">next</a>) {</div><div class="line"><a name="l00517"></a><span class="lineno">  517</span>&#160;                assert(!dict_is_single_phone(ps_search_dict(ngs), w));</div><div class="line"><a name="l00518"></a><span class="lineno">  518</span>&#160;</div><div class="line"><a name="l00519"></a><span class="lineno">  519</span>&#160;                newscore += pip;</div><div class="line"><a name="l00520"></a><span class="lineno">  520</span>&#160;                <span class="keywordflow">if</span> (newscore <a class="code" href="hmm_8h.html#a2874ab52613ff781c96f570ec0eb0d98">BETTER_THAN</a> thresh) {</div><div class="line"><a name="l00521"></a><span class="lineno">  521</span>&#160;                    hmm = rhmm-&gt;<a class="code" href="structroot__chan__s.html#ae0f0b90a7cb2fcb54cd7b30502dd497e">next</a>;</div><div class="line"><a name="l00522"></a><span class="lineno">  522</span>&#160;                    <span class="comment">/* Enter all right context phones */</span></div><div class="line"><a name="l00523"></a><span class="lineno">  523</span>&#160;                    <span class="keywordflow">if</span> (hmm-&gt;info.<a class="code" href="structchan__s.html#acf84a2fa662e7ff626769e7d8152a608">rc_id</a> &gt;= 0) {</div><div class="line"><a name="l00524"></a><span class="lineno">  524</span>&#160;                        <span class="keywordflow">for</span> (; hmm; hmm = hmm-&gt;<a class="code" href="structchan__s.html#a260b68eff64150d0ae9ce4db7feb1300">next</a>) {</div><div class="line"><a name="l00525"></a><span class="lineno">  525</span>&#160;                            <span class="keywordflow">if</span> ((hmm_frame(&amp;hmm-&gt;<a class="code" href="structchan__s.html#a742d6a125ac468b95a1ddd880a956e35">hmm</a>) &lt; cf)</div><div class="line"><a name="l00526"></a><span class="lineno">  526</span>&#160;                                || (newscore <a class="code" href="hmm_8h.html#a2874ab52613ff781c96f570ec0eb0d98">BETTER_THAN</a> hmm_in_score(&amp;hmm-&gt;<a class="code" href="structchan__s.html#a742d6a125ac468b95a1ddd880a956e35">hmm</a>))) {</div><div class="line"><a name="l00527"></a><span class="lineno">  527</span>&#160;                                <a class="code" href="hmm_8h.html#a7285d01d533996d750c78e0d96042716">hmm_enter</a>(&amp;hmm-&gt;<a class="code" href="structchan__s.html#a742d6a125ac468b95a1ddd880a956e35">hmm</a>, newscore,</div><div class="line"><a name="l00528"></a><span class="lineno">  528</span>&#160;                                          hmm_out_history(&amp;rhmm-&gt;<a class="code" href="structroot__chan__s.html#a9d4d92ffa8b4079202ddebe3ba0eb290">hmm</a>), nf);</div><div class="line"><a name="l00529"></a><span class="lineno">  529</span>&#160;                            }</div><div class="line"><a name="l00530"></a><span class="lineno">  530</span>&#160;                        }</div><div class="line"><a name="l00531"></a><span class="lineno">  531</span>&#160;                    }</div><div class="line"><a name="l00532"></a><span class="lineno">  532</span>&#160;                    <span class="comment">/* Just a normal word internal phone */</span></div><div class="line"><a name="l00533"></a><span class="lineno">  533</span>&#160;                    <span class="keywordflow">else</span> {</div><div class="line"><a name="l00534"></a><span class="lineno">  534</span>&#160;                        <span class="keywordflow">if</span> ((hmm_frame(&amp;hmm-&gt;<a class="code" href="structchan__s.html#a742d6a125ac468b95a1ddd880a956e35">hmm</a>) &lt; cf)</div><div class="line"><a name="l00535"></a><span class="lineno">  535</span>&#160;                            || (newscore <a class="code" href="hmm_8h.html#a2874ab52613ff781c96f570ec0eb0d98">BETTER_THAN</a> hmm_in_score(&amp;hmm-&gt;<a class="code" href="structchan__s.html#a742d6a125ac468b95a1ddd880a956e35">hmm</a>))) {</div><div class="line"><a name="l00536"></a><span class="lineno">  536</span>&#160;                                <a class="code" href="hmm_8h.html#a7285d01d533996d750c78e0d96042716">hmm_enter</a>(&amp;hmm-&gt;<a class="code" href="structchan__s.html#a742d6a125ac468b95a1ddd880a956e35">hmm</a>, newscore,</div><div class="line"><a name="l00537"></a><span class="lineno">  537</span>&#160;                                          hmm_out_history(&amp;rhmm-&gt;<a class="code" href="structroot__chan__s.html#a9d4d92ffa8b4079202ddebe3ba0eb290">hmm</a>), nf);</div><div class="line"><a name="l00538"></a><span class="lineno">  538</span>&#160;                        }</div><div class="line"><a name="l00539"></a><span class="lineno">  539</span>&#160;                    }</div><div class="line"><a name="l00540"></a><span class="lineno">  540</span>&#160;                }</div><div class="line"><a name="l00541"></a><span class="lineno">  541</span>&#160;            }</div><div class="line"><a name="l00542"></a><span class="lineno">  542</span>&#160;            <span class="keywordflow">else</span> {</div><div class="line"><a name="l00543"></a><span class="lineno">  543</span>&#160;                assert(dict_is_single_phone(ps_search_dict(ngs), w));</div><div class="line"><a name="l00544"></a><span class="lineno">  544</span>&#160;</div><div class="line"><a name="l00545"></a><span class="lineno">  545</span>&#160;                <span class="comment">/* Word exit for single-phone words (where did their</span></div><div class="line"><a name="l00546"></a><span class="lineno">  546</span>&#160;<span class="comment">                 * whmms come from?) (either from</span></div><div class="line"><a name="l00547"></a><span class="lineno">  547</span>&#160;<span class="comment">                 * ngram_search_fwdtree, or from</span></div><div class="line"><a name="l00548"></a><span class="lineno">  548</span>&#160;<span class="comment">                 * ngram_fwdflat_allocate_1ph(), that&#39;s where) */</span></div><div class="line"><a name="l00549"></a><span class="lineno">  549</span>&#160;                <span class="keywordflow">if</span> (newscore <a class="code" href="hmm_8h.html#a2874ab52613ff781c96f570ec0eb0d98">BETTER_THAN</a> wordthresh) {</div><div class="line"><a name="l00550"></a><span class="lineno">  550</span>&#160;                    <a class="code" href="ngram__search_8c.html#ae36649be6f5a2190e759e7ed13bd7b6b">ngram_search_save_bp</a>(ngs, cf, w, newscore,</div><div class="line"><a name="l00551"></a><span class="lineno">  551</span>&#160;                                         hmm_out_history(&amp;rhmm-&gt;<a class="code" href="structroot__chan__s.html#a9d4d92ffa8b4079202ddebe3ba0eb290">hmm</a>), 0);</div><div class="line"><a name="l00552"></a><span class="lineno">  552</span>&#160;                }</div><div class="line"><a name="l00553"></a><span class="lineno">  553</span>&#160;            }</div><div class="line"><a name="l00554"></a><span class="lineno">  554</span>&#160;        }</div><div class="line"><a name="l00555"></a><span class="lineno">  555</span>&#160;</div><div class="line"><a name="l00556"></a><span class="lineno">  556</span>&#160;        <span class="comment">/* Transitions out of non-root channels. */</span></div><div class="line"><a name="l00557"></a><span class="lineno">  557</span>&#160;        <span class="keywordflow">for</span> (hmm = rhmm-&gt;<a class="code" href="structroot__chan__s.html#ae0f0b90a7cb2fcb54cd7b30502dd497e">next</a>; hmm; hmm = hmm-&gt;<a class="code" href="structchan__s.html#a260b68eff64150d0ae9ce4db7feb1300">next</a>) {</div><div class="line"><a name="l00558"></a><span class="lineno">  558</span>&#160;            <span class="keywordflow">if</span> (hmm_frame(&amp;hmm-&gt;<a class="code" href="structchan__s.html#a742d6a125ac468b95a1ddd880a956e35">hmm</a>) &gt;= cf) {</div><div class="line"><a name="l00559"></a><span class="lineno">  559</span>&#160;                <span class="comment">/* Propagate forward HMMs inside the beam. */</span></div><div class="line"><a name="l00560"></a><span class="lineno">  560</span>&#160;                <span class="keywordflow">if</span> (hmm_bestscore(&amp;hmm-&gt;<a class="code" href="structchan__s.html#a742d6a125ac468b95a1ddd880a956e35">hmm</a>) <a class="code" href="hmm_8h.html#a2874ab52613ff781c96f570ec0eb0d98">BETTER_THAN</a> thresh) {</div><div class="line"><a name="l00561"></a><span class="lineno">  561</span>&#160;                    hmm_frame(&amp;hmm-&gt;<a class="code" href="structchan__s.html#a742d6a125ac468b95a1ddd880a956e35">hmm</a>) = nf;</div><div class="line"><a name="l00562"></a><span class="lineno">  562</span>&#160;                    bitvec_set(ngs-&gt;<a class="code" href="structngram__search__s.html#aeb4c98851bf9b239ca607ca59f59ff4c">word_active</a>, w);</div><div class="line"><a name="l00563"></a><span class="lineno">  563</span>&#160;</div><div class="line"><a name="l00564"></a><span class="lineno">  564</span>&#160;                    newscore = hmm_out_score(&amp;hmm-&gt;<a class="code" href="structchan__s.html#a742d6a125ac468b95a1ddd880a956e35">hmm</a>);</div><div class="line"><a name="l00565"></a><span class="lineno">  565</span>&#160;                    <span class="comment">/* Word-internal phones */</span></div><div class="line"><a name="l00566"></a><span class="lineno">  566</span>&#160;                    <span class="keywordflow">if</span> (hmm-&gt;info.<a class="code" href="structchan__s.html#acf84a2fa662e7ff626769e7d8152a608">rc_id</a> &lt; 0) {</div><div class="line"><a name="l00567"></a><span class="lineno">  567</span>&#160;                        newscore += pip;</div><div class="line"><a name="l00568"></a><span class="lineno">  568</span>&#160;                        <span class="keywordflow">if</span> (newscore <a class="code" href="hmm_8h.html#a2874ab52613ff781c96f570ec0eb0d98">BETTER_THAN</a> thresh) {</div><div class="line"><a name="l00569"></a><span class="lineno">  569</span>&#160;                            nexthmm = hmm-&gt;<a class="code" href="structchan__s.html#a260b68eff64150d0ae9ce4db7feb1300">next</a>;</div><div class="line"><a name="l00570"></a><span class="lineno">  570</span>&#160;                            <span class="comment">/* Enter all right-context phones. */</span></div><div class="line"><a name="l00571"></a><span class="lineno">  571</span>&#160;                            <span class="keywordflow">if</span> (nexthmm-&gt;info.<a class="code" href="structchan__s.html#acf84a2fa662e7ff626769e7d8152a608">rc_id</a> &gt;= 0) {</div><div class="line"><a name="l00572"></a><span class="lineno">  572</span>&#160;                                 <span class="keywordflow">for</span> (; nexthmm; nexthmm = nexthmm-&gt;<a class="code" href="structchan__s.html#a260b68eff64150d0ae9ce4db7feb1300">next</a>) {</div><div class="line"><a name="l00573"></a><span class="lineno">  573</span>&#160;                                    <span class="keywordflow">if</span> ((hmm_frame(&amp;nexthmm-&gt;<a class="code" href="structchan__s.html#a742d6a125ac468b95a1ddd880a956e35">hmm</a>) &lt; cf)</div><div class="line"><a name="l00574"></a><span class="lineno">  574</span>&#160;                                        || (newscore <a class="code" href="hmm_8h.html#a2874ab52613ff781c96f570ec0eb0d98">BETTER_THAN</a></div><div class="line"><a name="l00575"></a><span class="lineno">  575</span>&#160;                                            hmm_in_score(&amp;nexthmm-&gt;<a class="code" href="structchan__s.html#a742d6a125ac468b95a1ddd880a956e35">hmm</a>))) {</div><div class="line"><a name="l00576"></a><span class="lineno">  576</span>&#160;                                        <a class="code" href="hmm_8h.html#a7285d01d533996d750c78e0d96042716">hmm_enter</a>(&amp;nexthmm-&gt;<a class="code" href="structchan__s.html#a742d6a125ac468b95a1ddd880a956e35">hmm</a>,</div><div class="line"><a name="l00577"></a><span class="lineno">  577</span>&#160;                                                  newscore,</div><div class="line"><a name="l00578"></a><span class="lineno">  578</span>&#160;                                                  hmm_out_history(&amp;hmm-&gt;<a class="code" href="structchan__s.html#a742d6a125ac468b95a1ddd880a956e35">hmm</a>),</div><div class="line"><a name="l00579"></a><span class="lineno">  579</span>&#160;                                                  nf);</div><div class="line"><a name="l00580"></a><span class="lineno">  580</span>&#160;                                    }</div><div class="line"><a name="l00581"></a><span class="lineno">  581</span>&#160;                                }</div><div class="line"><a name="l00582"></a><span class="lineno">  582</span>&#160;                            }</div><div class="line"><a name="l00583"></a><span class="lineno">  583</span>&#160;                            <span class="comment">/* Enter single word-internal phone. */</span></div><div class="line"><a name="l00584"></a><span class="lineno">  584</span>&#160;                            <span class="keywordflow">else</span> {</div><div class="line"><a name="l00585"></a><span class="lineno">  585</span>&#160;                                <span class="keywordflow">if</span> ((hmm_frame(&amp;nexthmm-&gt;<a class="code" href="structchan__s.html#a742d6a125ac468b95a1ddd880a956e35">hmm</a>) &lt; cf)</div><div class="line"><a name="l00586"></a><span class="lineno">  586</span>&#160;                                    || (newscore <a class="code" href="hmm_8h.html#a2874ab52613ff781c96f570ec0eb0d98">BETTER_THAN</a></div><div class="line"><a name="l00587"></a><span class="lineno">  587</span>&#160;                                        hmm_in_score(&amp;nexthmm-&gt;<a class="code" href="structchan__s.html#a742d6a125ac468b95a1ddd880a956e35">hmm</a>))) {</div><div class="line"><a name="l00588"></a><span class="lineno">  588</span>&#160;                                    <a class="code" href="hmm_8h.html#a7285d01d533996d750c78e0d96042716">hmm_enter</a>(&amp;nexthmm-&gt;<a class="code" href="structchan__s.html#a742d6a125ac468b95a1ddd880a956e35">hmm</a>, newscore,</div><div class="line"><a name="l00589"></a><span class="lineno">  589</span>&#160;                                              hmm_out_history(&amp;hmm-&gt;<a class="code" href="structchan__s.html#a742d6a125ac468b95a1ddd880a956e35">hmm</a>), nf);</div><div class="line"><a name="l00590"></a><span class="lineno">  590</span>&#160;                                }</div><div class="line"><a name="l00591"></a><span class="lineno">  591</span>&#160;                            }</div><div class="line"><a name="l00592"></a><span class="lineno">  592</span>&#160;                        }</div><div class="line"><a name="l00593"></a><span class="lineno">  593</span>&#160;                    }</div><div class="line"><a name="l00594"></a><span class="lineno">  594</span>&#160;                    <span class="comment">/* Right-context phones - apply word beam and exit. */</span></div><div class="line"><a name="l00595"></a><span class="lineno">  595</span>&#160;                    <span class="keywordflow">else</span> {</div><div class="line"><a name="l00596"></a><span class="lineno">  596</span>&#160;                        <span class="keywordflow">if</span> (newscore <a class="code" href="hmm_8h.html#a2874ab52613ff781c96f570ec0eb0d98">BETTER_THAN</a> wordthresh) {</div><div class="line"><a name="l00597"></a><span class="lineno">  597</span>&#160;                            <a class="code" href="ngram__search_8c.html#ae36649be6f5a2190e759e7ed13bd7b6b">ngram_search_save_bp</a>(ngs, cf, w, newscore,</div><div class="line"><a name="l00598"></a><span class="lineno">  598</span>&#160;                                                 hmm_out_history(&amp;hmm-&gt;<a class="code" href="structchan__s.html#a742d6a125ac468b95a1ddd880a956e35">hmm</a>),</div><div class="line"><a name="l00599"></a><span class="lineno">  599</span>&#160;                                                 hmm-&gt;info.<a class="code" href="structchan__s.html#acf84a2fa662e7ff626769e7d8152a608">rc_id</a>);</div><div class="line"><a name="l00600"></a><span class="lineno">  600</span>&#160;                        }</div><div class="line"><a name="l00601"></a><span class="lineno">  601</span>&#160;                    }</div><div class="line"><a name="l00602"></a><span class="lineno">  602</span>&#160;                }</div><div class="line"><a name="l00603"></a><span class="lineno">  603</span>&#160;                <span class="comment">/* Zero out inactive HMMs. */</span></div><div class="line"><a name="l00604"></a><span class="lineno">  604</span>&#160;                <span class="keywordflow">else</span> <span class="keywordflow">if</span> (hmm_frame(&amp;hmm-&gt;<a class="code" href="structchan__s.html#a742d6a125ac468b95a1ddd880a956e35">hmm</a>) != nf) {</div><div class="line"><a name="l00605"></a><span class="lineno">  605</span>&#160;                    <a class="code" href="hmm_8h.html#a9561d7ffa1e61c99de2d2b900774152f">hmm_clear_scores</a>(&amp;hmm-&gt;<a class="code" href="structchan__s.html#a742d6a125ac468b95a1ddd880a956e35">hmm</a>);</div><div class="line"><a name="l00606"></a><span class="lineno">  606</span>&#160;                }</div><div class="line"><a name="l00607"></a><span class="lineno">  607</span>&#160;            }</div><div class="line"><a name="l00608"></a><span class="lineno">  608</span>&#160;        }</div><div class="line"><a name="l00609"></a><span class="lineno">  609</span>&#160;    }</div><div class="line"><a name="l00610"></a><span class="lineno">  610</span>&#160;}</div><div class="line"><a name="l00611"></a><span class="lineno">  611</span>&#160;</div><div class="line"><a name="l00612"></a><span class="lineno">  612</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span></div><div class="line"><a name="l00613"></a><span class="lineno">  613</span>&#160;get_expand_wordlist(<a class="code" href="structngram__search__s.html">ngram_search_t</a> *ngs, int32 frm, int32 win)</div><div class="line"><a name="l00614"></a><span class="lineno">  614</span>&#160;{</div><div class="line"><a name="l00615"></a><span class="lineno">  615</span>&#160;    int32 f, sf, ef;</div><div class="line"><a name="l00616"></a><span class="lineno">  616</span>&#160;    <a class="code" href="structps__latnode__s.html">ps_latnode_t</a> *node;</div><div class="line"><a name="l00617"></a><span class="lineno">  617</span>&#160;</div><div class="line"><a name="l00618"></a><span class="lineno">  618</span>&#160;    <span class="keywordflow">if</span> (!ngs-&gt;fwdtree) {</div><div class="line"><a name="l00619"></a><span class="lineno">  619</span>&#160;        ngs-&gt;<a class="code" href="structngram__search__s.html#a5758d167fbb48e824a6a58186620e06d">st</a>.n_fwdflat_word_transition += ngs-&gt;n_expand_words;</div><div class="line"><a name="l00620"></a><span class="lineno">  620</span>&#160;        <span class="keywordflow">return</span>;</div><div class="line"><a name="l00621"></a><span class="lineno">  621</span>&#160;    }</div><div class="line"><a name="l00622"></a><span class="lineno">  622</span>&#160;</div><div class="line"><a name="l00623"></a><span class="lineno">  623</span>&#160;    sf = frm - win;</div><div class="line"><a name="l00624"></a><span class="lineno">  624</span>&#160;    <span class="keywordflow">if</span> (sf &lt; 0)</div><div class="line"><a name="l00625"></a><span class="lineno">  625</span>&#160;        sf = 0;</div><div class="line"><a name="l00626"></a><span class="lineno">  626</span>&#160;    ef = frm + win;</div><div class="line"><a name="l00627"></a><span class="lineno">  627</span>&#160;    <span class="keywordflow">if</span> (ef &gt; ngs-&gt;<a class="code" href="structngram__search__s.html#a5255e56d28c239a4e1d9b1721e8a2f8d">n_frame</a>)</div><div class="line"><a name="l00628"></a><span class="lineno">  628</span>&#160;        ef = ngs-&gt;<a class="code" href="structngram__search__s.html#a5255e56d28c239a4e1d9b1721e8a2f8d">n_frame</a>;</div><div class="line"><a name="l00629"></a><span class="lineno">  629</span>&#160;</div><div class="line"><a name="l00630"></a><span class="lineno">  630</span>&#160;    bitvec_clear_all(ngs-&gt;expand_word_flag, ps_search_n_words(ngs));</div><div class="line"><a name="l00631"></a><span class="lineno">  631</span>&#160;    ngs-&gt;n_expand_words = 0;</div><div class="line"><a name="l00632"></a><span class="lineno">  632</span>&#160;</div><div class="line"><a name="l00633"></a><span class="lineno">  633</span>&#160;    <span class="keywordflow">for</span> (f = sf; f &lt; ef; f++) {</div><div class="line"><a name="l00634"></a><span class="lineno">  634</span>&#160;        <span class="keywordflow">for</span> (node = ngs-&gt;<a class="code" href="structngram__search__s.html#aa54544457c363ccccb87fc7ec63a5f3e">frm_wordlist</a>[f]; node; node = node-&gt;<a class="code" href="structps__latnode__s.html#aca6f3d543a1712a1ca3bb8ec60f71c84">next</a>) {</div><div class="line"><a name="l00635"></a><span class="lineno">  635</span>&#160;            <span class="keywordflow">if</span> (!bitvec_is_set(ngs-&gt;expand_word_flag, node-&gt;<a class="code" href="structps__latnode__s.html#afd85dbd410d6e6d970c73088bc6fb97e">wid</a>)) {</div><div class="line"><a name="l00636"></a><span class="lineno">  636</span>&#160;                ngs-&gt;expand_word_list[ngs-&gt;n_expand_words++] = node-&gt;<a class="code" href="structps__latnode__s.html#afd85dbd410d6e6d970c73088bc6fb97e">wid</a>;</div><div class="line"><a name="l00637"></a><span class="lineno">  637</span>&#160;                bitvec_set(ngs-&gt;expand_word_flag, node-&gt;<a class="code" href="structps__latnode__s.html#afd85dbd410d6e6d970c73088bc6fb97e">wid</a>);</div><div class="line"><a name="l00638"></a><span class="lineno">  638</span>&#160;            }</div><div class="line"><a name="l00639"></a><span class="lineno">  639</span>&#160;        }</div><div class="line"><a name="l00640"></a><span class="lineno">  640</span>&#160;    }</div><div class="line"><a name="l00641"></a><span class="lineno">  641</span>&#160;    ngs-&gt;expand_word_list[ngs-&gt;n_expand_words] = -1;</div><div class="line"><a name="l00642"></a><span class="lineno">  642</span>&#160;    ngs-&gt;<a class="code" href="structngram__search__s.html#a5758d167fbb48e824a6a58186620e06d">st</a>.n_fwdflat_word_transition += ngs-&gt;n_expand_words;</div><div class="line"><a name="l00643"></a><span class="lineno">  643</span>&#160;}</div><div class="line"><a name="l00644"></a><span class="lineno">  644</span>&#160;</div><div class="line"><a name="l00645"></a><span class="lineno">  645</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span></div><div class="line"><a name="l00646"></a><span class="lineno">  646</span>&#160;fwdflat_word_transition(<a class="code" href="structngram__search__s.html">ngram_search_t</a> *ngs, <span class="keywordtype">int</span> frame_idx)</div><div class="line"><a name="l00647"></a><span class="lineno">  647</span>&#160;{</div><div class="line"><a name="l00648"></a><span class="lineno">  648</span>&#160;    int32 cf, nf, b, thresh, pip, i, nw, w, newscore;</div><div class="line"><a name="l00649"></a><span class="lineno">  649</span>&#160;    int32 best_silrc_score = 0, best_silrc_bp = 0;      <span class="comment">/* FIXME: good defaults? */</span></div><div class="line"><a name="l00650"></a><span class="lineno">  650</span>&#160;    <a class="code" href="structbptbl__s.html">bptbl_t</a> *bp;</div><div class="line"><a name="l00651"></a><span class="lineno">  651</span>&#160;    int32 *rcss;</div><div class="line"><a name="l00652"></a><span class="lineno">  652</span>&#160;    <a class="code" href="structroot__chan__s.html">root_chan_t</a> *rhmm;</div><div class="line"><a name="l00653"></a><span class="lineno">  653</span>&#160;    int32 *awl;</div><div class="line"><a name="l00654"></a><span class="lineno">  654</span>&#160;    float32 lwf;</div><div class="line"><a name="l00655"></a><span class="lineno">  655</span>&#160;    <a class="code" href="structdict__t.html">dict_t</a> *dict = ps_search_dict(ngs);</div><div class="line"><a name="l00656"></a><span class="lineno">  656</span>&#160;    <a class="code" href="structdict2pid__t.html">dict2pid_t</a> *d2p = ps_search_dict2pid(ngs);</div><div class="line"><a name="l00657"></a><span class="lineno">  657</span>&#160;</div><div class="line"><a name="l00658"></a><span class="lineno">  658</span>&#160;    cf = frame_idx;</div><div class="line"><a name="l00659"></a><span class="lineno">  659</span>&#160;    nf = cf + 1;</div><div class="line"><a name="l00660"></a><span class="lineno">  660</span>&#160;    thresh = ngs-&gt;<a class="code" href="structngram__search__s.html#a150d99157e2f37a6f0dbb4b02682d9c3">best_score</a> + ngs-&gt;fwdflatbeam;</div><div class="line"><a name="l00661"></a><span class="lineno">  661</span>&#160;    pip = ngs-&gt;pip;</div><div class="line"><a name="l00662"></a><span class="lineno">  662</span>&#160;    best_silrc_score = <a class="code" href="hmm_8h.html#a833f100ee293ad0f1c03f2a5ef9be77a">WORST_SCORE</a>;</div><div class="line"><a name="l00663"></a><span class="lineno">  663</span>&#160;    lwf = ngs-&gt;fwdflat_fwdtree_lw_ratio;</div><div class="line"><a name="l00664"></a><span class="lineno">  664</span>&#160;</div><div class="line"><a name="l00665"></a><span class="lineno">  665</span>&#160;    <span class="comment">/* Search for all words starting within a window of this frame.</span></div><div class="line"><a name="l00666"></a><span class="lineno">  666</span>&#160;<span class="comment">     * These are the successors for words exiting now. */</span></div><div class="line"><a name="l00667"></a><span class="lineno">  667</span>&#160;    get_expand_wordlist(ngs, cf, ngs-&gt;max_sf_win);</div><div class="line"><a name="l00668"></a><span class="lineno">  668</span>&#160;</div><div class="line"><a name="l00669"></a><span class="lineno">  669</span>&#160;    <span class="comment">/* Scan words exited in current frame */</span></div><div class="line"><a name="l00670"></a><span class="lineno">  670</span>&#160;    <span class="keywordflow">for</span> (b = ngs-&gt;bp_table_idx[cf]; b &lt; ngs-&gt;bpidx; b++) {</div><div class="line"><a name="l00671"></a><span class="lineno">  671</span>&#160;        <a class="code" href="structxwdssid__t.html">xwdssid_t</a> *rssid;</div><div class="line"><a name="l00672"></a><span class="lineno">  672</span>&#160;        int32 silscore;</div><div class="line"><a name="l00673"></a><span class="lineno">  673</span>&#160;</div><div class="line"><a name="l00674"></a><span class="lineno">  674</span>&#160;        bp = ngs-&gt;bp_table + b;</div><div class="line"><a name="l00675"></a><span class="lineno">  675</span>&#160;        ngs-&gt;word_lat_idx[bp-&gt;<a class="code" href="structbptbl__s.html#a143ff0891fafd471000df7c73123b8a7">wid</a>] = NO_BP;</div><div class="line"><a name="l00676"></a><span class="lineno">  676</span>&#160;</div><div class="line"><a name="l00677"></a><span class="lineno">  677</span>&#160;        <span class="keywordflow">if</span> (bp-&gt;<a class="code" href="structbptbl__s.html#a143ff0891fafd471000df7c73123b8a7">wid</a> == ps_search_finish_wid(ngs))</div><div class="line"><a name="l00678"></a><span class="lineno">  678</span>&#160;            <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00679"></a><span class="lineno">  679</span>&#160;</div><div class="line"><a name="l00680"></a><span class="lineno">  680</span>&#160;        <span class="comment">/* DICT2PID location */</span></div><div class="line"><a name="l00681"></a><span class="lineno">  681</span>&#160;        <span class="comment">/* Get the mapping from right context phone ID to index in the</span></div><div class="line"><a name="l00682"></a><span class="lineno">  682</span>&#160;<span class="comment">         * right context table and the bscore_stack. */</span></div><div class="line"><a name="l00683"></a><span class="lineno">  683</span>&#160;        rcss = ngs-&gt;bscore_stack + bp-&gt;<a class="code" href="structbptbl__s.html#abf9e4bcf1927aa09fb2b30c59e99f551">s_idx</a>;</div><div class="line"><a name="l00684"></a><span class="lineno">  684</span>&#160;        <span class="keywordflow">if</span> (bp-&gt;<a class="code" href="structbptbl__s.html#a27b8e54bb7552e6afc15e4f44f42e3b7">last2_phone</a> == -1)</div><div class="line"><a name="l00685"></a><span class="lineno">  685</span>&#160;            rssid = NULL;</div><div class="line"><a name="l00686"></a><span class="lineno">  686</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l00687"></a><span class="lineno">  687</span>&#160;            rssid = <a class="code" href="dict2pid_8h.html#a453a98931cad95a19b4c4ab770fc79f1">dict2pid_rssid</a>(d2p, bp-&gt;<a class="code" href="structbptbl__s.html#aa7704ba76d3dcde6b8a24855362a4289">last_phone</a>, bp-&gt;<a class="code" href="structbptbl__s.html#a27b8e54bb7552e6afc15e4f44f42e3b7">last2_phone</a>);</div><div class="line"><a name="l00688"></a><span class="lineno">  688</span>&#160;</div><div class="line"><a name="l00689"></a><span class="lineno">  689</span>&#160;        <span class="comment">/* Transition to all successor words. */</span></div><div class="line"><a name="l00690"></a><span class="lineno">  690</span>&#160;        <span class="keywordflow">for</span> (i = 0; ngs-&gt;expand_word_list[i] &gt;= 0; i++) {</div><div class="line"><a name="l00691"></a><span class="lineno">  691</span>&#160;            int32 n_used;</div><div class="line"><a name="l00692"></a><span class="lineno">  692</span>&#160;</div><div class="line"><a name="l00693"></a><span class="lineno">  693</span>&#160;            w = ngs-&gt;expand_word_list[i];</div><div class="line"><a name="l00694"></a><span class="lineno">  694</span>&#160;</div><div class="line"><a name="l00695"></a><span class="lineno">  695</span>&#160;            <span class="comment">/* Get the exit score we recorded in save_bwd_ptr(), or</span></div><div class="line"><a name="l00696"></a><span class="lineno">  696</span>&#160;<span class="comment">             * something approximating it. */</span></div><div class="line"><a name="l00697"></a><span class="lineno">  697</span>&#160;            <span class="keywordflow">if</span> (rssid)</div><div class="line"><a name="l00698"></a><span class="lineno">  698</span>&#160;                newscore = rcss[rssid-&gt;<a class="code" href="structxwdssid__t.html#a502f9241a70383aa260d3390e4ff58fb">cimap</a>[dict_first_phone(dict, w)]];</div><div class="line"><a name="l00699"></a><span class="lineno">  699</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l00700"></a><span class="lineno">  700</span>&#160;                newscore = bp-&gt;<a class="code" href="structbptbl__s.html#aa5643c0c19ce4d39d51ddf7376f4d508">score</a>;</div><div class="line"><a name="l00701"></a><span class="lineno">  701</span>&#160;            <span class="keywordflow">if</span> (newscore == <a class="code" href="hmm_8h.html#a833f100ee293ad0f1c03f2a5ef9be77a">WORST_SCORE</a>)</div><div class="line"><a name="l00702"></a><span class="lineno">  702</span>&#160;                <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00703"></a><span class="lineno">  703</span>&#160;            <span class="comment">/* FIXME: Floating point... */</span></div><div class="line"><a name="l00704"></a><span class="lineno">  704</span>&#160;            newscore += lwf</div><div class="line"><a name="l00705"></a><span class="lineno">  705</span>&#160;                * (ngram_tg_score(ngs-&gt;<a class="code" href="structngram__search__s.html#a6127a6d8fb53832e67456c11aa6ad9c4">lmset</a>,</div><div class="line"><a name="l00706"></a><span class="lineno">  706</span>&#160;                                  dict_basewid(dict, w),</div><div class="line"><a name="l00707"></a><span class="lineno">  707</span>&#160;                                  bp-&gt;<a class="code" href="structbptbl__s.html#a91247e4f807cf780afe8f5ac45e720b8">real_wid</a>,</div><div class="line"><a name="l00708"></a><span class="lineno">  708</span>&#160;                                  bp-&gt;<a class="code" href="structbptbl__s.html#a83784e3b0121bc365d485151ab277920">prev_real_wid</a>,</div><div class="line"><a name="l00709"></a><span class="lineno">  709</span>&#160;                                  &amp;n_used) &gt;&gt; <a class="code" href="hmm_8h.html#af94da16e3e5b550b9be05b0f07402cc7">SENSCR_SHIFT</a>);</div><div class="line"><a name="l00710"></a><span class="lineno">  710</span>&#160;            newscore += pip;</div><div class="line"><a name="l00711"></a><span class="lineno">  711</span>&#160;</div><div class="line"><a name="l00712"></a><span class="lineno">  712</span>&#160;            <span class="comment">/* Enter the next word */</span></div><div class="line"><a name="l00713"></a><span class="lineno">  713</span>&#160;            <span class="keywordflow">if</span> (newscore <a class="code" href="hmm_8h.html#a2874ab52613ff781c96f570ec0eb0d98">BETTER_THAN</a> thresh) {</div><div class="line"><a name="l00714"></a><span class="lineno">  714</span>&#160;                rhmm = (<a class="code" href="structroot__chan__s.html">root_chan_t</a> *) ngs-&gt;<a class="code" href="structngram__search__s.html#a79deb7295a261cd82d2a6b48cb119e77">word_chan</a>[w];</div><div class="line"><a name="l00715"></a><span class="lineno">  715</span>&#160;                if ((hmm_frame(&amp;rhmm-&gt;<a class="code" href="structroot__chan__s.html#a9d4d92ffa8b4079202ddebe3ba0eb290">hmm</a>) &lt; cf)</div><div class="line"><a name="l00716"></a><span class="lineno">  716</span>&#160;                    || (newscore <a class="code" href="hmm_8h.html#a2874ab52613ff781c96f570ec0eb0d98">BETTER_THAN</a> hmm_in_score(&amp;rhmm-&gt;<a class="code" href="structroot__chan__s.html#a9d4d92ffa8b4079202ddebe3ba0eb290">hmm</a>))) {</div><div class="line"><a name="l00717"></a><span class="lineno">  717</span>&#160;                    <a class="code" href="hmm_8h.html#a7285d01d533996d750c78e0d96042716">hmm_enter</a>(&amp;rhmm-&gt;<a class="code" href="structroot__chan__s.html#a9d4d92ffa8b4079202ddebe3ba0eb290">hmm</a>, newscore, b, nf);</div><div class="line"><a name="l00718"></a><span class="lineno">  718</span>&#160;                    <span class="comment">/* DICT2PID: This is where mpx ssids get introduced. */</span></div><div class="line"><a name="l00719"></a><span class="lineno">  719</span>&#160;                    <span class="comment">/* Look up the ssid to use when entering this mpx triphone. */</span></div><div class="line"><a name="l00720"></a><span class="lineno">  720</span>&#160;                    hmm_mpx_ssid(&amp;rhmm-&gt;<a class="code" href="structroot__chan__s.html#a9d4d92ffa8b4079202ddebe3ba0eb290">hmm</a>, 0) =</div><div class="line"><a name="l00721"></a><span class="lineno">  721</span>&#160;                        dict2pid_ldiph_lc(d2p, rhmm-&gt;<a class="code" href="structroot__chan__s.html#ad67c37bf4183f518acd7760c09a806f6">ciphone</a>, rhmm-&gt;<a class="code" href="structroot__chan__s.html#a0c0cf22caf4c97879af86865764f1675">ci2phone</a>,</div><div class="line"><a name="l00722"></a><span class="lineno">  722</span>&#160;                                          dict_last_phone(dict, bp-&gt;<a class="code" href="structbptbl__s.html#a143ff0891fafd471000df7c73123b8a7">wid</a>));</div><div class="line"><a name="l00723"></a><span class="lineno">  723</span>&#160;                    assert(IS_S3SSID(hmm_mpx_ssid(&amp;rhmm-&gt;<a class="code" href="structroot__chan__s.html#a9d4d92ffa8b4079202ddebe3ba0eb290">hmm</a>, 0)));</div><div class="line"><a name="l00724"></a><span class="lineno">  724</span>&#160;                    E_DEBUG(6,(<span class="stringliteral">&quot;ssid %d(%d,%d) = %d\n&quot;</span>,</div><div class="line"><a name="l00725"></a><span class="lineno">  725</span>&#160;                               rhmm-&gt;<a class="code" href="structroot__chan__s.html#ad67c37bf4183f518acd7760c09a806f6">ciphone</a>, dict_last_phone(dict, bp-&gt;<a class="code" href="structbptbl__s.html#a143ff0891fafd471000df7c73123b8a7">wid</a>), rhmm-&gt;<a class="code" href="structroot__chan__s.html#a0c0cf22caf4c97879af86865764f1675">ci2phone</a>,</div><div class="line"><a name="l00726"></a><span class="lineno">  726</span>&#160;                               hmm_mpx_ssid(&amp;rhmm-&gt;<a class="code" href="structroot__chan__s.html#a9d4d92ffa8b4079202ddebe3ba0eb290">hmm</a>, 0)));</div><div class="line"><a name="l00727"></a><span class="lineno">  727</span>&#160;                    bitvec_set(ngs-&gt;<a class="code" href="structngram__search__s.html#aeb4c98851bf9b239ca607ca59f59ff4c">word_active</a>, w);</div><div class="line"><a name="l00728"></a><span class="lineno">  728</span>&#160;                }</div><div class="line"><a name="l00729"></a><span class="lineno">  729</span>&#160;            }</div><div class="line"><a name="l00730"></a><span class="lineno">  730</span>&#160;        }</div><div class="line"><a name="l00731"></a><span class="lineno">  731</span>&#160;</div><div class="line"><a name="l00732"></a><span class="lineno">  732</span>&#160;        <span class="comment">/* Get the best exit into silence. */</span></div><div class="line"><a name="l00733"></a><span class="lineno">  733</span>&#160;        <span class="keywordflow">if</span> (rssid)</div><div class="line"><a name="l00734"></a><span class="lineno">  734</span>&#160;            silscore = rcss[rssid-&gt;<a class="code" href="structxwdssid__t.html#a502f9241a70383aa260d3390e4ff58fb">cimap</a>[ps_search_acmod(ngs)-&gt;mdef-&gt;sil]];</div><div class="line"><a name="l00735"></a><span class="lineno">  735</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l00736"></a><span class="lineno">  736</span>&#160;            silscore = bp-&gt;<a class="code" href="structbptbl__s.html#aa5643c0c19ce4d39d51ddf7376f4d508">score</a>;</div><div class="line"><a name="l00737"></a><span class="lineno">  737</span>&#160;        <span class="keywordflow">if</span> (silscore <a class="code" href="hmm_8h.html#a2874ab52613ff781c96f570ec0eb0d98">BETTER_THAN</a> best_silrc_score) {</div><div class="line"><a name="l00738"></a><span class="lineno">  738</span>&#160;            best_silrc_score = silscore;</div><div class="line"><a name="l00739"></a><span class="lineno">  739</span>&#160;            best_silrc_bp = b;</div><div class="line"><a name="l00740"></a><span class="lineno">  740</span>&#160;        }</div><div class="line"><a name="l00741"></a><span class="lineno">  741</span>&#160;    }</div><div class="line"><a name="l00742"></a><span class="lineno">  742</span>&#160;</div><div class="line"><a name="l00743"></a><span class="lineno">  743</span>&#160;    <span class="comment">/* Transition to &lt;sil&gt; */</span></div><div class="line"><a name="l00744"></a><span class="lineno">  744</span>&#160;    newscore = best_silrc_score + ngs-&gt;silpen + pip;</div><div class="line"><a name="l00745"></a><span class="lineno">  745</span>&#160;    <span class="keywordflow">if</span> ((newscore <a class="code" href="hmm_8h.html#a2874ab52613ff781c96f570ec0eb0d98">BETTER_THAN</a> thresh) &amp;&amp; (newscore <a class="code" href="hmm_8h.html#a2874ab52613ff781c96f570ec0eb0d98">BETTER_THAN</a> <a class="code" href="hmm_8h.html#a833f100ee293ad0f1c03f2a5ef9be77a">WORST_SCORE</a>)) {</div><div class="line"><a name="l00746"></a><span class="lineno">  746</span>&#160;        w = ps_search_silence_wid(ngs);</div><div class="line"><a name="l00747"></a><span class="lineno">  747</span>&#160;        rhmm = (<a class="code" href="structroot__chan__s.html">root_chan_t</a> *) ngs-&gt;<a class="code" href="structngram__search__s.html#a79deb7295a261cd82d2a6b48cb119e77">word_chan</a>[w];</div><div class="line"><a name="l00748"></a><span class="lineno">  748</span>&#160;        if ((hmm_frame(&amp;rhmm-&gt;<a class="code" href="structroot__chan__s.html#a9d4d92ffa8b4079202ddebe3ba0eb290">hmm</a>) &lt; cf)</div><div class="line"><a name="l00749"></a><span class="lineno">  749</span>&#160;            || (newscore <a class="code" href="hmm_8h.html#a2874ab52613ff781c96f570ec0eb0d98">BETTER_THAN</a> hmm_in_score(&amp;rhmm-&gt;<a class="code" href="structroot__chan__s.html#a9d4d92ffa8b4079202ddebe3ba0eb290">hmm</a>))) {</div><div class="line"><a name="l00750"></a><span class="lineno">  750</span>&#160;            <a class="code" href="hmm_8h.html#a7285d01d533996d750c78e0d96042716">hmm_enter</a>(&amp;rhmm-&gt;<a class="code" href="structroot__chan__s.html#a9d4d92ffa8b4079202ddebe3ba0eb290">hmm</a>, newscore,</div><div class="line"><a name="l00751"></a><span class="lineno">  751</span>&#160;                      best_silrc_bp, nf);</div><div class="line"><a name="l00752"></a><span class="lineno">  752</span>&#160;            bitvec_set(ngs-&gt;<a class="code" href="structngram__search__s.html#aeb4c98851bf9b239ca607ca59f59ff4c">word_active</a>, w);</div><div class="line"><a name="l00753"></a><span class="lineno">  753</span>&#160;        }</div><div class="line"><a name="l00754"></a><span class="lineno">  754</span>&#160;    }</div><div class="line"><a name="l00755"></a><span class="lineno">  755</span>&#160;    <span class="comment">/* Transition to noise words */</span></div><div class="line"><a name="l00756"></a><span class="lineno">  756</span>&#160;    newscore = best_silrc_score + ngs-&gt;fillpen + pip;</div><div class="line"><a name="l00757"></a><span class="lineno">  757</span>&#160;    <span class="keywordflow">if</span> ((newscore <a class="code" href="hmm_8h.html#a2874ab52613ff781c96f570ec0eb0d98">BETTER_THAN</a> thresh) &amp;&amp; (newscore <a class="code" href="hmm_8h.html#a2874ab52613ff781c96f570ec0eb0d98">BETTER_THAN</a> WORST_SCORE)) {</div><div class="line"><a name="l00758"></a><span class="lineno">  758</span>&#160;        <span class="keywordflow">for</span> (w = dict_filler_start(dict); w &lt;= dict_filler_end(dict); w++) {</div><div class="line"><a name="l00759"></a><span class="lineno">  759</span>&#160;            <span class="keywordflow">if</span> (w == ps_search_silence_wid(ngs))</div><div class="line"><a name="l00760"></a><span class="lineno">  760</span>&#160;                <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00761"></a><span class="lineno">  761</span>&#160;</div><div class="line"><a name="l00762"></a><span class="lineno">  762</span>&#160;            rhmm = (<a class="code" href="structroot__chan__s.html">root_chan_t</a> *) ngs-&gt;<a class="code" href="structngram__search__s.html#a79deb7295a261cd82d2a6b48cb119e77">word_chan</a>[w];</div><div class="line"><a name="l00763"></a><span class="lineno">  763</span>&#160;            <span class="comment">/* Noise words that aren&#39;t a single phone will have NULL here. */</span></div><div class="line"><a name="l00764"></a><span class="lineno">  764</span>&#160;            if (rhmm == NULL)</div><div class="line"><a name="l00765"></a><span class="lineno">  765</span>&#160;                <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00766"></a><span class="lineno">  766</span>&#160;            <span class="keywordflow">if</span> ((hmm_frame(&amp;rhmm-&gt;<a class="code" href="structroot__chan__s.html#a9d4d92ffa8b4079202ddebe3ba0eb290">hmm</a>) &lt; cf)</div><div class="line"><a name="l00767"></a><span class="lineno">  767</span>&#160;                || (newscore <a class="code" href="hmm_8h.html#a2874ab52613ff781c96f570ec0eb0d98">BETTER_THAN</a> hmm_in_score(&amp;rhmm-&gt;<a class="code" href="structroot__chan__s.html#a9d4d92ffa8b4079202ddebe3ba0eb290">hmm</a>))) {</div><div class="line"><a name="l00768"></a><span class="lineno">  768</span>&#160;                <a class="code" href="hmm_8h.html#a7285d01d533996d750c78e0d96042716">hmm_enter</a>(&amp;rhmm-&gt;<a class="code" href="structroot__chan__s.html#a9d4d92ffa8b4079202ddebe3ba0eb290">hmm</a>, newscore,</div><div class="line"><a name="l00769"></a><span class="lineno">  769</span>&#160;                          best_silrc_bp, nf);</div><div class="line"><a name="l00770"></a><span class="lineno">  770</span>&#160;                bitvec_set(ngs-&gt;<a class="code" href="structngram__search__s.html#aeb4c98851bf9b239ca607ca59f59ff4c">word_active</a>, w);</div><div class="line"><a name="l00771"></a><span class="lineno">  771</span>&#160;            }</div><div class="line"><a name="l00772"></a><span class="lineno">  772</span>&#160;        }</div><div class="line"><a name="l00773"></a><span class="lineno">  773</span>&#160;    }</div><div class="line"><a name="l00774"></a><span class="lineno">  774</span>&#160;</div><div class="line"><a name="l00775"></a><span class="lineno">  775</span>&#160;    <span class="comment">/* Reset initial channels of words that have become inactive even after word trans. */</span></div><div class="line"><a name="l00776"></a><span class="lineno">  776</span>&#160;    nw = ngs-&gt;<a class="code" href="structngram__search__s.html#a5c864f1fe331fc95c04e0d87a5bdf9ee">n_active_word</a>[cf &amp; 0x1];</div><div class="line"><a name="l00777"></a><span class="lineno">  777</span>&#160;    awl = ngs-&gt;<a class="code" href="structngram__search__s.html#a5056573bf95990cc28c97a56cd76ce9a">active_word_list</a>[cf &amp; 0x1];</div><div class="line"><a name="l00778"></a><span class="lineno">  778</span>&#160;    <span class="keywordflow">for</span> (i = 0; i &lt; nw; i++) {</div><div class="line"><a name="l00779"></a><span class="lineno">  779</span>&#160;        w = *(awl++);</div><div class="line"><a name="l00780"></a><span class="lineno">  780</span>&#160;        rhmm = (<a class="code" href="structroot__chan__s.html">root_chan_t</a> *) ngs-&gt;<a class="code" href="structngram__search__s.html#a79deb7295a261cd82d2a6b48cb119e77">word_chan</a>[w];</div><div class="line"><a name="l00781"></a><span class="lineno">  781</span>&#160;        if (hmm_frame(&amp;rhmm-&gt;<a class="code" href="structroot__chan__s.html#a9d4d92ffa8b4079202ddebe3ba0eb290">hmm</a>) == cf) {</div><div class="line"><a name="l00782"></a><span class="lineno">  782</span>&#160;            <a class="code" href="hmm_8h.html#a9561d7ffa1e61c99de2d2b900774152f">hmm_clear_scores</a>(&amp;rhmm-&gt;<a class="code" href="structroot__chan__s.html#a9d4d92ffa8b4079202ddebe3ba0eb290">hmm</a>);</div><div class="line"><a name="l00783"></a><span class="lineno">  783</span>&#160;        }</div><div class="line"><a name="l00784"></a><span class="lineno">  784</span>&#160;    }</div><div class="line"><a name="l00785"></a><span class="lineno">  785</span>&#160;}</div><div class="line"><a name="l00786"></a><span class="lineno">  786</span>&#160;</div><div class="line"><a name="l00787"></a><span class="lineno">  787</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span></div><div class="line"><a name="l00788"></a><span class="lineno">  788</span>&#160;fwdflat_renormalize_scores(<a class="code" href="structngram__search__s.html">ngram_search_t</a> *ngs, <span class="keywordtype">int</span> frame_idx, int32 norm)</div><div class="line"><a name="l00789"></a><span class="lineno">  789</span>&#160;{</div><div class="line"><a name="l00790"></a><span class="lineno">  790</span>&#160;    <a class="code" href="structroot__chan__s.html">root_chan_t</a> *rhmm;</div><div class="line"><a name="l00791"></a><span class="lineno">  791</span>&#160;    <a class="code" href="structchan__s.html">chan_t</a> *hmm;</div><div class="line"><a name="l00792"></a><span class="lineno">  792</span>&#160;    int32 i, nw, cf, w, *awl;</div><div class="line"><a name="l00793"></a><span class="lineno">  793</span>&#160;</div><div class="line"><a name="l00794"></a><span class="lineno">  794</span>&#160;    cf = frame_idx;</div><div class="line"><a name="l00795"></a><span class="lineno">  795</span>&#160;</div><div class="line"><a name="l00796"></a><span class="lineno">  796</span>&#160;    <span class="comment">/* Renormalize individual word channels */</span></div><div class="line"><a name="l00797"></a><span class="lineno">  797</span>&#160;    nw = ngs-&gt;<a class="code" href="structngram__search__s.html#a5c864f1fe331fc95c04e0d87a5bdf9ee">n_active_word</a>[cf &amp; 0x1];</div><div class="line"><a name="l00798"></a><span class="lineno">  798</span>&#160;    awl = ngs-&gt;<a class="code" href="structngram__search__s.html#a5056573bf95990cc28c97a56cd76ce9a">active_word_list</a>[cf &amp; 0x1];</div><div class="line"><a name="l00799"></a><span class="lineno">  799</span>&#160;    <span class="keywordflow">for</span> (i = 0; i &lt; nw; i++) {</div><div class="line"><a name="l00800"></a><span class="lineno">  800</span>&#160;        w = *(awl++);</div><div class="line"><a name="l00801"></a><span class="lineno">  801</span>&#160;        rhmm = (<a class="code" href="structroot__chan__s.html">root_chan_t</a> *) ngs-&gt;<a class="code" href="structngram__search__s.html#a79deb7295a261cd82d2a6b48cb119e77">word_chan</a>[w];</div><div class="line"><a name="l00802"></a><span class="lineno">  802</span>&#160;        if (hmm_frame(&amp;rhmm-&gt;<a class="code" href="structroot__chan__s.html#a9d4d92ffa8b4079202ddebe3ba0eb290">hmm</a>) == cf) {</div><div class="line"><a name="l00803"></a><span class="lineno">  803</span>&#160;            <a class="code" href="hmm_8h.html#a0438bc7672ff9200274ffe7b5051eb92">hmm_normalize</a>(&amp;rhmm-&gt;<a class="code" href="structroot__chan__s.html#a9d4d92ffa8b4079202ddebe3ba0eb290">hmm</a>, norm);</div><div class="line"><a name="l00804"></a><span class="lineno">  804</span>&#160;        }</div><div class="line"><a name="l00805"></a><span class="lineno">  805</span>&#160;        <span class="keywordflow">for</span> (hmm = rhmm-&gt;<a class="code" href="structroot__chan__s.html#ae0f0b90a7cb2fcb54cd7b30502dd497e">next</a>; hmm; hmm = hmm-&gt;<a class="code" href="structchan__s.html#a260b68eff64150d0ae9ce4db7feb1300">next</a>) {</div><div class="line"><a name="l00806"></a><span class="lineno">  806</span>&#160;            <span class="keywordflow">if</span> (hmm_frame(&amp;hmm-&gt;<a class="code" href="structchan__s.html#a742d6a125ac468b95a1ddd880a956e35">hmm</a>) == cf) {</div><div class="line"><a name="l00807"></a><span class="lineno">  807</span>&#160;                <a class="code" href="hmm_8h.html#a0438bc7672ff9200274ffe7b5051eb92">hmm_normalize</a>(&amp;hmm-&gt;<a class="code" href="structchan__s.html#a742d6a125ac468b95a1ddd880a956e35">hmm</a>, norm);</div><div class="line"><a name="l00808"></a><span class="lineno">  808</span>&#160;            }</div><div class="line"><a name="l00809"></a><span class="lineno">  809</span>&#160;        }</div><div class="line"><a name="l00810"></a><span class="lineno">  810</span>&#160;    }</div><div class="line"><a name="l00811"></a><span class="lineno">  811</span>&#160;</div><div class="line"><a name="l00812"></a><span class="lineno">  812</span>&#160;    ngs-&gt;renormalized = TRUE;</div><div class="line"><a name="l00813"></a><span class="lineno">  813</span>&#160;}</div><div class="line"><a name="l00814"></a><span class="lineno">  814</span>&#160;</div><div class="line"><a name="l00815"></a><span class="lineno">  815</span>&#160;<span class="keywordtype">int</span></div><div class="line"><a name="l00816"></a><span class="lineno"><a class="line" href="ngram__search__fwdflat_8h.html#ae77ef21ae92dbcc4b14f40469fbd4307">  816</a></span>&#160;<a class="code" href="ngram__search__fwdflat_8c.html#ae77ef21ae92dbcc4b14f40469fbd4307">ngram_fwdflat_search</a>(<a class="code" href="structngram__search__s.html">ngram_search_t</a> *ngs, <span class="keywordtype">int</span> frame_idx)</div><div class="line"><a name="l00817"></a><span class="lineno">  817</span>&#160;{</div><div class="line"><a name="l00818"></a><span class="lineno">  818</span>&#160;    int16 <span class="keyword">const</span> *senscr;</div><div class="line"><a name="l00819"></a><span class="lineno">  819</span>&#160;    int32 nf, i, j;</div><div class="line"><a name="l00820"></a><span class="lineno">  820</span>&#160;    int32 *nawl;</div><div class="line"><a name="l00821"></a><span class="lineno">  821</span>&#160;</div><div class="line"><a name="l00822"></a><span class="lineno">  822</span>&#160;    <span class="comment">/* Activate our HMMs for the current frame if need be. */</span></div><div class="line"><a name="l00823"></a><span class="lineno">  823</span>&#160;    <span class="keywordflow">if</span> (!ps_search_acmod(ngs)-&gt;compallsen)</div><div class="line"><a name="l00824"></a><span class="lineno">  824</span>&#160;        compute_fwdflat_sen_active(ngs, frame_idx);</div><div class="line"><a name="l00825"></a><span class="lineno">  825</span>&#160;</div><div class="line"><a name="l00826"></a><span class="lineno">  826</span>&#160;    <span class="comment">/* Compute GMM scores for the current frame. */</span></div><div class="line"><a name="l00827"></a><span class="lineno">  827</span>&#160;    senscr = <a class="code" href="acmod_8c.html#acd78e9bae06724df9c53f844d90c1c8a">acmod_score</a>(ps_search_acmod(ngs), &amp;frame_idx);</div><div class="line"><a name="l00828"></a><span class="lineno">  828</span>&#160;    ngs-&gt;<a class="code" href="structngram__search__s.html#a5758d167fbb48e824a6a58186620e06d">st</a>.n_senone_active_utt += ps_search_acmod(ngs)-&gt;n_senone_active;</div><div class="line"><a name="l00829"></a><span class="lineno">  829</span>&#160;</div><div class="line"><a name="l00830"></a><span class="lineno">  830</span>&#160;    <span class="comment">/* Mark backpointer table for current frame. */</span></div><div class="line"><a name="l00831"></a><span class="lineno">  831</span>&#160;    <a class="code" href="ngram__search_8c.html#a7772e007b7d7fdf437c87aeb08b59c71">ngram_search_mark_bptable</a>(ngs, frame_idx);</div><div class="line"><a name="l00832"></a><span class="lineno">  832</span>&#160;</div><div class="line"><a name="l00833"></a><span class="lineno">  833</span>&#160;    <span class="comment">/* If the best score is equal to or worse than WORST_SCORE,</span></div><div class="line"><a name="l00834"></a><span class="lineno">  834</span>&#160;<span class="comment">     * recognition has failed, don&#39;t bother to keep trying. */</span></div><div class="line"><a name="l00835"></a><span class="lineno">  835</span>&#160;    <span class="keywordflow">if</span> (ngs-&gt;<a class="code" href="structngram__search__s.html#a150d99157e2f37a6f0dbb4b02682d9c3">best_score</a> == <a class="code" href="hmm_8h.html#a833f100ee293ad0f1c03f2a5ef9be77a">WORST_SCORE</a> || ngs-&gt;<a class="code" href="structngram__search__s.html#a150d99157e2f37a6f0dbb4b02682d9c3">best_score</a> <a class="code" href="hmm_8h.html#aa930fb8fb6fce7f34bcf4018b81d7066">WORSE_THAN</a> <a class="code" href="hmm_8h.html#a833f100ee293ad0f1c03f2a5ef9be77a">WORST_SCORE</a>)</div><div class="line"><a name="l00836"></a><span class="lineno">  836</span>&#160;        <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l00837"></a><span class="lineno">  837</span>&#160;    <span class="comment">/* Renormalize if necessary */</span></div><div class="line"><a name="l00838"></a><span class="lineno">  838</span>&#160;    <span class="keywordflow">if</span> (ngs-&gt;<a class="code" href="structngram__search__s.html#a150d99157e2f37a6f0dbb4b02682d9c3">best_score</a> + (2 * ngs-&gt;beam) <a class="code" href="hmm_8h.html#aa930fb8fb6fce7f34bcf4018b81d7066">WORSE_THAN</a> WORST_SCORE) {</div><div class="line"><a name="l00839"></a><span class="lineno">  839</span>&#160;        E_INFO(<span class="stringliteral">&quot;Renormalizing Scores at frame %d, best score %d\n&quot;</span>,</div><div class="line"><a name="l00840"></a><span class="lineno">  840</span>&#160;               frame_idx, ngs-&gt;<a class="code" href="structngram__search__s.html#a150d99157e2f37a6f0dbb4b02682d9c3">best_score</a>);</div><div class="line"><a name="l00841"></a><span class="lineno">  841</span>&#160;        fwdflat_renormalize_scores(ngs, frame_idx, ngs-&gt;<a class="code" href="structngram__search__s.html#a150d99157e2f37a6f0dbb4b02682d9c3">best_score</a>);</div><div class="line"><a name="l00842"></a><span class="lineno">  842</span>&#160;    }</div><div class="line"><a name="l00843"></a><span class="lineno">  843</span>&#160;</div><div class="line"><a name="l00844"></a><span class="lineno">  844</span>&#160;    ngs-&gt;<a class="code" href="structngram__search__s.html#a150d99157e2f37a6f0dbb4b02682d9c3">best_score</a> = <a class="code" href="hmm_8h.html#a833f100ee293ad0f1c03f2a5ef9be77a">WORST_SCORE</a>;</div><div class="line"><a name="l00845"></a><span class="lineno">  845</span>&#160;    <a class="code" href="hmm_8h.html#a44d0b5515cb269bf9b95f62aada18cbb">hmm_context_set_senscore</a>(ngs-&gt;<a class="code" href="structngram__search__s.html#acfbdd34e3dadbaa384818402f1dd59bf">hmmctx</a>, senscr);</div><div class="line"><a name="l00846"></a><span class="lineno">  846</span>&#160;</div><div class="line"><a name="l00847"></a><span class="lineno">  847</span>&#160;    <span class="comment">/* Evaluate HMMs */</span></div><div class="line"><a name="l00848"></a><span class="lineno">  848</span>&#160;    fwdflat_eval_chan(ngs, frame_idx);</div><div class="line"><a name="l00849"></a><span class="lineno">  849</span>&#160;    <span class="comment">/* Prune HMMs and do phone transitions. */</span></div><div class="line"><a name="l00850"></a><span class="lineno">  850</span>&#160;    fwdflat_prune_chan(ngs, frame_idx);</div><div class="line"><a name="l00851"></a><span class="lineno">  851</span>&#160;    <span class="comment">/* Do word transitions. */</span></div><div class="line"><a name="l00852"></a><span class="lineno">  852</span>&#160;    fwdflat_word_transition(ngs, frame_idx);</div><div class="line"><a name="l00853"></a><span class="lineno">  853</span>&#160;</div><div class="line"><a name="l00854"></a><span class="lineno">  854</span>&#160;    <span class="comment">/* Create next active word list, skip fillers */</span></div><div class="line"><a name="l00855"></a><span class="lineno">  855</span>&#160;    nf = frame_idx + 1;</div><div class="line"><a name="l00856"></a><span class="lineno">  856</span>&#160;    nawl = ngs-&gt;<a class="code" href="structngram__search__s.html#a5056573bf95990cc28c97a56cd76ce9a">active_word_list</a>[nf &amp; 0x1];</div><div class="line"><a name="l00857"></a><span class="lineno">  857</span>&#160;    <span class="keywordflow">for</span> (i = 0, j = 0; ngs-&gt;<a class="code" href="structngram__search__s.html#a774f1640c5ece856f4bef98d98e7c959">fwdflat_wordlist</a>[i] &gt;= 0; i++) {</div><div class="line"><a name="l00858"></a><span class="lineno">  858</span>&#160;        int32 wid = ngs-&gt;<a class="code" href="structngram__search__s.html#a774f1640c5ece856f4bef98d98e7c959">fwdflat_wordlist</a>[i];</div><div class="line"><a name="l00859"></a><span class="lineno">  859</span>&#160;        <span class="keywordflow">if</span> (bitvec_is_set(ngs-&gt;<a class="code" href="structngram__search__s.html#aeb4c98851bf9b239ca607ca59f59ff4c">word_active</a>, wid) &amp;&amp; wid &lt; ps_search_start_wid(ngs)) {</div><div class="line"><a name="l00860"></a><span class="lineno">  860</span>&#160;            *(nawl++) = wid;</div><div class="line"><a name="l00861"></a><span class="lineno">  861</span>&#160;            j++;</div><div class="line"><a name="l00862"></a><span class="lineno">  862</span>&#160;        }</div><div class="line"><a name="l00863"></a><span class="lineno">  863</span>&#160;    }</div><div class="line"><a name="l00864"></a><span class="lineno">  864</span>&#160;    <span class="comment">/* Add fillers */</span></div><div class="line"><a name="l00865"></a><span class="lineno">  865</span>&#160;    <span class="keywordflow">for</span> (i = ps_search_start_wid(ngs); i &lt; ps_search_n_words(ngs); i++) {</div><div class="line"><a name="l00866"></a><span class="lineno">  866</span>&#160;        <span class="keywordflow">if</span> (bitvec_is_set(ngs-&gt;<a class="code" href="structngram__search__s.html#aeb4c98851bf9b239ca607ca59f59ff4c">word_active</a>, i)) {</div><div class="line"><a name="l00867"></a><span class="lineno">  867</span>&#160;            *(nawl++) = i;</div><div class="line"><a name="l00868"></a><span class="lineno">  868</span>&#160;            j++;</div><div class="line"><a name="l00869"></a><span class="lineno">  869</span>&#160;        }</div><div class="line"><a name="l00870"></a><span class="lineno">  870</span>&#160;    }</div><div class="line"><a name="l00871"></a><span class="lineno">  871</span>&#160;    <span class="keywordflow">if</span> (!ngs-&gt;fwdtree)</div><div class="line"><a name="l00872"></a><span class="lineno">  872</span>&#160;        ++ngs-&gt;<a class="code" href="structngram__search__s.html#a5255e56d28c239a4e1d9b1721e8a2f8d">n_frame</a>;</div><div class="line"><a name="l00873"></a><span class="lineno">  873</span>&#160;    ngs-&gt;<a class="code" href="structngram__search__s.html#a5c864f1fe331fc95c04e0d87a5bdf9ee">n_active_word</a>[nf &amp; 0x1] = j;</div><div class="line"><a name="l00874"></a><span class="lineno">  874</span>&#160;</div><div class="line"><a name="l00875"></a><span class="lineno">  875</span>&#160;    <span class="comment">/* Return the number of frames processed. */</span></div><div class="line"><a name="l00876"></a><span class="lineno">  876</span>&#160;    <span class="keywordflow">return</span> 1;</div><div class="line"><a name="l00877"></a><span class="lineno">  877</span>&#160;}</div><div class="line"><a name="l00878"></a><span class="lineno">  878</span>&#160;</div><div class="line"><a name="l00882"></a><span class="lineno">  882</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span></div><div class="line"><a name="l00883"></a><span class="lineno">  883</span>&#160;destroy_fwdflat_wordlist(<a class="code" href="structngram__search__s.html">ngram_search_t</a> *ngs)</div><div class="line"><a name="l00884"></a><span class="lineno">  884</span>&#160;{</div><div class="line"><a name="l00885"></a><span class="lineno">  885</span>&#160;    <a class="code" href="structps__latnode__s.html">ps_latnode_t</a> *node, *tnode;</div><div class="line"><a name="l00886"></a><span class="lineno">  886</span>&#160;    int32 f;</div><div class="line"><a name="l00887"></a><span class="lineno">  887</span>&#160;</div><div class="line"><a name="l00888"></a><span class="lineno">  888</span>&#160;    <span class="keywordflow">if</span> (!ngs-&gt;fwdtree)</div><div class="line"><a name="l00889"></a><span class="lineno">  889</span>&#160;        <span class="keywordflow">return</span>;</div><div class="line"><a name="l00890"></a><span class="lineno">  890</span>&#160;</div><div class="line"><a name="l00891"></a><span class="lineno">  891</span>&#160;    <span class="keywordflow">for</span> (f = 0; f &lt; ngs-&gt;<a class="code" href="structngram__search__s.html#a5255e56d28c239a4e1d9b1721e8a2f8d">n_frame</a>; f++) {</div><div class="line"><a name="l00892"></a><span class="lineno">  892</span>&#160;        <span class="keywordflow">for</span> (node = ngs-&gt;<a class="code" href="structngram__search__s.html#aa54544457c363ccccb87fc7ec63a5f3e">frm_wordlist</a>[f]; node; node = tnode) {</div><div class="line"><a name="l00893"></a><span class="lineno">  893</span>&#160;            tnode = node-&gt;<a class="code" href="structps__latnode__s.html#aca6f3d543a1712a1ca3bb8ec60f71c84">next</a>;</div><div class="line"><a name="l00894"></a><span class="lineno">  894</span>&#160;            listelem_free(ngs-&gt;<a class="code" href="structngram__search__s.html#a21600dc2e23744f0be9c64a4db8d7e50">latnode_alloc</a>, node);</div><div class="line"><a name="l00895"></a><span class="lineno">  895</span>&#160;        }</div><div class="line"><a name="l00896"></a><span class="lineno">  896</span>&#160;    }</div><div class="line"><a name="l00897"></a><span class="lineno">  897</span>&#160;}</div><div class="line"><a name="l00898"></a><span class="lineno">  898</span>&#160;</div><div class="line"><a name="l00902"></a><span class="lineno">  902</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span></div><div class="line"><a name="l00903"></a><span class="lineno">  903</span>&#160;destroy_fwdflat_chan(<a class="code" href="structngram__search__s.html">ngram_search_t</a> *ngs)</div><div class="line"><a name="l00904"></a><span class="lineno">  904</span>&#160;{</div><div class="line"><a name="l00905"></a><span class="lineno">  905</span>&#160;    int32 i, wid;</div><div class="line"><a name="l00906"></a><span class="lineno">  906</span>&#160;</div><div class="line"><a name="l00907"></a><span class="lineno">  907</span>&#160;    <span class="keywordflow">for</span> (i = 0; ngs-&gt;<a class="code" href="structngram__search__s.html#a774f1640c5ece856f4bef98d98e7c959">fwdflat_wordlist</a>[i] &gt;= 0; i++) {</div><div class="line"><a name="l00908"></a><span class="lineno">  908</span>&#160;        <a class="code" href="structroot__chan__s.html">root_chan_t</a> *rhmm;</div><div class="line"><a name="l00909"></a><span class="lineno">  909</span>&#160;        <a class="code" href="structchan__s.html">chan_t</a> *thmm;</div><div class="line"><a name="l00910"></a><span class="lineno">  910</span>&#160;        wid = ngs-&gt;<a class="code" href="structngram__search__s.html#a774f1640c5ece856f4bef98d98e7c959">fwdflat_wordlist</a>[i];</div><div class="line"><a name="l00911"></a><span class="lineno">  911</span>&#160;        <span class="keywordflow">if</span> (dict_is_single_phone(ps_search_dict(ngs),wid))</div><div class="line"><a name="l00912"></a><span class="lineno">  912</span>&#160;            <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00913"></a><span class="lineno">  913</span>&#160;        assert(ngs-&gt;<a class="code" href="structngram__search__s.html#a79deb7295a261cd82d2a6b48cb119e77">word_chan</a>[wid] != NULL);</div><div class="line"><a name="l00914"></a><span class="lineno">  914</span>&#160;</div><div class="line"><a name="l00915"></a><span class="lineno">  915</span>&#160;        <span class="comment">/* The first HMM in ngs-&gt;word_chan[wid] was allocated with</span></div><div class="line"><a name="l00916"></a><span class="lineno">  916</span>&#160;<span class="comment">         * ngs-&gt;root_chan_alloc, but this will attempt to free it</span></div><div class="line"><a name="l00917"></a><span class="lineno">  917</span>&#160;<span class="comment">         * using ngs-&gt;chan_alloc, which will not work.  Therefore we</span></div><div class="line"><a name="l00918"></a><span class="lineno">  918</span>&#160;<span class="comment">         * free it manually and move the list forward before handing</span></div><div class="line"><a name="l00919"></a><span class="lineno">  919</span>&#160;<span class="comment">         * it off. */</span></div><div class="line"><a name="l00920"></a><span class="lineno">  920</span>&#160;        rhmm = (<a class="code" href="structroot__chan__s.html">root_chan_t</a> *)ngs-&gt;<a class="code" href="structngram__search__s.html#a79deb7295a261cd82d2a6b48cb119e77">word_chan</a>[wid];</div><div class="line"><a name="l00921"></a><span class="lineno">  921</span>&#160;        thmm = rhmm-&gt;<a class="code" href="structroot__chan__s.html#ae0f0b90a7cb2fcb54cd7b30502dd497e">next</a>;</div><div class="line"><a name="l00922"></a><span class="lineno">  922</span>&#160;        listelem_free(ngs-&gt;<a class="code" href="structngram__search__s.html#a576470858bfa44c671f0e677902ab424">root_chan_alloc</a>, rhmm);</div><div class="line"><a name="l00923"></a><span class="lineno">  923</span>&#160;        ngs-&gt;<a class="code" href="structngram__search__s.html#a79deb7295a261cd82d2a6b48cb119e77">word_chan</a>[wid] = thmm;</div><div class="line"><a name="l00924"></a><span class="lineno">  924</span>&#160;        <a class="code" href="ngram__search_8c.html#a15477192481dffcb29e9c4167eff6c3c">ngram_search_free_all_rc</a>(ngs, wid);</div><div class="line"><a name="l00925"></a><span class="lineno">  925</span>&#160;    }</div><div class="line"><a name="l00926"></a><span class="lineno">  926</span>&#160;}</div><div class="line"><a name="l00927"></a><span class="lineno">  927</span>&#160;</div><div class="line"><a name="l00928"></a><span class="lineno">  928</span>&#160;<span class="keywordtype">void</span></div><div class="line"><a name="l00929"></a><span class="lineno"><a class="line" href="ngram__search__fwdflat_8h.html#ac855cf540ac4acdfa320629720ded6fe">  929</a></span>&#160;<a class="code" href="ngram__search__fwdflat_8c.html#ac855cf540ac4acdfa320629720ded6fe">ngram_fwdflat_finish</a>(<a class="code" href="structngram__search__s.html">ngram_search_t</a> *ngs)</div><div class="line"><a name="l00930"></a><span class="lineno">  930</span>&#160;{</div><div class="line"><a name="l00931"></a><span class="lineno">  931</span>&#160;    int32 cf;</div><div class="line"><a name="l00932"></a><span class="lineno">  932</span>&#160;</div><div class="line"><a name="l00933"></a><span class="lineno">  933</span>&#160;    destroy_fwdflat_chan(ngs);</div><div class="line"><a name="l00934"></a><span class="lineno">  934</span>&#160;    destroy_fwdflat_wordlist(ngs);</div><div class="line"><a name="l00935"></a><span class="lineno">  935</span>&#160;    bitvec_clear_all(ngs-&gt;<a class="code" href="structngram__search__s.html#aeb4c98851bf9b239ca607ca59f59ff4c">word_active</a>, ps_search_n_words(ngs));</div><div class="line"><a name="l00936"></a><span class="lineno">  936</span>&#160;</div><div class="line"><a name="l00937"></a><span class="lineno">  937</span>&#160;    <span class="comment">/* This is the number of frames processed. */</span></div><div class="line"><a name="l00938"></a><span class="lineno">  938</span>&#160;    cf = ps_search_acmod(ngs)-&gt;output_frame;</div><div class="line"><a name="l00939"></a><span class="lineno">  939</span>&#160;    <span class="comment">/* Add a mark in the backpointer table for one past the final frame. */</span></div><div class="line"><a name="l00940"></a><span class="lineno">  940</span>&#160;    <a class="code" href="ngram__search_8c.html#a7772e007b7d7fdf437c87aeb08b59c71">ngram_search_mark_bptable</a>(ngs, cf);</div><div class="line"><a name="l00941"></a><span class="lineno">  941</span>&#160;</div><div class="line"><a name="l00942"></a><span class="lineno">  942</span>&#160;    ptmr_stop(&amp;ngs-&gt;fwdflat_perf);</div><div class="line"><a name="l00943"></a><span class="lineno">  943</span>&#160;    <span class="comment">/* Print out some statistics. */</span></div><div class="line"><a name="l00944"></a><span class="lineno">  944</span>&#160;    <span class="keywordflow">if</span> (cf &gt; 0) {</div><div class="line"><a name="l00945"></a><span class="lineno">  945</span>&#160;        <span class="keywordtype">double</span> n_speech = (double)(cf + 1)</div><div class="line"><a name="l00946"></a><span class="lineno">  946</span>&#160;            / cmd_ln_int32_r(ps_search_config(ngs), <span class="stringliteral">&quot;-frate&quot;</span>);</div><div class="line"><a name="l00947"></a><span class="lineno">  947</span>&#160;        E_INFO(<span class="stringliteral">&quot;%8d words recognized (%d/fr)\n&quot;</span>,</div><div class="line"><a name="l00948"></a><span class="lineno">  948</span>&#160;               ngs-&gt;bpidx, (ngs-&gt;bpidx + (cf &gt;&gt; 1)) / (cf + 1));</div><div class="line"><a name="l00949"></a><span class="lineno">  949</span>&#160;        E_INFO(<span class="stringliteral">&quot;%8d senones evaluated (%d/fr)\n&quot;</span>, ngs-&gt;<a class="code" href="structngram__search__s.html#a5758d167fbb48e824a6a58186620e06d">st</a>.n_senone_active_utt,</div><div class="line"><a name="l00950"></a><span class="lineno">  950</span>&#160;               (ngs-&gt;<a class="code" href="structngram__search__s.html#a5758d167fbb48e824a6a58186620e06d">st</a>.n_senone_active_utt + (cf &gt;&gt; 1)) / (cf + 1));</div><div class="line"><a name="l00951"></a><span class="lineno">  951</span>&#160;        E_INFO(<span class="stringliteral">&quot;%8d channels searched (%d/fr)\n&quot;</span>,</div><div class="line"><a name="l00952"></a><span class="lineno">  952</span>&#160;               ngs-&gt;<a class="code" href="structngram__search__s.html#a5758d167fbb48e824a6a58186620e06d">st</a>.n_fwdflat_chan, ngs-&gt;<a class="code" href="structngram__search__s.html#a5758d167fbb48e824a6a58186620e06d">st</a>.n_fwdflat_chan / (cf + 1));</div><div class="line"><a name="l00953"></a><span class="lineno">  953</span>&#160;        E_INFO(<span class="stringliteral">&quot;%8d words searched (%d/fr)\n&quot;</span>,</div><div class="line"><a name="l00954"></a><span class="lineno">  954</span>&#160;               ngs-&gt;<a class="code" href="structngram__search__s.html#a5758d167fbb48e824a6a58186620e06d">st</a>.n_fwdflat_words, ngs-&gt;<a class="code" href="structngram__search__s.html#a5758d167fbb48e824a6a58186620e06d">st</a>.n_fwdflat_words / (cf + 1));</div><div class="line"><a name="l00955"></a><span class="lineno">  955</span>&#160;        E_INFO(<span class="stringliteral">&quot;%8d word transitions (%d/fr)\n&quot;</span>,</div><div class="line"><a name="l00956"></a><span class="lineno">  956</span>&#160;               ngs-&gt;<a class="code" href="structngram__search__s.html#a5758d167fbb48e824a6a58186620e06d">st</a>.n_fwdflat_word_transition,</div><div class="line"><a name="l00957"></a><span class="lineno">  957</span>&#160;               ngs-&gt;<a class="code" href="structngram__search__s.html#a5758d167fbb48e824a6a58186620e06d">st</a>.n_fwdflat_word_transition / (cf + 1));</div><div class="line"><a name="l00958"></a><span class="lineno">  958</span>&#160;        E_INFO(<span class="stringliteral">&quot;fwdflat %.2f CPU %.3f xRT\n&quot;</span>,</div><div class="line"><a name="l00959"></a><span class="lineno">  959</span>&#160;               ngs-&gt;fwdflat_perf.t_cpu,</div><div class="line"><a name="l00960"></a><span class="lineno">  960</span>&#160;               ngs-&gt;fwdflat_perf.t_cpu / n_speech);</div><div class="line"><a name="l00961"></a><span class="lineno">  961</span>&#160;        E_INFO(<span class="stringliteral">&quot;fwdflat %.2f wall %.3f xRT\n&quot;</span>,</div><div class="line"><a name="l00962"></a><span class="lineno">  962</span>&#160;               ngs-&gt;fwdflat_perf.t_elapsed,</div><div class="line"><a name="l00963"></a><span class="lineno">  963</span>&#160;               ngs-&gt;fwdflat_perf.t_elapsed / n_speech);</div><div class="line"><a name="l00964"></a><span class="lineno">  964</span>&#160;    }</div><div class="line"><a name="l00965"></a><span class="lineno">  965</span>&#160;}</div><div class="ttc" id="structchan__s_html_a742d6a125ac468b95a1ddd880a956e35"><div class="ttname"><a href="structchan__s.html#a742d6a125ac468b95a1ddd880a956e35">chan_s::hmm</a></div><div class="ttdeci">hmm_t hmm</div><div class="ttdoc">Basic HMM structure. </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search_8h_source.html#l00065">ngram_search.h:65</a></div></div>
<div class="ttc" id="structngram__search__s_html_a38ea5de504b3d7ad2390a3f8966d502f"><div class="ttname"><a href="structngram__search__s.html#a38ea5de504b3d7ad2390a3f8966d502f">ngram_search_s::n_frame_alloc</a></div><div class="ttdeci">int32 n_frame_alloc</div><div class="ttdoc">Number of frames allocated in bp_table_idx and friends. </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search_8h_source.html#l00307">ngram_search.h:307</a></div></div>
<div class="ttc" id="structbptbl__s_html_a143ff0891fafd471000df7c73123b8a7"><div class="ttname"><a href="structbptbl__s.html#a143ff0891fafd471000df7c73123b8a7">bptbl_s::wid</a></div><div class="ttdeci">int32 wid</div><div class="ttdoc">Word index. </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search_8h_source.html#l00113">ngram_search.h:113</a></div></div>
<div class="ttc" id="ngram__search_8c_html_a1ddcc1a9cb3e164ceb2140097ed23a3e"><div class="ttname"><a href="ngram__search_8c.html#a1ddcc1a9cb3e164ceb2140097ed23a3e">ngram_search_alloc_all_rc</a></div><div class="ttdeci">void ngram_search_alloc_all_rc(ngram_search_t *ngs, int32 w)</div><div class="ttdoc">Allocate last phone channels for all possible right contexts for word w. </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search_8c_source.html#l00601">ngram_search.c:601</a></div></div>
<div class="ttc" id="hmm_8h_html_aa911ae0d1c0eba562692fbeebca90d78"><div class="ttname"><a href="hmm_8h.html#aa911ae0d1c0eba562692fbeebca90d78">hmm_init</a></div><div class="ttdeci">void hmm_init(hmm_context_t *ctx, hmm_t *hmm, int mpx, int ssid, int tmatid)</div><div class="ttdoc">Populate a previously-allocated HMM structure, allocating internal data. </div><div class="ttdef"><b>Definition:</b> <a href="hmm_8c_source.html#l00089">hmm.c:89</a></div></div>
<div class="ttc" id="structps__latnode__s_html_a5c7b9114d131151d6ce85228ea9f829d"><div class="ttname"><a href="structps__latnode__s.html#a5c7b9114d131151d6ce85228ea9f829d">ps_latnode_s::lef</a></div><div class="ttdeci">int32 lef</div><div class="ttdoc">Last end frame. </div><div class="ttdef"><b>Definition:</b> <a href="ps__lattice__internal_8h_source.html#l00119">ps_lattice_internal.h:119</a></div></div>
<div class="ttc" id="structroot__chan__s_html_ae0f0b90a7cb2fcb54cd7b30502dd497e"><div class="ttname"><a href="structroot__chan__s.html#ae0f0b90a7cb2fcb54cd7b30502dd497e">root_chan_s::next</a></div><div class="ttdeci">chan_t * next</div><div class="ttdoc">first descendant of this channel </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search_8h_source.html#l00094">ngram_search.h:94</a></div></div>
<div class="ttc" id="structngram__search__s_html_abe9fe60f6e48b9a6e3d41856bb1dc109"><div class="ttname"><a href="structngram__search__s.html#abe9fe60f6e48b9a6e3d41856bb1dc109">ngram_search_s::chan_alloc</a></div><div class="ttdeci">listelem_alloc_t * chan_alloc</div><div class="ttdoc">For chan_t. </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search_8h_source.html#l00211">ngram_search.h:211</a></div></div>
<div class="ttc" id="structbptbl__s_html_ae52081dde905cf6e7d988cdeb4c9b8b3"><div class="ttname"><a href="structbptbl__s.html#ae52081dde905cf6e7d988cdeb4c9b8b3">bptbl_s::frame</a></div><div class="ttdeci">frame_idx_t frame</div><div class="ttdoc">start or end frame </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search_8h_source.html#l00110">ngram_search.h:110</a></div></div>
<div class="ttc" id="structngram__search__s_html_acfbdd34e3dadbaa384818402f1dd59bf"><div class="ttname"><a href="structngram__search__s.html#acfbdd34e3dadbaa384818402f1dd59bf">ngram_search_s::hmmctx</a></div><div class="ttdeci">hmm_context_t * hmmctx</div><div class="ttdoc">HMM context. </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search_8h_source.html#l00200">ngram_search.h:200</a></div></div>
<div class="ttc" id="hmm_8h_html_a7440ced1649225beb6816bf62481e08b"><div class="ttname"><a href="hmm_8h.html#a7440ced1649225beb6816bf62481e08b">hmm_deinit</a></div><div class="ttdeci">void hmm_deinit(hmm_t *hmm)</div><div class="ttdoc">Free an HMM structure, releasing internal data (but not the HMM structure itself). </div><div class="ttdef"><b>Definition:</b> <a href="hmm_8c_source.html#l00111">hmm.c:111</a></div></div>
<div class="ttc" id="structbptbl__s_html_a27b8e54bb7552e6afc15e4f44f42e3b7"><div class="ttname"><a href="structbptbl__s.html#a27b8e54bb7552e6afc15e4f44f42e3b7">bptbl_s::last2_phone</a></div><div class="ttdeci">int16 last2_phone</div><div class="ttdoc">next-to-last phone of this word </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search_8h_source.html#l00120">ngram_search.h:120</a></div></div>
<div class="ttc" id="acmod_8c_html_a2a7f67d462279b2bc4774c7967ae61c7"><div class="ttname"><a href="acmod_8c.html#a2a7f67d462279b2bc4774c7967ae61c7">acmod_activate_hmm</a></div><div class="ttdeci">void acmod_activate_hmm(acmod_t *acmod, hmm_t *hmm)</div><div class="ttdoc">Activate senones associated with an HMM. </div><div class="ttdef"><b>Definition:</b> <a href="acmod_8c_source.html#l01233">acmod.c:1233</a></div></div>
<div class="ttc" id="ngram__search__fwdflat_8c_html_aa4879c06ddbc455a6f355084a9c574b4"><div class="ttname"><a href="ngram__search__fwdflat_8c.html#aa4879c06ddbc455a6f355084a9c574b4">ngram_fwdflat_reinit</a></div><div class="ttdeci">int ngram_fwdflat_reinit(ngram_search_t *ngs)</div><div class="ttdoc">Rebuild search structures for updated language models. </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search__fwdflat_8c_source.html#l00192">ngram_search_fwdflat.c:192</a></div></div>
<div class="ttc" id="ps__lattice__internal_8h_html"><div class="ttname"><a href="ps__lattice__internal_8h.html">ps_lattice_internal.h</a></div><div class="ttdoc">Word graph search implementation. </div></div>
<div class="ttc" id="structngram__search__s_html_aeb4c98851bf9b239ca607ca59f59ff4c"><div class="ttname"><a href="structngram__search__s.html#aeb4c98851bf9b239ca607ca59f59ff4c">ngram_search_s::word_active</a></div><div class="ttdeci">bitvec_t * word_active</div><div class="ttdoc">array of active flags for all words. </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search_8h_source.html#l00247">ngram_search.h:247</a></div></div>
<div class="ttc" id="ngram__search__fwdflat_8c_html_ac855cf540ac4acdfa320629720ded6fe"><div class="ttname"><a href="ngram__search__fwdflat_8c.html#ac855cf540ac4acdfa320629720ded6fe">ngram_fwdflat_finish</a></div><div class="ttdeci">void ngram_fwdflat_finish(ngram_search_t *ngs)</div><div class="ttdoc">Finish fwdflat decoding for an utterance. </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search__fwdflat_8c_source.html#l00929">ngram_search_fwdflat.c:929</a></div></div>
<div class="ttc" id="ngram__search__fwdflat_8c_html_ae77ef21ae92dbcc4b14f40469fbd4307"><div class="ttname"><a href="ngram__search__fwdflat_8c.html#ae77ef21ae92dbcc4b14f40469fbd4307">ngram_fwdflat_search</a></div><div class="ttdeci">int ngram_fwdflat_search(ngram_search_t *ngs, int frame_idx)</div><div class="ttdoc">Search one frame forward in an utterance. </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search__fwdflat_8c_source.html#l00816">ngram_search_fwdflat.c:816</a></div></div>
<div class="ttc" id="structroot__chan__s_html_ad67c37bf4183f518acd7760c09a806f6"><div class="ttname"><a href="structroot__chan__s.html#ad67c37bf4183f518acd7760c09a806f6">root_chan_s::ciphone</a></div><div class="ttdeci">int16 ciphone</div><div class="ttdoc">first ciphone of this node; all words rooted at this node begin with this ciphone ...</div><div class="ttdef"><b>Definition:</b> <a href="ngram__search_8h_source.html#l00100">ngram_search.h:100</a></div></div>
<div class="ttc" id="structngram__search__s_html_a5056573bf95990cc28c97a56cd76ce9a"><div class="ttname"><a href="structngram__search__s.html#a5056573bf95990cc28c97a56cd76ce9a">ngram_search_s::active_word_list</a></div><div class="ttdeci">int32 ** active_word_list</div><div class="ttdoc">Array of active multi-phone words for current and next frame. </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search_8h_source.html#l00287">ngram_search.h:287</a></div></div>
<div class="ttc" id="structchan__s_html_a260b68eff64150d0ae9ce4db7feb1300"><div class="ttname"><a href="structchan__s.html#a260b68eff64150d0ae9ce4db7feb1300">chan_s::next</a></div><div class="ttdeci">struct chan_s * next</div><div class="ttdoc">first descendant of this channel; or, in the case of the last phone of a word, the next alternative r...</div><div class="ttdef"><b>Definition:</b> <a href="ngram__search_8h_source.html#l00068">ngram_search.h:68</a></div></div>
<div class="ttc" id="ngram__search_8c_html_ae36649be6f5a2190e759e7ed13bd7b6b"><div class="ttname"><a href="ngram__search_8c.html#ae36649be6f5a2190e759e7ed13bd7b6b">ngram_search_save_bp</a></div><div class="ttdeci">void ngram_search_save_bp(ngram_search_t *ngs, int frame_idx, int32 w, int32 score, int32 path, int32 rc)</div><div class="ttdoc">Enter a word in the backpointer table. </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search_8c_source.html#l00383">ngram_search.c:383</a></div></div>
<div class="ttc" id="structngram__search__s_html_a1157923e0060b947e05caa819c8abe2c"><div class="ttname"><a href="structngram__search__s.html#a1157923e0060b947e05caa819c8abe2c">ngram_search_s::single_phone_wid</a></div><div class="ttdeci">int32 * single_phone_wid</div><div class="ttdoc">list of single-phone word ids </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search_8h_source.html#l00264">ngram_search.h:264</a></div></div>
<div class="ttc" id="ngram__search_8c_html_a7772e007b7d7fdf437c87aeb08b59c71"><div class="ttname"><a href="ngram__search_8c.html#a7772e007b7d7fdf437c87aeb08b59c71">ngram_search_mark_bptable</a></div><div class="ttdeci">int ngram_search_mark_bptable(ngram_search_t *ngs, int frame_idx)</div><div class="ttdoc">Record the current frame&amp;#39;s index in the backpointer table. </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search_8c_source.html#l00329">ngram_search.c:329</a></div></div>
<div class="ttc" id="structroot__chan__s_html_a0c0cf22caf4c97879af86865764f1675"><div class="ttname"><a href="structroot__chan__s.html#a0c0cf22caf4c97879af86865764f1675">root_chan_s::ci2phone</a></div><div class="ttdeci">int16 ci2phone</div><div class="ttdoc">second ciphone of this node; one root HMM for each unique right context </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search_8h_source.html#l00102">ngram_search.h:102</a></div></div>
<div class="ttc" id="structbptbl__s_html_a4ca45ebc4a1ac18fc0596195e7e03bc8"><div class="ttname"><a href="structbptbl__s.html#a4ca45ebc4a1ac18fc0596195e7e03bc8">bptbl_s::bp</a></div><div class="ttdeci">int32 bp</div><div class="ttdoc">Back Pointer. </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search_8h_source.html#l00114">ngram_search.h:114</a></div></div>
<div class="ttc" id="structngram__search__s_html_a5c864f1fe331fc95c04e0d87a5bdf9ee"><div class="ttname"><a href="structngram__search__s.html#a5c864f1fe331fc95c04e0d87a5bdf9ee">ngram_search_s::n_active_word</a></div><div class="ttdeci">int32 n_active_word[2]</div><div class="ttdoc">Number entries in active_word_list. </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search_8h_source.html#l00288">ngram_search.h:288</a></div></div>
<div class="ttc" id="structchan__s_html_acf84a2fa662e7ff626769e7d8152a608"><div class="ttname"><a href="structchan__s.html#acf84a2fa662e7ff626769e7d8152a608">chan_s::rc_id</a></div><div class="ttdeci">int32 rc_id</div><div class="ttdoc">right-context id for last phone of words </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search_8h_source.html#l00079">ngram_search.h:79</a></div></div>
<div class="ttc" id="dict2pid_8h_html_a453a98931cad95a19b4c4ab770fc79f1"><div class="ttname"><a href="dict2pid_8h.html#a453a98931cad95a19b4c4ab770fc79f1">dict2pid_rssid</a></div><div class="ttdeci">#define dict2pid_rssid(d, ci, lc)</div><div class="ttdoc">Access macros; not designed for arbitrary use. </div><div class="ttdef"><b>Definition:</b> <a href="dict2pid_8h_source.html#l00115">dict2pid.h:115</a></div></div>
<div class="ttc" id="ngram__search__fwdflat_8c_html_a763c2c7aaa5d7f9c5107af73552a2149"><div class="ttname"><a href="ngram__search__fwdflat_8c.html#a763c2c7aaa5d7f9c5107af73552a2149">ngram_fwdflat_start</a></div><div class="ttdeci">void ngram_fwdflat_start(ngram_search_t *ngs)</div><div class="ttdoc">Start fwdflat decoding for an utterance. </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search__fwdflat_8c_source.html#l00374">ngram_search_fwdflat.c:374</a></div></div>
<div class="ttc" id="structngram__search__s_html"><div class="ttname"><a href="structngram__search__s.html">ngram_search_s</a></div><div class="ttdoc">N-Gram search module structure. </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search_8h_source.html#l00197">ngram_search.h:197</a></div></div>
<div class="ttc" id="hmm_8h_html_a0438bc7672ff9200274ffe7b5051eb92"><div class="ttname"><a href="hmm_8h.html#a0438bc7672ff9200274ffe7b5051eb92">hmm_normalize</a></div><div class="ttdeci">void hmm_normalize(hmm_t *h, int32 bestscr)</div><div class="ttdoc">Renormalize the scores in this HMM based on the given best score. </div><div class="ttdef"><b>Definition:</b> <a href="hmm_8c_source.html#l00209">hmm.c:209</a></div></div>
<div class="ttc" id="structbptbl__s_html_a91247e4f807cf780afe8f5ac45e720b8"><div class="ttname"><a href="structbptbl__s.html#a91247e4f807cf780afe8f5ac45e720b8">bptbl_s::real_wid</a></div><div class="ttdeci">int32 real_wid</div><div class="ttdoc">wid of this or latest predecessor real word </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search_8h_source.html#l00117">ngram_search.h:117</a></div></div>
<div class="ttc" id="structngram__search__s_html_a1ffa3c9100252122ae8a2a713c50b527"><div class="ttname"><a href="structngram__search__s.html#a1ffa3c9100252122ae8a2a713c50b527">ngram_search_s::rhmm_1ph</a></div><div class="ttdeci">root_chan_t * rhmm_1ph</div><div class="ttdoc">Root HMMs for single-phone words. </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search_8h_source.html#l00236">ngram_search.h:236</a></div></div>
<div class="ttc" id="structbptbl__s_html_a83784e3b0121bc365d485151ab277920"><div class="ttname"><a href="structbptbl__s.html#a83784e3b0121bc365d485151ab277920">bptbl_s::prev_real_wid</a></div><div class="ttdeci">int32 prev_real_wid</div><div class="ttdoc">wid of second-last real word </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search_8h_source.html#l00118">ngram_search.h:118</a></div></div>
<div class="ttc" id="hmm_8h_html_a833f100ee293ad0f1c03f2a5ef9be77a"><div class="ttname"><a href="hmm_8h.html#a833f100ee293ad0f1c03f2a5ef9be77a">WORST_SCORE</a></div><div class="ttdeci">#define WORST_SCORE</div><div class="ttdoc">Large &quot;bad&quot; score. </div><div class="ttdef"><b>Definition:</b> <a href="hmm_8h_source.html#l00084">hmm.h:84</a></div></div>
<div class="ttc" id="ngram__search_8h_html"><div class="ttname"><a href="ngram__search_8h.html">ngram_search.h</a></div><div class="ttdoc">N-Gram based multi-pass search (&quot;FBS&quot;) </div></div>
<div class="ttc" id="structngram__search__s_html_a21600dc2e23744f0be9c64a4db8d7e50"><div class="ttname"><a href="structngram__search__s.html#a21600dc2e23744f0be9c64a4db8d7e50">ngram_search_s::latnode_alloc</a></div><div class="ttdeci">listelem_alloc_t * latnode_alloc</div><div class="ttdoc">For latnode_t. </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search_8h_source.html#l00213">ngram_search.h:213</a></div></div>
<div class="ttc" id="structngram__search__s_html_aa54544457c363ccccb87fc7ec63a5f3e"><div class="ttname"><a href="structngram__search__s.html#aa54544457c363ccccb87fc7ec63a5f3e">ngram_search_s::frm_wordlist</a></div><div class="ttdeci">ps_latnode_t ** frm_wordlist</div><div class="ttdoc">List of active words in each frame. </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search_8h_source.html#l00316">ngram_search.h:316</a></div></div>
<div class="ttc" id="structps__latnode__s_html"><div class="ttname"><a href="structps__latnode__s.html">ps_latnode_s</a></div><div class="ttdoc">DAG nodes. </div><div class="ttdef"><b>Definition:</b> <a href="ps__lattice__internal_8h_source.html#l00113">ps_lattice_internal.h:113</a></div></div>
<div class="ttc" id="structroot__chan__s_html"><div class="ttname"><a href="structroot__chan__s.html">root_chan_s</a></div><div class="ttdoc">Lexical tree node data type for the first phone (root) of each dynamic HMM tree structure. </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search_8h_source.html#l00090">ngram_search.h:90</a></div></div>
<div class="ttc" id="hmm_8h_html_a7285d01d533996d750c78e0d96042716"><div class="ttname"><a href="hmm_8h.html#a7285d01d533996d750c78e0d96042716">hmm_enter</a></div><div class="ttdeci">void hmm_enter(hmm_t *h, int32 score, int32 histid, int frame)</div><div class="ttdoc">Enter an HMM with the given path score and history ID. </div><div class="ttdef"><b>Definition:</b> <a href="hmm_8c_source.html#l00201">hmm.c:201</a></div></div>
<div class="ttc" id="structchan__s_html"><div class="ttname"><a href="structchan__s.html">chan_s</a></div><div class="ttdoc">Lexical tree node data type. </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search_8h_source.html#l00064">ngram_search.h:64</a></div></div>
<div class="ttc" id="structroot__chan__s_html_a9d4d92ffa8b4079202ddebe3ba0eb290"><div class="ttname"><a href="structroot__chan__s.html#a9d4d92ffa8b4079202ddebe3ba0eb290">root_chan_s::hmm</a></div><div class="ttdeci">hmm_t hmm</div><div class="ttdoc">Basic HMM structure. </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search_8h_source.html#l00091">ngram_search.h:91</a></div></div>
<div class="ttc" id="acmod_8c_html_aed43f033f434e34fd90c975909d81cb2"><div class="ttname"><a href="acmod_8c.html#aed43f033f434e34fd90c975909d81cb2">acmod_clear_active</a></div><div class="ttdeci">void acmod_clear_active(acmod_t *acmod)</div><div class="ttdoc">Clear set of active senones. </div><div class="ttdef"><b>Definition:</b> <a href="acmod_8c_source.html#l01217">acmod.c:1217</a></div></div>
<div class="ttc" id="structps__latnode__s_html_afd85dbd410d6e6d970c73088bc6fb97e"><div class="ttname"><a href="structps__latnode__s.html#afd85dbd410d6e6d970c73088bc6fb97e">ps_latnode_s::wid</a></div><div class="ttdeci">int32 wid</div><div class="ttdoc">Dictionary word id. </div><div class="ttdef"><b>Definition:</b> <a href="ps__lattice__internal_8h_source.html#l00115">ps_lattice_internal.h:115</a></div></div>
<div class="ttc" id="hmm_8h_html_a44d0b5515cb269bf9b95f62aada18cbb"><div class="ttname"><a href="hmm_8h.html#a44d0b5515cb269bf9b95f62aada18cbb">hmm_context_set_senscore</a></div><div class="ttdeci">#define hmm_context_set_senscore(ctx, senscr)</div><div class="ttdoc">Change the senone score array for a context. </div><div class="ttdef"><b>Definition:</b> <a href="hmm_8h_source.html#l00227">hmm.h:227</a></div></div>
<div class="ttc" id="hmm_8h_html_af94da16e3e5b550b9be05b0f07402cc7"><div class="ttname"><a href="hmm_8h.html#af94da16e3e5b550b9be05b0f07402cc7">SENSCR_SHIFT</a></div><div class="ttdeci">#define SENSCR_SHIFT</div><div class="ttdoc">Shift count for senone scores. </div><div class="ttdef"><b>Definition:</b> <a href="hmm_8h_source.html#l00073">hmm.h:73</a></div></div>
<div class="ttc" id="structdict__t_html"><div class="ttname"><a href="structdict__t.html">dict_t</a></div><div class="ttdoc">a structure for a dictionary. </div><div class="ttdef"><b>Definition:</b> <a href="dict_8h_source.html#l00076">dict.h:76</a></div></div>
<div class="ttc" id="hmm_8h_html_aa930fb8fb6fce7f34bcf4018b81d7066"><div class="ttname"><a href="hmm_8h.html#aa930fb8fb6fce7f34bcf4018b81d7066">WORSE_THAN</a></div><div class="ttdeci">#define WORSE_THAN</div><div class="ttdoc">Is one score worse than another? </div><div class="ttdef"><b>Definition:</b> <a href="hmm_8h_source.html#l00100">hmm.h:100</a></div></div>
<div class="ttc" id="dict2pid_8c_html_a720e15c92ef6930e722bccb014e11b7b"><div class="ttname"><a href="dict2pid_8c.html#a720e15c92ef6930e722bccb014e11b7b">dict2pid_internal</a></div><div class="ttdeci">s3ssid_t dict2pid_internal(dict2pid_t *d2p, int32 wid, int pos)</div><div class="ttdoc">Return the senone sequence ID for the given word position. </div><div class="ttdef"><b>Definition:</b> <a href="dict2pid_8c_source.html#l00367">dict2pid.c:367</a></div></div>
<div class="ttc" id="structngram__search__s_html_a150d99157e2f37a6f0dbb4b02682d9c3"><div class="ttname"><a href="structngram__search__s.html#a150d99157e2f37a6f0dbb4b02682d9c3">ngram_search_s::best_score</a></div><div class="ttdeci">int32 best_score</div><div class="ttdoc">Best Viterbi path score. </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search_8h_source.html#l00325">ngram_search.h:325</a></div></div>
<div class="ttc" id="hmm_8h_html_af4c0cefb23087a0b1731b34048cfdaf9"><div class="ttname"><a href="hmm_8h.html#af4c0cefb23087a0b1731b34048cfdaf9">hmm_clear</a></div><div class="ttdeci">void hmm_clear(hmm_t *h)</div><div class="ttdoc">Reset the states of the HMM to the invalid condition. </div><div class="ttdef"><b>Definition:</b> <a href="hmm_8c_source.html#l00183">hmm.c:183</a></div></div>
<div class="ttc" id="structbptbl__s_html"><div class="ttname"><a href="structbptbl__s.html">bptbl_s</a></div><div class="ttdoc">Back pointer table (forward pass lattice; actually a tree) </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search_8h_source.html#l00109">ngram_search.h:109</a></div></div>
<div class="ttc" id="structxwdssid__t_html"><div class="ttname"><a href="structxwdssid__t.html">xwdssid_t</a></div><div class="ttdoc">cross word triphone model structure </div><div class="ttdef"><b>Definition:</b> <a href="dict2pid_8h_source.html#l00073">dict2pid.h:73</a></div></div>
<div class="ttc" id="ngram__search_8c_html_a15477192481dffcb29e9c4167eff6c3c"><div class="ttname"><a href="ngram__search_8c.html#a15477192481dffcb29e9c4167eff6c3c">ngram_search_free_all_rc</a></div><div class="ttdeci">void ngram_search_free_all_rc(ngram_search_t *ngs, int32 w)</div><div class="ttdoc">Allocate last phone channels for all possible right contexts for word w. </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search_8c_source.html#l00650">ngram_search.c:650</a></div></div>
<div class="ttc" id="hmm_8h_html_a2874ab52613ff781c96f570ec0eb0d98"><div class="ttname"><a href="hmm_8h.html#a2874ab52613ff781c96f570ec0eb0d98">BETTER_THAN</a></div><div class="ttdeci">#define BETTER_THAN</div><div class="ttdoc">Is one score better than another? </div><div class="ttdef"><b>Definition:</b> <a href="hmm_8h_source.html#l00095">hmm.h:95</a></div></div>
<div class="ttc" id="ngram__search__fwdflat_8c_html_a8faf467f90162a7273b23304fc6e8586"><div class="ttname"><a href="ngram__search__fwdflat_8c.html#a8faf467f90162a7273b23304fc6e8586">ngram_fwdflat_deinit</a></div><div class="ttdeci">void ngram_fwdflat_deinit(ngram_search_t *ngs)</div><div class="ttdoc">Release memory associated with fwdflat decoding. </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search__fwdflat_8c_source.html#l00169">ngram_search_fwdflat.c:169</a></div></div>
<div class="ttc" id="structbptbl__s_html_abf9e4bcf1927aa09fb2b30c59e99f551"><div class="ttname"><a href="structbptbl__s.html#abf9e4bcf1927aa09fb2b30c59e99f551">bptbl_s::s_idx</a></div><div class="ttdeci">int32 s_idx</div><div class="ttdoc">Start of BScoreStack for various right contexts. </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search_8h_source.html#l00116">ngram_search.h:116</a></div></div>
<div class="ttc" id="structps__latnode__s_html_a584ee5a303355d851ac903718998df14"><div class="ttname"><a href="structps__latnode__s.html#a584ee5a303355d851ac903718998df14">ps_latnode_s::fef</a></div><div class="ttdeci">int32 fef</div><div class="ttdoc">First end frame. </div><div class="ttdef"><b>Definition:</b> <a href="ps__lattice__internal_8h_source.html#l00118">ps_lattice_internal.h:118</a></div></div>
<div class="ttc" id="structngram__search__s_html_a5255e56d28c239a4e1d9b1721e8a2f8d"><div class="ttname"><a href="structngram__search__s.html#a5255e56d28c239a4e1d9b1721e8a2f8d">ngram_search_s::n_frame</a></div><div class="ttdeci">int32 n_frame</div><div class="ttdoc">Number of frames actually present. </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search_8h_source.html#l00308">ngram_search.h:308</a></div></div>
<div class="ttc" id="structngram__search__s_html_a6127a6d8fb53832e67456c11aa6ad9c4"><div class="ttname"><a href="structngram__search__s.html#a6127a6d8fb53832e67456c11aa6ad9c4">ngram_search_s::lmset</a></div><div class="ttdeci">ngram_model_t * lmset</div><div class="ttdoc">Set of language models. </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search_8h_source.html#l00199">ngram_search.h:199</a></div></div>
<div class="ttc" id="structngram__search__s_html_a9168184c862d6f63bd7926e6581b25d9"><div class="ttname"><a href="structngram__search__s.html#a9168184c862d6f63bd7926e6581b25d9">ngram_search_s::n_1ph_words</a></div><div class="ttdeci">int32 n_1ph_words</div><div class="ttdoc">Number single phone words in dict (total) </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search_8h_source.html#l00265">ngram_search.h:265</a></div></div>
<div class="ttc" id="structngram__search__s_html_a576470858bfa44c671f0e677902ab424"><div class="ttname"><a href="structngram__search__s.html#a576470858bfa44c671f0e677902ab424">ngram_search_s::root_chan_alloc</a></div><div class="ttdeci">listelem_alloc_t * root_chan_alloc</div><div class="ttdoc">For root_chan_t. </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search_8h_source.html#l00212">ngram_search.h:212</a></div></div>
<div class="ttc" id="hmm_8h_html_a9561d7ffa1e61c99de2d2b900774152f"><div class="ttname"><a href="hmm_8h.html#a9561d7ffa1e61c99de2d2b900774152f">hmm_clear_scores</a></div><div class="ttdeci">void hmm_clear_scores(hmm_t *h)</div><div class="ttdoc">Reset the scores of the HMM. </div><div class="ttdef"><b>Definition:</b> <a href="hmm_8c_source.html#l00170">hmm.c:170</a></div></div>
<div class="ttc" id="structchan__s_html_a33da51d8524073abc792519d0738ca0b"><div class="ttname"><a href="structchan__s.html#a33da51d8524073abc792519d0738ca0b">chan_s::ciphone</a></div><div class="ttdeci">int32 ciphone</div><div class="ttdoc">ciphone for this node </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search_8h_source.html#l00073">ngram_search.h:73</a></div></div>
<div class="ttc" id="ngram__search__fwdflat_8c_html_ad4b8ebd904c77f8a28f59cd5ca2c8307"><div class="ttname"><a href="ngram__search__fwdflat_8c.html#ad4b8ebd904c77f8a28f59cd5ca2c8307">ngram_fwdflat_init</a></div><div class="ttdeci">void ngram_fwdflat_init(ngram_search_t *ngs)</div><div class="ttdoc">Initialize N-Gram search for fwdflat decoding. </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search__fwdflat_8c_source.html#l00145">ngram_search_fwdflat.c:145</a></div></div>
<div class="ttc" id="structngram__search__s_html_a5758d167fbb48e824a6a58186620e06d"><div class="ttname"><a href="structngram__search__s.html#a5758d167fbb48e824a6a58186620e06d">ngram_search_s::st</a></div><div class="ttdeci">ngram_search_stats_t st</div><div class="ttdoc">Various statistics for profiling. </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search_8h_source.html#l00335">ngram_search.h:335</a></div></div>
<div class="ttc" id="structngram__search__s_html_a79deb7295a261cd82d2a6b48cb119e77"><div class="ttname"><a href="structngram__search__s.html#a79deb7295a261cd82d2a6b48cb119e77">ngram_search_s::word_chan</a></div><div class="ttdeci">chan_t ** word_chan</div><div class="ttdoc">Channels associated with a given word (only used for right contexts, single-phone words in fwdtree se...</div><div class="ttdef"><b>Definition:</b> <a href="ngram__search_8h_source.html#l00246">ngram_search.h:246</a></div></div>
<div class="ttc" id="structngram__search__s_html_a774f1640c5ece856f4bef98d98e7c959"><div class="ttname"><a href="structngram__search__s.html#a774f1640c5ece856f4bef98d98e7c959">ngram_search_s::fwdflat_wordlist</a></div><div class="ttdeci">int32 * fwdflat_wordlist</div><div class="ttdoc">List of active word IDs for utterance. </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search_8h_source.html#l00317">ngram_search.h:317</a></div></div>
<div class="ttc" id="structps__latnode__s_html_aca6f3d543a1712a1ca3bb8ec60f71c84"><div class="ttname"><a href="structps__latnode__s.html#aca6f3d543a1712a1ca3bb8ec60f71c84">ps_latnode_s::next</a></div><div class="ttdeci">struct ps_latnode_s * next</div><div class="ttdoc">Next node in DAG (no ordering implied) </div><div class="ttdef"><b>Definition:</b> <a href="ps__lattice__internal_8h_source.html#l00133">ps_lattice_internal.h:133</a></div></div>
<div class="ttc" id="structbptbl__s_html_aa5643c0c19ce4d39d51ddf7376f4d508"><div class="ttname"><a href="structbptbl__s.html#aa5643c0c19ce4d39d51ddf7376f4d508">bptbl_s::score</a></div><div class="ttdeci">int32 score</div><div class="ttdoc">Score (best among all right contexts) </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search_8h_source.html#l00115">ngram_search.h:115</a></div></div>
<div class="ttc" id="dict_8h_html_a361b948b42f9cfdf5c7fa9dfc8a71a94"><div class="ttname"><a href="dict_8h.html#a361b948b42f9cfdf5c7fa9dfc8a71a94">dict_size</a></div><div class="ttdeci">#define dict_size(d)</div><div class="ttdoc">Packaged macro access to dictionary members. </div><div class="ttdef"><b>Definition:</b> <a href="dict_8h_source.html#l00151">dict.h:151</a></div></div>
<div class="ttc" id="structxwdssid__t_html_a502f9241a70383aa260d3390e4ff58fb"><div class="ttname"><a href="structxwdssid__t.html#a502f9241a70383aa260d3390e4ff58fb">xwdssid_t::cimap</a></div><div class="ttdeci">s3cipid_t * cimap</div><div class="ttdoc">Index into ssid[] above for each ci phone. </div><div class="ttdef"><b>Definition:</b> <a href="dict2pid_8h_source.html#l00075">dict2pid.h:75</a></div></div>
<div class="ttc" id="dict_8h_html_a8785ab6264a5c6cf0b8da6bf79a46de4"><div class="ttname"><a href="dict_8h.html#a8785ab6264a5c6cf0b8da6bf79a46de4">dict_pron</a></div><div class="ttdeci">#define dict_pron(d, w, p)</div><div class="ttdoc">The CI phones of the word w at position p. </div><div class="ttdef"><b>Definition:</b> <a href="dict_8h_source.html#l00165">dict.h:165</a></div></div>
<div class="ttc" id="structdict2pid__t_html"><div class="ttname"><a href="structdict2pid__t.html">dict2pid_t</a></div><div class="ttdoc">Building composite triphone (as well as word internal triphones) with the dictionary. </div><div class="ttdef"><b>Definition:</b> <a href="dict2pid_8h_source.html#l00084">dict2pid.h:84</a></div></div>
<div class="ttc" id="acmod_8c_html_acd78e9bae06724df9c53f844d90c1c8a"><div class="ttname"><a href="acmod_8c.html#acd78e9bae06724df9c53f844d90c1c8a">acmod_score</a></div><div class="ttdeci">int16 const * acmod_score(acmod_t *acmod, int *inout_frame_idx)</div><div class="ttdoc">Score one frame of data. </div><div class="ttdef"><b>Definition:</b> <a href="acmod_8c_source.html#l01126">acmod.c:1126</a></div></div>
<div class="ttc" id="structbptbl__s_html_aa7704ba76d3dcde6b8a24855362a4289"><div class="ttname"><a href="structbptbl__s.html#aa7704ba76d3dcde6b8a24855362a4289">bptbl_s::last_phone</a></div><div class="ttdeci">int16 last_phone</div><div class="ttdoc">last phone of this word </div><div class="ttdef"><b>Definition:</b> <a href="ngram__search_8h_source.html#l00119">ngram_search.h:119</a></div></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
  <ul>
    <li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_8d034a1e03e98d9b7ac467250bbebdea.html">libpocketsphinx</a></li><li class="navelem"><a class="el" href="ngram__search__fwdflat_8c.html">ngram_search_fwdflat.c</a></li>
    <li class="footer">Generated by
    <a href="http://www.doxygen.org/index.html">
    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
  </ul>
</div>
</body>
</html>