// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>
//
// This Source Code Form is subject to the terms of the Mozilla
// Public License v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
// SPDX-License-Identifier: MPL-2.0

// Silence warnings about the deprecated shiftLeft()/shiftRight(), which are still being tested.
#define EIGEN_NO_DEPRECATED_WARNING

#include <vector>
#include "main.h"
#include "random_for_arithmetic.h"
#include "random_without_cast_overflow.h"

static_assert(
    std::is_same<ArrayXf::AbsReturnType, std::remove_const_t<decltype(std::declval<const ArrayXf&>().abs())>>::value,
    "ArrayBase unary return type aliases must match their corresponding expressions");

// suppress annoying unsigned integer warnings
template <typename Scalar, bool IsSignedInteger = NumTraits<Scalar>::IsSigned && NumTraits<Scalar>::IsInteger,
          bool IsSigned = NumTraits<Scalar>::IsSigned>
struct negative_or_zero_impl {
  static Scalar run(const Scalar& a) {
    using UnsignedScalar = std::make_unsigned_t<Scalar>;
    return static_cast<Scalar>(UnsignedScalar(0) - static_cast<UnsignedScalar>(a));
  }
};
template <typename Scalar>
struct negative_or_zero_impl<Scalar, false, true> {
  static Scalar run(const Scalar& a) { return -a; }
};
template <typename Scalar>
struct negative_or_zero_impl<Scalar, false, false> {
  static Scalar run(const Scalar&) { return Scalar(0); }
};
template <typename Scalar>
Scalar negative_or_zero(const Scalar& a) {
  return negative_or_zero_impl<Scalar>::run(a);
}

template <typename Scalar, std::enable_if_t<NumTraits<Scalar>::IsInteger, int> = 0>
std::vector<Scalar> special_values() {
  const Scalar zero = Scalar(0);
  const Scalar one = Scalar(1);
  const Scalar two = Scalar(2);
  const Scalar three = Scalar(3);
  const Scalar min = (std::numeric_limits<Scalar>::min)();
  const Scalar max = (std::numeric_limits<Scalar>::max)();
  return {zero, min, one, two, three, max};
}

template <typename Scalar, std::enable_if_t<!NumTraits<Scalar>::IsInteger, int> = 0>
std::vector<Scalar> special_values() {
  const Scalar zero = Scalar(0);
  const Scalar eps = Eigen::NumTraits<Scalar>::epsilon();
  const Scalar one_half = Scalar(0.5);
  const Scalar one = Scalar(1);
  const Scalar two = Scalar(2);
  const Scalar three = Scalar(3);
  const Scalar sqrt_half = Scalar(std::sqrt(0.5));
  const Scalar sqrt2 = Scalar(std::sqrt(2));
  const Scalar inf = Eigen::NumTraits<Scalar>::infinity();
  const Scalar nan = Eigen::NumTraits<Scalar>::quiet_NaN();
  // For 32-bit arm, working within or near the subnormal range can lead to incorrect results
  // due to FTZ.
  const Scalar denorm_min = EIGEN_ARCH_ARM ? zero : std::numeric_limits<Scalar>::denorm_min();
  const Scalar min =
      EIGEN_ARCH_ARM ? Scalar(1.1) * (std::numeric_limits<Scalar>::min)() : (std::numeric_limits<Scalar>::min)();
  const Scalar max = (std::numeric_limits<Scalar>::max)();
  const Scalar max_exp = (static_cast<Scalar>(int(Eigen::NumTraits<Scalar>::max_exponent())) * Scalar(EIGEN_LN2)) / eps;
  std::vector<Scalar> values = {zero,  denorm_min, min,   eps,     sqrt_half, one_half, one,
                                sqrt2, two,        three, max_exp, max,       inf,      nan};
  std::vector<Scalar> signed_values;
  for (Scalar value : values) {
    signed_values.push_back(value);
    signed_values.push_back(-value);
  }
  return signed_values;
}

template <typename Scalar>
void special_value_pairs(Array<Scalar, Dynamic, Dynamic>& x, Array<Scalar, Dynamic, Dynamic>& y) {
  std::vector<Scalar> vals = special_values<Scalar>();
  std::size_t num_cases = vals.size() * vals.size();
  // ensure both vectorized and non-vectorized paths taken
  const Index num_repeats = 2 * (Index)internal::packet_traits<Scalar>::size + 1;
  x.resize(num_repeats, num_cases);
  y.resize(num_repeats, num_cases);
  int count = 0;
  for (const Scalar x_case : vals) {
    for (const Scalar y_case : vals) {
      for (Index repeat = 0; repeat < num_repeats; ++repeat) {
        x(repeat, count) = x_case;
        y(repeat, count) = y_case;
      }
      ++count;
    }
  }
}

template <typename Scalar, typename Fn, typename RefFn>
void binary_op_test(std::string name, Fn fun, RefFn ref) {
  const Scalar tol = test_precision<Scalar>();
  Array<Scalar, Dynamic, Dynamic> lhs;
  Array<Scalar, Dynamic, Dynamic> rhs;
  special_value_pairs(lhs, rhs);

  Array<Scalar, Dynamic, Dynamic> actual = fun(lhs, rhs);
  bool all_pass = true;
  for (Index i = 0; i < lhs.rows(); ++i) {
    for (Index j = 0; j < lhs.cols(); ++j) {
      Scalar e = static_cast<Scalar>(ref(lhs(i, j), rhs(i, j)));
      Scalar a = actual(i, j);
#if EIGEN_ARCH_ARM
      // Work around NEON flush-to-zero mode.
      // If ref returns a subnormal value and Eigen returns 0, then skip the test.
      if (a == Scalar(0) && (e > -(std::numeric_limits<Scalar>::min)() && e < (std::numeric_limits<Scalar>::min)()) &&
          (e <= -std::numeric_limits<Scalar>::denorm_min() || e >= std::numeric_limits<Scalar>::denorm_min())) {
        continue;
      }
#endif
      bool success = (a == e) || ((numext::isfinite)(e) && internal::isApprox(a, e, tol)) ||
                     ((numext::isnan)(a) && (numext::isnan)(e));
      if ((a == a) && (e == e)) success &= (bool)numext::signbit(e) == (bool)numext::signbit(a);
      all_pass &= success;
      if (!success) {
        std::cout << name << "(" << lhs(i, j) << "," << rhs(i, j) << ") = " << a << " !=  " << e << std::endl;
      }
    }
  }
  VERIFY(all_pass);
}

#define BINARY_FUNCTOR_TEST_ARGS(fun)                                        \
  #fun, [](const auto& x_, const auto& y_) { return (Eigen::fun)(x_, y_); }, \
      [](const auto& x_, const auto& y_) { return (std::fun)(x_, y_); }

template <typename Scalar>
void binary_ops_test() {
  binary_op_test<Scalar>(BINARY_FUNCTOR_TEST_ARGS(pow));
#ifndef EIGEN_COMP_MSVC
  binary_op_test<Scalar>(BINARY_FUNCTOR_TEST_ARGS(atan2));
#else
  binary_op_test<Scalar>(
      "atan2", [](const auto& x, const auto& y) { return Eigen::atan2(x, y); },
      [](Scalar x, Scalar y) {
        auto t = Scalar(std::atan2(x, y));
        // Work around MSVC return value on underflow.
        // |atan(y/x)| is bounded above by |y/x|, so on underflow return y/x according to POSIX spec.
        // MSVC otherwise returns denorm_min.
        if (EIGEN_PREDICT_FALSE(std::abs(t) == std::numeric_limits<decltype(t)>::denorm_min())) {
          return x / y;
        }
        return t;
      });
#endif
}

template <typename Scalar, typename Fn, typename RefFn>
void unary_op_test(std::string name, Fn fun, RefFn ref) {
  const Scalar tol = test_precision<Scalar>();
  auto values = special_values<Scalar>();
  Map<Array<Scalar, Dynamic, 1>> valuesMap(values.data(), values.size());

  Array<Scalar, Dynamic, Dynamic> actual = fun(valuesMap);
  bool all_pass = true;
  for (Index i = 0; i < valuesMap.size(); ++i) {
    Scalar e = static_cast<Scalar>(ref(valuesMap(i)));
    Scalar a = actual(i);
#if EIGEN_ARCH_ARM
    // Work around NEON flush-to-zero mode.
    // If ref returns a subnormal value and Eigen returns 0, then skip the test.
    if (a == Scalar(0) && (e > -(std::numeric_limits<Scalar>::min)() && e < (std::numeric_limits<Scalar>::min)()) &&
        (e <= -std::numeric_limits<Scalar>::denorm_min() || e >= std::numeric_limits<Scalar>::denorm_min())) {
      continue;
    }
#endif
    bool success = (a == e) || ((numext::isfinite)(e) && internal::isApprox(a, e, tol)) ||
                   ((numext::isnan)(a) && (numext::isnan)(e));
    if ((a == a) && (e == e)) success &= (bool)numext::signbit(e) == (bool)numext::signbit(a);
    all_pass &= success;
    if (!success) {
      std::cout << name << "(" << valuesMap(i) << ") = " << a << " !=  " << e << std::endl;
    }
  }
  VERIFY(all_pass);
}

#define UNARY_FUNCTOR_TEST_ARGS(fun) \
  #fun, [](const auto& x_) { return (Eigen::fun)(x_); }, [](const auto& y_) { return (std::fun)(y_); }

template <typename Scalar>
void unary_ops_test() {
  unary_op_test<Scalar>(UNARY_FUNCTOR_TEST_ARGS(sqrt));
  unary_op_test<Scalar>(UNARY_FUNCTOR_TEST_ARGS(cbrt));
  unary_op_test<Scalar>(UNARY_FUNCTOR_TEST_ARGS(exp));
  unary_op_test<Scalar>(UNARY_FUNCTOR_TEST_ARGS(exp2));
  unary_op_test<Scalar>(UNARY_FUNCTOR_TEST_ARGS(log));
  unary_op_test<Scalar>(UNARY_FUNCTOR_TEST_ARGS(log10));
  unary_op_test<Scalar>(UNARY_FUNCTOR_TEST_ARGS(sin));
  unary_op_test<Scalar>(UNARY_FUNCTOR_TEST_ARGS(cos));
  unary_op_test<Scalar>(UNARY_FUNCTOR_TEST_ARGS(tan));
  unary_op_test<Scalar>(UNARY_FUNCTOR_TEST_ARGS(asin));
  unary_op_test<Scalar>(UNARY_FUNCTOR_TEST_ARGS(acos));
  unary_op_test<Scalar>(UNARY_FUNCTOR_TEST_ARGS(atan));
  unary_op_test<Scalar>(UNARY_FUNCTOR_TEST_ARGS(sinh));
  unary_op_test<Scalar>(UNARY_FUNCTOR_TEST_ARGS(cosh));
  unary_op_test<Scalar>(UNARY_FUNCTOR_TEST_ARGS(tanh));
  unary_op_test<Scalar>(UNARY_FUNCTOR_TEST_ARGS(asinh));
  unary_op_test<Scalar>(UNARY_FUNCTOR_TEST_ARGS(acosh));
  unary_op_test<Scalar>(UNARY_FUNCTOR_TEST_ARGS(atanh));
  unary_op_test<Scalar>(UNARY_FUNCTOR_TEST_ARGS(rint));
  unary_op_test<Scalar>(UNARY_FUNCTOR_TEST_ARGS(floor));
  unary_op_test<Scalar>(UNARY_FUNCTOR_TEST_ARGS(ceil));
  unary_op_test<Scalar>(UNARY_FUNCTOR_TEST_ARGS(round));
  unary_op_test<Scalar>(UNARY_FUNCTOR_TEST_ARGS(trunc));
  /* FIXME: Enable when the behavior of rsqrt on denormals for half and double is fixed.
  unary_op_test<Scalar>("rsqrt",
                        [](const auto& x) { return Eigen::rsqrt(x); },
                        [](Scalar x) {
                          if (x >= 0 && x < (std::numeric_limits<Scalar>::min)()) {
                            // rsqrt return +inf for positive subnormals.
                            return NumTraits<Scalar>::infinity();
                          } else {
                            return  Scalar(std::sqrt(Scalar(1)/x));
                          }
                        });
  */
}

