// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2011 Kolja Brix <brix@igpm.rwth-aachen.de>
// Copyright (C) 2011 Andreas Platen <andiplaten@gmx.de>
// Copyright (C) 2012 Chen-Pang He <jdh8@ms63.hinet.net>
//
// 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

#ifdef EIGEN_TEST_PART_1

#include "sparse.h"
#include <Eigen/SparseExtra>
#include <Eigen/KroneckerProduct>

template <typename MatrixType>
void check_dimension(const MatrixType& ab, const int rows, const int cols) {
  VERIFY_IS_EQUAL(ab.rows(), rows);
  VERIFY_IS_EQUAL(ab.cols(), cols);
}

template <typename MatrixType>
void check_kronecker_product(const MatrixType& ab) {
  VERIFY_IS_EQUAL(ab.rows(), 6);
  VERIFY_IS_EQUAL(ab.cols(), 6);
  VERIFY_IS_EQUAL(ab.size(), 36);
  VERIFY_IS_APPROX(ab.coeff(0, 0), -0.4017367630386106);
  VERIFY_IS_APPROX(ab.coeff(0, 1), 0.1056863433932735);
  VERIFY_IS_APPROX(ab.coeff(0, 2), -0.7255206194554212);
  VERIFY_IS_APPROX(ab.coeff(0, 3), 0.1908653336744706);
  VERIFY_IS_APPROX(ab.coeff(0, 4), 0.350864567234111);
  VERIFY_IS_APPROX(ab.coeff(0, 5), -0.0923032108308013);
  VERIFY_IS_APPROX(ab.coeff(1, 0), 0.415417514804677);
  VERIFY_IS_APPROX(ab.coeff(1, 1), -0.2369227701722048);
  VERIFY_IS_APPROX(ab.coeff(1, 2), 0.7502275131458511);
  VERIFY_IS_APPROX(ab.coeff(1, 3), -0.4278731019742696);
  VERIFY_IS_APPROX(ab.coeff(1, 4), -0.3628129162264507);
  VERIFY_IS_APPROX(ab.coeff(1, 5), 0.2069210808481275);
  VERIFY_IS_APPROX(ab.coeff(2, 0), 0.05465890160863986);
  VERIFY_IS_APPROX(ab.coeff(2, 1), -0.2634092511419858);
  VERIFY_IS_APPROX(ab.coeff(2, 2), 0.09871180285793758);
  VERIFY_IS_APPROX(ab.coeff(2, 3), -0.4757066334017702);
  VERIFY_IS_APPROX(ab.coeff(2, 4), -0.04773740823058334);
  VERIFY_IS_APPROX(ab.coeff(2, 5), 0.2300535609645254);
  VERIFY_IS_APPROX(ab.coeff(3, 0), -0.8172945853260133);
  VERIFY_IS_APPROX(ab.coeff(3, 1), 0.2150086428359221);
  VERIFY_IS_APPROX(ab.coeff(3, 2), 0.5825113847292743);
  VERIFY_IS_APPROX(ab.coeff(3, 3), -0.1532433770097174);
  VERIFY_IS_APPROX(ab.coeff(3, 4), -0.329383387282399);
  VERIFY_IS_APPROX(ab.coeff(3, 5), 0.08665207912033064);
  VERIFY_IS_APPROX(ab.coeff(4, 0), 0.8451267514863225);
  VERIFY_IS_APPROX(ab.coeff(4, 1), -0.481996458918977);
  VERIFY_IS_APPROX(ab.coeff(4, 2), -0.6023482390791535);
  VERIFY_IS_APPROX(ab.coeff(4, 3), 0.3435339347164565);
  VERIFY_IS_APPROX(ab.coeff(4, 4), 0.3406002157428891);
  VERIFY_IS_APPROX(ab.coeff(4, 5), -0.1942526344200915);
  VERIFY_IS_APPROX(ab.coeff(5, 0), 0.1111982482925399);
  VERIFY_IS_APPROX(ab.coeff(5, 1), -0.5358806424754169);
  VERIFY_IS_APPROX(ab.coeff(5, 2), -0.07925446559335647);
  VERIFY_IS_APPROX(ab.coeff(5, 3), 0.3819388757769038);
  VERIFY_IS_APPROX(ab.coeff(5, 4), 0.04481475387219876);
  VERIFY_IS_APPROX(ab.coeff(5, 5), -0.2159688616158057);
}

template <typename MatrixType>
void check_sparse_kronecker_product(const MatrixType& ab) {
  VERIFY_IS_EQUAL(ab.rows(), 12);
  VERIFY_IS_EQUAL(ab.cols(), 10);
  VERIFY_IS_EQUAL(ab.nonZeros(), 3 * 2);
  VERIFY_IS_APPROX(ab.coeff(3, 0), -0.04);
  VERIFY_IS_APPROX(ab.coeff(5, 1), 0.05);
  VERIFY_IS_APPROX(ab.coeff(0, 6), -0.08);
  VERIFY_IS_APPROX(ab.coeff(2, 7), 0.10);
  VERIFY_IS_APPROX(ab.coeff(6, 8), 0.12);
  VERIFY_IS_APPROX(ab.coeff(8, 9), -0.15);
}

