| | #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(); |
| | } |
| |
|
| | } |
| | } |
| | } |
| |
|