template <typename Scalar>
void ldexp_test() {
  const std::vector<Scalar> vals = special_values<Scalar>();
  // Exercise both packet and scalar tails.
  const Index num_repeats = 2 * Index(internal::packet_traits<Scalar>::size) + 1;
  Array<Scalar, Dynamic, 1> x(num_repeats * Index(vals.size()));
  Index count = 0;
  for (const Scalar& value : vals) {
    for (Index repeat = 0; repeat < num_repeats; ++repeat) x(count++) = value;
  }

  const int digits = std::numeric_limits<Scalar>::digits;
  const int max_exp = std::numeric_limits<Scalar>::max_exponent;
  // Include denormals, saturation, and unrepresentable 2^e scale factors.
  const int exponents[] = {0,
                           1,
                           -1,
                           digits - 1,
                           1 - digits,
                           max_exp - 1,
                           1 - max_exp,
                           max_exp + digits,
                           -(max_exp + digits),
                           2 * max_exp,
                           -2 * max_exp,
                           (std::numeric_limits<int>::max)(),
                           (std::numeric_limits<int>::min)()};

  bool all_pass = true;
  for (const int exponent : exponents) {
    const Array<Scalar, Dynamic, 1> method_result = x.ldexp(exponent);
    const Array<Scalar, Dynamic, 1> global_result = Eigen::ldexp(x, exponent);
    for (Index i = 0; i < x.size(); ++i) {
      // double covers every tested Scalar, so one conversion back gives the exact reference.
      const double expected = static_cast<double>(static_cast<Scalar>(std::ldexp(static_cast<double>(x(i)), exponent)));
#if EIGEN_ARCH_ARM
      // Work around 32-bit ARM flush-to-zero mode: skip cases with subnormal results.
      if (expected != 0.0 && std::abs(expected) < static_cast<double>((std::numeric_limits<Scalar>::min)())) continue;
#endif
      for (const Scalar& result : {method_result(i), global_result(i)}) {
        const double actual = static_cast<double>(result);
        const bool success = (actual == expected && std::signbit(actual) == std::signbit(expected)) ||
                             ((numext::isnan)(actual) && (numext::isnan)(expected));
        all_pass &= success;
        if (!success) {
          std::cout << "ldexp(" << x(i) << "," << exponent << ") = " << result << " != " << expected << std::endl;
        }
      }
    }
  }
  VERIFY(all_pass);
}

template <typename Base, typename Exponent, bool ExpIsInteger = NumTraits<Exponent>::IsInteger>
struct ref_pow {
  static Base run(Base base, Exponent exponent) {
    EIGEN_USING_STD(pow);
    return static_cast<Base>(pow(base, static_cast<Base>(exponent)));
  }
};

template <typename Base, typename Exponent>
Base ref_pow_integer_base(Base base, Exponent exponent) {
  // std::pow uses floating-point arithmetic and can round one ulp below the exact integer result before casting.
  Base result(1);
  while (exponent > Exponent(0)) {
    if (exponent & Exponent(1)) result *= base;
    exponent >>= 1;
    if (exponent > Exponent(0)) base *= base;
  }
  return result;
}

template <typename Base, typename Exponent>
struct ref_pow<Base, Exponent, true> {
  static Base run(Base base, Exponent exponent) {
    if (NumTraits<Base>::IsInteger && (exponent > Exponent(0) || exponent == Exponent(0))) {
      return ref_pow_integer_base(base, exponent);
    }
    EIGEN_USING_STD(pow);
    return static_cast<Base>(pow(base, exponent));
  }
};

template <typename Exponent, bool ExpIsInteger = NumTraits<Exponent>::IsInteger>
struct pow_helper {
  static bool is_integer_impl(const Exponent& exp) { return (numext::isfinite)(exp) && exp == numext::floor(exp); }
  static bool is_odd_impl(const Exponent& exp) {
    Exponent exp_div_2 = exp / Exponent(2);
    Exponent floor_exp_div_2 = numext::floor(exp_div_2);
    return exp_div_2 != floor_exp_div_2;
  }
};
template <typename Exponent>
struct pow_helper<Exponent, true> {
  static bool is_integer_impl(const Exponent&) { return true; }
  static bool is_odd_impl(const Exponent& exp) { return exp % 2 != 0; }
};
template <typename Exponent>
bool is_integer(const Exponent& exp) {
  return pow_helper<Exponent>::is_integer_impl(exp);
}
template <typename Exponent>
bool is_odd(const Exponent& exp) {
  return pow_helper<Exponent>::is_odd_impl(exp);
}

template <typename Base, typename Exponent>
void float_pow_test_impl() {
  const Base tol = test_precision<Base>();
  std::vector<Base> abs_base_vals = special_values<Base>();
  std::vector<Exponent> abs_exponent_vals = special_values<Exponent>();
  for (int i = 0; i < 100; i++) {
    abs_base_vals.push_back(internal::random<Base>(Base(0), Base(10)));
    abs_exponent_vals.push_back(internal::random<Exponent>(Exponent(0), Exponent(10)));
  }
  const Index num_repeats = internal::packet_traits<Base>::size + 1;
  ArrayX<Base> bases(num_repeats), eigenPow(num_repeats);
  bool all_pass = true;
  for (Base abs_base : abs_base_vals)
    for (Base base : {negative_or_zero(abs_base), abs_base}) {
      bases.setConstant(base);
      for (Exponent abs_exponent : abs_exponent_vals) {
        for (Exponent exponent : {negative_or_zero(abs_exponent), abs_exponent}) {
          eigenPow = bases.pow(exponent);
          for (Index j = 0; j < num_repeats; j++) {
            Base e = ref_pow<Base, Exponent>::run(bases(j), exponent);
            if (is_integer(exponent)) {
              // std::pow may return an incorrect result for a very large integral exponent
              // if base is negative and the exponent is odd, then the result must be negative
              // if std::pow returns otherwise, flip the sign
              bool exp_is_odd = is_odd(exponent);
              bool base_is_neg = !(numext::isnan)(base) && (bool)numext::signbit(base);
              bool result_is_neg = exp_is_odd && base_is_neg;
              bool ref_is_neg = !(numext::isnan)(e) && (bool)numext::signbit(e);
              bool flip_sign = result_is_neg != ref_is_neg;
              if (flip_sign) e = -e;
            } else if (e == Base(0)) {
              // Implementations may disagree on the sign of pow(-0, positive non-integer).  The specified result is
              // +0, so do not inherit a negative zero from the scalar reference.
              e = numext::abs(e);
            }

            Base a = eigenPow(j);
#ifdef EIGEN_COMP_MSVC
            // Work around MSVC return value on underflow.
            // if std::pow returns 0 and Eigen returns a denormalized value, then skip the test
            int eigen_fpclass = std::fpclassify(a);
            if (e == Base(0) && eigen_fpclass == FP_SUBNORMAL) continue;
#endif

#ifdef EIGEN_VECTORIZE_NEON
            // Work around NEON flush-to-zero mode
            // if std::pow returns denormalized value and Eigen returns 0, then skip the test
            int ref_fpclass = std::fpclassify(e);
            if (a == Base(0) && ref_fpclass == FP_SUBNORMAL) continue;
#endif

            bool both_nan = (numext::isnan)(a) && (numext::isnan)(e);
            bool exact_or_approx = (a == e) || internal::isApprox(a, e, tol);
            bool same_sign = (bool)numext::signbit(e) == (bool)numext::signbit(a);
            bool success = both_nan || (exact_or_approx && same_sign);
            all_pass &= success;
            if (!success) {
              std::cout << "Base type: " << type_name(base) << ", Exponent type: " << type_name(exponent) << std::endl;
              std::cout << "pow(" << bases(j) << "," << exponent << ")   =   " << a << " !=  " << e << std::endl;
            }
          }
        }
      }
    }
  VERIFY(all_pass);
}

// pow(x, y) = 2^(y log2(x)) for x in [1/2, 2] and |y log2(x)| up to the exponent range, where y magnifies the error
// of log2(x). Eigen and std::pow are each within a few ulps.
template <typename Scalar>
void pow_magnified_log_test() {
  const Scalar eps = NumTraits<Scalar>::epsilon();
  const Scalar max_log2 = Scalar(NumTraits<Scalar>::max_exponent() - 2);
  const Index n = 1000;
  ArrayX<Scalar> x(n), y(n);
  for (Index i = 0; i < n; ++i) {
    do {
      x(i) = internal::random<Scalar>(Scalar(0.5), Scalar(2));
    } while (x(i) == Scalar(1));
    y(i) = internal::random<Scalar>(-max_log2, max_log2) / numext::log2(x(i));
  }
  const ArrayX<Scalar> actual = x.pow(y);
  bool all_pass = true;
  for (Index i = 0; i < n; ++i) {
    const Scalar expected = std::pow(x(i), y(i));
    const bool success = numext::abs(actual(i) - expected) <= Scalar(4) * eps * numext::abs(expected);
    all_pass &= success;
    if (!success) {
      std::cout << std::setprecision(17) << "pow(" << x(i) << "," << y(i) << ") = " << actual(i) << " != " << expected
                << std::endl;
    }
  }
  VERIFY(all_pass);
}

// pow(x, +-y) for x = +-(1 - eps/2), the |x| nearest 1, and y = 1.5 max_exponent ln(2) / eps: x^y = 2^(-0.75
// max_exponent) and x^-y = 2^(0.75 max_exponent) are normal, although (1 + eps)^y overflows. Both the array and the
// scalar exponent take the vectorized generic pow (y is an integer far above the repeated squaring limit).
template <typename Scalar>
void pow_near_one_huge_exponent_test() {
  const Scalar eps = NumTraits<Scalar>::epsilon();
  const Scalar below_one = Scalar(1) - eps / Scalar(2);
  const Scalar huge = Scalar(1.5) * Scalar(NumTraits<Scalar>::max_exponent()) * Scalar(EIGEN_LN2) / eps;
  const Index n = 2 * internal::packet_traits<Scalar>::size + 1;
  bool all_pass = true;
  for (const Scalar base : {below_one, -below_one}) {
    for (const Scalar exponent : {huge, -huge}) {
      const ArrayX<Scalar> x = ArrayX<Scalar>::Constant(n, base);
      const ArrayX<Scalar> binary = x.pow(ArrayX<Scalar>::Constant(n, exponent));
      const ArrayX<Scalar> unary = x.pow(exponent);
      const Scalar expected = std::pow(base, exponent);
      for (Index i = 0; i < n; ++i) {
        for (const Scalar actual : {binary(i), unary(i)}) {
          const bool success = numext::abs(actual - expected) <= Scalar(4) * eps * numext::abs(expected);
          all_pass &= success;
          if (!success) {
            std::cout << "pow(" << base << "," << exponent << ") = " << actual << " != " << expected << std::endl;
          }
        }
      }
    }
  }
  VERIFY(all_pass);
}

template <typename Scalar, typename ScalarExponent>
Scalar calc_overflow_threshold(const ScalarExponent exponent) {
  EIGEN_USING_STD(exp2);
  EIGEN_USING_STD(log2);
  EIGEN_STATIC_ASSERT((NumTraits<Scalar>::digits() < 2 * NumTraits<double>::digits()), BASE_TYPE_IS_TOO_BIG);

  if (exponent < 2)
    return NumTraits<Scalar>::highest();
  else {
    // base^e <= highest ==> base <= 2^(log2(highest)/e)
    // For floating-point types, consider the bound for integer values that can be reproduced exactly = 2 ^ digits
    double highest_bits = numext::mini(static_cast<double>(NumTraits<Scalar>::digits()),
                                       static_cast<double>(log2(NumTraits<Scalar>::highest())));
    return static_cast<Scalar>(numext::floor(exp2(highest_bits / static_cast<double>(exponent))));
  }
}

template <typename Base, typename Exponent>
void test_exponent(Exponent exponent) {
  EIGEN_STATIC_ASSERT(NumTraits<Base>::IsInteger, THIS TEST IS ONLY INTENDED FOR BASE INTEGER TYPES)
  const Base max_abs_bases = static_cast<Base>(10000);
  // avoid integer overflow in Base type
  Base threshold = calc_overflow_threshold<Base, Exponent>(numext::abs(exponent));
  // avoid numbers that can't be verified with std::pow
  double double_threshold = calc_overflow_threshold<double, Exponent>(numext::abs(exponent));
  // use the lesser of these two thresholds
  Base testing_threshold =
      static_cast<double>(threshold) < double_threshold ? threshold : static_cast<Base>(double_threshold);
  // test both vectorized and non-vectorized code paths
  const Index array_size = 2 * internal::packet_traits<Base>::size + 1;

  Base max_base = numext::mini(testing_threshold, max_abs_bases);
  Base min_base = negative_or_zero(max_base);

  ArrayX<Base> x(array_size), y(array_size);
  bool all_pass = true;
  for (Base base = min_base; base <= max_base; base++) {
    if (exponent < 0 && base == 0) continue;
    x.setConstant(base);
    y = x.pow(exponent);
    for (Base a : y) {
      Base e = ref_pow<Base, Exponent>::run(base, exponent);
      bool pass = (a == e);
      all_pass &= pass;
      if (!pass) {
        std::cout << "pow(" << base << "," << exponent << ")   =   " << a << " !=  " << e << std::endl;
      }
    }
  }
  VERIFY(all_pass);
}

template <typename Base, typename Exponent>
void int_pow_test_impl() {
  Exponent max_exponent = static_cast<Exponent>(NumTraits<Base>::digits());
  Exponent min_exponent = negative_or_zero(max_exponent);

  for (Exponent exponent = min_exponent; exponent < max_exponent; ++exponent) {
    test_exponent<Base, Exponent>(exponent);
  }
}

