AutoDiffJacobian.h
Go to the documentation of this file.
1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra.
3 //
4 // Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>
5 //
6 // This Source Code Form is subject to the terms of the Mozilla
7 // Public License v. 2.0. If a copy of the MPL was not distributed
8 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 
10 #ifndef EIGEN_AUTODIFF_JACOBIAN_H
11 #define EIGEN_AUTODIFF_JACOBIAN_H
12 
13 // IWYU pragma: private
14 #include "./InternalHeaderCheck.h"
15 
16 namespace Eigen {
17 
18 template <typename Functor>
19 class AutoDiffJacobian : public Functor {
20  public:
23 
24  // forward constructors
25  template <typename... T>
26  AutoDiffJacobian(const T&... Values) : Functor(Values...) {}
27 
28  typedef typename Functor::InputType InputType;
29  typedef typename Functor::ValueType ValueType;
30  typedef typename ValueType::Scalar Scalar;
31 
32  enum { InputsAtCompileTime = InputType::RowsAtCompileTime, ValuesAtCompileTime = ValueType::RowsAtCompileTime };
33 
35  typedef typename JacobianType::Index Index;
36 
39 
42 
43  // Some compilers don't accept variadic parameters after a default parameter,
44  // i.e., we can't just write _jac=0 but we need to overload operator():
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 {
48  eigen_assert(v != 0);
49 
50  if (!_jac) {
51  Functor::operator()(x, v, Params...);
52  return;
53  }
54 
55  JacobianType& jac = *_jac;
56 
57  ActiveInput ax = x.template cast<ActiveScalar>();
58  ActiveValue av(jac.rows());
59 
61  for (Index j = 0; j < jac.rows(); j++) av[j].derivatives().resize(x.rows());
62 
63  for (Index i = 0; i < jac.cols(); i++) ax[i].derivatives() = DerivativeType::Unit(x.rows(), i);
64 
65  Functor::operator()(ax, &av, Params...);
66 
67  for (Index i = 0; i < jac.rows(); i++) {
68  (*v)[i] = av[i].value();
69  jac.row(i) = av[i].derivatives();
70  }
71  }
72 };
73 
74 } // namespace Eigen
75 
76 #endif // EIGEN_AUTODIFF_JACOBIAN_H
Array< int, Dynamic, 1 > v
Definition: Array_initializer_list_vector_cxx11.cpp:1
int i
Definition: BiCGSTAB_step_by_step.cpp:9
#define eigen_assert(x)
Definition: Macros.h:910
#define EIGEN_STRONG_INLINE
Definition: Macros.h:834
SCALAR Scalar
Definition: bench_gemm.cpp:45
Definition: AutoDiffJacobian.h:19
Functor::InputType InputType
Definition: AutoDiffJacobian.h:28
@ ValuesAtCompileTime
Definition: AutoDiffJacobian.h:32
@ InputsAtCompileTime
Definition: AutoDiffJacobian.h:32
AutoDiffJacobian()
Definition: AutoDiffJacobian.h:21
ValueType::Scalar Scalar
Definition: AutoDiffJacobian.h:30
Functor::ValueType ValueType
Definition: AutoDiffJacobian.h:29
void operator()(const InputType &x, ValueType *v, JacobianType *_jac, const ParamsType &... Params) const
Definition: AutoDiffJacobian.h:47
AutoDiffScalar< DerivativeType > ActiveScalar
Definition: AutoDiffJacobian.h:38
Matrix< Scalar, InputsAtCompileTime, 1 > DerivativeType
Definition: AutoDiffJacobian.h:37
EIGEN_STRONG_INLINE void operator()(const InputType &x, ValueType *v) const
Definition: AutoDiffJacobian.h:45
Matrix< Scalar, ValuesAtCompileTime, InputsAtCompileTime > JacobianType
Definition: AutoDiffJacobian.h:34
Matrix< ActiveScalar, ValuesAtCompileTime, 1 > ActiveValue
Definition: AutoDiffJacobian.h:41
JacobianType::Index Index
Definition: AutoDiffJacobian.h:35
Matrix< ActiveScalar, InputsAtCompileTime, 1 > ActiveInput
Definition: AutoDiffJacobian.h:40
AutoDiffJacobian(const Functor &f)
Definition: AutoDiffJacobian.h:22
AutoDiffJacobian(const T &... Values)
Definition: AutoDiffJacobian.h:26
A scalar type replacement with automatic differentiation capability.
Definition: AutoDiffScalar.h:99
The matrix class, also used for vectors and row-vectors.
Definition: Eigen/Eigen/src/Core/Matrix.h:186
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT
Definition: PlainObjectBase.h:192
EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE void resize(Index rows, Index cols)
Definition: PlainObjectBase.h:294
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT
Definition: PlainObjectBase.h:191
static int f(const TensorMap< Tensor< int, 3 > > &tensor)
Definition: cxx11_tensor_map.cpp:237
Namespace containing all symbols from the Eigen library.
Definition: bench_norm.cpp:70
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:83
const int Dynamic
Definition: Constants.h:25
ax
Definition: plotDoE.py:39
list x
Definition: plotDoE.py:28
std::vector< float > Values
Definition: sparse_setter.cpp:48
Definition: NonLinearOptimization.cpp:97
Matrix< Scalar, InputsAtCompileTime, 1 > InputType
Definition: NonLinearOptimization.cpp:100
Matrix< Scalar, ValuesAtCompileTime, 1 > ValueType
Definition: NonLinearOptimization.cpp:101
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2