// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2010-2011 Jitse Niesen <jitse@maths.leeds.ac.uk>
// Copyright (C) 2016 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

#include "main.h"

template <typename MatrixType>
bool equalsIdentity(const MatrixType& A) {
  bool offDiagOK = true;
  for (Index i = 0; i < A.rows(); ++i) {
    for (Index j = i + 1; j < A.cols(); ++j) {
      offDiagOK = offDiagOK && numext::is_exactly_zero(A(i, j));
    }
  }
  for (Index i = 0; i < A.rows(); ++i) {
    for (Index j = 0; j < (std::min)(i, A.cols()); ++j) {
      offDiagOK = offDiagOK && numext::is_exactly_zero(A(i, j));
    }
  }

  bool diagOK = (A.diagonal().array() == 1).all();
  return offDiagOK && diagOK;
}

template <typename VectorType>
void check_extremity_accuracy(const VectorType& v, const typename VectorType::Scalar& low,
                              const typename VectorType::Scalar& high) {
  typedef typename VectorType::Scalar Scalar;
  typedef typename VectorType::RealScalar RealScalar;

  RealScalar prec = std::is_same<RealScalar, float>::value ? NumTraits<RealScalar>::dummy_precision() * 10
                                                           : NumTraits<RealScalar>::dummy_precision() / 10;
  Index size = v.size();

  if (size < 20) return;

  for (int i = 0; i < size; ++i) {
    if (i < 5 || i > size - 6) {
      Scalar ref =
          (low * RealScalar(size - i - 1)) / RealScalar(size - 1) + (high * RealScalar(i)) / RealScalar(size - 1);
      if (std::abs(ref) > 1) {
        if (!internal::isApprox(v(i), ref, prec))
          std::cout << v(i) << " != " << ref << "  ; relative error: " << std::abs((v(i) - ref) / ref)
                    << "  ; required precision: " << prec << "  ; range: " << low << "," << high << "  ; i: " << i
                    << "\n";
        VERIFY(internal::isApprox(
            v(i),
            (low * RealScalar(size - i - 1)) / RealScalar(size - 1) + (high * RealScalar(i)) / RealScalar(size - 1),
            prec));
      }
    }
  }
}

