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

template <typename MatrixType>
std::enable_if_t<(MatrixType::RowsAtCompileTime == 1 || MatrixType::ColsAtCompileTime == 1), void> check_index(
    const MatrixType& m) {
  VERIFY_RAISES_ASSERT(m[0]);
  VERIFY_RAISES_ASSERT((m + m)[0]);
}

template <typename MatrixType>
std::enable_if_t<!(MatrixType::RowsAtCompileTime == 1 || MatrixType::ColsAtCompileTime == 1), void> check_index(
    const MatrixType& /*unused*/) {}

template <typename MatrixType>
void basicStuff(const MatrixType& m) {
  typedef typename MatrixType::Scalar Scalar;
  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> VectorType;
  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, MatrixType::RowsAtCompileTime> SquareMatrixType;

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

  // this test relies a lot on Random.h, and there's not much more that we can do
  // to test it, hence I consider that we will have tested Random.h
  MatrixType m1 = random_for_arithmetic<MatrixType>(rows, cols), m2 = random_for_arithmetic<MatrixType>(rows, cols),
             m3(rows, cols), mzero = MatrixType::Zero(rows, cols),
             square = Matrix<Scalar, MatrixType::RowsAtCompileTime, MatrixType::RowsAtCompileTime>::Random(rows, rows);
  VectorType v1 = random_for_arithmetic<VectorType>(rows), vzero = VectorType::Zero(rows);
  SquareMatrixType sm1 = random_for_arithmetic<SquareMatrixType>(rows, rows), sm2(rows, rows);

  Scalar x = random_scalar_for_arithmetic<Scalar>();
  if (x == Scalar(0)) x = Scalar(1);

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

  m1.coeffRef(r, c) = x;
  VERIFY_IS_APPROX(x, m1.coeff(r, c));
  m1(r, c) = x;
  VERIFY_IS_APPROX(x, m1(r, c));
  v1.coeffRef(r) = x;
  VERIFY_IS_APPROX(x, v1.coeff(r));
  v1(r) = x;
  VERIFY_IS_APPROX(x, v1(r));
  v1[r] = x;
  VERIFY_IS_APPROX(x, v1[r]);

  // test fetching with various index types.
  Index r1 = internal::random<Index>(0, numext::mini(Index(127), rows - 1));
  x = v1(static_cast<char>(r1));
  x = v1(static_cast<signed char>(r1));
  x = v1(static_cast<unsigned char>(r1));
  x = v1(static_cast<signed short>(r1));
  x = v1(static_cast<unsigned short>(r1));
  x = v1(static_cast<signed int>(r1));
  x = v1(static_cast<unsigned int>(r1));
  x = v1(static_cast<signed long>(r1));
  x = v1(static_cast<unsigned long>(r1));
  if (sizeof(Index) >= sizeof(long long int)) x = v1(static_cast<long long int>(r1));
  if (sizeof(Index) >= sizeof(unsigned long long int)) x = v1(static_cast<unsigned long long int>(r1));

  VERIFY_IS_APPROX(v1, v1);
  VERIFY_IS_NOT_APPROX(v1, 2 * v1);
  VERIFY_IS_MUCH_SMALLER_THAN(vzero, v1);
  VERIFY_IS_MUCH_SMALLER_THAN(vzero, v1.squaredNorm());
  VERIFY_IS_NOT_MUCH_SMALLER_THAN(v1, v1);
  VERIFY_IS_APPROX(vzero, v1 - v1);
  VERIFY_IS_APPROX(m1, m1);
  VERIFY_IS_NOT_APPROX(m1, 2 * m1);
  VERIFY_IS_MUCH_SMALLER_THAN(mzero, m1);
  VERIFY_IS_NOT_MUCH_SMALLER_THAN(m1, m1);
  VERIFY_IS_APPROX(mzero, m1 - m1);

  // always test operator() on each read-only expression class,
  // in order to check const-qualifiers.
  // indeed, if an expression class (here Zero) is meant to be read-only,
  // hence has no _write() method, the corresponding MatrixBase method (here zero())
  // should return a const-qualified object so that it is the const-qualified
  // operator() that gets called, which in turn calls _read().
  VERIFY_IS_MUCH_SMALLER_THAN(MatrixType::Zero(rows, cols)(r, c), static_cast<Scalar>(1));

  // now test copying a row-vector into a (column-)vector and conversely.
  square.col(r) = square.row(r).eval();
  Matrix<Scalar, 1, MatrixType::RowsAtCompileTime> rv(rows);
  Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> cv(rows);
  rv = square.row(r);
  cv = square.col(r);

  VERIFY_IS_APPROX(rv, cv.transpose());

  if (cols != 1 && rows != 1 && MatrixType::SizeAtCompileTime != Dynamic) {
    VERIFY_RAISES_ASSERT(m1 = (m2.block(0, 0, rows - 1, cols - 1)));
  }

  if (cols != 1 && rows != 1) {
    check_index(m1);
  }

  VERIFY_IS_APPROX(m3 = m1, m1);
  MatrixType m4;
  VERIFY_IS_APPROX(m4 = m1, m1);

  m3.real() = m1.real();
  VERIFY_IS_APPROX(static_cast<const MatrixType&>(m3).real(), static_cast<const MatrixType&>(m1).real());
  VERIFY_IS_APPROX(static_cast<const MatrixType&>(m3).real(), m1.real());

  // check == / != operators
  VERIFY(m1 == m1);
  // Bounded integer fixtures can coincide by chance; force one coefficient apart.
  m2(r, c) = m1(r, c) + Scalar(1);
  VERIFY(m1 != m2);
  VERIFY(!(m1 == m2));
  VERIFY(!(m1 != m1));
  m1 = m2;
  VERIFY(m1 == m2);
  VERIFY(!(m1 != m2));

  // check automatic transposition
  sm2.setZero();
  for (Index i = 0; i < rows; ++i) sm2.col(i) = sm1.row(i);
  VERIFY_IS_APPROX(sm2, sm1.transpose());

  sm2.setZero();
  for (Index i = 0; i < rows; ++i) sm2.col(i).noalias() = sm1.row(i);
  VERIFY_IS_APPROX(sm2, sm1.transpose());

  sm2.setZero();
  for (Index i = 0; i < rows; ++i) sm2.col(i).noalias() += sm1.row(i);
  VERIFY_IS_APPROX(sm2, sm1.transpose());

  sm2.setZero();
  for (Index i = 0; i < rows; ++i) sm2.col(i).noalias() -= sm1.row(i);
  VERIFY_IS_APPROX(sm2, -sm1.transpose());

  // check ternary usage
  {
    bool b = internal::random<int>(0, 10) > 5;
    m3 = b ? m1 : m2;
    if (b)
      VERIFY_IS_APPROX(m3, m1);
    else
      VERIFY_IS_APPROX(m3, m2);
    m3 = b ? -m1 : m2;
    if (b)
      VERIFY_IS_APPROX(m3, -m1);
    else
      VERIFY_IS_APPROX(m3, m2);
    m3 = b ? m1 : -m2;
    if (b)
      VERIFY_IS_APPROX(m3, m1);
    else
      VERIFY_IS_APPROX(m3, -m2);
  }
}

