SparseVector.h revision 7faaa9f3f0df9d23790277834d426c3d992ac3ba
1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library 2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra. 3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr> 5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla 7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed 8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_SPARSEVECTOR_H 11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_SPARSEVECTOR_H 12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen { 14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \ingroup SparseCore_Module 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \class SparseVector 17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief a sparse vector class 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \tparam _Scalar the scalar type, i.e. the type of the coefficients 21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * See http://www.netlib.org/linalg/html_templates/node91.html for details on the storage scheme. 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * This class can be extended with the help of the plugin mechanism described on the page 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \ref TopicCustomizingEigen by defining the preprocessor symbol \c EIGEN_SPARSEVECTOR_PLUGIN. 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal { 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename _Scalar, int _Options, typename _Index> 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct traits<SparseVector<_Scalar, _Options, _Index> > 31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef _Scalar Scalar; 33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef _Index Index; 34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Sparse StorageKind; 35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef MatrixXpr XprKind; 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath IsColVector = (_Options & RowMajorBit) ? 0 : 1, 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath RowsAtCompileTime = IsColVector ? Dynamic : 1, 40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ColsAtCompileTime = IsColVector ? 1 : Dynamic, 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MaxRowsAtCompileTime = RowsAtCompileTime, 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MaxColsAtCompileTime = ColsAtCompileTime, 43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Flags = _Options | NestByRefBit | LvalueBit | (IsColVector ? 0 : RowMajorBit), 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CoeffReadCost = NumTraits<Scalar>::ReadCost, 45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SupportedAccessPatterns = InnerRandomAccessPattern 46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 487faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 497faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez// Sparse-Vector-Assignment kinds: 507faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezenum { 517faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez SVA_RuntimeSwitch, 527faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez SVA_Inner, 537faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez SVA_Outer 547faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez}; 557faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 567faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandeztemplate< typename Dest, typename Src, 577faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez int AssignmentKind = !bool(Src::IsVectorAtCompileTime) ? SVA_RuntimeSwitch 587faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez : Src::InnerSizeAtCompileTime==1 ? SVA_Outer 597faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez : SVA_Inner> 607faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezstruct sparse_vector_assign_selector; 617faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename _Scalar, int _Options, typename _Index> 65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass SparseVector 66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : public SparseMatrixBase<SparseVector<_Scalar, _Options, _Index> > 67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 687faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez typedef SparseMatrixBase<SparseVector> SparseBase; 697faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public: 71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_SPARSE_PUBLIC_INTERFACE(SparseVector) 72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(SparseVector, +=) 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(SparseVector, -=) 747faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 757faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez typedef internal::CompressedStorage<Scalar,Index> Storage; 76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { IsColVector = internal::traits<SparseVector>::IsColVector }; 77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Options = _Options 80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 817faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE Index rows() const { return IsColVector ? m_size : 1; } 83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE Index cols() const { return IsColVector ? 1 : m_size; } 84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE Index innerSize() const { return m_size; } 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE Index outerSize() const { return 1; } 86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Scalar* valuePtr() const { return &m_data.value(0); } 88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE Scalar* valuePtr() { return &m_data.value(0); } 89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Index* innerIndexPtr() const { return &m_data.index(0); } 91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE Index* innerIndexPtr() { return &m_data.index(0); } 927faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 937faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez /** \internal */ 947faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez inline Storage& data() { return m_data; } 957faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez /** \internal */ 967faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez inline const Storage& data() const { return m_data; } 97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Scalar coeff(Index row, Index col) const 99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 1007faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez eigen_assert(IsColVector ? (col==0 && row>=0 && row<m_size) : (row==0 && col>=0 && col<m_size)); 101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return coeff(IsColVector ? row : col); 102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 1037faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez inline Scalar coeff(Index i) const 1047faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez { 1057faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez eigen_assert(i>=0 && i<m_size); 1067faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez return m_data.at(i); 1077faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez } 108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Scalar& coeffRef(Index row, Index col) 110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 1117faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez eigen_assert(IsColVector ? (col==0 && row>=0 && row<m_size) : (row==0 && col>=0 && col<m_size)); 112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return coeff(IsColVector ? row : col); 113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns a reference to the coefficient value at given index \a i 116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * This operation involes a log(rho*size) binary search. If the coefficient does not 117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * exist yet, then a sorted insertion into a sequential buffer is performed. 118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * This insertion might be very costly if the number of nonzeros above \a i is large. 120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Scalar& coeffRef(Index i) 122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 1237faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez eigen_assert(i>=0 && i<m_size); 124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return m_data.atWithInsertion(i); 125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public: 128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath class InnerIterator; 130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath class ReverseInnerIterator; 131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline void setZero() { m_data.clear(); } 133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the number of non zero coefficients */ 135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index nonZeros() const { return static_cast<Index>(m_data.size()); } 136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline void startVec(Index outer) 138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_UNUSED_VARIABLE(outer); 140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_assert(outer==0); 141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Scalar& insertBackByOuterInner(Index outer, Index inner) 144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_UNUSED_VARIABLE(outer); 146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_assert(outer==0); 147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return insertBack(inner); 148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Scalar& insertBack(Index i) 150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_data.append(0, i); 152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return m_data.value(m_data.size()-1); 153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Scalar& insert(Index row, Index col) 156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 1577faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez eigen_assert(IsColVector ? (col==0 && row>=0 && row<m_size) : (row==0 && col>=0 && col<m_size)); 1587faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Index inner = IsColVector ? row : col; 160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Index outer = IsColVector ? col : row; 161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_assert(outer==0); 162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return insert(inner); 163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar& insert(Index i) 165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 1667faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez eigen_assert(i>=0 && i<m_size); 1677faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Index startId = 0; 169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Index p = Index(m_data.size()) - 1; 170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // TODO smart realloc 171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_data.resize(p+2,1); 172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath while ( (p >= startId) && (m_data.index(p) > i) ) 174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_data.index(p+1) = m_data.index(p); 176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_data.value(p+1) = m_data.value(p); 177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath --p; 178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_data.index(p+1) = i; 180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_data.value(p+1) = 0; 181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return m_data.value(p+1); 182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** 185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline void reserve(Index reserveSize) { m_data.reserve(reserveSize); } 187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline void finalize() {} 190c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 1917faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez void prune(const Scalar& reference, const RealScalar& epsilon = NumTraits<RealScalar>::dummy_precision()) 192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_data.prune(reference,epsilon); 194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void resize(Index rows, Index cols) 197c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 198c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_assert(rows==1 || cols==1); 199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath resize(IsColVector ? rows : cols); 200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void resize(Index newSize) 203c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_size = newSize; 205c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_data.clear(); 206c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 207c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 208c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void resizeNonZeros(Index size) { m_data.resize(size); } 209c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 2107faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez inline SparseVector() : m_size(0) { check_template_parameters(); resize(0); } 211c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 2127faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez inline SparseVector(Index size) : m_size(0) { check_template_parameters(); resize(size); } 213c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 2147faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez inline SparseVector(Index rows, Index cols) : m_size(0) { check_template_parameters(); resize(rows,cols); } 215c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 216c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerived> 217c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline SparseVector(const SparseMatrixBase<OtherDerived>& other) 218c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : m_size(0) 219c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 2207faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez check_template_parameters(); 221c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath *this = other.derived(); 222c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 223c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 224c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline SparseVector(const SparseVector& other) 2257faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez : SparseBase(other), m_size(0) 226c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 2277faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez check_template_parameters(); 228c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath *this = other.derived(); 229c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 230c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 2317faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez /** Swaps the values of \c *this and \a other. 2327faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez * Overloaded for performance: this version performs a \em shallow swap by swaping pointers and attributes only. 2337faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez * \sa SparseMatrixBase::swap() 2347faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez */ 235c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline void swap(SparseVector& other) 236c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 237c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::swap(m_size, other.m_size); 238c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_data.swap(other.m_data); 239c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 240c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 241c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline SparseVector& operator=(const SparseVector& other) 242c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 243c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (other.isRValue()) 244c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 245c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath swap(other.const_cast_derived()); 246c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 247c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else 248c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 249c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath resize(other.size()); 250c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_data = other.m_data; 251c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 252c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return *this; 253c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 254c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 255c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerived> 256c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline SparseVector& operator=(const SparseMatrixBase<OtherDerived>& other) 257c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 2587faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez SparseVector tmp(other.size()); 2597faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez internal::sparse_vector_assign_selector<SparseVector,OtherDerived>::run(tmp,other.derived()); 2607faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez this->swap(tmp); 2617faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez return *this; 262c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 263c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 264c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath #ifndef EIGEN_PARSED_BY_DOXYGEN 265c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Lhs, typename Rhs> 266c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline SparseVector& operator=(const SparseSparseProduct<Lhs,Rhs>& product) 267c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 268c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return Base::operator=(product); 269c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 270c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath #endif 271c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 272c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath friend std::ostream & operator << (std::ostream & s, const SparseVector& m) 273c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 274c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (Index i=0; i<m.nonZeros(); ++i) 275c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath s << "(" << m.m_data.value(i) << "," << m.m_data.index(i) << ") "; 276c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath s << std::endl; 277c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return s; 278c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 279c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 280c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** Destructor */ 281c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline ~SparseVector() {} 282c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 283c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** Overloaded for performance */ 284c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar sum() const; 285c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 286c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public: 287c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 2887faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez /** \internal \deprecated use setZero() and reserve() */ 289c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_DEPRECATED void startFill(Index reserve) 290c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 291c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath setZero(); 292c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_data.reserve(reserve); 293c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 294c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 2957faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez /** \internal \deprecated use insertBack(Index,Index) */ 296c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_DEPRECATED Scalar& fill(Index r, Index c) 297c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 298c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_assert(r==0 || c==0); 299c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return fill(IsColVector ? r : c); 300c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 301c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 3027faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez /** \internal \deprecated use insertBack(Index) */ 303c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_DEPRECATED Scalar& fill(Index i) 304c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 305c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_data.append(0, i); 306c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return m_data.value(m_data.size()-1); 307c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 308c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 3097faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez /** \internal \deprecated use insert(Index,Index) */ 310c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_DEPRECATED Scalar& fillrand(Index r, Index c) 311c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 312c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_assert(r==0 || c==0); 313c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return fillrand(IsColVector ? r : c); 314c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 315c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 3167faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez /** \internal \deprecated use insert(Index) */ 317c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_DEPRECATED Scalar& fillrand(Index i) 318c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 319c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return insert(i); 320c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 321c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 3227faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez /** \internal \deprecated use finalize() */ 323c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_DEPRECATED void endFill() {} 324c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 3257faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez // These two functions were here in the 3.1 release, so let's keep them in case some code rely on them. 3267faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez /** \internal \deprecated use data() */ 3277faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez EIGEN_DEPRECATED Storage& _data() { return m_data; } 3287faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez /** \internal \deprecated use data() */ 3297faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez EIGEN_DEPRECATED const Storage& _data() const { return m_data; } 3307faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 331c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath# ifdef EIGEN_SPARSEVECTOR_PLUGIN 332c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath# include EIGEN_SPARSEVECTOR_PLUGIN 333c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath# endif 334c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 335c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathprotected: 3367faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 3377faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez static void check_template_parameters() 338c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 3397faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez EIGEN_STATIC_ASSERT(NumTraits<Index>::IsSigned,THE_INDEX_TYPE_MUST_BE_A_SIGNED_TYPE); 3407faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez EIGEN_STATIC_ASSERT((_Options&(ColMajor|RowMajor))==Options,INVALID_MATRIX_TEMPLATE_PARAMETERS); 341c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 3427faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 3437faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Storage m_data; 3447faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Index m_size; 345c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 346c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 347c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar, int _Options, typename _Index> 348c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass SparseVector<Scalar,_Options,_Index>::InnerIterator 349c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 350c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public: 351c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath InnerIterator(const SparseVector& vec, Index outer=0) 352c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : m_data(vec.m_data), m_id(0), m_end(static_cast<Index>(m_data.size())) 353c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 354c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_UNUSED_VARIABLE(outer); 355c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_assert(outer==0); 356c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 357c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 358c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath InnerIterator(const internal::CompressedStorage<Scalar,Index>& data) 359c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : m_data(data), m_id(0), m_end(static_cast<Index>(m_data.size())) 360c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath {} 361c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 362c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline InnerIterator& operator++() { m_id++; return *this; } 363c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 364c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Scalar value() const { return m_data.value(m_id); } 365c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Scalar& valueRef() { return const_cast<Scalar&>(m_data.value(m_id)); } 366c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 367c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index index() const { return m_data.index(m_id); } 368c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index row() const { return IsColVector ? index() : 0; } 369c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index col() const { return IsColVector ? 0 : index(); } 370c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 371c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline operator bool() const { return (m_id < m_end); } 372c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 373c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath protected: 374c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const internal::CompressedStorage<Scalar,Index>& m_data; 375c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Index m_id; 376c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Index m_end; 377c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 378c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 379c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar, int _Options, typename _Index> 380c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass SparseVector<Scalar,_Options,_Index>::ReverseInnerIterator 381c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 382c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public: 383c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ReverseInnerIterator(const SparseVector& vec, Index outer=0) 384c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : m_data(vec.m_data), m_id(static_cast<Index>(m_data.size())), m_start(0) 385c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 386c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_UNUSED_VARIABLE(outer); 387c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_assert(outer==0); 388c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 389c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 390c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ReverseInnerIterator(const internal::CompressedStorage<Scalar,Index>& data) 391c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : m_data(data), m_id(static_cast<Index>(m_data.size())), m_start(0) 392c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath {} 393c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 394c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline ReverseInnerIterator& operator--() { m_id--; return *this; } 395c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 396c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Scalar value() const { return m_data.value(m_id-1); } 397c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Scalar& valueRef() { return const_cast<Scalar&>(m_data.value(m_id-1)); } 398c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 399c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index index() const { return m_data.index(m_id-1); } 400c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index row() const { return IsColVector ? index() : 0; } 401c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index col() const { return IsColVector ? 0 : index(); } 402c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 403c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline operator bool() const { return (m_id > m_start); } 404c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 405c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath protected: 406c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const internal::CompressedStorage<Scalar,Index>& m_data; 407c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Index m_id; 408c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Index m_start; 409c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 410c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 4117faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandeznamespace internal { 4127faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 4137faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandeztemplate< typename Dest, typename Src> 4147faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezstruct sparse_vector_assign_selector<Dest,Src,SVA_Inner> { 4157faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez static void run(Dest& dst, const Src& src) { 4167faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez eigen_internal_assert(src.innerSize()==src.size()); 4177faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez for(typename Src::InnerIterator it(src, 0); it; ++it) 4187faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez dst.insert(it.index()) = it.value(); 4197faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez } 4207faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez}; 4217faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 4227faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandeztemplate< typename Dest, typename Src> 4237faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezstruct sparse_vector_assign_selector<Dest,Src,SVA_Outer> { 4247faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez static void run(Dest& dst, const Src& src) { 4257faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez eigen_internal_assert(src.outerSize()==src.size()); 4267faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez for(typename Dest::Index i=0; i<src.size(); ++i) 4277faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez { 4287faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez typename Src::InnerIterator it(src, i); 4297faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if(it) 4307faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez dst.insert(i) = it.value(); 4317faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez } 4327faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez } 4337faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez}; 4347faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 4357faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandeztemplate< typename Dest, typename Src> 4367faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezstruct sparse_vector_assign_selector<Dest,Src,SVA_RuntimeSwitch> { 4377faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez static void run(Dest& dst, const Src& src) { 4387faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if(src.outerSize()==1) sparse_vector_assign_selector<Dest,Src,SVA_Inner>::run(dst, src); 4397faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez else sparse_vector_assign_selector<Dest,Src,SVA_Outer>::run(dst, src); 4407faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez } 4417faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez}; 4427faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 4437faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez} 4447faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 445c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen 446c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 447c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_SPARSEVECTOR_H 448