summaryrefslogtreecommitdiff
path: root/src/viterbi.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/viterbi.h')
-rw-r--r--src/viterbi.h130
1 files changed, 0 insertions, 130 deletions
diff --git a/src/viterbi.h b/src/viterbi.h
deleted file mode 100644
index 46a4f528..00000000
--- a/src/viterbi.h
+++ /dev/null
@@ -1,130 +0,0 @@
-#ifndef _VITERBI_H_
-#define _VITERBI_H_
-
-#include <vector>
-#include "prob.h"
-#include "hg.h"
-#include "tdict.h"
-
-// V must implement:
-// void operator()(const vector<const T*>& ants, T* result);
-template<typename T, typename Traversal, typename WeightType, typename WeightFunction>
-WeightType Viterbi(const Hypergraph& hg,
- T* result,
- const Traversal& traverse = Traversal(),
- const WeightFunction& weight = WeightFunction()) {
- const int num_nodes = hg.nodes_.size();
- std::vector<T> vit_result(num_nodes);
- std::vector<WeightType> vit_weight(num_nodes, WeightType::Zero());
-
- for (int i = 0; i < num_nodes; ++i) {
- const Hypergraph::Node& cur_node = hg.nodes_[i];
- WeightType* const cur_node_best_weight = &vit_weight[i];
- T* const cur_node_best_result = &vit_result[i];
-
- const int num_in_edges = cur_node.in_edges_.size();
- if (num_in_edges == 0) {
- *cur_node_best_weight = WeightType(1);
- continue;
- }
- 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) {
- *cur_node_best_weight = score;
- traverse(edge, ants, cur_node_best_result);
- }
- }
- }
- std::swap(*result, vit_result.back());
- return vit_weight.back();
-}
-
-struct PathLengthTraversal {
- void operator()(const Hypergraph::Edge& edge,
- const std::vector<const int*>& ants,
- int* result) const {
- (void) edge;
- *result = 1;
- for (int i = 0; i < ants.size(); ++i) *result += *ants[i];
- }
-};
-
-struct ESentenceTraversal {
- void operator()(const Hypergraph::Edge& edge,
- const std::vector<const std::vector<WordID>*>& ants,
- std::vector<WordID>* result) const {
- edge.rule_->ESubstitute(ants, result);
- }
-};
-
-struct ELengthTraversal {
- void operator()(const Hypergraph::Edge& edge,
- const std::vector<const int*>& ants,
- int* result) const {
- *result = edge.rule_->ELength() - edge.rule_->Arity();
- for (int i = 0; i < ants.size(); ++i) *result += *ants[i];
- }
-};
-
-struct FSentenceTraversal {
- void operator()(const Hypergraph::Edge& edge,
- const std::vector<const std::vector<WordID>*>& ants,
- std::vector<WordID>* result) const {
- edge.rule_->FSubstitute(ants, result);
- }
-};
-
-// create a strings of the form (S (X the man) (X said (X he (X would (X go)))))
-struct ETreeTraversal {
- ETreeTraversal() : left("("), space(" "), right(")") {}
- const std::string left;
- const std::string space;
- const std::string right;
- void operator()(const Hypergraph::Edge& edge,
- const std::vector<const std::vector<WordID>*>& ants,
- std::vector<WordID>* result) const {
- std::vector<WordID> tmp;
- edge.rule_->ESubstitute(ants, &tmp);
- const std::string cat = TD::Convert(edge.rule_->GetLHS() * -1);
- if (cat == "Goal")
- result->swap(tmp);
- else
- TD::ConvertSentence(left + cat + space + TD::GetString(tmp) + right,
- result);
- }
-};
-
-struct FTreeTraversal {
- FTreeTraversal() : left("("), space(" "), right(")") {}
- const std::string left;
- const std::string space;
- const std::string right;
- void operator()(const Hypergraph::Edge& edge,
- const std::vector<const std::vector<WordID>*>& ants,
- std::vector<WordID>* result) const {
- std::vector<WordID> tmp;
- edge.rule_->FSubstitute(ants, &tmp);
- const std::string cat = TD::Convert(edge.rule_->GetLHS() * -1);
- if (cat == "Goal")
- result->swap(tmp);
- else
- TD::ConvertSentence(left + cat + space + TD::GetString(tmp) + right,
- result);
- }
-};
-
-prob_t ViterbiESentence(const Hypergraph& hg, std::vector<WordID>* result);
-std::string ViterbiETree(const Hypergraph& hg);
-prob_t ViterbiFSentence(const Hypergraph& hg, std::vector<WordID>* result);
-std::string ViterbiFTree(const Hypergraph& hg);
-int ViterbiELength(const Hypergraph& hg);
-int ViterbiPathLength(const Hypergraph& hg);
-
-#endif