summaryrefslogtreecommitdiff
path: root/decoder/hg.cc
diff options
context:
space:
mode:
authorgraehl <graehl@ec762483-ff6d-05da-a07a-a48fb63a330f>2010-07-25 19:32:34 +0000
committergraehl <graehl@ec762483-ff6d-05da-a07a-a48fb63a330f>2010-07-25 19:32:34 +0000
commitfe91371a77ec43cc08d284ac49f00af8baa1a298 (patch)
tree0cad767686d6522d10c288d274dd358bd054ee65 /decoder/hg.cc
parent410cc38baef914cdc0841a2e8d5a84098e48be49 (diff)
fixed CreateViterbiHypergraph (old impl did not work), so --show_derivation works
git-svn-id: https://ws10smt.googlecode.com/svn/trunk@408 ec762483-ff6d-05da-a07a-a48fb63a330f
Diffstat (limited to 'decoder/hg.cc')
-rw-r--r--decoder/hg.cc70
1 files changed, 36 insertions, 34 deletions
diff --git a/decoder/hg.cc b/decoder/hg.cc
index 8292639b..88e95337 100644
--- a/decoder/hg.cc
+++ b/decoder/hg.cc
@@ -626,11 +626,10 @@ struct EdgeWeightSorter {
std::string Hypergraph::show_viterbi_tree(bool indent,int show_mask,int maxdepth,int depth) const {
HypergraphP v=CreateViterbiHypergraph();
- //FIXME: remove dbg print, fix.
- cerr<<viterbi_stats(*this,"debug show_viterbi_tree",true,true,false)<<endl;
+// 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(*this,beste,indent,show_mask,maxdepth,depth);
+ return beste->derivation_tree(*v,beste,indent,show_mask,maxdepth,depth);
}
return std::string();
}
@@ -640,6 +639,30 @@ HypergraphP Hypergraph::CreateEdgeSubset(EdgeMask &keep_edges) const {
return CreateEdgeSubset(keep_edges,kn);
}
+HypergraphP Hypergraph::CreateEdgeSubset(EdgeMask &keep_edges,NodeMask &kn) const {
+ kn.clear();
+ kn.resize(nodes_.size());
+ for (int n=0;n<nodes_.size();++n) { // this nested iteration gives us edges in topo order too
+ EdgesVector const& es=nodes_[n].in_edges_;
+ for (int i=0;i<es.size();++i) {
+ int ei=es[i];
+ if (keep_edges[ei]) {
+ const Edge& e = edges_[ei];
+ TailNodeVector const& tails=e.tail_nodes_;
+ for (int j=0;j<e.tail_nodes_.size();++j) {
+ if (!kn[tails[j]]) {
+ keep_edges[ei]=false;
+ goto next_edge;
+ }
+ }
+ kn[e.head_node_]=true;
+ }
+ next_edge: ;
+ }
+ }
+ return CreateNodeEdgeSubset(kn,keep_edges);
+}
+
HypergraphP Hypergraph::CreateNodeEdgeSubset(NodeMask const& keep_nodes,EdgeMask const&keep_edges) const {
indices_after n2(keep_nodes);
indices_after e2(keep_edges);
@@ -672,28 +695,6 @@ void Hypergraph::TightenEdgeMask(EdgeMask &ke,NodeMask const& kn) const
}
}
-HypergraphP Hypergraph::CreateEdgeSubset(EdgeMask &keep_edges,NodeMask &kn) const {
- kn.clear();
- kn.resize(nodes_.size());
- for (int n=0;n<nodes_.size();++n) { // this nested iteration gives us edges in topo order too
- EdgesVector const& es=nodes_[n].in_edges_;
- for (int i=0;i<es.size();++i) {
- int ei=es[i];
- const Edge& e = edges_[ei];
- TailNodeVector const& tails=e.tail_nodes_;
- for (int j=0;j<e.tail_nodes_.size();++j) {
- if (!kn[tails[j]]) {
- keep_edges[ei]=false;
- goto next_edge;
- }
- }
- kn[e.head_node_]=true;
- next_edge: ;
- }
- }
- return CreateNodeEdgeSubset(kn,keep_edges);
-}
-
void Hypergraph::set_ids() {
for (int i = 0; i < edges_.size(); ++i)
edges_[i].id_=i;
@@ -701,7 +702,8 @@ void Hypergraph::set_ids() {
nodes_[i].id_=i;
}
-void Hypergraph::check_ids() {
+void Hypergraph::check_ids() const
+{
for (int i = 0; i < edges_.size(); ++i)
assert(edges_[i].id_==i);
for (int i = 0; i < nodes_.size(); ++i)
@@ -717,16 +719,16 @@ HypergraphP Hypergraph::CreateViterbiHypergraph(const vector<bool>* edges) const
} else {
Viterbi(*this, &vit_edges, ViterbiPathTraversal() ,EdgeProb());
}
-#if 0
+#if 1
# if 1
- check_ids();
+ check_ids();
# else
- set_ids();
+ set_ids();
# endif
- EdgeMask used(edges_.size());
- for (int i = 0; i < vit_edges.size(); ++i)
- used[vit_edges[i]->id_]=true;
- return CreateEdgeSubset(used);
+ EdgeMask used(edges_.size());
+ for (int i = 0; i < vit_edges.size(); ++i)
+ used[vit_edges[i]->id_]=true;
+ return CreateEdgeSubset(used);
#else
map<int, int> old2new_node;
int num_new_nodes = 0;
@@ -762,7 +764,7 @@ HypergraphP Hypergraph::CreateViterbiHypergraph(const vector<bool>* edges) const
out->nodes_[new_tail_node].out_edges_.push_back(i);
}
}
-#endif
return ret;
+#endif
}