template <typename VectorType>
void testVectorType(const VectorType& base) {
  typedef typename VectorType::Scalar Scalar;
  typedef typename VectorType::RealScalar RealScalar;

  const Index size = base.size();

  Scalar high = internal::random<Scalar>(-500, 500);
  Scalar low = (size == 1 ? high : internal::random<Scalar>(-500, 500));
  if (numext::real(low) > numext::real(high)) std::swap(low, high);

  // check low==high
  if (internal::random<float>(0.f, 1.f) < 0.05f) low = high;
  // check abs(low) >> abs(high)
  else if (size > 2 && std::numeric_limits<RealScalar>::max_exponent10 > 0 && internal::random<float>(0.f, 1.f) < 0.1f)
    low = -internal::random<Scalar>(1, 2) *
          RealScalar(std::pow(RealScalar(10), std::numeric_limits<RealScalar>::max_exponent10 / 2));

  const Scalar step = ((size == 1) ? 1 : (high - low) / RealScalar(size - 1));

  // check whether the result yields what we expect it to do
  VectorType m(base), o(base);
  m.setLinSpaced(size, low, high);
  o.setEqualSpaced(size, low, step);

  if (!NumTraits<Scalar>::IsInteger) {
    VectorType n(size);
    for (int i = 0; i < size; ++i) n(i) = low + RealScalar(i) * step;
    VERIFY_IS_APPROX(m, n);
    VERIFY_IS_APPROX(n, o);

    CALL_SUBTEST(check_extremity_accuracy(m, low, high));
  }

  RealScalar range_length = numext::real(high - low);
  if ((!NumTraits<Scalar>::IsInteger) || (range_length >= size && (Index(range_length) % (size - 1)) == 0) ||
      (Index(range_length + 1) < size && (size % Index(range_length + 1)) == 0)) {
    VectorType n(size);
    if ((!NumTraits<Scalar>::IsInteger) || (range_length >= size))
      for (int i = 0; i < size; ++i) n(i) = size == 1 ? low : (low + ((high - low) * Scalar(i)) / RealScalar(size - 1));
    else
      for (int i = 0; i < size; ++i)
        n(i) = size == 1 ? low : low + Scalar((double(range_length + 1) * double(i)) / double(size));
    VERIFY_IS_APPROX(m, n);

    // random access version
    m = VectorType::LinSpaced(size, low, high);
    VERIFY_IS_APPROX(m, n);
    VERIFY_IS_EQUAL(m(m.size() - 1), high);
    if (!NumTraits<Scalar>::IsInteger) CALL_SUBTEST(check_extremity_accuracy(m, low, high));
  }

  VERIFY((m.array().real() <= numext::real(high)).all());
  VERIFY((m.array().real() >= numext::real(low)).all());
  if (size >= 1) {
    VERIFY_IS_EQUAL(m(0), low);
  }

  // check whether everything works with row and col major vectors
  Matrix<Scalar, Dynamic, 1> row_vector(size);
  Matrix<Scalar, 1, Dynamic> col_vector(size);
  row_vector.setLinSpaced(size, low, high);
  col_vector.setLinSpaced(size, low, high);
  // when using the extended precision (e.g., FPU) the relative error might exceed 1 bit
  // when computing the squared sum in isApprox, thus the 2x factor.
  VERIFY(row_vector.isApprox(col_vector.transpose(), RealScalar(2) * NumTraits<Scalar>::epsilon()));

  Matrix<Scalar, Dynamic, 1> size_changer(size + 50);
  size_changer.setLinSpaced(size, low, high);
  VERIFY(size_changer.size() == size);

  typedef Matrix<Scalar, 1, 1> ScalarMatrix;
  ScalarMatrix scalar;
  scalar.setLinSpaced(1, low, high);
  VERIFY_IS_APPROX(scalar, ScalarMatrix::Constant(high));
  VERIFY_IS_APPROX(ScalarMatrix::LinSpaced(1, low, high), ScalarMatrix::Constant(high));

  // regression test for bug 526 (linear vectorized transversal)
  if (size > 1 && (!NumTraits<Scalar>::IsInteger)) {
    m.tail(size - 1).setLinSpaced(low, high);
    VERIFY_IS_APPROX(m(size - 1), high);
  }

  // regression test for bug 1383 (LinSpaced with empty size/range)
  {
    Index n0 = VectorType::SizeAtCompileTime == Dynamic ? 0 : VectorType::SizeAtCompileTime;
    low = internal::random<Scalar>();
    m = VectorType::LinSpaced(n0, low, low - RealScalar(1));
    VERIFY(m.size() == n0);

    if (VectorType::SizeAtCompileTime == Dynamic) {
      VERIFY_IS_EQUAL(VectorType::LinSpaced(n0, 0, Scalar(RealScalar(n0 - 1))).sum(), Scalar(0));
      VERIFY_IS_EQUAL(VectorType::LinSpaced(n0, low, low - RealScalar(1)).sum(), Scalar(0));
    }

    m.setLinSpaced(n0, 0, Scalar(RealScalar(n0 - 1)));
    VERIFY(m.size() == n0);
    m.setLinSpaced(n0, low, low - RealScalar(1));
    VERIFY(m.size() == n0);

    // empty range only:
    VERIFY_IS_APPROX(VectorType::LinSpaced(size, low, low), VectorType::Constant(size, low));
    m.setLinSpaced(size, low, low);
    VERIFY_IS_APPROX(m, VectorType::Constant(size, low));

    if (NumTraits<Scalar>::IsInteger) {
      VERIFY_IS_APPROX(VectorType::LinSpaced(size, low, low + Scalar(RealScalar(size - 1))),
                       VectorType::LinSpaced(size, low + Scalar(RealScalar(size - 1)), low).reverse());

      if (VectorType::SizeAtCompileTime == Dynamic) {
        // Check negative multiplicator path:
        for (Index k = 1; k < 5; ++k)
          VERIFY_IS_APPROX(VectorType::LinSpaced(size, low, low + Scalar(RealScalar((size - 1) * k))),
                           VectorType::LinSpaced(size, low + Scalar(RealScalar((size - 1) * k)), low).reverse());
        // Check negative divisor path:
        for (Index k = 1; k < 5; ++k)
          VERIFY_IS_APPROX(VectorType::LinSpaced(size * k, low, low + Scalar(RealScalar(size - 1))),
                           VectorType::LinSpaced(size * k, low + Scalar(RealScalar(size - 1)), low).reverse());
      }
    }
  }

  // test setUnit()
  if (m.size() > 0) {
    for (Index k = 0; k < 10; ++k) {
      Index i = internal::random<Index>(0, m.size() - 1);
      m.setUnit(i);
      VERIFY_IS_APPROX(m, VectorType::Unit(m.size(), i));
    }
    if (VectorType::SizeAtCompileTime == Dynamic) {
      Index i = internal::random<Index>(0, 2 * m.size() - 1);
      m.setUnit(2 * m.size(), i);
      VERIFY_IS_APPROX(m, VectorType::Unit(m.size(), i));
    }
  }
}