template <typename = void>
void float_pow_test() {
  float_pow_test_impl<float, float>();
  float_pow_test_impl<double, double>();
  pow_magnified_log_test<double>();
  pow_near_one_huge_exponent_test<float>();
  pow_near_one_huge_exponent_test<double>();
}

template <typename = void>
void mixed_pow_test() {
  // The following cases will test promoting a smaller exponent type
  // to a wider base type.
  float_pow_test_impl<double, int>();
  float_pow_test_impl<double, float>();
  float_pow_test_impl<float, half>();
  float_pow_test_impl<double, half>();
  float_pow_test_impl<float, bfloat16>();
  float_pow_test_impl<double, bfloat16>();

  // Although in the following cases the exponent cannot be represented exactly
  // in the base type, we do not perform a conversion, but implement
  // the operation using repeated squaring.
  float_pow_test_impl<float, int>();
  float_pow_test_impl<double, long long>();

  // The following cases will test promoting a wider exponent type
  // to a narrower base type. This should compile but would generate a
  // deprecation warning:
  // unary_pow_test<float, double>();
}

template <typename = void>
void int_pow_test() {
  int_pow_test_impl<int, int>();
  int_pow_test_impl<unsigned int, unsigned int>();
  int_pow_test_impl<long long, long long>();
  int_pow_test_impl<unsigned long long, unsigned long long>();

  // Although in the following cases the exponent cannot be represented exactly
  // in the base type, we do not perform a conversion, but implement the
  // operation using repeated squaring.
  int_pow_test_impl<long long, int>();
  int_pow_test_impl<int, unsigned int>();
  int_pow_test_impl<unsigned int, int>();
  int_pow_test_impl<long long, unsigned long long>();
  int_pow_test_impl<unsigned long long, long long>();
}

namespace Eigen {
namespace internal {
template <typename Scalar>
struct test_signbit_op {
  Scalar constexpr operator()(const Scalar& a) const { return numext::signbit(a); }
  template <typename Packet>
  inline Packet packetOp(const Packet& a) const {
    return psignbit(a);
  }
};
template <typename Scalar>
struct functor_traits<test_signbit_op<Scalar>> {
  enum { Cost = 1, PacketAccess = true };  // todo: define HasSignbit flag
};
}  // namespace internal
}  // namespace Eigen

template <typename Scalar>
void signbit_test() {
  const size_t size = 100 * internal::packet_traits<Scalar>::size;
  ArrayX<Scalar> x(size), y(size);
  x.setRandom();
  std::vector<Scalar> special_vals = special_values<Scalar>();
  for (size_t i = 0; i < special_vals.size(); i++) {
    x(2 * i + 0) = special_vals[i];
    x(2 * i + 1) = negative_or_zero(special_vals[i]);
  }
  y = x.unaryExpr(internal::test_signbit_op<Scalar>());

  bool all_pass = true;
  for (size_t i = 0; i < size; i++) {
    const Scalar ref_val = numext::signbit(x(i));
    bool not_same = internal::predux_any(internal::bitwise_helper<Scalar>::bitwise_xor(ref_val, y(i)));
    if (not_same) std::cout << "signbit(" << x(i) << ") != " << y(i) << "\n";
    all_pass = all_pass && !not_same;
  }

  VERIFY(all_pass);
}
template <typename = void>
void signbit_tests() {
  signbit_test<float>();
  signbit_test<double>();
  signbit_test<Eigen::half>();
  signbit_test<Eigen::bfloat16>();
  signbit_test<int8_t>();
  signbit_test<int16_t>();
  signbit_test<int32_t>();
  signbit_test<int64_t>();
}

template <typename ArrayType>
void array_generic(const ArrayType& m) {
  typedef typename ArrayType::Scalar Scalar;
  typedef typename ArrayType::RealScalar RealScalar;
  typedef Array<Scalar, ArrayType::RowsAtCompileTime, 1> ColVectorType;
  typedef Array<Scalar, 1, ArrayType::ColsAtCompileTime> RowVectorType;

  Index rows = m.rows();
  Index cols = m.cols();

  ArrayType m1 = random_for_arithmetic<ArrayType>(rows, cols);
  ArrayType m2 = random_for_arithmetic<ArrayType>(rows, cols), m3(rows, cols);
  ArrayType m4 = m1;  // copy constructor
  VERIFY_IS_APPROX(m1, m4);

  ColVectorType cv1 = random_for_arithmetic<ColVectorType>(rows);
  RowVectorType rv1 = random_for_arithmetic<RowVectorType>(cols);

  Scalar s1 = random_scalar_for_arithmetic<Scalar>(), s2 = random_scalar_for_arithmetic<Scalar>();

  // scalar addition
  VERIFY_IS_APPROX(m1 + s1, s1 + m1);
  VERIFY_IS_APPROX(m1 + s1, ArrayType::Constant(rows, cols, s1) + m1);
  VERIFY_IS_APPROX(s1 - m1, (-m1) + s1);
  VERIFY_IS_APPROX(m1 - s1, m1 - ArrayType::Constant(rows, cols, s1));
  VERIFY_IS_APPROX(s1 - m1, ArrayType::Constant(rows, cols, s1) - m1);
  VERIFY_IS_APPROX((m1 * Scalar(2)) - s2, (m1 + m1) - ArrayType::Constant(rows, cols, s2));
  m3 = m1;
  m3 += s2;
  VERIFY_IS_APPROX(m3, m1 + s2);
  m3 = m1;
  m3 -= s1;
  VERIFY_IS_APPROX(m3, m1 - s1);

  // scalar operators via Maps
  m3 = m1;
  m4 = m1;
  ArrayType::Map(m4.data(), m4.rows(), m4.cols()) -= ArrayType::Map(m2.data(), m2.rows(), m2.cols());
  VERIFY_IS_APPROX(m4, m3 - m2);

  m3 = m1;
  m4 = m1;
  ArrayType::Map(m4.data(), m4.rows(), m4.cols()) += ArrayType::Map(m2.data(), m2.rows(), m2.cols());
  VERIFY_IS_APPROX(m4, m3 + m2);

  m3 = m1;
  m4 = m1;
  ArrayType::Map(m4.data(), m4.rows(), m4.cols()) *= ArrayType::Map(m2.data(), m2.rows(), m2.cols());
  VERIFY_IS_APPROX(m4, m3 * m2);

  m3 = m1;
  m4 = m1;
  m2 = random_for_arithmetic<ArrayType>(rows, cols);
  m2 = (m2 == 0).select(1, m2);
  ArrayType::Map(m4.data(), m4.rows(), m4.cols()) /= ArrayType::Map(m2.data(), m2.rows(), m2.cols());
  VERIFY_IS_APPROX(m4, m3 / m2);

  // reductions
  VERIFY_IS_APPROX(m1.abs().colwise().sum().sum(), m1.abs().sum());
  VERIFY_IS_APPROX(m1.abs().rowwise().sum().sum(), m1.abs().sum());
  using numext::abs;
  VERIFY_IS_MUCH_SMALLER_THAN(abs(m1.colwise().sum().sum() - m1.sum()), m1.abs().sum());
  VERIFY_IS_MUCH_SMALLER_THAN(abs(m1.rowwise().sum().sum() - m1.sum()), m1.abs().sum());
  if (!internal::isMuchSmallerThan(abs(m1.sum() - (m1 + m2).sum()), m1.abs().sum(), test_precision<Scalar>()))
    VERIFY_IS_NOT_APPROX(((m1 + m2).rowwise().sum()).sum(), m1.sum());
  VERIFY_IS_APPROX(m1.colwise().sum(), m1.colwise().redux(internal::scalar_sum_op<Scalar, Scalar>()));

  // vector-wise ops
  m3 = m1;
  VERIFY_IS_APPROX(m3.colwise() += cv1, m1.colwise() + cv1);
  m3 = m1;
  VERIFY_IS_APPROX(m3.colwise() -= cv1, m1.colwise() - cv1);
  m3 = m1;
  VERIFY_IS_APPROX(m3.rowwise() += rv1, m1.rowwise() + rv1);
  m3 = m1;
  VERIFY_IS_APPROX(m3.rowwise() -= rv1, m1.rowwise() - rv1);

  // Conversion from scalar
  VERIFY_IS_APPROX((m3 = s1), ArrayType::Constant(rows, cols, s1));
  VERIFY_IS_APPROX((m3 = 1), ArrayType::Constant(rows, cols, 1));
  VERIFY_IS_APPROX((m3.topLeftCorner(rows, cols) = 1), ArrayType::Constant(rows, cols, 1));
  typedef Array<Scalar, ArrayType::RowsAtCompileTime == Dynamic ? 2 : ArrayType::RowsAtCompileTime,
                ArrayType::ColsAtCompileTime == Dynamic ? 2 : ArrayType::ColsAtCompileTime, ArrayType::Options>
      FixedArrayType;
  {
    FixedArrayType f1(s1);
    VERIFY_IS_APPROX(f1, FixedArrayType::Constant(s1));
    FixedArrayType f2(numext::real(s1));
    VERIFY_IS_APPROX(f2, FixedArrayType::Constant(numext::real(s1)));
    FixedArrayType f3((int)100 * numext::real(s1));
    VERIFY_IS_APPROX(f3, FixedArrayType::Constant((int)100 * numext::real(s1)));
    f1.setRandom();
    FixedArrayType f4(f1.data());
    VERIFY_IS_APPROX(f4, f1);
  }
  {
    FixedArrayType f1{s1};
    VERIFY_IS_APPROX(f1, FixedArrayType::Constant(s1));
    FixedArrayType f2{numext::real(s1)};
    VERIFY_IS_APPROX(f2, FixedArrayType::Constant(numext::real(s1)));
    FixedArrayType f3{(int)100 * numext::real(s1)};
    VERIFY_IS_APPROX(f3, FixedArrayType::Constant((int)100 * numext::real(s1)));
    f1.setRandom();
    FixedArrayType f4{f1.data()};
    VERIFY_IS_APPROX(f4, f1);
  }

  // pow
  VERIFY_IS_APPROX(m1.pow(2), m1.square());
  VERIFY_IS_APPROX(pow(m1, 2), m1.square());
  VERIFY_IS_APPROX(m1.pow(3), m1.cube());
  VERIFY_IS_APPROX(pow(m1, 3), m1.cube());
  VERIFY_IS_APPROX((-m1).pow(3), -m1.cube());
  VERIFY_IS_APPROX(pow(2 * m1, 3), 8 * m1.cube());
  ArrayType exponents = ArrayType::Constant(rows, cols, RealScalar(2));
  VERIFY_IS_APPROX(Eigen::pow(m1, exponents), m1.square());
  VERIFY_IS_APPROX(m1.pow(exponents), m1.square());
  VERIFY_IS_APPROX(Eigen::pow(2 * m1, exponents), 4 * m1.square());
  VERIFY_IS_APPROX((2 * m1).pow(exponents), 4 * m1.square());
  VERIFY_IS_APPROX(Eigen::pow(m1, 2 * exponents), m1.square().square());
  VERIFY_IS_APPROX(m1.pow(2 * exponents), m1.square().square());
  VERIFY_IS_APPROX(Eigen::pow(m1(0, 0), exponents), ArrayType::Constant(rows, cols, m1(0, 0) * m1(0, 0)));

  // Check possible conflicts with 1D ctor
  typedef Array<Scalar, Dynamic, 1> OneDArrayType;
  {
    OneDArrayType o1(rows);
    VERIFY(o1.size() == rows);
    OneDArrayType o2(static_cast<int>(rows));
    VERIFY(o2.size() == rows);
  }
  {
    OneDArrayType o1{rows};
    VERIFY(o1.size() == rows);
    OneDArrayType o4{int(rows)};
    VERIFY(o4.size() == rows);
  }
  // Check possible conflicts with 2D ctor
  typedef Array<Scalar, Dynamic, Dynamic> TwoDArrayType;
  typedef Array<Scalar, 2, 1> ArrayType2;
  {
    TwoDArrayType o1(rows, cols);
    VERIFY(o1.rows() == rows);
    VERIFY(o1.cols() == cols);
    TwoDArrayType o2(static_cast<int>(rows), static_cast<int>(cols));
    VERIFY(o2.rows() == rows);
    VERIFY(o2.cols() == cols);

    ArrayType2 o3(rows, cols);
    VERIFY(o3(0) == RealScalar(rows) && o3(1) == RealScalar(cols));
    ArrayType2 o4(static_cast<int>(rows), static_cast<int>(cols));
    VERIFY(o4(0) == RealScalar(rows) && o4(1) == RealScalar(cols));
  }
  {
    TwoDArrayType o1{rows, cols};
    VERIFY(o1.rows() == rows);
    VERIFY(o1.cols() == cols);
    TwoDArrayType o2{int(rows), int(cols)};
    VERIFY(o2.rows() == rows);
    VERIFY(o2.cols() == cols);

    ArrayType2 o3{rows, cols};
    VERIFY(o3(0) == RealScalar(rows) && o3(1) == RealScalar(cols));
    ArrayType2 o4{int(rows), int(cols)};
    VERIFY(o4(0) == RealScalar(rows) && o4(1) == RealScalar(cols));
  }
}

