1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library
2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra.
3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>
5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla
7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed
8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_AUTODIFF_JACOBIAN_H
11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_AUTODIFF_JACOBIAN_H
12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen
14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Functor> class AutoDiffJacobian : public Functor
17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathpublic:
19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  AutoDiffJacobian() : Functor() {}
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  AutoDiffJacobian(const Functor& f) : Functor(f) {}
21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // forward constructors
23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  template<typename T0>
24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  AutoDiffJacobian(const T0& a0) : Functor(a0) {}
25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  template<typename T0, typename T1>
26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  AutoDiffJacobian(const T0& a0, const T1& a1) : Functor(a0, a1) {}
27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  template<typename T0, typename T1, typename T2>
28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  AutoDiffJacobian(const T0& a0, const T1& a1, const T2& a2) : Functor(a0, a1, a2) {}
29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  enum {
31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    InputsAtCompileTime = Functor::InputsAtCompileTime,
32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ValuesAtCompileTime = Functor::ValuesAtCompileTime
33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  };
34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename Functor::InputType InputType;
36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename Functor::ValueType ValueType;
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename Functor::JacobianType JacobianType;
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename JacobianType::Scalar Scalar;
39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename JacobianType::Index Index;
40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef Matrix<Scalar,InputsAtCompileTime,1> DerivativeType;
42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef AutoDiffScalar<DerivativeType> ActiveScalar;
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef Matrix<ActiveScalar, InputsAtCompileTime, 1> ActiveInput;
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef Matrix<ActiveScalar, ValuesAtCompileTime, 1> ActiveValue;
47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  void operator() (const InputType& x, ValueType* v, JacobianType* _jac=0) const
49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    eigen_assert(v!=0);
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    if (!_jac)
52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      Functor::operator()(x, v);
54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return;
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    JacobianType& jac = *_jac;
58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ActiveInput ax = x.template cast<ActiveScalar>();
60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ActiveValue av(jac.rows());
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    if(InputsAtCompileTime==Dynamic)
63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      for (Index j=0; j<jac.rows(); j++)
64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        av[j].derivatives().resize(this->inputs());
65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    for (Index i=0; i<jac.cols(); i++)
67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      ax[i].derivatives() = DerivativeType::Unit(this->inputs(),i);
68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Functor::operator()(ax, &av);
70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    for (Index i=0; i<jac.rows(); i++)
72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      (*v)[i] = av[i].value();
74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      jac.row(i) = av[i].derivatives();
75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathprotected:
78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_AUTODIFF_JACOBIAN_H
84