@@ -131,6 +131,11 @@ using do_while_loop_ret = double;
131131
132132#line 116 "pure2-autodiff.cpp2"
133133 public: [[nodiscard]] static auto do_while_loop (cpp2::impl::in<double > x, cpp2::impl::in<double > y) -> do_while_loop_ret;
134+ using for_loop_ret = double ;
135+
136+
137+ #line 127 "pure2-autodiff.cpp2"
138+ public: [[nodiscard]] static auto for_loop (cpp2::impl::in<double > x, cpp2::impl::in<double > y) -> for_loop_ret;
134139struct add_1_diff_ret { double r; double r_d; };
135140
136141
@@ -224,17 +229,21 @@ struct do_while_loop_diff_ret { double r; double r_d; };
224229
225230public: [[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;
226231
232+ struct for_loop_diff_ret { double r; double r_d; };
233+
234+ public: [[nodiscard]] static auto for_loop_diff (cpp2::impl::in<double > x, cpp2::impl::in<double > x_d, cpp2::impl::in<double > y, cpp2::impl::in<double > y_d) -> for_loop_diff_ret;
235+
227236 public: ad_test() = default ;
228237 public: ad_test(ad_test const &) = delete ; /* No 'that' constructor, suppress copy */
229238 public: auto operator =(ad_test const &) -> void = delete ;
230239
231240
232- #line 126 "pure2-autodiff.cpp2"
241+ #line 140 "pure2-autodiff.cpp2"
233242};
234243
235244auto 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;
236245
237- #line 132 "pure2-autodiff.cpp2"
246+ #line 146 "pure2-autodiff.cpp2"
238247auto main () -> int;
239248
240249// === Cpp2 function definitions =================================================
@@ -431,6 +440,23 @@ auto main() -> int;
431440 cpp2::impl::cmp_less (i,2 ));return std::move (r.value ());
432441 }
433442
443+ #line 127 "pure2-autodiff.cpp2"
444+ [[nodiscard]] auto ad_test::for_loop (cpp2::impl::in<double > x, cpp2::impl::in<double > y) -> for_loop_ret{
445+ cpp2::impl::deferred_init<double > r;
446+ #line 128 "pure2-autodiff.cpp2"
447+ std::vector<double > v {};
448+
449+ CPP2_UFCS (push_back)(v, x);
450+ CPP2_UFCS (push_back)(v, y);
451+
452+ r.construct (0.0 );
453+ for (
454+ auto const & t : cpp2::move (v) )
455+ {
456+ r.value () = r.value () + t;
457+ }return std::move (r.value ());
458+ }
459+
434460 [[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{
435461 double r {0.0 };
436462 double r_d {0.0 };r_d = x_d + y_d;
@@ -668,12 +694,40 @@ int i_d {0};
668694 return { std::move (r), std::move (r_d) };
669695 }
670696
671- #line 128 "pure2-autodiff.cpp2"
697+ [[nodiscard]] auto ad_test::for_loop_diff (cpp2::impl::in<double > x, cpp2::impl::in<double > x_d, cpp2::impl::in<double > y, cpp2::impl::in<double > y_d) -> for_loop_diff_ret{
698+ double r {0.0 };
699+ double r_d {0.0 };
700+ std::vector<double > v_d {};
701+
702+ std::vector<double > v {};
703+ CPP2_UFCS (push_back)(v, x);
704+ CPP2_UFCS (push_back)(v_d, x_d);
705+ CPP2_UFCS (push_back)(v, y);
706+ CPP2_UFCS (push_back)(v_d, y_d);
707+ r_d = { };
708+ r = 0.0 ;
709+ {
710+ auto t_d_iter{CPP2_UFCS (begin)(cpp2::move (v_d))};
711+ for ( auto const & t : cpp2::move (v) ) { do {
712+ {
713+ auto const & t_d{*cpp2::impl::assert_not_null (t_d_iter)};
714+ {
715+ r_d = r_d + t_d;
716+ r = r + t;
717+ }
718+ }
719+ }
720+ while (false ); (++t_d_iter); }
721+ }
722+ return { std::move (r), std::move (r_d) };
723+ }
724+
725+ #line 142 "pure2-autodiff.cpp2"
672726auto 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{
673727 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;
674728}
675729
676- #line 132 "pure2-autodiff.cpp2"
730+ #line 146 "pure2-autodiff.cpp2"
677731auto main () -> int{
678732
679733 double x {2.0 };
@@ -702,6 +756,7 @@ auto main() -> int{
702756 write_output (" intermediate passive var" , x, x_d, y, y_d, ad_test::intermediate_passive_var_diff (x, x_d, y, y_d));
703757 write_output (" intermediate untyped" , x, x_d, y, y_d, ad_test::intermediate_untyped_diff (x, x_d, y, y_d));
704758 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)));
759+ write_output (" do while loop" , x, x_d, y, y_d, ad_test::do_while_loop_diff (x, x_d, y, y_d));
760+ write_output (" for loop" , x, x_d, y, y_d, ad_test::for_loop_diff (cpp2::move (x), cpp2::move (x_d), cpp2::move (y), cpp2::move (y_d)));
706761}
707762
0 commit comments