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

// Returns a matrix with eigenvalues clustered around 0, 1 and 2.
template <typename MatrixType>
MatrixType randomMatrixWithRealEivals(const Index size) {
  typedef typename MatrixType::Scalar Scalar;
  typedef typename MatrixType::RealScalar RealScalar;
  MatrixType diag = MatrixType::Zero(size, size);
  for (Index i = 0; i < size; ++i) {
    diag(i, i) =
        Scalar(RealScalar(internal::random<int>(0, 2))) + internal::random<Scalar>() * Scalar(RealScalar(0.01));
  }
  MatrixType A = MatrixType::Random(size, size);
  HouseholderQR<MatrixType> QRofA(A);
  return QRofA.householderQ().inverse() * diag * QRofA.householderQ();
}

template <typename MatrixType, int IsComplex = NumTraits<typename internal::traits<MatrixType>::Scalar>::IsComplex>
struct randomMatrixWithImagEivals {
  // Returns a matrix with eigenvalues clustered around 0 and +/- i.
  static MatrixType run(const Index size);
};

// Partial specialization for real matrices
template <typename MatrixType>
struct randomMatrixWithImagEivals<MatrixType, 0> {
  static MatrixType run(const Index size) {
    typedef typename MatrixType::Scalar Scalar;
    MatrixType diag = MatrixType::Zero(size, size);
    Index i = 0;
    while (i < size) {
      Index randomInt = internal::random<Index>(-1, 1);
      if (randomInt == 0 || i == size - 1) {
        diag(i, i) = internal::random<Scalar>() * Scalar(0.01);
        ++i;
      } else {
        Scalar alpha = Scalar(randomInt) + internal::random<Scalar>() * Scalar(0.01);
        diag(i, i + 1) = alpha;
        diag(i + 1, i) = -alpha;
        i += 2;
      }
    }
    MatrixType A = MatrixType::Random(size, size);
    HouseholderQR<MatrixType> QRofA(A);
    return QRofA.householderQ().inverse() * diag * QRofA.householderQ();
  }
};

// Partial specialization for complex matrices
template <typename MatrixType>
struct randomMatrixWithImagEivals<MatrixType, 1> {
  static MatrixType run(const Index size) {
    typedef typename MatrixType::Scalar Scalar;
    typedef typename MatrixType::RealScalar RealScalar;
    const Scalar imagUnit(0, 1);
    MatrixType diag = MatrixType::Zero(size, size);
    for (Index i = 0; i < size; ++i) {
      diag(i, i) = Scalar(RealScalar(internal::random<Index>(-1, 1))) * imagUnit +
                   internal::random<Scalar>() * Scalar(RealScalar(0.01));
    }
    MatrixType A = MatrixType::Random(size, size);
    HouseholderQR<MatrixType> QRofA(A);
    return QRofA.householderQ().inverse() * diag * QRofA.householderQ();
  }
};

template <typename MatrixType>
void testMatrixExponential(const MatrixType& A) {
  typedef typename internal::traits<MatrixType>::Scalar Scalar;
  typedef typename NumTraits<Scalar>::Real RealScalar;
  typedef std::complex<RealScalar> ComplexScalar;

  VERIFY_IS_APPROX(A.exp(), A.matrixFunction(internal::stem_function_exp<ComplexScalar>));
}

template <typename MatrixType>
void testMatrixLogarithm(const MatrixType& A) {
  typedef typename internal::traits<MatrixType>::Scalar Scalar;
  typedef typename NumTraits<Scalar>::Real RealScalar;

  MatrixType scaledA;
  RealScalar maxImagPartOfSpectrum = A.eigenvalues().imag().cwiseAbs().maxCoeff();
  if (maxImagPartOfSpectrum >= RealScalar(0.9L * EIGEN_PI))
    scaledA = A * RealScalar(0.9L * EIGEN_PI) / maxImagPartOfSpectrum;
  else
    scaledA = A;

  // identity X.exp().log() = X only holds if Im(lambda) < pi for all eigenvalues of X
  MatrixType expA = scaledA.exp();
  MatrixType logExpA = expA.log();
  // The round trip loses accuracy proportional to the magnitude of the intermediate exp(A), which is unbounded
  // relative to A itself once A is close to zero.
  VERIFY_IS_APPROX_SCALED(logExpA, scaledA, max_abs_coeff(expA));
}

template <typename MatrixType>
void testHyperbolicFunctions(const MatrixType& A) {
  // exp(A) and exp(-A) can cancel, so compare against the magnitude of the terms rather than of the result.
  const MatrixType expA = A.exp();
  const MatrixType expmA = (-A).exp();
  const typename NumTraits<typename MatrixType::Scalar>::Real scale =
      numext::maxi(max_abs_coeff(expA), max_abs_coeff(expmA));
  VERIFY_IS_APPROX_SCALED(A.sinh(), (expA - expmA) / 2, scale);
  VERIFY_IS_APPROX_SCALED(A.cosh(), (expA + expmA) / 2, scale);
}