template <typename MatrixType>
void testMatrixType(const MatrixType& m) {
  using std::abs;
  const Index rows = m.rows();
  const Index cols = m.cols();
  typedef typename MatrixType::Scalar Scalar;

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

  MatrixType A;
  A.setIdentity(rows, cols);
  VERIFY(equalsIdentity(A));
  VERIFY(equalsIdentity(MatrixType::Identity(rows, cols)));

  A = MatrixType::Constant(rows, cols, s1);
  Index i = internal::random<Index>(0, rows - 1);
  Index j = internal::random<Index>(0, cols - 1);
  VERIFY_IS_APPROX(MatrixType::Constant(rows, cols, s1)(i, j), s1);
  VERIFY_IS_APPROX(MatrixType::Constant(rows, cols, s1).coeff(i, j), s1);
  VERIFY_IS_APPROX(A(i, j), s1);
}

template <int>
void bug79() {
  // Assignment of a RowVectorXd to a MatrixXd (regression test for bug #79).
  VERIFY((MatrixXd(RowVectorXd::LinSpaced(3, 0, 1)) - RowVector3d(0, 0.5, 1)).norm() <
         std::numeric_limits<double>::epsilon());
}

template <int>
void bug1630() {
  Array4d x4 = Array4d::LinSpaced(0.0, 1.0);
  Array3d x3(Array4d::LinSpaced(0.0, 1.0).head(3));
  VERIFY_IS_APPROX(x4.head(3), x3);
}

template <int>
void nullary_overflow() {
  // Check possible overflow issue
  int n = 60000;
  ArrayXi a1(n), a2(n), a_ref(n);
  a1.setLinSpaced(n, 0, n - 1);
  a2.setEqualSpaced(n, 0, 1);
  for (int i = 0; i < n; ++i) a_ref(i) = i;
  VERIFY_IS_APPROX(a1, a_ref);
  VERIFY_IS_APPROX(a2, a_ref);
}

template <int>
void nullary_internal_logic() {
  // check some internal logic
  VERIFY((internal::has_nullary_operator<internal::scalar_constant_op<double> >::value));
  VERIFY((!internal::has_unary_operator<internal::scalar_constant_op<double> >::value));
  VERIFY((!internal::has_binary_operator<internal::scalar_constant_op<double> >::value));
  VERIFY((internal::functor_has_linear_access<internal::scalar_constant_op<double> >::value));

  VERIFY((!internal::has_nullary_operator<internal::scalar_identity_op<double> >::value));
  VERIFY((!internal::has_unary_operator<internal::scalar_identity_op<double> >::value));
  VERIFY((internal::has_binary_operator<internal::scalar_identity_op<double> >::value));
  VERIFY((!internal::functor_has_linear_access<internal::scalar_identity_op<double> >::value));

  VERIFY((!internal::has_nullary_operator<internal::linspaced_op<float> >::value));
  VERIFY((internal::has_unary_operator<internal::linspaced_op<float> >::value));
  VERIFY((!internal::has_binary_operator<internal::linspaced_op<float> >::value));
  VERIFY((internal::functor_has_linear_access<internal::linspaced_op<float> >::value));

  // Regression unit test for an MSVC bug.
  // Search "nullary_wrapper_workaround_msvc" in CoreEvaluators.h for the details.
  // See also traits<Ref>::match.
  {
    MatrixXf A = MatrixXf::Random(3, 3);
    Ref<const MatrixXf> R = 2.0 * A;
    VERIFY_IS_APPROX(R, A + A);

    Ref<const MatrixXf> R1 = MatrixXf::Random(3, 3) + A;

    VectorXi V = VectorXi::Random(3);
    Ref<const VectorXi> R2 = VectorXi::LinSpaced(3, 1, 3) + V;
    VERIFY_IS_APPROX(R2, V + Vector3i(1, 2, 3));

    VERIFY((internal::has_nullary_operator<internal::scalar_constant_op<float> >::value));
    VERIFY((!internal::has_unary_operator<internal::scalar_constant_op<float> >::value));
    VERIFY((!internal::has_binary_operator<internal::scalar_constant_op<float> >::value));
    VERIFY((internal::functor_has_linear_access<internal::scalar_constant_op<float> >::value));

    VERIFY((!internal::has_nullary_operator<internal::linspaced_op<int> >::value));
    VERIFY((internal::has_unary_operator<internal::linspaced_op<int> >::value));
    VERIFY((!internal::has_binary_operator<internal::linspaced_op<int> >::value));
    VERIFY((internal::functor_has_linear_access<internal::linspaced_op<int> >::value));
  }
}

