diff options
Diffstat (limited to 'decoder')
| -rw-r--r-- | decoder/decoder.cc | 3 | ||||
| -rw-r--r-- | decoder/hg_io.cc | 27 | ||||
| -rw-r--r-- | decoder/hg_io.h | 3 | 
3 files changed, 33 insertions, 0 deletions
| diff --git a/decoder/decoder.cc b/decoder/decoder.cc index 3b53fd6b..3394e0b8 100644 --- a/decoder/decoder.cc +++ b/decoder/decoder.cc @@ -408,6 +408,7 @@ DecoderImpl::DecoderImpl(po::variables_map& conf, int argc, char** argv, istream          ("show_partition,z", "Compute and show the partition (inside score)")          ("show_conditional_prob", "Output the conditional log prob to STDOUT instead of a translation")          ("show_cfg_search_space", "Show the search space as a CFG") +        ("show_target_graph", "Output the target hypergraph")          ("coarse_to_fine_beam_prune", po::value<double>(), "Prune paths from coarse parse forest before fine parse, keeping paths within exp(alpha>=0)")          ("ctf_beam_widen", po::value<double>()->default_value(2.0), "Expand coarse pass beam by this factor if no fine parse is found")          ("ctf_num_widenings", po::value<int>()->default_value(2), "Widen coarse beam this many times before backing off to full parse") @@ -1017,6 +1018,8 @@ bool DecoderImpl::Decode(const string& input, DecoderObserver* o) {    }    if (conf.count("show_cfg_search_space"))      HypergraphIO::WriteAsCFG(forest); +  if (conf.count("show_target_graph")) +    HypergraphIO::WriteTarget(forest);    if (has_ref) {      if (HG::Intersect(ref, &forest)) {  //      if (crf_uniform_empirical) { diff --git a/decoder/hg_io.cc b/decoder/hg_io.cc index c1c93933..0283ec3c 100644 --- a/decoder/hg_io.cc +++ b/decoder/hg_io.cc @@ -624,3 +624,30 @@ void HypergraphIO::WriteAsCFG(const Hypergraph& hg) {    }  } +/* Output format: + * #vertices + * for each vertex in bottom-up topological order: + *   #downward_edges + *   for each downward edge: + *     RHS with [vertex_index] for NTs ||| scores + */ +void HypergraphIO::WriteTarget(const Hypergraph& hg) { +  cout << hg.nodes_.size() << '\n'; +  for (unsigned int i = 0; i < hg.nodes_.size(); ++i) { +    const Hypergraph::EdgesVector &edges = hg.nodes_[i].in_edges_; +    cout << edges.size() << '\n'; +    for (unsigned int j = 0; j < edges.size(); ++j) { +      const Hypergraph::Edge &edge = hg.edges_[edges[j]]; +      const std::vector<WordID> &e = edge.rule_->e(); +      for (std::vector<WordID>::const_iterator word = e.begin(); word != e.end(); ++word) { +        if (*word <= 0) { +          cout << '[' << edge.tail_nodes_[-*word] << "] "; +        } else { +          cout << TD::Convert(*word) << ' '; +        } +      } +      cout << "||| " << edge.rule_->scores_ << '\n'; +    } +  } +} + diff --git a/decoder/hg_io.h b/decoder/hg_io.h index 082489d8..44817157 100644 --- a/decoder/hg_io.h +++ b/decoder/hg_io.h @@ -23,6 +23,9 @@ struct HypergraphIO {    static void WriteAsCFG(const Hypergraph& hg); +  // Write only the target size information in bottom-up order.   +  static void WriteTarget(const Hypergraph& hg); +    // serialization utils    static void ReadFromPLF(const std::string& in, Hypergraph* out, int line = 0);    // return PLF string representation (undefined behavior on non-lattices) | 
