Eigen::NumericalDiff< Functor_, mode > Class Template Reference

#include <NumericalDiff.h>

+ Inheritance diagram for Eigen::NumericalDiff< Functor_, mode >:

Public Types

enum  { InputsAtCompileTime = Functor::InputsAtCompileTime , ValuesAtCompileTime = Functor::ValuesAtCompileTime }
 
typedef Functor_ Functor
 
typedef Functor::Scalar Scalar
 
typedef Functor::InputType InputType
 
typedef Functor::ValueType ValueType
 
typedef Functor::JacobianType JacobianType
 

Public Member Functions

 NumericalDiff (Scalar _epsfcn=0.)
 
 NumericalDiff (const Functor &f, Scalar _epsfcn=0.)
 
template<typename T0 >
 NumericalDiff (const T0 &a0)
 
template<typename T0 , typename T1 >
 NumericalDiff (const T0 &a0, const T1 &a1)
 
template<typename T0 , typename T1 , typename T2 >
 NumericalDiff (const T0 &a0, const T1 &a1, const T2 &a2)
 
int df (const InputType &_x, JacobianType &jac) const
 

Private Member Functions

NumericalDiffoperator= (const NumericalDiff &)
 

Private Attributes

Scalar epsfcn
 

Detailed Description

template<typename Functor_, NumericalDiffMode mode = Forward>
class Eigen::NumericalDiff< Functor_, mode >

This class allows you to add a method df() to your functor, which will use numerical differentiation to compute an approximate of the derivative for the functor. Of course, if you have an analytical form for the derivative, you should rather implement df() by yourself.

More information on http://en.wikipedia.org/wiki/Numerical_differentiation

Currently only "Forward" and "Central" scheme are implemented.

Member Typedef Documentation

◆ Functor

template<typename Functor_ , NumericalDiffMode mode = Forward>
typedef Functor_ Eigen::NumericalDiff< Functor_, mode >::Functor

◆ InputType

template<typename Functor_ , NumericalDiffMode mode = Forward>
typedef Functor::InputType Eigen::NumericalDiff< Functor_, mode >::InputType

◆ JacobianType

template<typename Functor_ , NumericalDiffMode mode = Forward>
typedef Functor::JacobianType Eigen::NumericalDiff< Functor_, mode >::JacobianType

◆ Scalar

template<typename Functor_ , NumericalDiffMode mode = Forward>
typedef Functor::Scalar Eigen::NumericalDiff< Functor_, mode >::Scalar

◆ ValueType

template<typename Functor_ , NumericalDiffMode mode = Forward>
typedef Functor::ValueType Eigen::NumericalDiff< Functor_, mode >::ValueType

Member Enumeration Documentation

◆ anonymous enum

template<typename Functor_ , NumericalDiffMode mode = Forward>
anonymous enum
Enumerator
InputsAtCompileTime 
ValuesAtCompileTime 
@ InputsAtCompileTime
Definition: NumericalDiff.h:54
@ ValuesAtCompileTime
Definition: NumericalDiff.h:54
@ ValuesAtCompileTime
Definition: NonLinearOptimization.cpp:99
@ InputsAtCompileTime
Definition: NonLinearOptimization.cpp:99

Constructor & Destructor Documentation

◆ NumericalDiff() [1/5]

template<typename Functor_ , NumericalDiffMode mode = Forward>
Eigen::NumericalDiff< Functor_, mode >::NumericalDiff ( Scalar  _epsfcn = 0.)
inline
43 : Functor(), epsfcn(_epsfcn) {}
Scalar epsfcn
Definition: NumericalDiff.h:119
Functor_ Functor
Definition: NumericalDiff.h:37

◆ NumericalDiff() [2/5]

template<typename Functor_ , NumericalDiffMode mode = Forward>
Eigen::NumericalDiff< Functor_, mode >::NumericalDiff ( const Functor f,
Scalar  _epsfcn = 0. 
)
inline
44 : Functor(f), epsfcn(_epsfcn) {}
static int f(const TensorMap< Tensor< int, 3 > > &tensor)
Definition: cxx11_tensor_map.cpp:237

◆ NumericalDiff() [3/5]

