diff options
| -rw-r--r-- | decoder/ff.cc | 2 | ||||
| -rw-r--r-- | decoder/ff_lm.cc | 16 | ||||
| -rw-r--r-- | decoder/hg.cc | 2 | ||||
| -rw-r--r-- | decoder/inside_outside.h | 4 | 
4 files changed, 18 insertions, 6 deletions
| diff --git a/decoder/ff.cc b/decoder/ff.cc index 7186d776..261e9a17 100644 --- a/decoder/ff.cc +++ b/decoder/ff.cc @@ -93,7 +93,7 @@ ModelSet::ModelSet(const vector<double>& w, const vector<const FeatureFunction*>  }  void ModelSet::AddFeaturesToEdge(const SentenceMetadata& smeta, -                                 const Hypergraph& hg, +                                 const Hypergraph& /* hg */,                                   const vector<string>& node_states,                                   Hypergraph::Edge* edge,                                   string* context, diff --git a/decoder/ff_lm.cc b/decoder/ff_lm.cc index a12a2667..8333bf7b 100644 --- a/decoder/ff_lm.cc +++ b/decoder/ff_lm.cc @@ -4,6 +4,13 @@  //NOTE: if ngram order is bigger than lm state's, then the longest possible ngram scores are still used.  if you really want a lower order, a truncated copy of the LM should be small enough.  otherwise, an option to null out words outside of the order's window would need to be implemented. +//#define UNIGRAM_DEBUG +#ifdef UNIGRAM_DEBUG +# define UNIDBG(x) do { cerr << x; } while(0) +#else +# define UNIDBG(x) +#endif +  #include "ff_lm.h"  #include <sstream> @@ -168,7 +175,7 @@ class LanguageModelImpl {        kNONE(-1),        kSTAR(TD::Convert("<{STAR}>"))    , unigram(order<=1) {} - +//TODO: show that unigram special case (0 state) computes what it should.    LanguageModelImpl(int order, const string& f) :        ngram_(*TD::dict_, order), buffer_(), order_(order), state_size_(OrderToStateSize(order) - 1),        floor_(-100.0), @@ -300,14 +307,19 @@ class LanguageModelImpl {    /// just how SRILM likes it: [rbegin,rend) is a phrase in reverse word order and null terminated so *rend=kNONE.  return unigram score for rend[-1] plus    /// cost returned is some kind of log prob (who cares, we're just adding)    double stateless_cost(WordID *rbegin,WordID *rend) { +    UNIDBG("p(");      double sum=0; -    for (;rend>rbegin;--rend) +    for (;rend>rbegin;--rend) {        sum+=clamp(WordProb(rend[-1],rend)); +      UNIDBG(","<<TD::Convert(rend[-1])); +    } +    UNIDBG(")="<<sum<<endl);      return sum;    }    //TODO: this would be a fine rule heuristic (for reordering hyperedges prior to rescoring.  for now you can just use a same-lm-file -o 1 prelm-rescore :(    double stateless_cost(TRule const& rule) { +    //TODO: make sure this is correct.      int len = rule.ELength(); // use a gap for each variable      buffer_.resize(len + 1);      buffer_[len] = kNONE; diff --git a/decoder/hg.cc b/decoder/hg.cc index b6b9d8bd..2cff17af 100644 --- a/decoder/hg.cc +++ b/decoder/hg.cc @@ -148,7 +148,7 @@ void Hypergraph::PruneEdges(const std::vector<bool>& prune_edge, bool run_inside      // I dislike.  If you know of a better way that doesn't involve specialization,      // fix this!      vector<Boolean> reachable; -    bool goal_derivable = Inside/* <Boolean, EdgeExistsWeightFunction> */(*this, &reachable, wf); +    bool goal_derivable = Inside/* <Boolean, EdgeExistsWeightFunction> */(*this, &reachable, wf).get();      if (!goal_derivable) {        edges_.clear();        nodes_.clear(); diff --git a/decoder/inside_outside.h b/decoder/inside_outside.h index 9f7ce526..62daca1f 100644 --- a/decoder/inside_outside.h +++ b/decoder/inside_outside.h @@ -10,8 +10,8 @@ struct Boolean {    bool x;    Boolean() : x() {  }    Boolean(bool i) : x(i) {  } -  operator bool() const { return x; } -  // normally you'd use the logical (short circuit) || &&  operators, but bool really is guaranteed to be 0 or 1 numerically. +  operator bool() const { return x; } // careful - this might cause a disaster with (bool)a + Boolean(b). +  // normally you'd use the logical (short circuit) || &&  operators, but bool really is guaranteed to be 0 or 1 numerically.  also note that | and & have equal precedence (!)    void operator+=(Boolean o) { x|=o.x; }    friend inline Boolean operator +(Boolean a,Boolean b) {      return Boolean(a.x|b.x); | 
