@@ -114,27 +114,37 @@ using intermediate_var_ret = double;
114114using intermediate_passive_var_ret = double ;
115115
116116
117- #line 92 "pure2-autodiff.cpp2"
117+ #line 91 "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;
119119using intermediate_untyped_ret = double ;
120120
121121
122- #line 100 "pure2-autodiff.cpp2"
122+ #line 99 "pure2-autodiff.cpp2"
123123 public: [[nodiscard]] static auto intermediate_untyped (cpp2::impl::in<double > x, cpp2::impl::in<double > y) -> intermediate_untyped_ret;
124+ using intermediate_default_init_ret = double ;
125+
126+
127+ #line 106 "pure2-autodiff.cpp2"
128+ public: [[nodiscard]] static auto intermediate_default_init (cpp2::impl::in<double > x, cpp2::impl::in<double > y) -> intermediate_default_init_ret;
129+ using intermediate_no_init_ret = double ;
130+
131+
132+ #line 113 "pure2-autodiff.cpp2"
133+ public: [[nodiscard]] static auto intermediate_no_init (cpp2::impl::in<double > x, cpp2::impl::in<double > y) -> intermediate_no_init_ret;
124134using while_loop_ret = double ;
125135
126136
127- #line 107 "pure2-autodiff.cpp2"
137+ #line 121 "pure2-autodiff.cpp2"
128138 public: [[nodiscard]] static auto while_loop (cpp2::impl::in<double > x, cpp2::impl::in<double > y) -> while_loop_ret;
129139using do_while_loop_ret = double ;
130140
131141
132- #line 116 "pure2-autodiff.cpp2"
142+ #line 130 "pure2-autodiff.cpp2"
133143 public: [[nodiscard]] static auto do_while_loop (cpp2::impl::in<double > x, cpp2::impl::in<double > y) -> do_while_loop_ret;
134144using for_loop_ret = double ;
135145
136146
137- #line 127 "pure2-autodiff.cpp2"
147+ #line 141 "pure2-autodiff.cpp2"
138148 public: [[nodiscard]] static auto for_loop (cpp2::impl::in<double > x, cpp2::impl::in<double > y) -> for_loop_ret;
139149struct add_1_diff_ret { double r; double r_d; };
140150
@@ -221,6 +231,14 @@ struct intermediate_untyped_diff_ret { double r; double r_d; };
221231
222232public: [[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;
223233
234+ struct intermediate_default_init_diff_ret { double r; double r_d; };
235+
236+ public: [[nodiscard]] static auto intermediate_default_init_diff (cpp2::impl::in<double > x, cpp2::impl::in<double > x_d, cpp2::impl::in<double > y, cpp2::impl::in<double > y_d) -> intermediate_default_init_diff_ret;
237+
238+ struct intermediate_no_init_diff_ret { double r; double r_d; };
239+
240+ public: [[nodiscard]] static auto intermediate_no_init_diff (cpp2::impl::in<double > x, cpp2::impl::in<double > x_d, cpp2::impl::in<double > y, cpp2::impl::in<double > y_d) -> intermediate_no_init_diff_ret;
241+
224242struct while_loop_diff_ret { double r; double r_d; };
225243
226244public: [[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;
@@ -238,12 +256,12 @@ public: [[nodiscard]] static auto for_loop_diff(cpp2::impl::in<double> x, cpp2::
238256 public: auto operator =(ad_test const &) -> void = delete ;
239257
240258
241- #line 140 "pure2-autodiff.cpp2"
259+ #line 154 "pure2-autodiff.cpp2"
242260};
243261
244262auto 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;
245263
246- #line 146 "pure2-autodiff.cpp2"
264+ #line 160 "pure2-autodiff.cpp2"
247265auto main () -> int;
248266
249267// === Cpp2 function definitions =================================================
@@ -387,37 +405,57 @@ auto main() -> int;
387405 [[nodiscard]] auto ad_test::intermediate_var (cpp2::impl::in<double > x, cpp2::impl::in<double > y) -> intermediate_var_ret{
388406 cpp2::impl::deferred_init<double > r;
389407#line 86 "pure2-autodiff.cpp2"
390- double t {}; // TODO: change to x initializer when we have access to the initializer expression.
391- t = x + y;
408+ double t {x + y};
392409
393410 r.construct (cpp2::move (t));
394411 return std::move (r.value ()); }
395412
396- #line 92 "pure2-autodiff.cpp2"
413+ #line 91 "pure2-autodiff.cpp2"
397414 [[nodiscard]] auto ad_test::intermediate_passive_var (cpp2::impl::in<double > x, cpp2::impl::in<double > y) -> intermediate_passive_var_ret{
398415 cpp2::impl::deferred_init<double > r;
399- #line 93 "pure2-autodiff.cpp2"
416+ #line 92 "pure2-autodiff.cpp2"
400417 int i {}; // TODO: Handle as passive when type information on call side is available.
401418 r.construct (x + y);
402419 i = 2 ;
403420
404421 static_cast <void >(cpp2::move (i));
405422 return std::move (r.value ()); }
406423
407- #line 100 "pure2-autodiff.cpp2"
424+ #line 99 "pure2-autodiff.cpp2"
408425 [[nodiscard]] auto ad_test::intermediate_untyped (cpp2::impl::in<double > x, cpp2::impl::in<double > y) -> intermediate_untyped_ret{
409426 cpp2::impl::deferred_init<double > r;
410- #line 101 "pure2-autodiff.cpp2"
427+ #line 100 "pure2-autodiff.cpp2"
411428 auto t {0.0 };
412429 t = x + y;
413430
414431 r.construct (cpp2::move (t));
415432 return std::move (r.value ()); }
416433
434+ #line 106 "pure2-autodiff.cpp2"
435+ [[nodiscard]] auto ad_test::intermediate_default_init (cpp2::impl::in<double > x, cpp2::impl::in<double > y) -> intermediate_default_init_ret{
436+ cpp2::impl::deferred_init<double > r;
417437#line 107 "pure2-autodiff.cpp2"
438+ double t {};
439+ t = x + y;
440+
441+ r.construct (cpp2::move (t));
442+ return std::move (r.value ()); }
443+
444+ #line 113 "pure2-autodiff.cpp2"
445+ [[nodiscard]] auto ad_test::intermediate_no_init (cpp2::impl::in<double > x, cpp2::impl::in<double > y) -> intermediate_no_init_ret{
446+ cpp2::impl::deferred_init<double > r;
447+ #line 114 "pure2-autodiff.cpp2"
448+ r.construct (0.0 );// TODO: r has to be initialized before t (create issue or wait for fix)
449+ cpp2::impl::deferred_init<double > t;
450+ t.construct (x + y);
451+
452+ r.value () = cpp2::move (t.value ());
453+ return std::move (r.value ()); }
454+
455+ #line 121 "pure2-autodiff.cpp2"
418456 [[nodiscard]] auto ad_test::while_loop (cpp2::impl::in<double > x, cpp2::impl::in<double > y) -> while_loop_ret{
419457 cpp2::impl::deferred_init<double > r;
420- #line 108 "pure2-autodiff.cpp2"
458+ #line 122 "pure2-autodiff.cpp2"
421459 int i {0 };
422460
423461 r.construct (x);
@@ -426,10 +464,10 @@ auto main() -> int;
426464 }return std::move (r.value ());
427465 }
428466
429- #line 116 "pure2-autodiff.cpp2"
467+ #line 130 "pure2-autodiff.cpp2"
430468 [[nodiscard]] auto ad_test::do_while_loop (cpp2::impl::in<double > x, cpp2::impl::in<double > y) -> do_while_loop_ret{
431469 cpp2::impl::deferred_init<double > r;
432- #line 117 "pure2-autodiff.cpp2"
470+ #line 131 "pure2-autodiff.cpp2"
433471 int i {0 };
434472
435473 r.construct (x);
@@ -440,10 +478,10 @@ auto main() -> int;
440478 cpp2::impl::cmp_less (i,2 ));return std::move (r.value ());
441479 }
442480
443- #line 127 "pure2-autodiff.cpp2"
481+ #line 141 "pure2-autodiff.cpp2"
444482 [[nodiscard]] auto ad_test::for_loop (cpp2::impl::in<double > x, cpp2::impl::in<double > y) -> for_loop_ret{
445483 cpp2::impl::deferred_init<double > r;
446- #line 128 "pure2-autodiff.cpp2"
484+ #line 142 "pure2-autodiff.cpp2"
447485 std::vector<double > v {};
448486
449487 CPP2_UFCS (push_back)(v, x);
@@ -621,11 +659,9 @@ auto temp_1_d {x_d - y_d};
621659 [[nodiscard]] auto ad_test::intermediate_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_var_diff_ret{
622660 double r {0.0 };
623661 double r_d {0.0 };
624- double t_d {};
662+ double t_d {x_d + y_d };
625663
626- double t {};
627- t_d = x_d + y_d;
628- t = x + y;
664+ double t {x + y};
629665 r_d = cpp2::move (t_d);
630666 r = cpp2::move (t);
631667 return { std::move (r), std::move (r_d) };
@@ -639,7 +675,7 @@ int i_d {};
639675 int i {};
640676 r_d = x_d + y_d;
641677 r = x + y;
642- i_d = { } ;
678+ i_d = 0.0 ;
643679 i = 2 ;
644680 static_cast <void >(cpp2::move (i_d));
645681 static_cast <void >(cpp2::move (i));
@@ -659,10 +695,38 @@ auto t_d {0.0};
659695 return { std::move (r), std::move (r_d) };
660696 }
661697
698+ [[nodiscard]] auto ad_test::intermediate_default_init_diff (cpp2::impl::in<double > x, cpp2::impl::in<double > x_d, cpp2::impl::in<double > y, cpp2::impl::in<double > y_d) -> intermediate_default_init_diff_ret{
699+ double r {0.0 };
700+ double r_d {0.0 };
701+ double t_d {};
702+
703+ double t {};
704+ t_d = x_d + y_d;
705+ t = x + y;
706+ r_d = cpp2::move (t_d);
707+ r = cpp2::move (t);
708+ return { std::move (r), std::move (r_d) };
709+ }
710+
711+ [[nodiscard]] auto ad_test::intermediate_no_init_diff (cpp2::impl::in<double > x, cpp2::impl::in<double > x_d, cpp2::impl::in<double > y, cpp2::impl::in<double > y_d) -> intermediate_no_init_diff_ret{
712+ double r {0.0 };
713+ double r_d {0.0 };r_d = 0.0 ;
714+ r = 0.0 ;
715+
716+ cpp2::impl::deferred_init<double > t_d;
717+
718+ cpp2::impl::deferred_init<double > t;
719+ t_d.construct (x_d + y_d);
720+ t.construct (x + y);
721+ r_d = cpp2::move (t_d.value ());
722+ r = cpp2::move (t.value ());
723+ return { std::move (r), std::move (r_d) };
724+ }
725+
662726 [[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{
663727 double r {0.0 };
664728 double r_d {0.0 };
665- int i_d {0 };
729+ int i_d {0.0 };
666730
667731 int i {0 };
668732 r_d = x_d;
@@ -677,7 +741,7 @@ int i_d {0};
677741 [[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{
678742 double r {0.0 };
679743 double r_d {0.0 };
680- int i_d {0 };
744+ int i_d {0.0 };
681745
682746 int i {0 };
683747 r_d = x_d;
@@ -704,7 +768,7 @@ std::vector<double> v_d {};
704768 CPP2_UFCS (push_back)(v_d, x_d);
705769 CPP2_UFCS (push_back)(v, y);
706770 CPP2_UFCS (push_back)(v_d, y_d);
707- r_d = { } ;
771+ r_d = 0.0 ;
708772 r = 0.0 ;
709773{
710774auto t_d_iter{CPP2_UFCS (begin)(cpp2::move (v_d))};
@@ -722,12 +786,12 @@ auto const& t_d{*cpp2::impl::assert_not_null(t_d_iter)};
722786 return { std::move (r), std::move (r_d) };
723787 }
724788
725- #line 142 "pure2-autodiff.cpp2"
789+ #line 156 "pure2-autodiff.cpp2"
726790auto 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{
727791 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;
728792}
729793
730- #line 146 "pure2-autodiff.cpp2"
794+ #line 160 "pure2-autodiff.cpp2"
731795auto main () -> int{
732796
733797 double x {2.0 };
@@ -755,6 +819,8 @@ auto main() -> int{
755819 write_output (" intermediate var" , x, x_d, y, y_d, ad_test::intermediate_var_diff (x, x_d, y, y_d));
756820 write_output (" intermediate passive var" , x, x_d, y, y_d, ad_test::intermediate_passive_var_diff (x, x_d, y, y_d));
757821 write_output (" intermediate untyped" , x, x_d, y, y_d, ad_test::intermediate_untyped_diff (x, x_d, y, y_d));
822+ write_output (" intermediate default init" , x, x_d, y, y_d, ad_test::intermediate_default_init_diff (x, x_d, y, y_d));
823+ write_output (" intermediate no init" , x, x_d, y, y_d, ad_test::intermediate_no_init_diff (x, x_d, y, y_d));
758824 write_output (" while loop" , x, x_d, y, y_d, ad_test::while_loop_diff (x, x_d, y, y_d));
759825 write_output (" do while loop" , x, x_d, y, y_d, ad_test::do_while_loop_diff (x, x_d, y, y_d));
760826 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)));
0 commit comments