HelloSriLM users,<br>
<br>
I am looking for a way to save language models adapted with <br>
<br>
ngram -adapt-marginals.<br>
<br>
Is it possible&nbsp; ?<br>
<br>
As the write method for AdaptiveMarginals is not implemented, I tried
to write one (copied from writeWithOrder in NgramLM.cc) , by calling
wordProb(pword,context+1) instead of iterating on the tree, but it
doesn't seem to work. The probabilities I get in the file, are not the
same as the one I get if I parse&nbsp; a text file with ppl option
(precisely, alphas are the same, but denominators are different). <br>
<br>
Any clue or solution to save&nbsp; an adapted model are welcome !<br>
<br>
Thank you,<br>
<br>
--<br>
Christopher Kermorvant <br>
<br>
<br>
void<br>
AdaptiveMarginals::write(File &amp;file)<br>
{<br>
&nbsp;&nbsp;&nbsp; this-&gt;running(true) ;<br>
&nbsp;&nbsp;&nbsp; Ngram * lm = (Ngram*)&amp;baseLM;<br>
&nbsp;&nbsp;&nbsp; unsigned i;<br>
&nbsp;&nbsp;&nbsp; unsigned howmanyNgrams[maxNgramOrder + 1];<br>
&nbsp;&nbsp;&nbsp; VocabIndex context[maxNgramOrder + 2];<br>
&nbsp;&nbsp;&nbsp; VocabString scontext[maxNgramOrder + 1];<br>
&nbsp;&nbsp;&nbsp; unsigned order=lm-&gt;setorder(); <br>
&nbsp;&nbsp;&nbsp; if (order &gt; maxNgramOrder) {<br>
&nbsp;&nbsp;&nbsp; order = maxNgramOrder;<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; fprintf(file, &quot;\n\\data\\\n&quot;);<br>
<br>
&nbsp;&nbsp;&nbsp; for (i = 1; i &lt;= order; i++ ) {<br>
&nbsp;&nbsp;&nbsp; howmanyNgrams[i] = lm-&gt;numNgrams(i);<br>
&nbsp;&nbsp;&nbsp; fprintf(file, &quot;ngram %d=%d\n&quot;, i, howmanyNgrams[i]);<br>
&nbsp;&nbsp;&nbsp; }<br>
<br>
&nbsp;&nbsp;&nbsp; for (i = 1; i &lt;= order; i++ ) {<br>
&nbsp;&nbsp;&nbsp; fprintf(file, &quot;\n\\%d-grams:\n&quot;, i);<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (debug(DEBUG_WRITE_STATS)) {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; dout() &lt;&lt; &quot;writing &quot; &lt;&lt; howmanyNgrams[i] &lt;&lt; &quot; &quot;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &lt;&lt; i &lt;&lt; &quot;-grams\n&quot;;<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; NgramBOsIter iter(*lm, context + 1, i - 1, vocab.compareIndex());<br>
&nbsp;&nbsp;&nbsp; BOnode *node;<br>
<br>
&nbsp;&nbsp;&nbsp; while (node = iter.next()) {<br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; vocab.getWords(context + 1, scontext, maxNgramOrder + 1);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Vocab::reverse(scontext);<br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; NgramProbsIter piter(*node, vocab.compareIndex());<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; VocabIndex pword;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; LogP *prob;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; LogP probAd ;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; while (prob = piter.next(pword)) {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (file.error()) {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; context[0] = pword;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; probAd = wordProb(pword,context+1);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *prob = probAd ;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fprintf(file, &quot;%.*lg\t&quot;, LogP_Precision,<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; (double)(*prob == LogP_Zero ?<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
LogP_PseudoZero : *prob));<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Vocab::write(file, scontext);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fprintf(file, &quot;%s%s&quot;, (i &gt; 1 ? &quot; &quot; : &quot;&quot;), vocab.getWord(pword));<br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (i &lt; order) {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; context[0] = pword;<br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; LogP *bow = lm-&gt;findBOW(context);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (bow) {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fprintf(file, &quot;\t%.*lg&quot;, LogP_Precision,<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; (double)(*bow == LogP_Zero ?<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; LogP_PseudoZero : *bow));<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fprintf(file, &quot;\n&quot;);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; }<br>
<br>
&nbsp;&nbsp;&nbsp; fprintf(file, &quot;\n\\end\\\n&quot;);<br>
}<br>
<br>
<br>