New user self-registration is disabled due to spam. Please email eigen-core-team @ lists.tuxfamily.org if you need an account.
Bug 1261 - Regression: max/minCoeff() of vector containing AutoDiffScalar
Summary: Regression: max/minCoeff() of vector containing AutoDiffScalar
Status: RESOLVED FIXED
Alias: None
Product: Eigen
Classification: Unclassified
Component: Unsupported modules (show other bugs)
Version: 3.3 (current stable)
Hardware: All All
: Normal Unknown
Assignee: Nobody
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2016-07-27 09:03 UTC by Daniel Vollmer
Modified: 2016-07-27 12:54 UTC (History)
2 users (show)



Attachments

Description Daniel Vollmer 2016-07-27 09:03:52 UTC
The following example (which works in the 3.2 branch) demonstrates the problem with Eigen-3.3 beta2:

#include "Eigen/Core"
#include "unsupported/Eigen/AutoDiff"

using namespace Eigen;

int main (int argc, char const *argv[])
{
  using AD = AutoDiffScalar<Matrix<double, 2, 1> >;
  using ADVec = Matrix<AD, 2, 1>;
  
  ADVec v;
  const AD maxVal = v.maxCoeff();
  /* code */
  return 0;
}

The error is as follows:
> clang++ -std=c++11 eigen_3.3_repo.cpp -I thirdparty/eigen-3.3
In file included from eigen_3.3_repo.cpp:1:
In file included from thirdparty/eigen-3.3/Eigen/Core:330:
thirdparty/eigen-3.3/Eigen/src/Core/MathFunctions.h:810:10: error: call to 'max' is ambiguous
  return max EIGEN_NOT_A_MACRO (x,y);
         ^~~
thirdparty/eigen-3.3/Eigen/src/Core/functors/BinaryFunctors.h:170:134: note: in instantiation of function template specialization 'Eigen::numext::maxi<Eigen::AutoDiffScalar<Eigen::Matrix<double, 2, 1, 0, 2, 1> > >'
      requested here
  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const { return numext::maxi(a, b); }
                                                                                                                                     ^
thirdparty/eigen-3.3/Eigen/src/Core/Redux.h:102:12: note: in instantiation of member function 'Eigen::internal::scalar_max_op<Eigen::AutoDiffScalar<Eigen::Matrix<double, 2, 1, 0, 2, 1> >,
      Eigen::AutoDiffScalar<Eigen::Matrix<double, 2, 1, 0, 2, 1> > >::operator()' requested here
    return func(redux_novec_unroller<Func, Derived, Start, HalfLength>::run(mat,func),
           ^
thirdparty/eigen-3.3/Eigen/src/Core/Redux.h:418:53: note: in instantiation of member function 'Eigen::internal::redux_novec_unroller<Eigen::internal::scalar_max_op<Eigen::AutoDiffScalar<Eigen::Matrix<double, 2, 1, 0, 2, 1>
      >, Eigen::AutoDiffScalar<Eigen::Matrix<double, 2, 1, 0, 2, 1> > >, Eigen::internal::redux_evaluator<Eigen::Matrix<Eigen::AutoDiffScalar<Eigen::Matrix<double, 2, 1, 0, 2, 1> >, 2, 1, 0, 2, 1> >, 0, 2>::run' requested
      here
  return internal::redux_impl<Func, ThisEvaluator>::run(thisEval, func);
                                                    ^
thirdparty/eigen-3.3/Eigen/src/Core/Redux.h:438:20: note: in instantiation of function template specialization 'Eigen::DenseBase<Eigen::Matrix<Eigen::AutoDiffScalar<Eigen::Matrix<double, 2, 1, 0, 2, 1> >, 2, 1, 0, 2, 1>
      >::redux<Eigen::internal::scalar_max_op<Eigen::AutoDiffScalar<Eigen::Matrix<double, 2, 1, 0, 2, 1> >, Eigen::AutoDiffScalar<Eigen::Matrix<double, 2, 1, 0, 2, 1> > > >' requested here
  return derived().redux(Eigen::internal::scalar_max_op<Scalar,Scalar>());
                   ^
eigen_3.3_repo.cpp:12:23: note: in instantiation of member function 'Eigen::DenseBase<Eigen::Matrix<Eigen::AutoDiffScalar<Eigen::Matrix<double, 2, 1, 0, 2, 1> >, 2, 1, 0, 2, 1> >::maxCoeff' requested here
  const AD maxVal = v.maxCoeff();
                      ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/algorithm:2654:1: note: candidate function [with _Tp = Eigen::AutoDiffScalar<Eigen::Matrix<double, 2, 1, 0, 2, 1> >]
max(const _Tp& __a, const _Tp& __b)
^
thirdparty/eigen-3.3/unsupported/Eigen/src/AutoDiff/AutoDiffScalar.h:567:90: note: candidate function [with DerType = Eigen::Matrix<double, 2, 1, 0, 2, 1>, T = Eigen::AutoDiffScalar<Eigen::Matrix<double, 2, 1, 0, 2, 1> >]
inline AutoDiffScalar<typename Eigen::internal::remove_all<DerType>::type::PlainObject> (max)(const AutoDiffScalar<DerType>& x, const T& y) {
                                                                                         ^
thirdparty/eigen-3.3/unsupported/Eigen/src/AutoDiff/AutoDiffScalar.h:577:90: note: candidate function [with DerType = Eigen::Matrix<double, 2, 1, 0, 2, 1>, T = Eigen::AutoDiffScalar<Eigen::Matrix<double, 2, 1, 0, 2, 1> >]
inline AutoDiffScalar<typename Eigen::internal::remove_all<DerType>::type::PlainObject> (max)(const T& x, const AutoDiffScalar<DerType>& y) {
                                                                                         ^
1 error generated.
Comment 1 Gael Guennebaud 2016-07-27 12:54:02 UTC
That one was not a duplicate ;)

Fixed:

https://bitbucket.org/eigen/eigen/commits/35c72567c385/
Summary:     Big 1261: add missing max(ADS,ADS) overload (same for min)

Note You need to log in before you can comment on or make changes to this bug.