summaryrefslogtreecommitdiff
path: root/utils/feature_accum.h
diff options
context:
space:
mode:
authorredpony <redpony@ec762483-ff6d-05da-a07a-a48fb63a330f>2010-08-11 02:37:10 +0000
committerredpony <redpony@ec762483-ff6d-05da-a07a-a48fb63a330f>2010-08-11 02:37:10 +0000
commit80686d4e567bae579ea39e009826a2de92cd4ace (patch)
treec3c35fcba57dde423a248f38aa121ad197c79734 /utils/feature_accum.h
parent3c85c407c333899f6b4bc26632d312b8e568b638 (diff)
major refactor, break bad circular deps
git-svn-id: https://ws10smt.googlecode.com/svn/trunk@509 ec762483-ff6d-05da-a07a-a48fb63a330f
Diffstat (limited to 'utils/feature_accum.h')
-rwxr-xr-xutils/feature_accum.h129
1 files changed, 129 insertions, 0 deletions
diff --git a/utils/feature_accum.h b/utils/feature_accum.h
new file mode 100755
index 00000000..851b29db
--- /dev/null
+++ b/utils/feature_accum.h
@@ -0,0 +1,129 @@
+#ifndef FEATURE_ACCUM_H
+#define FEATURE_ACCUM_H
+
+#include "ff.h"
+#include "sparse_vector.h"
+#include "value_array.h"
+
+struct SparseFeatureAccumulator : public FeatureVector {
+ typedef FeatureVector State;
+ SparseFeatureAccumulator() { }
+ template <class FF>
+ FeatureVector const& describe(FF const& ) { return *this; }
+ void Store(FeatureVector *fv) const {
+ fv->set_from(*this);
+ }
+ template <class FF>
+ void Store(FF const& /* ff */,FeatureVector *fv) const {
+ fv->set_from(*this);
+ }
+ template <class FF>
+ void Add(FF const& /* ff */,FeatureVector const& fv) {
+ (*this)+=fv;
+ }
+ void Add(FeatureVector const& fv) {
+ (*this)+=fv;
+ }
+ /*
+ SparseFeatureAccumulator(FeatureVector const& fv) : State(fv) {}
+ FeatureAccumulator(Features const& fids) {}
+ FeatureAccumulator(Features const& fids,FeatureVector const& fv) : State(fv) {}
+ void Add(Features const& fids,FeatureVector const& fv) {
+ *this += fv;
+ }
+ */
+ void Add(int i,Featval v) {
+ (*this)[i]+=v;
+ }
+ void Add(Features const& fids,int i,Featval v) {
+ (*this)[i]+=v;
+ }
+};
+
+struct SingleFeatureAccumulator {
+ typedef Featval State;
+ typedef SingleFeatureAccumulator Self;
+ State v;
+ /*
+ void operator +=(State const& o) {
+ v+=o;
+ }
+ */
+ void operator +=(Self const& s) {
+ v+=s.v;
+ }
+ SingleFeatureAccumulator() : v() {}
+ template <class FF>
+ State const& describe(FF const& ) const { return v; }
+
+ template <class FF>
+ void Store(FF const& ff,FeatureVector *fv) const {
+ fv->set_value(ff.fid_,v);
+ }
+ void Store(Features const& fids,FeatureVector *fv) const {
+ assert(fids.size()==1);
+ fv->set_value(fids[0],v);
+ }
+ /*
+ SingleFeatureAccumulator(Features const& fids) { assert(fids.size()==1); }
+ SingleFeatureAccumulator(Features const& fids,FeatureVector const& fv)
+ {
+ assert(fids.size()==1);
+ v=fv.get_singleton();
+ }
+ */
+
+ template <class FF>
+ void Add(FF const& ff,FeatureVector const& fv) {
+ v+=fv.get(ff.fid_);
+ }
+ void Add(FeatureVector const& fv) {
+ v+=fv.get_singleton();
+ }
+
+ void Add(Features const& fids,FeatureVector const& fv) {
+ v += fv.get(fids[0]);
+ }
+ void Add(Featval dv) {
+ v+=dv;
+ }
+ void Add(int,Featval dv) {
+ v+=dv;
+ }
+ void Add(FeatureVector const& fids,int i,Featval dv) {
+ assert(fids.size()==1 && i==0);
+ v+=dv;
+ }
+};
+
+
+#if 0
+// omitting this so we can default construct an accum. might be worth resurrecting in the future
+struct ArrayFeatureAccumulator : public ValueArray<Featval> {
+ typedef ValueArray<Featval> State;
+ template <class Fsa>
+ ArrayFeatureAccumulator(Fsa const& fsa) : State(fsa.features_.size()) { }
+ ArrayFeatureAccumulator(Features const& fids) : State(fids.size()) { }
+ ArrayFeatureAccumulator(Features const& fids) : State(fids.size()) { }
+ ArrayFeatureAccumulator(Features const& fids,FeatureVector const& fv) : State(fids.size()) {
+ for (int i=0,e=i<fids.size();i<e;++i)
+ (*this)[i]=fv.get(i);
+ }
+ State const& describe(Features const& fids) const { return *this; }
+ void Store(Features const& fids,FeatureVector *fv) const {
+ assert(fids.size()==size());
+ for (int i=0,e=i<fids.size();i<e;++i)
+ fv->set_value(fids[i],(*this)[i]);
+ }
+ void Add(Features const& fids,FeatureVector const& fv) {
+ for (int i=0,e=i<fids.size();i<e;++i)
+ (*this)[i]+=fv.get(i);
+ }
+ void Add(FeatureVector const& fids,int i,Featval v) {
+ (*this)[i]+=v;
+ }
+};
+#endif
+
+
+#endif