11#ifndef EIGEN_ADOLC_FORWARD_MODULE_H
12#define EIGEN_ADOLC_FORWARD_MODULE_H
26#ifndef NUMBER_DIRECTIONS
27#define NUMBER_DIRECTIONS 2
29#include <adolc/adtl.h>
44#include "../../Eigen/Core"
46#include "../../Eigen/src/Core/util/DisableStupidWarnings.h"
74inline const adouble& conj(
const adouble& x) {
return x; }
75inline const adouble& real(
const adouble& x) {
return x; }
76inline adouble imag(
const adouble&) {
return 0.; }
77inline adouble abs(
const adouble& x) {
return fabs(x); }
78inline adouble abs2(
const adouble& x) {
return x * x; }
80inline bool(isinf)(
const adouble& x) {
return (Eigen::numext::isinf)(x.getValue()); }
81inline bool(isnan)(
const adouble& x) {
return (Eigen::numext::isnan)(x.getValue()); }
89 typedef adtl::adouble Real;
90 typedef adtl::adouble NonInteger;
91 typedef adtl::adouble Nested;
96 RequireInitialization = 1,
103template <
typename Functor>
104class AdolcForwardJacobian :
public Functor {
105 typedef adtl::adouble ActiveScalar;
108 AdolcForwardJacobian() : Functor() {}
109 AdolcForwardJacobian(
const Functor& f) : Functor(f) {}
112 template <
typename T0>
113 AdolcForwardJacobian(
const T0& a0) : Functor(a0) {}
114 template <
typename T0,
typename T1>
115 AdolcForwardJacobian(
const T0& a0,
const T1& a1) : Functor(a0, a1) {}
116 template <
typename T0,
typename T1,
typename T2>
117 AdolcForwardJacobian(
const T0& a0,
const T1& a1,
const T2& a2) : Functor(a0, a1, a2) {}
119 typedef typename Functor::InputType InputType;
120 typedef typename Functor::ValueType ValueType;
121 typedef typename Functor::JacobianType JacobianType;
123 typedef Matrix<ActiveScalar, InputType::SizeAtCompileTime, 1> ActiveInput;
124 typedef Matrix<ActiveScalar, ValueType::SizeAtCompileTime, 1> ActiveValue;
126 void operator()(
const InputType& x, ValueType* v, JacobianType* _jac)
const {
127 eigen_assert(v != 0);
129 Functor::operator()(x, v);
133 JacobianType& jac = *_jac;
135 ActiveInput ax = x.template cast<ActiveScalar>();
136 ActiveValue av(jac.rows());
138 for (
int j = 0; j < jac.cols(); j++)
139 for (
int i = 0; i < jac.cols(); i++) ax[i].setADValue(j, i == j ? 1 : 0);
141 Functor::operator()(ax, &av);
143 for (
int i = 0; i < jac.rows(); i++) {
144 (*v)[i] = av[i].getValue();
145 for (
int j = 0; j < jac.cols(); j++) jac.coeffRef(i, j) = av[i].getADValue(j);
156#include "../../Eigen/src/Core/util/ReenableStupidWarnings.h"
Namespace containing all symbols from the Eigen library.