summaryrefslogtreecommitdiff
path: root/decoder/cfg.cc
diff options
context:
space:
mode:
Diffstat (limited to 'decoder/cfg.cc')
-rwxr-xr-xdecoder/cfg.cc42
1 files changed, 42 insertions, 0 deletions
diff --git a/decoder/cfg.cc b/decoder/cfg.cc
new file mode 100755
index 00000000..0f20ba0f
--- /dev/null
+++ b/decoder/cfg.cc
@@ -0,0 +1,42 @@
+#include "cfg.h"
+#include "hg.h"
+
+using namespace std;
+
+void CFG::Init(Hypergraph const& hg,bool target_side,bool copy_features,bool push_weights) {
+ hg_=&hg;
+ Hypergraph::NodeProbs np;
+ goal_inside=hg.ComputeNodeViterbi(&np);
+ pushed_inside=push_weights ? goal_inside : prob_t(1);
+ int nn=hg.nodes_.size(),ne=hg.edges_.size();
+ nts.resize(nn);
+ rules.resize(ne);
+ for (int i=0;i<nn;++i)
+ nts[i].ruleids=hg.nodes_[i].in_edges_;
+ for (int i=0;i<ne;++i) {
+ Rule &cfgr=rules[i];
+ Hypergraph::Edge const& e=hg.edges_[i];
+ TRule const& er=*e.rule_; vector<WordID> const& rule_rhs=target_side?er.e():er.f();
+ RHS &rhs=cfgr.rhs;
+ int nr=rule_rhs.size();
+ rhs.resize(nr);
+ prob_t &crp=cfgr.p;
+ crp=e.edge_prob_;
+ cfgr.lhs=e.head_node_;
+#if CFG_DEBUG
+ cfgr.rule=e.rule_;
+#endif
+ if (copy_features) cfgr.f=e.feature_values_;
+ if (push_weights) crp /=np[e.head_node_];
+ for (int j=0;j<nr;++j) {
+ WordID w=rule_rhs[j];
+ if (w>0)
+ rhs[j]=w;
+ else {
+ int n=e.tail_nodes_[-w];
+ if (push_weights) crp*=np[n];
+ rhs[j]=n;
+ }
+ }
+ }
+}