diff options
Diffstat (limited to 'fast/sparse_vector.hh')
-rw-r--r-- | fast/sparse_vector.hh | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/fast/sparse_vector.hh b/fast/sparse_vector.hh new file mode 100644 index 0000000..8fdc1b9 --- /dev/null +++ b/fast/sparse_vector.hh @@ -0,0 +1,116 @@ +#pragma once + +#include <unordered_map> +#include <vector> +#include <sstream> + +#include "hypergraph.hh" // FIXME + +using namespace std; + + +namespace Sv { + +template<typename K, typename V> +struct SparseVector { + unordered_map<K, V> m_; + V zero = 0.0; + + void + insert(K k, V v) { m_[k] = v; }; + + weight_t + dot(SparseVector& other) + { + }; + + V& + operator[](const K& k) + { + return at(k); + }; + + const V& + at(const K& k) const + { + if (m_.find(k) == m_.end()) + return zero; + else + return m_.at(k); + } + + 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); + return v; + }; + + SparseVector& + operator+=(const SparseVector& other) + { + for (auto it = other.m_.begin(); it != other.m_.end(); it++) + m_[it->first] += it->second; + return *this; + }; + + 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); + return v; + }; + + SparseVector& + operator-=(const SparseVector& other) + { + for (auto it = other.m_.begin(); it != other.m_.end(); it++) + m_[it->first] -= it->second; + return *this; + }; + + 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; + return v; + }; + + SparseVector& + operator*=(V f) + { + for (auto it = m_.begin(); it != m_.end(); it++) + m_[it->first] *= f; + return *this; + }; + + string + repr() const + { + ostringstream os; + os << "SparseVector<{"; + for (auto it = m_.begin(); it != m_.end(); it ++) { + os << "'" << it->first << "'=" << it->second; + if (next(it) != m_.end()) + os << ", "; + } + os << "}>"; + return os.str(); + }; + + friend ostream& + operator<<(ostream& os, const SparseVector& v) { return os << v.repr(); } +}; + +} // namespace + |