Skip to content

Commit 211b4af

Browse files
committed
Handling of prefix + and -.
1 parent dd704be commit 211b4af

11 files changed

+883
-590
lines changed

include/cpp2taylor.h2

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,23 @@ taylor: <R, dim: int> type = {
6363
return sub(o, 0.0, 0.0); // Primal values are not required.
6464
}
6565

66+
// Overload for simple handling of prefix +.
67+
operator+: (this) -> taylor = {
68+
return this;
69+
}
70+
71+
// Overload for simple handling of prefix -.
72+
operator-: (this) -> taylor = {
73+
r: taylor = ();
74+
75+
(copy k:= 1)
76+
while k <= dim next k += 1 {
77+
r.v[k - 1] = -v[k - 1];
78+
}
79+
80+
return r;
81+
}
82+
6683
add: (this, o: taylor, v0: R, o0: R) -> taylor = {
6784
r: taylor = ();
6885

regression-tests/pure2-autodiff-higher-order.cpp2

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,14 @@ ad_test: @autodiff<"order=6"> @print type = {
6565
r = x + x * y;
6666
}
6767

68+
prefix_add: (x: double, y: double) -> (r: double) = {
69+
r = +x + y;
70+
}
71+
72+
prefix_sub: (x: double, y: double) -> (r: double) = {
73+
r = -x + y;
74+
}
75+
6876
func: (x: double, y: double) -> (ret: double) = {
6977
ret = x + y;
7078
}
@@ -216,6 +224,8 @@ main: () = {
216224
write_output("x * y / x", x, x_d, y, y_d, ad_name::ad_test::mul_div_2_d(x, x_d, y, y_d));
217225
write_output("x * (x + y)", x, x_d, y, y_d, ad_name::ad_test::mul_add_d(x, x_d, y, y_d));
218226
write_output("x + x * y", x, x_d, y, y_d, ad_name::ad_test::add_mul_d(x, x_d, y, y_d));
227+
write_output("+x + y)", x, x_d, y, y_d, ad_name::ad_test::prefix_add_d(x, x_d, y, y_d));
228+
write_output("-x + y)", x, x_d, y, y_d, ad_name::ad_test::prefix_sub_d(x, x_d, y, y_d));
219229
write_output("x * func(x, y)", x, x_d, y, y_d, ad_name::ad_test::func_call_d(x, x_d, y, y_d));
220230
write_output("x * func_outer(x, y)", x, x_d, y, y_d, ad_name::ad_test::func_outer_call_d(x, x_d, y, y_d));
221231
write_output("sin(x - y)", x, x_d, y, y_d, ad_name::ad_test::sin_call_d(x, x_d, y, y_d));

regression-tests/pure2-autodiff.cpp2

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,14 @@ ad_test: @autodiff @print type = {
6262
r = x + x * y;
6363
}
6464

65+
prefix_add: (x: double, y: double) -> (r: double) = {
66+
r = +x + y;
67+
}
68+
69+
prefix_sub: (x: double, y: double) -> (r: double) = {
70+
r = -x + y;
71+
}
72+
6573
func: (x: double, y: double) -> (ret: double) = {
6674
ret = x + y;
6775
}
@@ -213,6 +221,8 @@ main: () = {
213221
write_output("x * y / x", x, x_d, y, y_d, ad_name::ad_test::mul_div_2_d(x, x_d, y, y_d));
214222
write_output("x * (x + y)", x, x_d, y, y_d, ad_name::ad_test::mul_add_d(x, x_d, y, y_d));
215223
write_output("x + x * y", x, x_d, y, y_d, ad_name::ad_test::add_mul_d(x, x_d, y, y_d));
224+
write_output("+x + y)", x, x_d, y, y_d, ad_name::ad_test::prefix_add_d(x, x_d, y, y_d));
225+
write_output("-x + y)", x, x_d, y, y_d, ad_name::ad_test::prefix_sub_d(x, x_d, y, y_d));
216226
write_output("x * func(x, y)", x, x_d, y, y_d, ad_name::ad_test::func_call_d(x, x_d, y, y_d));
217227
write_output("x * func_outer(x, y)", x, x_d, y, y_d, ad_name::ad_test::func_outer_call_d(x, x_d, y, y_d));
218228
write_output("sin(x - y)", x, x_d, y, y_d, ad_name::ad_test::sin_call_d(x, x_d, y, y_d));

regression-tests/test-results/gcc-13-c++2b/pure2-autodiff-higher-order.cpp.execution

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,22 @@ diff(x + x * y) at (x = 2.000000, x_d = ( 1.000000 0.000000 0.000000 0.000000 0.
9494
d4 = 0.000000
9595
d5 = 0.000000
9696
d6 = 0.000000
97+
diff(+x + y)) at (x = 2.000000, x_d = ( 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 ), y = 3.000000, y_d = ( 2.000000 0.000000 0.000000 0.000000 0.000000 0.000000 )):
98+
r = 5.000000
99+
d1 = 3.000000
100+
d2 = 0.000000
101+
d3 = 0.000000
102+
d4 = 0.000000
103+
d5 = 0.000000
104+
d6 = 0.000000
105+
diff(-x + y)) at (x = 2.000000, x_d = ( 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 ), y = 3.000000, y_d = ( 2.000000 0.000000 0.000000 0.000000 0.000000 0.000000 )):
106+
r = 1.000000
107+
d1 = 1.000000
108+
d2 = 0.000000
109+
d3 = 0.000000
110+
d4 = 0.000000
111+
d5 = 0.000000
112+
d6 = 0.000000
97113
diff(x * func(x, y)) at (x = 2.000000, x_d = ( 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 ), y = 3.000000, y_d = ( 2.000000 0.000000 0.000000 0.000000 0.000000 0.000000 )):
98114
r = 10.000000
99115
d1 = 11.000000

regression-tests/test-results/gcc-13-c++2b/pure2-autodiff.cpp.execution

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ diff(x / y / y) at (x = 2.000000, x_d = 1.000000, y = 3.000000, y_d = 2.000000)
1010
diff(x * y / x) at (x = 2.000000, x_d = 1.000000, y = 3.000000, y_d = 2.000000) = (r = 3.000000, r_d = 2.000000)
1111
diff(x * (x + y)) at (x = 2.000000, x_d = 1.000000, y = 3.000000, y_d = 2.000000) = (r = 10.000000, r_d = 11.000000)
1212
diff(x + x * y) at (x = 2.000000, x_d = 1.000000, y = 3.000000, y_d = 2.000000) = (r = 8.000000, r_d = 8.000000)
13+
diff(+x + y)) at (x = 2.000000, x_d = 1.000000, y = 3.000000, y_d = 2.000000) = (r = 5.000000, r_d = 3.000000)
14+
diff(-x + y)) at (x = 2.000000, x_d = 1.000000, y = 3.000000, y_d = 2.000000) = (r = 1.000000, r_d = 1.000000)
1315
diff(x * func(x, y)) at (x = 2.000000, x_d = 1.000000, y = 3.000000, y_d = 2.000000) = (r = 10.000000, r_d = 11.000000)
1416
diff(x * func_outer(x, y)) at (x = 2.000000, x_d = 1.000000, y = 3.000000, y_d = 2.000000) = (r = 10.000000, r_d = 11.000000)
1517
diff(sin(x - y)) at (x = 2.000000, x_d = 1.000000, y = 3.000000, y_d = 2.000000) = (r = -0.841471, r_d = -0.540302)

0 commit comments

Comments
 (0)