summaryrefslogtreecommitdiff
path: root/decoder
diff options
context:
space:
mode:
Diffstat (limited to 'decoder')
-rwxr-xr-xdecoder/ff_fsa.h4
-rw-r--r--decoder/sparse_vector.h10
2 files changed, 9 insertions, 5 deletions
diff --git a/decoder/ff_fsa.h b/decoder/ff_fsa.h
index 0a7aebde..e199ec04 100755
--- a/decoder/ff_fsa.h
+++ b/decoder/ff_fsa.h
@@ -136,7 +136,7 @@ public:
// NOTE: if you want to e.g. track statistics, cache, whatever, cast const away or use mutable members
inline void Scan(SentenceMetadata const& smeta,const Hypergraph::Edge& edge,WordID w,void const* state,void *next_state,FeatureVector *features) const {
- features->add_value(fid_,Scan1(w,state,next_state));
+ features->maybe_add(fid_,Scan1(w,state,next_state));
}
// don't set state-bytes etc. in ctor because it may depend on parsing param string
@@ -244,7 +244,7 @@ public:
int markov_order() const { return 1; }
Featval ScanT1(WordID w,int prevlen,int &len) const { return 0; }
inline void ScanT(SentenceMetadata const& smeta,const Hypergraph::Edge& edge,WordID w,int prevlen,int &len,FeatureVector *features) const {
- features->add_value(d().fid_,d().ScanT1(w,prevlen,len));
+ features->maybe_add(d().fid_,d().ScanT1(w,prevlen,len));
}
inline void Scan(SentenceMetadata const& smeta,const Hypergraph::Edge& edge,WordID w,void const* st,void *next_state,FeatureVector *features) const {
diff --git a/decoder/sparse_vector.h b/decoder/sparse_vector.h
index ec623c6e..0325c1ee 100644
--- a/decoder/sparse_vector.h
+++ b/decoder/sparse_vector.h
@@ -115,15 +115,19 @@ public:
values_[index] = value;
}
- void add_value(int index, const T &value) {
- if (!value) return;
+ inline void maybe_add(int index, const T& value) {
+ if (value) add_value(index,value);
+ }
+
+ T& add_value(int index, const T &value) {
#if 1
- values_[index]+=value;
+ return values_[index]+=value;
#else
// this is not really going to be any faster, and we already rely on default init = 0 init
std::pair<typename MapType::iterator,bool> art=values_.insert(std::make_pair(index,value));
T &val=art.first->second;
if (!art.second) val += value; // already existed
+ return val;
#endif
}