12b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// This file is part of Eigen, a lightweight C++ template library
22b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// for linear algebra.
32b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang//
42b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Copyright (C) 2015 Gael Guennebaud <gael.guennebaud@inria.fr>
52b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang//
62b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// This Source Code Form is subject to the terms of the Mozilla
72b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Public License v. 2.0. If a copy of the MPL was not distributed
82b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
92b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#ifndef EIGEN_SPARSE_MAP_H
112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#define EIGEN_SPARSE_MAP_H
122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangnamespace Eigen {
142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangnamespace internal {
162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename MatScalar, int MatOptions, typename MatIndex, int Options, typename StrideType>
182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct traits<Map<SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType> >
192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  : public traits<SparseMatrix<MatScalar,MatOptions,MatIndex> >
202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef SparseMatrix<MatScalar,MatOptions,MatIndex> PlainObjectType;
222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef traits<PlainObjectType> TraitsBase;
232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  enum {
242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Flags = TraitsBase::Flags & (~NestByRefBit)
252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  };
262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename MatScalar, int MatOptions, typename MatIndex, int Options, typename StrideType>
292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct traits<Map<const SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType> >
302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  : public traits<SparseMatrix<MatScalar,MatOptions,MatIndex> >
312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef SparseMatrix<MatScalar,MatOptions,MatIndex> PlainObjectType;
332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef traits<PlainObjectType> TraitsBase;
342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  enum {
352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Flags = TraitsBase::Flags & (~ (NestByRefBit | LvalueBit))
362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  };
372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} // end namespace internal
402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Derived,
422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang         int Level = internal::accessors_level<Derived>::has_write_access ? WriteAccessors : ReadOnlyAccessors
432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang> class SparseMapBase;
442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/** \ingroup SparseCore_Module
462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * class SparseMapBase
472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * \brief Common base class for Map and Ref instance of sparse matrix and vector.
482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  */
492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Derived>
502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangclass SparseMapBase<Derived,ReadOnlyAccessors>
512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  : public SparseCompressedBase<Derived>
522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  public:
542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef SparseCompressedBase<Derived> Base;
552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef typename Base::Scalar Scalar;
562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef typename Base::StorageIndex StorageIndex;
572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    enum { IsRowMajor = Base::IsRowMajor };
582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    using Base::operator=;
592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  protected:
602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef typename internal::conditional<
622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                         bool(internal::is_lvalue<Derived>::value),
632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                         Scalar *, const Scalar *>::type ScalarPointer;
642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef typename internal::conditional<
652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                         bool(internal::is_lvalue<Derived>::value),
662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                         StorageIndex *, const StorageIndex *>::type IndexPointer;
672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Index   m_outerSize;
692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Index   m_innerSize;
702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Array<StorageIndex,2,1>  m_zero_nnz;
712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    IndexPointer  m_outerIndex;
722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    IndexPointer  m_innerIndices;
732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    ScalarPointer m_values;
742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    IndexPointer  m_innerNonZeros;
752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  public:
772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    /** \copydoc SparseMatrixBase::rows() */
792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline Index rows() const { return IsRowMajor ? m_outerSize : m_innerSize; }
802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    /** \copydoc SparseMatrixBase::cols() */
812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline Index cols() const { return IsRowMajor ? m_innerSize : m_outerSize; }
822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    /** \copydoc SparseMatrixBase::innerSize() */
832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline Index innerSize() const { return m_innerSize; }
842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    /** \copydoc SparseMatrixBase::outerSize() */
852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline Index outerSize() const { return m_outerSize; }
862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    /** \copydoc SparseCompressedBase::nonZeros */
872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline Index nonZeros() const { return m_zero_nnz[1]; }
882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    /** \copydoc SparseCompressedBase::isCompressed */
902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    bool isCompressed() const { return m_innerNonZeros==0; }
912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    //----------------------------------------
932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // direct access interface
942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    /** \copydoc SparseMatrix::valuePtr */
952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline const Scalar* valuePtr() const { return m_values; }
962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    /** \copydoc SparseMatrix::innerIndexPtr */
972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline const StorageIndex* innerIndexPtr() const { return m_innerIndices; }
982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    /** \copydoc SparseMatrix::outerIndexPtr */
992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline const StorageIndex* outerIndexPtr() const { return m_outerIndex; }
1002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    /** \copydoc SparseMatrix::innerNonZeroPtr */
1012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline const StorageIndex* innerNonZeroPtr() const { return m_innerNonZeros; }
1022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    //----------------------------------------
1032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    /** \copydoc SparseMatrix::coeff */
1052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline Scalar coeff(Index row, Index col) const
1062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    {
1072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      const Index outer = IsRowMajor ? row : col;
1082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      const Index inner = IsRowMajor ? col : row;
1092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      Index start = m_outerIndex[outer];
1112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      Index end = isCompressed() ? m_outerIndex[outer+1] : start + m_innerNonZeros[outer];
1122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      if (start==end)
1132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        return Scalar(0);
1142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      else if (end>0 && inner==m_innerIndices[end-1])
1152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        return m_values[end-1];
1162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      // ^^  optimization: let's first check if it is the last coefficient
1172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      // (very common in high level algorithms)
1182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      const StorageIndex* r = std::lower_bound(&m_innerIndices[start],&m_innerIndices[end-1],inner);
1202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      const Index id = r-&m_innerIndices[0];
1212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return ((*r==inner) && (id<end)) ? m_values[id] : Scalar(0);
1222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
1232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline SparseMapBase(Index rows, Index cols, Index nnz, IndexPointer outerIndexPtr, IndexPointer innerIndexPtr,
1252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                              ScalarPointer valuePtr, IndexPointer innerNonZerosPtr = 0)
1262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      : m_outerSize(IsRowMajor?rows:cols), m_innerSize(IsRowMajor?cols:rows), m_zero_nnz(0,internal::convert_index<StorageIndex>(nnz)), m_outerIndex(outerIndexPtr),
1272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        m_innerIndices(innerIndexPtr), m_values(valuePtr), m_innerNonZeros(innerNonZerosPtr)
1282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    {}
1292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // for vectors
1312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline SparseMapBase(Index size, Index nnz, IndexPointer innerIndexPtr, ScalarPointer valuePtr)
1322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      : m_outerSize(1), m_innerSize(size), m_zero_nnz(0,internal::convert_index<StorageIndex>(nnz)), m_outerIndex(m_zero_nnz.data()),
1332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        m_innerIndices(innerIndexPtr), m_values(valuePtr), m_innerNonZeros(0)
1342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    {}
1352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    /** Empty destructor */
1372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline ~SparseMapBase() {}
1382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  protected:
1402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline SparseMapBase() {}
1412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
1422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/** \ingroup SparseCore_Module
1442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * class SparseMapBase
1452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * \brief Common base class for writable Map and Ref instance of sparse matrix and vector.
1462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  */
1472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Derived>
1482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangclass SparseMapBase<Derived,WriteAccessors>
1492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  : public SparseMapBase<Derived,ReadOnlyAccessors>
1502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
1512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef MapBase<Derived, ReadOnlyAccessors> ReadOnlyMapBase;
1522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  public:
1542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef SparseMapBase<Derived, ReadOnlyAccessors> Base;
1552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef typename Base::Scalar Scalar;
1562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef typename Base::StorageIndex StorageIndex;
1572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    enum { IsRowMajor = Base::IsRowMajor };
1582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    using Base::operator=;
1602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  public:
1622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    //----------------------------------------
1642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // direct access interface
1652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    using Base::valuePtr;
1662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    using Base::innerIndexPtr;
1672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    using Base::outerIndexPtr;
1682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    using Base::innerNonZeroPtr;
1692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    /** \copydoc SparseMatrix::valuePtr */
1702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline Scalar* valuePtr()              { return Base::m_values; }
1712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    /** \copydoc SparseMatrix::innerIndexPtr */
1722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline StorageIndex* innerIndexPtr()   { return Base::m_innerIndices; }
1732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    /** \copydoc SparseMatrix::outerIndexPtr */
1742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline StorageIndex* outerIndexPtr()   { return Base::m_outerIndex; }
1752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    /** \copydoc SparseMatrix::innerNonZeroPtr */
1762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline StorageIndex* innerNonZeroPtr() { return Base::m_innerNonZeros; }
1772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    //----------------------------------------
1782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    /** \copydoc SparseMatrix::coeffRef */
1802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline Scalar& coeffRef(Index row, Index col)
1812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    {
1822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      const Index outer = IsRowMajor ? row : col;
1832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      const Index inner = IsRowMajor ? col : row;
1842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      Index start = Base::m_outerIndex[outer];
1862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      Index end = Base::isCompressed() ? Base::m_outerIndex[outer+1] : start + Base::m_innerNonZeros[outer];
1872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      eigen_assert(end>=start && "you probably called coeffRef on a non finalized matrix");
1882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      eigen_assert(end>start && "coeffRef cannot be called on a zero coefficient");
1892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      StorageIndex* r = std::lower_bound(&Base::m_innerIndices[start],&Base::m_innerIndices[end],inner);
1902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      const Index id = r - &Base::m_innerIndices[0];
1912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      eigen_assert((*r==inner) && (id<end) && "coeffRef cannot be called on a zero coefficient");
1922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return const_cast<Scalar*>(Base::m_values)[id];
1932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
1942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline SparseMapBase(Index rows, Index cols, Index nnz, StorageIndex* outerIndexPtr, StorageIndex* innerIndexPtr,
1962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                         Scalar* valuePtr, StorageIndex* innerNonZerosPtr = 0)
1972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      : Base(rows, cols, nnz, outerIndexPtr, innerIndexPtr, valuePtr, innerNonZerosPtr)
1982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    {}
1992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // for vectors
2012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline SparseMapBase(Index size, Index nnz, StorageIndex* innerIndexPtr, Scalar* valuePtr)
2022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      : Base(size, nnz, innerIndexPtr, valuePtr)
2032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    {}
2042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    /** Empty destructor */
2062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline ~SparseMapBase() {}
2072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  protected:
2092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline SparseMapBase() {}
2102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
2112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/** \ingroup SparseCore_Module
2132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  *
2142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * \brief Specialization of class Map for SparseMatrix-like storage.
2152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  *
2162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * \tparam SparseMatrixType the equivalent sparse matrix type of the referenced data, it must be a template instance of class SparseMatrix.
2172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  *
2182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * \sa class Map, class SparseMatrix, class Ref<SparseMatrixType,Options>
2192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  */
2202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#ifndef EIGEN_PARSED_BY_DOXYGEN
2212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename MatScalar, int MatOptions, typename MatIndex, int Options, typename StrideType>
2222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangclass Map<SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType>
2232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  : public SparseMapBase<Map<SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType> >
2242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#else
2252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename SparseMatrixType>
2262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangclass Map<SparseMatrixType>
2272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  : public SparseMapBase<Derived,WriteAccessors>
2282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#endif
2292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
2302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  public:
2312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef SparseMapBase<Map> Base;
2322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_SPARSE_PUBLIC_INTERFACE(Map)
2332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    enum { IsRowMajor = Base::IsRowMajor };
2342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  public:
2362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    /** Constructs a read-write Map to a sparse matrix of size \a rows x \a cols, containing \a nnz non-zero coefficients,
2382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      * stored as a sparse format as defined by the pointers \a outerIndexPtr, \a innerIndexPtr, and \a valuePtr.
2392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      * If the optional parameter \a innerNonZerosPtr is the null pointer, then a standard compressed format is assumed.
2402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      *
2412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      * This constructor is available only if \c SparseMatrixType is non-const.
2422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      *
2432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      * More details on the expected storage schemes are given in the \ref TutorialSparse "manual pages".
2442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      */
2452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline Map(Index rows, Index cols, Index nnz, StorageIndex* outerIndexPtr,
2462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang               StorageIndex* innerIndexPtr, Scalar* valuePtr, StorageIndex* innerNonZerosPtr = 0)
2472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      : Base(rows, cols, nnz, outerIndexPtr, innerIndexPtr, valuePtr, innerNonZerosPtr)
2482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    {}
2492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#ifndef EIGEN_PARSED_BY_DOXYGEN
2502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    /** Empty destructor */
2512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline ~Map() {}
2522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
2532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename MatScalar, int MatOptions, typename MatIndex, int Options, typename StrideType>
2552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangclass Map<const SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType>
2562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  : public SparseMapBase<Map<const SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType> >
2572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
2582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  public:
2592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef SparseMapBase<Map> Base;
2602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_SPARSE_PUBLIC_INTERFACE(Map)
2612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    enum { IsRowMajor = Base::IsRowMajor };
2622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  public:
2642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#endif
2652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    /** This is the const version of the above constructor.
2662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      *
2672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      * This constructor is available only if \c SparseMatrixType is const, e.g.:
2682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      * \code Map<const SparseMatrix<double> >  \endcode
2692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      */
2702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline Map(Index rows, Index cols, Index nnz, const StorageIndex* outerIndexPtr,
2712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang               const StorageIndex* innerIndexPtr, const Scalar* valuePtr, const StorageIndex* innerNonZerosPtr = 0)
2722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      : Base(rows, cols, nnz, outerIndexPtr, innerIndexPtr, valuePtr, innerNonZerosPtr)
2732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    {}
2742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    /** Empty destructor */
2762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline ~Map() {}
2772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
2782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangnamespace internal {
2802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename MatScalar, int MatOptions, typename MatIndex, int Options, typename StrideType>
2822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct evaluator<Map<SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType> >
2832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  : evaluator<SparseCompressedBase<Map<SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType> > >
2842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
2852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef evaluator<SparseCompressedBase<Map<SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType> > > Base;
2862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef Map<SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType> XprType;
2872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  evaluator() : Base() {}
2882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  explicit evaluator(const XprType &mat) : Base(mat) {}
2892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
2902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename MatScalar, int MatOptions, typename MatIndex, int Options, typename StrideType>
2922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct evaluator<Map<const SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType> >
2932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  : evaluator<SparseCompressedBase<Map<const SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType> > >
2942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
2952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef evaluator<SparseCompressedBase<Map<const SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType> > > Base;
2962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef Map<const SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType> XprType;
2972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  evaluator() : Base() {}
2982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  explicit evaluator(const XprType &mat) : Base(mat) {}
2992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
3002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
3012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}
3022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
3032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} // end namespace Eigen
3042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
3052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#endif // EIGEN_SPARSE_MAP_H
306