|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#pragma once |
|
|
|
|
|
#include "DotChart.h" |
|
|
#include "moses/TranslationModel/PhraseDictionaryNodeMemory.h" |
|
|
|
|
|
#include <vector> |
|
|
|
|
|
namespace Moses |
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
class DottedRuleInMemory : public DottedRule |
|
|
{ |
|
|
public: |
|
|
|
|
|
explicit DottedRuleInMemory(const PhraseDictionaryNodeMemory &node) |
|
|
: DottedRule() |
|
|
, m_node(node) {} |
|
|
|
|
|
DottedRuleInMemory(const PhraseDictionaryNodeMemory &node, |
|
|
const ChartCellLabel &cellLabel, |
|
|
const DottedRuleInMemory &prev) |
|
|
: DottedRule(cellLabel, prev) |
|
|
, m_node(node) {} |
|
|
|
|
|
const PhraseDictionaryNodeMemory &GetLastNode() const { |
|
|
return m_node; |
|
|
} |
|
|
|
|
|
private: |
|
|
const PhraseDictionaryNodeMemory &m_node; |
|
|
}; |
|
|
|
|
|
typedef std::vector<const DottedRuleInMemory*> DottedRuleList; |
|
|
typedef std::map<size_t, DottedRuleList> DottedRuleMap; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class DottedRuleColl |
|
|
{ |
|
|
protected: |
|
|
typedef std::vector<DottedRuleList> CollType; |
|
|
CollType m_coll; |
|
|
DottedRuleList m_expandableDottedRuleList; |
|
|
DottedRuleMap m_expandableDottedRuleListTerminalsOnly; |
|
|
|
|
|
public: |
|
|
typedef CollType::iterator iterator; |
|
|
typedef CollType::const_iterator const_iterator; |
|
|
|
|
|
const_iterator begin() const { |
|
|
return m_coll.begin(); |
|
|
} |
|
|
const_iterator end() const { |
|
|
return m_coll.end(); |
|
|
} |
|
|
iterator begin() { |
|
|
return m_coll.begin(); |
|
|
} |
|
|
iterator end() { |
|
|
return m_coll.end(); |
|
|
} |
|
|
|
|
|
DottedRuleColl(size_t size) |
|
|
: m_coll(size) { |
|
|
} |
|
|
|
|
|
~DottedRuleColl(); |
|
|
|
|
|
const DottedRuleList &Get(size_t pos) const { |
|
|
return m_coll[pos]; |
|
|
} |
|
|
DottedRuleList &Get(size_t pos) { |
|
|
return m_coll[pos]; |
|
|
} |
|
|
|
|
|
void Add(size_t pos, const DottedRuleInMemory *dottedRule) { |
|
|
UTIL_THROW_IF2(dottedRule == NULL, "Dotted rule is null"); |
|
|
m_coll[pos].push_back(dottedRule); |
|
|
if (!dottedRule->GetLastNode().IsLeaf()) { |
|
|
if (dottedRule->GetLastNode().GetNonTerminalMap().empty() && !dottedRule->IsRoot()) { |
|
|
size_t startPos = dottedRule->GetWordsRange().GetEndPos() + 1; |
|
|
m_expandableDottedRuleListTerminalsOnly[startPos].push_back(dottedRule); |
|
|
} else { |
|
|
m_expandableDottedRuleList.push_back(dottedRule); |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
void Clear(size_t pos) { |
|
|
#ifdef USE_BOOST_POOL |
|
|
m_coll[pos].clear(); |
|
|
#endif |
|
|
} |
|
|
|
|
|
const DottedRuleList &GetExpandableDottedRuleList() const { |
|
|
return m_expandableDottedRuleList; |
|
|
} |
|
|
|
|
|
DottedRuleMap &GetExpandableDottedRuleListTerminalsOnly() { |
|
|
return m_expandableDottedRuleListTerminalsOnly; |
|
|
} |
|
|
|
|
|
}; |
|
|
|
|
|
} |
|
|
|