Skip to content

Commit 6932cde

Browse files
committed
Proper handling of initializer expressions.
1 parent f1b5de7 commit 6932cde

File tree

5 files changed

+735
-566
lines changed

5 files changed

+735
-566
lines changed

regression-tests/pure2-autodiff.cpp2

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,7 @@ ad_test: @autodiff @print type = {
8383
}
8484

8585
intermediate_var: (x: double, y: double) -> (r: double) = {
86-
t: double = (); // TODO: change to x initializer when we have access to the initializer expression.
87-
t = x + y;
86+
t: double = x + y;
8887

8988
r = t;
9089
}
@@ -104,6 +103,21 @@ ad_test: @autodiff @print type = {
104103
r = t;
105104
}
106105

106+
intermediate_default_init: (x: double, y: double) -> (r: double) = {
107+
t: double = ();
108+
t = x + y;
109+
110+
r = t;
111+
}
112+
113+
intermediate_no_init: (x: double, y: double) -> (r: double) = {
114+
r = 0.0; // TODO: r has to be initialized before t (create issue or wait for fix)
115+
t: double;
116+
t = x + y;
117+
118+
r = t;
119+
}
120+
107121
while_loop: (x: double, y: double) -> (r: double) = {
108122
i: int = 0;
109123

@@ -170,6 +184,8 @@ main: () = {
170184
write_output("intermediate var", x, x_d, y, y_d, ad_test::intermediate_var_diff(x, x_d, y, y_d));
171185
write_output("intermediate passive var", x, x_d, y, y_d, ad_test::intermediate_passive_var_diff(x, x_d, y, y_d));
172186
write_output("intermediate untyped", x, x_d, y, y_d, ad_test::intermediate_untyped_diff(x, x_d, y, y_d));
187+
write_output("intermediate default init", x, x_d, y, y_d, ad_test::intermediate_default_init_diff(x, x_d, y, y_d));
188+
write_output("intermediate no init", x, x_d, y, y_d, ad_test::intermediate_no_init_diff(x, x_d, y, y_d));
173189
write_output("while loop", x, x_d, y, y_d, ad_test::while_loop_diff(x, x_d, y, y_d));
174190
write_output("do while loop", x, x_d, y, y_d, ad_test::do_while_loop_diff(x, x_d, y, y_d));
175191
write_output("for loop", x, x_d, y, y_d, ad_test::for_loop_diff(x, x_d, y, y_d));

regression-tests/test-results/pure2-autodiff.cpp

Lines changed: 94 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -114,27 +114,37 @@ using intermediate_var_ret = double;
114114
using 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;
119119
using 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;
124134
using 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;
129139
using 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;
134144
using 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;
139149
struct 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

222232
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;
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+
224242
struct while_loop_diff_ret { double r; double r_d; };
225243

226244
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;
@@ -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

244262
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;
245263

246-
#line 146 "pure2-autodiff.cpp2"
264+
#line 160 "pure2-autodiff.cpp2"
247265
auto 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
{
710774
auto 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"
726790
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{
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"
731795
auto 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

Comments
 (0)