10#ifndef EIGEN_AUTODIFF_JACOBIAN_H
11#define EIGEN_AUTODIFF_JACOBIAN_H
14#include "./InternalHeaderCheck.h"
18template <
typename Functor>
19class AutoDiffJacobian :
public Functor {
21 AutoDiffJacobian() : Functor() {}
22 AutoDiffJacobian(
const Functor& f) : Functor(f) {}
25 template <
typename... T>
26 AutoDiffJacobian(
const T&... Values) : Functor(Values...) {}
28 typedef typename Functor::InputType InputType;
29 typedef typename Functor::ValueType ValueType;
30 typedef typename ValueType::Scalar Scalar;
32 enum { InputsAtCompileTime = InputType::RowsAtCompileTime, ValuesAtCompileTime = ValueType::RowsAtCompileTime };
34 typedef Matrix<Scalar, ValuesAtCompileTime, InputsAtCompileTime> JacobianType;
35 typedef typename JacobianType::Index Index;
37 typedef Matrix<Scalar, InputsAtCompileTime, 1> DerivativeType;
38 typedef AutoDiffScalar<DerivativeType> ActiveScalar;
40 typedef Matrix<ActiveScalar, InputsAtCompileTime, 1> ActiveInput;
41 typedef Matrix<ActiveScalar, ValuesAtCompileTime, 1> ActiveValue;
45 EIGEN_STRONG_INLINE
void operator()(
const InputType& x, ValueType* v)
const { this->operator()(x, v, 0); }
46 template <
typename... ParamsType>
47 void operator()(
const InputType& x, ValueType* v, JacobianType* _jac,
const ParamsType&... Params)
const {
51 Functor::operator()(x, v, Params...);
55 JacobianType& jac = *_jac;
57 ActiveInput ax = x.template cast<ActiveScalar>();
58 ActiveValue av(jac.rows());
60 if (InputsAtCompileTime ==
Dynamic)
61 for (Index j = 0; j < jac.rows(); j++) av[j].derivatives().resize(x.rows());
63 for (Index i = 0; i < jac.cols(); i++) ax[i].derivatives() = DerivativeType::Unit(x.rows(), i);
65 Functor::operator()(ax, &av, Params...);
67 for (Index i = 0; i < jac.rows(); i++) {
68 (*v)[i] = av[i].value();
69 jac.row(i) = av[i].derivatives();
Namespace containing all symbols from the Eigen library.