template <typename MatrixType>
void testGonioFunctions(const MatrixType& A) {
  typedef typename MatrixType::Scalar Scalar;
  typedef typename NumTraits<Scalar>::Real RealScalar;
  typedef std::complex<RealScalar> ComplexScalar;
  typedef Matrix<ComplexScalar, MatrixType::RowsAtCompileTime, MatrixType::ColsAtCompileTime, MatrixType::Options>
      ComplexMatrix;

  ComplexScalar imagUnit(0, 1);
  ComplexScalar two(2, 0);

  ComplexMatrix Ac = A.template cast<ComplexScalar>();

  ComplexMatrix exp_iA = (imagUnit * Ac).exp();
  ComplexMatrix exp_miA = (-imagUnit * Ac).exp();

  // As in testHyperbolicFunctions, the two exponentials can cancel.
  const RealScalar scale = numext::maxi(max_abs_coeff(exp_iA), max_abs_coeff(exp_miA));

  ComplexMatrix sinAc = A.sin().template cast<ComplexScalar>();
  VERIFY_IS_APPROX_SCALED(sinAc, (exp_iA - exp_miA) / (two * imagUnit), scale);

  ComplexMatrix cosAc = A.cos().template cast<ComplexScalar>();
  VERIFY_IS_APPROX_SCALED(cosAc, (exp_iA + exp_miA) / 2, scale);
}

template <typename MatrixType>
void testMatrix(const MatrixType& A) {
  testMatrixExponential(A);
  testMatrixLogarithm(A);
  testHyperbolicFunctions(A);
  testGonioFunctions(A);
}

template <typename MatrixType>
void testMatrixType(const MatrixType& m) {
  // Matrices with clustered eigenvalue lead to different code paths
  // in MatrixFunction.h and are thus useful for testing.

  const Index size = m.rows();
  for (int i = 0; i < g_repeat; i++) {
    testMatrix(MatrixType::Random(size, size).eval());
    testMatrix(randomMatrixWithRealEivals<MatrixType>(size));
    testMatrix(randomMatrixWithImagEivals<MatrixType>::run(size));
  }
}

template <typename MatrixType>
void testMapRef(const MatrixType& A) {
  // Test if passing Ref and Map objects is possible
  // (Regression test for Bug #1796)
  Index size = A.rows();
  MatrixType X;
  X.setRandom(size, size);
  MatrixType Y(size, size);
  Ref<MatrixType> R(Y);
  Ref<const MatrixType> Rc(X);
  Map<MatrixType> M(Y.data(), size, size);
  Map<const MatrixType> Mc(X.data(), size, size);

  X = X * X;  // make sure sqrt is possible
  Y = X.sqrt();
  R = Rc.sqrt();
  M = Mc.sqrt();
  Y = X.exp();
  R = Rc.exp();
  M = Mc.exp();
  X = Y;  // make sure log is possible
  Y = X.log();
  R = Rc.log();
  M = Mc.log();

  Y = X.cos() + Rc.cos() + Mc.cos();
  Y = X.sin() + Rc.sin() + Mc.sin();

  Y = X.cosh() + Rc.cosh() + Mc.cosh();
  Y = X.sinh() + Rc.sinh() + Mc.sinh();
}

template <typename MatrixType>
void testMatrixLogarithmSingular() {
  // Regression test for bug #1613: log() of a singular matrix used to
  // hang because sqrt(0) = 0 is a fixed point of the inverse-scaling loop
  // in matrix_log_compute_big(). The implementation now returns NaN.
  MatrixType A = MatrixType::Zero(5, 5);
  VERIFY(A.log().array().isNaN().all());
}

EIGEN_DECLARE_TEST(matrix_function) {
  CALL_SUBTEST_1(testMatrixType(Matrix<float, 1, 1>()));
  CALL_SUBTEST_2(testMatrixType(Matrix3cf()));
  CALL_SUBTEST_3(testMatrixType(MatrixXf(8, 8)));
  CALL_SUBTEST_4(testMatrixType(Matrix2d()));
  CALL_SUBTEST_5(testMatrixType(Matrix<double, 5, 5, RowMajor>()));
  CALL_SUBTEST_6(testMatrixType(Matrix4cd()));
  CALL_SUBTEST_7(testMatrixType(MatrixXd(13, 13)));

  CALL_SUBTEST_1(testMapRef(Matrix<float, 1, 1>()));
  CALL_SUBTEST_2(testMapRef(Matrix3cf()));
  CALL_SUBTEST_3(testMapRef(MatrixXf(8, 8)));
  CALL_SUBTEST_7(testMapRef(MatrixXd(13, 13)));

  CALL_SUBTEST_3(testMatrixLogarithmSingular<MatrixXf>());
  CALL_SUBTEST_7(testMatrixLogarithmSingular<MatrixXd>());
}
