25 #ifndef EIGEN_AUTODIFF_JACOBIAN_H
26 #define EIGEN_AUTODIFF_JACOBIAN_H
31 template<
typename Functor>
class AutoDiffJacobian :
public Functor
34 AutoDiffJacobian() : Functor() {}
35 AutoDiffJacobian(
const Functor& f) : Functor(f) {}
39 AutoDiffJacobian(
const T0& a0) : Functor(a0) {}
40 template<
typename T0,
typename T1>
41 AutoDiffJacobian(
const T0& a0,
const T1& a1) : Functor(a0, a1) {}
42 template<
typename T0,
typename T1,
typename T2>
43 AutoDiffJacobian(
const T0& a0,
const T1& a1,
const T2& a2) : Functor(a0, a1, a2) {}
46 InputsAtCompileTime = Functor::InputsAtCompileTime,
47 ValuesAtCompileTime = Functor::ValuesAtCompileTime
50 typedef typename Functor::InputType InputType;
51 typedef typename Functor::ValueType ValueType;
52 typedef typename Functor::JacobianType JacobianType;
53 typedef typename JacobianType::Scalar Scalar;
54 typedef typename JacobianType::Index Index;
56 typedef Matrix<Scalar,InputsAtCompileTime,1> DerivativeType;
57 typedef AutoDiffScalar<DerivativeType> ActiveScalar;
60 typedef Matrix<ActiveScalar, InputsAtCompileTime, 1> ActiveInput;
61 typedef Matrix<ActiveScalar, ValuesAtCompileTime, 1> ActiveValue;
63 void operator() (
const InputType& x, ValueType* v, JacobianType* _jac=0)
const
68 Functor::operator()(x, v);
72 JacobianType& jac = *_jac;
74 ActiveInput ax = x.template cast<ActiveScalar>();
75 ActiveValue av(jac.rows());
77 if(InputsAtCompileTime==Dynamic)
78 for (Index j=0; j<jac.rows(); j++)
79 av[j].derivatives().resize(this->inputs());
81 for (Index i=0; i<jac.cols(); i++)
82 ax[i].derivatives() = DerivativeType::Unit(this->inputs(),i);
84 Functor::operator()(ax, &av);
86 for (Index i=0; i<jac.rows(); i++)
88 (*v)[i] = av[i].value();
89 jac.row(i) = av[i].derivatives();
98 #endif // EIGEN_AUTODIFF_JACOBIAN_H