diff --git a/include/clad/Differentiator/CladUtils.h b/include/clad/Differentiator/CladUtils.h index 0647415d1..56519593d 100644 --- a/include/clad/Differentiator/CladUtils.h +++ b/include/clad/Differentiator/CladUtils.h @@ -331,12 +331,6 @@ namespace clad { bool IsMemoryFunction(const clang::FunctionDecl* FD); bool IsMemoryDeallocationFunction(const clang::FunctionDecl* FD); - - /// Checks if the argument arg involves type conversion - /// (e.g. float to double). This is used to find out - /// a similar cast can be performed for the derived - /// arg (for corresponding pointers). - bool isTriviallyCastableArg(const clang::Expr* arg); } // namespace utils } // namespace clad diff --git a/lib/Differentiator/CladUtils.cpp b/lib/Differentiator/CladUtils.cpp index c71d8fa39..d7d599ce5 100644 --- a/lib/Differentiator/CladUtils.cpp +++ b/lib/Differentiator/CladUtils.cpp @@ -680,16 +680,5 @@ namespace clad { return FD->getNameAsString() == "free"; #endif } - - bool isTriviallyCastableArg(const clang::Expr* arg) { - // `arg` is the of the type that the function expects. - const QualType expectedType = arg->getType().getCanonicalType(); - // By removing all implicit casts, we can get the type of the original - // argument. - const QualType argType = - arg->IgnoreImplicit()->getType().getCanonicalType(); - // Compare the unqualified types. - return expectedType.getTypePtr() == argType.getTypePtr(); - } } // namespace utils } // namespace clad diff --git a/lib/Differentiator/ReverseModeVisitor.cpp b/lib/Differentiator/ReverseModeVisitor.cpp index b5163211c..3dcc9b541 100644 --- a/lib/Differentiator/ReverseModeVisitor.cpp +++ b/lib/Differentiator/ReverseModeVisitor.cpp @@ -1517,7 +1517,6 @@ Expr* getArraySizeExpr(const ArrayType* AT, ASTContext& context, return call; } - llvm::SmallVector ArgResult{}; llvm::SmallVector PreCallStmts{}; // Save current index in the current block, to potentially put some // statements there later. @@ -1538,11 +1537,9 @@ Expr* getArraySizeExpr(const ArrayType* AT, ASTContext& context, // We do not need to create result arg for arguments passed by reference // because the derivatives of arguments passed by reference are directly // modified by the derived callee function. - if (utils::isArrayOrPointerType(arg->getType()) || - (arg->IgnoreImplicit()->isLValue() && - utils::isTriviallyCastableArg(arg))) { + if (utils::IsReferenceOrPointerType(PVD->getType()) && !isa(arg)) { argDiff = Visit(arg); - ArgResult.push_back(argDiff.getExpr_dx()); + CallArgDx.push_back(argDiff.getExpr_dx()); } else { // Create temporary variables corresponding to derivative of each // argument, so that they can be referred to when arguments is visited. @@ -1553,11 +1550,10 @@ Expr* getArraySizeExpr(const ArrayType* AT, ASTContext& context, QualType dArgTy = getNonConstType(arg->getType(), m_Context, m_Sema); VarDecl* dArgDecl = BuildVarDecl(dArgTy, "_r", getZeroInit(dArgTy)); PreCallStmts.push_back(BuildDeclStmt(dArgDecl)); - ArgResult.push_back(BuildDeclRef(dArgDecl)); + CallArgDx.push_back(BuildDeclRef(dArgDecl)); // Visit using uninitialized reference. argDiff = Visit(arg, BuildDeclRef(dArgDecl)); } - CallArgDx.push_back(argDiff.getExpr_dx()); // Save cloned arg in a "global" variable, so that it is accessible from // the reverse pass. @@ -1726,9 +1722,8 @@ Expr* getArraySizeExpr(const ArrayType* AT, ASTContext& context, for (auto* argDerivative : CallArgDx) { Expr* gradArgExpr = nullptr; const Expr* arg = CE->getArg(idx); - if (utils::isArrayOrPointerType(arg->getType()) || - (arg->IgnoreImplicit()->isLValue() && - utils::isTriviallyCastableArg(arg))) { + const auto* PVD = FD->getParamDecl(idx); + if (utils::IsReferenceOrPointerType(PVD->getType()) && !isa(arg)) { if (argDerivative) { if (utils::isArrayOrPointerType(argDerivative->getType()) || isCladArrayType(argDerivative->getType()) || @@ -1739,7 +1734,7 @@ Expr* getArraySizeExpr(const ArrayType* AT, ASTContext& context, BuildOp(UnaryOperatorKind::UO_AddrOf, argDerivative); } } else { - Expr* gradVarExpr = ArgResult[idx]; + Expr* gradVarExpr = CallArgDx[idx]; gradArgExpr = BuildOp(UO_AddrOf, gradVarExpr, m_Function->getLocation()); } @@ -1881,12 +1876,12 @@ Expr* getArraySizeExpr(const ArrayType* AT, ASTContext& context, m_Sema, getCurrentScope(), OverloadedDerivedFn, "pushforward"); // If the derivative is called through _darg0 instead of _grad. Expr* d = BuildOp(BO_Mul, dfdx(), OverloadedDerivedFn); - Expr* addGrad = BuildOp(BO_AddAssign, Clone(ArgResult[0]), d); - block.insert(it, addGrad); + Expr* addGrad = BuildOp(BO_AddAssign, Clone(CallArgDx[0]), d); + it = block.insert(it, addGrad); it++; } else { // Insert the CallExpr to the derived function - block.insert(it, OverloadedDerivedFn); + it = block.insert(it, OverloadedDerivedFn); it++; } // Insert PostCallStmts @@ -1894,7 +1889,7 @@ Expr* getArraySizeExpr(const ArrayType* AT, ASTContext& context, } if (m_ExternalSource) m_ExternalSource->ActBeforeFinalizingVisitCallExpr( - CE, OverloadedDerivedFn, DerivedCallArgs, ArgResult, asGrad); + CE, OverloadedDerivedFn, DerivedCallArgs, CallArgDx, asGrad); Expr* call = nullptr; diff --git a/test/Arrays/ArrayInputsReverseMode.C b/test/Arrays/ArrayInputsReverseMode.C index 486d9c0d6..50ca4a889 100644 --- a/test/Arrays/ArrayInputsReverseMode.C +++ b/test/Arrays/ArrayInputsReverseMode.C @@ -137,7 +137,9 @@ float func2(float* a) { //CHECK-NEXT: i--; //CHECK-NEXT: sum = clad::pop(_t1); //CHECK-NEXT: float _r_d0 = _d_sum; -//CHECK-NEXT: helper_pullback(a[i], _r_d0, &_d_a[i]); +//CHECK-NEXT: float _r0 = 0; +//CHECK-NEXT: helper_pullback(a[i], _r_d0, &_r0); +//CHECK-NEXT: _d_a[i] += _r0; //CHECK-NEXT: } //CHECK-NEXT: } @@ -269,7 +271,9 @@ double func5(int k) { //CHECK-NEXT: { //CHECK-NEXT: sum = clad::pop(_t3); //CHECK-NEXT: double _r_d1 = _d_sum; -//CHECK-NEXT: addArr_pullback(arr, n, _r_d1, _d_arr, &_d_n); +//CHECK-NEXT: int _r0 = 0; +//CHECK-NEXT: addArr_pullback(arr, n, _r_d1, _d_arr, &_r0); +//CHECK-NEXT: _d_n += _r0; //CHECK-NEXT: } //CHECK-NEXT: } //CHECK-NEXT: for (; _t0; _t0--) { @@ -440,7 +444,11 @@ double func8(double i, double *arr, int n) { //CHECK-NEXT: res = _t1; //CHECK-NEXT: double _r_d1 = _d_res; //CHECK-NEXT: _d_res -= _r_d1; -//CHECK-NEXT: helper2_pullback(i, arr, n, _r_d1, &* _d_i, _d_arr, &* _d_n); +//CHECK-NEXT: double _r0 = 0; +//CHECK-NEXT: int _r1 = 0; +//CHECK-NEXT: helper2_pullback(i, arr, n, _r_d1, &_r0, _d_arr, &_r1); +//CHECK-NEXT: * _d_i += _r0; +//CHECK-NEXT: * _d_n += _r1; //CHECK-NEXT: } //CHECK-NEXT: { //CHECK-NEXT: arr[0] = _t0; @@ -501,7 +509,9 @@ double func9(double i, double j) { //CHECK-NEXT: { //CHECK-NEXT: double _r0 = clad::pop(_t1); //CHECK-NEXT: arr[idx] = _r0; -//CHECK-NEXT: modify_pullback(_r0, i, &_d_arr[idx], &* _d_i); +//CHECK-NEXT: double _r1 = 0; +//CHECK-NEXT: modify_pullback(_r0, i, &_d_arr[idx], &_r1); +//CHECK-NEXT: * _d_i += _r1; //CHECK-NEXT: } //CHECK-NEXT: } //CHECK-NEXT: } diff --git a/test/ErrorEstimation/BasicOps.C b/test/ErrorEstimation/BasicOps.C index d1b67a7b9..c9efa874a 100644 --- a/test/ErrorEstimation/BasicOps.C +++ b/test/ErrorEstimation/BasicOps.C @@ -187,7 +187,13 @@ float func4(float x, float y) { return std::pow(x, y); } //CHECK-NEXT: _ret_value0 = std::pow(x, y); //CHECK-NEXT: goto _label0; //CHECK-NEXT: _label0: -//CHECK-NEXT: clad::custom_derivatives{{(::std)?}}::pow_pullback(x, y, 1, &* _d_x, &* _d_y); +//CHECK-NEXT: { +//CHECK-NEXT: float _r0 = 0; +//CHECK-NEXT: float _r1 = 0; +//CHECK-NEXT: clad::custom_derivatives{{(::std)?}}::pow_pullback(x, y, 1, &_r0, &_r1); +//CHECK-NEXT: * _d_x += _r0; +//CHECK-NEXT: * _d_y += _r1; +//CHECK-NEXT: } //CHECK-NEXT: double _delta_x = 0; //CHECK-NEXT: _delta_x += std::abs(* _d_x * x * {{.+}}); //CHECK-NEXT: double _delta_y = 0; @@ -221,7 +227,9 @@ float func5(float x, float y) { //CHECK-NEXT: y = _t0; //CHECK-NEXT: float _r_d0 = * _d_y; //CHECK-NEXT: * _d_y -= _r_d0; -//CHECK-NEXT: * _d_x += _r_d0 * clad::custom_derivatives{{(::std)?}}::sin_pushforward(x, 1.F).pushforward; +//CHECK-NEXT: float _r0 = 0; +//CHECK-NEXT: _r0 += _r_d0 * clad::custom_derivatives{{(::std)?}}::sin_pushforward(x, 1.F).pushforward; +//CHECK-NEXT: * _d_x += _r0; //CHECK-NEXT: _delta_y += std::abs(_r_d0 * _EERepl_y1 * {{.+}}); //CHECK-NEXT: } //CHECK-NEXT: double _delta_x = 0; diff --git a/test/FirstDerivative/BuiltinDerivatives.C b/test/FirstDerivative/BuiltinDerivatives.C index 7fe7e8b67..0c8356389 100644 --- a/test/FirstDerivative/BuiltinDerivatives.C +++ b/test/FirstDerivative/BuiltinDerivatives.C @@ -105,8 +105,10 @@ void f7_grad(float x, clad::array_ref _d_x); // CHECK-NEXT: goto _label0; // CHECK-NEXT: _label0: // CHECK-NEXT: { -// CHECK-NEXT: double _r0 = 0; -// CHECK-NEXT: {{(clad::)?}}custom_derivatives{{(::std)?}}::pow_pullback(x, 2., 1, &* _d_x, &_r0); +// CHECK-NEXT: float _r0 = 0; +// CHECK-NEXT: double _r1 = 0; +// CHECK-NEXT: {{(clad::)?}}custom_derivatives{{(::std)?}}::pow_pullback(x, 2., 1, &_r0, &_r1); +// CHECK-NEXT: * _d_x += _r0; // CHECK-NEXT: } // CHECK-NEXT: } @@ -126,8 +128,10 @@ void f8_grad(float x, clad::array_ref _d_x); // CHECK-NEXT: goto _label0; // CHECK-NEXT: _label0: // CHECK-NEXT: { -// CHECK-NEXT: int _r0 = 0; -// CHECK-NEXT: {{(clad::)?}}custom_derivatives{{(::std)?}}::pow_pullback(x, 2, 1, &* _d_x, &_r0); +// CHECK-NEXT: float _r0 = 0; +// CHECK-NEXT: int _r1 = 0; +// CHECK-NEXT: {{(clad::)?}}custom_derivatives{{(::std)?}}::pow_pullback(x, 2, 1, &_r0, &_r1); +// CHECK-NEXT: * _d_x += _r0; // CHECK-NEXT: } // CHECK-NEXT: } @@ -147,7 +151,13 @@ void f9_grad(float x, float y, clad::array_ref _d_x, clad::array_ref _d_x, clad::array_ref _d_y) { // CHECK-NEXT: goto _label0; // CHECK-NEXT: _label0: -// CHECK-NEXT: {{(clad::)?}}custom_derivatives{{(::std)?}}::pow_pullback(x, y, 1, &* _d_x, &* _d_y); +// CHECK-NEXT: { +// CHECK-NEXT: float _r0 = 0; +// CHECK-NEXT: float _r1 = 0; +// CHECK-NEXT: {{(clad::)?}}custom_derivatives{{(::std)?}}::pow_pullback(x, y, 1, &_r0, &_r1); +// CHECK-NEXT: * _d_x += _r0; +// CHECK-NEXT: * _d_y += _r1; +// CHECK-NEXT: } // CHECK-NEXT: } double f10(float x, int y) { @@ -166,7 +176,13 @@ void f10_grad(float x, int y, clad::array_ref _d_x, clad::array_ref // CHECK: void f10_grad(float x, int y, clad::array_ref _d_x, clad::array_ref _d_y) { // CHECK-NEXT: goto _label0; // CHECK-NEXT: _label0: -// CHECK-NEXT: {{(clad::)?}}custom_derivatives{{(::std)?}}::pow_pullback(x, y, 1, &* _d_x, &* _d_y); +// CHECK-NEXT: { +// CHECK-NEXT: float _r0 = 0; +// CHECK-NEXT: int _r1 = 0; +// CHECK-NEXT: {{(clad::)?}}custom_derivatives{{(::std)?}}::pow_pullback(x, y, 1, &_r0, &_r1); +// CHECK-NEXT: * _d_x += _r0; +// CHECK-NEXT: * _d_y += _r1; +// CHECK-NEXT: } // CHECK-NEXT: } double f11(double x, double y) { @@ -184,11 +200,13 @@ double f11(double x, double y) { // CHECK-NEXT: {{(clad::)?}}custom_derivatives{{(::std)?}}::pow_pullback((1. - x), 2, 1, &_r0, &_r1); // CHECK-NEXT: * _d_x += -_r0; // CHECK-NEXT: double _r2 = 0; -// CHECK-NEXT: int _r4 = 0; -// CHECK-NEXT: {{(clad::)?}}custom_derivatives{{(::std)?}}::pow_pullback(y - std::pow(x, 2), 2, 100. * 1, &_r2, &_r4); +// CHECK-NEXT: int _r5 = 0; +// CHECK-NEXT: {{(clad::)?}}custom_derivatives{{(::std)?}}::pow_pullback(y - std::pow(x, 2), 2, 100. * 1, &_r2, &_r5); // CHECK-NEXT: * _d_y += _r2; -// CHECK-NEXT: int _r3 = 0; -// CHECK-NEXT: {{(clad::)?}}custom_derivatives{{(::std)?}}::pow_pullback(x, 2, -_r2, &* _d_x, &_r3); +// CHECK-NEXT: double _r3 = 0; +// CHECK-NEXT: int _r4 = 0; +// CHECK-NEXT: {{(clad::)?}}custom_derivatives{{(::std)?}}::pow_pullback(x, 2, -_r2, &_r3, &_r4); +// CHECK-NEXT: * _d_x += _r3; // CHECK-NEXT: } // CHECK-NEXT: } diff --git a/test/Gradient/Assignments.C b/test/Gradient/Assignments.C index 6363d4514..22d12f64a 100644 --- a/test/Gradient/Assignments.C +++ b/test/Gradient/Assignments.C @@ -791,7 +791,15 @@ double f19(double a, double b) { //CHECK: void f19_grad(double a, double b, clad::array_ref _d_a, clad::array_ref _d_b) { //CHECK-NEXT: goto _label0; //CHECK-NEXT: _label0: -//CHECK-NEXT: clad::custom_derivatives::fma_pullback(a, b, b, 1, &* _d_a, &* _d_b, &* _d_b); +//CHECK-NEXT: { +//CHECK-NEXT: double _r0 = 0; +//CHECK-NEXT: double _r1 = 0; +//CHECK-NEXT: double _r2 = 0; +//CHECK-NEXT: clad::custom_derivatives::fma_pullback(a, b, b, 1, &_r0, &_r1, &_r2); +//CHECK-NEXT: * _d_a += _r0; +//CHECK-NEXT: * _d_b += _r1; +//CHECK-NEXT: * _d_b += _r2; +//CHECK-NEXT: } //CHECK-NEXT: } double f20(double x, double y) { diff --git a/test/Gradient/FunctionCalls.C b/test/Gradient/FunctionCalls.C index 3e90ccb77..0af0c6ccd 100644 --- a/test/Gradient/FunctionCalls.C +++ b/test/Gradient/FunctionCalls.C @@ -39,7 +39,11 @@ double fn1(float i) { // CHECK-NEXT: _d_res += _d_a * i; // CHECK-NEXT: * _d_i += res * _d_a; // CHECK-NEXT: } -// CHECK-NEXT: constantFn_pullback(i, _d_res, &* _d_i); +// CHECK-NEXT: { +// CHECK-NEXT: float _r0 = 0; +// CHECK-NEXT: constantFn_pullback(i, _d_res, &_r0); +// CHECK-NEXT: * _d_i += _r0; +// CHECK-NEXT: } // CHECK-NEXT: } double modify1(double& i, double& j) { @@ -274,15 +278,17 @@ double fn4(double* arr, int n) { // CHECK-NEXT: _d_arr[i] += _r_d1; // CHECK-NEXT: } // CHECK-NEXT: { -// CHECK-NEXT: double _r0 = clad::pop(_t2); -// CHECK-NEXT: arr[i] = _r0; -// CHECK-NEXT: twice_pullback(_r0, &_d_arr[i]); +// CHECK-NEXT: double _r1 = clad::pop(_t2); +// CHECK-NEXT: arr[i] = _r1; +// CHECK-NEXT: twice_pullback(_r1, &_d_arr[i]); // CHECK-NEXT: } // CHECK-NEXT: } // CHECK-NEXT: { // CHECK-NEXT: res = _t0; // CHECK-NEXT: double _r_d0 = _d_res; -// CHECK-NEXT: sum_pullback(arr, n, _r_d0, _d_arr, &* _d_n); +// CHECK-NEXT: int _r0 = 0; +// CHECK-NEXT: sum_pullback(arr, n, _r_d0, _d_arr, &_r0); +// CHECK-NEXT: * _d_n += _r0; // CHECK-NEXT: } // CHECK-NEXT: } @@ -457,8 +463,10 @@ double fn8(double x, double y) { // CHECK-NEXT: goto _label0; // CHECK-NEXT: _label0: // CHECK-NEXT: { -// CHECK-NEXT: char _r0 = 0; -// CHECK-NEXT: check_and_return_pullback(x, 'a', "aa", 1 * _t0 * _t1 * y, &* _d_x, &_r0, ""); +// CHECK-NEXT: double _r0 = 0; +// CHECK-NEXT: char _r1 = 0; +// CHECK-NEXT: check_and_return_pullback(x, 'a', "aa", 1 * _t0 * _t1 * y, &_r0, &_r1, ""); +// CHECK-NEXT: * _d_x += _r0; // CHECK-NEXT: * _d_y += _t2 * 1 * _t0 * _t1; // CHECK-NEXT: } // CHECK-NEXT: } @@ -682,7 +690,9 @@ double fn14(double x, double y) { // CHECK-NEXT: } // CHECK-NEXT: { // CHECK-NEXT: x = _t0; -// CHECK-NEXT: emptyFn_pullback(_t0, y, &* _d_x, &* _d_y); +// CHECK-NEXT: double _r0 = 0; +// CHECK-NEXT: emptyFn_pullback(_t0, y, &* _d_x, &_r0); +// CHECK-NEXT: * _d_y += _r0; // CHECK-NEXT: } // CHECK-NEXT: } diff --git a/test/Gradient/Functors.C b/test/Gradient/Functors.C index 15fafe336..3ce9aa6bb 100644 --- a/test/Gradient/Functors.C +++ b/test/Gradient/Functors.C @@ -245,7 +245,13 @@ int main() { // CHECK-NEXT: _t0 = E; // CHECK-NEXT: goto _label0; // CHECK-NEXT: _label0: - // CHECK-NEXT: _t0.operator_call_pullback(i, j, 1, &_d_E, &* _d_i, &* _d_j); + // CHECK-NEXT: { + // CHECK-NEXT: double _r0 = 0; + // CHECK-NEXT: double _r1 = 0; + // CHECK-NEXT: _t0.operator_call_pullback(i, j, 1, &_d_E, &_r0, &_r1); + // CHECK-NEXT: * _d_i += _r0; + // CHECK-NEXT: * _d_j += _r1; + // CHECK-NEXT: } // CHECK-NEXT: } // testing differentiating a function calling operator() on a functor @@ -259,7 +265,13 @@ int main() { // CHECK-NEXT: _t0 = fn; // CHECK-NEXT: goto _label0; // CHECK-NEXT: _label0: - // CHECK-NEXT: _t0.operator_call_pullback(i, j, 1, &(* _d_fn), &* _d_i, &* _d_j); + // CHECK-NEXT: { + // CHECK-NEXT: double _r0 = 0; + // CHECK-NEXT: double _r1 = 0; + // CHECK-NEXT: _t0.operator_call_pullback(i, j, 1, &(* _d_fn), &_r0, &_r1); + // CHECK-NEXT: * _d_i += _r0; + // CHECK-NEXT: * _d_j += _r1; + // CHECK-NEXT: } // CHECK-NEXT: } // testing differentiating a function taking functor as an argument @@ -274,7 +286,13 @@ int main() { // CHECK-NEXT: _t0 = fn; // CHECK-NEXT: goto _label0; // CHECK-NEXT: _label0: - // CHECK-NEXT: _t0.operator_call_pullback(i, j, _d_y, &(* _d_fn), &* _d_i, &* _d_j); + // CHECK-NEXT: { + // CHECK-NEXT: double _r0 = 0; + // CHECK-NEXT: double _r1 = 0; + // CHECK-NEXT: _t0.operator_call_pullback(i, j, _d_y, &(* _d_fn), &_r0, &_r1); + // CHECK-NEXT: * _d_i += _r0; + // CHECK-NEXT: * _d_j += _r1; + // CHECK-NEXT: } // CHECK-NEXT: } // CHECK: void FunctorAsArgWrapper_grad(double i, double j, clad::array_ref _d_i, clad::array_ref _d_j) { @@ -284,7 +302,11 @@ int main() { // CHECK-NEXT: _label0: // CHECK-NEXT: { // CHECK-NEXT: Experiment _r0 = {}; - // CHECK-NEXT: FunctorAsArg_pullback(E, i, j, 1, &_r0, &* _d_i, &* _d_j); + // CHECK-NEXT: double _r1 = 0; + // CHECK-NEXT: double _r2 = 0; + // CHECK-NEXT: FunctorAsArg_pullback(E, i, j, 1, &_r0, &_r1, &_r2); + // CHECK-NEXT: * _d_i += _r1; + // CHECK-NEXT: * _d_j += _r2; // CHECK-NEXT: } // CHECK-NEXT: } diff --git a/test/Gradient/Gradients.C b/test/Gradient/Gradients.C index 9976f2e56..588b0df78 100644 --- a/test/Gradient/Gradients.C +++ b/test/Gradient/Gradients.C @@ -445,11 +445,19 @@ void f_norm_grad(double x, //CHECK-NEXT: _label0: //CHECK-NEXT: { //CHECK-NEXT: double _r0 = 0; +//CHECK-NEXT: double _r5 = 0; +//CHECK-NEXT: clad::custom_derivatives::pow_pullback(sum_of_powers(x, y, z, d), 1 / d, 1, &_r0, &_r5); //CHECK-NEXT: double _r1 = 0; -//CHECK-NEXT: clad::custom_derivatives::pow_pullback(sum_of_powers(x, y, z, d), 1 / d, 1, &_r0, &_r1); -//CHECK-NEXT: clad::custom_derivatives::sum_of_powers_pullback(x, y, z, d, _r0, &* _d_x, &* _d_y, &* _d_z, &* _d_d); -//CHECK-NEXT: double _r2 = _r1 * -1 / (d * d); -//CHECK-NEXT: * _d_d += _r2; +//CHECK-NEXT: double _r2 = 0; +//CHECK-NEXT: double _r3 = 0; +//CHECK-NEXT: double _r4 = 0; +//CHECK-NEXT: clad::custom_derivatives::sum_of_powers_pullback(x, y, z, d, _r0, &_r1, &_r2, &_r3, &_r4); +//CHECK-NEXT: * _d_x += _r1; +//CHECK-NEXT: * _d_y += _r2; +//CHECK-NEXT: * _d_z += _r3; +//CHECK-NEXT: * _d_d += _r4; +//CHECK-NEXT: double _r6 = _r5 * -1 / (d * d); +//CHECK-NEXT: * _d_d += _r6; //CHECK-NEXT: } //CHECK-NEXT: } @@ -464,8 +472,12 @@ void f_sin_grad(double x, double y, clad::array_ref _d_x, clad::array_re //CHECK-NEXT: goto _label0; //CHECK-NEXT: _label0: //CHECK-NEXT: { -//CHECK-NEXT: * _d_x += 1 * (x + y) * clad::custom_derivatives::sin_pushforward(x, 1.).pushforward; -//CHECK-NEXT: * _d_y += 1 * (x + y) * clad::custom_derivatives::sin_pushforward(y, 1.).pushforward; +//CHECK-NEXT: double _r0 = 0; +//CHECK-NEXT: _r0 += 1 * (x + y) * clad::custom_derivatives::sin_pushforward(x, 1.).pushforward; +//CHECK-NEXT: * _d_x += _r0; +//CHECK-NEXT: double _r1 = 0; +//CHECK-NEXT: _r1 += 1 * (x + y) * clad::custom_derivatives::sin_pushforward(y, 1.).pushforward; +//CHECK-NEXT: * _d_y += _r1; //CHECK-NEXT: * _d_x += _t0 * 1; //CHECK-NEXT: * _d_y += _t0 * 1; //CHECK-NEXT: } diff --git a/test/Gradient/Loops.C b/test/Gradient/Loops.C index 7661e384e..130fa803d 100644 --- a/test/Gradient/Loops.C +++ b/test/Gradient/Loops.C @@ -315,7 +315,9 @@ double f_sum_squares(double *p, int n) { //CHECK-NEXT: i--; //CHECK-NEXT: s = clad::pop(_t1); //CHECK-NEXT: double _r_d0 = _d_s; -//CHECK-NEXT: sq_pullback(p[i], _r_d0, &_d_p[i]); +//CHECK-NEXT: double _r0 = 0; +//CHECK-NEXT: sq_pullback(p[i], _r_d0, &_r0); +//CHECK-NEXT: _d_p[i] += _r0; //CHECK-NEXT: } //CHECK-NEXT: } @@ -360,15 +362,23 @@ double f_log_gaus(double* x, double* p /*means*/, double n, double sigma) { //CHECK-NEXT: double gaus = 1. / _t6 * _t5; //CHECK-NEXT: goto _label0; //CHECK-NEXT: _label0: -//CHECK-NEXT: _d_gaus += 1 * clad::custom_derivatives::log_pushforward(gaus, 1.).pushforward; //CHECK-NEXT: { -//CHECK-NEXT: double _r2 = _d_gaus * _t5 * -1. / (_t6 * _t6); -//CHECK-NEXT: double _r3 = 0; -//CHECK-NEXT: _r3 += _r2 * clad::custom_derivatives::sqrt_pushforward(_t7 * sigma, 1.).pushforward; +//CHECK-NEXT: double _r8 = 0; +//CHECK-NEXT: _r8 += 1 * clad::custom_derivatives::log_pushforward(gaus, 1.).pushforward; +//CHECK-NEXT: _d_gaus += _r8; +//CHECK-NEXT: } +//CHECK-NEXT: { +//CHECK-NEXT: double _r3 = _d_gaus * _t5 * -1. / (_t6 * _t6); //CHECK-NEXT: double _r4 = 0; -//CHECK-NEXT: clad::custom_derivatives::pow_pullback(2 * 3.1415926535897931, n, _r3 * sigma, &_r4, &_d_n); -//CHECK-NEXT: _d_sigma += _t7 * _r3; -//CHECK-NEXT: _d_power += 1. / _t6 * _d_gaus * clad::custom_derivatives::exp_pushforward(power, 1.).pushforward; +//CHECK-NEXT: _r4 += _r3 * clad::custom_derivatives::sqrt_pushforward(_t7 * sigma, 1.).pushforward; +//CHECK-NEXT: double _r5 = 0; +//CHECK-NEXT: double _r6 = 0; +//CHECK-NEXT: clad::custom_derivatives::pow_pullback(2 * 3.1415926535897931, n, _r4 * sigma, &_r5, &_r6); +//CHECK-NEXT: _d_n += _r6; +//CHECK-NEXT: _d_sigma += _t7 * _r4; +//CHECK-NEXT: double _r7 = 0; +//CHECK-NEXT: _r7 += 1. / _t6 * _d_gaus * clad::custom_derivatives::exp_pushforward(power, 1.).pushforward; +//CHECK-NEXT: _d_power += _r7; //CHECK-NEXT: } //CHECK-NEXT: { //CHECK-NEXT: power = _t2; @@ -376,7 +386,9 @@ double f_log_gaus(double* x, double* p /*means*/, double n, double sigma) { //CHECK-NEXT: _d_power -= _r_d1; //CHECK-NEXT: _d_power += -_r_d1 / _t3; //CHECK-NEXT: double _r1 = _r_d1 * --power / (_t3 * _t3); -//CHECK-NEXT: sq_pullback(sigma, 2 * _r1, &_d_sigma); +//CHECK-NEXT: double _r2 = 0; +//CHECK-NEXT: sq_pullback(sigma, 2 * _r1, &_r2); +//CHECK-NEXT: _d_sigma += _r2; //CHECK-NEXT: } //CHECK-NEXT: for (; _t0; _t0--) { //CHECK-NEXT: i--; diff --git a/test/Gradient/MemberFunctions.C b/test/Gradient/MemberFunctions.C index b4d7ba105..159974336 100644 --- a/test/Gradient/MemberFunctions.C +++ b/test/Gradient/MemberFunctions.C @@ -536,7 +536,11 @@ double fn2(SimpleFunctions& sf, double i) { // CHECK-NEXT: clad::ValueAndAdjoint _t1 = _t0.ref_mem_fn_forw(i, &(* _d_sf), nullptr); // CHECK-NEXT: goto _label0; // CHECK-NEXT: _label0: -// CHECK-NEXT: _t0.ref_mem_fn_pullback(i, 1, &(* _d_sf), &* _d_i); +// CHECK-NEXT: { +// CHECK-NEXT: double _r0 = 0; +// CHECK-NEXT: _t0.ref_mem_fn_pullback(i, 1, &(* _d_sf), &_r0); +// CHECK-NEXT: * _d_i += _r0; +// CHECK-NEXT: } // CHECK-NEXT: } double fn3(double x, double y, double i, double j) { @@ -577,7 +581,11 @@ double fn5(SimpleFunctions& v, double value) { // CHECK-NEXT: goto _label0; // CHECK-NEXT: _label0: // CHECK-NEXT: (* _d_v).x += 1; -// CHECK-NEXT: _t0.operator_plus_equal_pullback(value, {}, &(* _d_v), &* _d_value); +// CHECK-NEXT: { +// CHECK-NEXT: double _r0 = 0; +// CHECK-NEXT: _t0.operator_plus_equal_pullback(value, {}, &(* _d_v), &_r0); +// CHECK-NEXT: * _d_value += _r0; +// CHECK-NEXT: } // CHECK-NEXT: } double fn4(SimpleFunctions& v) { @@ -712,6 +720,12 @@ int main() { // CHECK-NEXT: _t0 = sf; // CHECK-NEXT: goto _label0; // CHECK-NEXT: _label0: -// CHECK-NEXT: _t0.mem_fn_pullback(i, j, 1, &_d_sf, &* _d_i, &* _d_j); +// CHECK-NEXT: { +// CHECK-NEXT: double _r0 = 0; +// CHECK-NEXT: double _r1 = 0; +// CHECK-NEXT: _t0.mem_fn_pullback(i, j, 1, &_d_sf, &_r0, &_r1); +// CHECK-NEXT: * _d_i += _r0; +// CHECK-NEXT: * _d_j += _r1; +// CHECK-NEXT: } // CHECK-NEXT: } } diff --git a/test/Gradient/UserDefinedTypes.C b/test/Gradient/UserDefinedTypes.C index 15691887c..075ba5c03 100644 --- a/test/Gradient/UserDefinedTypes.C +++ b/test/Gradient/UserDefinedTypes.C @@ -240,7 +240,13 @@ double fn5(const Tangent& t, double i) { // CHECK-NEXT: _t0 = t; // CHECK-NEXT: goto _label0; // CHECK-NEXT: _label0: -// CHECK-NEXT: _t0.someMemFn2_pullback(i, i, 1, &(* _d_t), &* _d_i, &* _d_i); +// CHECK-NEXT: { +// CHECK-NEXT: double _r0 = 0; +// CHECK-NEXT: double _r1 = 0; +// CHECK-NEXT: _t0.someMemFn2_pullback(i, i, 1, &(* _d_t), &_r0, &_r1); +// CHECK-NEXT: * _d_i += _r0; +// CHECK-NEXT: * _d_i += _r1; +// CHECK-NEXT: } // CHECK-NEXT: } using dcomplex = std::complex; diff --git a/test/Hessian/BuiltinDerivatives.C b/test/Hessian/BuiltinDerivatives.C index e8033db77..dc48fcc21 100644 --- a/test/Hessian/BuiltinDerivatives.C +++ b/test/Hessian/BuiltinDerivatives.C @@ -27,8 +27,12 @@ float f1(float x) { // CHECK-NEXT: goto _label0; // CHECK-NEXT: _label0: // CHECK-NEXT: { -// CHECK-NEXT: * _d_x += _d_y.value * clad::custom_derivatives{{(::std)?}}::sin_pushforward(x, 1.F).pushforward; -// CHECK-NEXT: * _d_x += _d_y.pushforward * d_x * clad::custom_derivatives{{(::std)?}}::cos_pushforward(x, 1.F).pushforward; +// CHECK-NEXT: float _r0 = 0; +// CHECK-NEXT: _r0 += _d_y.value * clad::custom_derivatives{{(::std)?}}::sin_pushforward(x, 1.F).pushforward; +// CHECK-NEXT: * _d_x += _r0; +// CHECK-NEXT: float _r1 = 0; +// CHECK-NEXT: _r1 += _d_y.pushforward * d_x * clad::custom_derivatives{{(::std)?}}::cos_pushforward(x, 1.F).pushforward; +// CHECK-NEXT: * _d_x += _r1; // CHECK-NEXT: * _d_d_x += _t0 * _d_y.pushforward; // CHECK-NEXT: } // CHECK-NEXT: } @@ -39,8 +43,12 @@ float f1(float x) { // CHECK-NEXT: goto _label0; // CHECK-NEXT: _label0: // CHECK-NEXT: { -// CHECK-NEXT: * _d_x += _d_y.value * clad::custom_derivatives{{(::std)?}}::cos_pushforward(x, 1.F).pushforward; -// CHECK-NEXT: * _d_x += -1 * _d_y.pushforward * d_x * clad::custom_derivatives{{(::std)?}}::sin_pushforward(x, 1.F).pushforward; +// CHECK-NEXT: float _r0 = 0; +// CHECK-NEXT: _r0 += _d_y.value * clad::custom_derivatives{{(::std)?}}::cos_pushforward(x, 1.F).pushforward; +// CHECK-NEXT: * _d_x += _r0; +// CHECK-NEXT: float _r1 = 0; +// CHECK-NEXT: _r1 += -1 * _d_y.pushforward * d_x * clad::custom_derivatives{{(::std)?}}::sin_pushforward(x, 1.F).pushforward; +// CHECK-NEXT: * _d_x += _r1; // CHECK-NEXT: * _d_d_x += -1 * _t0 * _d_y.pushforward; // CHECK-NEXT: } // CHECK-NEXT: } @@ -58,8 +66,20 @@ float f1(float x) { // CHECK-NEXT: _d__t0.pushforward += 1; // CHECK-NEXT: _d__t1.pushforward += 1; // CHECK-NEXT: } -// CHECK-NEXT: cos_pushforward_pullback(x, _d_x0, _d__t1, &* _d_x, &_d__d_x); -// CHECK-NEXT: sin_pushforward_pullback(x, _d_x0, _d__t0, &* _d_x, &_d__d_x); +// CHECK-NEXT: { +// CHECK-NEXT: float _r2 = 0; +// CHECK-NEXT: float _r3 = 0; +// CHECK-NEXT: cos_pushforward_pullback(x, _d_x0, _d__t1, &_r2, &_r3); +// CHECK-NEXT: * _d_x += _r2; +// CHECK-NEXT: _d__d_x += _r3; +// CHECK-NEXT: } +// CHECK-NEXT: { +// CHECK-NEXT: float _r0 = 0; +// CHECK-NEXT: float _r1 = 0; +// CHECK-NEXT: sin_pushforward_pullback(x, _d_x0, _d__t0, &_r0, &_r1); +// CHECK-NEXT: * _d_x += _r0; +// CHECK-NEXT: _d__d_x += _r1; +// CHECK-NEXT: } // CHECK-NEXT: } // CHECK: void f1_hessian(float x, clad::array_ref hessianMatrix) { @@ -82,8 +102,12 @@ float f2(float x) { // CHECK-NEXT: goto _label0; // CHECK-NEXT: _label0: // CHECK-NEXT: { -// CHECK-NEXT: * _d_x += _d_y.value * clad::custom_derivatives{{(::std)?}}::exp_pushforward(x, 1.F).pushforward; -// CHECK-NEXT: * _d_x += _d_y.pushforward * d_x * clad::custom_derivatives{{(::std)?}}::exp_pushforward(x, 1.F).pushforward; +// CHECK-NEXT: float _r0 = 0; +// CHECK-NEXT: _r0 += _d_y.value * clad::custom_derivatives{{(::std)?}}::exp_pushforward(x, 1.F).pushforward; +// CHECK-NEXT: * _d_x += _r0; +// CHECK-NEXT: float _r1 = 0; +// CHECK-NEXT: _r1 += _d_y.pushforward * d_x * clad::custom_derivatives{{(::std)?}}::exp_pushforward(x, 1.F).pushforward; +// CHECK-NEXT: * _d_x += _r1; // CHECK-NEXT: * _d_d_x += _t0 * _d_y.pushforward; // CHECK-NEXT: } // CHECK-NEXT: } @@ -96,7 +120,13 @@ float f2(float x) { // CHECK-NEXT: goto _label0; // CHECK-NEXT: _label0: // CHECK-NEXT: _d__t0.pushforward += 1; -// CHECK-NEXT: exp_pushforward_pullback(x, _d_x0, _d__t0, &* _d_x, &_d__d_x); +// CHECK-NEXT: { +// CHECK-NEXT: float _r0 = 0; +// CHECK-NEXT: float _r1 = 0; +// CHECK-NEXT: exp_pushforward_pullback(x, _d_x0, _d__t0, &_r0, &_r1); +// CHECK-NEXT: * _d_x += _r0; +// CHECK-NEXT: _d__d_x += _r1; +// CHECK-NEXT: } // CHECK-NEXT: } // CHECK: void f2_hessian(float x, clad::array_ref hessianMatrix) { @@ -118,9 +148,11 @@ float f3(float x) { // CHECK-NEXT: goto _label0; // CHECK-NEXT: _label0: // CHECK-NEXT: { -// CHECK-NEXT: * _d_x += _d_y.value * clad::custom_derivatives{{(::std)?}}::log_pushforward(x, 1.F).pushforward; -// CHECK-NEXT: double _r0 = _d_y.pushforward * d_x * -1. / (x * x); +// CHECK-NEXT: float _r0 = 0; +// CHECK-NEXT: _r0 += _d_y.value * clad::custom_derivatives{{(::std)?}}::log_pushforward(x, 1.F).pushforward; // CHECK-NEXT: * _d_x += _r0; +// CHECK-NEXT: double _r1 = _d_y.pushforward * d_x * -1. / (x * x); +// CHECK-NEXT: * _d_x += _r1; // CHECK-NEXT: * _d_d_x += (1. / x) * _d_y.pushforward; // CHECK-NEXT: } // CHECK-NEXT: } @@ -133,7 +165,13 @@ float f3(float x) { // CHECK-NEXT: goto _label0; // CHECK-NEXT: _label0: // CHECK-NEXT: _d__t0.pushforward += 1; -// CHECK-NEXT: log_pushforward_pullback(x, _d_x0, _d__t0, &* _d_x, &_d__d_x); +// CHECK-NEXT: { +// CHECK-NEXT: float _r0 = 0; +// CHECK-NEXT: float _r1 = 0; +// CHECK-NEXT: log_pushforward_pullback(x, _d_x0, _d__t0, &_r0, &_r1); +// CHECK-NEXT: * _d_x += _r0; +// CHECK-NEXT: _d__d_x += _r1; +// CHECK-NEXT: } // CHECK-NEXT: } // CHECK: void f3_hessian(float x, clad::array_ref hessianMatrix) { @@ -178,18 +216,32 @@ float f4(float x) { // CHECK-NEXT: if (_cond0) { // CHECK-NEXT: derivative = _t1; // CHECK-NEXT: float _r_d0 = _d_derivative; -// CHECK-NEXT: clad::custom_derivatives{{(::std)?}}::pow_pullback(x, exponent, _r_d0 * d_exponent * _t2, &* _d_x, &* _d_exponent); -// CHECK-NEXT: * _d_x += _t3 * _r_d0 * d_exponent * clad::custom_derivatives{{(::std)?}}::log_pushforward(x, 1.F).pushforward; +// CHECK-NEXT: float _r4 = 0; +// CHECK-NEXT: float _r5 = 0; +// CHECK-NEXT: clad::custom_derivatives{{(::std)?}}::pow_pullback(x, exponent, _r_d0 * d_exponent * _t2, &_r4, &_r5); +// CHECK-NEXT: * _d_x += _r4; +// CHECK-NEXT: * _d_exponent += _r5; +// CHECK-NEXT: float _r6 = 0; +// CHECK-NEXT: _r6 += _t3 * _r_d0 * d_exponent * clad::custom_derivatives{{(::std)?}}::log_pushforward(x, 1.F).pushforward; +// CHECK-NEXT: * _d_x += _r6; // CHECK-NEXT: * _d_d_exponent += (_t3 * _t2) * _r_d0; // CHECK-NEXT: } // CHECK-NEXT: { // CHECK-NEXT: * _d_exponent += _d_derivative * d_x * _t0; -// CHECK-NEXT: float _r0 = 0; -// CHECK-NEXT: clad::custom_derivatives{{(::std)?}}::pow_pullback(x, exponent - 1, exponent * _d_derivative * d_x, &* _d_x, &_r0); -// CHECK-NEXT: * _d_exponent += _r0; +// CHECK-NEXT: float _r2 = 0; +// CHECK-NEXT: float _r3 = 0; +// CHECK-NEXT: clad::custom_derivatives{{(::std)?}}::pow_pullback(x, exponent - 1, exponent * _d_derivative * d_x, &_r2, &_r3); +// CHECK-NEXT: * _d_x += _r2; +// CHECK-NEXT: * _d_exponent += _r3; // CHECK-NEXT: * _d_d_x += (exponent * _t0) * _d_derivative; // CHECK-NEXT: } -// CHECK-NEXT: clad::custom_derivatives{{(::std)?}}::pow_pullback(x, exponent, _d_val, &* _d_x, &* _d_exponent); +// CHECK-NEXT: { +// CHECK-NEXT: float _r0 = 0; +// CHECK-NEXT: float _r1 = 0; +// CHECK-NEXT: clad::custom_derivatives{{(::std)?}}::pow_pullback(x, exponent, _d_val, &_r0, &_r1); +// CHECK-NEXT: * _d_x += _r0; +// CHECK-NEXT: * _d_exponent += _r1; +// CHECK-NEXT: } // CHECK-NEXT: } // CHECK: void f4_darg0_grad(float x, clad::array_ref _d_x) { @@ -203,7 +255,11 @@ float f4(float x) { // CHECK-NEXT: { // CHECK-NEXT: float _r0 = 0; // CHECK-NEXT: float _r1 = 0; -// CHECK-NEXT: pow_pushforward_pullback(x, 4.F, _d_x0, 0.F, _d__t0, &* _d_x, &_r0, &_d__d_x, &_r1); +// CHECK-NEXT: float _r2 = 0; +// CHECK-NEXT: float _r3 = 0; +// CHECK-NEXT: pow_pushforward_pullback(x, 4.F, _d_x0, 0.F, _d__t0, &_r0, &_r1, &_r2, &_r3); +// CHECK-NEXT: * _d_x += _r0; +// CHECK-NEXT: _d__d_x += _r2; // CHECK-NEXT: } // CHECK-NEXT: } @@ -233,7 +289,11 @@ float f5(float x) { // CHECK-NEXT: { // CHECK-NEXT: float _r0 = 0; // CHECK-NEXT: float _r1 = 0; -// CHECK-NEXT: pow_pushforward_pullback(2.F, x, 0.F, _d_x0, _d__t0, &_r0, &* _d_x, &_r1, &_d__d_x); +// CHECK-NEXT: float _r2 = 0; +// CHECK-NEXT: float _r3 = 0; +// CHECK-NEXT: pow_pushforward_pullback(2.F, x, 0.F, _d_x0, _d__t0, &_r0, &_r1, &_r2, &_r3); +// CHECK-NEXT: * _d_x += _r1; +// CHECK-NEXT: _d__d_x += _r3; // CHECK-NEXT: } // CHECK-NEXT: } @@ -263,7 +323,17 @@ float f6(float x, float y) { // CHECK-NEXT: goto _label0; // CHECK-NEXT: _label0: // CHECK-NEXT: _d__t0.pushforward += 1; -// CHECK-NEXT: pow_pushforward_pullback(x, y, _d_x0, _d_y0, _d__t0, &* _d_x, &* _d_y, &_d__d_x, &_d__d_y); +// CHECK-NEXT: { +// CHECK-NEXT: float _r0 = 0; +// CHECK-NEXT: float _r1 = 0; +// CHECK-NEXT: float _r2 = 0; +// CHECK-NEXT: float _r3 = 0; +// CHECK-NEXT: pow_pushforward_pullback(x, y, _d_x0, _d_y0, _d__t0, &_r0, &_r1, &_r2, &_r3); +// CHECK-NEXT: * _d_x += _r0; +// CHECK-NEXT: * _d_y += _r1; +// CHECK-NEXT: _d__d_x += _r2; +// CHECK-NEXT: _d__d_y += _r3; +// CHECK-NEXT: } // CHECK-NEXT: } // CHECK: float f6_darg1(float x, float y) { @@ -283,7 +353,17 @@ float f6(float x, float y) { // CHECK-NEXT: goto _label0; // CHECK-NEXT: _label0: // CHECK-NEXT: _d__t0.pushforward += 1; -// CHECK-NEXT: pow_pushforward_pullback(x, y, _d_x0, _d_y0, _d__t0, &* _d_x, &* _d_y, &_d__d_x, &_d__d_y); +// CHECK-NEXT: { +// CHECK-NEXT: float _r0 = 0; +// CHECK-NEXT: float _r1 = 0; +// CHECK-NEXT: float _r2 = 0; +// CHECK-NEXT: float _r3 = 0; +// CHECK-NEXT: pow_pushforward_pullback(x, y, _d_x0, _d_y0, _d__t0, &_r0, &_r1, &_r2, &_r3); +// CHECK-NEXT: * _d_x += _r0; +// CHECK-NEXT: * _d_y += _r1; +// CHECK-NEXT: _d__d_x += _r2; +// CHECK-NEXT: _d__d_y += _r3; +// CHECK-NEXT: } // CHECK-NEXT: } // CHECK: void f6_hessian(float x, float y, clad::array_ref hessianMatrix) { diff --git a/test/Hessian/NestedFunctionCalls.C b/test/Hessian/NestedFunctionCalls.C index 60673d62a..189a50ad1 100644 --- a/test/Hessian/NestedFunctionCalls.C +++ b/test/Hessian/NestedFunctionCalls.C @@ -66,7 +66,17 @@ double f2(double x, double y){ // CHECK-NEXT: _d__d_ans += 1; // CHECK-NEXT: _d__t0.value += _d_ans0; // CHECK-NEXT: _d__t0.pushforward += _d__d_ans; -// CHECK-NEXT: f_pushforward_pullback(x, y, _d_x0, _d_y0, _d__t0, &* _d_x, &* _d_y, &_d__d_x, &_d__d_y); +// CHECK-NEXT: { +// CHECK-NEXT: double _r0 = 0; +// CHECK-NEXT: double _r1 = 0; +// CHECK-NEXT: double _r2 = 0; +// CHECK-NEXT: double _r3 = 0; +// CHECK-NEXT: f_pushforward_pullback(x, y, _d_x0, _d_y0, _d__t0, &_r0, &_r1, &_r2, &_r3); +// CHECK-NEXT: * _d_x += _r0; +// CHECK-NEXT: * _d_y += _r1; +// CHECK-NEXT: _d__d_x += _r2; +// CHECK-NEXT: _d__d_y += _r3; +// CHECK-NEXT: } // CHECK-NEXT: } // CHECK: double f2_darg1(double x, double y) { @@ -94,7 +104,17 @@ double f2(double x, double y){ // CHECK-NEXT: _d__d_ans += 1; // CHECK-NEXT: _d__t0.value += _d_ans0; // CHECK-NEXT: _d__t0.pushforward += _d__d_ans; -// CHECK-NEXT: f_pushforward_pullback(x, y, _d_x0, _d_y0, _d__t0, &* _d_x, &* _d_y, &_d__d_x, &_d__d_y); +// CHECK-NEXT: { +// CHECK-NEXT: double _r0 = 0; +// CHECK-NEXT: double _r1 = 0; +// CHECK-NEXT: double _r2 = 0; +// CHECK-NEXT: double _r3 = 0; +// CHECK-NEXT: f_pushforward_pullback(x, y, _d_x0, _d_y0, _d__t0, &_r0, &_r1, &_r2, &_r3); +// CHECK-NEXT: * _d_x += _r0; +// CHECK-NEXT: * _d_y += _r1; +// CHECK-NEXT: _d__d_x += _r2; +// CHECK-NEXT: _d__d_y += _r3; +// CHECK-NEXT: } // CHECK-NEXT: } // CHECK: void f2_hessian(double x, double y, clad::array_ref hessianMatrix) { diff --git a/test/Jacobian/FunctionCalls.C b/test/Jacobian/FunctionCalls.C index 231199ada..ea3966847 100644 --- a/test/Jacobian/FunctionCalls.C +++ b/test/Jacobian/FunctionCalls.C @@ -19,8 +19,20 @@ void fn1(double i, double j, double* output) { // CHECK: void fn1_jac(double i, double j, double *output, double *jacobianMatrix) { // CHECK-NEXT: output[0] = std::pow(i, j); // CHECK-NEXT: output[1] = std::pow(j, i); -// CHECK-NEXT: clad::custom_derivatives::pow_pullback(j, i, 1, &jacobianMatrix[3UL], &jacobianMatrix[2UL]); -// CHECK-NEXT: clad::custom_derivatives::pow_pullback(i, j, 1, &jacobianMatrix[0UL], &jacobianMatrix[1UL]); +// CHECK-NEXT: { +// CHECK-NEXT: double _r2 = 0; +// CHECK-NEXT: double _r3 = 0; +// CHECK-NEXT: clad::custom_derivatives::pow_pullback(j, i, 1, &_r2, &_r3); +// CHECK-NEXT: jacobianMatrix[3UL] += _r2; +// CHECK-NEXT: jacobianMatrix[2UL] += _r3; +// CHECK-NEXT: } +// CHECK-NEXT: { +// CHECK-NEXT: double _r0 = 0; +// CHECK-NEXT: double _r1 = 0; +// CHECK-NEXT: clad::custom_derivatives::pow_pullback(i, j, 1, &_r0, &_r1); +// CHECK-NEXT: jacobianMatrix[0UL] += _r0; +// CHECK-NEXT: jacobianMatrix[1UL] += _r1; +// CHECK-NEXT: } // CHECK-NEXT: } #define INIT(F) auto d_##F = clad::jacobian(F); diff --git a/test/Jacobian/Jacobian.C b/test/Jacobian/Jacobian.C index ddcd4c8b5..a3902a88b 100644 --- a/test/Jacobian/Jacobian.C +++ b/test/Jacobian/Jacobian.C @@ -63,9 +63,21 @@ void f_3_jac(double x, double y, double z, double *_result, double *jacobianMatr //CHECK-NEXT: _result[1] = sin(y) * constant; //CHECK-NEXT: _t2 = sin(z); //CHECK-NEXT: _result[2] = sin(z) * constant; -//CHECK-NEXT: jacobianMatrix[8UL] += 1 * constant * clad::custom_derivatives::sin_pushforward(z, 1.).pushforward; -//CHECK-NEXT: jacobianMatrix[4UL] += 1 * constant * clad::custom_derivatives::sin_pushforward(y, 1.).pushforward; -//CHECK-NEXT: jacobianMatrix[0UL] += 1 * constant * clad::custom_derivatives::sin_pushforward(x, 1.).pushforward; +//CHECK-NEXT: { +//CHECK-NEXT: double _r2 = 0; +//CHECK-NEXT: _r2 += 1 * constant * clad::custom_derivatives::sin_pushforward(z, 1.).pushforward; +//CHECK-NEXT: jacobianMatrix[8UL] += _r2; +//CHECK-NEXT: } +//CHECK-NEXT: { +//CHECK-NEXT: double _r1 = 0; +//CHECK-NEXT: _r1 += 1 * constant * clad::custom_derivatives::sin_pushforward(y, 1.).pushforward; +//CHECK-NEXT: jacobianMatrix[4UL] += _r1; +//CHECK-NEXT: } +//CHECK-NEXT: { +//CHECK-NEXT: double _r0 = 0; +//CHECK-NEXT: _r0 += 1 * constant * clad::custom_derivatives::sin_pushforward(x, 1.).pushforward; +//CHECK-NEXT: jacobianMatrix[0UL] += _r0; +//CHECK-NEXT: } //CHECK-NEXT:} double multiply(double x, double y) { return x * y; } @@ -99,9 +111,27 @@ void f_4_jac(double x, double y, double z, double *_result, double *jacobianMatr //CHECK-NEXT: _result[1] = multiply(y, z) * constant; //CHECK-NEXT: _t2 = multiply(z, x); //CHECK-NEXT: _result[2] = multiply(z, x) * constant; -//CHECK-NEXT: multiply_pullback(z, x, 1 * constant, &jacobianMatrix[8UL], &jacobianMatrix[6UL]); -//CHECK-NEXT: multiply_pullback(y, z, 1 * constant, &jacobianMatrix[4UL], &jacobianMatrix[5UL]); -//CHECK-NEXT: multiply_pullback(x, y, 1 * constant, &jacobianMatrix[0UL], &jacobianMatrix[1UL]); +//CHECK-NEXT: { +//CHECK-NEXT: double _r4 = 0; +//CHECK-NEXT: double _r5 = 0; +//CHECK-NEXT: multiply_pullback(z, x, 1 * constant, &_r4, &_r5); +//CHECK-NEXT: jacobianMatrix[8UL] += _r4; +//CHECK-NEXT: jacobianMatrix[6UL] += _r5; +//CHECK-NEXT: } +//CHECK-NEXT: { +//CHECK-NEXT: double _r2 = 0; +//CHECK-NEXT: double _r3 = 0; +//CHECK-NEXT: multiply_pullback(y, z, 1 * constant, &_r2, &_r3); +//CHECK-NEXT: jacobianMatrix[4UL] += _r2; +//CHECK-NEXT: jacobianMatrix[5UL] += _r3; +//CHECK-NEXT: } +//CHECK-NEXT: { +//CHECK-NEXT: double _r0 = 0; +//CHECK-NEXT: double _r1 = 0; +//CHECK-NEXT: multiply_pullback(x, y, 1 * constant, &_r0, &_r1); +//CHECK-NEXT: jacobianMatrix[0UL] += _r0; +//CHECK-NEXT: jacobianMatrix[1UL] += _r1; +//CHECK-NEXT: } //CHECK-NEXT:} void f_1_jac_0(double a, double b, double c, double output[], double *jacobianMatrix); diff --git a/test/Misc/RunDemos.C b/test/Misc/RunDemos.C index 3ecbd7fbb..3a1e61960 100644 --- a/test/Misc/RunDemos.C +++ b/test/Misc/RunDemos.C @@ -259,7 +259,15 @@ //CHECK_GRADIENT_DESCENT-NEXT: _d_f_x += (f_x - y) * 1; //CHECK_GRADIENT_DESCENT-NEXT: * _d_y += -(f_x - y) * 1; //CHECK_GRADIENT_DESCENT-NEXT: } -//CHECK_GRADIENT_DESCENT-NEXT: f_pullback(theta_0, theta_1, x, _d_f_x, &* _d_theta_0, &* _d_theta_1, &* _d_x); +//CHECK_GRADIENT_DESCENT-NEXT: { +//CHECK_GRADIENT_DESCENT-NEXT: double _r0 = 0; +//CHECK_GRADIENT_DESCENT-NEXT: double _r1 = 0; +//CHECK_GRADIENT_DESCENT-NEXT: double _r2 = 0; +//CHECK_GRADIENT_DESCENT-NEXT: f_pullback(theta_0, theta_1, x, _d_f_x, &_r0, &_r1, &_r2); +//CHECK_GRADIENT_DESCENT-NEXT: * _d_theta_0 += _r0; +//CHECK_GRADIENT_DESCENT-NEXT: * _d_theta_1 += _r1; +//CHECK_GRADIENT_DESCENT-NEXT: * _d_x += _r2; +//CHECK_GRADIENT_DESCENT-NEXT: } //CHECK_GRADIENT_DESCENT-NEXT: } //-----------------------------------------------------------------------------/ diff --git a/test/NestedCalls/NestedCalls.C b/test/NestedCalls/NestedCalls.C index bfeab76fa..b0b90c01b 100644 --- a/test/NestedCalls/NestedCalls.C +++ b/test/NestedCalls/NestedCalls.C @@ -54,10 +54,14 @@ double f(double x, double y) { //CHECK-NEXT: { //CHECK-NEXT: double _r0 = 0; //CHECK-NEXT: sq_pullback(std::sin(x), _d_y, &_r0); -//CHECK-NEXT: * _d_x += _r0 * clad::custom_derivatives::sin_pushforward(x, 1.).pushforward; //CHECK-NEXT: double _r1 = 0; -//CHECK-NEXT: sq_pullback(std::cos(x), _d_y, &_r1); -//CHECK-NEXT: * _d_x += _r1 * clad::custom_derivatives::cos_pushforward(x, 1.).pushforward; +//CHECK-NEXT: _r1 += _r0 * clad::custom_derivatives::sin_pushforward(x, 1.).pushforward; +//CHECK-NEXT: * _d_x += _r1; +//CHECK-NEXT: double _r2 = 0; +//CHECK-NEXT: sq_pullback(std::cos(x), _d_y, &_r2); +//CHECK-NEXT: double _r3 = 0; +//CHECK-NEXT: _r3 += _r2 * clad::custom_derivatives::cos_pushforward(x, 1.).pushforward; +//CHECK-NEXT: * _d_x += _r3; //CHECK-NEXT: } //CHECK-NEXT: } @@ -70,7 +74,11 @@ double f(double x, double y) { //CHECK-NEXT: _d_t += 1 * y; //CHECK-NEXT: * _d_y += t * 1; //CHECK-NEXT: } -//CHECK-NEXT: one_pullback(x, _d_t, &* _d_x); +//CHECK-NEXT: { +//CHECK-NEXT: double _r0 = 0; +//CHECK-NEXT: one_pullback(x, _d_t, &_r0); +//CHECK-NEXT: * _d_x += _r0; +//CHECK-NEXT: } //CHECK-NEXT: } int main () { // expected-no-diagnostics diff --git a/test/NumericalDiff/GradientMultiArg.C b/test/NumericalDiff/GradientMultiArg.C index 25f59c635..a7a831bee 100644 --- a/test/NumericalDiff/GradientMultiArg.C +++ b/test/NumericalDiff/GradientMultiArg.C @@ -18,14 +18,18 @@ double test_1(double x, double y){ // CHECK-NEXT: goto _label0; // CHECK-NEXT: _label0: // CHECK-NEXT: { +// CHECK-NEXT: double _r0 = 0; +// CHECK-NEXT: double _r1 = 0; // CHECK-NEXT: clad::tape > _t0 = {}; // CHECK-NEXT: double _grad0 = 0; // CHECK-NEXT: clad::push(_t0, &_grad0); // CHECK-NEXT: double _grad1 = 0; // CHECK-NEXT: clad::push(_t0, &_grad1); // CHECK-NEXT: numerical_diff::central_difference(std::hypot, _t0, 0, x, y); -// CHECK-NEXT: * _d_x += 1 * _grad0; -// CHECK-NEXT: * _d_y += 1 * _grad1; +// CHECK-NEXT: _r0 += 1 * _grad0; +// CHECK-NEXT: _r1 += 1 * _grad1; +// CHECK-NEXT: * _d_x += _r0; +// CHECK-NEXT: * _d_y += _r1; // CHECK-NEXT: } // CHECK-NEXT: } diff --git a/test/NumericalDiff/NoNumDiff.C b/test/NumericalDiff/NoNumDiff.C index ad7cf1410..10007647a 100644 --- a/test/NumericalDiff/NoNumDiff.C +++ b/test/NumericalDiff/NoNumDiff.C @@ -18,7 +18,10 @@ double func(double x) { return std::tanh(x); } //CHECK: void func_grad(double x, clad::array_ref _d_x) { //CHECK-NEXT: goto _label0; //CHECK-NEXT: _label0: -//CHECK-NEXT: ; +//CHECK-NEXT: { +//CHECK-NEXT: double _r0 = 0; +//CHECK-NEXT: * _d_x += _r0; +//CHECK-NEXT: } //CHECK-NEXT: } diff --git a/test/NumericalDiff/NumDiff.C b/test/NumericalDiff/NumDiff.C index 78f049fe8..2542cb23b 100644 --- a/test/NumericalDiff/NumDiff.C +++ b/test/NumericalDiff/NumDiff.C @@ -15,7 +15,11 @@ double test_1(double x){ //CHECK: void test_1_grad(double x, clad::array_ref _d_x) { //CHECK-NEXT: goto _label0; //CHECK-NEXT: _label0: -//CHECK-NEXT: * _d_x += 1 * numerical_diff::forward_central_difference(tanh, x, 0, 0, x); +//CHECK-NEXT: { +//CHECK-NEXT: double _r0 = 0; +//CHECK-NEXT: _r0 += 1 * numerical_diff::forward_central_difference(tanh, x, 0, 0, x); +//CHECK-NEXT: * _d_x += _r0; +//CHECK-NEXT: } //CHECK-NEXT: } @@ -50,14 +54,18 @@ double test_3(double x) { //CHECK-NEXT: if (_cond0) { //CHECK-NEXT: _label0: //CHECK-NEXT: { +//CHECK-NEXT: double _r0 = 0; +//CHECK-NEXT: double _r1 = 0; //CHECK-NEXT: clad::tape > _t0 = {}; //CHECK-NEXT: double _grad0 = 0; //CHECK-NEXT: clad::push(_t0, &_grad0); //CHECK-NEXT: double _grad1 = 0; //CHECK-NEXT: clad::push(_t0, &_grad1); //CHECK-NEXT: numerical_diff::central_difference(std::hypot, _t0, 0, x, constant); -//CHECK-NEXT: * _d_x += 1 * _grad0; -//CHECK-NEXT: _d_constant += 1 * _grad1; +//CHECK-NEXT: _r0 += 1 * _grad0; +//CHECK-NEXT: _r1 += 1 * _grad1; +//CHECK-NEXT: * _d_x += _r0; +//CHECK-NEXT: _d_constant += _r1; //CHECK-NEXT: } //CHECK-NEXT: } //CHECK-NEXT: } diff --git a/test/NumericalDiff/PrintErrorNumDiff.C b/test/NumericalDiff/PrintErrorNumDiff.C index 3ff029dce..b1d74f574 100644 --- a/test/NumericalDiff/PrintErrorNumDiff.C +++ b/test/NumericalDiff/PrintErrorNumDiff.C @@ -19,7 +19,11 @@ double test_1(double x){ //CHECK: void test_1_grad(double x, clad::array_ref _d_x) { //CHECK-NEXT: goto _label0; //CHECK-NEXT: _label0: -//CHECK-NEXT: * _d_x += 1 * numerical_diff::forward_central_difference(tanh, x, 0, 1, x); +//CHECK-NEXT: { +//CHECK-NEXT: double _r0 = 0; +//CHECK-NEXT: _r0 += 1 * numerical_diff::forward_central_difference(tanh, x, 0, 1, x); +//CHECK-NEXT: * _d_x += _r0; +//CHECK-NEXT: } //CHECK-NEXT: } diff --git a/test/ROOT/TFormula.C b/test/ROOT/TFormula.C index e7b0fa532..ffd17bade 100644 --- a/test/ROOT/TFormula.C +++ b/test/ROOT/TFormula.C @@ -50,7 +50,9 @@ void TFormula_example_grad_1(Double_t* x, Double_t* p, Double_t* _d_p); //CHECK-NEXT: Double_t _r0 = 0; //CHECK-NEXT: _r0 += 1 * clad::custom_derivatives{{(::std)?}}::TMath::Exp_pushforward(-p[0], 1.).pushforward; //CHECK-NEXT: _d_p[0] += -_r0; -//CHECK-NEXT: _d_p[1] += 1 * clad::custom_derivatives{{(::std)?}}::TMath::Abs_pushforward(p[1], 1.).pushforward; +//CHECK-NEXT: Double_t _r1 = 0; +//CHECK-NEXT: _r1 += 1 * clad::custom_derivatives{{(::std)?}}::TMath::Abs_pushforward(p[1], 1.).pushforward; +//CHECK-NEXT: _d_p[1] += _r1; //CHECK-NEXT: } //CHECK-NEXT: }