diff options
| author | graehl@gmail.com <graehl@gmail.com@ec762483-ff6d-05da-a07a-a48fb63a330f> | 2010-08-09 06:14:04 +0000 | 
|---|---|---|
| committer | graehl@gmail.com <graehl@gmail.com@ec762483-ff6d-05da-a07a-a48fb63a330f> | 2010-08-09 06:14:04 +0000 | 
| commit | b96f8ca79c3293062a4b24266e07859cedc936c2 (patch) | |
| tree | ef81550fb137d536f8ae64733d9da73be2417078 /decoder/hg.cc | |
| parent | ffd4acfe5b84f413c66af6ec5a76bdbc0d3aa9e8 (diff) | |
hg sort in_edges by viterbi, debug print temporarily enabled which always --show_derivation
git-svn-id: https://ws10smt.googlecode.com/svn/trunk@494 ec762483-ff6d-05da-a07a-a48fb63a330f
Diffstat (limited to 'decoder/hg.cc')
| -rw-r--r-- | decoder/hg.cc | 70 | 
1 files changed, 65 insertions, 5 deletions
| diff --git a/decoder/hg.cc b/decoder/hg.cc index 47924d99..1e2a0010 100644 --- a/decoder/hg.cc +++ b/decoder/hg.cc @@ -16,6 +16,7 @@  using namespace std; +#if 0  Hypergraph::Edge const* Hypergraph::ViterbiGoalEdge() const  {    Edge const* r=0; @@ -26,6 +27,64 @@ Hypergraph::Edge const* Hypergraph::ViterbiGoalEdge() const    }    return r;  } +#endif + +Hypergraph::Edge const* Hypergraph::ViterbiSortInEdges() +{ +  NodeProbs nv; +  ComputeNodeViterbi(&nv); +  return SortInEdgesByNodeViterbi(nv); +} + +Hypergraph::Edge const* Hypergraph::SortInEdgesByNodeViterbi(NodeProbs const& nv) +{ +  EdgeProbs ev; +  ComputeEdgeViterbi(nv,&ev); +  return ViterbiSortInEdges(ev); +} + +namespace { +struct less_ve { +  Hypergraph::EdgeProbs const& ev; +  //Hypergraph const& hg; +  explicit less_ve(Hypergraph::EdgeProbs const& ev/*,Hypergraph const& hg */) : ev(ev)/*,hg(hg)*/ {  } +  bool operator()(int a,int b) const { +    return ev[a] > ev[b]; +  } +}; +} + +Hypergraph::Edge const* Hypergraph::ViterbiSortInEdges(EdgeProbs const& ev) +{ +  for (int i=0;i<nodes_.size();++i) { +    EdgesVector &ie=nodes_[i].in_edges_; +    std::sort(ie.begin(),ie.end(),less_ve(ev)); +  } +  return first_edge(); +} + +prob_t Hypergraph::ComputeEdgeViterbi(EdgeProbs *ev) const { +  NodeProbs nv; +  ComputeNodeViterbi(&nv); +  return ComputeEdgeViterbi(nv,ev); +} + +prob_t Hypergraph::ComputeEdgeViterbi(NodeProbs const& nv,EdgeProbs *ev) const { +  for (int i=0;i<edges_.size();++i) { +    Edge const& e=edges_[i]; +    prob_t r=e.edge_prob_; +    TailNodeVector const& t=e.tail_nodes_; +    for (TailNodeVector::const_iterator j=t.begin(),jj=t.end();j!=jj;++j) +      r*=nv[*j]; +    /* +    for (int j=0;j<e.tail_nodes_.size();++j) +      r*=nv[e.tail_nodes_[j]]; +    */ +    (*ev)[i]=r; +  } +  return nv.empty()?prob_t(0):nv.back(); +} +  std::string Hypergraph::stats(std::string const& name) const  { @@ -659,14 +718,15 @@ struct EdgeWeightSorter {    }  */ +std::string Hypergraph::show_first_tree(bool indent,int show_mask,int maxdepth,int depth) const { +  EdgeHandle fe=first_edge(); +  return fe ? fe->derivation_tree(*this,fe,indent,show_mask,maxdepth,depth) : ""; +} +  std::string Hypergraph::show_viterbi_tree(bool indent,int show_mask,int maxdepth,int depth) const {    HypergraphP v=CreateViterbiHypergraph();  //  cerr<<viterbi_stats(*v,"debug show_viterbi_tree",true,true,false)<<endl; -  if (v->NumberOfEdges()) { -    Edge const* beste=&v->edges_.back();   //FIXME: this doesn't work. check CreateViterbiHypergraph ? -    return beste->derivation_tree(*v,beste,indent,show_mask,maxdepth,depth); -  } -  return std::string(); +  return v->show_first_tree(indent,show_mask,maxdepth,depth);  }  HypergraphP Hypergraph::CreateEdgeSubset(EdgeMask &keep_edges) const { | 
