Skip to content

Commit 617a089

Browse files
committed
Basic handling of higher order derivatives and handling of add and minus.
1 parent 86f0c7b commit 617a089

File tree

8 files changed

+1210
-591
lines changed

8 files changed

+1210
-591
lines changed

include/cpp2taylor.h

Lines changed: 103 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ namespace cpp2 {
1616
template<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
{
173203
auto 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
{
189219
auto 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
{
205235
auto 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
{
210240
auto 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
{
231261
auto 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
{
237267
auto 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
{
259289
auto 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
{
265295
auto 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
{
288318
auto 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
{
294324
auto 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
{
317347
auto 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
{
322352
auto 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
{
343373
auto 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
{
348378
auto 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

Comments
 (0)