Skip to content

Commit 088d032

Browse files
PetroZarytskyivgvassilev
authored andcommitted
Add std::forward reverse_forw
1 parent 93b8aa7 commit 088d032

2 files changed

Lines changed: 18 additions & 5 deletions

File tree

include/clad/Differentiator/STLBuiltins.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -887,6 +887,17 @@ template <typename... Args> auto make_tuple_pushforward(Args... args) noexcept {
887887
second_half_tuple(t));
888888
}
889889

890+
// std::forward custom derivatives
891+
template <class T>
892+
clad::ValueAndAdjoint<T&&, T&&> forward_reverse_forw(T&& t, T&& dt) {
893+
return {::std::forward<T>(t), ::std::forward<T>(dt)};
894+
}
895+
896+
template <class T>
897+
clad::ValueAndAdjoint<T&, T&> forward_reverse_forw(T& t, T& dt) {
898+
return {t, dt};
899+
}
900+
890901
template <class T> constexpr void forward_pullback(T& t, T dy, T* dt) noexcept {
891902
*dt += dy;
892903
}

test/Gradient/Constructors.C

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -418,12 +418,14 @@ double fn8(double u, double v) {
418418
// CHECK: static constexpr void constructor_pullback(double &__{{u1|x}}, double &__{{u2|y}}, std::pair<double, double> *_d_this, double *_d___{{u1|x}}, double *_d___{{u2|y}}) {{.*}}{
419419
// CHECK-NEXT: std::pair<double, double> *_this = (std::pair<double, double> *)malloc(sizeof(std::pair<double, double>));
420420
// CHECK: double _t0 = __{{u1|x}};
421-
// CHECK-NEXT: _this->first = std::forward<double &>(__{{u1|x}});
422-
// CHECK-NEXT: double _t1 = __{{u2|y}};
423-
// CHECK-NEXT: _this->second = std::forward<double &>(__{{u2|y}});
424-
// CHECK-NEXT: {
421+
// CHECK-NEXT: clad::ValueAndAdjoint<double &, double &> _t1 = clad::custom_derivatives::std::forward_reverse_forw(__{{u1|x}}, *_d___{{u1|x}});
422+
// CHECK-NEXT: _this->first = _t1.value;
423+
// CHECK-NEXT: double _t2 = __{{u2|y}};
424+
// CHECK-NEXT: clad::ValueAndAdjoint<double &, double &> _t3 = clad::custom_derivatives::std::forward_reverse_forw(__{{u2|y}}, *_d___{{u2|y}});
425+
// CHECK-NEXT: _this->second = _t3.value;
426+
// CHECK: {
425427
// CHECK-NEXT: clad::custom_derivatives::std::forward_pullback(__{{u2|y}}, _d_this->second, &*_d___{{u2|y}});
426-
// CHECK-NEXT: __{{u2|y}} = _t1;
428+
// CHECK-NEXT: __{{u2|y}} = _t2;
427429
// CHECK-NEXT: _d_this->second = 0.;
428430
// CHECK-NEXT: }
429431
// CHECK-NEXT: {

0 commit comments

Comments
 (0)