From 410cc38baef914cdc0841a2e8d5a84098e48be49 Mon Sep 17 00:00:00 2001 From: graehl Date: Sun, 25 Jul 2010 07:37:59 +0000 Subject: more comprehensible (but untested) edge/node filtering, awesome per-edge debugging streams git-svn-id: https://ws10smt.googlecode.com/svn/trunk@407 ec762483-ff6d-05da-a07a-a48fb63a330f --- decoder/hg.cc | 116 +++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 107 insertions(+), 9 deletions(-) (limited to 'decoder/hg.cc') diff --git a/decoder/hg.cc b/decoder/hg.cc index e7a86c5b..8292639b 100644 --- a/decoder/hg.cc +++ b/decoder/hg.cc @@ -397,6 +397,7 @@ void Hypergraph::RemoveNoncoaccessibleStates(int goal_node_id) { assert(goal_node_id >= 0); assert(goal_node_id < nodes_.size()); + // I don't get it: does TopologicallySortNodesAndEdges not remove things that don't connect to goal_index? it uses goal_index just to order things? InsideOutside pruning can do this anyway (nearly infinite beam, viterbi semiring) // TODO finish implementation abort(); } @@ -614,15 +615,100 @@ struct EdgeWeightSorter { return hg.edges_[a].edge_prob_ > hg.edges_[b].edge_prob_; } }; - -void Hypergraph::SortInEdgesByEdgeWeights() { +/* + void Hypergraph::SortInEdgesByEdgeWeights() { for (int i = 0; i < nodes_.size(); ++i) { - Node& node = nodes_[i]; - sort(node.in_edges_.begin(), node.in_edges_.end(), EdgeWeightSorter(*this)); + Node& node = nodes_[i]; + sort(node.in_edges_.begin(), node.in_edges_.end(), EdgeWeightSorter(*this)); + } + } +*/ + +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<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 std::string(); +} + +HypergraphP Hypergraph::CreateEdgeSubset(EdgeMask &keep_edges) const { + NodeMask kn; + return CreateEdgeSubset(keep_edges,kn); +} + +HypergraphP Hypergraph::CreateNodeEdgeSubset(NodeMask const& keep_nodes,EdgeMask const&keep_edges) const { + indices_after n2(keep_nodes); + indices_after e2(keep_edges); + HypergraphP ret(new Hypergraph(n2.n_kept, e2.n_kept, is_linear_chain_)); + Nodes &rn=ret->nodes_; + for (int i=0;iedges_; + for (int i=0;i* edges) const { +HypergraphP Hypergraph::CreateViterbiHypergraph(const vector* edges) const { typedef ViterbiPathTraversal::Result VE; VE vit_edges; if (edges) { @@ -631,18 +717,29 @@ Hypergraph* Hypergraph::CreateViterbiHypergraph(const vector* edges) const } else { Viterbi(*this, &vit_edges, ViterbiPathTraversal() ,EdgeProb()); } +#if 0 +# if 1 + check_ids(); +# else + 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); +#else map old2new_node; int num_new_nodes = 0; for (int i = 0; i < vit_edges.size(); ++i) { const Edge& edge = *vit_edges[i]; - for (int j = 0; j < edge.tail_nodes_.size(); ++j) - assert(old2new_node.count(edge.tail_nodes_[j]) > 0); + for (int j = 0; j < edge.tail_nodes_.size(); ++j) assert(old2new_node.count(edge.tail_nodes_[j]) > 0); if (old2new_node.count(edge.head_node_) == 0) { old2new_node[edge.head_node_] = num_new_nodes; ++num_new_nodes; } } - Hypergraph* out = new Hypergraph(num_new_nodes, vit_edges.size(), is_linear_chain_); + HypergraphP ret(new Hypergraph(num_new_nodes, vit_edges.size(), is_linear_chain_)); + Hypergraph* out = ret.get(); for (map::iterator it = old2new_node.begin(); it != old2new_node.end(); ++it) { const Node& old_node = nodes_[it->first]; @@ -665,6 +762,7 @@ Hypergraph* Hypergraph::CreateViterbiHypergraph(const vector* edges) const out->nodes_[new_tail_node].out_edges_.push_back(i); } } - return out; +#endif + return ret; } -- cgit v1.2.3