EIGEN_DECLARE_TEST(kronecker_product) {
  // DM = dense matrix; SM = sparse matrix

  Matrix<double, 2, 3> DM_a;
  SparseMatrix<double> SM_a(2, 3);
  SM_a.insert(0, 0) = DM_a.coeffRef(0, 0) = -0.4461540300782201;
  SM_a.insert(0, 1) = DM_a.coeffRef(0, 1) = -0.8057364375283049;
  SM_a.insert(0, 2) = DM_a.coeffRef(0, 2) = 0.3896572459516341;
  SM_a.insert(1, 0) = DM_a.coeffRef(1, 0) = -0.9076572187376921;
  SM_a.insert(1, 1) = DM_a.coeffRef(1, 1) = 0.6469156566545853;
  SM_a.insert(1, 2) = DM_a.coeffRef(1, 2) = -0.3658010398782789;

  MatrixXd DM_b(3, 2);
  SparseMatrix<double> SM_b(3, 2);
  SM_b.insert(0, 0) = DM_b.coeffRef(0, 0) = 0.9004440976767099;
  SM_b.insert(0, 1) = DM_b.coeffRef(0, 1) = -0.2368830858139832;
  SM_b.insert(1, 0) = DM_b.coeffRef(1, 0) = -0.9311078389941825;
  SM_b.insert(1, 1) = DM_b.coeffRef(1, 1) = 0.5310335762980047;
  SM_b.insert(2, 0) = DM_b.coeffRef(2, 0) = -0.1225112806872035;
  SM_b.insert(2, 1) = DM_b.coeffRef(2, 1) = 0.5903998022741264;

  SparseMatrix<double, RowMajor> SM_row_a(SM_a), SM_row_b(SM_b);

  // test DM_fixedSize = kroneckerProduct(DM_block,DM)
  Matrix<double, 6, 6> DM_fix_ab = kroneckerProduct(DM_a.topLeftCorner<2, 3>(), DM_b);

  CALL_SUBTEST(check_kronecker_product(DM_fix_ab));
  CALL_SUBTEST(check_kronecker_product(kroneckerProduct(DM_a.topLeftCorner<2, 3>(), DM_b)));

  for (int i = 0; i < DM_fix_ab.rows(); ++i)
    for (int j = 0; j < DM_fix_ab.cols(); ++j)
      VERIFY_IS_APPROX(kroneckerProduct(DM_a, DM_b).coeff(i, j), DM_fix_ab(i, j));

  // test DM_block = kroneckerProduct(DM,DM)
  MatrixXd DM_block_ab(10, 15);
  DM_block_ab.block<6, 6>(2, 5) = kroneckerProduct(DM_a, DM_b);
  CALL_SUBTEST(check_kronecker_product(DM_block_ab.block<6, 6>(2, 5)));

  // test DM = kroneckerProduct(DM,DM)
  MatrixXd DM_ab = kroneckerProduct(DM_a, DM_b);
  CALL_SUBTEST(check_kronecker_product(DM_ab));
  CALL_SUBTEST(check_kronecker_product(kroneckerProduct(DM_a, DM_b)));

  // test SM = kroneckerProduct(SM,DM)
  SparseMatrix<double> SM_ab = kroneckerProduct(SM_a, DM_b);
  CALL_SUBTEST(check_kronecker_product(SM_ab));
  SparseMatrix<double, RowMajor> SM_ab2 = kroneckerProduct(SM_a, DM_b);
  CALL_SUBTEST(check_kronecker_product(SM_ab2));
  CALL_SUBTEST(check_kronecker_product(kroneckerProduct(SM_a, DM_b)));

  // test SM = kroneckerProduct(DM,SM)
  SM_ab.setZero();
  SM_ab.insert(0, 0) = 37.0;
  SM_ab = kroneckerProduct(DM_a, SM_b);
  CALL_SUBTEST(check_kronecker_product(SM_ab));
  SM_ab2.setZero();
  SM_ab2.insert(0, 0) = 37.0;
  SM_ab2 = kroneckerProduct(DM_a, SM_b);
  CALL_SUBTEST(check_kronecker_product(SM_ab2));
  CALL_SUBTEST(check_kronecker_product(kroneckerProduct(DM_a, SM_b)));

  // test SM = kroneckerProduct(SM,SM)
  SM_ab.resize(2, 33);
  SM_ab.insert(0, 0) = 37.0;
  SM_ab = kroneckerProduct(SM_a, SM_b);
  CALL_SUBTEST(check_kronecker_product(SM_ab));
  SM_ab2.resize(5, 11);
  SM_ab2.insert(0, 0) = 37.0;
  SM_ab2 = kroneckerProduct(SM_a, SM_b);
  CALL_SUBTEST(check_kronecker_product(SM_ab2));
  CALL_SUBTEST(check_kronecker_product(kroneckerProduct(SM_a, SM_b)));

  // test SM = kroneckerProduct(SM,SM) with sparse pattern
  SM_a.resize(4, 5);
  SM_b.resize(3, 2);
  SM_a.resizeNonZeros(0);
  SM_b.resizeNonZeros(0);
  SM_a.insert(1, 0) = -0.1;
  SM_a.insert(0, 3) = -0.2;
  SM_a.insert(2, 4) = 0.3;
  SM_a.finalize();

  SM_b.insert(0, 0) = 0.4;
  SM_b.insert(2, 1) = -0.5;
  SM_b.finalize();
  SM_ab.resize(1, 1);
  SM_ab.insert(0, 0) = 37.0;
  SM_ab = kroneckerProduct(SM_a, SM_b);
  CALL_SUBTEST(check_sparse_kronecker_product(SM_ab));

  // test dimension of result of DM = kroneckerProduct(DM,DM)
  MatrixXd DM_a2 = Eigen::MatrixXd::Random(2, 1);
  MatrixXd DM_b2 = Eigen::MatrixXd::Random(5, 4);
  MatrixXd DM_ab2 = kroneckerProduct(DM_a2, DM_b2);
  CALL_SUBTEST(check_dimension(DM_ab2, 2 * 5, 1 * 4));
  DM_a2 = Eigen::MatrixXd::Random(10, 9);
  DM_b2 = Eigen::MatrixXd::Random(4, 8);
  DM_ab2 = kroneckerProduct(DM_a2, DM_b2);
  CALL_SUBTEST(check_dimension(DM_ab2, 10 * 4, 9 * 8));

  // test linear coefficient access for vector results
  Vector2i vector_a;
  vector_a << 10, 20;
  Vector3i vector_b;
  vector_b << 1, 2, 3;
  Matrix<int, 6, 1> vector_ab = kroneckerProduct(vector_a, vector_b);
  for (Index i = 0; i < vector_ab.size(); ++i)
    VERIFY_IS_EQUAL(kroneckerProduct(vector_a, vector_b).coeff(i), vector_ab.coeff(i));

  RowVector2i row_vector_a;
  row_vector_a << 10, 20;
  Matrix<int, 1, 3> row_vector_b;
  row_vector_b << 1, 2, 3;
  Matrix<int, 1, 6> row_vector_ab = kroneckerProduct(row_vector_a, row_vector_b);
  for (Index i = 0; i < row_vector_ab.size(); ++i)
    VERIFY_IS_EQUAL(kroneckerProduct(row_vector_a, row_vector_b).coeff(i), row_vector_ab.coeff(i));

  for (int i = 0; i < g_repeat; i++) {
    double density = Eigen::internal::random<double>(0.01, 0.5);
    int ra = Eigen::internal::random<int>(1, 50);
    int ca = Eigen::internal::random<int>(1, 50);
    int rb = Eigen::internal::random<int>(1, 50);
    int cb = Eigen::internal::random<int>(1, 50);
    SparseMatrix<float, ColMajor> sA(ra, ca), sB(rb, cb), sC;
    SparseMatrix<float, RowMajor> sC2;
    MatrixXf dA(ra, ca), dB(rb, cb), dC;
    initSparse(density, dA, sA);
    initSparse(density, dB, sB);

    sC = kroneckerProduct(sA, sB);
    dC = kroneckerProduct(dA, dB);
    VERIFY_IS_APPROX(MatrixXf(sC), dC);

    sC = kroneckerProduct(sA.transpose(), sB);
    dC = kroneckerProduct(dA.transpose(), dB);
    VERIFY_IS_APPROX(MatrixXf(sC), dC);

    sC = kroneckerProduct(sA.transpose(), sB.transpose());
    dC = kroneckerProduct(dA.transpose(), dB.transpose());
    VERIFY_IS_APPROX(MatrixXf(sC), dC);

    sC = kroneckerProduct(sA, sB.transpose());
    dC = kroneckerProduct(dA, dB.transpose());
    VERIFY_IS_APPROX(MatrixXf(sC), dC);

    sC2 = kroneckerProduct(sA, sB);
    dC = kroneckerProduct(dA, dB);
    VERIFY_IS_APPROX(MatrixXf(sC2), dC);

    sC2 = kroneckerProduct(dA, sB);
    dC = kroneckerProduct(dA, dB);
    VERIFY_IS_APPROX(MatrixXf(sC2), dC);

    sC2 = kroneckerProduct(sA, dB);
    dC = kroneckerProduct(dA, dB);
    VERIFY_IS_APPROX(MatrixXf(sC2), dC);

    sC2 = kroneckerProduct(2 * sA, sB);
    dC = kroneckerProduct(2 * dA, dB);
    VERIFY_IS_APPROX(MatrixXf(sC2), dC);
  }
}

#endif

#ifdef EIGEN_TEST_PART_2

// simply check that for a dense kronecker product, sparse module is not needed
#include "main.h"
#include <Eigen/KroneckerProduct>

EIGEN_DECLARE_TEST(kronecker_product) {
  MatrixXd a(2, 2), b(3, 3), c;
  a.setRandom();
  b.setRandom();
  c = kroneckerProduct(a, b);
  VERIFY_IS_APPROX(c.block(3, 3, 3, 3), a(1, 1) * b);
}

#endif
