// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>
// Copyright (C) 2015 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

#define TEST_ENABLE_TEMPORARY_TRACKING
#define EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD 8
// ^^ see bug 1449

#include "main.h"

template <typename MatrixType>
void matrixRedux(const MatrixType& m) {
  typedef typename MatrixType::Scalar Scalar;
  typedef typename MatrixType::RealScalar RealScalar;

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

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

  // The entries of m1 are uniformly distributed in [-1,1), so m1.prod() is very small. This may lead to test
  // failures if we underflow into denormals. Thus, we scale so that entries are close to 1.
  MatrixType m1_for_prod = MatrixType::Ones(rows, cols) + RealScalar(0.2) * m1;

  Matrix<Scalar, MatrixType::RowsAtCompileTime, MatrixType::RowsAtCompileTime> m2(rows, rows);
  m2.setRandom();
  // Prevent overflows for integer types.
  if (Eigen::NumTraits<Scalar>::IsInteger) {
    Scalar kMaxVal = Scalar(8);
    m1.array() = m1.array() - kMaxVal * (m1.array() / kMaxVal);
    m2.array() = m2.array() - kMaxVal * (m2.array() / kMaxVal);
  }

  VERIFY_IS_EQUAL(MatrixType::Zero(rows, cols).sum(), Scalar(0));
  Scalar sizeAsScalar = internal::cast<Index, Scalar>(rows * cols);
  VERIFY_IS_APPROX(MatrixType::Ones(rows, cols).sum(), sizeAsScalar);
  Scalar s(0), p(1), minc(numext::real(m1.coeff(0))), maxc(numext::real(m1.coeff(0)));
  for (int j = 0; j < cols; j++)
    for (int i = 0; i < rows; i++) {
      s += m1(i, j);
      p *= m1_for_prod(i, j);
      minc = (std::min)(numext::real(minc), numext::real(m1(i, j)));
      maxc = (std::max)(numext::real(maxc), numext::real(m1(i, j)));
    }
  const Scalar mean = s / Scalar(RealScalar(rows * cols));

  VERIFY_IS_APPROX(m1.sum(), s);
  VERIFY_IS_APPROX(m1.mean(), mean);
  VERIFY_IS_APPROX(m1_for_prod.prod(), p);
  VERIFY_IS_APPROX(m1.real().minCoeff(), numext::real(minc));
  VERIFY_IS_APPROX(m1.real().maxCoeff(), numext::real(maxc));

  // test that partial reduction works if nested expressions is forced to evaluate early
  VERIFY_IS_APPROX((m1.matrix() * m1.matrix().transpose()).cwiseProduct(m2.matrix()).rowwise().sum().sum(),
                   (m1.matrix() * m1.matrix().transpose()).eval().cwiseProduct(m2.matrix()).rowwise().sum().sum());

  // test slice vectorization assuming assign is ok
  Index r0 = internal::random<Index>(0, rows - 1);
  Index c0 = internal::random<Index>(0, cols - 1);
  Index r1 = internal::random<Index>(r0 + 1, rows) - r0;
  Index c1 = internal::random<Index>(c0 + 1, cols) - c0;
  VERIFY_IS_APPROX(m1.block(r0, c0, r1, c1).sum(), m1.block(r0, c0, r1, c1).eval().sum());
  VERIFY_IS_APPROX(m1.block(r0, c0, r1, c1).mean(), m1.block(r0, c0, r1, c1).eval().mean());
  VERIFY_IS_APPROX(m1_for_prod.block(r0, c0, r1, c1).prod(), m1_for_prod.block(r0, c0, r1, c1).eval().prod());
  VERIFY_IS_APPROX(m1.block(r0, c0, r1, c1).real().minCoeff(), m1.block(r0, c0, r1, c1).real().eval().minCoeff());
  VERIFY_IS_APPROX(m1.block(r0, c0, r1, c1).real().maxCoeff(), m1.block(r0, c0, r1, c1).real().eval().maxCoeff());

  // regression for bug 1090
  constexpr int R1 = MatrixType::RowsAtCompileTime >= 2 ? MatrixType::RowsAtCompileTime / 2 : 6;
  constexpr int C1 = MatrixType::ColsAtCompileTime >= 2 ? MatrixType::ColsAtCompileTime / 2 : 6;
  if (R1 <= rows - r0 && C1 <= cols - c0) {
    VERIFY_IS_APPROX((m1.template block<R1, C1>(r0, c0).sum()), m1.block(r0, c0, R1, C1).sum());
  }

  // test empty objects
  VERIFY_IS_APPROX(m1.block(r0, c0, 0, 0).sum(), Scalar(0));
  VERIFY_IS_APPROX(m1.block(r0, c0, 0, 0).prod(), Scalar(1));

  // test nesting complex expression
  VERIFY_EVALUATION_COUNT((m1.matrix() * m1.matrix().transpose()).sum(),
                          (MatrixType::IsVectorAtCompileTime && MatrixType::SizeAtCompileTime != 1 ? 0 : 1));
  VERIFY_EVALUATION_COUNT(((m1.matrix() * m1.matrix().transpose()) + m2).sum(),
                          (MatrixType::IsVectorAtCompileTime && MatrixType::SizeAtCompileTime != 1 ? 0 : 1));
}