template <typename MatrixType>
void basicStuffComplex(const MatrixType& m) {
  typedef typename MatrixType::Scalar Scalar;
  typedef typename NumTraits<Scalar>::Real RealScalar;
  typedef Matrix<RealScalar, MatrixType::RowsAtCompileTime, MatrixType::ColsAtCompileTime> RealMatrixType;

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

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

  VERIFY(numext::real(s1) == numext::real_ref(s1));
  VERIFY(numext::imag(s1) == numext::imag_ref(s1));
  numext::real_ref(s1) = numext::real(s2);
  numext::imag_ref(s1) = numext::imag(s2);
  VERIFY(internal::isApprox(s1, s2, NumTraits<RealScalar>::epsilon()));
  // extended precision in Intel FPUs means that s1 == s2 in the line above is not guaranteed.

  RealMatrixType rm1 = RealMatrixType::Random(rows, cols), rm2 = RealMatrixType::Random(rows, cols);
  MatrixType cm(rows, cols);
  cm.real() = rm1;
  cm.imag() = rm2;
  VERIFY_IS_APPROX(static_cast<const MatrixType&>(cm).real(), rm1);
  VERIFY_IS_APPROX(static_cast<const MatrixType&>(cm).imag(), rm2);
  rm1.setZero();
  rm2.setZero();
  rm1 = cm.real();
  rm2 = cm.imag();
  VERIFY_IS_APPROX(static_cast<const MatrixType&>(cm).real(), rm1);
  VERIFY_IS_APPROX(static_cast<const MatrixType&>(cm).imag(), rm2);
  cm.real().setZero();
  VERIFY(static_cast<const MatrixType&>(cm).real().isZero());
  VERIFY(!static_cast<const MatrixType&>(cm).imag().isZero());
}

