1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library 2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra. 3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2011 Gael Guennebaud <gael.guennebaud@inria.fr> 5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2010 Daniel Lowengrub <lowdanie@gmail.com> 6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla 8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed 9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_SPARSEVIEW_H 12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_SPARSEVIEW_H 13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen { 15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal { 17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct traits<SparseView<MatrixType> > : traits<MatrixType> 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 217faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez typedef typename MatrixType::Index Index; 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Sparse StorageKind; 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Flags = int(traits<MatrixType>::Flags) & (RowMajorBit) 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace internal 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> 31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass SparseView : public SparseMatrixBase<SparseView<MatrixType> > 32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename MatrixType::Nested MatrixTypeNested; 34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::remove_all<MatrixTypeNested>::type _MatrixTypeNested; 35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathpublic: 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_SPARSE_PUBLIC_INTERFACE(SparseView) 37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SparseView(const MatrixType& mat, const Scalar& m_reference = Scalar(0), 39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typename NumTraits<Scalar>::Real m_epsilon = NumTraits<Scalar>::dummy_precision()) : 40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_matrix(mat), m_reference(m_reference), m_epsilon(m_epsilon) {} 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath class InnerIterator; 43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index rows() const { return m_matrix.rows(); } 45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index cols() const { return m_matrix.cols(); } 46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index innerSize() const { return m_matrix.innerSize(); } 48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index outerSize() const { return m_matrix.outerSize(); } 49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathprotected: 51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MatrixTypeNested m_matrix; 52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar m_reference; 53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typename NumTraits<Scalar>::Real m_epsilon; 54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> 57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass SparseView<MatrixType>::InnerIterator : public _MatrixTypeNested::InnerIterator 58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 597faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez typedef typename SparseView::Index Index; 60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathpublic: 61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename _MatrixTypeNested::InnerIterator IterBase; 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath InnerIterator(const SparseView& view, Index outer) : 63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath IterBase(view.m_matrix, outer), m_view(view) 64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath incrementToNonZero(); 66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE InnerIterator& operator++() 69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath IterBase::operator++(); 71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath incrementToNonZero(); 72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return *this; 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using IterBase::value; 76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathprotected: 78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const SparseView& m_view; 79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathprivate: 81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void incrementToNonZero() 82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath while((bool(*this)) && internal::isMuchSmallerThan(value(), m_view.m_reference, m_view.m_epsilon)) 84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath IterBase::operator++(); 86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst SparseView<Derived> MatrixBase<Derived>::sparseView(const Scalar& m_reference, 927faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez const typename NumTraits<Scalar>::Real& m_epsilon) const 93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return SparseView<Derived>(derived(), m_reference, m_epsilon); 95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen 98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif 100