template <typename ArrayType>
void comparisons(const ArrayType& m) {
  using numext::abs;
  typedef typename ArrayType::Scalar Scalar;
  typedef typename NumTraits<Scalar>::Real RealScalar;

  Index rows = m.rows();
  Index cols = m.cols();

  Index r = internal::random<Index>(0, rows - 1), c = internal::random<Index>(0, cols - 1);

  ArrayType m1 = random_for_arithmetic<ArrayType>(rows, cols), m2 = random_for_arithmetic<ArrayType>(rows, cols),
            m3(rows, cols), m4 = m1;

  m4 = (m4.abs() == Scalar(0)).select(1, m4);

  // use operator overloads with default return type

  VERIFY(((m1 + Scalar(1)) > m1).all());
  VERIFY(((m1 - Scalar(1)) < m1).all());
  if (rows * cols > 1) {
    m3 = m1;
    m3(r, c) += 1;
    VERIFY(!(m1 < m3).all());
    VERIFY(!(m1 > m3).all());
  }
  VERIFY(!(m1 > m2 && m1 < m2).any());
  VERIFY((m1 <= m2 || m1 >= m2).all());

  // comparisons array to scalar
  VERIFY((m1 != (m1(r, c) + 1)).any());
  VERIFY((m1 > (m1(r, c) - 1)).any());
  VERIFY((m1 < (m1(r, c) + 1)).any());
  VERIFY((m1 == m1(r, c)).any());

  // comparisons scalar to array
  VERIFY(((m1(r, c) + 1) != m1).any());
  VERIFY(((m1(r, c) - 1) < m1).any());
  VERIFY(((m1(r, c) + 1) > m1).any());
  VERIFY((m1(r, c) == m1).any());

  // currently, any() / all() are not vectorized, so use VERIFY_IS_CWISE_EQUAL to test vectorized path

  // use typed comparisons, regardless of operator overload behavior
  typename ArrayType::ConstantReturnType typed_true = ArrayType::Constant(rows, cols, Scalar(1));
  // (m1 + Scalar(1)) > m1).all()
  VERIFY_IS_CWISE_EQUAL((m1 + Scalar(1)).cwiseTypedGreater(m1), typed_true);
  // (m1 - Scalar(1)) < m1).all()
  VERIFY_IS_CWISE_EQUAL((m1 - Scalar(1)).cwiseTypedLess(m1), typed_true);
  // (m1 + Scalar(1)) == (m1 + Scalar(1))).all()
  VERIFY_IS_CWISE_EQUAL((m1 + Scalar(1)).cwiseTypedEqual(m1 + Scalar(1)), typed_true);
  // (m1 - Scalar(1)) != m1).all()
  VERIFY_IS_CWISE_EQUAL((m1 - Scalar(1)).cwiseTypedNotEqual(m1), typed_true);
  // (m1 <= m2 || m1 >= m2).all()
  VERIFY_IS_CWISE_EQUAL(m1.cwiseTypedGreaterOrEqual(m2) || m1.cwiseTypedLessOrEqual(m2), typed_true);

  // use boolean comparisons, regardless of operator overload behavior
  ArrayXX<bool>::ConstantReturnType bool_true = ArrayXX<bool>::Constant(rows, cols, true);
  // (m1 + Scalar(1)) > m1).all()
  VERIFY_IS_CWISE_EQUAL((m1 + Scalar(1)).cwiseGreater(m1), bool_true);
  // (m1 - Scalar(1)) < m1).all()
  VERIFY_IS_CWISE_EQUAL((m1 - Scalar(1)).cwiseLess(m1), bool_true);
  // (m1 + Scalar(1)) == (m1 + Scalar(1))).all()
  VERIFY_IS_CWISE_EQUAL((m1 + Scalar(1)).cwiseEqual(m1 + Scalar(1)), bool_true);
  // (m1 - Scalar(1)) != m1).all()
  VERIFY_IS_CWISE_EQUAL((m1 - Scalar(1)).cwiseNotEqual(m1), bool_true);
  // (m1 <= m2 || m1 >= m2).all()
  VERIFY_IS_CWISE_EQUAL(m1.cwiseLessOrEqual(m2) || m1.cwiseGreaterOrEqual(m2), bool_true);

  // test typed comparisons with scalar argument
  VERIFY_IS_CWISE_EQUAL((m1 - m1).cwiseTypedEqual(Scalar(0)), typed_true);
  VERIFY_IS_CWISE_EQUAL((m1.abs() + Scalar(1)).cwiseTypedNotEqual(Scalar(0)), typed_true);
  VERIFY_IS_CWISE_EQUAL((m1 + Scalar(1)).cwiseTypedGreater(m1.minCoeff()), typed_true);
  VERIFY_IS_CWISE_EQUAL((m1 - Scalar(1)).cwiseTypedLess(m1.maxCoeff()), typed_true);
  VERIFY_IS_CWISE_EQUAL(m1.abs().cwiseTypedLessOrEqual(NumTraits<Scalar>::highest()), typed_true);
  VERIFY_IS_CWISE_EQUAL(m1.abs().cwiseTypedGreaterOrEqual(Scalar(0)), typed_true);

  // test boolean comparisons with scalar argument
  VERIFY_IS_CWISE_EQUAL((m1 - m1).cwiseEqual(Scalar(0)), bool_true);
  VERIFY_IS_CWISE_EQUAL((m1.abs() + Scalar(1)).cwiseNotEqual(Scalar(0)), bool_true);
  VERIFY_IS_CWISE_EQUAL((m1 + Scalar(1)).cwiseGreater(m1.minCoeff()), bool_true);
  VERIFY_IS_CWISE_EQUAL((m1 - Scalar(1)).cwiseLess(m1.maxCoeff()), bool_true);
  VERIFY_IS_CWISE_EQUAL(m1.abs().cwiseLessOrEqual(NumTraits<Scalar>::highest()), bool_true);
  VERIFY_IS_CWISE_EQUAL(m1.abs().cwiseGreaterOrEqual(Scalar(0)), bool_true);

  // test select
  VERIFY_IS_APPROX((m1 < m2).select(m1, m2), m1.cwiseMin(m2));
  VERIFY_IS_APPROX((m1 > m2).select(m1, m2), m1.cwiseMax(m2));
  Scalar mid = (m1.cwiseAbs().minCoeff() + m1.cwiseAbs().maxCoeff()) / Scalar(2);
  for (int j = 0; j < cols; ++j)
    for (int i = 0; i < rows; ++i) m3(i, j) = abs(m1(i, j)) < mid ? 0 : m1(i, j);
  VERIFY_IS_APPROX((m1.abs() < ArrayType::Constant(rows, cols, mid)).select(ArrayType::Zero(rows, cols), m1), m3);
  // shorter versions:
  VERIFY_IS_APPROX((m1.abs() < ArrayType::Constant(rows, cols, mid)).select(0, m1), m3);
  VERIFY_IS_APPROX((m1.abs() >= ArrayType::Constant(rows, cols, mid)).select(m1, 0), m3);
  // even shorter version:
  VERIFY_IS_APPROX((m1.abs() < mid).select(0, m1), m3);

  // count
  VERIFY(((m1.abs() + 1) > RealScalar(0.1)).count() == rows * cols);

  // and/or
  VERIFY((m1 < RealScalar(0) && m1 > RealScalar(0)).count() == 0);
  VERIFY((m1 < RealScalar(0) || m1 >= RealScalar(0)).count() == rows * cols);
  RealScalar a = m1.abs().mean();
  VERIFY((m1 < -a || m1 > a).count() == (m1.abs() > a).count());

  typedef Array<Index, Dynamic, 1> ArrayOfIndices;

  // TODO allows colwise/rowwise for array
  VERIFY_IS_APPROX(((m1.abs() + 1) > RealScalar(0.1)).colwise().count(),
                   ArrayOfIndices::Constant(cols, rows).transpose());
  VERIFY_IS_APPROX(((m1.abs() + 1) > RealScalar(0.1)).rowwise().count(), ArrayOfIndices::Constant(rows, cols));

  // simple data type that does not permit implicit conversions
  struct scalar_wrapper {
    Scalar m_data;
    scalar_wrapper() : m_data(0) {}
    explicit scalar_wrapper(Scalar data) : m_data(data) {}
    bool operator==(scalar_wrapper other) const { return m_data == other.m_data; }
  };

  // test bug2966: select did not support some scalar types that forbade implicit conversions from bool
  ArrayX<scalar_wrapper> m5(10);
  m5.setConstant(scalar_wrapper(0));
  m5 = (m5 == scalar_wrapper(0)).select(m5, m5);
}

