diff options
author | Patrick Simianer <p@simianer.de> | 2011-09-23 22:02:45 +0200 |
---|---|---|
committer | Patrick Simianer <p@simianer.de> | 2011-09-23 22:02:45 +0200 |
commit | e8f1795f6aa14ca4a936d675d446894f5c721190 (patch) | |
tree | 9747dd7386c54f0803734331d2772181b66de983 /dtrain/sample_hg.cc | |
parent | 9bde56ed23b4b97f8193f9f8f582f18086ff17c1 (diff) |
more renaming, random pair sampler uses boost rng
Diffstat (limited to 'dtrain/sample_hg.cc')
-rw-r--r-- | dtrain/sample_hg.cc | 74 |
1 files changed, 0 insertions, 74 deletions
diff --git a/dtrain/sample_hg.cc b/dtrain/sample_hg.cc deleted file mode 100644 index 33872fb8..00000000 --- a/dtrain/sample_hg.cc +++ /dev/null @@ -1,74 +0,0 @@ -#include "sample_hg.h" - -#include <queue> - -#include "viterbi.h" -#include "inside_outside.h" - -using namespace std; - -struct SampledDerivationWeightFunction { - typedef double Weight; - explicit SampledDerivationWeightFunction(const vector<bool>& sampled) : sampled_edges(sampled) {} - double operator()(const Hypergraph::Edge& e) const { - return static_cast<double>(sampled_edges[e.id_]); - } - const vector<bool>& sampled_edges; -}; - -void HypergraphSampler::sample_hypotheses(const Hypergraph& hg, - unsigned n, - MT19937* rng, - vector<Hypothesis>* hypos) { - hypos->clear(); - hypos->resize(n); - - // compute inside probabilities - vector<prob_t> node_probs; - Inside<prob_t, EdgeProb>(hg, &node_probs, EdgeProb()); - - vector<bool> sampled_edges(hg.edges_.size()); - queue<unsigned> q; - SampleSet<prob_t> ss; - for (unsigned i = 0; i < n; ++i) { - fill(sampled_edges.begin(), sampled_edges.end(), false); - // sample derivation top down - assert(q.empty()); - Hypothesis& hyp = (*hypos)[i]; - SparseVector<double>& deriv_features = hyp.fmap; - q.push(hg.nodes_.size() - 1); - prob_t& model_score = hyp.model_score; - model_score = prob_t::One(); - while(!q.empty()) { - unsigned cur_node_id = q.front(); - q.pop(); - const Hypergraph::Node& node = hg.nodes_[cur_node_id]; - const unsigned num_in_edges = node.in_edges_.size(); - unsigned sampled_edge_idx = 0; - if (num_in_edges == 1) { - sampled_edge_idx = node.in_edges_[0]; - } else { - assert(num_in_edges > 1); - ss.clear(); - for (unsigned j = 0; j < num_in_edges; ++j) { - const Hypergraph::Edge& edge = hg.edges_[node.in_edges_[j]]; - prob_t p = edge.edge_prob_; // edge weight - for (unsigned k = 0; k < edge.tail_nodes_.size(); ++k) - p *= node_probs[edge.tail_nodes_[k]]; // tail node inside weight - ss.add(p); - } - sampled_edge_idx = node.in_edges_[rng->SelectSample(ss)]; - } - sampled_edges[sampled_edge_idx] = true; - const Hypergraph::Edge& sampled_edge = hg.edges_[sampled_edge_idx]; - deriv_features += sampled_edge.feature_values_; - model_score *= sampled_edge.edge_prob_; - //sampled_deriv->push_back(sampled_edge_idx); - for (unsigned j = 0; j < sampled_edge.tail_nodes_.size(); ++j) { - q.push(sampled_edge.tail_nodes_[j]); - } - } - Viterbi(hg, &hyp.words, ESentenceTraversal(), SampledDerivationWeightFunction(sampled_edges)); - } -} - |