template <typename VectorType>
void vectorRedux(const VectorType& w) {
  using std::abs;
  typedef typename VectorType::Scalar Scalar;
  typedef typename NumTraits<Scalar>::Real RealScalar;
  Index size = w.size();

  VectorType v = VectorType::Random(size);
  VectorType v_for_prod = VectorType::Ones(size) + Scalar(0.2) * v;  // see comment above declaration of m1_for_prod
  if (Eigen::NumTraits<Scalar>::IsInteger) {
    Scalar kMaxVal = Scalar(8);
    v.array() = v.array() - kMaxVal * (v.array() / kMaxVal);
    v_for_prod = VectorType::Ones(size) + Scalar(0.2) * v;
  }

  for (int i = 1; i < size; i++) {
    Scalar s(0), p(1);
    RealScalar minc(numext::real(v.coeff(0))), maxc(numext::real(v.coeff(0)));
    for (int j = 0; j < i; j++) {
      s += v[j];
      p *= v_for_prod[j];
      minc = (std::min)(minc, numext::real(v[j]));
      maxc = (std::max)(maxc, numext::real(v[j]));
    }
    VERIFY_IS_MUCH_SMALLER_THAN(abs(s - v.head(i).sum()), Scalar(1));
    VERIFY_IS_APPROX(p, v_for_prod.head(i).prod());
    VERIFY_IS_APPROX(minc, v.real().head(i).minCoeff());
    VERIFY_IS_APPROX(maxc, v.real().head(i).maxCoeff());
  }

  for (int i = 0; i < size - 1; i++) {
    Scalar s(0), p(1);
    RealScalar minc(numext::real(v.coeff(i))), maxc(numext::real(v.coeff(i)));
    for (int j = i; j < size; j++) {
      s += v[j];
      p *= v_for_prod[j];
      minc = (std::min)(minc, numext::real(v[j]));
      maxc = (std::max)(maxc, numext::real(v[j]));
    }
    VERIFY_IS_MUCH_SMALLER_THAN(abs(s - v.tail(size - i).sum()), Scalar(1));
    VERIFY_IS_APPROX(p, v_for_prod.tail(size - i).prod());
    VERIFY_IS_APPROX(minc, v.real().tail(size - i).minCoeff());
    VERIFY_IS_APPROX(maxc, v.real().tail(size - i).maxCoeff());
  }

  for (int i = 0; i < size / 2; i++) {
    Scalar s(0), p(1);
    RealScalar minc(numext::real(v.coeff(i))), maxc(numext::real(v.coeff(i)));
    for (int j = i; j < size - i; j++) {
      s += v[j];
      p *= v_for_prod[j];
      minc = (std::min)(minc, numext::real(v[j]));
      maxc = (std::max)(maxc, numext::real(v[j]));
    }
    VERIFY_IS_MUCH_SMALLER_THAN(abs(s - v.segment(i, size - 2 * i).sum()), Scalar(1));
    VERIFY_IS_APPROX(p, v_for_prod.segment(i, size - 2 * i).prod());
    VERIFY_IS_APPROX(minc, v.real().segment(i, size - 2 * i).minCoeff());
    VERIFY_IS_APPROX(maxc, v.real().segment(i, size - 2 * i).maxCoeff());
  }

  // test empty objects
  VERIFY_IS_APPROX(v.head(0).sum(), Scalar(0));
  VERIFY_IS_APPROX(v.tail(0).prod(), Scalar(1));
  VERIFY_RAISES_ASSERT(v.head(0).mean());
  VERIFY_RAISES_ASSERT(v.head(0).minCoeff());
  VERIFY_RAISES_ASSERT(v.head(0).maxCoeff());
}

void boolRedux(Index rows, Index cols) {
  // Test boolean reductions: all(), any(), count()
  typedef Array<bool, Dynamic, Dynamic> BoolArray;

  // All-true
  BoolArray all_true = BoolArray::Constant(rows, cols, true);
  VERIFY(all_true.all());
  VERIFY(all_true.any());
  VERIFY_IS_EQUAL(all_true.count(), rows * cols);

  // All-false
  BoolArray all_false = BoolArray::Constant(rows, cols, false);
  if (rows > 0 && cols > 0) {
    VERIFY(!all_false.all());
    VERIFY(!all_false.any());
  }
  VERIFY_IS_EQUAL(all_false.count(), Index(0));

  // Mixed: set a checkerboard pattern
  BoolArray mixed(rows, cols);
  Index expected_count = 0;
  for (Index j = 0; j < cols; ++j)
    for (Index i = 0; i < rows; ++i) {
      mixed(i, j) = ((i + j) % 2 == 0);
      if (mixed(i, j)) expected_count++;
    }
  VERIFY_IS_EQUAL(mixed.count(), expected_count);
  if (rows > 0 && cols > 0) {
    BoolArray random = BoolArray::Random(rows, cols);
    BoolArray last_false = all_true;
    last_false(rows - 1, cols - 1) = false;
    BoolArray last_true = all_false;
    last_true(rows - 1, cols - 1) = true;
    VERIFY(mixed.any());
    VERIFY(mixed.all() == (expected_count == rows * cols));
    VERIFY(!last_false.all());
    VERIFY_IS_EQUAL(last_false.any(), rows * cols > 1);
    VERIFY(last_true.any());
    VERIFY_IS_EQUAL(last_true.all(), rows * cols == 1);
    VERIFY_IS_EQUAL(random.sum(), random.any());
    VERIFY_IS_EQUAL(random.prod(), random.all());
  }

  // Partial reductions
  if (rows > 0 && cols > 0) {
    auto col_counts = mixed.colwise().count();
    for (Index k = 0; k < cols; ++k) VERIFY_IS_EQUAL(col_counts(k), mixed.col(k).count());
    auto row_counts = mixed.rowwise().count();
    for (Index k = 0; k < rows; ++k) VERIFY_IS_EQUAL(row_counts(k), mixed.row(k).count());
  }
}