// Test LinSpaced at vectorization boundary sizes.
// The packetOp in linspaced_op_impl uses mask/select logic to handle
// the last partial packet (when vector size is not a multiple of PacketSize).
// This exercises those boundaries with element-by-element verification.
template <typename Scalar>
void linspaced_boundary() {
  typedef typename NumTraits<Scalar>::Real RealScalar;
  const Index PS = internal::packet_traits<Scalar>::size;
  const Index sizes[] = {1, 2, 3, PS - 1, PS, PS + 1, 2 * PS - 1, 2 * PS, 2 * PS + 1, 4 * PS, 4 * PS + 1};
  typedef Matrix<Scalar, Dynamic, 1> Vec;

  for (int si = 0; si < 11; ++si) {
    Index n = sizes[si];
    if (n <= 0) continue;

    Scalar low(1), high(100);
    Vec v = Vec::LinSpaced(n, low, high);

    // With n==1, LinSpaced returns [high] by design.
    if (n == 1) {
      VERIFY_IS_EQUAL(v(0), high);
    } else {
      VERIFY_IS_EQUAL(v(0), low);
      VERIFY_IS_EQUAL(v(n - 1), high);

      // Verify monotonicity.
      for (Index k = 1; k < n; ++k) {
        VERIFY(numext::real(v(k)) >= numext::real(v(k - 1)));
      }

      // Verify against scalar reference computation.
      for (Index k = 0; k < n; ++k) {
        Scalar ref = Scalar(low + (high - low) * RealScalar(k) / RealScalar(n - 1));
        VERIFY_IS_APPROX(v(k), ref);
      }
    }
  }

  // Test the "flip" path: when |high| < |low|, the implementation uses
  // a reversed computation for better precision. Verify at packet boundaries.
  for (int si = 0; si < 11; ++si) {
    Index n = sizes[si];
    if (n <= 0 || n == 1) continue;  // skip n=1, flip irrelevant for single element

    Scalar low(1000), high(1);  // |high| < |low| triggers flip
    Vec v = Vec::LinSpaced(n, low, high);

    VERIFY_IS_EQUAL(v(0), low);
    VERIFY_IS_EQUAL(v(n - 1), high);

    // Verify monotonicity (decreasing).
    for (Index k = 1; k < n; ++k) {
      VERIFY(numext::real(v(k)) <= numext::real(v(k - 1)));
    }

    // Verify against scalar reference.
    for (Index k = 0; k < n; ++k) {
      Scalar ref = Scalar(low + (high - low) * RealScalar(k) / RealScalar(n - 1));
      VERIFY_IS_APPROX(v(k), ref);
    }
  }
}

// A custom integer scalar, which integer LinSpaced computes in rather than in Index.
struct CustomInt {
  long long v;
  CustomInt(long long x = 0) : v(x) {}
  friend CustomInt operator+(CustomInt a, CustomInt b) { return a.v + b.v; }
  friend CustomInt operator-(CustomInt a, CustomInt b) { return a.v - b.v; }
  friend CustomInt operator*(CustomInt a, CustomInt b) { return a.v * b.v; }
  friend CustomInt operator/(CustomInt a, CustomInt b) { return a.v / b.v; }
  friend bool operator<(CustomInt a, CustomInt b) { return a.v < b.v; }
  friend bool operator<=(CustomInt a, CustomInt b) { return a.v <= b.v; }
  friend bool operator>=(CustomInt a, CustomInt b) { return a.v >= b.v; }
  friend bool operator==(CustomInt a, CustomInt b) { return a.v == b.v; }
  friend CustomInt abs(CustomInt a) { return a.v < 0 ? -a.v : a.v; }
};

