|
11 | 11 | #line 2 "pure2-autodiff.cpp2" |
12 | 12 | class ad_test; |
13 | 13 |
|
| 14 | +#line 156 "pure2-autodiff.cpp2" |
| 15 | +class ad_test_twice; |
| 16 | + |
14 | 17 |
|
15 | 18 | //=== Cpp2 type definitions and function declarations =========================== |
16 | 19 |
|
@@ -259,10 +262,35 @@ public: [[nodiscard]] static auto for_loop_d(cpp2::impl::in<double> x, cpp2::imp |
259 | 262 | #line 154 "pure2-autodiff.cpp2" |
260 | 263 | }; |
261 | 264 |
|
| 265 | +class ad_test_twice { |
| 266 | +using mul_1_ret = double; |
| 267 | + |
262 | 268 | #line 157 "pure2-autodiff.cpp2" |
| 269 | + public: [[nodiscard]] static auto mul_1(cpp2::impl::in<double> x) -> mul_1_ret; |
| 270 | +struct mul_1_d_ret { double r; double r_d; }; |
| 271 | + |
| 272 | + |
| 273 | + public: [[nodiscard]] static auto mul_1_d(cpp2::impl::in<double> x, cpp2::impl::in<double> x_d) -> mul_1_d_ret; |
| 274 | + |
| 275 | +struct mul_1_d2_ret { double r; double r_d2; }; |
| 276 | + |
| 277 | +public: [[nodiscard]] static auto mul_1_d2(cpp2::impl::in<double> x, cpp2::impl::in<double> x_d2) -> mul_1_d2_ret; |
| 278 | + |
| 279 | +struct mul_1_d_d2_ret { double r; double r_d2; double r_d; double r_d_d2; }; |
| 280 | + |
| 281 | +public: [[nodiscard]] static auto mul_1_d_d2(cpp2::impl::in<double> x, cpp2::impl::in<double> x_d2, cpp2::impl::in<double> x_d, cpp2::impl::in<double> x_d_d2) -> mul_1_d_d2_ret; |
| 282 | + |
| 283 | + public: ad_test_twice() = default; |
| 284 | + public: ad_test_twice(ad_test_twice const&) = delete; /* No 'that' constructor, suppress copy */ |
| 285 | + public: auto operator=(ad_test_twice const&) -> void = delete; |
| 286 | + |
| 287 | + |
| 288 | +#line 160 "pure2-autodiff.cpp2" |
| 289 | +}; |
| 290 | + |
263 | 291 | auto 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; |
264 | 292 |
|
265 | | -#line 161 "pure2-autodiff.cpp2" |
| 293 | +#line 166 "pure2-autodiff.cpp2" |
266 | 294 | auto main() -> int; |
267 | 295 |
|
268 | 296 | //=== Cpp2 function definitions ================================================= |
@@ -788,11 +816,51 @@ auto const& t_d{*cpp2::impl::assert_not_null(t_d_iter)}; |
788 | 816 | } |
789 | 817 |
|
790 | 818 | #line 157 "pure2-autodiff.cpp2" |
| 819 | + [[nodiscard]] auto ad_test_twice::mul_1(cpp2::impl::in<double> x) -> mul_1_ret{ |
| 820 | + cpp2::impl::deferred_init<double> r; |
| 821 | +#line 158 "pure2-autodiff.cpp2" |
| 822 | + r.construct(x * x); |
| 823 | + return std::move(r.value()); } |
| 824 | + |
| 825 | + [[nodiscard]] auto ad_test_twice::mul_1_d(cpp2::impl::in<double> x, cpp2::impl::in<double> x_d) -> mul_1_d_ret{ |
| 826 | + double r {0.0}; |
| 827 | + double r_d {0.0};r_d = x * x_d + x * x_d; |
| 828 | + r = x * x; |
| 829 | + return { std::move(r), std::move(r_d) }; |
| 830 | + } |
| 831 | + |
| 832 | + [[nodiscard]] auto ad_test_twice::mul_1_d2(cpp2::impl::in<double> x, cpp2::impl::in<double> x_d2) -> mul_1_d2_ret{ |
| 833 | + double r {0.0}; |
| 834 | + double r_d2 {0.0};r_d2 = x * x_d2 + x * x_d2; |
| 835 | + r = x * x; |
| 836 | + return { std::move(r), std::move(r_d2) }; |
| 837 | + } |
| 838 | + |
| 839 | + [[nodiscard]] auto ad_test_twice::mul_1_d_d2(cpp2::impl::in<double> x, cpp2::impl::in<double> x_d2, cpp2::impl::in<double> x_d, cpp2::impl::in<double> x_d_d2) -> mul_1_d_d2_ret{ |
| 840 | + double r {0.0}; |
| 841 | + double r_d2 {0.0}; |
| 842 | + double r_d {0.0}; |
| 843 | + double r_d_d2 {0.0}; |
| 844 | +auto temp_1_d2 {x * x_d_d2 + x_d * x_d2}; |
| 845 | + |
| 846 | + auto temp_1 {x * x_d}; |
| 847 | + |
| 848 | + auto temp_2_d2 {x * x_d_d2 + x_d * x_d2}; |
| 849 | + |
| 850 | + auto temp_2 {x * x_d}; |
| 851 | + r_d_d2 = cpp2::move(temp_1_d2) + cpp2::move(temp_2_d2); |
| 852 | + r_d = cpp2::move(temp_1) + cpp2::move(temp_2); |
| 853 | + r_d2 = x * x_d2 + x * x_d2; |
| 854 | + r = x * x; |
| 855 | + return { std::move(r), std::move(r_d2), std::move(r_d), std::move(r_d_d2) }; |
| 856 | + } |
| 857 | + |
| 858 | +#line 162 "pure2-autodiff.cpp2" |
791 | 859 | auto 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{ |
792 | 860 | 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; |
793 | 861 | } |
794 | 862 |
|
795 | | -#line 161 "pure2-autodiff.cpp2" |
| 863 | +#line 166 "pure2-autodiff.cpp2" |
796 | 864 | auto main() -> int{ |
797 | 865 |
|
798 | 866 | double x {2.0}; |
@@ -824,6 +892,9 @@ auto main() -> int{ |
824 | 892 | write_output("intermediate no init", x, x_d, y, y_d, ad_test::intermediate_no_init_d(x, x_d, y, y_d)); |
825 | 893 | write_output("while loop", x, x_d, y, y_d, ad_test::while_loop_d(x, x_d, y, y_d)); |
826 | 894 | write_output("do while loop", x, x_d, y, y_d, ad_test::do_while_loop_d(x, x_d, y, y_d)); |
827 | | - write_output("for loop", x, x_d, y, y_d, ad_test::for_loop_d(cpp2::move(x), cpp2::move(x_d), cpp2::move(y), cpp2::move(y_d))); |
| 895 | + write_output("for loop", x, x_d, y, y_d, ad_test::for_loop_d(x, x_d, cpp2::move(y), cpp2::move(y_d))); |
| 896 | + |
| 897 | + auto r_twice {ad_test_twice::mul_1_d_d2(x, x_d, cpp2::move(x_d), 0.0)}; |
| 898 | + std::cout << "2nd order diff of x*x at " + cpp2::to_string(cpp2::move(x)) + " = " + cpp2::to_string(cpp2::move(r_twice).r_d_d2) + "" << std::endl; |
828 | 899 | } |
829 | 900 |
|
0 commit comments