// Compare the vectorized reductions of v against scalar references. v_for_prod carries the same
// values shifted near one, so that prod() neither underflows (float) nor overflows (int).
template <typename VecType>
void redux_vec_boundary_check(const VecType& v, const VecType& v_for_prod) {
  typedef typename VecType::Scalar Scalar;
  const Index n = v.size();
  Scalar ref_sum(0), ref_prod(1);
  typename NumTraits<Scalar>::Real ref_min = numext::real(v(0)), ref_max = numext::real(v(0));
  for (Index k = 0; k < n; ++k) {
    ref_sum += v(k);
    ref_prod *= v_for_prod(k);
    ref_min = (std::min)(ref_min, numext::real(v(k)));
    ref_max = (std::max)(ref_max, numext::real(v(k)));
  }
  VERIFY_IS_APPROX(v.sum(), ref_sum);
  VERIFY_IS_APPROX(v_for_prod.prod(), ref_prod);
  VERIFY_IS_APPROX(v.real().minCoeff(), ref_min);
  VERIFY_IS_APPROX(v.real().maxCoeff(), ref_max);
}

// Test reductions at sizes that hit vectorization boundaries in Redux.h:
// LinearVectorizedTraversal with a 4-way unrolled packet loop, scalar pre/post loops.
template <typename Scalar>
void redux_vec_boundary() {
  const Index PS = internal::packet_traits<Scalar>::size;
  // Critical sizes: around packet multiples, at the 4-way unroll boundary, and at each of the one-,
  // two- and three-packet residuals that the 4-way loop leaves to the straight-line merge.
  const Index sizes[] = {1,          PS - 1, PS,         PS + 1, 2 * PS - 1, 2 * PS, 2 * PS + 1, 3 * PS,    3 * PS + 1,
                         4 * PS - 1, 4 * PS, 4 * PS + 1, 5 * PS, 6 * PS,     7 * PS, 8 * PS,     8 * PS + 1};
  typedef Matrix<Scalar, Dynamic, 1> Vec;
  for (const Index n : sizes) {
    if (n <= 0) continue;
    Vec v = Vec::Random(n);
    // For prod, use values near 1 to avoid underflow (float) or overflow (int).
    Vec v_for_prod = Vec::Ones(n) + Scalar(typename NumTraits<Scalar>::Real(0.2)) * v;
    redux_vec_boundary_check(v, v_for_prod);

    // Vec::Random() is always default-aligned, so a Map at a non-zero offset is the only way to
    // reach alignedStart > 0 together with the 4-way loop.
    Vec buf = Vec::Random(n + PS);
    Vec buf_for_prod = Vec::Ones(n + PS) + Scalar(typename NumTraits<Scalar>::Real(0.2)) * buf;
    for (Index offset = 1; offset < PS; ++offset) {
      Map<const Vec, Unaligned> mapped(buf.data() + offset, n);
      Map<const Vec, Unaligned> mapped_for_prod(buf_for_prod.data() + offset, n);
      redux_vec_boundary_check(mapped, mapped_for_prod);
    }
    {
      using RealScalar = typename NumTraits<Scalar>::Real;
      Matrix<RealScalar, Dynamic, 1> raw_buf(2 * n + 1);
      Matrix<RealScalar, Dynamic, 1> raw_buf_for_prod(2 * n + 1);
      Map<Vec, Unaligned> mapped(reinterpret_cast<Scalar*>(raw_buf.data() + 1), n);
      Map<Vec, Unaligned> mapped_for_prod(reinterpret_cast<Scalar*>(raw_buf_for_prod.data() + 1), n);
      mapped = v;
      mapped_for_prod = v_for_prod;
      redux_vec_boundary_check(mapped, mapped_for_prod);
    }
  }
}

// Test block reductions at sizes that hit the boundaries of SliceVectorizedTraversal in Redux.h:
// panels of one to eight packets, the 4-way unroll inside a panel and each of its residuals, and
// the narrow panels whose accumulators have to come from the outer dimension instead.
template <typename Scalar>
void redux_block_boundary() {
  const Index PS = internal::packet_traits<Scalar>::size;
  typedef Matrix<Scalar, Dynamic, Dynamic> Mat;
  typedef typename NumTraits<Scalar>::Real RealScalar;
  const Index innerSizes[] = {1,      PS - 1, PS,     PS + 1, 2 * PS,     3 * PS,    4 * PS - 1,
                              4 * PS, 5 * PS, 6 * PS, 7 * PS, 8 * PS - 1, 8 * PS + 1};
  // Panel counts below, at and above the four the outer-dimension accumulators consume at a time.
  const Index outerSizes[] = {1, 2, 3, 4, 5, 8, 9};
  for (const Index rows : innerSizes) {
    if (rows <= 0) continue;  // PS - 1 where Scalar is not vectorized
    for (const Index cols : outerSizes) {
      // A strict sub-block keeps the reduction off the linear path.
      Mat m = Mat::Random(rows + 3, cols + 3);
      Scalar ref_sum(0);
      RealScalar ref_min = numext::real(m(0, 0)), ref_max = numext::real(m(0, 0)), ref_sqnorm(0);
      for (Index j = 0; j < cols; ++j)
        for (Index i = 0; i < rows; ++i) {
          ref_sum += m(i, j);
          ref_sqnorm += numext::abs2(m(i, j));
          ref_min = (std::min)(ref_min, numext::real(m(i, j)));
          ref_max = (std::max)(ref_max, numext::real(m(i, j)));
        }
      VERIFY_IS_APPROX(m.block(0, 0, rows, cols).sum(), ref_sum);
      VERIFY_IS_APPROX(m.block(0, 0, rows, cols).squaredNorm(), ref_sqnorm);
      VERIFY_IS_APPROX(m.block(0, 0, rows, cols).real().minCoeff(), ref_min);
      VERIFY_IS_APPROX(m.block(0, 0, rows, cols).real().maxCoeff(), ref_max);
    }
  }
}

// Test reductions on strided (non-contiguous) mapped data.
// This exercises SliceVectorizedTraversal or DefaultTraversal in Redux.h
// depending on stride and packet size.
template <typename Scalar>
void redux_strided() {
  const Index n = 64;
  typedef Matrix<Scalar, Dynamic, 1> Vec;
  Vec data = Vec::Random(2 * n);
  // Map with inner stride of 2 — every other element
  Map<Vec, 0, InnerStride<2>> strided(data.data(), n);
  Scalar ref_sum(0);
  typename NumTraits<Scalar>::Real ref_min = numext::real(strided(0)), ref_max = numext::real(strided(0));
  for (Index k = 0; k < n; ++k) {
    ref_sum += strided(k);
    ref_min = (std::min)(ref_min, numext::real(strided(k)));
    ref_max = (std::max)(ref_max, numext::real(strided(k)));
  }
  VERIFY_IS_APPROX(strided.sum(), ref_sum);
  VERIFY_IS_APPROX(strided.real().minCoeff(), ref_min);
  VERIFY_IS_APPROX(strided.real().maxCoeff(), ref_max);

  // Also test reduction on a non-contiguous matrix block (SliceVectorizedTraversal)
  typedef Matrix<Scalar, Dynamic, Dynamic> Mat;
  Mat m = Mat::Random(16, 16);
  for (Index bsz = 1; bsz <= 8; bsz *= 2) {
    Scalar block_sum(0);
    for (Index j = 0; j < bsz; ++j)
      for (Index i = 0; i < bsz; ++i) block_sum += m(1 + i, 1 + j);
    VERIFY_IS_APPROX(m.block(1, 1, bsz, bsz).sum(), block_sum);
  }
}

// redux() documents that its functor must be associative; it is not required to be commutative.
// An implementation may therefore re-associate, but must not reorder the operands. These two
// functors are associative and non-commutative: each projects onto one end of the operand
// sequence, so together they pin both ends of the traversal order. Independent per-lane
// accumulators, for instance, leave keep_first intact but move keep_last onto whichever lane
// happens to end last. Sizes straddle the unrolled block, its ragged tail, and the fallback.
struct keep_first_op {
  template <typename Scalar>
  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar& a, const Scalar& /*b*/) const {
    return a;
  }
};

struct keep_last_op {
  template <typename Scalar>
  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar& /*a*/, const Scalar& b) const {
    return b;
  }
};

template <typename Scalar>
void redux_operand_order() {
  typedef Matrix<Scalar, Dynamic, 1> Vec;
  typedef Matrix<Scalar, Dynamic, Dynamic> Mat;
  // Sizes straddle the small-size fallback, the ordered-tree cutoff, and its ragged tail.
  const Index sizes[] = {1, 2, 5, 7, 8, 9, 15, 16, 17, 23, 24, 31, 32, 33, 64, 129, 191, 192, 193, 250};
  keep_first_op first;
  keep_last_op last;
  for (int si = 0; si < 20; ++si) {
    const Index n = sizes[si];
    // Distinct values so that any reordering is observable.
    Vec v(n);
    for (Index i = 0; i < n; ++i) v.coeffRef(i) = Scalar(i + 1);
    // LinearTraversal: operands run 0 .. n-1.
    VERIFY_IS_EQUAL(v.redux(first), v.coeff(0));
    VERIFY_IS_EQUAL(v.redux(last), v.coeff(n - 1));

    // DefaultTraversal: a non-inner-panel block drops LinearAccessBit, and is traversed
    // outer-then-inner, so the operands run from (0,0) to (innerSize-1, outerSize-1).
    Mat m(n + 1, n + 1);
    for (Index c = 0; c < n + 1; ++c)
      for (Index r = 0; r < n + 1; ++r) m.coeffRef(r, c) = Scalar(c * (n + 1) + r + 1);
    Block<Mat, Dynamic, Dynamic, false> b(m, 1, 1, n, n);
    VERIFY_IS_EQUAL(b.redux(first), b.coeff(0, 0));
    VERIFY_IS_EQUAL(b.redux(last), b.coeff(n - 1, n - 1));
  }
}

// A functor marked commutative via internal::functor_is_commutative: reductions may reorder its
// operands. Values are integers (exactly representable for every tested Scalar), so a reordered
// reduction must still match the serial reference bit-for-bit.
template <typename Scalar>
struct marked_commutative_sum_op {
  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar& a, const Scalar& b) const { return a + b; }
};

namespace Eigen {
namespace internal {
template <typename Scalar>
struct functor_is_commutative<marked_commutative_sum_op<Scalar>> : std::true_type {};
}  // namespace internal
}  // namespace Eigen

