diff options
author | Chris Dyer <cdyer@cab.ark.cs.cmu.edu> | 2012-05-27 22:28:34 -0400 |
---|---|---|
committer | Chris Dyer <cdyer@cab.ark.cs.cmu.edu> | 2012-05-27 22:28:34 -0400 |
commit | fc936db02d42cc3978a4cc2017efe7a15c78855d (patch) | |
tree | a81b77c171f1c1d0a32f98f564d89e7f9966b0c1 /training/kbest_repository.cc | |
parent | 69593203e6e8df7dad5d8839a74b37bbc7500088 (diff) |
kbest repo
Diffstat (limited to 'training/kbest_repository.cc')
-rw-r--r-- | training/kbest_repository.cc | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/training/kbest_repository.cc b/training/kbest_repository.cc new file mode 100644 index 00000000..145b40a2 --- /dev/null +++ b/training/kbest_repository.cc @@ -0,0 +1,37 @@ +#include "kbest_repository.h" + +#include <boost/functional/hash.hpp> + +using namespace std; + +struct ApproxVectorHasher { + static const size_t MASK = 0xFFFFFFFFull; + union UType { + double f; // leave as double + size_t i; + }; + static inline double round(const double x) { + UType t; + t.f = x; + size_t r = t.i & MASK; + if ((r << 1) > MASK) + t.i += MASK - r + 1; + else + t.i &= (1ull - MASK); + return t.f; + } + size_t operator()(const SparseVector<double>& x) const { + size_t h = 0x573915839; + for (SparseVector<double>::const_iterator it = x.begin(); it != x.end(); ++it) { + UType t; + t.f = it->second; + if (t.f) { + size_t z = (t.i >> 32); + boost::hash_combine(h, it->first); + boost::hash_combine(h, z); + } + } + return h; + } +}; + |