10#ifndef EIGEN_AUTODIFF_JACOBIAN_H
11#define EIGEN_AUTODIFF_JACOBIAN_H
16template<
typename Functor>
class AutoDiffJacobian :
public Functor
19 AutoDiffJacobian() : Functor() {}
20 AutoDiffJacobian(
const Functor& f) : Functor(f) {}
23#if EIGEN_HAS_VARIADIC_TEMPLATES
24 template<
typename... T>
25 AutoDiffJacobian(
const T& ...Values) : Functor(Values...) {}
28 AutoDiffJacobian(
const T0& a0) : Functor(a0) {}
29 template<
typename T0,
typename T1>
30 AutoDiffJacobian(
const T0& a0,
const T1& a1) : Functor(a0, a1) {}
31 template<
typename T0,
typename T1,
typename T2>
32 AutoDiffJacobian(
const T0& a0,
const T1& a1,
const T2& a2) : Functor(a0, a1, a2) {}
35 typedef typename Functor::InputType InputType;
36 typedef typename Functor::ValueType ValueType;
37 typedef typename ValueType::Scalar Scalar;
40 InputsAtCompileTime = InputType::RowsAtCompileTime,
41 ValuesAtCompileTime = ValueType::RowsAtCompileTime
44 typedef Matrix<Scalar, ValuesAtCompileTime, InputsAtCompileTime> JacobianType;
45 typedef typename JacobianType::Index
Index;
47 typedef Matrix<Scalar, InputsAtCompileTime, 1> DerivativeType;
48 typedef AutoDiffScalar<DerivativeType> ActiveScalar;
50 typedef Matrix<ActiveScalar, InputsAtCompileTime, 1> ActiveInput;
51 typedef Matrix<ActiveScalar, ValuesAtCompileTime, 1> ActiveValue;
53#if EIGEN_HAS_VARIADIC_TEMPLATES
57 void operator() (
const InputType& x, ValueType* v)
const
59 this->operator()(x, v, 0);
61 template<
typename... ParamsType>
62 void operator() (
const InputType& x, ValueType* v, JacobianType* _jac,
63 const ParamsType&... Params)
const
65 void operator() (
const InputType& x, ValueType* v, JacobianType* _jac=0) const
72#if EIGEN_HAS_VARIADIC_TEMPLATES
73 Functor::operator()(x, v, Params...);
75 Functor::operator()(x, v);
80 JacobianType& jac = *_jac;
82 ActiveInput ax = x.template cast<ActiveScalar>();
83 ActiveValue av(jac.rows());
85 if(InputsAtCompileTime==
Dynamic)
86 for (Index j=0; j<jac.rows(); j++)
87 av[j].derivatives().resize(x.rows());
89 for (Index i=0; i<jac.cols(); i++)
90 ax[i].derivatives() = DerivativeType::Unit(x.rows(),i);
92#if EIGEN_HAS_VARIADIC_TEMPLATES
93 Functor::operator()(ax, &av, Params...);
95 Functor::operator()(ax, &av);
98 for (Index i=0; i<jac.rows(); i++)
100 (*v)[i] = av[i].value();
101 jac.row(i) = av[i].derivatives();
Namespace containing all symbols from the Eigen library.
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index