// 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/.

#ifndef EIGEN_NUMERICALDIFF_MODULE_H
#define EIGEN_NUMERICALDIFF_MODULE_H

#include "../../Eigen/Core"

namespace Eigen {

/**
  * \defgroup NumericalDiff_Module Numerical differentiation module
  *
  * \code
  * #include <unsupported/Eigen/NumericalDiff>
  * \endcode
  *
  * See http://en.wikipedia.org/wiki/Numerical_differentiation
  *
  * Warning : this should NOT be confused with automatic differentiation, which
  * is a different method and has its own module in Eigen : \ref
  * AutoDiff_Module.
  *
  * Currently only "Forward" and "Central" schemes are implemented. Those
  * are basic methods, and there exist some more elaborated way of
  * computing such approximates. They are implemented using both
  * proprietary and free software, and usually requires linking to an
  * external library. It is very easy for you to write a functor
  * using such software, and the purpose is quite orthogonal to what we
  * want to achieve with Eigen.
  *
  * This is why we will not provide wrappers for every great numerical
  * differentiation software that exist, but should rather stick with those
  * basic ones, that still are useful for testing.
  *
  * Also, the \ref NonLinearOptimization_Module needs this in order to
  * provide full features compatibility with the original (c)minpack
  * package.
  *
  */
}

//@{

#include "src/NumericalDiff/NumericalDiff.h"

//@}


#endif // EIGEN_NUMERICALDIFF_MODULE_H
