summaryrefslogtreecommitdiff
path: root/fast/sparse_vector.hh
diff options
context:
space:
mode:
Diffstat (limited to 'fast/sparse_vector.hh')
-rw-r--r--fast/sparse_vector.hh116
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
+