00001 #include "InputTreeToForest.h"
00002
00003 #include <boost/unordered_map.hpp>
00004
00005 namespace Moses
00006 {
00007 namespace Syntax
00008 {
00009 namespace T2S
00010 {
00011
00012 const F2S::Forest::Vertex *InputTreeToForest(const InputTree &tree,
00013 F2S::Forest &forest)
00014 {
00015 forest.Clear();
00016
00017
00018 boost::unordered_map<const InputTree::Node*, F2S::Forest::Vertex*> vertexMap;
00019
00020
00021 for (std::vector<InputTree::Node>::const_iterator p = tree.nodes.begin();
00022 p != tree.nodes.end(); ++p) {
00023 F2S::Forest::Vertex *v = new F2S::Forest::Vertex(p->pvertex);
00024 forest.vertices.push_back(v);
00025 vertexMap[&*p] = v;
00026 }
00027
00028
00029 for (std::vector<InputTree::Node>::const_iterator p = tree.nodes.begin();
00030 p != tree.nodes.end(); ++p) {
00031 const InputTree::Node &treeVertex = *p;
00032 const std::vector<InputTree::Node*> &treeChildren = treeVertex.children;
00033 if (treeChildren.empty()) {
00034 continue;
00035 }
00036 F2S::Forest::Hyperedge *e = new F2S::Forest::Hyperedge();
00037 e->head = vertexMap[&treeVertex];
00038 e->tail.reserve(treeChildren.size());
00039 for (std::vector<InputTree::Node*>::const_iterator q = treeChildren.begin();
00040 q != treeChildren.end(); ++q) {
00041 e->tail.push_back(vertexMap[*q]);
00042 }
00043 e->head->incoming.push_back(e);
00044 }
00045
00046
00047 return forest.vertices.back();
00048 }
00049
00050 }
00051 }
00052 }