ChartRuleLookupManagerMemory::ChartRuleLookupManagerMemory( const InputType &src, const ChartCellCollectionBase &cellColl, const PhraseDictionarySCFG &ruleTable) : ChartRuleLookupManagerCYKPlus(src, cellColl) , m_ruleTable(ruleTable) { CHECK(m_dottedRuleColls.size() == 0); size_t sourceSize = src.GetSize(); m_dottedRuleColls.resize(sourceSize); const PhraseDictionaryNodeSCFG &rootNode = m_ruleTable.GetRootNode(); for (size_t ind = 0; ind < m_dottedRuleColls.size(); ++ind) { #ifdef USE_BOOST_POOL DottedRuleInMemory *initDottedRule = m_dottedRulePool.malloc(); new (initDottedRule) DottedRuleInMemory(rootNode); #else DottedRuleInMemory *initDottedRule = new DottedRuleInMemory(rootNode); #endif DottedRuleColl *dottedRuleColl = new DottedRuleColl(sourceSize - ind + 1); dottedRuleColl->Add(0, initDottedRule); // init rule. stores the top node in tree m_dottedRuleColls[ind] = dottedRuleColl; } }
ChartRuleLookupManagerMemory::ChartRuleLookupManagerMemory( const ChartParser &parser, const ChartCellCollectionBase &cellColl, const PhraseDictionaryMemory &ruleTable) : ChartRuleLookupManagerCYKPlus(parser, cellColl) , m_ruleTable(ruleTable) { UTIL_THROW_IF2(m_dottedRuleColls.size() != 0, "Dotted rule collection not correctly initialized"); size_t sourceSize = parser.GetSize(); m_dottedRuleColls.resize(sourceSize); const PhraseDictionaryNodeMemory &rootNode = m_ruleTable.GetRootNode(); for (size_t ind = 0; ind < m_dottedRuleColls.size(); ++ind) { #ifdef USE_BOOST_POOL DottedRuleInMemory *initDottedRule = m_dottedRulePool.malloc(); new (initDottedRule) DottedRuleInMemory(rootNode); #else DottedRuleInMemory *initDottedRule = new DottedRuleInMemory(rootNode); #endif DottedRuleColl *dottedRuleColl = new DottedRuleColl(sourceSize - ind + 1); dottedRuleColl->Add(0, initDottedRule); // init rule. stores the top node in tree m_dottedRuleColls[ind] = dottedRuleColl; } }
// Given a partial rule application ending at startPos-1 and given the sets of // source and target non-terminals covering the span [startPos, endPos], // determines the full or partial rule applications that can be produced through // extending the current rule application by a single non-terminal. void ChartRuleLookupManagerMemory::ExtendPartialRuleApplication( const DottedRuleInMemory &prevDottedRule, size_t startPos, size_t endPos, size_t stackInd, DottedRuleColl & dottedRuleColl) { // source non-terminal labels for the remainder const NonTerminalSet &sourceNonTerms = GetSentence().GetLabelSet(startPos, endPos); // target non-terminal labels for the remainder const ChartCellLabelSet &targetNonTerms = GetTargetLabelSet(startPos, endPos); // note where it was found in the prefix tree of the rule dictionary const PhraseDictionaryNodeSCFG &node = prevDottedRule.GetLastNode(); const PhraseDictionaryNodeSCFG::NonTerminalMap & nonTermMap = node.GetNonTerminalMap(); const size_t numChildren = nonTermMap.size(); if (numChildren == 0) { return; } const size_t numSourceNonTerms = sourceNonTerms.size(); const size_t numTargetNonTerms = targetNonTerms.GetSize(); const size_t numCombinations = numSourceNonTerms * numTargetNonTerms; // We can search by either: // 1. Enumerating all possible source-target NT pairs that are valid for // the span and then searching for matching children in the node, // or // 2. Iterating over all the NT children in the node, searching // for each source and target NT in the span's sets. // We'll do whichever minimises the number of lookups: if (numCombinations <= numChildren*2) { // loop over possible source non-terminal labels (as found in input tree) NonTerminalSet::const_iterator p = sourceNonTerms.begin(); NonTerminalSet::const_iterator sEnd = sourceNonTerms.end(); for (; p != sEnd; ++p) { const Word & sourceNonTerm = *p; // loop over possible target non-terminal labels (as found in chart) ChartCellLabelSet::const_iterator q = targetNonTerms.begin(); ChartCellLabelSet::const_iterator tEnd = targetNonTerms.end(); for (; q != tEnd; ++q) { const ChartCellLabel &cellLabel = q->second; // try to match both source and target non-terminal const PhraseDictionaryNodeSCFG * child = node.GetChild(sourceNonTerm, cellLabel.GetLabel()); // nothing found? then we are done if (child == NULL) { continue; } // create new rule #ifdef USE_BOOST_POOL DottedRuleInMemory *rule = m_dottedRulePool.malloc(); new (rule) DottedRuleInMemory(*child, cellLabel, prevDottedRule); #else DottedRuleInMemory *rule = new DottedRuleInMemory(*child, cellLabel, prevDottedRule); #endif dottedRuleColl.Add(stackInd, rule); } } } else { // loop over possible expansions of the rule PhraseDictionaryNodeSCFG::NonTerminalMap::const_iterator p; PhraseDictionaryNodeSCFG::NonTerminalMap::const_iterator end = nonTermMap.end(); for (p = nonTermMap.begin(); p != end; ++p) { // does it match possible source and target non-terminals? const PhraseDictionaryNodeSCFG::NonTerminalMapKey &key = p->first; const Word &sourceNonTerm = key.first; if (sourceNonTerms.find(sourceNonTerm) == sourceNonTerms.end()) { continue; } const Word &targetNonTerm = key.second; const ChartCellLabel *cellLabel = targetNonTerms.Find(targetNonTerm); if (!cellLabel) { continue; } // create new rule const PhraseDictionaryNodeSCFG &child = p->second; #ifdef USE_BOOST_POOL DottedRuleInMemory *rule = m_dottedRulePool.malloc(); new (rule) DottedRuleInMemory(child, *cellLabel, prevDottedRule); #else DottedRuleInMemory *rule = new DottedRuleInMemory(child, *cellLabel, prevDottedRule); #endif dottedRuleColl.Add(stackInd, rule); } } }