10 #ifndef EIGEN_VISITOR_H
11 #define EIGEN_VISITOR_H
17 template<
typename Visitor,
typename Derived,
int UnrollCount>
21 col = (UnrollCount-1) / Derived::RowsAtCompileTime,
22 row = (UnrollCount-1) % Derived::RowsAtCompileTime
26 static inline void run(
const Derived &mat, Visitor& visitor)
28 visitor_impl<Visitor, Derived, UnrollCount-1>::run(mat, visitor);
29 visitor(mat.coeff(row, col), row, col);
33 template<
typename Visitor,
typename Derived>
34 struct visitor_impl<Visitor, Derived, 1>
37 static inline void run(
const Derived &mat, Visitor& visitor)
39 return visitor.init(mat.coeff(0, 0), 0, 0);
43 template<
typename Visitor,
typename Derived>
44 struct visitor_impl<Visitor, Derived, Dynamic>
47 static inline void run(
const Derived& mat, Visitor& visitor)
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);
59 template<
typename XprType>
60 class visitor_evaluator
64 explicit visitor_evaluator(
const XprType &xpr) : m_evaluator(xpr), m_xpr(xpr) {}
66 typedef typename XprType::Scalar Scalar;
67 typedef typename XprType::CoeffReturnType CoeffReturnType;
70 RowsAtCompileTime = XprType::RowsAtCompileTime,
71 CoeffReadCost = internal::evaluator<XprType>::CoeffReadCost
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(); }
78 EIGEN_DEVICE_FUNC CoeffReturnType coeff(Index row, Index col)
const
79 {
return m_evaluator.coeff(row, col); }
82 internal::evaluator<XprType> m_evaluator;
104 template<
typename Derived>
105 template<
typename Visitor>
109 typedef typename internal::visitor_evaluator<Derived> ThisEvaluator;
110 ThisEvaluator thisEval(derived());
112 enum { unroll = SizeAtCompileTime != Dynamic
113 && ThisEvaluator::CoeffReadCost != Dynamic
114 && (SizeAtCompileTime == 1 || internal::functor_traits<Visitor>::Cost != Dynamic)
115 && SizeAtCompileTime * ThisEvaluator::CoeffReadCost + (SizeAtCompileTime-1) * internal::functor_traits<Visitor>::Cost
116 <= EIGEN_UNROLLING_LIMIT };
117 return internal::visitor_impl<Visitor, ThisEvaluator,
118 unroll ? int(SizeAtCompileTime) : Dynamic
119 >::run(thisEval, visitor);
127 template <
typename Derived>
130 typedef typename Derived::Scalar Scalar;
134 inline void init(
const Scalar& value, Index i, Index j)
147 template <
typename Derived>
148 struct min_coeff_visitor : coeff_visitor<Derived>
150 typedef typename Derived::Scalar Scalar;
152 void operator() (
const Scalar& value, Index i, Index j)
154 if(value < this->res)
163 template<
typename Scalar>
164 struct functor_traits<min_coeff_visitor<Scalar> > {
166 Cost = NumTraits<Scalar>::AddCost
175 template <
typename Derived>
176 struct max_coeff_visitor : coeff_visitor<Derived>
178 typedef typename Derived::Scalar Scalar;
180 void operator() (
const Scalar& value, Index i, Index j)
182 if(value > this->res)
191 template<
typename Scalar>
192 struct functor_traits<max_coeff_visitor<Scalar> > {
194 Cost = NumTraits<Scalar>::AddCost
205 template<
typename Derived>
206 template<
typename IndexType>
208 typename internal::traits<Derived>::Scalar
211 internal::min_coeff_visitor<Derived> minVisitor;
212 this->visit(minVisitor);
213 *rowId = minVisitor.row;
214 if (colId) *colId = minVisitor.col;
215 return minVisitor.res;
223 template<
typename Derived>
224 template<
typename IndexType>
226 typename internal::traits<Derived>::Scalar
229 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
230 internal::min_coeff_visitor<Derived> minVisitor;
231 this->visit(minVisitor);
232 *index = IndexType((RowsAtCompileTime==1) ? minVisitor.col : minVisitor.row);
233 return minVisitor.res;
241 template<
typename Derived>
242 template<
typename IndexType>
244 typename internal::traits<Derived>::Scalar
247 internal::max_coeff_visitor<Derived> maxVisitor;
248 this->visit(maxVisitor);
249 *rowPtr = maxVisitor.row;
250 if (colPtr) *colPtr = maxVisitor.col;
251 return maxVisitor.res;
259 template<
typename Derived>
260 template<
typename IndexType>
262 typename internal::traits<Derived>::Scalar
265 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
266 internal::max_coeff_visitor<Derived> maxVisitor;
267 this->visit(maxVisitor);
268 *index = (RowsAtCompileTime==1) ? maxVisitor.col : maxVisitor.row;
269 return maxVisitor.res;
274 #endif // EIGEN_VISITOR_H
void visit(Visitor &func) const
Definition: Visitor.h:107
internal::traits< Derived >::Scalar maxCoeff() const
Definition: Redux.h:449
internal::traits< Derived >::Scalar minCoeff() const
Definition: Redux.h:439
Definition: Eigen_Colamd.h:54