SparseView.h
Go to the documentation of this file.
1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra.
3 //
4 // Copyright (C) 2011-2014 Gael Guennebaud <gael.guennebaud@inria.fr>
5 // Copyright (C) 2010 Daniel Lowengrub <lowdanie@gmail.com>
6 //
7 // This Source Code Form is subject to the terms of the Mozilla
8 // Public License v. 2.0. If a copy of the MPL was not distributed
9 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
10 
11 #ifndef EIGEN_SPARSEVIEW_H
12 #define EIGEN_SPARSEVIEW_H
13 
14 namespace Eigen {
15 
16 namespace internal {
17 
18 template<typename MatrixType>
19 struct traits<SparseView<MatrixType> > : traits<MatrixType>
20 {
21  typedef typename MatrixType::StorageIndex StorageIndex;
23  enum {
25  };
26 };
27 
28 } // end namespace internal
29 
44 template<typename MatrixType>
45 class SparseView : public SparseMatrixBase<SparseView<MatrixType> >
46 {
47  typedef typename MatrixType::Nested MatrixTypeNested;
50 public:
52  typedef typename internal::remove_all<MatrixType>::type NestedExpression;
53 
54  explicit SparseView(const MatrixType& mat, const Scalar& reference = Scalar(0),
55  const RealScalar &epsilon = NumTraits<Scalar>::dummy_precision())
56  : m_matrix(mat), m_reference(reference), m_epsilon(epsilon) {}
57 
58  inline Index rows() const { return m_matrix.rows(); }
59  inline Index cols() const { return m_matrix.cols(); }
60 
61  inline Index innerSize() const { return m_matrix.innerSize(); }
62  inline Index outerSize() const { return m_matrix.outerSize(); }
63 
66  nestedExpression() const { return m_matrix; }
67 
68  Scalar reference() const { return m_reference; }
69  RealScalar epsilon() const { return m_epsilon; }
70 
71 protected:
72  MatrixTypeNested m_matrix;
75 };
76 
77 namespace internal {
78 
79 // TODO find a way to unify the two following variants
80 // This is tricky because implementing an inner iterator on top of an IndexBased evaluator is
81 // not easy because the evaluators do not expose the sizes of the underlying expression.
82 
83 template<typename ArgType>
85  : public evaluator_base<SparseView<ArgType> >
86 {
88  public:
90 
91  class InnerIterator : public EvalIterator
92  {
93  typedef typename XprType::Scalar Scalar;
94  public:
95 
97  : EvalIterator(sve.m_argImpl,outer), m_view(sve.m_view)
98  {
99  incrementToNonZero();
100  }
101 
103  {
104  EvalIterator::operator++();
105  incrementToNonZero();
106  return *this;
107  }
108 
109  using EvalIterator::value;
110 
111  protected:
112  const XprType &m_view;
113 
114  private:
116  {
117  while((bool(*this)) && internal::isMuchSmallerThan(value(), m_view.reference(), m_view.epsilon()))
118  {
119  EvalIterator::operator++();
120  }
121  }
122  };
123 
124  enum {
126  Flags = XprType::Flags
127  };
128 
129  explicit unary_evaluator(const XprType& xpr) : m_argImpl(xpr.nestedExpression()), m_view(xpr) {}
130 
131  protected:
133  const XprType &m_view;
134 };
135 
136 template<typename ArgType>
138  : public evaluator_base<SparseView<ArgType> >
139 {
140  public:
142  protected:
143  enum { IsRowMajor = (XprType::Flags&RowMajorBit)==RowMajorBit };
144  typedef typename XprType::Scalar Scalar;
146  public:
147 
149  {
150  public:
151 
153  : m_sve(sve), m_inner(0), m_outer(outer), m_end(sve.m_view.innerSize())
154  {
155  incrementToNonZero();
156  }
157 
159  {
160  m_inner++;
161  incrementToNonZero();
162  return *this;
163  }
164 
165  EIGEN_STRONG_INLINE Scalar value() const
166  {
167  return (IsRowMajor) ? m_sve.m_argImpl.coeff(m_outer, m_inner)
168  : m_sve.m_argImpl.coeff(m_inner, m_outer);
169  }
170 
171  EIGEN_STRONG_INLINE StorageIndex index() const { return m_inner; }
172  inline Index row() const { return IsRowMajor ? m_outer : index(); }
173  inline Index col() const { return IsRowMajor ? index() : m_outer; }
174 
175  EIGEN_STRONG_INLINE operator bool() const { return m_inner < m_end && m_inner>=0; }
176 
177  protected:
180  const Index m_outer;
181  const Index m_end;
182 
183  private:
185  {
186  while((bool(*this)) && internal::isMuchSmallerThan(value(), m_sve.m_view.reference(), m_sve.m_view.epsilon()))
187  {
188  m_inner++;
189  }
190  }
191  };
192 
193  enum {
195  Flags = XprType::Flags
196  };
197 
198  explicit unary_evaluator(const XprType& xpr) : m_argImpl(xpr.nestedExpression()), m_view(xpr) {}
199 
200  protected:
202  const XprType &m_view;
203 };
204 
205 } // end namespace internal
206 
224 template<typename Derived>
226  const typename NumTraits<Scalar>::Real& epsilon) const
227 {
228  return SparseView<Derived>(derived(), reference, epsilon);
229 }
230 
243 template<typename Derived>
246  const RealScalar& epsilon) const
247 {
248  return SparseView<Derived>(derived(), reference, epsilon);
249 }
250 
251 } // end namespace Eigen
252 
253 #endif
Index cols() const
Definition: SparseView.h:59
SparseMatrixBase< SparseView > Base
Definition: SparseView.h:49
EIGEN_STRONG_INLINE InnerIterator(const unary_evaluator &sve, Index outer)
Definition: SparseView.h:96
#define EIGEN_STRONG_INLINE
Definition: Macros.h:493
internal::traits< Derived >::Scalar Scalar
Definition: DenseBase.h:66
EIGEN_STRONG_INLINE InnerIterator(const unary_evaluator &sve, Index outer)
Definition: SparseView.h:152
Definition: LDLT.h:16
Holds information about the various numeric (i.e. scalar) types allowed by Eigen. ...
Definition: NumTraits.h:150
Index innerSize() const
Definition: SparseView.h:61
const SparseView< Derived > pruned(const Scalar &reference=Scalar(0), const RealScalar &epsilon=NumTraits< Scalar >::dummy_precision()) const
Definition: SparseView.h:245
Eigen::Index Index
The interface type of indices.
Definition: EigenBase.h:38
const unsigned int RowMajorBit
Definition: Constants.h:61
const SparseView< Derived > sparseView(const Scalar &m_reference=Scalar(0), const typename NumTraits< Scalar >::Real &m_epsilon=NumTraits< Scalar >::dummy_precision()) const
Definition: SparseView.h:225
internal::traits< SparseView< MatrixType > >::StorageIndex StorageIndex
#define EIGEN_SPARSE_PUBLIC_INTERFACE(Derived)
Definition: SparseUtil.h:43
Base class of any sparse matrices or sparse expressions.
MatrixType::Nested MatrixTypeNested
Definition: SparseView.h:47
internal::remove_all< MatrixTypeNested >::type _MatrixTypeNested
Definition: SparseView.h:48
MatrixTypeNested m_matrix
Definition: SparseView.h:72
internal::traits< SparseView< MatrixType > >::Scalar Scalar
RealScalar m_epsilon
Definition: SparseView.h:74
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:33
Index outerSize() const
Definition: SparseView.h:62
Expression of a dense or sparse matrix with zero or too small values removed.
Scalar reference() const
Definition: SparseView.h:68
const internal::remove_all< MatrixTypeNested >::type & nestedExpression() const
Definition: SparseView.h:66
RealScalar epsilon() const
Definition: SparseView.h:69
Scalar m_reference
Definition: SparseView.h:73
Index rows() const
Definition: SparseView.h:58
An InnerIterator allows to loop over the element of any matrix expression.
Definition: CoreIterators.h:33


hebiros
Author(s): Xavier Artache , Matthew Tesch
autogenerated on Thu Sep 3 2020 04:09:02