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 );
85 template <
size_t order >
87 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 +
size_t( std::pow( 2, order - 1 ) ) );
103 template <
size_t order >
105 const Vector< HigherOrderDual< order, double >, -1 >& in )
107 using in_scalar_type = HigherOrderDual< order, double >;
108 using out_scalar_type = HigherOrderDual< order + 1, double >;
110 Vector< out_scalar_type, -1 > out = Vector< out_scalar_type, -1 >( in.size() );
111 out_scalar_type* out_data = out.data();
112 const in_scalar_type* in_data = in.data();
114 for (
int i = 0; i < in.size(); i++ ) {
115 out_data[i] = increaseDualOrderWithShift< order >( in_data[i] );
141 const VectorXdual& X );