Skip to content

Commit be60ab2

Browse files
committed
Handling of for loops and added special functions.
1 parent 1d23291 commit be60ab2

File tree

6 files changed

+1237
-490
lines changed

6 files changed

+1237
-490
lines changed

regression-tests/pure2-autodiff.cpp2

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,20 @@ ad_test: @autodiff @print type = {
123123
next (i += 1)
124124
while i < 2;
125125
}
126+
127+
for_loop: (x: double, y: double) -> (r: double) = {
128+
v: std::vector<double> = ();
129+
130+
v.push_back(x);
131+
v.push_back(y);
132+
133+
r = 0.0;
134+
for v
135+
do (t)
136+
{
137+
r = r + t;
138+
}
139+
}
126140
}
127141

128142
write_output: (func: std::string, x: double, x_d: double, y: double, y_d: double, ret) = {
@@ -158,4 +172,5 @@ main: () = {
158172
write_output("intermediate untyped", x, x_d, y, y_d, ad_test::intermediate_untyped_diff(x, x_d, y, y_d));
159173
write_output("while loop", x, x_d, y, y_d, ad_test::while_loop_diff(x, x_d, y, y_d));
160174
write_output("do while loop", x, x_d, y, y_d, ad_test::do_while_loop_diff(x, x_d, y, y_d));
175+
write_output("for loop", x, x_d, y, y_d, ad_test::for_loop_diff(x, x_d, y, y_d));
161176
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,4 @@ diff(intermediate passive var) at (x = 2.000000, x_d = 1.000000, y = 3.000000, y
2020
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)
2121
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)
2222
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)
23+
diff(for loop) at (x = 2.000000, x_d = 1.000000, y = 3.000000, y_d = 2.000000) = (r = 5.000000, r_d = 3.000000)

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

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

225230
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;
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

235244
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;
236245

237-
#line 132 "pure2-autodiff.cpp2"
246+
#line 146 "pure2-autodiff.cpp2"
238247
auto 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"
672726
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{
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"
677731
auto 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

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

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,23 @@ ad_test:/* @autodiff @print */ type =
239239
return;
240240
}
241241

242+
for_loop:(
243+
in x: double,
244+
in y: double,
245+
) -> (out r: double, ) =
246+
{
247+
v: std::vector<double> = ();
248+
v.push_back(x);
249+
v.push_back(y);
250+
r = 0.0;
251+
for v
252+
do (in t: _)
253+
{
254+
r = r + t;
255+
}
256+
return;
257+
}
258+
242259
add_1_diff:(
243260
in x: double,
244261
in x_d: double,
@@ -645,6 +662,38 @@ ad_test:/* @autodiff @print */ type =
645662
while i < 2;
646663
return;
647664
}
665+
666+
for_loop_diff:(
667+
in x: double,
668+
in x_d: double,
669+
in y: double,
670+
in y_d: double,
671+
) -> (
672+
out r: double = 0.0,
673+
out r_d: double = 0.0,
674+
) =
675+
{
676+
v_d: std::vector<double> = ();
677+
v: std::vector<double> = ();
678+
v.push_back(x);
679+
v_d.push_back(x_d);
680+
v.push_back(y);
681+
v_d.push_back(y_d);
682+
r_d = ();
683+
r = 0.0;
684+
(copy t_d_iter: _ = v_d.begin(), )
685+
for v
686+
next (t_d_iter++)
687+
do (in t: _)
688+
{
689+
(in t_d: _ = t_d_iter*, )
690+
{
691+
r_d = r_d + t_d;
692+
r = r + t;
693+
}
694+
}
695+
return;
696+
}
648697
}
649698
ok (all Cpp2, passes safety checks)
650699

0 commit comments

Comments
 (0)