// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2011 Gael Guennebaud <g.gael@free.fr>
// Copyright (C) 2012 Kolja Brix <brix@igpm.rwth-aaachen.de>
//
// 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 "sparse_solver.h"
#include <Eigen/IterativeLinearSolvers>

template <typename T>
void test_bicgstabl_T() {
  BiCGSTABL<SparseMatrix<T>, DiagonalPreconditioner<T> > bicgstabl_colmajor_diag;
  BiCGSTABL<SparseMatrix<T>, IncompleteLUT<T> > bicgstabl_colmajor_ilut;

  // This does not change the tolerance of the test, only the tolerance of the solver.
  bicgstabl_colmajor_diag.setTolerance(NumTraits<T>::epsilon() * 20);
  bicgstabl_colmajor_ilut.setTolerance(NumTraits<T>::epsilon() * 20);

  CALL_SUBTEST(check_sparse_square_solving(bicgstabl_colmajor_diag));
  CALL_SUBTEST(check_sparse_square_solving(bicgstabl_colmajor_ilut));
}

template <typename = void>
void test_bicgstabl_solve_with_guess_restart() {
  // Regression for a solveWithGuess case where the recursive residual reached
  // the tolerance before the true residual did.
  srand(555248885);
  test_bicgstabl_T<double>();
}

// A zero right-hand side is solved by x = 0 without iterating; iterations() used to report the cap.
void test_zero_rhs() {
  SparseMatrix<double> A(4, 4);
  for (Index i = 0; i < 4; ++i) A.insert(i, i) = 2.0;
  BiCGSTABL<SparseMatrix<double> > solver(A);
  VectorXd x = solver.solve(VectorXd::Zero(4));
  VERIFY(x.isZero());
  VERIFY_IS_EQUAL(solver.iterations(), Index(0));
  VERIFY_IS_EQUAL(solver.error(), 0.0);
}

EIGEN_DECLARE_TEST(bicgstabl) {
  CALL_SUBTEST_1(test_bicgstabl_T<double>());
  CALL_SUBTEST_2(test_bicgstabl_T<std::complex<double> >());
  CALL_SUBTEST_3(test_bicgstabl_solve_with_guess_restart<>());
  CALL_SUBTEST_3(test_zero_rhs());
}
