@@ -78,6 +78,16 @@ using add_mul_ret = double;
7878
7979#line 48 "pure2-autodiff.cpp2"
8080 public: [[nodiscard]] static auto add_mul (cpp2::impl::in<double > x, cpp2::impl::in<double > y) -> add_mul_ret;
81+ using func_ret = double ;
82+
83+
84+ #line 52 "pure2-autodiff.cpp2"
85+ public: [[nodiscard]] static auto func (cpp2::impl::in<double > x, cpp2::impl::in<double > y) -> func_ret;
86+ using func_call_ret = double ;
87+
88+
89+ #line 56 "pure2-autodiff.cpp2"
90+ public: [[nodiscard]] static auto func_call (cpp2::impl::in<double > x, cpp2::impl::in<double > y) -> func_call_ret;
8191struct add_1_diff_ret { double r; double r_d; };
8292
8393
@@ -127,17 +137,25 @@ struct add_mul_diff_ret { double r; double r_d; };
127137
128138public: [[nodiscard]] static auto add_mul_diff (cpp2::impl::in<double > x, cpp2::impl::in<double > x_d, cpp2::impl::in<double > y, cpp2::impl::in<double > y_d) -> add_mul_diff_ret;
129139
140+ struct func_diff_ret { double r; double r_d; };
141+
142+ public: [[nodiscard]] static auto func_diff (cpp2::impl::in<double > x, cpp2::impl::in<double > x_d, cpp2::impl::in<double > y, cpp2::impl::in<double > y_d) -> func_diff_ret;
143+
144+ struct func_call_diff_ret { double r; double r_d; };
145+
146+ public: [[nodiscard]] static auto func_call_diff (cpp2::impl::in<double > x, cpp2::impl::in<double > x_d, cpp2::impl::in<double > y, cpp2::impl::in<double > y_d) -> func_call_diff_ret;
147+
130148 public: ad_test() = default ;
131149 public: ad_test(ad_test const &) = delete ; /* No 'that' constructor, suppress copy */
132150 public: auto operator =(ad_test const &) -> void = delete ;
133151
134152
135- #line 51 "pure2-autodiff.cpp2"
153+ #line 59 "pure2-autodiff.cpp2"
136154};
137155
138156auto write_output (cpp2::impl::in<std::string> func, cpp2::impl::in<double > x, cpp2::impl::in<double > x_d, cpp2::impl::in<double > y, cpp2::impl::in<double > y_d, auto const & ret) -> void;
139157
140- #line 57 "pure2-autodiff.cpp2"
158+ #line 65 "pure2-autodiff.cpp2"
141159auto main () -> int;
142160
143161// === Cpp2 function definitions =================================================
@@ -228,6 +246,20 @@ auto main() -> int;
228246 r.construct (x + x * y);
229247 return std::move (r.value ()); }
230248
249+ #line 52 "pure2-autodiff.cpp2"
250+ [[nodiscard]] auto ad_test::func (cpp2::impl::in<double > x, cpp2::impl::in<double > y) -> func_ret{
251+ cpp2::impl::deferred_init<double > r;
252+ #line 53 "pure2-autodiff.cpp2"
253+ r.construct (x + y);
254+ return std::move (r.value ()); }
255+
256+ #line 56 "pure2-autodiff.cpp2"
257+ [[nodiscard]] auto ad_test::func_call (cpp2::impl::in<double > x, cpp2::impl::in<double > y) -> func_call_ret{
258+ cpp2::impl::deferred_init<double > r;
259+ #line 57 "pure2-autodiff.cpp2"
260+ r.construct (x * func (x, y));
261+ return std::move (r.value ()); }
262+
231263 [[nodiscard]] auto ad_test::add_1_diff (cpp2::impl::in<double > x, cpp2::impl::in<double > x_d, cpp2::impl::in<double > y, cpp2::impl::in<double > y_d) -> add_1_diff_ret{
232264 double r {0.0 };
233265 double r_d {0.0 };r_d = x_d + y_d;r = x + y;
@@ -298,13 +330,29 @@ auto temp_1_d {x * y_d + y * x_d};
298330auto temp_1 {x * y}; r_d = x_d + cpp2::move (temp_1_d);r = x + cpp2::move (temp_1);
299331 return { std::move (r), std::move (r_d) };
300332 }
333+ [[nodiscard]] auto ad_test::func_diff (cpp2::impl::in<double > x, cpp2::impl::in<double > x_d, cpp2::impl::in<double > y, cpp2::impl::in<double > y_d) -> func_diff_ret{
334+ double r {0.0 };
335+ double r_d {0.0 };r_d = x_d + y_d;r = x + y;
336+ return { std::move (r), std::move (r_d) };
337+ }
338+ [[nodiscard]] auto ad_test::func_call_diff (cpp2::impl::in<double > x, cpp2::impl::in<double > x_d, cpp2::impl::in<double > y, cpp2::impl::in<double > y_d) -> func_call_diff_ret{
339+ double r {0.0 };
340+ double r_d {0.0 };
341+ auto temp_2 {func_diff (x, x_d, y, y_d)};
342+
343+ auto temp_1 {temp_2.r };
344+
345+ auto temp_1_d {cpp2::move (temp_2).r_d };
346+ r_d = x * cpp2::move (temp_1_d) + temp_1 * x_d;r = x * cpp2::move (temp_1);
347+ return { std::move (r), std::move (r_d) };
348+ }
301349
302- #line 53 "pure2-autodiff.cpp2"
350+ #line 61 "pure2-autodiff.cpp2"
303351auto write_output (cpp2::impl::in<std::string> func, cpp2::impl::in<double > x, cpp2::impl::in<double > x_d, cpp2::impl::in<double > y, cpp2::impl::in<double > y_d, auto const & ret) -> void{
304352 std::cout << " diff(" + cpp2::to_string (func) + " ) at (x = " + cpp2::to_string (x) + " , x_d = " + cpp2::to_string (x_d) + " , y = " + cpp2::to_string (y) + " , y_d = " + cpp2::to_string (y_d) + " ) = (r = " + cpp2::to_string (ret.r ) + " , r_d = " + cpp2::to_string (ret.r_d ) + " )" << std::endl;
305353}
306354
307- #line 57 "pure2-autodiff.cpp2"
355+ #line 65 "pure2-autodiff.cpp2"
308356auto main () -> int{
309357
310358 double x {2.0 };
@@ -323,6 +371,7 @@ auto main() -> int{
323371 write_output (" x / y / y" , x, x_d, y, y_d, ad_test::div_2_diff (x, x_d, y, y_d));
324372 write_output (" x * y / x" , x, x_d, y, y_d, ad_test::mul_div_2_diff (x, x_d, y, y_d));
325373 write_output (" x * (x + y)" , x, x_d, y, y_d, ad_test::mul_add_diff (x, x_d, y, y_d));
326- write_output (" x + x * y" , x, x_d, y, y_d, ad_test::add_mul_diff (cpp2::move (x), cpp2::move (x_d), cpp2::move (y), cpp2::move (y_d)));
374+ write_output (" x + x * y" , x, x_d, y, y_d, ad_test::add_mul_diff (x, x_d, y, y_d));
375+ write_output (" x * func(x, y)" , x, x_d, y, y_d, ad_test::func_call_diff (cpp2::move (x), cpp2::move (x_d), cpp2::move (y), cpp2::move (y_d)));
327376}
328377
0 commit comments