|
#include "InputTreeToForest.h" |
|
|
|
#include <boost/unordered_map.hpp> |
|
|
|
namespace Moses |
|
{ |
|
namespace Syntax |
|
{ |
|
namespace T2S |
|
{ |
|
|
|
const F2S::Forest::Vertex *InputTreeToForest(const InputTree &tree, |
|
F2S::Forest &forest) |
|
{ |
|
forest.Clear(); |
|
|
|
|
|
boost::unordered_map<const InputTree::Node*, F2S::Forest::Vertex*> vertexMap; |
|
|
|
|
|
for (std::vector<InputTree::Node>::const_iterator p = tree.nodes.begin(); |
|
p != tree.nodes.end(); ++p) { |
|
F2S::Forest::Vertex *v = new F2S::Forest::Vertex(p->pvertex); |
|
forest.vertices.push_back(v); |
|
vertexMap[&*p] = v; |
|
} |
|
|
|
|
|
for (std::vector<InputTree::Node>::const_iterator p = tree.nodes.begin(); |
|
p != tree.nodes.end(); ++p) { |
|
const InputTree::Node &treeVertex = *p; |
|
const std::vector<InputTree::Node*> &treeChildren = treeVertex.children; |
|
if (treeChildren.empty()) { |
|
continue; |
|
} |
|
F2S::Forest::Hyperedge *e = new F2S::Forest::Hyperedge(); |
|
e->head = vertexMap[&treeVertex]; |
|
e->tail.reserve(treeChildren.size()); |
|
for (std::vector<InputTree::Node*>::const_iterator q = treeChildren.begin(); |
|
q != treeChildren.end(); ++q) { |
|
e->tail.push_back(vertexMap[*q]); |
|
} |
|
e->head->incoming.push_back(e); |
|
} |
|
|
|
|
|
return forest.vertices.back(); |
|
} |
|
|
|
} |
|
} |
|
} |
|
|