template <typename Scalar>
void redux_commutative() {
  typedef Matrix<Scalar, Dynamic, 1> Vec;
  typedef Matrix<Scalar, Dynamic, Dynamic> Mat;
  const Index sizes[] = {1, 2, 7, 8, 9, 15, 16, 17, 24, 31, 32, 33, 63, 64, 65, 129, 192, 250};
  marked_commutative_sum_op<Scalar> op;
  for (int si = 0; si < 18; ++si) {
    const Index n = sizes[si];
    Vec v(n);
    Scalar vref(0);
    for (Index i = 0; i < n; ++i) {
      v.coeffRef(i) = Scalar(i % 9 + 1);
      vref = vref + v.coeff(i);
    }
    VERIFY_IS_EQUAL(v.redux(op), vref);

    Mat m(n + 1, n + 1);
    m.setZero();
    Scalar bref(0);
    for (Index c = 1; c < n + 1; ++c)
      for (Index r = 1; r < n + 1; ++r) {
        m.coeffRef(r, c) = Scalar((r * 3 + c) % 7 + 1);
        bref = bref + m.coeff(r, c);
      }
    Block<Mat, Dynamic, Dynamic, false> b(m, 1, 1, n, n);
    VERIFY_IS_EQUAL(b.redux(op), bref);
  }
}

// min/max are marked commutative, so the reordering reduction paths may see their NaN operands
// in any order. The reordered result must still honor each NaN mode's contract: PropagateNaN
// returns NaN if any operand is NaN, PropagateNumbers returns the min/max of the non-NaN
// operands (NaN only when all are NaN). PropagateFast leaves NaN results unspecified, so it is
// only checked on NaN-free data. Strided expressions have no packet access, which forces the
// scalar reduction paths: a strided vector Map takes LinearTraversal, a strided matrix Map takes
// DefaultTraversal. NaN positions cover the first lane, other lanes, the unrolled-region end,
// and the serial tail.
template <typename Scalar>
void redux_minmax_nan() {
  typedef Matrix<Scalar, Dynamic, 1> Vec;
  typedef Matrix<Scalar, Dynamic, Dynamic> Mat;
  const Scalar kNaN = std::numeric_limits<Scalar>::quiet_NaN();
  const Index sizes[] = {2, 3, 7, 8, 9, 15, 16, 17, 31, 33, 64, 129, 250};
  for (int si = 0; si < 13; ++si) {
    const Index n = sizes[si];

    // Strided vector view: LinearTraversal without packet access.
    Vec backing(2 * n);
    backing.setZero();
    Map<Vec, 0, InnerStride<2>> v(backing.data(), n, InnerStride<2>(2));
    for (Index i = 0; i < n; ++i) v.coeffRef(i) = Scalar((i * 7) % 13) - Scalar(6);
    const Scalar refMin = v.minCoeff();  // reference from NaN-free data
    const Scalar refMax = v.maxCoeff();

    // NaN-free: all modes must agree with the reference.
    VERIFY_IS_EQUAL((v.template minCoeff<PropagateNaN>()), refMin);
    VERIFY_IS_EQUAL((v.template maxCoeff<PropagateNaN>()), refMax);
    VERIFY_IS_EQUAL((v.template minCoeff<PropagateNumbers>()), refMin);
    VERIFY_IS_EQUAL((v.template maxCoeff<PropagateNumbers>()), refMax);

    const Index nanPositions[] = {0, 1, 7, 8, n / 2, n - 9, n - 2, n - 1};
    for (int pi = 0; pi < 8; ++pi) {
      const Index p = nanPositions[pi];
      if (p < 0 || p >= n) continue;
      const Scalar saved = v.coeff(p);
      v.coeffRef(p) = kNaN;
      // Reference over the remaining numbers, computed serially.
      Scalar numMin = NumTraits<Scalar>::highest(), numMax = NumTraits<Scalar>::lowest();
      bool allNaN = true;
      for (Index i = 0; i < n; ++i) {
        if ((numext::isnan)(v.coeff(i))) continue;
        allNaN = false;
        numMin = numext::mini(numMin, v.coeff(i));
        numMax = numext::maxi(numMax, v.coeff(i));
      }
      VERIFY((numext::isnan)(v.template minCoeff<PropagateNaN>()));
      VERIFY((numext::isnan)(v.template maxCoeff<PropagateNaN>()));
      if (!allNaN) {
        VERIFY_IS_EQUAL((v.template minCoeff<PropagateNumbers>()), numMin);
        VERIFY_IS_EQUAL((v.template maxCoeff<PropagateNumbers>()), numMax);
      }
      v.coeffRef(p) = saved;
    }

    // Two NaNs in different lanes, and every coefficient NaN.
    if (n >= 2) {
      const Scalar s0 = v.coeff(0), s1 = v.coeff(n - 1);
      v.coeffRef(0) = kNaN;
      v.coeffRef(n - 1) = kNaN;
      VERIFY((numext::isnan)(v.template minCoeff<PropagateNaN>()));
      if (n > 2) {
        Scalar numMin = NumTraits<Scalar>::highest();
        for (Index i = 1; i < n - 1; ++i) numMin = numext::mini(numMin, v.coeff(i));
        VERIFY_IS_EQUAL((v.template minCoeff<PropagateNumbers>()), numMin);
      }
      v.coeffRef(0) = s0;
      v.coeffRef(n - 1) = s1;
    }
    v.setConstant(kNaN);
    VERIFY((numext::isnan)(v.template minCoeff<PropagateNaN>()));
    VERIFY((numext::isnan)(v.template minCoeff<PropagateNumbers>()));
    VERIFY((numext::isnan)(v.template maxCoeff<PropagateNaN>()));
    VERIFY((numext::isnan)(v.template maxCoeff<PropagateNumbers>()));

    // Strided matrix view: DefaultTraversal without packet access. NaN in the interior.
    if (n >= 3) {
      Mat mbacking(2 * n, n);
      mbacking.setZero();
      Map<Mat, 0, Stride<Dynamic, 2>> m(mbacking.data(), n, n, Stride<Dynamic, 2>(2 * n, 2));
      for (Index c = 0; c < n; ++c)
        for (Index r = 0; r < n; ++r) m.coeffRef(r, c) = Scalar((r * 5 + c * 3) % 11) - Scalar(5);
      const Scalar mrefMin = m.minCoeff();
      VERIFY_IS_EQUAL((m.template minCoeff<PropagateNaN>()), mrefMin);
      VERIFY_IS_EQUAL((m.template minCoeff<PropagateNumbers>()), mrefMin);
      m.coeffRef(n / 2, n / 2) = kNaN;
      Scalar numMin = NumTraits<Scalar>::highest(), numMax = NumTraits<Scalar>::lowest();
      for (Index c = 0; c < n; ++c)
        for (Index r = 0; r < n; ++r) {
          if ((numext::isnan)(m.coeff(r, c))) continue;
          numMin = numext::mini(numMin, m.coeff(r, c));
          numMax = numext::maxi(numMax, m.coeff(r, c));
        }
      VERIFY((numext::isnan)(m.template minCoeff<PropagateNaN>()));
      VERIFY((numext::isnan)(m.template maxCoeff<PropagateNaN>()));
      VERIFY_IS_EQUAL((m.template minCoeff<PropagateNumbers>()), numMin);
      VERIFY_IS_EQUAL((m.template maxCoeff<PropagateNumbers>()), numMax);
    }
  }
}

