// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2008-2009 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/.

#ifndef EIGEN_ITERATIVE_SOLVERS_MODULE_H
#define EIGEN_ITERATIVE_SOLVERS_MODULE_H

#include "../../Eigen/Sparse"
#include "../../Eigen/Jacobi"
#include "../../Eigen/Householder"

/**
 * \defgroup IterativeLinearSolvers_Module IterativeLinearSolvers module
 * This module aims to provide various iterative linear and non linear solver algorithms.
 * It currently provides:
 *  - a Householder GMRES implementation
 *  - an IDR(s) implementation
 *  - a BiCGSTAB(L) implementation
 *  - a DGMRES implementation
 *  - a MINRES implementation
 *  - a IDRSTABL implementation
 *
 * Choosing the best solver for solving \c A \c x = \c b depends a lot on the preconditioner chosen as well as the
 *properties of \c A. The following flowchart might help you.
 * \dot width=50% 
 * digraph g {
 *   node [ fontname=Arial, fontsize=11];
 *   edge [ fontname=Helvetica, fontsize=10 ];
 *   A1[label="hermitian", shape="box"];
 *   A2[label="positive definite", shape="box"];
 *   CG[shape="plaintext"];
 *   A3[label="ill conditioned", shape="box"];
 *   A4[label="good preconditioner", shape="box"];
 *   A5[label="flexible preconditioner", shape="box"];
 *   A6[label="strongly indefinite", shape="box"];
 *   A8[label="large imaginary eigenvalue", shape="box"];
 *   A7[label="large imaginary eigenvalue",shape="box"];
 *
 *   SYMMLQ[shape="plaintext"];
 *   MINRES[shape="plaintext"];
 *   GCR[shape="plaintext"];
 *   GMRES[shape="plaintext"];
 *   IDRSTABL[shape="plaintext"];
 *   IDRS[shape="plaintext"];
 *   BICGSTABL[shape="plaintext"];
 *   BICGSTAB[shape="plaintext"];
 *
 *	 A1 -> A2 [label="yes"];
 *	 A2 -> CG [label="yes"];
 *	 A2 -> A3 [label="no"];
 *	 A3 -> SYMMLQ [label="yes"];
 *	 A3 -> MINRES [label="no"];
 *
 *	 A1 -> A4 [label="no"];
 *	 A4 -> A5 [label="yes"];
 *	 A5 -> GCR [label="yes"];
 *	 A5 -> GMRES [label="no"];
 *
 *	 A4 -> A6 [label="no"];
 *	 A6 -> A8 [label="yes"];
 *	 A6 -> A7 [label="no"];
 *	 A7 -> BICGSTABL [label="yes"];
 *	 A7 -> BICGSTAB [label="no"];
 *	 A8 -> IDRSTABL [label="yes"];
 *	 A8 -> IDRS [label="no"];
 * }
 * \enddot
 * \code
 * #include <unsupported/Eigen/IterativeSolvers>
 * \endcode
 */

#include "../../Eigen/src/Core/util/DisableStupidWarnings.h"

// IWYU pragma: begin_exports
#include "src/IterativeSolvers/IncompleteLU.h"
#include "src/IterativeSolvers/GMRES.h"
#include "src/IterativeSolvers/DGMRES.h"
#include "src/IterativeSolvers/MINRES.h"
#include "src/IterativeSolvers/IDRS.h"
#include "src/IterativeSolvers/BiCGSTABL.h"
#include "src/IterativeSolvers/IDRSTABL.h"
// IWYU pragma: end_exports

#include "../../Eigen/src/Core/util/ReenableStupidWarnings.h"

#endif  // EIGEN_ITERATIVE_SOLVERS_MODULE_H