template<typename Functor_ , NumericalDiffMode mode = Forward>
template<typename T0 >
Eigen::NumericalDiff< Functor_, mode >::NumericalDiff ( const T0 &  a0)
inline
48 : Functor(a0), epsfcn(0) {}

◆ NumericalDiff() [4/5]

template<typename Functor_ , NumericalDiffMode mode = Forward>
template<typename T0 , typename T1 >
Eigen::NumericalDiff< Functor_, mode >::NumericalDiff ( const T0 &  a0,
const T1 &  a1 
)
inline
50 : Functor(a0, a1), epsfcn(0) {}

◆ NumericalDiff() [5/5]

template<typename Functor_ , NumericalDiffMode mode = Forward>
template<typename T0 , typename T1 , typename T2 >
Eigen::NumericalDiff< Functor_, mode >::NumericalDiff ( const T0 &  a0,
const T1 &  a1,
const T2 &  a2 
)
inline
52 : Functor(a0, a1, a2), epsfcn(0) {}

Member Function Documentation

◆ df()

template<typename Functor_ , NumericalDiffMode mode = Forward>
int Eigen::NumericalDiff< Functor_, mode >::df ( const InputType _x,
JacobianType jac 
) const
inline

return the number of evaluation of functor

59  {
60  using std::abs;
61  using std::sqrt;
62  /* Local variables */
63  Scalar h;
64  int nfev = 0;
65  const typename InputType::Index n = _x.size();
67  ValueType val1, val2;
68  InputType x = _x;
69  // TODO : we should do this only if the size is not already known
70  val1.resize(Functor::values());
71  val2.resize(Functor::values());
72 
73  // initialization
74  switch (mode) {
75  case Forward:
76  // compute f(x)
77  Functor::operator()(x, val1);
78  nfev++;
79  break;
80  case Central:
81  // do nothing
82  break;
83  default:
84  eigen_assert(false);
85  };
86 
87  // Function Body
88  for (int j = 0; j < n; ++j) {
89  h = eps * abs(x[j]);
90  if (h == 0.) {
91  h = eps;
92  }
93  switch (mode) {
94  case Forward:
95  x[j] += h;
96  Functor::operator()(x, val2);
97  nfev++;
98  x[j] = _x[j];
99  jac.col(j) = (val2 - val1) / h;
100  break;
101  case Central:
102  x[j] += h;
103  Functor::operator()(x, val2);
104  nfev++;
105  x[j] -= 2 * h;
106  Functor::operator()(x, val1);
107  nfev++;
108  x[j] = _x[j];
109  jac.col(j) = (val2 - val1) / (2 * h);
110  break;
111  default:
112  eigen_assert(false);
113  };
114  }
115  return nfev;
116  }
AnnoyingScalar abs(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:135
AnnoyingScalar sqrt(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:134
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
#define eigen_assert(x)
Definition: Macros.h:910
SCALAR Scalar
Definition: bench_gemm.cpp:45
Functor::InputType InputType
Definition: NumericalDiff.h:39
Functor::ValueType ValueType
Definition: NumericalDiff.h:40
#define max(a, b)
Definition: datatypes.h:23
double eps
Definition: crbond_bessel.cc:24
@ Central
Definition: NumericalDiff.h:21
@ Forward
Definition: NumericalDiff.h:21
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:83
double epsilon
Definition: osc_ring_sarah_asymptotics.h:43
list x
Definition: plotDoE.py:28
int values() const
Definition: NonLinearOptimization.cpp:110
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2

References abs(), Eigen::Central, eigen_assert, CRBond_Bessel::eps, Eigen::NumericalDiff< Functor_, mode >::epsfcn, Eigen::Forward, j, max, n, sqrt(), Functor< Scalar_, NX, NY >::values(), and plotDoE::x.

Referenced by test_central(), and test_forward().

◆ operator=()

template<typename Functor_ , NumericalDiffMode mode = Forward>
NumericalDiff& Eigen::NumericalDiff< Functor_, mode >::operator= ( const NumericalDiff< Functor_, mode > &  )
private

Member Data Documentation

◆ epsfcn

template<typename Functor_ , NumericalDiffMode mode = Forward>
Scalar Eigen::NumericalDiff< Functor_, mode >::epsfcn
private

The documentation for this class was generated from the following file: