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