namespace Eigen {
template <>
struct NumTraits<CustomInt> : GenericNumTraits<long long> {
  using Real = CustomInt;
  using NonInteger = double;
  using Literal = CustomInt;
  using Nested = CustomInt;
  static constexpr int RequireInitialization = 1;
  static CustomInt highest() { return GenericNumTraits<long long>::highest(); }
  static CustomInt lowest() { return GenericNumTraits<long long>::lowest(); }
};
}  // namespace Eigen

// Test integer LinSpaced divisor path.
// When (abs(high - low) + 1) < num_steps, the integer LinSpaced uses
// a divisor-based formula instead of multiplication. This path is
// barely covered by existing tests which use random ranges.
template <int>
void linspaced_integer_divisor() {
  typedef Matrix<int, Dynamic, 1> VecI;

  // Case: num_steps much larger than range → triggers divisor path.
  // LinSpaced(12, 0, 5): 12 steps over range [0,5], so range+1=6, 6 < 12.
  {
    VecI v = VecI::LinSpaced(12, 0, 5);
    VERIFY_IS_EQUAL(v(0), 0);
    // All values must be in [0, 5].
    for (Index k = 0; k < 12; ++k) {
      VERIFY(v(k) >= 0 && v(k) <= 5);
    }
    // Must be non-decreasing.
    for (Index k = 1; k < 12; ++k) {
      VERIFY(v(k) >= v(k - 1));
    }
    // Each integer 0-5 should appear at least once.
    for (int val = 0; val <= 5; ++val) {
      bool found = false;
      for (Index k = 0; k < 12; ++k) {
        if (v(k) == val) {
          found = true;
          break;
        }
      }
      VERIFY(found);
    }
  }

  // Case: range exactly divides steps → each value should appear equally.
  // LinSpaced(20, 0, 3): range+1=4, 20%4==0, so each of 0,1,2,3 appears 5 times.
  {
    VecI v = VecI::LinSpaced(20, 0, 3);
    VERIFY_IS_EQUAL(v(0), 0);
    for (Index k = 0; k < 20; ++k) {
      VERIFY(v(k) >= 0 && v(k) <= 3);
    }
    for (Index k = 1; k < 20; ++k) {
      VERIFY(v(k) >= v(k - 1));
    }
  }

  // Reverse: LinSpaced(12, 5, 0) should be reverse of LinSpaced(12, 0, 5).
  {
    VecI fwd = VecI::LinSpaced(12, 0, 5);
    VecI rev = VecI::LinSpaced(12, 5, 0);
    VERIFY_IS_APPROX(fwd, rev.reverse());
  }

  // Single step: always returns high.
  {
    VecI v = VecI::LinSpaced(1, 3, 7);
    VERIFY_IS_EQUAL(v(0), 7);
  }

  // More steps than a narrow Scalar can count: num_steps and the index i do not fit in uint8_t.
  {
    using VecU8 = Matrix<uint8_t, Dynamic, 1>;
    VecU8 v = VecU8::LinSpaced(300, 0, 10);
    VERIFY_IS_EQUAL(v(0), uint8_t(0));
    VERIFY_IS_EQUAL(v(299), uint8_t(10));
    for (Index k = 1; k < 300; ++k) VERIFY(v(k) >= v(k - 1) && v(k) <= v(k - 1) + 1);
  }

  // The offset from low need not fit in the Scalar: k / 2 reaches 149 and k reaches 255, in both the divisor and
  // the multiplier path.
  {
    using VecI8 = Matrix<int8_t, Dynamic, 1>;
    VecI8 v = VecI8::LinSpaced(300, -100, 100), w = VecI8::LinSpaced(256, -128, 127);
    for (Index k = 0; k < 300; ++k) VERIFY_IS_EQUAL(int(v(k)), -100 + int(k / 2));
    for (Index k = 0; k < 256; ++k) VERIFY_IS_EQUAL(int(w(k)), -128 + int(k));
    using VecU8 = Matrix<uint8_t, Dynamic, 1>;
    VecU8 u = VecU8::LinSpaced(256, 255, 0);
    for (Index k = 0; k < 256; ++k) VERIFY_IS_EQUAL(int(u(k)), 255 - int(k));
  }

  // 64-bit integers, where high - low wraps for unsigned decreasing sequences or overflows the signed type.
  {
    using VecU64 = Matrix<uint64_t, Dynamic, 1>;
    VecU64 u = VecU64::LinSpaced(4, 9, 0), w = VecU64::LinSpaced(10, 3, 0);
    for (Index k = 0; k < 4; ++k) VERIFY_IS_EQUAL(u(k), uint64_t(9 - 3 * k));
    for (Index k = 0; k < 10; ++k) VERIFY_IS_EQUAL(w(k), uint64_t(3 - k / 3));
    const uint64_t umax = (std::numeric_limits<uint64_t>::max)();
    VecU64 x = VecU64::LinSpaced(2, umax, 0);
    VERIFY_IS_EQUAL(x(0), umax);
    VERIFY_IS_EQUAL(x(1), uint64_t(0));
    using VecI64 = Matrix<int64_t, Dynamic, 1>;
    const int64_t imin = (std::numeric_limits<int64_t>::min)(), imax = (std::numeric_limits<int64_t>::max)();
    VecI64 y = VecI64::LinSpaced(2, imin, imax), z = VecI64::LinSpaced(3, imax, imin);
    VERIFY_IS_EQUAL(y(0), imin);
    VERIFY_IS_EQUAL(y(1), imax);
    // The step is (2^64 - 1) / 2 = imax.
    VERIFY_IS_EQUAL(z(0), imax);
    VERIFY_IS_EQUAL(z(1), int64_t(0));
    VERIFY_IS_EQUAL(z(2), -imax);
  }

  // Custom integer scalars.
  {
    using VecC = Matrix<CustomInt, Dynamic, 1>;
    VecC v = VecC::LinSpaced(10, CustomInt(0), CustomInt(3)), w = VecC::LinSpaced(4, CustomInt(9), CustomInt(0));
    for (Index k = 0; k < 10; ++k) VERIFY_IS_EQUAL(v(k).v, k / 3);
    for (Index k = 0; k < 4; ++k) VERIFY_IS_EQUAL(w(k).v, 9 - 3 * k);
  }
}