// A custom scalar whose comparison ignores its tag, so equivalent values are observably
// distinct. The generic std::min/std::max keep the first operand of a tie, and custom scalars
// are excluded from the min/max commutativity opt-in, so minCoeff()/maxCoeff() must return the
// first extremum in traversal order.
struct TaggedScalar {
  double v;
  int tag;
  TaggedScalar() : v(0), tag(0) {}
  TaggedScalar(double v_, int tag_) : v(v_), tag(tag_) {}
  bool operator<(const TaggedScalar& other) const { return v < other.v; }
};

namespace Eigen {
template <>
struct NumTraits<TaggedScalar> : GenericNumTraits<TaggedScalar> {};
}  // namespace Eigen

void redux_custom_scalar_min_ties() {
  typedef Matrix<TaggedScalar, Dynamic, 1> Vec;
  STATIC_CHECK(
      !(internal::functor_is_commutative<internal::scalar_min_op<TaggedScalar, TaggedScalar, PropagateFast>>::value));
  // Sizes on both sides of the ordered-tree cutoff, extrema in different unroll regions.
  const Index sizes[] = {10, 33, 250, 1000};
  for (int si = 0; si < 4; ++si) {
    const Index n = sizes[si];
    Vec x(n);
    for (Index i = 0; i < n; ++i) x.coeffRef(i) = TaggedScalar(double(i % 17), int(i));
    // Two equal minima (v == -1): the first in traversal order must win.
    x.coeffRef(2) = TaggedScalar(-1.0, 2);
    x.coeffRef(n - 2) = TaggedScalar(-1.0, int(n - 2));
    VERIFY_IS_EQUAL(x.minCoeff().tag, 2);
    // Two equal maxima (v == 100).
    x.coeffRef(3) = TaggedScalar(100.0, 3);
    x.coeffRef(n - 3) = TaggedScalar(100.0, int(n - 3));
    VERIFY_IS_EQUAL(x.maxCoeff().tag, 3);
    // All coefficients equivalent: the very first must win.
    Vec y(n);
    for (Index i = 0; i < n; ++i) y.coeffRef(i) = TaggedScalar(5.0, int(i));
    VERIFY_IS_EQUAL(y.minCoeff().tag, 0);
    VERIFY_IS_EQUAL(y.maxCoeff().tag, 0);
  }
}

