123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- // 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_ADLOC_FORWARD
- #define EIGEN_ADLOC_FORWARD
- //--------------------------------------------------------------------------------
- //
- // This file provides support for adolc's adouble type in forward mode.
- // ADOL-C is a C++ automatic differentiation library,
- // see https://projects.coin-or.org/ADOL-C for more information.
- //
- // Note that the maximal number of directions is controlled by
- // the preprocessor token NUMBER_DIRECTIONS. The default is 2.
- //
- //--------------------------------------------------------------------------------
- #define ADOLC_TAPELESS
- #ifndef NUMBER_DIRECTIONS
- # define NUMBER_DIRECTIONS 2
- #endif
- #include <adolc/adtl.h>
- // adolc defines some very stupid macros:
- #if defined(malloc)
- # undef malloc
- #endif
- #if defined(calloc)
- # undef calloc
- #endif
- #if defined(realloc)
- # undef realloc
- #endif
- #include <Eigen/Core>
- namespace Eigen {
- /**
- * \defgroup AdolcForward_Module Adolc forward module
- * This module provides support for adolc's adouble type in forward mode.
- * ADOL-C is a C++ automatic differentiation library,
- * see https://projects.coin-or.org/ADOL-C for more information.
- * It mainly consists in:
- * - a struct Eigen::NumTraits<adtl::adouble> specialization
- * - overloads of internal::* math function for adtl::adouble type.
- *
- * Note that the maximal number of directions is controlled by
- * the preprocessor token NUMBER_DIRECTIONS. The default is 2.
- *
- * \code
- * #include <unsupported/Eigen/AdolcSupport>
- * \endcode
- */
- //@{
- } // namespace Eigen
- // Eigen's require a few additional functions which must be defined in the same namespace
- // than the custom scalar type own namespace
- namespace adtl {
- inline const adouble& conj(const adouble& x) { return x; }
- inline const adouble& real(const adouble& x) { return x; }
- inline adouble imag(const adouble&) { return 0.; }
- inline adouble abs(const adouble& x) { return fabs(x); }
- inline adouble abs2(const adouble& x) { return x*x; }
- }
- namespace Eigen {
- template<> struct NumTraits<adtl::adouble>
- : NumTraits<double>
- {
- typedef adtl::adouble Real;
- typedef adtl::adouble NonInteger;
- typedef adtl::adouble Nested;
- enum {
- IsComplex = 0,
- IsInteger = 0,
- IsSigned = 1,
- RequireInitialization = 1,
- ReadCost = 1,
- AddCost = 1,
- MulCost = 1
- };
- };
- template<typename Functor> class AdolcForwardJacobian : public Functor
- {
- typedef adtl::adouble ActiveScalar;
- public:
- AdolcForwardJacobian() : Functor() {}
- AdolcForwardJacobian(const Functor& f) : Functor(f) {}
- // forward constructors
- template<typename T0>
- AdolcForwardJacobian(const T0& a0) : Functor(a0) {}
- template<typename T0, typename T1>
- AdolcForwardJacobian(const T0& a0, const T1& a1) : Functor(a0, a1) {}
- template<typename T0, typename T1, typename T2>
- AdolcForwardJacobian(const T0& a0, const T1& a1, const T1& a2) : Functor(a0, a1, a2) {}
- typedef typename Functor::InputType InputType;
- typedef typename Functor::ValueType ValueType;
- typedef typename Functor::JacobianType JacobianType;
- typedef Matrix<ActiveScalar, InputType::SizeAtCompileTime, 1> ActiveInput;
- typedef Matrix<ActiveScalar, ValueType::SizeAtCompileTime, 1> ActiveValue;
- void operator() (const InputType& x, ValueType* v, JacobianType* _jac) const
- {
- eigen_assert(v!=0);
- if (!_jac)
- {
- Functor::operator()(x, v);
- return;
- }
- JacobianType& jac = *_jac;
- ActiveInput ax = x.template cast<ActiveScalar>();
- ActiveValue av(jac.rows());
- for (int j=0; j<jac.cols(); j++)
- for (int i=0; i<jac.cols(); i++)
- ax[i].setADValue(j, i==j ? 1 : 0);
- Functor::operator()(ax, &av);
- for (int i=0; i<jac.rows(); i++)
- {
- (*v)[i] = av[i].getValue();
- for (int j=0; j<jac.cols(); j++)
- jac.coeffRef(i,j) = av[i].getADValue(j);
- }
- }
- protected:
- };
- //@}
- }
- #endif // EIGEN_ADLOC_FORWARD
|