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