00001 #include "HyperTree.h"
00002
00003 namespace Moses
00004 {
00005 namespace Syntax
00006 {
00007 namespace F2S
00008 {
00009
00010 void HyperTree::Node::Prune(std::size_t tableLimit)
00011 {
00012
00013 for (Map::iterator p = m_map.begin(); p != m_map.end(); ++p) {
00014 p->second.Prune(tableLimit);
00015 }
00016
00017 m_targetPhraseCollection->Prune(true, tableLimit);
00018 }
00019
00020 void HyperTree::Node::Sort(std::size_t tableLimit)
00021 {
00022
00023 for (Map::iterator p = m_map.begin(); p != m_map.end(); ++p) {
00024 p->second.Sort(tableLimit);
00025 }
00026
00027 m_targetPhraseCollection->Sort(true, tableLimit);
00028 }
00029
00030 HyperTree::Node *HyperTree::Node::GetOrCreateChild(
00031 const HyperPath::NodeSeq &nodeSeq)
00032 {
00033 return &m_map[nodeSeq];
00034 }
00035
00036 const HyperTree::Node *HyperTree::Node::GetChild(
00037 const HyperPath::NodeSeq &nodeSeq) const
00038 {
00039 Map::const_iterator p = m_map.find(nodeSeq);
00040 return (p == m_map.end()) ? NULL : &p->second;
00041 }
00042
00043 TargetPhraseCollection::shared_ptr HyperTree::GetOrCreateTargetPhraseCollection(
00044 const HyperPath &hyperPath)
00045 {
00046 Node &node = GetOrCreateNode(hyperPath);
00047 return node.GetTargetPhraseCollection();
00048 }
00049
00050 HyperTree::Node &HyperTree::GetOrCreateNode(const HyperPath &hyperPath)
00051 {
00052 const std::size_t height = hyperPath.nodeSeqs.size();
00053 Node *node = &m_root;
00054 for (std::size_t i = 0; i < height; ++i) {
00055 const HyperPath::NodeSeq &nodeSeq = hyperPath.nodeSeqs[i];
00056 node = node->GetOrCreateChild(nodeSeq);
00057 }
00058 return *node;
00059 }
00060
00061 void HyperTree::SortAndPrune(std::size_t tableLimit)
00062 {
00063 if (tableLimit) {
00064 m_root.Sort(tableLimit);
00065 }
00066 }
00067
00068 }
00069 }
00070 }