1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library
2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra.
3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>
5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla
7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed
8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_VISITOR_H
11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_VISITOR_H
12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen {
14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal {
16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Visitor, typename Derived, int UnrollCount>
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct visitor_impl
19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  enum {
21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    col = (UnrollCount-1) / Derived::RowsAtCompileTime,
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    row = (UnrollCount-1) % Derived::RowsAtCompileTime
23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  };
24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  static inline void run(const Derived &mat, Visitor& visitor)
26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    visitor_impl<Visitor, Derived, UnrollCount-1>::run(mat, visitor);
28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    visitor(mat.coeff(row, col), row, col);
29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Visitor, typename Derived>
33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct visitor_impl<Visitor, Derived, 1>
34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  static inline void run(const Derived &mat, Visitor& visitor)
36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    return visitor.init(mat.coeff(0, 0), 0, 0);
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Visitor, typename Derived>
42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct visitor_impl<Visitor, Derived, Dynamic>
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename Derived::Index Index;
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  static inline void run(const Derived& mat, Visitor& visitor)
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    visitor.init(mat.coeff(0,0), 0, 0);
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    for(Index i = 1; i < mat.rows(); ++i)
49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      visitor(mat.coeff(i, 0), i, 0);
50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    for(Index j = 1; j < mat.cols(); ++j)
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      for(Index i = 0; i < mat.rows(); ++i)
52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        visitor(mat.coeff(i, j), i, j);
53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace internal
57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** Applies the visitor \a visitor to the whole coefficients of the matrix or vector.
59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * The template parameter \a Visitor is the type of the visitor and provides the following interface:
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \code
62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * struct MyVisitor {
63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *   // called for the first coefficient
64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *   void init(const Scalar& value, Index i, Index j);
65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *   // called for all other coefficients
66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *   void operator() (const Scalar& value, Index i, Index j);
67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * };
68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \endcode
69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \note compared to one or two \em for \em loops, visitors offer automatic
71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * unrolling for small fixed size matrix.
72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa minCoeff(Index*,Index*), maxCoeff(Index*,Index*), DenseBase::redux()
74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Visitor>
77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid DenseBase<Derived>::visit(Visitor& visitor) const
78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  enum { unroll = SizeAtCompileTime != Dynamic
80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                   && CoeffReadCost != Dynamic
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                   && (SizeAtCompileTime == 1 || internal::functor_traits<Visitor>::Cost != Dynamic)
82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                   && SizeAtCompileTime * CoeffReadCost + (SizeAtCompileTime-1) * internal::functor_traits<Visitor>::Cost
83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                      <= EIGEN_UNROLLING_LIMIT };
84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return internal::visitor_impl<Visitor, Derived,
85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      unroll ? int(SizeAtCompileTime) : Dynamic
86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    >::run(derived(), visitor);
87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal {
90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal
92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \brief Base class to implement min and max visitors
93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename Derived>
95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct coeff_visitor
96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename Derived::Index Index;
98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename Derived::Scalar Scalar;
99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Index row, col;
100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Scalar res;
101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  inline void init(const Scalar& value, Index i, Index j)
102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    res = value;
104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    row = i;
105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    col = j;
106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal
110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \brief Visitor computing the min coefficient with its value and coordinates
111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa DenseBase::minCoeff(Index*, Index*)
113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename Derived>
115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct min_coeff_visitor : coeff_visitor<Derived>
116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename Derived::Index Index;
118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename Derived::Scalar Scalar;
119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  void operator() (const Scalar& value, Index i, Index j)
120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    if(value < this->res)
122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      this->res = value;
124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      this->row = i;
125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      this->col = j;
126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar>
131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<min_coeff_visitor<Scalar> > {
132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  enum {
133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Cost = NumTraits<Scalar>::AddCost
134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  };
135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal
138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \brief Visitor computing the max coefficient with its value and coordinates
139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa DenseBase::maxCoeff(Index*, Index*)
141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename Derived>
143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct max_coeff_visitor : coeff_visitor<Derived>
144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename Derived::Index Index;
146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename Derived::Scalar Scalar;
147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  void operator() (const Scalar& value, Index i, Index j)
148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    if(value > this->res)
150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      this->res = value;
152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      this->row = i;
153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      this->col = j;
154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar>
159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<max_coeff_visitor<Scalar> > {
160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  enum {
161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Cost = NumTraits<Scalar>::AddCost
162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  };
163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace internal
166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns the minimum of all coefficients of *this
168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * and puts in *row and *col its location.
169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa DenseBase::minCoeff(Index*), DenseBase::maxCoeff(Index*,Index*), DenseBase::visitor(), DenseBase::minCoeff()
171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename IndexType>
174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtypename internal::traits<Derived>::Scalar
175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDenseBase<Derived>::minCoeff(IndexType* row, IndexType* col) const
176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  internal::min_coeff_visitor<Derived> minVisitor;
178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  this->visit(minVisitor);
179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *row = minVisitor.row;
180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  if (col) *col = minVisitor.col;
181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return minVisitor.res;
182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns the minimum of all coefficients of *this
185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * and puts in *index its location.
186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa DenseBase::minCoeff(IndexType*,IndexType*), DenseBase::maxCoeff(IndexType*,IndexType*), DenseBase::visitor(), DenseBase::minCoeff()
188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
190c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename IndexType>
191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtypename internal::traits<Derived>::Scalar
192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDenseBase<Derived>::minCoeff(IndexType* index) const
193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  internal::min_coeff_visitor<Derived> minVisitor;
196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  this->visit(minVisitor);
197c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *index = (RowsAtCompileTime==1) ? minVisitor.col : minVisitor.row;
198c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return minVisitor.res;
199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns the maximum of all coefficients of *this
202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * and puts in *row and *col its location.
203c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa DenseBase::minCoeff(IndexType*,IndexType*), DenseBase::visitor(), DenseBase::maxCoeff()
205c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
206c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
207c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename IndexType>
208c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtypename internal::traits<Derived>::Scalar
209c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDenseBase<Derived>::maxCoeff(IndexType* row, IndexType* col) const
210c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
211c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  internal::max_coeff_visitor<Derived> maxVisitor;
212c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  this->visit(maxVisitor);
213c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *row = maxVisitor.row;
214c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  if (col) *col = maxVisitor.col;
215c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return maxVisitor.res;
216c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
217c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
218c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns the maximum of all coefficients of *this
219c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * and puts in *index its location.
220c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
221c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa DenseBase::maxCoeff(IndexType*,IndexType*), DenseBase::minCoeff(IndexType*,IndexType*), DenseBase::visitor(), DenseBase::maxCoeff()
222c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
223c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
224c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename IndexType>
225c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtypename internal::traits<Derived>::Scalar
226c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDenseBase<Derived>::maxCoeff(IndexType* index) const
227c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
228c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
229c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  internal::max_coeff_visitor<Derived> maxVisitor;
230c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  this->visit(maxVisitor);
231c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *index = (RowsAtCompileTime==1) ? maxVisitor.col : maxVisitor.row;
232c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return maxVisitor.res;
233c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
234c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
235c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen
236c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
237c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_VISITOR_H
238