.maxCoeff no longer works on dynamic bool arrays
Summary
Environment
- Operating System : Linux
- Architecture : x86_64
- Eigen Version : 5.0.0
- Compiler Version : GCC 15.2.1
- Compile Flags : (none)
- Vector Extension : (none)
Minimal Example
The following code used to compile with Eigen 3.4.0:
#include <Eigen/Core>
int main()
{
Eigen::Array<bool, Eigen::Dynamic, 1> a = Eigen::Array<bool, 1, 1>{true};
Eigen::Index i;
a.maxCoeff(&i);
}
However, with Eigen 5.0.0 the code results in the following compile error:
In file included from /home/sergiu/Projects/eigen/Eigen/Core:195,
from /home/sergiu/Projects/eigen5-bool-find.cpp:1:
/home/sergiu/Projects/eigen/Eigen/src/Core/GenericPacketMath.h: In instantiation of ‘Packet Eigen::internal::pcmp_lt(const Packet&, const Packet&) [with Packet = eigen_packet_wrapper<__vector(2) long long int, 1>]’:
/home/sergiu/Projects/eigen/Eigen/src/Core/FindCoeff.h:27:19: required from ‘Packet Eigen::internal::max_coeff_functor<Scalar, NaNPropagation, IsInteger>::comparePacket(const Packet&, const Packet&) const [with Packet = Eigen::internal::eigen_packet_wrapper<__vector(2) long long int, 1>; Scalar = bool; int NaNPropagation = 0; bool IsInteger = true]’
27 | return pcmp_lt(incumbent, candidate);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
/home/sergiu/Projects/eigen/Eigen/src/Core/FindCoeff.h:243:40: required from ‘static void Eigen::internal::find_coeff_loop<Evaluator, Func, true, true>::run(const Evaluator&, Func&, Scalar&, Eigen::Index&) [with Evaluator = Eigen::internal::find_coeff_evaluator<Eigen::Array<bool, -1, 1> >; Func = Eigen::internal::max_coeff_functor<bool, 0, true>; Scalar = bool; Eigen::Index = long int]’
243 | if (predux_any(func.comparePacket(resultPacket, xprPacket))) {
| ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
/home/sergiu/Projects/eigen/Eigen/src/Core/FindCoeff.h:341:14: required from ‘static void Eigen::internal::find_coeff_impl<Derived, Func>::run(const Derived&, Func&, Scalar&, Eigen::Index&) [with Derived = Eigen::Array<bool, -1, 1>; Func = Eigen::internal::max_coeff_functor<bool, 0, true>; Scalar = bool; Eigen::Index = long int]’
341 | Loop::run(eval, func, res, index);
| ~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
/home/sergiu/Projects/eigen/Eigen/src/Core/FindCoeff.h:369:21: required from ‘typename Eigen::internal::traits<T>::Scalar Eigen::internal::findCoeff(const Eigen::DenseBase<Derived>&, Func&, IndexType*) [with Derived = Eigen::Array<bool, -1, 1>; IndexType = long int; Func = max_coeff_functor<bool, 0, true>; typename traits<T>::Scalar = bool]’
369 | FindCoeffImpl::run(mat.derived(), func, res, index);
| ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/sergiu/Projects/eigen/Eigen/src/Core/FindCoeff.h:459:29: required from ‘typename Eigen::internal::traits<T>::Scalar Eigen::DenseBase<Derived>::maxCoeff(IndexType*) const [with int NaNPropagation = 0; IndexType = long int; Derived = Eigen::Array<bool, -1, 1>; typename Eigen::internal::traits<T>::Scalar = bool]’
459 | return internal::findCoeff(derived(), func, indexPtr);
| ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/sergiu/Projects/eigen/Eigen/src/Core/DenseBase.h:467:35: required from ‘typename Eigen::internal::traits<T>::Scalar Eigen::DenseBase<Derived>::maxCoeff(IndexType*) const [with IndexType = long int; Derived = Eigen::Array<bool, -1, 1>; typename Eigen::internal::traits<T>::Scalar = bool]’
467 | return maxCoeff<PropagateFast>(index);
| ~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~
/home/sergiu/Projects/eigen5-bool-find.cpp:7:15: required from here
7 | a.maxCoeff(&i);
| ~~~~~~~~~~^~~~
/home/sergiu/Projects/eigen/Eigen/src/Core/GenericPacketMath.h:444:12: error: no match for ‘operator<’ (operand types are ‘const Eigen::internal::eigen_packet_wrapper<__vector(2) long long int, 1>’ and ‘const Eigen::internal::eigen_packet_wrapper<__vector(2) long long int, 1>’)
444 | return a < b ? ptrue(a) : pzero(a);
| ~~^~~
Bisecting points to commit 2e9b945b as the cause.