// Regression test for issue #3096: reading imag() of a *non-const* real-valued object used to go
// through the writable CwiseUnaryView, whose functor returns a dangling reference to a temporary
// for real scalars (segfault with GCC, garbage with Clang). For real scalars the non-const imag()
// overload must return the same read-only zero expression as the const one.
template <typename MatrixType>
void basicStuffRealImag(const MatrixType& m) {
  typedef typename MatrixType::RealScalar RealScalar;

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

  MatrixType m1 = MatrixType::Random(rows, cols);
  // Non-const lvalue.
  VERIFY_IS_EQUAL(m1.imag().cwiseAbs().sum(), RealScalar(0));
  // Non-const expression wrappers (temporaries), the case that used to crash.
  VERIFY((m1.array().imag() == RealScalar(0)).all());
  VERIFY_IS_EQUAL(m1.block(0, 0, rows, cols).imag().cwiseAbs().sum(), RealScalar(0));
  // real() of a real-valued object aliases the object itself, both in the const and non-const case.
  VERIFY(m1.real().data() == m1.data());
  VERIFY(static_cast<const MatrixType&>(m1).real().data() == m1.data());
}

template <typename SrcScalar, typename TgtScalar>
struct casting_test {
  static void run() {
    Matrix<SrcScalar, 4, 4> m;
    for (int i = 0; i < m.rows(); ++i) {
      for (int j = 0; j < m.cols(); ++j) {
        m(i, j) = internal::random_without_cast_overflow<SrcScalar, TgtScalar>::value();
      }
    }
    Matrix<TgtScalar, 4, 4> n = m.template cast<TgtScalar>();
    for (int i = 0; i < m.rows(); ++i) {
      for (int j = 0; j < m.cols(); ++j) {
        // Materialize both values to avoid GCC miscompilation at -O3 on some targets
        // (e.g., loongarch64) where the compiler may keep intermediate results in wider
        // FP registers, causing the comparison to see different precision than intended.
        TgtScalar actual = n(i, j);
        TgtScalar expected = internal::cast<SrcScalar, TgtScalar>(m(i, j));
        VERIFY_IS_APPROX(actual, expected);
      }
    }
  }
};

template <typename SrcScalar, typename EnableIf = void>
struct casting_test_runner {
  static void run() {
    casting_test<SrcScalar, bool>::run();
    casting_test<SrcScalar, int8_t>::run();
    casting_test<SrcScalar, uint8_t>::run();
    casting_test<SrcScalar, int16_t>::run();
    casting_test<SrcScalar, uint16_t>::run();
    casting_test<SrcScalar, int32_t>::run();
    casting_test<SrcScalar, uint32_t>::run();
    casting_test<SrcScalar, int64_t>::run();
    casting_test<SrcScalar, uint64_t>::run();
    casting_test<SrcScalar, half>::run();
    casting_test<SrcScalar, bfloat16>::run();
    casting_test<SrcScalar, float>::run();
    casting_test<SrcScalar, double>::run();
    casting_test<SrcScalar, std::complex<float>>::run();
    casting_test<SrcScalar, std::complex<double>>::run();
  }
};

template <typename SrcScalar>
struct casting_test_runner<SrcScalar, std::enable_if_t<(NumTraits<SrcScalar>::IsComplex)>> {
  static void run() {
    // Only a few casts from std::complex<T> are defined.
    casting_test<SrcScalar, half>::run();
    casting_test<SrcScalar, bfloat16>::run();
    casting_test<SrcScalar, std::complex<float>>::run();
    casting_test<SrcScalar, std::complex<double>>::run();
  }
};

template <typename = void>
void casting_all() {
  casting_test_runner<bool>::run();
  casting_test_runner<int8_t>::run();
  casting_test_runner<uint8_t>::run();
  casting_test_runner<int16_t>::run();
  casting_test_runner<uint16_t>::run();
  casting_test_runner<int32_t>::run();
  casting_test_runner<uint32_t>::run();
  casting_test_runner<int64_t>::run();
  casting_test_runner<uint64_t>::run();
  casting_test_runner<half>::run();
  casting_test_runner<bfloat16>::run();
  casting_test_runner<float>::run();
  casting_test_runner<double>::run();
  casting_test_runner<std::complex<float>>::run();
  casting_test_runner<std::complex<double>>::run();
}