// Test reductions on expressions whose inner stride is NOT statically 1 (so they lose
// compile-time vectorization) but ARE contiguous at runtime: a dynamic-inner-stride Map with
// runtime stride 1, a row of a 1xN dynamic matrix, and a fully-packed dynamic-stride matrix Ref.
// These exercise the runtime unit-stride fast path in redux_dispatch (Redux.h) and the matching
// squaredNorm()/norm() fast path (squared_norm_impl in Dot.h). The last check confirms the
// fallback path stays correct when the runtime inner stride is genuinely != 1.
template <typename Scalar>
void redux_runtime_contiguous() {
  typedef Matrix<Scalar, Dynamic, 1> Vec;
  typedef Matrix<Scalar, Dynamic, Dynamic> Mat;
  typedef typename NumTraits<Scalar>::Real RealScalar;
  const Index sizes[] = {1, 2, 7, 8, 9, 16, 17, 64, 255, 256, 257};
  for (int si = 0; si < 11; ++si) {
    const Index n = sizes[si];
    Vec data = Vec::Random(2 * n);
    Vec data_for_prod = Vec::Ones(2 * n) + Scalar(RealScalar(0.2)) * data;
    Scalar rs(0), rp(1);
    RealScalar rmin = numext::real(data(0)), rmax = numext::real(data(0)), rsqn(0);
    for (Index k = 0; k < n; ++k) {
      rs += data(k);
      rp *= data_for_prod(k);
      rmin = (std::min)(rmin, numext::real(data(k)));
      rmax = (std::max)(rmax, numext::real(data(k)));
      rsqn += numext::abs2(data(k));
    }

    // (a) dynamic-inner-stride Map with runtime stride 1 -> fast path.
    Map<Vec, 0, InnerStride<Dynamic>> m(data.data(), n, InnerStride<Dynamic>(1));
    VERIFY_IS_APPROX(m.sum(), rs);
    VERIFY_IS_APPROX(m.mean(), rs / Scalar(RealScalar(n)));
    VERIFY_IS_APPROX(m.real().minCoeff(), rmin);
    VERIFY_IS_APPROX(m.real().maxCoeff(), rmax);
    VERIFY_IS_APPROX(m.squaredNorm(), rsqn);  // squaredNorm/norm fast path (squared_norm_impl)
    VERIFY_IS_APPROX(m.norm(), numext::sqrt(rsqn));
    Map<Vec, 0, InnerStride<Dynamic>> mp(data_for_prod.data(), n, InnerStride<Dynamic>(1));
    VERIFY_IS_APPROX(mp.prod(), rp);

    // (a') an *aligned* dynamic-inner-stride Map with runtime stride 1 exercises the aligned-load
    // fast path: the runtime-contiguous Map inherits evaluator<Derived>::Alignment, so an aligned
    // source must reduce correctly and must not trip the Map alignment assertion. The data buffer
    // comes from an Eigen Vec, which is allocated AlignedMax-aligned.
    Map<Vec, AlignedMax, InnerStride<Dynamic>> ma(data.data(), n, InnerStride<Dynamic>(1));
    VERIFY_IS_APPROX(ma.sum(), rs);
    VERIFY_IS_APPROX(ma.real().minCoeff(), rmin);
    VERIFY_IS_APPROX(ma.real().maxCoeff(), rmax);
    VERIFY_IS_APPROX(ma.squaredNorm(), rsqn);
    VERIFY_IS_APPROX(ma.norm(), numext::sqrt(rsqn));

    // (b) a row of a 1xN dynamic matrix is contiguous at runtime (inner stride == 1).
    Mat r = Mat::Random(1, n);
    Scalar row_sum(0);
    RealScalar row_sqn(0);
    for (Index j = 0; j < n; ++j) {
      row_sum += r(0, j);
      row_sqn += numext::abs2(r(0, j));
    }
    VERIFY_IS_APPROX(r.row(0).sum(), row_sum);
    VERIFY_IS_APPROX(r.row(0).squaredNorm(), row_sqn);

    // (c) fully-packed dynamic-stride matrix Ref -> fast path; must match the dense result.
    if (n >= 2) {
      Mat M = Mat::Random(n, 3);
      Ref<Mat, 0, Stride<Dynamic, Dynamic>> mref(M);
      VERIFY_IS_APPROX(mref.sum(), M.sum());
      VERIFY_IS_APPROX(mref.real().minCoeff(), M.real().minCoeff());
    }

    // (d) fallback: a genuinely strided (stride 2) dynamic Map must still reduce correctly.
    Map<Vec, 0, InnerStride<Dynamic>> m2(data.data(), n, InnerStride<Dynamic>(2));
    Scalar rs2(0);
    RealScalar rsqn2(0);
    for (Index k = 0; k < n; ++k) {
      rs2 += data(2 * k);
      rsqn2 += numext::abs2(data(2 * k));
    }
    VERIFY_IS_APPROX(m2.sum(), rs2);
    VERIFY_IS_APPROX(m2.squaredNorm(), rsqn2);
  }
}