template <typename ArrayType>
void array_real(const ArrayType& m) {
  using numext::abs;
  using std::sqrt;
  typedef typename ArrayType::Scalar Scalar;
  typedef typename NumTraits<Scalar>::Real RealScalar;

  Index rows = m.rows();
  Index cols = m.cols();

  ArrayType m1 = ArrayType::Random(rows, cols), m2 = ArrayType::Random(rows, cols), m3(rows, cols), m4 = m1;

  // avoid denormalized values so verification doesn't fail on platforms that don't support them
  // denormalized behavior is tested elsewhere (unary_op_test, binary_ops_test)
  const Scalar min = (std::numeric_limits<Scalar>::min)();
  m1 = (m1.abs() < min).select(Scalar(0), m1);
  m2 = (m2.abs() < min).select(Scalar(0), m2);
  m4 = (m4.abs() < min).select(Scalar(1), m4);

  Scalar s1 = internal::random<Scalar>();

  // these tests are mostly to check possible compilation issues with free-functions.
  VERIFY_IS_APPROX(m1.sin(), sin(m1));
  VERIFY_IS_APPROX(m1.cos(), cos(m1));
  VERIFY_IS_APPROX(m1.tan(), tan(m1));
  VERIFY_IS_APPROX(m1.asin(), asin(m1));
  VERIFY_IS_APPROX(m1.acos(), acos(m1));
  VERIFY_IS_APPROX(m1.atan(), atan(m1));
  VERIFY_IS_APPROX(m1.sinh(), sinh(m1));
  VERIFY_IS_APPROX(m1.cosh(), cosh(m1));
  VERIFY_IS_APPROX(m1.tanh(), tanh(m1));
  VERIFY_IS_APPROX(m1.atan2(m2), atan2(m1, m2));

  VERIFY_IS_APPROX(m1.tanh().atanh(), atanh(tanh(m1)));
  VERIFY_IS_APPROX(m1.sinh().asinh(), asinh(sinh(m1)));
  VERIFY_IS_APPROX(m1.cosh().acosh(), acosh(cosh(m1)));
  VERIFY_IS_APPROX(m1.logistic(), logistic(m1));

  VERIFY_IS_APPROX(m1.arg(), arg(m1));
  VERIFY_IS_APPROX(m1.round(), round(m1));
  VERIFY_IS_APPROX(m1.rint(), rint(m1));
  VERIFY_IS_APPROX(m1.floor(), floor(m1));
  VERIFY_IS_APPROX(m1.ceil(), ceil(m1));
  VERIFY_IS_APPROX(m1.trunc(), trunc(m1));
  VERIFY((m1.isNaN() == (Eigen::isnan)(m1)).all());
  VERIFY((m1.isInf() == (Eigen::isinf)(m1)).all());
  VERIFY((m1.isFinite() == (Eigen::isfinite)(m1)).all());
  VERIFY_IS_APPROX(m4.inverse(), inverse(m4));
  VERIFY_IS_APPROX(m1.abs(), abs(m1));
  VERIFY_IS_APPROX(m1.abs2(), abs2(m1));
  VERIFY_IS_APPROX(m1.square(), square(m1));
  VERIFY_IS_APPROX(m1.cube(), cube(m1));
  VERIFY_IS_APPROX(cos(m1 + RealScalar(3) * m2), cos((m1 + RealScalar(3) * m2).eval()));
  VERIFY_IS_APPROX(m1.sign(), sign(m1));
  VERIFY((m1.sqrt().sign().isNaN() == (Eigen::isnan)(sign(sqrt(m1)))).all());

  // avoid inf and NaNs so verification doesn't fail
  m3 = m4.abs();

  VERIFY_IS_APPROX(m3.sqrt(), sqrt(abs(m3)));
  VERIFY_IS_APPROX(m3.cbrt(), cbrt(m3));
  VERIFY_IS_APPROX(m3.rsqrt(), Scalar(1) / sqrt(abs(m3)));
  VERIFY_IS_APPROX(rsqrt(m3), Scalar(1) / sqrt(abs(m3)));
  VERIFY_IS_APPROX(m3.log(), log(m3));
  VERIFY_IS_APPROX(m3.log1p(), log1p(m3));
  VERIFY_IS_APPROX(m3.log10(), log10(m3));
  VERIFY_IS_APPROX(m3.log2(), log2(m3));

  VERIFY((!(m1 > m2) == (m1 <= m2)).all());

  VERIFY_IS_APPROX(sin(m1.asin()), m1);
  VERIFY_IS_APPROX(cos(m1.acos()), m1);
  VERIFY_IS_APPROX(tan(m1.atan()), m1);
  VERIFY_IS_APPROX(sinh(m1), Scalar(0.5) * (exp(m1) - exp(-m1)));
  VERIFY_IS_APPROX(cosh(m1), Scalar(0.5) * (exp(m1) + exp(-m1)));
  VERIFY_IS_APPROX(tanh(m1), (Scalar(0.5) * (exp(m1) - exp(-m1))) / (Scalar(0.5) * (exp(m1) + exp(-m1))));
  VERIFY_IS_APPROX(logistic(m1), (Scalar(1) / (Scalar(1) + exp(-m1))));
  VERIFY_IS_APPROX(arg(m1), ((m1 < Scalar(0)).template cast<Scalar>()) * Scalar(std::acos(Scalar(-1))));
  VERIFY((round(m1) <= ceil(m1) && round(m1) >= floor(m1)).all());
  VERIFY((rint(m1) <= ceil(m1) && rint(m1) >= floor(m1)).all());
  VERIFY(((ceil(m1) - round(m1)) <= Scalar(0.5) || (round(m1) - floor(m1)) <= Scalar(0.5)).all());
  VERIFY(((ceil(m1) - round(m1)) <= Scalar(1.0) && (round(m1) - floor(m1)) <= Scalar(1.0)).all());
  VERIFY(((ceil(m1) - rint(m1)) <= Scalar(0.5) || (rint(m1) - floor(m1)) <= Scalar(0.5)).all());
  VERIFY(((ceil(m1) - rint(m1)) <= Scalar(1.0) && (rint(m1) - floor(m1)) <= Scalar(1.0)).all());
  VERIFY((Eigen::isnan)((m1 * Scalar(0)) / Scalar(0)).all());
  VERIFY((Eigen::isinf)(m4 / Scalar(0)).all());
  VERIFY(((Eigen::isfinite)(m1) && (!(Eigen::isfinite)(m1 * Scalar(0) / Scalar(0))) &&
          (!(Eigen::isfinite)(m4 / Scalar(0))))
             .all());
  VERIFY_IS_APPROX(inverse(inverse(m4)), m4);
  VERIFY((abs(m1) == m1 || abs(m1) == -m1).all());
  VERIFY_IS_APPROX(m3, sqrt(abs2(m3)));
  VERIFY_IS_APPROX(m1.absolute_difference(m2), (m1 > m2).select(m1 - m2, m2 - m1));
  // |(+0) - (-0)| is +0, as on the vectorized path.
  VERIFY(!(std::signbit)(static_cast<double>(numext::absdiff(Scalar(0), -Scalar(0)))));
  // and NaN for (inf, inf), as inf - inf is.
  VERIFY((numext::isnan)(numext::absdiff(NumTraits<Scalar>::infinity(), NumTraits<Scalar>::infinity())));
  VERIFY_IS_APPROX(m1.sign(), -(-m1).sign());
  VERIFY_IS_APPROX(m1 * m1.sign(), m1.abs());
  VERIFY_IS_APPROX(m1.sign() * m1.abs(), m1);

  ArrayType tmp = m1.atan2(m2);
  for (Index i = 0; i < tmp.size(); ++i) {
    Scalar actual = tmp.array()(i);
    Scalar expected = Scalar(std::atan2(m1.array()(i), m2.array()(i)));
    VERIFY_IS_APPROX(actual, expected);
  }

  VERIFY_IS_APPROX(numext::abs2(numext::real(m1)) + numext::abs2(numext::imag(m1)), numext::abs2(m1));
  VERIFY_IS_APPROX(numext::abs2(Eigen::real(m1)) + numext::abs2(Eigen::imag(m1)), numext::abs2(m1));
  if (!NumTraits<Scalar>::IsComplex) VERIFY_IS_APPROX(numext::real(m1), m1);

  // shift argument of logarithm so that it is not zero
  Scalar smallNumber = NumTraits<Scalar>::dummy_precision();
  VERIFY_IS_APPROX((m3 + smallNumber).log(), log(abs(m3) + smallNumber));
  VERIFY_IS_APPROX((m3 + smallNumber + Scalar(1)).log(), log1p(abs(m3) + smallNumber));

  VERIFY_IS_APPROX(m1.exp() * m2.exp(), exp(m1 + m2));
  VERIFY_IS_APPROX(m1.exp(), exp(m1));
  VERIFY_IS_APPROX(m1.exp() / m2.exp(), (m1 - m2).exp());

  VERIFY_IS_APPROX(m1.expm1(), expm1(m1));
  VERIFY_IS_APPROX((m3 + smallNumber).exp() - Scalar(1), expm1(abs(m3) + smallNumber));

  VERIFY_IS_APPROX(m3.pow(RealScalar(0.5)), m3.sqrt());
  VERIFY_IS_APPROX(pow(m3, RealScalar(0.5)), m3.sqrt());
  VERIFY_IS_APPROX(m3.pow(RealScalar(1.0 / 3.0)), m3.cbrt());
  VERIFY_IS_APPROX(pow(m3, RealScalar(1.0 / 3.0)), m3.cbrt());

  VERIFY_IS_APPROX(m3.pow(RealScalar(-0.5)), m3.rsqrt());
  VERIFY_IS_APPROX(pow(m3, RealScalar(-0.5)), m3.rsqrt());

  // Avoid inf and NaN.
  m3 = (m1.square() < NumTraits<Scalar>::epsilon()).select(Scalar(1), m3);
  VERIFY_IS_APPROX(m3.pow(RealScalar(-2)), m3.square().inverse());

  // Test pow and atan2 on special IEEE values.
  unary_ops_test<Scalar>();
  binary_ops_test<Scalar>();

  VERIFY_IS_APPROX(log10(m3), log(m3) / numext::log(Scalar(10)));
  VERIFY_IS_APPROX(log2(m3), log(m3) / numext::log(Scalar(2)));

  // scalar by array division
  const RealScalar tiny = sqrt(std::numeric_limits<RealScalar>::epsilon());
  s1 += Scalar(tiny);
  m1 += ArrayType::Constant(rows, cols, Scalar(tiny));
  VERIFY_IS_CWISE_APPROX(s1 / m1, s1 * m1.inverse());

  // check inplace transpose
  m3 = m1;
  m3.transposeInPlace();
  VERIFY_IS_APPROX(m3, m1.transpose());
  m3.transposeInPlace();
  VERIFY_IS_APPROX(m3, m1);
}

template <typename ArrayType>
void array_complex(const ArrayType& m) {
  typedef typename ArrayType::Scalar Scalar;
  typedef typename NumTraits<Scalar>::Real RealScalar;

  Index rows = m.rows();
  Index cols = m.cols();

  ArrayType m1 = ArrayType::Random(rows, cols), m2(rows, cols), m4 = m1;

  // Clamp m4 so that |m4| >= min_normal, avoiding overflow in inverse(m4).
  // For complex z = a+bi, 1/z = (a-bi)/(a²+b²); if a²+b² underflows to zero
  // (both |a| and |b| below sqrt(min_normal)), the inverse overflows to inf/nan.
  const RealScalar min = (std::numeric_limits<RealScalar>::min)();
  m4 = (m4.abs() < min).select(Scalar(1), m4);

  Array<RealScalar, -1, -1> m3(rows, cols);

  for (Index i = 0; i < m.rows(); ++i)
    for (Index j = 0; j < m.cols(); ++j) m2(i, j) = sqrt(m1(i, j));

  // these tests are mostly to check possible compilation issues with free-functions.
  VERIFY_IS_APPROX(m1.sin(), sin(m1));
  VERIFY_IS_APPROX(m1.cos(), cos(m1));
  VERIFY_IS_APPROX(m1.tan(), tan(m1));
  VERIFY_IS_APPROX(m1.sinh(), sinh(m1));
  VERIFY_IS_APPROX(m1.cosh(), cosh(m1));
  VERIFY_IS_APPROX(m1.tanh(), tanh(m1));
  VERIFY_IS_APPROX(m1.logistic(), logistic(m1));
  VERIFY_IS_APPROX(m1.arg(), arg(m1));
  VERIFY_IS_APPROX(m1.carg(), carg(m1));
  VERIFY_IS_APPROX(arg(m1), carg(m1));
  VERIFY((m1.isNaN() == (Eigen::isnan)(m1)).all());
  VERIFY((m1.isInf() == (Eigen::isinf)(m1)).all());
  VERIFY((m1.isFinite() == (Eigen::isfinite)(m1)).all());
  VERIFY_IS_APPROX(m4.inverse(), inverse(m4));
  VERIFY_IS_APPROX(m1.log(), log(m1));
  VERIFY_IS_APPROX(m1.log10(), log10(m1));
  VERIFY_IS_APPROX(m1.log2(), log2(m1));
  VERIFY_IS_APPROX(m1.abs(), abs(m1));
  VERIFY_IS_APPROX(m1.abs2(), abs2(m1));
  VERIFY_IS_APPROX(m1.sqrt(), sqrt(m1));
  VERIFY_IS_APPROX(m1.square(), square(m1));
  VERIFY_IS_APPROX(m1.cube(), cube(m1));
  VERIFY_IS_APPROX(cos(m1 + RealScalar(3) * m2), cos((m1 + RealScalar(3) * m2).eval()));
  VERIFY_IS_APPROX(m1.sign(), sign(m1));

  VERIFY_IS_APPROX(m1.exp() * m2.exp(), exp(m1 + m2));
  VERIFY_IS_APPROX(m1.exp(), exp(m1));
  VERIFY_IS_APPROX(m1.exp() / m2.exp(), (m1 - m2).exp());

  VERIFY_IS_APPROX(m1.expm1(), expm1(m1));
  VERIFY_IS_APPROX(expm1(m1), exp(m1) - 1.);
  // Check for larger magnitude complex numbers that expm1 matches exp - 1.
  VERIFY_IS_APPROX(expm1(10. * m1), exp(10. * m1) - 1.);

  VERIFY_IS_APPROX(sinh(m1), 0.5 * (exp(m1) - exp(-m1)));
  VERIFY_IS_APPROX(cosh(m1), 0.5 * (exp(m1) + exp(-m1)));
  VERIFY_IS_APPROX(tanh(m1), (0.5 * (exp(m1) - exp(-m1))) / (0.5 * (exp(m1) + exp(-m1))));
  VERIFY_IS_APPROX(logistic(m1), (1.0 / (1.0 + exp(-m1))));
  if (m1.size() > 0) {
    // Complex exponential overflow edge-case.
    Scalar old_m1_val = m1(0, 0);
    m1(0, 0) = std::complex<RealScalar>(1000.0, 1000.0);
    VERIFY_IS_APPROX(logistic(m1), (1.0 / (1.0 + exp(-m1))));
    m1(0, 0) = old_m1_val;  // Restore value for future tests.
  }
  {
    // expm1 where exp(real) overflows: exp(z) - 1 is (inf, 0) and (-inf, -inf), not NaN.
    const RealScalar inf = NumTraits<RealScalar>::infinity();
    const Scalar e0 = numext::expm1(Scalar(inf, RealScalar(0)));
    const Scalar e1 = numext::expm1(Scalar(RealScalar(1000), RealScalar(-2)));
    // Where exp(x) overflows and exp(x) cos(y) does not, and where exp(x) is negligible: exactly -1.
    const RealScalar x_big = numext::log((std::numeric_limits<RealScalar>::max)()) + RealScalar(0.5);
    const RealScalar y_third = RealScalar(EIGEN_PI / 3);
    const Scalar e2 = numext::expm1(Scalar(x_big, y_third));
    VERIFY_IS_APPROX(e2.real(), numext::exp(x_big - RealScalar(EIGEN_LN2)) * (RealScalar(2) * numext::cos(y_third)));
    VERIFY(e2.imag() == inf);
    VERIFY_IS_EQUAL(numext::expm1(Scalar(-inf, RealScalar(EIGEN_PI / 2))), Scalar(RealScalar(-1), RealScalar(0)));
    VERIFY_IS_EQUAL(numext::expm1(Scalar(RealScalar(-200), RealScalar(2))).real(), RealScalar(-1));
    const Scalar e3 = numext::expm1(Scalar(inf, inf));
    VERIFY(e3.real() == inf && (numext::isnan)(e3.imag()));
    VERIFY_IS_EQUAL(numext::expm1(Scalar(-inf, inf)), Scalar(RealScalar(-1), RealScalar(0)));
#if !EIGEN_ARCH_ARM  // 32-bit ARM flushes subnormals.
    // Where exp(x / 2) overflows too, exp(x) sin(y) is still finite for denormal y.
    const RealScalar x_huge = RealScalar(2) * numext::log((std::numeric_limits<RealScalar>::max)()) + RealScalar(1);
    const RealScalar y_tiny = (std::numeric_limits<RealScalar>::min)() / RealScalar(64);
    const Scalar e4 = numext::expm1(Scalar(x_huge, y_tiny));
    const RealScalar q = numext::exp(x_huge / RealScalar(4));
    VERIFY(e4.real() == inf);
    VERIFY_IS_APPROX(e4.imag(), (((q * y_tiny) * q) * q) * q);
#endif
    VERIFY(e0.real() == inf && e0.imag() == RealScalar(0));
    VERIFY(e1.real() == -inf && e1.imag() == -inf);
    // log1p where log(1 + z) is not finite: (inf, 0) and (-inf, 0), not NaN.
    const Scalar l0 = numext::log1p(Scalar(inf, RealScalar(1)));
    const Scalar l1 = numext::log1p(Scalar(RealScalar(-1), RealScalar(0)));
    VERIFY(l0.real() == inf && l0.imag() == RealScalar(0));
    VERIFY(l1.real() == -inf && l1.imag() == RealScalar(0));
    // log2(0) is (-inf, 0) on both the vectorized and the scalar path.
    const Array<Scalar, Dynamic, 1> log2_zero = Array<Scalar, Dynamic, 1>::Zero(17).log2();
    VERIFY((log2_zero.real() == -inf).all() && (log2_zero.imag() == RealScalar(0)).all());
  }

  for (Index i = 0; i < m.rows(); ++i)
    for (Index j = 0; j < m.cols(); ++j) m3(i, j) = std::atan2(m1(i, j).imag(), m1(i, j).real());
  VERIFY_IS_APPROX(arg(m1), m3);
  VERIFY_IS_APPROX(carg(m1), m3);

  std::complex<RealScalar> zero(0.0, 0.0);
  VERIFY((Eigen::isnan)(m1 * zero / zero).all());
  // Complex division by zero may produce inf or NaN depending on the std::complex
  // implementation (algebraic formula gives 0/0=NaN for some components). Only require
  // the result to be non-finite.
  VERIFY((!(Eigen::isfinite)(m4 / zero)).all());

  VERIFY(((Eigen::isfinite)(m1) && (!(Eigen::isfinite)(m1 * zero / zero)) && (!(Eigen::isfinite)(m1 / zero))).all());

  VERIFY_IS_APPROX(inverse(inverse(m4)), m4);
  VERIFY_IS_APPROX(conj(m1.conjugate()), m1);
  VERIFY_IS_APPROX(abs(m1), sqrt(square(m1.real()) + square(m1.imag())));
  VERIFY_IS_APPROX(abs(m1), sqrt(abs2(m1)));
  VERIFY_IS_APPROX(log10(m1), log(m1) / log(10));
  VERIFY_IS_APPROX(log2(m1), log(m1) / log(2));

  VERIFY_IS_APPROX(m1.sign(), -(-m1).sign());
  VERIFY_IS_APPROX(m1.sign() * m1.abs(), m1);

  // scalar by array division
  Scalar s1 = internal::random<Scalar>();
  const RealScalar tiny = std::sqrt(std::numeric_limits<RealScalar>::epsilon());
  s1 += Scalar(tiny);
  m1 += ArrayType::Constant(rows, cols, Scalar(tiny));
  VERIFY_IS_APPROX(s1 / m1, s1 * m1.inverse());

  // check inplace transpose
  m2 = m1;
  m2.transposeInPlace();
  VERIFY_IS_APPROX(m2, m1.transpose());
  m2.transposeInPlace();
  VERIFY_IS_APPROX(m2, m1);
  // Check vectorized inplace transpose.
  ArrayType m5 = ArrayType::Random(131, 131);
  ArrayType m6 = m5;
  m6.transposeInPlace();
  VERIFY_IS_APPROX(m6, m5.transpose());
}

