@@ -116,6 +116,21 @@ using intermediate_passive_var_ret = double;
116116
117117#line 92 "pure2-autodiff.cpp2"
118118 public: [[nodiscard]] static auto intermediate_passive_var (cpp2::impl::in<double > x, cpp2::impl::in<double > y) -> intermediate_passive_var_ret;
119+ using intermediate_untyped_ret = double ;
120+
121+
122+ #line 100 "pure2-autodiff.cpp2"
123+ public: [[nodiscard]] static auto intermediate_untyped (cpp2::impl::in<double > x, cpp2::impl::in<double > y) -> intermediate_untyped_ret;
124+ using while_loop_ret = double ;
125+
126+
127+ #line 107 "pure2-autodiff.cpp2"
128+ public: [[nodiscard]] static auto while_loop (cpp2::impl::in<double > x, cpp2::impl::in<double > y) -> while_loop_ret;
129+ using do_while_loop_ret = double ;
130+
131+
132+ #line 116 "pure2-autodiff.cpp2"
133+ public: [[nodiscard]] static auto do_while_loop (cpp2::impl::in<double > x, cpp2::impl::in<double > y) -> do_while_loop_ret;
119134struct add_1_diff_ret { double r; double r_d; };
120135
121136
@@ -197,17 +212,29 @@ struct intermediate_passive_var_diff_ret { double r; double r_d; };
197212
198213public: [[nodiscard]] static auto intermediate_passive_var_diff (cpp2::impl::in<double > x, cpp2::impl::in<double > x_d, cpp2::impl::in<double > y, cpp2::impl::in<double > y_d) -> intermediate_passive_var_diff_ret;
199214
215+ struct intermediate_untyped_diff_ret { double r; double r_d; };
216+
217+ public: [[nodiscard]] static auto intermediate_untyped_diff (cpp2::impl::in<double > x, cpp2::impl::in<double > x_d, cpp2::impl::in<double > y, cpp2::impl::in<double > y_d) -> intermediate_untyped_diff_ret;
218+
219+ struct while_loop_diff_ret { double r; double r_d; };
220+
221+ public: [[nodiscard]] static auto while_loop_diff (cpp2::impl::in<double > x, cpp2::impl::in<double > x_d, cpp2::impl::in<double > y, cpp2::impl::in<double > y_d) -> while_loop_diff_ret;
222+
223+ struct do_while_loop_diff_ret { double r; double r_d; };
224+
225+ public: [[nodiscard]] static auto do_while_loop_diff (cpp2::impl::in<double > x, cpp2::impl::in<double > x_d, cpp2::impl::in<double > y, cpp2::impl::in<double > y_d) -> do_while_loop_diff_ret;
226+
200227 public: ad_test() = default ;
201228 public: ad_test(ad_test const &) = delete ; /* No 'that' constructor, suppress copy */
202229 public: auto operator =(ad_test const &) -> void = delete ;
203230
204231
205- #line 99 "pure2-autodiff.cpp2"
232+ #line 126 "pure2-autodiff.cpp2"
206233};
207234
208235auto 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;
209236
210- #line 105 "pure2-autodiff.cpp2"
237+ #line 132 "pure2-autodiff.cpp2"
211238auto main () -> int;
212239
213240// === Cpp2 function definitions =================================================
@@ -368,6 +395,42 @@ auto main() -> int;
368395 static_cast <void >(cpp2::move (i));
369396 return std::move (r.value ()); }
370397
398+ #line 100 "pure2-autodiff.cpp2"
399+ [[nodiscard]] auto ad_test::intermediate_untyped (cpp2::impl::in<double > x, cpp2::impl::in<double > y) -> intermediate_untyped_ret{
400+ cpp2::impl::deferred_init<double > r;
401+ #line 101 "pure2-autodiff.cpp2"
402+ auto t {0.0 };
403+ t = x + y;
404+
405+ r.construct (cpp2::move (t));
406+ return std::move (r.value ()); }
407+
408+ #line 107 "pure2-autodiff.cpp2"
409+ [[nodiscard]] auto ad_test::while_loop (cpp2::impl::in<double > x, cpp2::impl::in<double > y) -> while_loop_ret{
410+ cpp2::impl::deferred_init<double > r;
411+ #line 108 "pure2-autodiff.cpp2"
412+ int i {0 };
413+
414+ r.construct (x);
415+ for ( ; cpp2::impl::cmp_less (i,2 ); (i += 1 ) ) {
416+ r.value () = r.value () + y;
417+ }return std::move (r.value ());
418+ }
419+
420+ #line 116 "pure2-autodiff.cpp2"
421+ [[nodiscard]] auto ad_test::do_while_loop (cpp2::impl::in<double > x, cpp2::impl::in<double > y) -> do_while_loop_ret{
422+ cpp2::impl::deferred_init<double > r;
423+ #line 117 "pure2-autodiff.cpp2"
424+ int i {0 };
425+
426+ r.construct (x);
427+ do {
428+ r.value () = r.value () + y;
429+ } while ( [&]{
430+ (i += 1 ) ; return true ; }() &&
431+ cpp2::impl::cmp_less (i,2 ));return std::move (r.value ());
432+ }
433+
371434 [[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{
372435 double r {0.0 };
373436 double r_d {0.0 };r_d = x_d + y_d;
@@ -557,12 +620,60 @@ int i_d {};
557620 return { std::move (r), std::move (r_d) };
558621 }
559622
560- #line 101 "pure2-autodiff.cpp2"
623+ [[nodiscard]] auto ad_test::intermediate_untyped_diff (cpp2::impl::in<double > x, cpp2::impl::in<double > x_d, cpp2::impl::in<double > y, cpp2::impl::in<double > y_d) -> intermediate_untyped_diff_ret{
624+ double r {0.0 };
625+ double r_d {0.0 };
626+ auto t_d {0.0 };
627+
628+ auto t {0.0 };
629+ t_d = x_d + y_d;
630+ t = x + y;
631+ r_d = cpp2::move (t_d);
632+ r = cpp2::move (t);
633+ return { std::move (r), std::move (r_d) };
634+ }
635+
636+ [[nodiscard]] auto ad_test::while_loop_diff (cpp2::impl::in<double > x, cpp2::impl::in<double > x_d, cpp2::impl::in<double > y, cpp2::impl::in<double > y_d) -> while_loop_diff_ret{
637+ double r {0.0 };
638+ double r_d {0.0 };
639+ int i_d {0 };
640+
641+ int i {0 };
642+ r_d = x_d;
643+ r = x;
644+ for ( ; cpp2::impl::cmp_less (i,2 ); (i += 1 ) ) {
645+ r_d = r_d + y_d;
646+ r = r + y;
647+ }
648+ return { std::move (r), std::move (r_d) };
649+ }
650+
651+ [[nodiscard]] auto ad_test::do_while_loop_diff (cpp2::impl::in<double > x, cpp2::impl::in<double > x_d, cpp2::impl::in<double > y, cpp2::impl::in<double > y_d) -> do_while_loop_diff_ret{
652+ double r {0.0 };
653+ double r_d {0.0 };
654+ int i_d {0 };
655+
656+ int i {0 };
657+ r_d = x_d;
658+ r = x;
659+ do {
660+ r_d = r_d + y_d;
661+ r = r + y;
662+ }
663+ while ( [&]{
664+ (i += 1 )
665+ ; return true ; }() &&
666+ cpp2::impl::cmp_less (i,2 )
667+ );
668+ return { std::move (r), std::move (r_d) };
669+ }
670+
671+ #line 128 "pure2-autodiff.cpp2"
561672auto 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{
562673 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;
563674}
564675
565- #line 105 "pure2-autodiff.cpp2"
676+ #line 132 "pure2-autodiff.cpp2"
566677auto main () -> int{
567678
568679 double x {2.0 };
@@ -588,6 +699,9 @@ auto main() -> int{
588699 write_output (" if else branch" , x, x_d, y, y_d, ad_test::if_else_branch_diff (x, x_d, y, y_d));
589700 write_output (" direct return" , x, x_d, y, y_d, ad_test::direct_return_diff (x, x_d, y, y_d));
590701 write_output (" intermediate var" , x, x_d, y, y_d, ad_test::intermediate_var_diff (x, x_d, y, y_d));
591- write_output (" intermediate passive var" , x, x_d, y, y_d, ad_test::intermediate_passive_var_diff (cpp2::move (x), cpp2::move (x_d), cpp2::move (y), cpp2::move (y_d)));
702+ write_output (" intermediate passive var" , x, x_d, y, y_d, ad_test::intermediate_passive_var_diff (x, x_d, y, y_d));
703+ write_output (" intermediate untyped" , x, x_d, y, y_d, ad_test::intermediate_untyped_diff (x, x_d, y, y_d));
704+ write_output (" while loop" , x, x_d, y, y_d, ad_test::while_loop_diff (x, x_d, y, y_d));
705+ write_output (" do while loop" , x, x_d, y, y_d, ad_test::do_while_loop_diff (cpp2::move (x), cpp2::move (x_d), cpp2::move (y), cpp2::move (y_d)));
592706}
593707
0 commit comments