-
Notifications
You must be signed in to change notification settings - Fork 122
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add tests supporting higher order custom derivatives #786
Conversation
This looks good. I am surprised we didn't have any test for higher-order derivatives of built-in custom derivatives. Can you please see if is is possible to use functions available in |
// CHECK-NEXT: clad::ValueAndPushforward<ValueAndPushforward<float, float>, ValueAndPushforward<float, float> > _t0 = sin_pushforward_pushforward(x * y, _d_x0 * y + x * _d_y0, _d_x * y + x * _d_y, _d__d_x * y + _d_x0 * _d_y + _d_x * _d_y0 + x * _d__d_y); | ||
// CHECK-NEXT: ValueAndPushforward<float, float> _d__t0 = _t0.pushforward; | ||
// CHECK-NEXT: ValueAndPushforward<float, float> _t00 = _t0.value; | ||
// CHECK-NEXT: clad::ValueAndPushforward<ValueAndPushforward<decltype(::std::pow(float(), int())), decltype(::std::pow(float(), int()))>, ValueAndPushforward<decltype(::std::pow(float(), int())), decltype(::std::pow(float(), int()))> > _t1 = pow_pushforward_pushforward(_t00.value, a, _t00.pushforward, _d_a0, _d__t0.value, _d_a, _d__t0.pushforward, _d__d_a); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We probably need regex-based checks here because the calls differ for libstdc++ (unix) and libc++ (darwin).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@parth-07 the utilities in TestUtils.h don't have a template parameter field for the order of differentiation.
i did change the macro to allow this:
#define INIT_DIFFERENTIATE(fn, order, ...) \
auto fn##_diff = clad::differentiate<order>(fn, __VA_ARGS__);
But now the problem is that it can't be used for the same function twice:
INIT_DIFFERENTIATE(test_trig, 2, "x");
TEST_DIFFERENTIATE(test_trig, 0.5, 1.0, 1, 2); // CHECK-EXEC: -2.364220
INIT_DIFFERENTIATE(test_trig, 2, "y");
TEST_DIFFERENTIATE(test_trig, 1.0, 0.5, 2, 1); // CHECK-EXEC: -0.060237
fails because the macro redefines test_trig_diff
I can fix this by appending the vars and order to the generated function like so (just a psuedo code for the name generation)
auto fn##_##str(order)##_diff = clad::differentiate<order>(fn, __VA_ARGS__);
although I'm not sure if thats the right way to generate the name
This can be done in another PR since if implemented it will require refactoring of other tests, so can we go ahead with adding the test as is for now?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Let's move forward as it is since our release due date is tomorrow.
Fixes #313