EIGEN_DECLARE_TEST(nullary) {
  CALL_SUBTEST_1(testMatrixType(Matrix2d()));
  CALL_SUBTEST_2(testMatrixType(MatrixXcf(internal::random<int>(1, 300), internal::random<int>(1, 300))));
  CALL_SUBTEST_3(testMatrixType(MatrixXf(internal::random<int>(1, 300), internal::random<int>(1, 300))));

  for (int i = 0; i < g_repeat * 10; i++) {
    CALL_SUBTEST_3(testVectorType(VectorXcd(internal::random<int>(1, 30000))));
    CALL_SUBTEST_4(testVectorType(VectorXd(internal::random<int>(1, 30000))));
    CALL_SUBTEST_5(testVectorType(Vector4d()));  // regression test for bug 232
    CALL_SUBTEST_6(testVectorType(Vector3d()));
    CALL_SUBTEST_7(testVectorType(VectorXf(internal::random<int>(1, 30000))));
    CALL_SUBTEST_8(testVectorType(Vector3f()));
    CALL_SUBTEST_8(testVectorType(Vector4f()));
    CALL_SUBTEST_8(testVectorType(Matrix<float, 8, 1>()));
    CALL_SUBTEST_8(testVectorType(Matrix<float, 1, 1>()));

    CALL_SUBTEST_9(testVectorType(VectorXi(internal::random<int>(1, 10))));
    CALL_SUBTEST_9(testVectorType(VectorXi(internal::random<int>(9, 300))));
    CALL_SUBTEST_9(testVectorType(Matrix<int, 1, 1>()));
  }

  CALL_SUBTEST_6(bug79<0>());
  CALL_SUBTEST_6(bug1630<0>());
  CALL_SUBTEST_9(nullary_overflow<0>());
  CALL_SUBTEST_10(nullary_internal_logic<0>());

  // LinSpaced at vectorization boundaries (deterministic, outside g_repeat).
  CALL_SUBTEST_11(linspaced_boundary<float>());
  CALL_SUBTEST_11(linspaced_boundary<double>());

  // Integer LinSpaced divisor path tests.
  CALL_SUBTEST_12(linspaced_integer_divisor<0>());
}
