AdolcForward
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) 2008-2009 Gael Guennebaud <g.gael@free.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_ADLOC_FORWARD_MODULE_H
11 #define EIGEN_ADLOC_FORWARD_MODULE_H
12 
13 //--------------------------------------------------------------------------------
14 //
15 // This file provides support for adolc's adouble type in forward mode.
16 // ADOL-C is a C++ automatic differentiation library,
17 // see https://projects.coin-or.org/ADOL-C for more information.
18 //
19 // Note that the maximal number of directions is controlled by
20 // the preprocessor token NUMBER_DIRECTIONS. The default is 2.
21 //
22 //--------------------------------------------------------------------------------
23 
24 #define ADOLC_TAPELESS
25 #ifndef NUMBER_DIRECTIONS
26 # define NUMBER_DIRECTIONS 2
27 #endif
28 #include <adolc/adtl.h>
29 
30 // adolc defines some very stupid macros:
31 #if defined(malloc)
32 # undef malloc
33 #endif
34 
35 #if defined(calloc)
36 # undef calloc
37 #endif
38 
39 #if defined(realloc)
40 # undef realloc
41 #endif
42 
43 #include "../../Eigen/Core"
44 
45 namespace Eigen {
46 
64 
65 } // namespace Eigen
66 
67 // Eigen's require a few additional functions which must be defined in the same namespace
68 // than the custom scalar type own namespace
69 namespace adtl {
70 
71 inline const adouble& conj(const adouble& x) { return x; }
72 inline const adouble& real(const adouble& x) { return x; }
73 inline adouble imag(const adouble&) { return 0.; }
74 inline adouble abs(const adouble& x) { return fabs(x); }
75 inline adouble abs2(const adouble& x) { return x*x; }
76 
77 inline bool (isinf)(const adouble& x) { return (Eigen::numext::isinf)(x.getValue()); }
78 inline bool (isnan)(const adouble& x) { return (Eigen::numext::isnan)(x.getValue()); }
79 
80 }
81 
82 namespace Eigen {
83 
84 template<> struct NumTraits<adtl::adouble>
85  : NumTraits<double>
86 {
87  typedef adtl::adouble Real;
88  typedef adtl::adouble NonInteger;
89  typedef adtl::adouble Nested;
90  enum {
91  IsComplex = 0,
92  IsInteger = 0,
93  IsSigned = 1,
95  ReadCost = 1,
96  AddCost = 1,
97  MulCost = 1
98  };
99 };
100 
101 template<typename Functor> class AdolcForwardJacobian : public Functor
102 {
103  typedef adtl::adouble ActiveScalar;
104 public:
105 
108 
109  // forward constructors
110  template<typename T0>
111  AdolcForwardJacobian(const T0& a0) : Functor(a0) {}
112  template<typename T0, typename T1>
113  AdolcForwardJacobian(const T0& a0, const T1& a1) : Functor(a0, a1) {}
114  template<typename T0, typename T1, typename T2>
115  AdolcForwardJacobian(const T0& a0, const T1& a1, const T1& a2) : Functor(a0, a1, a2) {}
116 
117  typedef typename Functor::InputType InputType;
118  typedef typename Functor::ValueType ValueType;
119  typedef typename Functor::JacobianType JacobianType;
120 
123 
124  void operator() (const InputType& x, ValueType* v, JacobianType* _jac) const
125  {
126  eigen_assert(v!=0);
127  if (!_jac)
128  {
129  Functor::operator()(x, v);
130  return;
131  }
132 
133  JacobianType& jac = *_jac;
134 
135  ActiveInput ax = x.template cast<ActiveScalar>();
136  ActiveValue av(jac.rows());
137 
138  for (int j=0; j<jac.cols(); j++)
139  for (int i=0; i<jac.cols(); i++)
140  ax[i].setADValue(j, i==j ? 1 : 0);
141 
142  Functor::operator()(ax, &av);
143 
144  for (int i=0; i<jac.rows(); i++)
145  {
146  (*v)[i] = av[i].getValue();
147  for (int j=0; j<jac.cols(); j++)
148  jac.coeffRef(i,j) = av[i].getADValue(j);
149  }
150  }
151 protected:
152 
153 };
154 
156 
157 }
158 
159 #endif // EIGEN_ADLOC_FORWARD_MODULE_H
Array< int, Dynamic, 1 > v
int i
#define eigen_assert(x)
void operator()(const InputType &x, ValueType *v, JacobianType *_jac) const
Definition: AdolcForward:124
Matrix< ActiveScalar, InputType::SizeAtCompileTime, 1 > ActiveInput
Definition: AdolcForward:121
Matrix< ActiveScalar, ValueType::SizeAtCompileTime, 1 > ActiveValue
Definition: AdolcForward:122
Functor::InputType InputType
Definition: AdolcForward:117
AdolcForwardJacobian(const Functor &f)
Definition: AdolcForward:107
Functor::JacobianType JacobianType
Definition: AdolcForward:119
AdolcForwardJacobian(const T0 &a0, const T1 &a1, const T1 &a2)
Definition: AdolcForward:115
AdolcForwardJacobian(const T0 &a0, const T1 &a1)
Definition: AdolcForward:113
Functor::ValueType ValueType
Definition: AdolcForward:118
adtl::adouble ActiveScalar
Definition: AdolcForward:103
AdolcForwardJacobian(const T0 &a0)
Definition: AdolcForward:111
EIGEN_ALWAYS_INLINE bool() isinf(const Eigen::bfloat16 &h)
EIGEN_ALWAYS_INLINE bool() isnan(const Eigen::bfloat16 &h)
: TensorContractionSycl.h, provides various tensor contraction kernel for SYCL backend
adouble abs(const adouble &x)
Definition: AdolcForward:74
bool() isnan(const adouble &x)
Definition: AdolcForward:78
bool() isinf(const adouble &x)
Definition: AdolcForward:77
const adouble & real(const adouble &x)
Definition: AdolcForward:72
adouble imag(const adouble &)
Definition: AdolcForward:73
const adouble & conj(const adouble &x)
Definition: AdolcForward:71
adouble abs2(const adouble &x)
Definition: AdolcForward:75
std::ptrdiff_t j