|
1 | 1 |
|
2 | 2 | #define CPP2_IMPORT_STD Yes |
3 | 3 | #include "cpp2ad_stack.h" |
| 4 | +#include "cpp2taylor.h" |
4 | 5 |
|
5 | 6 | //=== Cpp2 type declarations ==================================================== |
6 | 7 |
|
@@ -28,6 +29,10 @@ class ad_test_reverse; |
28 | 29 | class ad_test_twice; |
29 | 30 |
|
30 | 31 |
|
| 32 | +#line 280 "pure2-autodiff.cpp2" |
| 33 | +class ad_test_2; |
| 34 | + |
| 35 | + |
31 | 36 | //=== Cpp2 type definitions and function declarations =========================== |
32 | 37 |
|
33 | 38 | #line 1 "pure2-autodiff.cpp2" |
@@ -532,6 +537,24 @@ auto write_output(cpp2::impl::in<std::string> func, cpp2::impl::in<double> x, cp |
532 | 537 | auto write_output_reverse(cpp2::impl::in<std::string> func, cpp2::impl::in<double> x, double& x_b, cpp2::impl::in<double> y, double& y_b, double& r_b, auto const& ret) -> void; |
533 | 538 |
|
534 | 539 | #line 280 "pure2-autodiff.cpp2" |
| 540 | +class ad_test_2 { |
| 541 | +using f_ret = double; |
| 542 | + |
| 543 | +#line 281 "pure2-autodiff.cpp2" |
| 544 | + public: [[nodiscard]] static auto f(cpp2::impl::in<double> x) -> f_ret; |
| 545 | +struct f_d_ret { double y; cpp2::taylor<double,2> y_d; }; |
| 546 | + |
| 547 | + |
| 548 | + public: [[nodiscard]] static auto f_d(cpp2::impl::in<double> x, cpp2::impl::in<cpp2::taylor<double,2>> x_d) -> f_d_ret; |
| 549 | + |
| 550 | + public: ad_test_2() = default; |
| 551 | + public: ad_test_2(ad_test_2 const&) = delete; /* No 'that' constructor, suppress copy */ |
| 552 | + public: auto operator=(ad_test_2 const&) -> void = delete; |
| 553 | + |
| 554 | + |
| 555 | +#line 295 "pure2-autodiff.cpp2" |
| 556 | +}; |
| 557 | + |
535 | 558 | auto main() -> int; |
536 | 559 |
|
537 | 560 | //=== Cpp2 function definitions ================================================= |
@@ -1552,7 +1575,56 @@ auto write_output_reverse(cpp2::impl::in<std::string> func, cpp2::impl::in<doubl |
1552 | 1575 | y_b = 0.0; |
1553 | 1576 | } |
1554 | 1577 |
|
1555 | | -#line 280 "pure2-autodiff.cpp2" |
| 1578 | +#line 281 "pure2-autodiff.cpp2" |
| 1579 | + [[nodiscard]] auto ad_test_2::f(cpp2::impl::in<double> x) -> f_ret{ |
| 1580 | + cpp2::impl::deferred_init<double> y; |
| 1581 | +#line 282 "pure2-autodiff.cpp2" |
| 1582 | + if (cpp2::impl::cmp_less(x,-3)) |
| 1583 | + { |
| 1584 | + y.construct(x * x); |
| 1585 | + } |
| 1586 | + else {if (cpp2::impl::cmp_less(x,3)) |
| 1587 | + { |
| 1588 | + y.construct(x + sin(x) + 10); |
| 1589 | + } |
| 1590 | + else |
| 1591 | + { |
| 1592 | + y.construct(sin(x) * x * x); |
| 1593 | + }}return std::move(y.value()); |
| 1594 | + } |
| 1595 | + |
| 1596 | + [[nodiscard]] auto ad_test_2::f_d(cpp2::impl::in<double> x, cpp2::impl::in<cpp2::taylor<double,2>> x_d) -> f_d_ret{ |
| 1597 | + double y {0.0}; |
| 1598 | + cpp2::taylor<double,2> y_d {0.0};if (cpp2::impl::cmp_less(x,-3)) { |
| 1599 | + y_d = x_d.mul(x_d, x, x); |
| 1600 | + y = x * x; |
| 1601 | + } |
| 1602 | + else { |
| 1603 | + if (cpp2::impl::cmp_less(x,3)) { |
| 1604 | + |
| 1605 | + cpp2::taylor<double,2> temp_1_d {CPP2_UFCS(sin)(x_d, x)}; |
| 1606 | + |
| 1607 | + double temp_1 {sin(x)}; |
| 1608 | + y_d = x_d + cpp2::move(temp_1_d); |
| 1609 | + y = x + cpp2::move(temp_1) + 10; |
| 1610 | + } |
| 1611 | + else { |
| 1612 | + |
| 1613 | + cpp2::taylor<double,2> temp_3_d {CPP2_UFCS(sin)(x_d, x)}; |
| 1614 | + |
| 1615 | + double temp_3 {sin(x)}; |
| 1616 | + |
| 1617 | + auto temp_4_d {cpp2::move(temp_3_d).mul(x_d, temp_3, x)}; |
| 1618 | + |
| 1619 | + auto temp_4 {cpp2::move(temp_3) * x}; |
| 1620 | + y_d = cpp2::move(temp_4_d).mul(x_d, temp_4, x); |
| 1621 | + y = cpp2::move(temp_4) * x; |
| 1622 | + } |
| 1623 | + } |
| 1624 | + return { std::move(y), std::move(y_d) }; |
| 1625 | + } |
| 1626 | + |
| 1627 | +#line 297 "pure2-autodiff.cpp2" |
1556 | 1628 | auto main() -> int{ |
1557 | 1629 |
|
1558 | 1630 | double x {2.0}; |
|
0 commit comments