// 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/.

#define TEST_ENABLE_TEMPORARY_TRACKING
#define TEST_IGNORE_STACK_ALLOCATED_TEMPORARY

#include "main.h"

template <typename Dst, typename Lhs, typename Rhs>
void check_scalar_multiple3(Dst& dst, const Lhs& A, const Rhs& B) {
  VERIFY_EVALUATION_COUNT((dst.noalias() = A * B), 0);
  VERIFY_IS_APPROX(dst, (A.eval() * B.eval()).eval());
  VERIFY_EVALUATION_COUNT((dst.noalias() += A * B), 0);
  VERIFY_IS_APPROX(dst, 2 * (A.eval() * B.eval()).eval());
  VERIFY_EVALUATION_COUNT((dst.noalias() -= A * B), 0);
  VERIFY_IS_APPROX(dst, (A.eval() * B.eval()).eval());
}

template <typename Dst, typename Lhs, typename Rhs, typename S2>
void check_scalar_multiple2(Dst& dst, const Lhs& A, const Rhs& B, S2 s2) {
  CALL_SUBTEST(check_scalar_multiple3(dst, A, B));
  CALL_SUBTEST(check_scalar_multiple3(dst, A, -B));
  CALL_SUBTEST(check_scalar_multiple3(dst, A, s2 * B));
  CALL_SUBTEST(check_scalar_multiple3(dst, A, B * s2));
  CALL_SUBTEST(check_scalar_multiple3(dst, A, (B * s2).conjugate()));
}

template <typename Dst, typename Lhs, typename Rhs, typename S1, typename S2>
void check_scalar_multiple1(Dst& dst, const Lhs& A, const Rhs& B, S1 s1, S2 s2) {
  CALL_SUBTEST(check_scalar_multiple2(dst, A, B, s2));
  CALL_SUBTEST(check_scalar_multiple2(dst, -A, B, s2));
  CALL_SUBTEST(check_scalar_multiple2(dst, s1 * A, B, s2));
  CALL_SUBTEST(check_scalar_multiple2(dst, A * s1, B, s2));
  CALL_SUBTEST(check_scalar_multiple2(dst, (A * s1).conjugate(), B, s2));
}

