diff options
Diffstat (limited to 'fast/sparse_vector.hh')
-rw-r--r-- | fast/sparse_vector.hh | 106 |
1 files changed, 80 insertions, 26 deletions
diff --git a/fast/sparse_vector.hh b/fast/sparse_vector.hh index dd7f3cf..e497769 100644 --- a/fast/sparse_vector.hh +++ b/fast/sparse_vector.hh @@ -1,11 +1,13 @@ #pragma once +#include <iostream> +#include <sstream> +#include <string> #include <unordered_map> #include <vector> -#include <sstream> -typedef double score_t; // FIXME -typedef double weight_t; +#include "util.hh" +#include "weaver.hh" using namespace std; @@ -14,17 +16,52 @@ namespace Sv { template<typename K, typename V> struct SparseVector { - unordered_map<K, V> m_; - V zero = 0.0; + unordered_map<K,V> m_; + V zero = 0.f; + + SparseVector() {}; + SparseVector(string& s) + { + stringstream ss(s); + while (!ss.eof()) { + string t; + ss >> t; + size_t eq = t.find_first_of("="); + t.replace(eq, 1, " "); + stringstream tt(t); + K k; V v; + tt >> k >> v; + m_.emplace(k.substr(k.find_first_of("\"")+1, k.find_last_of("\"")-1), v); + } + }; void insert(K k, V v) { m_[k] = v; }; - weight_t + V dot(SparseVector& other) { + V r; + unordered_map<K,V>* o = &m_; + auto b = m_.cbegin(); + auto e = m_.cend(); + if (other.size() < size()) { + b = other.m_.cbegin(); + e = other.m_.cend(); + o = &other.m_; + } + for (auto it = b; it != e; it++) + r += it->second * o->at(it->first); + + return r; }; + size_t + size() + { + return m_.size(); + } + V& operator[](const K& k) { @@ -44,18 +81,20 @@ struct SparseVector { operator+(const SparseVector& other) const { SparseVector<K,V> v; - v.m_.insert(m_.begin(), m_.end()); - v.m_.insert(other.m_.begin(), other.m_.end()); - for (auto it = v.m_.begin(); it != v.m_.end(); it++) - v.m_[it->first] = this->at(it->first) + other.at(it->first); + v.m_.insert(m_.cbegin(), m_.cend()); + v.m_.insert(other.m_.cbegin(), other.m_.cend()); + for (const auto it: v.m_) + v.m_[it.first] = this->at(it.first) + other.at(it.first); + return v; }; SparseVector& operator+=(const SparseVector& other) { - for (auto it = other.m_.begin(); it != other.m_.end(); it++) - m_[it->first] += it->second; + for (const auto it: other.m_) + m_[it.first] += it.second; + return *this; }; @@ -63,18 +102,20 @@ struct SparseVector { operator-(const SparseVector& other) const { SparseVector<K,V> v; - v.m_.insert(m_.begin(), m_.end()); - v.m_.insert(other.m_.begin(), other.m_.end()); - for (auto it = v.m_.begin(); it != v.m_.end(); it++) - v.m_[it->first] = this->at(it->first) - other.at(it->first); + v.m_.insert(m_.cbegin(), m_.cend()); + v.m_.insert(other.m_.cbegin(), other.m_.cend()); + for (const auto it: v.m_) + v.m_[it.first] = this->at(it.first) - other.at(it.first); + return v; }; SparseVector& operator-=(const SparseVector& other) { - for (auto it = other.m_.begin(); it != other.m_.end(); it++) - m_[it->first] -= it->second; + for (const auto it: other.m_) + m_[it.first] -= it.second; + return *this; }; @@ -82,35 +123,48 @@ struct SparseVector { operator*(V f) const { SparseVector<K,V> v; - for (auto it = m_.begin(); it != m_.end(); it++) - v.m_[it->first] = this->at(it->first) * f; + for (const auto it: m_) + v.m_[it.first] = this->at(it.first) * f; + return v; }; SparseVector& operator*=(V f) { - for (auto it = m_.begin(); it != m_.end(); it++) - m_[it->first] *= f; + for (const auto it: m_) + m_[it.first] *= f; + return *this; }; string repr() const { - ostringstream os; + ostringstream os; os << "SparseVector<{"; - for (auto it = m_.begin(); it != m_.end(); it ++) { + for (auto it = m_.cbegin(); it != m_.cend(); it++) { os << "'" << it->first << "'=" << it->second; if (next(it) != m_.end()) os << ", "; } os << "}>"; + + return os.str(); + }; + + string + escaped() const { + ostringstream os; + for (auto it = m_.cbegin(); it != m_.cend(); it++) { + os << '"' << util::json_escape(it->first) << '"' << "=" << it->second; + if (next(it) != m_.cend()) os << " "; + } + return os.str(); }; - friend ostream& - operator<<(ostream& os, const SparseVector& v) { return os << v.repr(); } + friend ostream& operator<<(ostream& os, const SparseVector& v) { return os << v.repr(); } }; } // namespace |