@@ -1296,6 +1296,52 @@ double fn35(double x, double y) {
12961296// CHECK-NEXT: _d_ref += 1;
12971297// CHECK-NEXT: }
12981298
1299+ class PrivClass {
1300+ private :
1301+ size_t n_ ;
1302+ public :
1303+ PrivClass (size_t n ) : n_ (n ) {}
1304+
1305+ double multiply (double x ) {
1306+ return n_ * x ;
1307+ }
1308+ };
1309+
1310+ // CHECK: static void constructor_pullback(size_t n, PrivClass *_d_this, size_t *_d_n) {
1311+ // CHECK-NEXT: {
1312+ // CHECK-NEXT: *_d_n += _d_this->n_;
1313+ // CHECK-NEXT: _d_this->n_ = {{0U|0UL|0ULL}};
1314+ // CHECK-NEXT: }
1315+ // CHECK-NEXT: }
1316+
1317+ // CHECK: void multiply_pullback(double x, double _d_y, PrivClass *_d_this, double *_d_x) {
1318+ // CHECK-NEXT: {
1319+ // CHECK-NEXT: _d_this->n_ += _d_y * x;
1320+ // CHECK-NEXT: *_d_x += this->n_ * _d_y;
1321+ // CHECK-NEXT: }
1322+ // CHECK-NEXT: }
1323+
1324+ double fn36 (double x , size_t n ){
1325+ PrivClass E (n );
1326+ return E .multiply (x ); // (x*n)
1327+ }
1328+
1329+ // CHECK: void fn36_grad_0(double x, size_t n, double *_d_x) {
1330+ // CHECK-NEXT: size_t _d_n = {{0U|0UL|0ULL}};
1331+ // CHECK-NEXT: PrivClass E(n);
1332+ // CHECK-NEXT: PrivClass _d_E(E);
1333+ // CHECK-NEXT: clad::zero_init(_d_E);
1334+ // CHECK-NEXT: {
1335+ // CHECK-NEXT: double _r1 = 0.;
1336+ // CHECK-NEXT: E.multiply_pullback(x, 1, &_d_E, &_r1);
1337+ // CHECK-NEXT: *_d_x += _r1;
1338+ // CHECK-NEXT: }
1339+ // CHECK-NEXT: {
1340+ // CHECK-NEXT: size_t _r0 = {{0U|0UL|0ULL}};
1341+ // CHECK-NEXT: PrivClass::constructor_pullback(n, &_d_E, &_r0);
1342+ // CHECK-NEXT: _d_n += _r0;
1343+ // CHECK-NEXT: }
1344+ // CHECK-NEXT: }
12991345void print (const Tangent & t ) {
13001346 for (int i = 0 ; i < 5 ; ++ i ) {
13011347 printf ("%.2f" , t .data [i ]);
@@ -1436,4 +1482,9 @@ int main() {
14361482
14371483 INIT_GRADIENT (fn35 );
14381484 TEST_GRADIENT (fn35 , /*numOfDerivativeArgs=*/ 2 , -5 , 6 , & d_i , & d_j ); // CHECK-EXEC: {0.00, 1.00}
1485+
1486+ auto fn36_grad = clad ::gradient (fn36 , "x ");
1487+ d_i = 0 ;
1488+ fn36_grad .execute (i , 5 , & d_i );
1489+ printf ("{%.2f}\n" , d_i ); // CHECK-EXEC: {5.00}
14391490}
0 commit comments