template <typename MatrixType>
void product_notemporary(const MatrixType& m) {
  /* This test checks the number of temporaries created
   * during the evaluation of a complex expression */
  typedef typename MatrixType::Scalar Scalar;
  typedef typename MatrixType::RealScalar RealScalar;
  typedef Matrix<Scalar, 1, Dynamic> RowVectorType;
  typedef Matrix<Scalar, Dynamic, 1> ColVectorType;
  typedef Matrix<Scalar, Dynamic, Dynamic, ColMajor> ColMajorMatrixType;
  typedef Matrix<Scalar, Dynamic, Dynamic, RowMajor> RowMajorMatrixType;

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

  ColMajorMatrixType m1 = MatrixType::Random(rows, cols), m2 = MatrixType::Random(rows, cols), m3(rows, cols);
  RowVectorType rv1 = RowVectorType::Random(rows), rvres(rows);
  ColVectorType cv1 = ColVectorType::Random(cols), cvres(cols);
  RowMajorMatrixType rm3(rows, cols);

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

  Index c0 = internal::random<Index>(4, cols - 8), c1 = internal::random<Index>(8, cols - c0),
        r0 = internal::random<Index>(4, cols - 8), r1 = internal::random<Index>(8, rows - r0);

  VERIFY_EVALUATION_COUNT(m3 = (m1 * m2.adjoint()), 1);
  VERIFY_EVALUATION_COUNT(m3 = (m1 * m2.adjoint()).transpose(), 1);
  VERIFY_EVALUATION_COUNT(m3.noalias() = (m1 * m2.adjoint()).transpose(), 0);
  VERIFY_EVALUATION_COUNT(m3.noalias() = (m1 * m2.transpose()).adjoint(), 0);
  VERIFY_EVALUATION_COUNT(m3.noalias() = m1 * m2.adjoint(), 0);

  VERIFY_EVALUATION_COUNT(m3 = s1 * (m1 * m2.transpose()), 1);
  //   VERIFY_EVALUATION_COUNT( m3 = m3 + s1 * (m1 * m2.transpose()), 1);
  VERIFY_EVALUATION_COUNT(m3.noalias() = s1 * (m1 * m2.transpose()), 0);

  VERIFY_EVALUATION_COUNT(m3 = m3 + (m1 * m2.adjoint()), 1);
  VERIFY_EVALUATION_COUNT(m3 = m3 - (m1 * m2.adjoint()), 1);

  VERIFY_EVALUATION_COUNT(m3 = m3 + (m1 * m2.adjoint()).transpose(), 1);
  VERIFY_EVALUATION_COUNT(m3.noalias() = m3 + (m1 * m2.adjoint()).transpose(), 0);
  VERIFY_EVALUATION_COUNT(m3.noalias() = m3 + (m1 * m2.transpose()).adjoint(), 0);
  VERIFY_EVALUATION_COUNT(m3.noalias() = m3 + m1 * m2.transpose(), 0);
  VERIFY_EVALUATION_COUNT(m3.noalias() += m3 + m1 * m2.transpose(), 0);
  VERIFY_EVALUATION_COUNT(m3.noalias() -= m3 + m1 * m2.transpose(), 0);
  VERIFY_EVALUATION_COUNT(m3.noalias() = m3 - m1 * m2.transpose(), 0);
  VERIFY_EVALUATION_COUNT(m3.noalias() += m3 - m1 * m2.transpose(), 0);
  VERIFY_EVALUATION_COUNT(m3.noalias() -= m3 - m1 * m2.transpose(), 0);

  VERIFY_EVALUATION_COUNT(m3.noalias() = s1 * m1 * s2 * m2.adjoint(), 0);
  VERIFY_EVALUATION_COUNT(m3.noalias() = s1 * m1 * s2 * (m1 * s3 + m2 * s2).adjoint(), 1);
  VERIFY_EVALUATION_COUNT(m3.noalias() = (s1 * m1).adjoint() * s2 * m2, 0);
  VERIFY_EVALUATION_COUNT(m3.noalias() += s1 * (-m1 * s3).adjoint() * (s2 * m2 * s3), 0);
  VERIFY_EVALUATION_COUNT(m3.noalias() -= s1 * (m1.transpose() * m2), 0);

  VERIFY_EVALUATION_COUNT(
      (m3.block(r0, r0, r1, r1).noalias() += -m1.block(r0, c0, r1, c1) * (s2 * m2.block(r0, c0, r1, c1)).adjoint()), 0);
  VERIFY_EVALUATION_COUNT(
      (m3.block(r0, r0, r1, r1).noalias() -= s1 * m1.block(r0, c0, r1, c1) * m2.block(c0, r0, c1, r1)), 0);

  // NOTE this is because the Block expression is not handled yet by our expression analyser
  VERIFY_EVALUATION_COUNT(
      (m3.block(r0, r0, r1, r1).noalias() = s1 * m1.block(r0, c0, r1, c1) * (s1 * m2).block(c0, r0, c1, r1)), 1);

  VERIFY_EVALUATION_COUNT(m3.noalias() -= (s1 * m1).template triangularView<Lower>() * m2, 0);
  VERIFY_EVALUATION_COUNT(rm3.noalias() = (s1 * m1.adjoint()).template triangularView<Upper>() * (m2 + m2), 1);
  VERIFY_EVALUATION_COUNT(rm3.noalias() = (s1 * m1.adjoint()).template triangularView<UnitUpper>() * m2.adjoint(), 0);

  VERIFY_EVALUATION_COUNT(m3.template triangularView<Upper>() = (m1 * m2.adjoint()), 0);
  VERIFY_EVALUATION_COUNT(m3.template triangularView<Upper>() -= (m1 * m2.adjoint()), 0);

  // NOTE this is because the blas_traits require innerstride==1 to avoid a temporary, but that doesn't seem to be
  // actually needed for the triangular products
  VERIFY_EVALUATION_COUNT(
      rm3.col(c0).noalias() = (s1 * m1.adjoint()).template triangularView<UnitUpper>() * (s2 * m2.row(c0)).adjoint(),
      1);

  VERIFY_EVALUATION_COUNT(m1.template triangularView<Lower>().solveInPlace(m3), 0);
  VERIFY_EVALUATION_COUNT(m1.adjoint().template triangularView<Lower>().solveInPlace(m3.transpose()), 0);

  VERIFY_EVALUATION_COUNT(m3.noalias() -= (s1 * m1).adjoint().template selfadjointView<Lower>() * (-m2 * s3).adjoint(),
                          0);
  VERIFY_EVALUATION_COUNT(m3.noalias() = s2 * m2.adjoint() * (s1 * m1.adjoint()).template selfadjointView<Upper>(), 0);
  VERIFY_EVALUATION_COUNT(rm3.noalias() = (s1 * m1.adjoint()).template selfadjointView<Lower>() * m2.adjoint(), 0);

  // NOTE this is because the blas_traits require innerstride==1 to avoid a temporary, but that doesn't seem to be
  // actually needed for the triangular products
  VERIFY_EVALUATION_COUNT(
      m3.col(c0).noalias() = (s1 * m1).adjoint().template selfadjointView<Lower>() * (-m2.row(c0) * s3).adjoint(), 1);
  VERIFY_EVALUATION_COUNT(
      m3.col(c0).noalias() -= (s1 * m1).adjoint().template selfadjointView<Upper>() * (-m2.row(c0) * s3).adjoint(), 1);

  VERIFY_EVALUATION_COUNT(m3.block(r0, c0, r1, c1).noalias() +=
                          m1.block(r0, r0, r1, r1).template selfadjointView<Upper>() * (s1 * m2.block(r0, c0, r1, c1)),
                          0);
  VERIFY_EVALUATION_COUNT(m3.block(r0, c0, r1, c1).noalias() =
                              m1.block(r0, r0, r1, r1).template selfadjointView<Upper>() * m2.block(r0, c0, r1, c1),
                          0);

  VERIFY_EVALUATION_COUNT(m3.template selfadjointView<Lower>().rankUpdate(m2.adjoint()), 0);

  // Here we will get 1 temporary for each resize operation of the lhs operator; resize(r1,c1) would lead to zero
  // temporaries
  m3.resize(1, 1);
  VERIFY_EVALUATION_COUNT(
      m3.noalias() = m1.block(r0, r0, r1, r1).template selfadjointView<Lower>() * m2.block(r0, c0, r1, c1), 1);
  m3.resize(1, 1);
  VERIFY_EVALUATION_COUNT(
      m3.noalias() = m1.block(r0, r0, r1, r1).template triangularView<UnitUpper>() * m2.block(r0, c0, r1, c1), 1);

  // Zero temporaries for lazy products ...
  m3.setRandom(rows, cols);
  VERIFY_EVALUATION_COUNT(Scalar tmp = 0;
                          tmp += Scalar(RealScalar(1)) / (m3.transpose().lazyProduct(m3)).diagonal().sum(), 0);
  VERIFY_EVALUATION_COUNT(m3.noalias() = m1.conjugate().lazyProduct(m2.conjugate()), 0);

  // ... and even no temporary for even deeply (>=2) nested products
  VERIFY_EVALUATION_COUNT(Scalar tmp = 0; tmp += Scalar(RealScalar(1)) / (m3.transpose() * m3).diagonal().sum(), 0);
  VERIFY_EVALUATION_COUNT(Scalar tmp = 0;
                          tmp += Scalar(RealScalar(1)) / (m3.transpose() * m3).diagonal().array().abs().sum(), 0);

  // Zero temporaries for ... CoeffBasedProductMode
  VERIFY_EVALUATION_COUNT(
      m3.col(0).template head<5>() * m3.col(0).transpose() + m3.col(0).template head<5>() * m3.col(0).transpose(), 0);

  // Check matrix * vectors
  VERIFY_EVALUATION_COUNT(cvres.noalias() = m1 * cv1, 0);
  VERIFY_EVALUATION_COUNT(cvres.noalias() -= m1 * cv1, 0);
  VERIFY_EVALUATION_COUNT(cvres.noalias() -= m1 * m2.col(0), 0);
  VERIFY_EVALUATION_COUNT(cvres.noalias() -= m1 * rv1.adjoint(), 0);
  VERIFY_EVALUATION_COUNT(cvres.noalias() -= m1 * m2.row(0).transpose(), 0);

  VERIFY_EVALUATION_COUNT(cvres.noalias() = (m1 + m1) * cv1, 0);
  VERIFY_EVALUATION_COUNT(cvres.noalias() = (rm3 + rm3) * cv1, 0);
  VERIFY_EVALUATION_COUNT(cvres.noalias() = (m1 + m1) * (m1 * cv1), 1);
  VERIFY_EVALUATION_COUNT(cvres.noalias() = (rm3 + rm3) * (m1 * cv1), 1);

// Check outer products
#ifdef EIGEN_ALLOCA
  bool temp_via_alloca = m3.rows() * sizeof(Scalar) <= EIGEN_STACK_ALLOCATION_LIMIT;
#else
  bool temp_via_alloca = false;
#endif
  m3 = cv1 * rv1;
  VERIFY_EVALUATION_COUNT(m3.noalias() = cv1 * rv1, 0);
  VERIFY_EVALUATION_COUNT(m3.noalias() = (cv1 + cv1) * (rv1 + rv1), temp_via_alloca ? 0 : 1);
  VERIFY_EVALUATION_COUNT(m3.noalias() = (m1 * cv1) * (rv1), 1);
  VERIFY_EVALUATION_COUNT(m3.noalias() += (m1 * cv1) * (rv1), 1);
  rm3 = cv1 * rv1;
  VERIFY_EVALUATION_COUNT(rm3.noalias() = cv1 * rv1, 0);
  VERIFY_EVALUATION_COUNT(rm3.noalias() = (cv1 + cv1) * (rv1 + rv1), temp_via_alloca ? 0 : 1);
  VERIFY_EVALUATION_COUNT(rm3.noalias() = (cv1) * (rv1 * m1), 1);
  VERIFY_EVALUATION_COUNT(rm3.noalias() -= (cv1) * (rv1 * m1), 1);
  VERIFY_EVALUATION_COUNT(rm3.noalias() = (m1 * cv1) * (rv1 * m1), 2);
  VERIFY_EVALUATION_COUNT(rm3.noalias() += (m1 * cv1) * (rv1 * m1), 2);

  // Check nested products
  VERIFY_EVALUATION_COUNT(cvres.noalias() = m1.adjoint() * m1 * cv1, 1);
  VERIFY_EVALUATION_COUNT(rvres.noalias() = rv1 * (m1 * m2.adjoint()), 1);

  // exhaustively check all scalar multiple combinations:
  {
    // Generic path:
    check_scalar_multiple1(m3, m1, m2, s1, s2);
    // Force fall back to coeff-based:
    typename ColMajorMatrixType::BlockXpr m3_blck = m3.block(r0, r0, 1, 1);
    check_scalar_multiple1(m3_blck, m1.block(r0, c0, 1, 1), m2.block(c0, r0, 1, 1), s1, s2);
  }
}

EIGEN_DECLARE_TEST(product_notemporary) {
  int s;
  for (int i = 0; i < g_repeat; i++) {
    s = internal::random<int>(16, EIGEN_TEST_MAX_SIZE);
    CALL_SUBTEST_1(product_notemporary(MatrixXf(s, s)));
    CALL_SUBTEST_2(product_notemporary(MatrixXd(s, s)));
    TEST_SET_BUT_UNUSED_VARIABLE(s)

    s = internal::random<int>(16, EIGEN_TEST_MAX_SIZE / 2);
    CALL_SUBTEST_3(product_notemporary(MatrixXcf(s, s)));
    CALL_SUBTEST_4(product_notemporary(MatrixXcd(s, s)));
    TEST_SET_BUT_UNUSED_VARIABLE(s)
  }
}
