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