summaryrefslogtreecommitdiff
path: root/decoder
diff options
context:
space:
mode:
Diffstat (limited to 'decoder')
-rw-r--r--decoder/cdec.cc1
-rw-r--r--decoder/viterbi.h19
2 files changed, 12 insertions, 8 deletions
diff --git a/decoder/cdec.cc b/decoder/cdec.cc
index bb29bafb..b43b7826 100644
--- a/decoder/cdec.cc
+++ b/decoder/cdec.cc
@@ -86,6 +86,7 @@ void InitCommandLine(int argc, char** argv, po::variables_map* conf) {
("show_expected_length", "Show the expected translation length under the model")
("show_partition,z", "Compute and show the partition (inside score)")
("show_cfg_search_space", "Show the search space as a CFG")
+ ("show_viterbi_features","Show the feature vector for the viterbi translation")
("prelm_density_prune", po::value<double>(), "Applied to -LM forest just before final LM rescoring: keep no more than this many times the number of edges used in the best derivation tree (>=1.0)")
("density_prune", po::value<double>(), "Keep no more than this many times the number of edges used in the best derivation tree (>=1.0)")
("prelm_beam_prune", po::value<double>(), "Prune paths from -LM forest before LM rescoring, keeping paths within exp(alpha>=0)")
diff --git a/decoder/viterbi.h b/decoder/viterbi.h
index d4a97516..6b8bbed1 100644
--- a/decoder/viterbi.h
+++ b/decoder/viterbi.h
@@ -29,20 +29,23 @@ WeightType Viterbi(const Hypergraph& hg,
*cur_node_best_weight = WeightType(1);
continue;
}
+ Hypergraph::Edge const* edge_best=0;
for (int j = 0; j < num_in_edges; ++j) {
const Hypergraph::Edge& edge = hg.edges_[cur_node.in_edges_[j]];
WeightType score = weight(edge);
- std::vector<const T*> ants(edge.tail_nodes_.size());
- for (int k = 0; k < edge.tail_nodes_.size(); ++k) {
- const int tail_node_index = edge.tail_nodes_[k];
- score *= vit_weight[tail_node_index];
- ants[k] = &vit_result[tail_node_index];
- }
- if (*cur_node_best_weight < score) {
+ for (int k = 0; k < edge.tail_nodes_.size(); ++k)
+ score *= vit_weight[edge.tail_nodes_[k]];
+ if (!edge_best || *cur_node_best_weight < score) {
*cur_node_best_weight = score;
- traverse(edge, ants, cur_node_best_result);
+ edge_best=&edge;
}
}
+ assert(edge_best);
+ Hypergraph::Edge const& edgeb=*edge_best;
+ std::vector<const T*> antsb(edgeb.tail_nodes_.size());
+ for (int k = 0; k < edgeb.tail_nodes_.size(); ++k)
+ antsb[k] = &vit_result[edgeb.tail_nodes_[k]];
+ traverse(edgeb, antsb, cur_node_best_result);
}
std::swap(*result, vit_result.back());
return vit_weight.back();