template <typename ArrayType>
void min_max(const ArrayType& m) {
  typedef typename ArrayType::Scalar Scalar;

  Index rows = m.rows();
  Index cols = m.cols();

  ArrayType m1 = ArrayType::Random(rows, cols);

  // min/max with array
  Scalar maxM1 = m1.maxCoeff();
  Scalar minM1 = m1.minCoeff();

  VERIFY_IS_APPROX(ArrayType::Constant(rows, cols, minM1), (m1.min)(ArrayType::Constant(rows, cols, minM1)));
  VERIFY_IS_APPROX(m1, (m1.min)(ArrayType::Constant(rows, cols, maxM1)));

  VERIFY_IS_APPROX(ArrayType::Constant(rows, cols, maxM1), (m1.max)(ArrayType::Constant(rows, cols, maxM1)));
  VERIFY_IS_APPROX(m1, (m1.max)(ArrayType::Constant(rows, cols, minM1)));

  // min/max with scalar input
  VERIFY_IS_APPROX(ArrayType::Constant(rows, cols, minM1), (m1.min)(minM1));
  VERIFY_IS_APPROX(m1, (m1.min)(maxM1));

  VERIFY_IS_APPROX(ArrayType::Constant(rows, cols, maxM1), (m1.max)(maxM1));
  VERIFY_IS_APPROX(m1, (m1.max)(minM1));

  // min/max with various NaN propagation options.
  if (m1.size() > 1 && !NumTraits<Scalar>::IsInteger) {
    m1(0, 0) = NumTraits<Scalar>::quiet_NaN();
    maxM1 = m1.template maxCoeff<PropagateNaN>();
    minM1 = m1.template minCoeff<PropagateNaN>();
    VERIFY((numext::isnan)(maxM1));
    VERIFY((numext::isnan)(minM1));

    maxM1 = m1.template maxCoeff<PropagateNumbers>();
    minM1 = m1.template minCoeff<PropagateNumbers>();
    VERIFY(!(numext::isnan)(maxM1));
    VERIFY(!(numext::isnan)(minM1));
  }
}

// A lambda takes the default functor_traits, so each reference arm stays scalar while the arm under
// test vectorizes. Comparing the reference against the shift expression as well as against the
// assigned result evaluates the expression coefficient-wise, which is the only path that reaches the
// scalar operator() of its functor.
template <typename ArrayType>
struct shift_test_impl {
  using Scalar = typename ArrayType::Scalar;
  static constexpr size_t Size = sizeof(Scalar);
  static constexpr size_t MaxShift = (CHAR_BIT * Size) - 1;

  template <size_t N = 0>
  static inline std::enable_if_t<(N > MaxShift), void> run(const ArrayType&) {}
  template <size_t N = 0>
  static inline std::enable_if_t<(N <= MaxShift), void> run(const ArrayType& m) {
    const Index rows = m.rows();
    const Index cols = m.cols();

    ArrayType m1 = ArrayType::Random(rows, cols), m2(rows, cols), m3(rows, cols);
    // The high bit is what separates an arithmetic right shift from a logical one.
    m1(0, 0) = NumTraits<Scalar>::lowest();
    m1(rows - 1, cols - 1) = NumTraits<Scalar>::highest();

    m2 = m1.unaryExpr([](const Scalar& v) { return numext::logical_shift_left(v, N); });
    m3 = m1.template logicalShiftLeft<N>();
    VERIFY_IS_CWISE_EQUAL(m2, m3);
    VERIFY_IS_CWISE_EQUAL(m2, m1.template logicalShiftLeft<N>());
    VERIFY_IS_CWISE_EQUAL(m2, m1.template shiftLeft<N>());

    m2 = m1.unaryExpr([](const Scalar& v) { return numext::logical_shift_right(v, N); });
    m3 = m1.template logicalShiftRight<N>();
    VERIFY_IS_CWISE_EQUAL(m2, m3);
    VERIFY_IS_CWISE_EQUAL(m2, m1.template logicalShiftRight<N>());

    // Referencing Scalar's own operator>> rather than the numext helper the functor calls keeps this
    // arm independent of the implementation under test, and states the semantics: fill with the sign
    // bit when Scalar is signed and with zero when it is not.
    m2 = m1.unaryExpr([](const Scalar& v) { return static_cast<Scalar>(v >> N); });
    m3 = m1.template arithmeticShiftRight<N>();
    VERIFY_IS_CWISE_EQUAL(m2, m3);
    VERIFY_IS_CWISE_EQUAL(m2, m1.template arithmeticShiftRight<N>());
    VERIFY_IS_CWISE_EQUAL(m2, m1.template shiftRight<N>());

    run<N + 1>(m);
  }
};
template <typename ArrayType>
void shift_test(const ArrayType& m) {
  shift_test_impl<ArrayType>::run(m);
}

template <typename ArrayType>
struct typed_logicals_test_impl {
  using Scalar = typename ArrayType::Scalar;

  static bool scalar_to_bool(const Scalar& x) { return x != Scalar(0); }
  static Scalar bool_to_scalar(bool x) { return x ? Scalar(1) : Scalar(0); }

  static Scalar eval_bool_and(const Scalar& x, const Scalar& y) {
    return bool_to_scalar(scalar_to_bool(x) && scalar_to_bool(y));
  }
  static Scalar eval_bool_or(const Scalar& x, const Scalar& y) {
    return bool_to_scalar(scalar_to_bool(x) || scalar_to_bool(y));
  }
  static Scalar eval_bool_xor(const Scalar& x, const Scalar& y) {
    return bool_to_scalar(scalar_to_bool(x) != scalar_to_bool(y));
  }
  static Scalar eval_bool_not(const Scalar& x) { return bool_to_scalar(!scalar_to_bool(x)); }

  static void run(const ArrayType& m) {
    Index rows = m.rows();
    Index cols = m.cols();

    ArrayType m1(rows, cols), m2(rows, cols), m3(rows, cols), m4(rows, cols);

    m1.setRandom();
    m2.setRandom();
    m1 *= ArrayX<bool>::Random(rows, cols).cast<Scalar>();
    m2 *= ArrayX<bool>::Random(rows, cols).cast<Scalar>();

    // test boolean and
    m3 = m1 && m2;
    m4 = m1.binaryExpr(m2, [](const Scalar& x, const Scalar& y) { return eval_bool_and(x, y); });
    VERIFY_IS_CWISE_EQUAL(m3, m4);
    for (const Scalar& val : m3) VERIFY(val == Scalar(0) || val == Scalar(1));

    // test boolean or
    m3 = m1 || m2;
    m4 = m1.binaryExpr(m2, [](const Scalar& x, const Scalar& y) { return eval_bool_or(x, y); });
    VERIFY_IS_CWISE_EQUAL(m3, m4);
    for (const Scalar& val : m3) VERIFY(val == Scalar(0) || val == Scalar(1));

    // test boolean xor
    m3 = m1.binaryExpr(m2, internal::scalar_boolean_xor_op<Scalar>());
    m4 = m1.binaryExpr(m2, [](const Scalar& x, const Scalar& y) { return eval_bool_xor(x, y); });
    VERIFY_IS_CWISE_EQUAL(m3, m4);
    for (const Scalar& val : m3) VERIFY(val == Scalar(0) || val == Scalar(1));

    // test boolean not
    m3 = !m1;
    m4 = m1.unaryExpr([](const Scalar& x) { return eval_bool_not(x); });
    VERIFY_IS_CWISE_EQUAL(m3, m4);
    for (const Scalar& val : m3) VERIFY(val == Scalar(0) || val == Scalar(1));

    // test something more complicated
    m3 = m1 && m2;
    m4 = !(!m1 || !m2);
    VERIFY_IS_CWISE_EQUAL(m3, m4);

    m3 = m1.binaryExpr(m2, internal::scalar_boolean_xor_op<Scalar>());
    m4 = (!m1).binaryExpr((!m2), internal::scalar_boolean_xor_op<Scalar>());
    VERIFY_IS_CWISE_EQUAL(m3, m4);

    const size_t bytes = size_t(rows) * size_t(cols) * sizeof(Scalar);

    std::vector<uint8_t> m1_buffer(bytes), m2_buffer(bytes), m3_buffer(bytes), m4_buffer(bytes);

    std::memcpy(m1_buffer.data(), m1.data(), bytes);
    std::memcpy(m2_buffer.data(), m2.data(), bytes);

    // test bitwise and
    m3 = m1 & m2;
    std::memcpy(m3_buffer.data(), m3.data(), bytes);
    for (size_t i = 0; i < bytes; i++) VERIFY_IS_EQUAL(m3_buffer[i], uint8_t(m1_buffer[i] & m2_buffer[i]));

    // test bitwise or
    m3 = m1 | m2;
    std::memcpy(m3_buffer.data(), m3.data(), bytes);
    for (size_t i = 0; i < bytes; i++) VERIFY_IS_EQUAL(m3_buffer[i], uint8_t(m1_buffer[i] | m2_buffer[i]));

    // test bitwise xor
    m3 = m1 ^ m2;
    std::memcpy(m3_buffer.data(), m3.data(), bytes);
    for (size_t i = 0; i < bytes; i++) VERIFY_IS_EQUAL(m3_buffer[i], uint8_t(m1_buffer[i] ^ m2_buffer[i]));

    // test bitwise not
    m3 = ~m1;
    std::memcpy(m3_buffer.data(), m3.data(), bytes);
    for (size_t i = 0; i < bytes; i++) VERIFY_IS_EQUAL(m3_buffer[i], uint8_t(~m1_buffer[i]));

    // test something more complicated
    m3 = m1 & m2;
    m4 = ~(~m1 | ~m2);
    std::memcpy(m3_buffer.data(), m3.data(), bytes);
    std::memcpy(m4_buffer.data(), m4.data(), bytes);
    for (size_t i = 0; i < bytes; i++) VERIFY_IS_EQUAL(m3_buffer[i], m4_buffer[i]);

    m3 = m1 ^ m2;
    m4 = (~m1) ^ (~m2);
    std::memcpy(m3_buffer.data(), m3.data(), bytes);
    std::memcpy(m4_buffer.data(), m4.data(), bytes);
    for (size_t i = 0; i < bytes; i++) VERIFY_IS_EQUAL(m3_buffer[i], m4_buffer[i]);
  }
};
template <typename ArrayType>
void typed_logicals_test(const ArrayType& m) {
  typed_logicals_test_impl<ArrayType>::run(m);
}

