Skip to content

Commit 1d23291

Browse files
committed
Added handling of while and do while loops.
1 parent 0c8983d commit 1d23291

File tree

6 files changed

+703
-396
lines changed

6 files changed

+703
-396
lines changed

regression-tests/pure2-autodiff.cpp2

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,33 @@ ad_test: @autodiff @print type = {
9696

9797
_ = i;
9898
}
99+
100+
intermediate_untyped: (x: double, y: double) -> (r: double) = {
101+
t := 0.0;
102+
t = x + y;
103+
104+
r = t;
105+
}
106+
107+
while_loop: (x: double, y: double) -> (r: double) = {
108+
i: int = 0;
109+
110+
r = x;
111+
while i < 2 next (i += 1) {
112+
r = r + y ;
113+
}
114+
}
115+
116+
do_while_loop: (x: double, y: double) -> (r: double) = {
117+
i: int = 0;
118+
119+
r = x;
120+
do {
121+
r = r + y ;
122+
}
123+
next (i += 1)
124+
while i < 2;
125+
}
99126
}
100127

101128
write_output: (func: std::string, x: double, x_d: double, y: double, y_d: double, ret) = {
@@ -128,4 +155,7 @@ main: () = {
128155
write_output("direct return", x, x_d, y, y_d, ad_test::direct_return_diff(x, x_d, y, y_d));
129156
write_output("intermediate var", x, x_d, y, y_d, ad_test::intermediate_var_diff(x, x_d, y, y_d));
130157
write_output("intermediate passive var", x, x_d, y, y_d, ad_test::intermediate_passive_var_diff(x, x_d, y, y_d));
158+
write_output("intermediate untyped", x, x_d, y, y_d, ad_test::intermediate_untyped_diff(x, x_d, y, y_d));
159+
write_output("while loop", x, x_d, y, y_d, ad_test::while_loop_diff(x, x_d, y, y_d));
160+
write_output("do while loop", x, x_d, y, y_d, ad_test::do_while_loop_diff(x, x_d, y, y_d));
131161
}

regression-tests/test-results/gcc-13-c++2b/pure2-autodiff.cpp.execution

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,6 @@ diff(if else branch) at (x = 2.000000, x_d = 1.000000, y = 3.000000, y_d = 2.000
1717
diff(direct return) at (x = 2.000000, x_d = 1.000000, y = 3.000000, y_d = 2.000000) = (r = 5.000000, r_d = 3.000000)
1818
diff(intermediate var) at (x = 2.000000, x_d = 1.000000, y = 3.000000, y_d = 2.000000) = (r = 5.000000, r_d = 3.000000)
1919
diff(intermediate passive var) at (x = 2.000000, x_d = 1.000000, y = 3.000000, y_d = 2.000000) = (r = 5.000000, r_d = 3.000000)
20+
diff(intermediate untyped) at (x = 2.000000, x_d = 1.000000, y = 3.000000, y_d = 2.000000) = (r = 5.000000, r_d = 3.000000)
21+
diff(while loop) at (x = 2.000000, x_d = 1.000000, y = 3.000000, y_d = 2.000000) = (r = 8.000000, r_d = 5.000000)
22+
diff(do while loop) at (x = 2.000000, x_d = 1.000000, y = 3.000000, y_d = 2.000000) = (r = 8.000000, r_d = 5.000000)

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

Lines changed: 119 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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;
119134
struct 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

198213
public: [[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

208235
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;
209236

210-
#line 105 "pure2-autodiff.cpp2"
237+
#line 132 "pure2-autodiff.cpp2"
211238
auto 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"
561672
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{
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"
566677
auto 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

regression-tests/test-results/pure2-autodiff.cpp2.output

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,48 @@ ad_test:/* @autodiff @print */ type =
197197
return;
198198
}
199199

200+
intermediate_untyped:(
201+
in x: double,
202+
in y: double,
203+
) -> (out r: double, ) =
204+
{
205+
t: _ = 0.0;
206+
t = x + y;
207+
r = t;
208+
return;
209+
}
210+
211+
while_loop:(
212+
in x: double,
213+
in y: double,
214+
) -> (out r: double, ) =
215+
{
216+
i: int = 0;
217+
r = x;
218+
while i < 2
219+
next (i += 1)
220+
{
221+
r = r + y;
222+
}
223+
return;
224+
}
225+
226+
do_while_loop:(
227+
in x: double,
228+
in y: double,
229+
) -> (out r: double, ) =
230+
{
231+
i: int = 0;
232+
r = x;
233+
do
234+
{
235+
r = r + y;
236+
}
237+
next (i += 1)
238+
while i < 2;
239+
return;
240+
}
241+
200242
add_1_diff:(
201243
in x: double,
202244
in x_d: double,
@@ -537,6 +579,72 @@ ad_test:/* @autodiff @print */ type =
537579
_ = i;
538580
return;
539581
}
582+
583+
intermediate_untyped_diff:(
584+
in x: double,
585+
in x_d: double,
586+
in y: double,
587+
in y_d: double,
588+
) -> (
589+
out r: double = 0.0,
590+
out r_d: double = 0.0,
591+
) =
592+
{
593+
t_d: _ = 0.0;
594+
t: _ = 0.0;
595+
t_d = x_d + y_d;
596+
t = x + y;
597+
r_d = t_d;
598+
r = t;
599+
return;
600+
}
601+
602+
while_loop_diff:(
603+
in x: double,
604+
in x_d: double,
605+
in y: double,
606+
in y_d: double,
607+
) -> (
608+
out r: double = 0.0,
609+
out r_d: double = 0.0,
610+
) =
611+
{
612+
i_d: int = 0;
613+
i: int = 0;
614+
r_d = x_d;
615+
r = x;
616+
while i < 2
617+
next (i += 1)
618+
{
619+
r_d = r_d + y_d;
620+
r = r + y;
621+
}
622+
return;
623+
}
624+
625+
do_while_loop_diff:(
626+
in x: double,
627+
in x_d: double,
628+
in y: double,
629+
in y_d: double,
630+
) -> (
631+
out r: double = 0.0,
632+
out r_d: double = 0.0,
633+
) =
634+
{
635+
i_d: int = 0;
636+
i: int = 0;
637+
r_d = x_d;
638+
r = x;
639+
do
640+
{
641+
r_d = r_d + y_d;
642+
r = r + y;
643+
}
644+
next (i += 1)
645+
while i < 2;
646+
return;
647+
}
540648
}
541649
ok (all Cpp2, passes safety checks)
542650

0 commit comments

Comments
 (0)