aboutsummaryrefslogtreecommitdiffhomepage
path: root/disabled/HashMatrix.h
diff options
context:
space:
mode:
Diffstat (limited to 'disabled/HashMatrix.h')
-rw-r--r--disabled/HashMatrix.h166
1 files changed, 166 insertions, 0 deletions
diff --git a/disabled/HashMatrix.h b/disabled/HashMatrix.h
new file mode 100644
index 000000000..1d6d33cce
--- /dev/null
+++ b/disabled/HashMatrix.h
@@ -0,0 +1,166 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra. Eigen itself is part of the KDE project.
+//
+// Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>
+//
+// Eigen is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 3 of the License, or (at your option) any later version.
+//
+// Alternatively, you can redistribute it and/or
+// modify it under the terms of the GNU General Public License as
+// published by the Free Software Foundation; either version 2 of
+// the License, or (at your option) any later version.
+//
+// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License and a copy of the GNU General Public License along with
+// Eigen. If not, see <http://www.gnu.org/licenses/>.
+
+#ifndef EIGEN_HASHMATRIX_H
+#define EIGEN_HASHMATRIX_H
+
+template<typename _Scalar, int _Flags>
+struct ei_traits<HashMatrix<_Scalar, _Flags> >
+{
+ typedef _Scalar Scalar;
+ enum {
+ RowsAtCompileTime = Dynamic,
+ ColsAtCompileTime = Dynamic,
+ MaxRowsAtCompileTime = Dynamic,
+ MaxColsAtCompileTime = Dynamic,
+ Flags = SparseBit | _Flags,
+ CoeffReadCost = NumTraits<Scalar>::ReadCost,
+ SupportedAccessPatterns = RandomAccessPattern
+ };
+};
+
+// TODO reimplement this class using custom linked lists
+template<typename _Scalar, int _Flags>
+class HashMatrix
+ : public SparseMatrixBase<HashMatrix<_Scalar, _Flags> >
+{
+ public:
+ EIGEN_GENERIC_PUBLIC_INTERFACE(HashMatrix)
+ class InnerIterator;
+ protected:
+
+ typedef typename std::map<int, Scalar>::iterator MapIterator;
+ typedef typename std::map<int, Scalar>::const_iterator ConstMapIterator;
+
+ public:
+ inline int rows() const { return m_innerSize; }
+ inline int cols() const { return m_data.size(); }
+
+ inline const Scalar& coeff(int row, int col) const
+ {
+ const MapIterator it = m_data[col].find(row);
+ if (it!=m_data[col].end())
+ return Scalar(0);
+ return it->second;
+ }
+
+ inline Scalar& coeffRef(int row, int col)
+ {
+ return m_data[col][row];
+ }
+
+ public:
+
+ inline void startFill(int /*reserveSize = 1000 --- currently unused, don't generate a warning*/) {}
+
+ inline Scalar& fill(int row, int col) { return coeffRef(row, col); }
+
+ inline void endFill() {}
+
+ ~HashMatrix()
+ {}
+
+ inline void shallowCopy(const HashMatrix& other)
+ {
+ EIGEN_DBG_SPARSE(std::cout << "HashMatrix:: shallowCopy\n");
+ // FIXME implement a true shallow copy !!
+ resize(other.rows(), other.cols());
+ for (int j=0; j<this->outerSize(); ++j)
+ m_data[j] = other.m_data[j];
+ }
+
+ void resize(int _rows, int _cols)
+ {
+ if (cols() != _cols)
+ {
+ m_data.resize(_cols);
+ }
+ m_innerSize = _rows;
+ }
+
+ inline HashMatrix(int rows, int cols)
+ : m_innerSize(0)
+ {
+ resize(rows, cols);
+ }
+
+ template<typename OtherDerived>
+ inline HashMatrix(const MatrixBase<OtherDerived>& other)
+ : m_innerSize(0)
+ {
+ *this = other.derived();
+ }
+
+ inline HashMatrix& operator=(const HashMatrix& other)
+ {
+ if (other.isRValue())
+ {
+ shallowCopy(other);
+ }
+ else
+ {
+ resize(other.rows(), other.cols());
+ for (int col=0; col<cols(); ++col)
+ m_data[col] = other.m_data[col];
+ }
+ return *this;
+ }
+
+ template<typename OtherDerived>
+ inline HashMatrix& operator=(const MatrixBase<OtherDerived>& other)
+ {
+ return SparseMatrixBase<HashMatrix>::operator=(other);
+ }
+
+ protected:
+
+ std::vector<std::map<int, Scalar> > m_data;
+ int m_innerSize;
+
+};
+
+template<typename Scalar, int _Flags>
+class HashMatrix<Scalar,_Flags>::InnerIterator
+{
+ public:
+
+ InnerIterator(const HashMatrix& mat, int col)
+ : m_matrix(mat), m_it(mat.m_data[col].begin()), m_end(mat.m_data[col].end())
+ {}
+
+ InnerIterator& operator++() { m_it++; return *this; }
+
+ Scalar value() { return m_it->second; }
+
+ int index() const { return m_it->first; }
+
+ operator bool() const { return m_it!=m_end; }
+
+ protected:
+ const HashMatrix& m_matrix;
+ typename HashMatrix::ConstMapIterator m_it;
+ typename HashMatrix::ConstMapIterator m_end;
+};
+
+#endif // EIGEN_HASHMATRIX_H