// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2012 Giacomo Po <gpo@ucla.edu>
// Copyright (C) 2011 Gael Guennebaud <g.gael@free.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 <cmath>

#include "sparse_solver.h"
#include <Eigen/IterativeLinearSolvers>

template <typename T>
void test_minres_T() {
  // Identity preconditioner
  MINRES<SparseMatrix<T>, Lower, IdentityPreconditioner> minres_colmajor_lower_I;
  MINRES<SparseMatrix<T>, Upper, IdentityPreconditioner> minres_colmajor_upper_I;

  // Diagonal preconditioner
  MINRES<SparseMatrix<T>, Lower, DiagonalPreconditioner<T> > minres_colmajor_lower_diag;
  MINRES<SparseMatrix<T>, Upper, DiagonalPreconditioner<T> > minres_colmajor_upper_diag;
  MINRES<SparseMatrix<T>, Lower | Upper, DiagonalPreconditioner<T> > minres_colmajor_uplo_diag;

  // call tests for SPD matrix
  CALL_SUBTEST(check_sparse_spd_solving(minres_colmajor_lower_I));
  CALL_SUBTEST(check_sparse_spd_solving(minres_colmajor_upper_I));

  CALL_SUBTEST(check_sparse_spd_solving(minres_colmajor_lower_diag));
  CALL_SUBTEST(check_sparse_spd_solving(minres_colmajor_upper_diag));
  CALL_SUBTEST(check_sparse_spd_solving(minres_colmajor_uplo_diag));

  // TO DO: symmetric semi-definite matrix
  // TO DO: symmetric indefinite matrix
}

void test_minres_extreme_rhs() {
  const Matrix2d mat = Matrix2d::Identity();
  const Vector2d direction = (Vector2d() << 1, -1).finished();
  MINRES<Matrix2d, Lower | Upper, IdentityPreconditioner> solver(mat);
  solver.setTolerance(1e-12);

  for (double scale : {1e-200, 1e200}) {
    const Vector2d rhs = scale * direction;
    const Vector2d guess = 0.5 * rhs;
    Vector2d x = solver.solve(rhs);
    VERIFY_IS_EQUAL(solver.info(), Success);
    VERIFY(x.allFinite());
    VERIFY_IS_APPROX(x / scale, direction);

    x = solver.solveWithGuess(rhs, guess);
    VERIFY_IS_EQUAL(solver.info(), Success);
    VERIFY(x.allFinite());
    VERIFY_IS_APPROX(x / scale, direction);
  }
}

EIGEN_DECLARE_TEST(minres) {
  CALL_SUBTEST_1(test_minres_T<double>());
  //  CALL_SUBTEST_2(test_minres_T<std::complex<double> >());
  CALL_SUBTEST_3(test_minres_extreme_rhs());
}