// Floats beyond the 32-bit integer range must survive a vectorized cast to 64-bit integers.
template <typename = void>
void casting_float_to_int64() {
  Array<float, 8, 1> x;
  x << 3.0e9f, -3.0e9f, 5.0e9f, 1.0e18f, 2147483648.f, -2147483904.f, 4294967296.f, 1.5f;
  const Array<int64_t, 8, 1> l = x.cast<int64_t>();
  const Array<uint64_t, 8, 1> u = x.abs().cast<uint64_t>();
  for (int i = 0; i < x.size(); ++i) {
    VERIFY_IS_EQUAL(l(i), static_cast<int64_t>(x(i)));
    VERIFY_IS_EQUAL(u(i), static_cast<uint64_t>(numext::abs(x(i))));
  }
}

template <typename Scalar>
void fixedSizeMatrixConstruction() {
  Scalar raw[4];
  for (int k = 0; k < 4; ++k) raw[k] = internal::random<Scalar>();

  {
    Matrix<Scalar, 4, 1> m(raw);
    Array<Scalar, 4, 1> a(raw);
    for (int k = 0; k < 4; ++k) VERIFY(m(k) == raw[k]);
    for (int k = 0; k < 4; ++k) VERIFY(a(k) == raw[k]);
    VERIFY_IS_EQUAL(m, (Matrix<Scalar, 4, 1>(raw[0], raw[1], raw[2], raw[3])));
    VERIFY((a == (Array<Scalar, 4, 1>(raw[0], raw[1], raw[2], raw[3]))).all());
  }
  {
    Matrix<Scalar, 3, 1> m(raw);
    Array<Scalar, 3, 1> a(raw);
    for (int k = 0; k < 3; ++k) VERIFY(m(k) == raw[k]);
    for (int k = 0; k < 3; ++k) VERIFY(a(k) == raw[k]);
    VERIFY_IS_EQUAL(m, (Matrix<Scalar, 3, 1>(raw[0], raw[1], raw[2])));
    VERIFY((a == Array<Scalar, 3, 1>(raw[0], raw[1], raw[2])).all());
  }
  {
    Matrix<Scalar, 2, 1> m(raw), m2((DenseIndex(raw[0])), (DenseIndex(raw[1])));
    Array<Scalar, 2, 1> a(raw), a2((DenseIndex(raw[0])), (DenseIndex(raw[1])));
    for (int k = 0; k < 2; ++k) VERIFY(m(k) == raw[k]);
    for (int k = 0; k < 2; ++k) VERIFY(a(k) == raw[k]);
    VERIFY_IS_EQUAL(m, (Matrix<Scalar, 2, 1>(raw[0], raw[1])));
    VERIFY((a == Array<Scalar, 2, 1>(raw[0], raw[1])).all());
    for (int k = 0; k < 2; ++k) VERIFY(m2(k) == DenseIndex(raw[k]));
    for (int k = 0; k < 2; ++k) VERIFY(a2(k) == DenseIndex(raw[k]));
  }
  {
    Matrix<Scalar, 1, 2> m(raw), m2((DenseIndex(raw[0])), (DenseIndex(raw[1]))), m3((int(raw[0])), (int(raw[1]))),
        m4((float(raw[0])), (float(raw[1])));
    Array<Scalar, 1, 2> a(raw), a2((DenseIndex(raw[0])), (DenseIndex(raw[1])));
    for (int k = 0; k < 2; ++k) VERIFY(m(k) == raw[k]);
    for (int k = 0; k < 2; ++k) VERIFY(a(k) == raw[k]);
    VERIFY_IS_EQUAL(m, (Matrix<Scalar, 1, 2>(raw[0], raw[1])));
    VERIFY((a == Array<Scalar, 1, 2>(raw[0], raw[1])).all());
    for (int k = 0; k < 2; ++k) VERIFY(m2(k) == DenseIndex(raw[k]));
    for (int k = 0; k < 2; ++k) VERIFY(a2(k) == DenseIndex(raw[k]));
    for (int k = 0; k < 2; ++k) VERIFY(m3(k) == int(raw[k]));
    for (int k = 0; k < 2; ++k) VERIFY((m4(k)) == Scalar(float(raw[k])));
  }
  {
    Matrix<Scalar, 1, 1> m(raw), m1(raw[0]), m2((DenseIndex(raw[0]))), m3((int(raw[0])));
    Array<Scalar, 1, 1> a(raw), a1(raw[0]), a2((DenseIndex(raw[0])));
    VERIFY(m(0) == raw[0]);
    VERIFY(a(0) == raw[0]);
    VERIFY(m1(0) == raw[0]);
    VERIFY(a1(0) == raw[0]);
    VERIFY(m2(0) == DenseIndex(raw[0]));
    VERIFY(a2(0) == DenseIndex(raw[0]));
    VERIFY(m3(0) == int(raw[0]));
    VERIFY_IS_EQUAL(m, (Matrix<Scalar, 1, 1>(raw[0])));
    VERIFY((a == Array<Scalar, 1, 1>(raw[0])).all());
  }
}

