unsigned CIMIContext::getBestSentence(CCandidates& result, int rank, unsigned start, unsigned end) { // -1 means selected sentence if (rank < -1 || rank >= (int) m_nBest) return 0; result.clear(); if (end == UINT_MAX) end = m_tailIdx - 1; while (end > start && m_lattice[end].m_bwType == CLatticeFrame::NO_BESTWORD) end--; unsigned i = end, nWordConverted = 0; while (i > start) { CLatticeFrame& fr = m_lattice[i]; if (rank < 0) { result.insert(result.begin(), fr.m_selWord); i = fr.m_selWord.m_start; } else { result.insert(result.begin(), fr.m_bestWords[rank]); i = fr.m_bestWords[rank].m_start; } nWordConverted++; } return nWordConverted; }
std::vector<CCandidates> CIMIContext::getBestSentenceTails(int rank, unsigned start, unsigned end) { std::vector<CCandidates> result; if (rank < 0) { return result; } CCandidates sentence; unsigned word_num = getBestSentence(sentence, rank, start, end); unsigned tail_word_num = word_num; while (tail_word_num > 1) { unsigned dec = tail_word_num / (m_maxTailCandidateNum + 1) + 1; tail_word_num -= std::min(dec, tail_word_num); if (tail_word_num <= 1) { break; } CCandidates tail(sentence.begin(), sentence.begin() + tail_word_num); result.push_back(tail); } return result; }