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