void ChartParser::CreateInputPaths(const InputType &input) { size_t size = input.GetSize(); m_inputPathMatrix.resize(size); UTIL_THROW_IF2(input.GetType() != SentenceInput && input.GetType() != TreeInputType, "Input must be a sentence or a tree, not lattice or confusion networks"); for (size_t phaseSize = 1; phaseSize <= size; ++phaseSize) { for (size_t startPos = 0; startPos < size - phaseSize + 1; ++startPos) { size_t endPos = startPos + phaseSize -1; vector<InputPath*> &vec = m_inputPathMatrix[startPos]; WordsRange range(startPos, endPos); Phrase subphrase(input.GetSubString(WordsRange(startPos, endPos))); const NonTerminalSet &labels = input.GetLabelSet(startPos, endPos); InputPath *node; if (range.GetNumWordsCovered() == 1) { node = new InputPath(subphrase, labels, range, NULL, NULL); vec.push_back(node); } else { const InputPath &prevNode = GetInputPath(startPos, endPos - 1); node = new InputPath(subphrase, labels, range, &prevNode, NULL); vec.push_back(node); } //m_inputPathQueue.push_back(node); } } }
//TODO this should be a factory function! TranslationOption::TranslationOption(const WordsRange &wordsRange , const TargetPhrase &targetPhrase , const InputType &inputType , int /*whatever*/) : m_targetPhrase(targetPhrase) , m_sourceWordsRange (wordsRange) , m_futureScore(0) { const UnknownWordPenaltyProducer *up = StaticData::Instance().GetUnknownWordPenaltyProducer(); if (up) { const ScoreProducer *scoreProducer = (const ScoreProducer *)up; // not sure why none of the c++ cast works vector<float> score(1); score[0] = FloorScore(-numeric_limits<float>::infinity()); m_scoreBreakdown.Assign(scoreProducer, score); } if (inputType.GetType() == SentenceInput) { Phrase phrase = inputType.GetSubString(wordsRange); m_sourcePhrase = new Phrase(phrase); } else { // TODO lex reordering with confusion network m_sourcePhrase = new Phrase(*targetPhrase.GetSourcePhrase()); //the target phrase from a confusion network/lattice has input scores that we want to keep m_scoreBreakdown.PlusEquals(targetPhrase.GetScoreBreakdown()); } }
void InputFeature::EvaluateWithSourceContext(const InputType &input , const InputPath &inputPath , const TargetPhrase &targetPhrase , const StackVec *stackVec , ScoreComponentCollection &scoreBreakdown , ScoreComponentCollection *estimatedScores) const { if (m_legacy) { //binary phrase-table does input feature itself return; } else if (input.GetType() == WordLatticeInput) { const ScorePair *scores = inputPath.GetInputScore(); if (scores) { scoreBreakdown.PlusEquals(this, *scores); } } }
//TODO this should be a factory function! TranslationOption::TranslationOption(const WordsRange &wordsRange , const TargetPhrase &targetPhrase , const InputType &inputType) : m_targetPhrase(targetPhrase) , m_sourceWordsRange(wordsRange) { // set score m_scoreBreakdown.PlusEquals(targetPhrase.GetScoreBreakdown()); if (inputType.GetType() == SentenceInput) { Phrase phrase = inputType.GetSubString(wordsRange); m_sourcePhrase = new Phrase(phrase); } else { // TODO lex reordering with confusion network m_sourcePhrase = new Phrase(*targetPhrase.GetSourcePhrase()); } }