compbio
Visitor.h
1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra.
3 //
4 // Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>
5 //
6 // This Source Code Form is subject to the terms of the Mozilla
7 // Public License v. 2.0. If a copy of the MPL was not distributed
8 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 
10 #ifndef EIGEN_VISITOR_H
11 #define EIGEN_VISITOR_H
12 
13 namespace Eigen {
14 
15 namespace internal {
16 
17 template<typename Visitor, typename Derived, int UnrollCount>
19 {
20  enum {
21  col = (UnrollCount-1) / Derived::RowsAtCompileTime,
22  row = (UnrollCount-1) % Derived::RowsAtCompileTime
23  };
24 
25  EIGEN_DEVICE_FUNC
26  static inline void run(const Derived &mat, Visitor& visitor)
27  {
29  visitor(mat.coeff(row, col), row, col);
30  }
31 };
32 
33 template<typename Visitor, typename Derived>
34 struct visitor_impl<Visitor, Derived, 1>
35 {
36  EIGEN_DEVICE_FUNC
37  static inline void run(const Derived &mat, Visitor& visitor)
38  {
39  return visitor.init(mat.coeff(0, 0), 0, 0);
40  }
41 };
42 
43 template<typename Visitor, typename Derived>
44 struct visitor_impl<Visitor, Derived, Dynamic>
45 {
46  EIGEN_DEVICE_FUNC
47  static inline void run(const Derived& mat, Visitor& visitor)
48  {
49  visitor.init(mat.coeff(0,0), 0, 0);
50  for(Index i = 1; i < mat.rows(); ++i)
51  visitor(mat.coeff(i, 0), i, 0);
52  for(Index j = 1; j < mat.cols(); ++j)
53  for(Index i = 0; i < mat.rows(); ++i)
54  visitor(mat.coeff(i, j), i, j);
55  }
56 };
57 
58 // evaluator adaptor
59 template<typename XprType>
61 {
62 public:
63  EIGEN_DEVICE_FUNC
64  explicit visitor_evaluator(const XprType &xpr) : m_evaluator(xpr), m_xpr(xpr) {}
65 
66  typedef typename XprType::Scalar Scalar;
67  typedef typename XprType::CoeffReturnType CoeffReturnType;
68 
69  enum {
70  RowsAtCompileTime = XprType::RowsAtCompileTime,
72  };
73 
74  EIGEN_DEVICE_FUNC Index rows() const { return m_xpr.rows(); }
75  EIGEN_DEVICE_FUNC Index cols() const { return m_xpr.cols(); }
76  EIGEN_DEVICE_FUNC Index size() const { return m_xpr.size(); }
77 
78  EIGEN_DEVICE_FUNC CoeffReturnType coeff(Index row, Index col) const
79  { return m_evaluator.coeff(row, col); }
80 
81 protected:
82  internal::evaluator<XprType> m_evaluator;
83  const XprType &m_xpr;
84 };
85 } // end namespace internal
86 
104 template<typename Derived>
105 template<typename Visitor>
106 EIGEN_DEVICE_FUNC
107 void DenseBase<Derived>::visit(Visitor& visitor) const
108 {
109  typedef typename internal::visitor_evaluator<Derived> ThisEvaluator;
110  ThisEvaluator thisEval(derived());
111 
112  enum {
113  unroll = SizeAtCompileTime != Dynamic
114  && SizeAtCompileTime * ThisEvaluator::CoeffReadCost + (SizeAtCompileTime-1) * internal::functor_traits<Visitor>::Cost <= EIGEN_UNROLLING_LIMIT
115  };
117 }
118 
119 namespace internal {
120 
124 template <typename Derived>
126 {
127  typedef typename Derived::Scalar Scalar;
128  Index row, col;
129  Scalar res;
130  EIGEN_DEVICE_FUNC
131  inline void init(const Scalar& value, Index i, Index j)
132  {
133  res = value;
134  row = i;
135  col = j;
136  }
137 };
138 
144 template <typename Derived>
146 {
147  typedef typename Derived::Scalar Scalar;
148  EIGEN_DEVICE_FUNC
149  void operator() (const Scalar& value, Index i, Index j)
150  {
151  if(value < this->res)
152  {
153  this->res = value;
154  this->row = i;
155  this->col = j;
156  }
157  }
158 };
159 
160 template<typename Scalar>
162  enum {
164  };
165 };
166 
172 template <typename Derived>
174 {
175  typedef typename Derived::Scalar Scalar;
176  EIGEN_DEVICE_FUNC
177  void operator() (const Scalar& value, Index i, Index j)
178  {
179  if(value > this->res)
180  {
181  this->res = value;
182  this->row = i;
183  this->col = j;
184  }
185  }
186 };
187 
188 template<typename Scalar>
190  enum {
192  };
193 };
194 
195 } // end namespace internal
196 
202 template<typename Derived>
203 template<typename IndexType>
204 EIGEN_DEVICE_FUNC
206 DenseBase<Derived>::minCoeff(IndexType* rowId, IndexType* colId) const
207 {
209  this->visit(minVisitor);
210  *rowId = minVisitor.row;
211  if (colId) *colId = minVisitor.col;
212  return minVisitor.res;
213 }
214 
220 template<typename Derived>
221 template<typename IndexType>
222 EIGEN_DEVICE_FUNC
224 DenseBase<Derived>::minCoeff(IndexType* index) const
225 {
226  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
228  this->visit(minVisitor);
229  *index = IndexType((RowsAtCompileTime==1) ? minVisitor.col : minVisitor.row);
230  return minVisitor.res;
231 }
232 
238 template<typename Derived>
239 template<typename IndexType>
240 EIGEN_DEVICE_FUNC
242 DenseBase<Derived>::maxCoeff(IndexType* rowPtr, IndexType* colPtr) const
243 {
245  this->visit(maxVisitor);
246  *rowPtr = maxVisitor.row;
247  if (colPtr) *colPtr = maxVisitor.col;
248  return maxVisitor.res;
249 }
250 
256 template<typename Derived>
257 template<typename IndexType>
258 EIGEN_DEVICE_FUNC
260 DenseBase<Derived>::maxCoeff(IndexType* index) const
261 {
262  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
264  this->visit(maxVisitor);
265  *index = (RowsAtCompileTime==1) ? maxVisitor.col : maxVisitor.row;
266  return maxVisitor.res;
267 }
268 
269 } // end namespace Eigen
270 
271 #endif // EIGEN_VISITOR_H
EIGEN_DEVICE_FUNC internal::traits< Derived >::Scalar maxCoeff() const
Definition: Redux.h:436
Definition: Visitor.h:60
Definition: Visitor.h:18
EIGEN_DEVICE_FUNC void visit(Visitor &func) const
Applies the visitor visitor to the whole coefficients of the matrix or vector.
Definition: Visitor.h:107
Definition: CoreEvaluators.h:90
Namespace containing all symbols from the Eigen library.
Definition: bench_norm.cpp:85
Definition: Visitor.h:173
Holds information about the various numeric (i.e.
Definition: NumTraits.h:150
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:33
EIGEN_DEVICE_FUNC internal::traits< Derived >::Scalar minCoeff() const
Definition: Redux.h:426
Definition: Visitor.h:145
Definition: BandTriangularSolver.h:13
Definition: TutorialInplaceLU.cpp:2
Definition: XprHelper.h:146
Definition: Visitor.h:125
const int Dynamic
This value means that a positive quantity (e.g., a size) is not known at compile-time, and that instead the value is stored in some runtime variable.
Definition: Constants.h:21
Definition: ForwardDeclarations.h:17