// Integer scalars are always finite, so isFiniteTyped() must be true (nonzero) everywhere. Only
// truthiness is checked: the exact nonzero value differs between the vectorized path (all-ones
// mask) and the scalar path (1). Regression: the vectorized path used to compare |x| against a
// synthesized "infinity" bit pattern, misclassifying |x| >= 2^(digits-1) for signed types and
// everything for unsigned ones.
template <typename ArrayType>
void integer_typed_predicates_test(const ArrayType& m) {
  typedef typename ArrayType::Scalar Scalar;
  Index rows = m.rows();
  Index cols = m.cols();
  const Scalar values[] = {Scalar(0),
                           Scalar(1),
                           static_cast<Scalar>(-1),
                           Scalar(Scalar(1) << (std::numeric_limits<Scalar>::digits - 1)),
                           NumTraits<Scalar>::highest(),
                           NumTraits<Scalar>::lowest()};
  const Index num_values = sizeof(values) / sizeof(values[0]);
  ArrayType m1(rows, cols);
  for (Index i = 0; i < m1.size(); ++i) m1.coeffRef(i) = values[i % num_values];
  // Materialize so the vectorized assignment path engages.
  ArrayType finite = m1.isFiniteTyped();
  VERIFY((finite != Scalar(0)).all());
}

template <typename SrcType, typename DstType, int RowsAtCompileTime, int ColsAtCompileTime>
struct cast_test_impl {
  using SrcArray = Array<SrcType, RowsAtCompileTime, ColsAtCompileTime>;
  using DstArray = Array<DstType, RowsAtCompileTime, ColsAtCompileTime>;
  struct RandomOp {
    inline SrcType operator()(const SrcType&) const {
      return internal::random_without_cast_overflow<SrcType, DstType>::value();
    }
  };

  static constexpr int SrcPacketSize = internal::packet_traits<SrcType>::size;
  static constexpr int DstPacketSize = internal::packet_traits<DstType>::size;
  static constexpr int MaxPacketSize = internal::plain_enum_max(SrcPacketSize, DstPacketSize);

  static void run() {
    constexpr Index testRows = RowsAtCompileTime == Dynamic ? ((10 * MaxPacketSize) + 1) : RowsAtCompileTime;
    constexpr Index testCols = ColsAtCompileTime == Dynamic ? ((10 * MaxPacketSize) + 1) : ColsAtCompileTime;
    const Index testSize = testRows * testCols;
    const Index minTestSize = 100;
    const Index repeats = numext::div_ceil(minTestSize, testSize);

    SrcArray src(testRows, testCols);
    DstArray dst(testRows, testCols);

    for (Index repeat = 0; repeat < repeats; repeat++) {
      src = src.unaryExpr(RandomOp());
      dst = src.template cast<DstType>();

      for (Index j = 0; j < testCols; j++)
        for (Index i = 0; i < testRows; i++) {
          SrcType srcVal = src(i, j);
          DstType refVal = internal::cast_impl<SrcType, DstType>::run(srcVal);
          DstType dstVal = dst(i, j);
          bool isApprox = verifyIsApprox(dstVal, refVal);
          if (!isApprox)
            std::cout << type_name(srcVal) << ": [" << +srcVal << "] to " << type_name(dstVal) << ": [" << +dstVal
                      << "] != [" << +refVal << "]\n";
          VERIFY(isApprox);
        }
    }
  }
};

template <int RowsAtCompileTime, int ColsAtCompileTime, typename... ScalarTypes>
struct cast_tests_impl {
  using ScalarTuple = std::tuple<ScalarTypes...>;
  static constexpr size_t ScalarTupleSize = std::tuple_size<ScalarTuple>::value;

  template <size_t i = 0, size_t j = i + 1, bool Done = (i >= ScalarTupleSize - 1) || (j >= ScalarTupleSize)>
  static std::enable_if_t<Done> run() {}

  template <size_t i = 0, size_t j = i + 1, bool Done = (i >= ScalarTupleSize - 1) || (j >= ScalarTupleSize)>
  static std::enable_if_t<!Done> run() {
    using Type1 = std::tuple_element_t<i, ScalarTuple>;
    using Type2 = std::tuple_element_t<j, ScalarTuple>;
    cast_test_impl<Type1, Type2, RowsAtCompileTime, ColsAtCompileTime>::run();
    cast_test_impl<Type2, Type1, RowsAtCompileTime, ColsAtCompileTime>::run();
    static constexpr size_t next_i = (j == ScalarTupleSize - 1) ? (i + 1) : (i + 0);
    static constexpr size_t next_j = (j == ScalarTupleSize - 1) ? (i + 2) : (j + 1);
    run<next_i, next_j>();
  }
};

// for now, remove all references to 'long double' until test passes on all platforms
template <int RowsAtCompileTime, int ColsAtCompileTime>
void cast_test() {
  cast_tests_impl<RowsAtCompileTime, ColsAtCompileTime, bool, int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t,
                  uint32_t, uint64_t, float, double, /*long double, */ half, bfloat16>::run();
}

// Floating-point to integer casts truncate toward zero at every packet width.
template <typename SrcType, int Size>
void cast_truncation_test() {
  const Array<SrcType, Size, 1> src = Array<SrcType, Size, 1>::LinSpaced(SrcType(-3.75), SrcType(3.75));
  const Array<int, Size, 1> dst = src.template cast<int>();
  for (Index k = 0; k < Size; ++k) VERIFY_IS_EQUAL(dst(k), static_cast<int>(src(k)));
}

// cast_test compares approximately. A 64-bit integer must round to float once: 2^60 + 2^36 + 1 rounds up, but
// rounding through double first lands on the midpoint 2^60 + 2^36, which ties down to 2^60. Clang before 21 converts
// that way on AArch64 when it vectorizes a scalar loop: without explicit vectorization, for a type with no vectorized
// cast, for the unrolled remainder of a fixed size (14 in the generic backend with 16-byte vectors), and for
// complex<float>, which no backend casts to from int64.
template <typename T, int Size>
void int64_to_float_cast_test(Index size = Size) {
  const bool is_signed = std::is_signed<T>::value;
  // Read through volatile: EIGEN_OPTIMIZATION_BARRIER is empty on MSVC, which folds constant conversions through
  // double.
  const volatile T big_source = (T(1) << 60) + (T(1) << 36) + 1;
  const T big = big_source;
  Array<T, Size, 1> a;
  a.resize(size);
  for (Index i = 0; i < a.size(); ++i) a(i) = is_signed && i % 2 == 0 ? T(0) - big : big;
  const Array<float, Size, 1> f = a.template cast<float>();
  const Array<std::complex<float>, Size, 1> c = a.template cast<std::complex<float>>();
  // 2^60 + 2^37, spelled exactly: MSVC folds a constant int64-to-float conversion through double.
  const float rounded = std::ldexp(1.f + std::ldexp(1.f, -23), 60);
  for (Index i = 0; i < a.size(); ++i) {
    const float expected = is_signed && i % 2 == 0 ? -rounded : rounded;
    VERIFY_IS_EQUAL(f(i), expected);
    VERIFY_IS_EQUAL(c(i), std::complex<float>(expected, 0.f));
  }
}

// Float midpoints 2^e + (k + 1/2) ulp, offset in the low 12 bits, on both sides of 2^53. The reference converts behind
// a barrier, which keeps the compiler from vectorizing it: Clang before 21 does that through double on AArch64.
template <typename T>
void int64_to_float_midpoint_cast_test() {
  using U = std::make_unsigned_t<T>;
  std::vector<T> values = {T((U(1) << 53) - 1), T(U(1) << 53), T((U(1) << 53) + 1), NumTraits<T>::highest()};
  for (int e = 24; e < (std::is_signed<T>::value ? 63 : 64); ++e) {
    for (U k = 0; k < 2; ++k) {
      const U mid = (U(1) << e) + (k << (e - 23)) + (U(1) << (e - 24));
      for (U s : {U(0), U(1), U(0x7ff), U(0x800), U(0x801)}) {
        values.push_back(T(mid + s));
        values.push_back(T(mid - s));
      }
    }
  }
  const size_t count = values.size();
  if (std::is_signed<T>::value) {
    for (size_t i = 0; i < count; ++i) values.push_back(T(-values[i]));
    values.push_back(NumTraits<T>::lowest());
  }
  const ArrayX<T> a = Map<const ArrayX<T>>(values.data(), Index(values.size()));
  const ArrayXf f = a.template cast<float>();
  for (Index i = 0; i < a.size(); ++i) {
    T x = a(i);
    EIGEN_OPTIMIZATION_BARRIER(x);
    VERIFY_IS_EQUAL(f(i), static_cast<float>(x));
  }
}

template <typename = void>
void bool_logical_ops() {
  const Index size = 67;
  ArrayX<bool> lhs = ArrayXi::Random(size) > 0;
  ArrayX<bool> rhs = ArrayXi::Random(size) > 0;
  for (Index i = 0; i < 4; ++i) {
    lhs[i] = lhs[size - 4 + i] = (i & 2) != 0;
    rhs[i] = rhs[size - 4 + i] = (i & 1) != 0;
  }

  ArrayX<bool> actual_and(size), actual_or(size), actual_xor(size), actual_not(size);
  ArrayX<bool> expected_and(size), expected_or(size), expected_xor(size), expected_not(size);
  actual_and = lhs && rhs;
  actual_or = lhs || rhs;
  actual_xor = lhs.binaryExpr(rhs, internal::scalar_boolean_xor_op<bool>());
  actual_not = !lhs;
  for (Index i = 0; i < size; ++i) {
    expected_and[i] = lhs[i] && rhs[i];
    expected_or[i] = lhs[i] || rhs[i];
    expected_xor[i] = lhs[i] != rhs[i];
    expected_not[i] = !lhs[i];
  }
  VERIFY((actual_and == expected_and).all());
  VERIFY((actual_or == expected_or).all());
  VERIFY((actual_xor == expected_xor).all());
  VERIFY((actual_not == expected_not).all());
  VERIFY((lhs + rhs == expected_or).all());
  VERIFY((lhs * rhs == expected_and).all());
  VERIFY(((lhs != rhs) == expected_xor).all());

  ArrayXi difference = lhs.cast<int>() - rhs.cast<int>();
  ArrayXi opposite = -lhs.cast<int>();
  ArrayXi expected_difference(size), expected_opposite(size);
  for (Index i = 0; i < size; ++i) {
    expected_difference[i] = int(lhs[i]) - int(rhs[i]);
    expected_opposite[i] = -int(lhs[i]);
  }
  VERIFY_IS_CWISE_EQUAL(difference, expected_difference);
  VERIFY_IS_CWISE_EQUAL(opposite, expected_opposite);
}

template <typename RealScalar>
void complex_classification() {
  using Complex = std::complex<RealScalar>;
  const RealScalar inf = NumTraits<RealScalar>::infinity();
  const RealScalar nan = NumTraits<RealScalar>::quiet_NaN();

  struct TestCase {
    Complex value;
    bool finite;
    bool infinite;
    bool not_a_number;
  };
  const TestCase test_cases[] = {
      {Complex(0, 0), true, false, false},     {Complex(inf, 0), false, true, false},
      {Complex(0, inf), false, true, false},   {Complex(nan, 0), false, false, true},
      {Complex(0, nan), false, false, true},   {Complex(inf, nan), false, false, true},
      {Complex(nan, inf), false, false, true}, {Complex(-inf, -inf), false, true, false},
      {Complex(nan, nan), false, false, true},
  };

  for (const TestCase& test_case : test_cases) {
    VERIFY_IS_EQUAL((numext::isfinite)(test_case.value), test_case.finite);
    VERIFY_IS_EQUAL((numext::isinf)(test_case.value), test_case.infinite);
    VERIFY_IS_EQUAL((numext::isnan)(test_case.value), test_case.not_a_number);
  }
}