EIGEN_DECLARE_TEST(redux) {
  // the max size cannot be too large, otherwise reduxion operations obviously generate large errors.
  int maxsize = (std::min)(100, EIGEN_TEST_MAX_SIZE);
  TEST_SET_BUT_UNUSED_VARIABLE(maxsize);
  for (int i = 0; i < g_repeat; i++) {
    int rows = internal::random<int>(1, maxsize);
    int cols = internal::random<int>(1, maxsize);
    EIGEN_UNUSED_VARIABLE(rows);
    EIGEN_UNUSED_VARIABLE(cols);
    CALL_SUBTEST_1(matrixRedux(Matrix<float, 1, 1>()));
    CALL_SUBTEST_1(matrixRedux(Array<float, 1, 1>()));
    CALL_SUBTEST_2(matrixRedux(Matrix2f()));
    CALL_SUBTEST_2(matrixRedux(Array2f()));
    CALL_SUBTEST_2(matrixRedux(Array22f()));
    CALL_SUBTEST_3(matrixRedux(Matrix4d()));
    CALL_SUBTEST_3(matrixRedux(Array4d()));
    CALL_SUBTEST_3(matrixRedux(Array44d()));
    CALL_SUBTEST_4(matrixRedux(MatrixXf(rows, cols)));
    CALL_SUBTEST_4(matrixRedux(ArrayXXf(rows, cols)));
    CALL_SUBTEST_4(matrixRedux(MatrixXd(rows, cols)));
    CALL_SUBTEST_4(matrixRedux(ArrayXXd(rows, cols)));
    /* TODO: fix test for boolean */
    /*CALL_SUBTEST_5(matrixRedux(MatrixX<bool>(rows, cols)));*/
    /*CALL_SUBTEST_5(matrixRedux(ArrayXX<bool>(rows, cols)));*/
    CALL_SUBTEST_5(matrixRedux(MatrixXi(rows, cols)));
    CALL_SUBTEST_5(matrixRedux(ArrayXXi(rows, cols)));
    CALL_SUBTEST_5(matrixRedux(MatrixX<int64_t>(rows, cols)));
    CALL_SUBTEST_5(matrixRedux(ArrayXX<int64_t>(rows, cols)));
    CALL_SUBTEST_6(matrixRedux(MatrixXcf(rows, cols)));
    CALL_SUBTEST_6(matrixRedux(ArrayXXcf(rows, cols)));
    CALL_SUBTEST_7(matrixRedux(MatrixXcd(rows, cols)));
    CALL_SUBTEST_7(matrixRedux(ArrayXXcd(rows, cols)));
  }
  for (int i = 0; i < g_repeat; i++) {
    int size = internal::random<int>(1, maxsize);
    EIGEN_UNUSED_VARIABLE(size);
    CALL_SUBTEST_8(vectorRedux(Vector4f()));
    CALL_SUBTEST_8(vectorRedux(Array4f()));
    CALL_SUBTEST_9(vectorRedux(VectorXf(size)));
    CALL_SUBTEST_9(vectorRedux(ArrayXf(size)));
    CALL_SUBTEST_10(vectorRedux(VectorXd(size)));
    CALL_SUBTEST_10(vectorRedux(ArrayXd(size)));
    /* TODO: fix test for boolean */
    /*CALL_SUBTEST_10(vectorRedux(VectorX<bool>(size)));*/
    /*CALL_SUBTEST_10(vectorRedux(ArrayX<bool>(size)));*/
    CALL_SUBTEST_10(vectorRedux(VectorXi(size)));
    CALL_SUBTEST_10(vectorRedux(ArrayXi(size)));
    CALL_SUBTEST_10(vectorRedux(VectorX<int64_t>(size)));
    CALL_SUBTEST_10(vectorRedux(ArrayX<int64_t>(size)));
  }
  // Bool reductions (deterministic, outside g_repeat)
  CALL_SUBTEST_11(boolRedux(4, 4));
  CALL_SUBTEST_11(boolRedux(7, 13));
  CALL_SUBTEST_11(boolRedux(63, 63));

  // Bool reductions at vectorization boundary sizes.
  // all()/any()/count() use packet-level visitors with remainder handling.
  {
    // bool packets are typically 16 bytes (SSE) or 32 bytes (AVX).
    // Test sizes around common packet sizes to catch off-by-one in remainder loops.
    const Index bsizes[] = {1, 2, 3, 7, 8, 9, 15, 16, 17, 31, 32, 33, 63, 64, 65, 127, 128, 129};
    EIGEN_UNUSED_VARIABLE(bsizes);
    for (int si = 0; si < 18; ++si) {
      CALL_SUBTEST_11(boolRedux(bsizes[si], 1));  // column vector
      CALL_SUBTEST_11(boolRedux(1, bsizes[si]));  // row vector
      CALL_SUBTEST_11(boolRedux(bsizes[si], 3));  // thin matrix
    }
  }

  // Vectorization boundary sizes — deterministic, run once.
  // Integer types are excluded: full-range random ints overflow in sum/prod (UB).
  // Integer reductions are already tested by matrixRedux/vectorRedux with clamped values.
  CALL_SUBTEST_12(redux_vec_boundary<float>());
  CALL_SUBTEST_12(redux_vec_boundary<double>());
  CALL_SUBTEST_12(redux_vec_boundary<std::complex<float>>());
  CALL_SUBTEST_12(redux_vec_boundary<std::complex<double>>());
  CALL_SUBTEST_12(redux_block_boundary<float>());
  CALL_SUBTEST_12(redux_block_boundary<double>());
  CALL_SUBTEST_12(redux_block_boundary<std::complex<float>>());

  // Strided (non-contiguous) reductions.
  CALL_SUBTEST_13(redux_strided<float>());
  CALL_SUBTEST_13(redux_strided<double>());
  CALL_SUBTEST_13(redux_strided<std::complex<float>>());

  // Operand order must survive the scalar unrolled paths (associative, non-commutative functor).
  CALL_SUBTEST_13(redux_operand_order<float>());
  CALL_SUBTEST_13(redux_operand_order<double>());
  CALL_SUBTEST_13(redux_operand_order<int>());

  // Functors marked commutative may be reordered but must stay exact on integer values.
  CALL_SUBTEST_13(redux_commutative<int>());
  CALL_SUBTEST_13(redux_commutative<double>());

  // min/max NaN contracts must survive reordered scalar reductions.
  CALL_SUBTEST_13(redux_minmax_nan<float>());
  CALL_SUBTEST_13(redux_minmax_nan<double>());

  // Custom scalars stay on the order-preserving path: first extremum wins ties.
  CALL_SUBTEST_13(redux_custom_scalar_min_ties());

  // Runtime unit-stride fast path (redux_dispatch in Redux.h).
  CALL_SUBTEST_13(redux_runtime_contiguous<float>());
  CALL_SUBTEST_13(redux_runtime_contiguous<double>());
  CALL_SUBTEST_13(redux_runtime_contiguous<std::complex<float>>());
  CALL_SUBTEST_13(redux_runtime_contiguous<std::complex<double>>());
}
