From 4b7b2693e829166ccec8707b59fb2bc26179551b Mon Sep 17 00:00:00 2001
From: Patrick Simianer
Date: Tue, 22 Jul 2014 00:34:01 +0200
Subject: simple sparse vector type
---
fast/sparse_vector.hh | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 116 insertions(+)
create mode 100644 fast/sparse_vector.hh
(limited to 'fast/sparse_vector.hh')
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
+#include
+#include
+
+#include "hypergraph.hh" // FIXME
+
+using namespace std;
+
+
+namespace Sv {
+
+template
+struct SparseVector {
+ unordered_map 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 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 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 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
+
--
cgit v1.2.3