// InnerIterator of a dense expression advances by more than one coefficient.
template <typename = void>
void denseInnerIteratorAdvance() {
  using ColMajorMatrix = Matrix<float, 5, 3, ColMajor>;
  ColMajorMatrix m = ColMajorMatrix::Random();
  InnerIterator<ColMajorMatrix> it(m, 1);
  it += 2;
  VERIFY_IS_EQUAL(it.row(), Index(2));
  VERIFY_IS_EQUAL(it.value(), m(2, 1));
  it += 3;
  VERIFY(!it);
}

// nestedExpression() is callable on a non-const unary expression, whose operand is always nested as const.
template <typename = void>
void unaryNestedExpression() {
  const Matrix3f m = Matrix3f::Random();
  auto negated = -m;
  VERIFY(&negated.nestedExpression() == &m);
  auto absSum = (m + m).cwiseAbs();
  VERIFY_IS_EQUAL(absSum.nestedExpression().rows(), m.rows());
}

EIGEN_DECLARE_TEST(basicstuff) {
  for (int i = 0; i < g_repeat; i++) {
    CALL_SUBTEST_1(basicStuff(Matrix<float, 1, 1>()));
    CALL_SUBTEST_2(basicStuff(Matrix4d()));
    CALL_SUBTEST_3(basicStuff(
        MatrixXcf(internal::random<int>(1, EIGEN_TEST_MAX_SIZE), internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));
    CALL_SUBTEST_4(basicStuff(
        MatrixXi(internal::random<int>(1, EIGEN_TEST_MAX_SIZE), internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));
    CALL_SUBTEST_5(basicStuff(
        MatrixXcd(internal::random<int>(1, EIGEN_TEST_MAX_SIZE), internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));
    CALL_SUBTEST_6(basicStuff(Matrix<float, 100, 100>()));
    CALL_SUBTEST_7(basicStuff(Matrix<long double, Dynamic, Dynamic>(internal::random<int>(1, EIGEN_TEST_MAX_SIZE),
                                                                    internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));
    CALL_SUBTEST_8(casting_all<>());
    CALL_SUBTEST_8(casting_float_to_int64<>());

    CALL_SUBTEST_3(basicStuffComplex(
        MatrixXcf(internal::random<int>(1, EIGEN_TEST_MAX_SIZE), internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));
    CALL_SUBTEST_5(basicStuffComplex(
        MatrixXcd(internal::random<int>(1, EIGEN_TEST_MAX_SIZE), internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));

    CALL_SUBTEST_1(basicStuffRealImag(Matrix<float, 1, 1>()));
    CALL_SUBTEST_2(basicStuffRealImag(Matrix4d()));
    CALL_SUBTEST_7(basicStuffRealImag(
        MatrixXd(internal::random<int>(1, EIGEN_TEST_MAX_SIZE), internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));
  }

  CALL_SUBTEST_1(denseInnerIteratorAdvance<>());
  CALL_SUBTEST_1(unaryNestedExpression<>());
  CALL_SUBTEST_1(fixedSizeMatrixConstruction<unsigned char>());
  CALL_SUBTEST_1(fixedSizeMatrixConstruction<float>());
  CALL_SUBTEST_1(fixedSizeMatrixConstruction<double>());
  CALL_SUBTEST_1(fixedSizeMatrixConstruction<int>());
  CALL_SUBTEST_1(fixedSizeMatrixConstruction<long int>());
  CALL_SUBTEST_1(fixedSizeMatrixConstruction<std::ptrdiff_t>());
}
