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

#ifndef EIGEN_NONLINEAROPTIMIZATION_MODULE_H
#define EIGEN_NONLINEAROPTIMIZATION_MODULE_H

#include <vector>

#include "../../Eigen/Core"
#include "../../Eigen/Jacobi"
#include "../../Eigen/QR"
#include "NumericalDiff"

/**
 * \defgroup NonLinearOptimization_Module Non linear optimization module
 *
 * \code
 * #include <contrib/Eigen/NonLinearOptimization>
 * \endcode
 *
 * This module provides implementation of two important algorithms in non linear
 * optimization. In both cases, we consider a system of non linear functions. Of
 * course, this should work, and even work very well if those functions are
 * actually linear. But if this is so, you should probably better use other
 * methods more fitted to this special case.
 *
 * One algorithm allows to find a least-squares solution of such a system
 * (Levenberg-Marquardt algorithm) and the second one is used to find
 * a zero for the system (Powell hybrid "dogleg" method).
 *
 * This code is a port of minpack (http://en.wikipedia.org/wiki/MINPACK).
 * Minpack is a very famous, old, robust and well renowned package, written in
 * fortran. Those implementations have been carefully tuned, tested, and used
 * for several decades.
 *
 * The original fortran code was automatically translated using f2c (http://en.wikipedia.org/wiki/F2c) in C,
 * then c++, and then cleaned by several different authors.
 * The last one of those cleanings being our starting point :
 * http://devernay.free.fr/hacks/cminpack.html
 *
 * Finally, we ported this code to Eigen, creating classes and API
 * coherent with Eigen. When possible, we switched to Eigen
 * implementation, such as most linear algebra (vectors, matrices, stable norms).
 *
 * Doing so, we were very careful to check the tests we setup at the very
 * beginning, which ensure that the same results are found.
 *
 * \section Tests Tests
 *
 * The tests are placed in the file contrib/test/NonLinear.cpp.
 *
 * There are two kinds of tests : those that come from examples bundled with cminpack.
 * They guaranty we get the same results as the original algorithms (value for 'x',
 * for the number of evaluations of the function, and for the number of evaluations
 * of the Jacobian if ever).
 *
 * Other tests were added by myself at the very beginning of the
 * process and check the results for Levenberg-Marquardt using the reference data
 * on http://www.itl.nist.gov/div898/strd/nls/nls_main.shtml. Since then i've
 * carefully checked that the same results were obtained when modifying the
 * code. Please note that we do not always get the exact same decimals as they do,
 * but this is ok : they use 128bits float, and we do the tests using the C type 'double',
 * which is 64 bits on most platforms (x86 and amd64, at least).
 * I've performed those tests on several other implementations of Levenberg-Marquardt, and
 * (c)minpack performs VERY well compared to those, both in accuracy and speed.
 *
 * The documentation for running the tests is on the wiki
 * http://eigen.tuxfamily.org/index.php?title=Tests
 *
 * \section API API: overview of methods
 *
 * Both algorithms needs a functor computing the Jacobian. It can be computed by
 * hand, using auto-differentiation (see \ref AutoDiff_Module), or using numerical
 * differences (see \ref NumericalDiff_Module). For instance:
 *\code
 * MyFunc func;
 * NumericalDiff<MyFunc> func_with_num_diff(func);
 * LevenbergMarquardt<NumericalDiff<MyFunc> > lm(func_with_num_diff);
 * \endcode
 * For HybridNonLinearSolver, the method solveNumericalDiff() does the above wrapping for
 * you.
 *
 * The methods LevenbergMarquardt.lmder1()/lmdif1()/lmstr1() and
 * HybridNonLinearSolver.hybrj1()/hybrd1() are specific methods from the original
 * minpack package that you probably should NOT use until you are porting a code that
 * was previously using minpack. They just define a 'simple' API with default values
 * for some parameters.
 *
 * All algorithms are provided using two APIs :
 *     - one where the user inits the algorithm, and uses '*OneStep()' as much as he wants :
 * this way the caller have control over the steps
 *     - one where the user just calls a method (optimize() or solve()) which will
 * handle the loop: init + loop until a stop condition is met. Those are provided for
 *  convenience.
 *
 * As an example, the method LevenbergMarquardt::minimize() is
 * implemented as follow:
 * \code
 * Status LevenbergMarquardt<FunctorType,Scalar>::minimize(FVectorType  &x, const int mode)
 * {
 *     Status status = minimizeInit(x, mode);
 *     do {
 *         status = minimizeOneStep(x, mode);
 *     } while (status==Running);
 *     return status;
 * }
 * \endcode
 *
 * \section examples Examples
 *
 * The easiest way to understand how to use this module is by looking at the many examples in the file
 * contrib/test/NonLinearOptimization.cpp.
 */

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

// IWYU pragma: begin_exports
#ifndef EIGEN_PARSED_BY_DOXYGEN

#include "src/NonLinearOptimization/qrsolv.h"
#include "src/NonLinearOptimization/r1updt.h"
#include "src/NonLinearOptimization/r1mpyq.h"
#include "src/NonLinearOptimization/rwupdt.h"
#include "src/NonLinearOptimization/fdjac1.h"
#include "src/NonLinearOptimization/lmpar.h"
#include "src/NonLinearOptimization/dogleg.h"
#include "src/NonLinearOptimization/covar.h"

#include "src/NonLinearOptimization/chkder.h"

#endif

#include "src/NonLinearOptimization/HybridNonLinearSolver.h"
#include "src/NonLinearOptimization/LevenbergMarquardt.h"
// IWYU pragma: end_exports

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

#endif  // EIGEN_NONLINEAROPTIMIZATION_MODULE_H
