diff options
Diffstat (limited to 'training')
| -rw-r--r-- | training/utils/grammar_convert.cc | 16 | 
1 files changed, 12 insertions, 4 deletions
| diff --git a/training/utils/grammar_convert.cc b/training/utils/grammar_convert.cc index 58d1957c..5c1b4d4a 100644 --- a/training/utils/grammar_convert.cc +++ b/training/utils/grammar_convert.cc @@ -56,15 +56,22 @@ int GetOrCreateNode(const WordID& lhs, map<WordID, int>* lhs2node, Hypergraph* h    return node_id - 1;  } +void AddDummyGoalNode(Hypergraph* hg) { +  static const int kGOAL = -TD::Convert("Goal"); +  static TRulePtr kGOAL_RULE(new TRule("[Goal] ||| [X] ||| [1]")); +  unsigned old_goal_node_idx = hg->nodes_.size() - 1; +  HG::Node* goal_node = hg->AddNode(kGOAL); +  goal_node->node_hash = goal_node->id_ * 10 + 1; +  TailNodeVector tail(1, old_goal_node_idx); +  HG::Edge* new_edge = hg->AddEdge(kGOAL_RULE, tail); +  hg->ConnectEdgeToHeadNode(new_edge, goal_node); +} +  void FilterAndCheckCorrectness(int goal, Hypergraph* hg) {    if (goal < 0) {      cerr << "Error! [S] not found in grammar!\n";      exit(1);    } -  if (hg->nodes_[goal].in_edges_.size() != 1) { -    cerr << "Error! [S] has more than one rewrite!\n"; -    exit(1); -  }    int old_size = hg->nodes_.size();    hg->TopologicallySortNodesAndEdges(goal);    if (hg->nodes_.size() != old_size) { @@ -319,6 +326,7 @@ int main(int argc, char **argv) {        if (line.empty()) {          int goal = lhs2node[kSTART] - 1;          FilterAndCheckCorrectness(goal, &hg); +        AddDummyGoalNode(&hg);          ProcessHypergraph(w, conf, "", &hg);          hg.clear();          lhs2node.clear(); | 
