@@ -16,7 +16,7 @@ namespace cpp2 {
1616template <typename R, int dim> class taylor ;
1717
1818
19- #line 192 "cpp2taylor.h2"
19+ #line 218 "cpp2taylor.h2"
2020}
2121
2222
@@ -51,46 +51,57 @@ template<typename R, int dim> class taylor {
5151 public: [[nodiscard]] auto operator [](cpp2::impl::in<int > k) const & -> R;
5252
5353#line 27 "cpp2taylor.h2"
54- public: [[nodiscard]] auto operator [] (cpp2::impl::in<int > i ) & -> auto && ;
54+ public: auto set (cpp2::impl::in<int > k, cpp2::impl::in<R> value ) & -> void ;
5555
56- #line 32 "cpp2taylor.h2"
56+ #line 37 "cpp2taylor.h2"
5757 // C++2 interface / AD interface
5858
5959 public: [[nodiscard]] auto get (cpp2::impl::in<int > i, cpp2::impl::in<R> v0) const & -> R;
6060
61- #line 44 "cpp2taylor.h2"
61+ #line 49 "cpp2taylor.h2"
62+ // Overload for simple handling of connected adds.
63+ public: [[nodiscard]] auto operator +(cpp2::impl::in<taylor> o) const & -> taylor;
64+
65+ #line 54 "cpp2taylor.h2"
66+ // Overload for simple handling of connected minuses.
67+ public: [[nodiscard]] auto operator -(cpp2::impl::in<taylor> o) const & -> taylor;
68+
69+ #line 59 "cpp2taylor.h2"
6270 public: [[nodiscard]] auto add (cpp2::impl::in<taylor> o, cpp2::impl::in<R> v0, cpp2::impl::in<R> o0) const & -> taylor;
6371
64- #line 55 "cpp2taylor.h2"
72+ #line 70 "cpp2taylor.h2"
6573 public: [[nodiscard]] auto sub (cpp2::impl::in<taylor> o, cpp2::impl::in<R> v0, cpp2::impl::in<R> o0) const & -> taylor;
6674
67- #line 66 "cpp2taylor.h2"
75+ #line 81 "cpp2taylor.h2"
6876 public: [[nodiscard]] auto mul (cpp2::impl::in<taylor> o, cpp2::impl::in<R> v0, cpp2::impl::in<R> o0) const & -> taylor;
6977
70- #line 79 "cpp2taylor.h2"
78+ #line 94 "cpp2taylor.h2"
7179 public: [[nodiscard]] auto div (cpp2::impl::in<taylor> o, cpp2::impl::in<R> v0, cpp2::impl::in<R> o0) const & -> taylor;
7280
73- #line 97 "cpp2taylor.h2"
81+ #line 112 "cpp2taylor.h2"
7482 public: [[nodiscard]] auto sqrt (cpp2::impl::in<R> v0) const & -> taylor;
7583
76- #line 116 "cpp2taylor.h2"
84+ #line 131 "cpp2taylor.h2"
7785 public: [[nodiscard]] auto log (cpp2::impl::in<R> v0) const & -> taylor;
7886
79- #line 135 "cpp2taylor.h2"
87+ #line 150 "cpp2taylor.h2"
8088 public: [[nodiscard]] auto exp (cpp2::impl::in<R> v0) const & -> taylor;
8189
82- #line 154 "cpp2taylor.h2"
90+ #line 169 "cpp2taylor.h2"
8391 public: static auto comp_sin_cos (taylor& s, taylor& c, cpp2::impl::in<taylor> u, cpp2::impl::in<R> u0) -> void;
8492
85- #line 171 "cpp2taylor.h2"
93+ #line 186 "cpp2taylor.h2"
8694 public: [[nodiscard]] auto sin (cpp2::impl::in<R> v0) const & -> taylor;
8795
88- #line 181 "cpp2taylor.h2"
96+ #line 196 "cpp2taylor.h2"
8997 public: [[nodiscard]] auto cos (cpp2::impl::in<R> v0) const & -> taylor;
9098
91- #line 190 "cpp2taylor.h2"
99+ #line 205 "cpp2taylor.h2"
92100};
93101
102+ template <typename R, int order> [[nodiscard]] auto to_string (taylor<R,order> const & o) -> std::string;
103+
104+ #line 218 "cpp2taylor.h2"
94105} // cpp2 namespace
95106
96107#endif // CPP2_CPP2TAYLOR_H
@@ -150,12 +161,21 @@ auto i{2};
150161 }
151162
152163#line 27 "cpp2taylor.h2"
153- template <typename R, int dim> [[nodiscard]] auto taylor<R,dim>::operator [](cpp2::impl::in<int > i) & -> auto &&{
154- if (cpp2::cpp2_default.is_active () && !([_0 = 1 , _1 = 1 , _2 = dim]{ return cpp2::impl::cmp_less_eq (_0,_1) && cpp2::impl::cmp_less_eq (_1,_2); }()) ) { cpp2::cpp2_default.report_violation (" " ); }
155- return CPP2_ASSERT_IN_BOUNDS (v, i - 1 );
164+ template <typename R, int dim> auto taylor<R,dim>::set(cpp2::impl::in<int > k, cpp2::impl::in<R> value) & -> void {
165+ if (cpp2::cpp2_default.is_active () && !([_0 = 1 , _1 = k, _2 = dim]{ return cpp2::impl::cmp_less_eq (_0,_1) && cpp2::impl::cmp_less_eq (_1,_2); }()) ) { cpp2::cpp2_default.report_violation (" " ); }
166+ CPP2_ASSERT_IN_BOUNDS (v, k - 1 ) = value;
167+ {
168+ auto i{2 };
169+
170+ #line 32 "cpp2taylor.h2"
171+ for ( ; cpp2::impl::cmp_less_eq (i,k); i += 1 ) {
172+ CPP2_ASSERT_IN_BOUNDS (v, k - 1 ) /= CPP2_ASSERT_NOT_ZERO (CPP2_TYPEOF (CPP2_ASSERT_IN_BOUNDS (v, k - 1 )),i);
173+ }
174+ }
175+ #line 35 "cpp2taylor.h2"
156176 }
157177
158- #line 34 "cpp2taylor.h2"
178+ #line 39 "cpp2taylor.h2"
159179 template <typename R, int dim> [[nodiscard]] auto taylor<R,dim>::get(cpp2::impl::in<int > i, cpp2::impl::in<R> v0) const & -> R{
160180 if (cpp2::cpp2_default.is_active () && !([_0 = 0 , _1 = i, _2 = dim]{ return cpp2::impl::cmp_less_eq (_0,_1) && cpp2::impl::cmp_less_eq (_1,_2); }()) ) { cpp2::cpp2_default.report_violation (" " ); }
161181
@@ -166,62 +186,72 @@ auto i{2};
166186 return CPP2_ASSERT_IN_BOUNDS (v, i - 1 );
167187 }
168188
169- #line 44 "cpp2taylor.h2"
189+ #line 50 "cpp2taylor.h2"
190+ template <typename R, int dim> [[nodiscard]] auto taylor<R,dim>::operator +(cpp2::impl::in<taylor> o) const & -> taylor{
191+ return add (o, 0.0 , 0.0 ); // Primal values are not required.
192+ }
193+
194+ #line 55 "cpp2taylor.h2"
195+ template <typename R, int dim> [[nodiscard]] auto taylor<R,dim>::operator -(cpp2::impl::in<taylor> o) const & -> taylor{
196+ return sub (o, 0.0 , 0.0 ); // Primal values are not required.
197+ }
198+
199+ #line 59 "cpp2taylor.h2"
170200 template <typename R, int dim> [[nodiscard]] auto taylor<R,dim>::add(cpp2::impl::in<taylor> o, cpp2::impl::in<R> v0, cpp2::impl::in<R> o0) const & -> taylor{
171201 taylor r {};
172202{
173203auto k{1 };
174204
175- #line 48 "cpp2taylor.h2"
205+ #line 63 "cpp2taylor.h2"
176206 for ( ; cpp2::impl::cmp_less_eq (k,dim); k += 1 ) {
177207 CPP2_ASSERT_IN_BOUNDS (r.v , k - 1 ) = get (k, v0) + CPP2_UFCS (get)(o, k, o0);
178208 }
179209}
180210
181- #line 52 "cpp2taylor.h2"
211+ #line 67 "cpp2taylor.h2"
182212 return r;
183213 }
184214
185- #line 55 "cpp2taylor.h2"
215+ #line 70 "cpp2taylor.h2"
186216 template <typename R, int dim> [[nodiscard]] auto taylor<R,dim>::sub(cpp2::impl::in<taylor> o, cpp2::impl::in<R> v0, cpp2::impl::in<R> o0) const & -> taylor{
187217 taylor r {};
188218{
189219auto k{1 };
190220
191- #line 59 "cpp2taylor.h2"
221+ #line 74 "cpp2taylor.h2"
192222 for ( ; cpp2::impl::cmp_less_eq (k,dim); k += 1 ) {
193223 CPP2_ASSERT_IN_BOUNDS (r.v , k - 1 ) = get (k, v0) - CPP2_UFCS (get)(o, k, o0);
194224 }
195225}
196226
197- #line 63 "cpp2taylor.h2"
227+ #line 78 "cpp2taylor.h2"
198228 return r;
199229 }
200230
201- #line 66 "cpp2taylor.h2"
231+ #line 81 "cpp2taylor.h2"
202232 template <typename R, int dim> [[nodiscard]] auto taylor<R,dim>::mul(cpp2::impl::in<taylor> o, cpp2::impl::in<R> v0, cpp2::impl::in<R> o0) const & -> taylor{
203233 taylor r {};
204234{
205235auto k{1 };
206236
207- #line 70 "cpp2taylor.h2"
237+ #line 85 "cpp2taylor.h2"
208238 for ( ; cpp2::impl::cmp_less_eq (k,dim); k += 1 ) {
209239{
210240auto j{0 };
211241
212- #line 72 "cpp2taylor.h2"
242+ #line 87 "cpp2taylor.h2"
213243 for ( ; cpp2::impl::cmp_less_eq (j,k); j += 1 ) {
214244 CPP2_ASSERT_IN_BOUNDS (r.v , k - 1 ) += get (j, v0) * o.get (k - j, o0);
215245 }
216246}
217- #line 75 "cpp2taylor.h2"
247+ #line 90 "cpp2taylor.h2"
218248 }
219249}
220- #line 76 "cpp2taylor.h2"
250+ #line 91 "cpp2taylor.h2"
221251 return r;
222252 }
223253
224- #line 79 "cpp2taylor.h2"
254+ #line 94 "cpp2taylor.h2"
225255 template <typename R, int dim> [[nodiscard]] auto taylor<R,dim>::div(cpp2::impl::in<taylor> o, cpp2::impl::in<R> v0, cpp2::impl::in<R> o0) const & -> taylor{
226256 taylor r {};
227257 R r0 {v0 / CPP2_ASSERT_NOT_ZERO (CPP2_TYPEOF (v0),o0)};
@@ -230,26 +260,26 @@ auto j{0};
230260{
231261auto k{1 };
232262
233- #line 86 "cpp2taylor.h2"
263+ #line 101 "cpp2taylor.h2"
234264 for ( ; cpp2::impl::cmp_less_eq (k,dim); k += 1 ) {
235265 CPP2_ASSERT_IN_BOUNDS (r.v , k - 1 ) = get (k, v0);
236266{
237267auto j{0 };
238268
239- #line 89 "cpp2taylor.h2"
269+ #line 104 "cpp2taylor.h2"
240270 for ( ; cpp2::impl::cmp_less (j,k); j += 1 ) {
241271 CPP2_ASSERT_IN_BOUNDS (r.v , k - 1 ) -= CPP2_UFCS (get)(r, j, r0) * o.get (k - j, o0);
242272 }
243273}
244- #line 92 "cpp2taylor.h2"
274+ #line 107 "cpp2taylor.h2"
245275 CPP2_ASSERT_IN_BOUNDS (r.v , k - 1 ) *= factor;
246276 }
247277}
248- #line 94 "cpp2taylor.h2"
278+ #line 109 "cpp2taylor.h2"
249279 return r;
250280 }
251281
252- #line 97 "cpp2taylor.h2"
282+ #line 112 "cpp2taylor.h2"
253283 template <typename R, int dim> [[nodiscard]] auto taylor<R,dim>::sqrt(cpp2::impl::in<R> v0) const & -> taylor{
254284 taylor r {};
255285 R r0 {std::sqrt (v0)};
@@ -258,27 +288,27 @@ auto j{0};
258288{
259289auto k{1 };
260290
261- #line 104 "cpp2taylor.h2"
291+ #line 119 "cpp2taylor.h2"
262292 for ( ; cpp2::impl::cmp_less_eq (k,dim); k += 1 ) {
263293 CPP2_ASSERT_IN_BOUNDS (r.v , k - 1 ) = get (k, v0);
264294{
265295auto j{1 };
266296
267- #line 107 "cpp2taylor.h2"
297+ #line 122 "cpp2taylor.h2"
268298 for ( ; cpp2::impl::cmp_less (j,k); j += 1 ) {
269299 CPP2_ASSERT_IN_BOUNDS (r.v , k - 1 ) -= r.get (j, r0) * r.get (k - j, r0);
270300 }
271301}
272- #line 110 "cpp2taylor.h2"
302+ #line 125 "cpp2taylor.h2"
273303 CPP2_ASSERT_IN_BOUNDS (r.v , k - 1 ) *= factor;
274304 }
275305}
276306
277- #line 113 "cpp2taylor.h2"
307+ #line 128 "cpp2taylor.h2"
278308 return r;
279309 }
280310
281- #line 116 "cpp2taylor.h2"
311+ #line 131 "cpp2taylor.h2"
282312 template <typename R, int dim> [[nodiscard]] auto taylor<R,dim>::log(cpp2::impl::in<R> v0) const & -> taylor{
283313 taylor r {};
284314 R r0 {std::log (v0)};
@@ -287,27 +317,27 @@ auto j{1};
287317{
288318auto k{1 };
289319
290- #line 123 "cpp2taylor.h2"
320+ #line 138 "cpp2taylor.h2"
291321 for ( ; cpp2::impl::cmp_less_eq (k,dim); k += 1 ) {
292322 CPP2_ASSERT_IN_BOUNDS (r.v , k - 1 ) = k * get (k, v0);
293323{
294324auto j{1 };
295325
296- #line 126 "cpp2taylor.h2"
326+ #line 141 "cpp2taylor.h2"
297327 for ( ; cpp2::impl::cmp_less (j,k); j += 1 ) {
298328 CPP2_ASSERT_IN_BOUNDS (r.v , k - 1 ) -= j * get (k - j, v0) * r.get (j, r0);
299329 }
300330}
301- #line 129 "cpp2taylor.h2"
331+ #line 144 "cpp2taylor.h2"
302332 CPP2_ASSERT_IN_BOUNDS (r.v , k - 1 ) *= factor / CPP2_ASSERT_NOT_ZERO (CPP2_TYPEOF (factor),k);
303333 }
304334}
305335
306- #line 132 "cpp2taylor.h2"
336+ #line 147 "cpp2taylor.h2"
307337 return r;
308338 }
309339
310- #line 135 "cpp2taylor.h2"
340+ #line 150 "cpp2taylor.h2"
311341 template <typename R, int dim> [[nodiscard]] auto taylor<R,dim>::exp(cpp2::impl::in<R> v0) const & -> taylor{
312342 taylor r {};
313343 R r0 {std::exp (v0)};
@@ -316,52 +346,52 @@ auto j{1};
316346{
317347auto k{1 };
318348
319- #line 142 "cpp2taylor.h2"
349+ #line 157 "cpp2taylor.h2"
320350 for ( ; cpp2::impl::cmp_less_eq (k,dim); k += 1 ) {
321351{
322352auto j{1 };
323353
324- #line 144 "cpp2taylor.h2"
354+ #line 159 "cpp2taylor.h2"
325355 for ( ; cpp2::impl::cmp_less_eq (j,k); j += 1 ) {
326356 CPP2_ASSERT_IN_BOUNDS (r.v , k - 1 ) += j * r.get (k - j, r0) * get (j, v0);
327357 }
328358}
329- #line 147 "cpp2taylor.h2"
359+ #line 162 "cpp2taylor.h2"
330360 CPP2_ASSERT_IN_BOUNDS (r.v , k - 1 ) /= CPP2_ASSERT_NOT_ZERO (CPP2_TYPEOF (CPP2_ASSERT_IN_BOUNDS (r.v , k - 1 )),k);
331361 }
332362}
333363
334- #line 150 "cpp2taylor.h2"
364+ #line 165 "cpp2taylor.h2"
335365 return r;
336366 }
337367
338- #line 154 "cpp2taylor.h2"
368+ #line 169 "cpp2taylor.h2"
339369 template <typename R, int dim> auto taylor<R,dim>::comp_sin_cos(taylor& s, taylor& c, cpp2::impl::in<taylor> u, cpp2::impl::in<R> u0) -> void {
340370 R s0 {std::sin (u0)};
341371 R c0 {std::cos (u0)};
342372{
343373auto k{1 };
344374
345- #line 159 "cpp2taylor.h2"
375+ #line 174 "cpp2taylor.h2"
346376 for ( ; cpp2::impl::cmp_less_eq (k,dim); k += 1 ) {
347377{
348378auto j{1 };
349379
350- #line 161 "cpp2taylor.h2"
380+ #line 176 "cpp2taylor.h2"
351381 for ( ; cpp2::impl::cmp_less_eq (j,k); j += 1 ) {
352382 CPP2_ASSERT_IN_BOUNDS (s.v , k - 1 ) += j * u.get (j, u0) * CPP2_UFCS (get)(c, k - j, c0);
353383 CPP2_ASSERT_IN_BOUNDS (c.v , k - 1 ) -= j * u.get (j, u0) * CPP2_UFCS (get)(s, k - j, s0);
354384 }
355385}
356- #line 165 "cpp2taylor.h2"
386+ #line 180 "cpp2taylor.h2"
357387 CPP2_ASSERT_IN_BOUNDS (s.v , k - 1 ) /= CPP2_ASSERT_NOT_ZERO (CPP2_TYPEOF (CPP2_ASSERT_IN_BOUNDS (s.v , k - 1 )),k);
358388 CPP2_ASSERT_IN_BOUNDS (c.v , k - 1 ) /= CPP2_ASSERT_NOT_ZERO (CPP2_TYPEOF (CPP2_ASSERT_IN_BOUNDS (c.v , k - 1 )),k);
359389 }
360390}
361- #line 168 "cpp2taylor.h2"
391+ #line 183 "cpp2taylor.h2"
362392 }
363393
364- #line 171 "cpp2taylor.h2"
394+ #line 186 "cpp2taylor.h2"
365395 template <typename R, int dim> [[nodiscard]] auto taylor<R,dim>::sin(cpp2::impl::in<R> v0) const & -> taylor{
366396 taylor t {};
367397 taylor r {};
@@ -372,7 +402,7 @@ auto j{1};
372402 return r;
373403 }
374404
375- #line 181 "cpp2taylor.h2"
405+ #line 196 "cpp2taylor.h2"
376406 template <typename R, int dim> [[nodiscard]] auto taylor<R,dim>::cos(cpp2::impl::in<R> v0) const & -> taylor{
377407 taylor t {};
378408 taylor r {};
@@ -383,7 +413,23 @@ auto j{1};
383413 return r;
384414 }
385415
386- #line 192 "cpp2taylor.h2"
416+ #line 207 "cpp2taylor.h2"
417+ template <typename R, int order> [[nodiscard]] auto to_string (taylor<R,order> const & o) -> std::string{
418+ std::string r {" (" };
419+ {
420+ auto i{1 };
421+
422+ #line 210 "cpp2taylor.h2"
423+ for ( ; cpp2::impl::cmp_less_eq (i,order); i += 1 ) {
424+ r += " " + cpp2::to_string (CPP2_ASSERT_IN_BOUNDS (o, i)) + " " ;
425+ }
426+ }
427+ #line 213 "cpp2taylor.h2"
428+ r += " )" ;
429+
430+ return r;
431+ }
432+
387433}
388434
389435#endif
0 commit comments