29 #include "autodiff/forward/dual/eigen.hpp"
30 #include <autodiff/forward/dual/dual.hpp>
35 namespace AutomaticDifferentiation {
37 using namespace autodiff;
38 using namespace Eigen;
43 template <
size_t order,
typename T,
typename G >
46 constexpr
auto N = detail::Order< Dual< T, G > >;
47 static_assert( order <=
N );
48 if constexpr ( order == 0 )
50 else if constexpr ( order == 1 )
53 return valnode< order - 1 >( dual.val );
55 template <
size_t order,
typename T,
typename G >
58 constexpr
auto N = detail::Order< Dual< T, G > >;
59 static_assert( order <=
N );
60 if constexpr ( order == 0 )
62 else if constexpr ( order == 1 )
65 return valnode< order - 1 >( dual.val );
68 template <
size_t order >
70 const autodiff::HigherOrderDual< order, double >&
in )
72 using out_scalar_type = autodiff::HigherOrderDual< order + 1, double >;
73 using namespace autodiff::detail;
75 out_scalar_type out( 0.0 );
76 const double* in_point = &valnode< order >(
in );
77 double* out_point = &valnode< order + 1 >( out );
79 for (
size_t i = 0;
i < size_t( std::pow( 2, order ) );
i++ ) {
80 *( out_point +
i ) = *( in_point +
i );
86 template <
size_t order >
87 autodiff::HigherOrderDual< order - 1,
double >
decreaseDualOrder( autodiff::HigherOrderDual< order, double >&
in )
89 using out_scalar_type = autodiff::HigherOrderDual< order - 1,
double >;
90 using namespace autodiff::detail;
92 out_scalar_type out( 0.0 );
93 double* in_point = &valnode< order >(
in );
94 double* out_point = &
valnode< order - 1 >( out );
96 for (
size_t i = 0;
i < size_t( std::pow( 2, order - 1 ) );
i++ ) {
97 *( out_point +
i ) = *( in_point +
i );
103 template <
size_t order >
105 autodiff::HigherOrderDual< order, double >&
in )
107 using out_scalar_type = autodiff::HigherOrderDual< order - 1,
double >;
108 using namespace autodiff::detail;
110 out_scalar_type out( 0.0 );
111 double* in_point = &valnode< order >(
in );
112 double* out_point = &
valnode< order - 1 >( out );
114 for (
size_t i = 0;
i < size_t( std::pow( 2, order - 1 ) );
i++ ) {
115 *( out_point +
i ) = *( in_point +
i +
size_t( std::pow( 2, order - 1 ) ) );
121 template <
size_t order >
123 const Vector< HigherOrderDual< order, double >, -1 >&
in )
125 using in_scalar_type = HigherOrderDual< order, double >;
126 using out_scalar_type = HigherOrderDual< order + 1, double >;
128 Vector< out_scalar_type, -1 > out = Vector< out_scalar_type, -1 >(
in.size() );
129 out_scalar_type* out_data = out.data();
130 const in_scalar_type* in_data =
in.data();
132 for (
int i = 0;
i <
in.size();
i++ ) {
133 out_data[
i] = increaseDualOrderWithShift< order >( in_data[
i] );
149 const VectorXdual& X );