// Coefficient-wise modulus. Integer scalars only.
// Original coverage by @arvsrao in !1705; extended here to the array-array form,
// the scalar-on-the-left form, negative operands, and the 2D and compound-expression cases.
template <typename Scalar>
void modulus_test_impl() {
  // Array % Array, 1D.
  Array<Scalar, 3, 1> a(Scalar(7), Scalar(8), Scalar(9));
  Array<Scalar, 3, 1> b(Scalar(2), Scalar(3), Scalar(4));
  Array<Scalar, 3, 1> expected(Scalar(1), Scalar(2), Scalar(1));
  VERIFY_IS_CWISE_EQUAL(a % b, expected);

  // Array % scalar.
  Array<Scalar, 3, 1> a_mod_2(Scalar(1), Scalar(0), Scalar(1));
  VERIFY_IS_CWISE_EQUAL(a % Scalar(2), a_mod_2);

  // Scalar % Array.
  Array<Scalar, 3, 1> ten_mod_b(Scalar(0), Scalar(1), Scalar(2));
  VERIFY_IS_CWISE_EQUAL(Scalar(10) % b, ten_mod_b);

  // Modulus of a compound expression.
  // (7,8,9) + (2,3,4) = (9,11,13); mod 4 -> (1,3,1)
  Array<Scalar, 3, 1> compound(Scalar(1), Scalar(3), Scalar(1));
  VERIFY_IS_CWISE_EQUAL((a + b) % Scalar(4), compound);

  // Dynamic 2D.
  ArrayXX<Scalar> m(2, 3);
  m << Scalar(0), Scalar(1), Scalar(2), Scalar(3), Scalar(4), Scalar(5);
  ArrayXX<Scalar> m_mod_3(2, 3);
  m_mod_3 << Scalar(0), Scalar(1), Scalar(2), Scalar(0), Scalar(1), Scalar(2);
  VERIFY_IS_CWISE_EQUAL(m % Scalar(3), m_mod_3);
  VERIFY_IS_CWISE_EQUAL(m % ArrayXX<Scalar>::Constant(2, 3, Scalar(3)), m_mod_3);

  // Agreement with the scalar operator, including negative dividends where the
  // sign of the result follows the dividend (C++11 onwards).
  if (NumTraits<Scalar>::IsSigned) {
    Array<Scalar, 4, 1> neg(Scalar(-7), Scalar(-1), Scalar(7), Scalar(0));
    Array<Scalar, 4, 1> div(Scalar(3), Scalar(3), Scalar(-3), Scalar(3));
    for (Index i = 0; i < neg.size(); ++i) {
      VERIFY_IS_EQUAL((neg % div)(i), Scalar(neg(i) % div(i)));
    }
  }

  // Matches a hand-rolled loop over random data.
  ArrayX<Scalar> lhs = ArrayX<Scalar>::Random(37);
  ArrayX<Scalar> rhs = ArrayX<Scalar>::Random(37);
  rhs = (rhs == Scalar(0) || rhs == Scalar(-1)).select(ArrayX<Scalar>::Constant(37, Scalar(1)), rhs);
  ArrayX<Scalar> got = lhs % rhs;
  for (Index i = 0; i < lhs.size(); ++i) {
    VERIFY_IS_EQUAL(got(i), Scalar(lhs(i) % rhs(i)));
  }
}

void modulus_tests() {
  modulus_test_impl<int8_t>();
  modulus_test_impl<int16_t>();
  modulus_test_impl<int>();
  modulus_test_impl<int64_t>();
  modulus_test_impl<uint8_t>();
  modulus_test_impl<uint16_t>();
  modulus_test_impl<uint32_t>();
  modulus_test_impl<uint64_t>();
}

EIGEN_DECLARE_TEST(array_cwise) {
  for (int i = 0; i < g_repeat; i++) {
    CALL_SUBTEST_1(array_generic(Array<float, 1, 1>()));
    CALL_SUBTEST_2(array_generic(Array22f()));
    CALL_SUBTEST_3(array_generic(Array44d()));
    CALL_SUBTEST_4(array_generic(
        ArrayXXcf(internal::random<int>(1, EIGEN_TEST_MAX_SIZE), internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));
    CALL_SUBTEST_5(array_generic(
        ArrayXXf(internal::random<int>(1, EIGEN_TEST_MAX_SIZE), internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));
    CALL_SUBTEST_8(array_generic(
        ArrayXXi(internal::random<int>(1, EIGEN_TEST_MAX_SIZE), internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));
    CALL_SUBTEST_7(array_generic(Array<Index, Dynamic, Dynamic>(internal::random<int>(1, EIGEN_TEST_MAX_SIZE),
                                                                internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));
    CALL_SUBTEST_8(shift_test(
        ArrayXXi(internal::random<int>(1, EIGEN_TEST_MAX_SIZE), internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));
    CALL_SUBTEST_9(shift_test(Array<Index, Dynamic, Dynamic>(internal::random<int>(1, EIGEN_TEST_MAX_SIZE),
                                                             internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));
    // An unsigned Scalar has no sign bit, so its arithmetic right shift must not sign-extend.
    CALL_SUBTEST_38(shift_test(Array<uint32_t, Dynamic, Dynamic>(internal::random<int>(1, EIGEN_TEST_MAX_SIZE),
                                                                 internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));
    CALL_SUBTEST_39(shift_test(Array<uint64_t, Dynamic, Dynamic>(internal::random<int>(1, EIGEN_TEST_MAX_SIZE),
                                                                 internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));
    CALL_SUBTEST_40(shift_test(Array<int8_t, Dynamic, Dynamic>(internal::random<int>(1, EIGEN_TEST_MAX_SIZE),
                                                               internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));
    CALL_SUBTEST_40(shift_test(Array<uint8_t, Dynamic, Dynamic>(internal::random<int>(1, EIGEN_TEST_MAX_SIZE),
                                                                internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));
    // A random dynamic size above only occasionally lands on 4, so it does not reliably exercise
    // the quarter-width NEON packets (Packet4c/Packet4uc); pin a fixed size to cover them every run.
    CALL_SUBTEST_40(shift_test(Array<int8_t, 4, 1>()));
    CALL_SUBTEST_40(shift_test(Array<uint8_t, 4, 1>()));
    CALL_SUBTEST_41(shift_test(Array<int16_t, Dynamic, Dynamic>(internal::random<int>(1, EIGEN_TEST_MAX_SIZE),
                                                                internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));
    CALL_SUBTEST_41(shift_test(Array<uint16_t, Dynamic, Dynamic>(internal::random<int>(1, EIGEN_TEST_MAX_SIZE),
                                                                 internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));
    CALL_SUBTEST_10(array_generic(Array<uint32_t, Dynamic, Dynamic>(internal::random<int>(1, EIGEN_TEST_MAX_SIZE),
                                                                    internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));
    CALL_SUBTEST_11(array_generic(Array<uint64_t, Dynamic, Dynamic>(internal::random<int>(1, EIGEN_TEST_MAX_SIZE),
                                                                    internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));
  }
  for (int i = 0; i < g_repeat; i++) {
    CALL_SUBTEST_1(comparisons(Array<float, 1, 1>()));
    CALL_SUBTEST_2(comparisons(Array22f()));
    CALL_SUBTEST_3(comparisons(Array44d()));
    CALL_SUBTEST_7(comparisons(
        ArrayXXf(internal::random<int>(1, EIGEN_TEST_MAX_SIZE), internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));
    CALL_SUBTEST_8(comparisons(
        ArrayXXi(internal::random<int>(1, EIGEN_TEST_MAX_SIZE), internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));
  }
  for (int i = 0; i < g_repeat; i++) {
    CALL_SUBTEST_6(min_max(Array<float, 1, 1>()));
    CALL_SUBTEST_7(min_max(Array22f()));
    CALL_SUBTEST_8(min_max(Array44d()));
    CALL_SUBTEST_9(min_max(
        ArrayXXf(internal::random<int>(1, EIGEN_TEST_MAX_SIZE), internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));
    CALL_SUBTEST_10(min_max(
        ArrayXXi(internal::random<int>(1, EIGEN_TEST_MAX_SIZE), internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));
  }
  for (int i = 0; i < g_repeat; i++) {
    CALL_SUBTEST_11(array_real(Array<float, 1, 1>()));
    CALL_SUBTEST_12(array_real(Array22f()));
    CALL_SUBTEST_13(array_real(Array44d()));
    CALL_SUBTEST_14(array_real(
        ArrayXXf(internal::random<int>(1, EIGEN_TEST_MAX_SIZE), internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));
    CALL_SUBTEST_15(array_real(Array<Eigen::half, 32, 32>()));
    CALL_SUBTEST_16(array_real(Array<Eigen::bfloat16, 32, 32>()));
  }
  for (int i = 0; i < g_repeat; i++) {
    CALL_SUBTEST_17(array_complex(
        ArrayXXcf(internal::random<int>(1, EIGEN_TEST_MAX_SIZE), internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));
    CALL_SUBTEST_18(array_complex(
        ArrayXXcd(internal::random<int>(1, EIGEN_TEST_MAX_SIZE), internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));
  }
  CALL_SUBTEST_17(complex_classification<float>());
  CALL_SUBTEST_18(complex_classification<double>());
  CALL_SUBTEST_18(complex_classification<long double>());

  for (int i = 0; i < g_repeat; i++) {
    CALL_SUBTEST_19(float_pow_test<>());
    CALL_SUBTEST_20(int_pow_test<>());
    CALL_SUBTEST_21(mixed_pow_test<>());
    CALL_SUBTEST_22(signbit_tests<>());
  }
  for (int i = 0; i < g_repeat; i++) {
    CALL_SUBTEST_34(ldexp_test<float>());
    CALL_SUBTEST_35(ldexp_test<double>());
    CALL_SUBTEST_36(ldexp_test<Eigen::half>());
    CALL_SUBTEST_37(ldexp_test<Eigen::bfloat16>());
  }
  for (int i = 0; i < g_repeat; i++) {
    CALL_SUBTEST_23(typed_logicals_test(ArrayX<int>(internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));
    CALL_SUBTEST_23(integer_typed_predicates_test(ArrayX<int>(internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));
    CALL_SUBTEST_23(integer_typed_predicates_test(ArrayXX<int64_t>(internal::random<int>(1, EIGEN_TEST_MAX_SIZE),
                                                                   internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));
    CALL_SUBTEST_23(integer_typed_predicates_test(ArrayX<uint32_t>(internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));
    CALL_SUBTEST_24(typed_logicals_test(ArrayX<float>(internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));
    CALL_SUBTEST_25(typed_logicals_test(ArrayX<double>(internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));
    CALL_SUBTEST_26(typed_logicals_test(ArrayX<std::complex<float>>(internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));
    CALL_SUBTEST_27(typed_logicals_test(ArrayX<std::complex<double>>(internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));
    CALL_SUBTEST_42(bool_logical_ops<>());
    CALL_SUBTEST_43(modulus_tests());
  }

  for (int i = 0; i < g_repeat; i++) {
    CALL_SUBTEST_28((cast_test<1, 1>()));
    CALL_SUBTEST_28((cast_truncation_test<double, 4>()));
    CALL_SUBTEST_28((cast_truncation_test<double, 8>()));
    CALL_SUBTEST_28((cast_truncation_test<double, 16>()));
    CALL_SUBTEST_28((cast_truncation_test<float, 16>()));
    // QEMU, which runs the ppc64le tests, emulates xscvsxdsp and xscvuxdsp through double, so they round twice.
#if !EIGEN_ARCH_PPC
    CALL_SUBTEST_28((int64_to_float_cast_test<int64_t, Dynamic>(17)));
    CALL_SUBTEST_28((int64_to_float_cast_test<int64_t, 14>()));
    CALL_SUBTEST_28(int64_to_float_midpoint_cast_test<int64_t>());
    CALL_SUBTEST_28((int64_to_float_cast_test<uint64_t, Dynamic>(17)));
    CALL_SUBTEST_28((int64_to_float_cast_test<uint64_t, 14>()));
    CALL_SUBTEST_28(int64_to_float_midpoint_cast_test<uint64_t>());
#endif
    CALL_SUBTEST_29((cast_test<3, 1>()));
    CALL_SUBTEST_30((cast_test<5, 1>()));
    CALL_SUBTEST_31((cast_test<9, 1>()));
    CALL_SUBTEST_32((cast_test<17, 1>()));
    CALL_SUBTEST_33((cast_test<Dynamic, 1>()));
  }

  VERIFY((std::is_same<internal::global_math_functions_filtering_base<int>::type, int>::value));
  VERIFY((std::is_same<internal::global_math_functions_filtering_base<float>::type, float>::value));
  VERIFY((std::is_same<internal::global_math_functions_filtering_base<Array2i>::type, ArrayBase<Array2i>>::value));
  typedef CwiseUnaryOp<internal::scalar_abs_op<double>, ArrayXd> Xpr;
  VERIFY((std::is_same<internal::global_math_functions_filtering_base<Xpr>::type, ArrayBase<Xpr>>::value));
}
