Skip to content

Commit 50bea33

Browse files
committed
Refactor of diff string to structure.
Currently placeholder that defaults to the forward derivatives.
1 parent e1e391d commit 50bea33

File tree

3 files changed

+762
-608
lines changed

3 files changed

+762
-608
lines changed

include/cpp2taylor.h

Lines changed: 82 additions & 53 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 225 "cpp2taylor.h2"
19+
#line 242 "cpp2taylor.h2"
2020
}
2121

2222

@@ -72,41 +72,49 @@ template<typename R, int dim> class taylor {
7272
public: [[nodiscard]] auto operator-(cpp2::impl::in<taylor> o) const& -> taylor;
7373

7474
#line 66 "cpp2taylor.h2"
75+
// Overload for simple handling of prefix +.
76+
public: [[nodiscard]] auto operator+() const& -> taylor;
77+
78+
#line 71 "cpp2taylor.h2"
79+
// Overload for simple handling of prefix -.
80+
public: [[nodiscard]] auto operator-() const& -> taylor;
81+
82+
#line 83 "cpp2taylor.h2"
7583
public: [[nodiscard]] auto add(cpp2::impl::in<taylor> o, cpp2::impl::in<R> v0, cpp2::impl::in<R> o0) const& -> taylor;
7684

77-
#line 77 "cpp2taylor.h2"
85+
#line 94 "cpp2taylor.h2"
7886
public: [[nodiscard]] auto sub(cpp2::impl::in<taylor> o, cpp2::impl::in<R> v0, cpp2::impl::in<R> o0) const& -> taylor;
7987

80-
#line 88 "cpp2taylor.h2"
88+
#line 105 "cpp2taylor.h2"
8189
public: [[nodiscard]] auto mul(cpp2::impl::in<taylor> o, cpp2::impl::in<R> v0, cpp2::impl::in<R> o0) const& -> taylor;
8290

83-
#line 101 "cpp2taylor.h2"
91+
#line 118 "cpp2taylor.h2"
8492
public: [[nodiscard]] auto div(cpp2::impl::in<taylor> o, cpp2::impl::in<R> v0, cpp2::impl::in<R> o0) const& -> taylor;
8593

86-
#line 119 "cpp2taylor.h2"
94+
#line 136 "cpp2taylor.h2"
8795
public: [[nodiscard]] auto sqrt(cpp2::impl::in<R> v0) const& -> taylor;
8896

89-
#line 138 "cpp2taylor.h2"
97+
#line 155 "cpp2taylor.h2"
9098
public: [[nodiscard]] auto log(cpp2::impl::in<R> v0) const& -> taylor;
9199

92-
#line 157 "cpp2taylor.h2"
100+
#line 174 "cpp2taylor.h2"
93101
public: [[nodiscard]] auto exp(cpp2::impl::in<R> v0) const& -> taylor;
94102

95-
#line 176 "cpp2taylor.h2"
103+
#line 193 "cpp2taylor.h2"
96104
public: static auto comp_sin_cos(taylor& s, taylor& c, cpp2::impl::in<taylor> u, cpp2::impl::in<R> u0) -> void;
97105

98-
#line 193 "cpp2taylor.h2"
106+
#line 210 "cpp2taylor.h2"
99107
public: [[nodiscard]] auto sin(cpp2::impl::in<R> v0) const& -> taylor;
100108

101-
#line 203 "cpp2taylor.h2"
109+
#line 220 "cpp2taylor.h2"
102110
public: [[nodiscard]] auto cos(cpp2::impl::in<R> v0) const& -> taylor;
103111

104-
#line 212 "cpp2taylor.h2"
112+
#line 229 "cpp2taylor.h2"
105113
};
106114

107115
template<typename R, int order> [[nodiscard]] auto to_string(taylor<R,order> const& o) -> std::string;
108116

109-
#line 225 "cpp2taylor.h2"
117+
#line 242 "cpp2taylor.h2"
110118
} // cpp2 namespace
111119

112120
#endif // CPP2_CPP2TAYLOR_H
@@ -228,62 +236,83 @@ auto i{2};
228236
return sub(o, 0.0, 0.0); // Primal values are not required.
229237
}
230238

231-
#line 66 "cpp2taylor.h2"
239+
#line 67 "cpp2taylor.h2"
240+
template <typename R, int dim> [[nodiscard]] auto taylor<R,dim>::operator+() const& -> taylor{
241+
return (*this);
242+
}
243+
244+
#line 72 "cpp2taylor.h2"
245+
template <typename R, int dim> [[nodiscard]] auto taylor<R,dim>::operator-() const& -> taylor{
246+
taylor r {};
247+
{
248+
auto k{1};
249+
250+
#line 76 "cpp2taylor.h2"
251+
for( ; cpp2::impl::cmp_less_eq(k,dim); k += 1 ) {
252+
CPP2_ASSERT_IN_BOUNDS(r.v, k - 1) = -CPP2_ASSERT_IN_BOUNDS(v, k - 1);
253+
}
254+
}
255+
256+
#line 80 "cpp2taylor.h2"
257+
return r;
258+
}
259+
260+
#line 83 "cpp2taylor.h2"
232261
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{
233262
taylor r {};
234263
{
235264
auto k{1};
236265

237-
#line 70 "cpp2taylor.h2"
266+
#line 87 "cpp2taylor.h2"
238267
for( ; cpp2::impl::cmp_less_eq(k,dim); k += 1 ) {
239268
CPP2_ASSERT_IN_BOUNDS(r.v, k - 1) = get(k, v0) + CPP2_UFCS(get)(o, k, o0);
240269
}
241270
}
242271

243-
#line 74 "cpp2taylor.h2"
272+
#line 91 "cpp2taylor.h2"
244273
return r;
245274
}
246275

247-
#line 77 "cpp2taylor.h2"
276+
#line 94 "cpp2taylor.h2"
248277
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{
249278
taylor r {};
250279
{
251280
auto k{1};
252281

253-
#line 81 "cpp2taylor.h2"
282+
#line 98 "cpp2taylor.h2"
254283
for( ; cpp2::impl::cmp_less_eq(k,dim); k += 1 ) {
255284
CPP2_ASSERT_IN_BOUNDS(r.v, k - 1) = get(k, v0) - CPP2_UFCS(get)(o, k, o0);
256285
}
257286
}
258287

259-
#line 85 "cpp2taylor.h2"
288+
#line 102 "cpp2taylor.h2"
260289
return r;
261290
}
262291

263-
#line 88 "cpp2taylor.h2"
292+
#line 105 "cpp2taylor.h2"
264293
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{
265294
taylor r {};
266295
{
267296
auto k{1};
268297

269-
#line 92 "cpp2taylor.h2"
298+
#line 109 "cpp2taylor.h2"
270299
for( ; cpp2::impl::cmp_less_eq(k,dim); k += 1 ) {
271300
{
272301
auto j{0};
273302

274-
#line 94 "cpp2taylor.h2"
303+
#line 111 "cpp2taylor.h2"
275304
for( ; cpp2::impl::cmp_less_eq(j,k); j += 1 ) {
276305
CPP2_ASSERT_IN_BOUNDS(r.v, k - 1) += get(j, v0) * o.get(k - j, o0);
277306
}
278307
}
279-
#line 97 "cpp2taylor.h2"
308+
#line 114 "cpp2taylor.h2"
280309
}
281310
}
282-
#line 98 "cpp2taylor.h2"
311+
#line 115 "cpp2taylor.h2"
283312
return r;
284313
}
285314

286-
#line 101 "cpp2taylor.h2"
315+
#line 118 "cpp2taylor.h2"
287316
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{
288317
taylor r {};
289318
R r0 {v0 / CPP2_ASSERT_NOT_ZERO(CPP2_TYPEOF(v0),o0)};
@@ -292,26 +321,26 @@ auto j{0};
292321
{
293322
auto k{1};
294323

295-
#line 108 "cpp2taylor.h2"
324+
#line 125 "cpp2taylor.h2"
296325
for( ; cpp2::impl::cmp_less_eq(k,dim); k += 1 ) {
297326
CPP2_ASSERT_IN_BOUNDS(r.v, k - 1) = get(k, v0);
298327
{
299328
auto j{0};
300329

301-
#line 111 "cpp2taylor.h2"
330+
#line 128 "cpp2taylor.h2"
302331
for( ; cpp2::impl::cmp_less(j,k); j += 1 ) {
303332
CPP2_ASSERT_IN_BOUNDS(r.v, k - 1) -= CPP2_UFCS(get)(r, j, r0) * o.get(k - j, o0);
304333
}
305334
}
306-
#line 114 "cpp2taylor.h2"
335+
#line 131 "cpp2taylor.h2"
307336
CPP2_ASSERT_IN_BOUNDS(r.v, k - 1) *= factor;
308337
}
309338
}
310-
#line 116 "cpp2taylor.h2"
339+
#line 133 "cpp2taylor.h2"
311340
return r;
312341
}
313342

314-
#line 119 "cpp2taylor.h2"
343+
#line 136 "cpp2taylor.h2"
315344
template <typename R, int dim> [[nodiscard]] auto taylor<R,dim>::sqrt(cpp2::impl::in<R> v0) const& -> taylor{
316345
taylor r {};
317346
R r0 {std::sqrt(v0)};
@@ -320,27 +349,27 @@ auto j{0};
320349
{
321350
auto k{1};
322351

323-
#line 126 "cpp2taylor.h2"
352+
#line 143 "cpp2taylor.h2"
324353
for( ; cpp2::impl::cmp_less_eq(k,dim); k += 1 ) {
325354
CPP2_ASSERT_IN_BOUNDS(r.v, k - 1) = get(k, v0);
326355
{
327356
auto j{1};
328357

329-
#line 129 "cpp2taylor.h2"
358+
#line 146 "cpp2taylor.h2"
330359
for( ; cpp2::impl::cmp_less(j,k); j += 1 ) {
331360
CPP2_ASSERT_IN_BOUNDS(r.v, k - 1) -= r.get(j, r0) * r.get(k - j, r0);
332361
}
333362
}
334-
#line 132 "cpp2taylor.h2"
363+
#line 149 "cpp2taylor.h2"
335364
CPP2_ASSERT_IN_BOUNDS(r.v, k - 1) *= factor;
336365
}
337366
}
338367

339-
#line 135 "cpp2taylor.h2"
368+
#line 152 "cpp2taylor.h2"
340369
return r;
341370
}
342371

343-
#line 138 "cpp2taylor.h2"
372+
#line 155 "cpp2taylor.h2"
344373
template <typename R, int dim> [[nodiscard]] auto taylor<R,dim>::log(cpp2::impl::in<R> v0) const& -> taylor{
345374
taylor r {};
346375
R r0 {std::log(v0)};
@@ -349,27 +378,27 @@ auto j{1};
349378
{
350379
auto k{1};
351380

352-
#line 145 "cpp2taylor.h2"
381+
#line 162 "cpp2taylor.h2"
353382
for( ; cpp2::impl::cmp_less_eq(k,dim); k += 1 ) {
354383
CPP2_ASSERT_IN_BOUNDS(r.v, k - 1) = k * get(k, v0);
355384
{
356385
auto j{1};
357386

358-
#line 148 "cpp2taylor.h2"
387+
#line 165 "cpp2taylor.h2"
359388
for( ; cpp2::impl::cmp_less(j,k); j += 1 ) {
360389
CPP2_ASSERT_IN_BOUNDS(r.v, k - 1) -= j * get(k - j, v0) * r.get(j, r0);
361390
}
362391
}
363-
#line 151 "cpp2taylor.h2"
392+
#line 168 "cpp2taylor.h2"
364393
CPP2_ASSERT_IN_BOUNDS(r.v, k - 1) *= factor / CPP2_ASSERT_NOT_ZERO(CPP2_TYPEOF(factor),k);
365394
}
366395
}
367396

368-
#line 154 "cpp2taylor.h2"
397+
#line 171 "cpp2taylor.h2"
369398
return r;
370399
}
371400

372-
#line 157 "cpp2taylor.h2"
401+
#line 174 "cpp2taylor.h2"
373402
template <typename R, int dim> [[nodiscard]] auto taylor<R,dim>::exp(cpp2::impl::in<R> v0) const& -> taylor{
374403
taylor r {};
375404
R r0 {std::exp(v0)};
@@ -378,52 +407,52 @@ auto j{1};
378407
{
379408
auto k{1};
380409

381-
#line 164 "cpp2taylor.h2"
410+
#line 181 "cpp2taylor.h2"
382411
for( ; cpp2::impl::cmp_less_eq(k,dim); k += 1 ) {
383412
{
384413
auto j{1};
385414

386-
#line 166 "cpp2taylor.h2"
415+
#line 183 "cpp2taylor.h2"
387416
for( ; cpp2::impl::cmp_less_eq(j,k); j += 1 ) {
388417
CPP2_ASSERT_IN_BOUNDS(r.v, k - 1) += j * r.get(k - j, r0) * get(j, v0);
389418
}
390419
}
391-
#line 169 "cpp2taylor.h2"
420+
#line 186 "cpp2taylor.h2"
392421
CPP2_ASSERT_IN_BOUNDS(r.v, k - 1) /= CPP2_ASSERT_NOT_ZERO(CPP2_TYPEOF(CPP2_ASSERT_IN_BOUNDS(r.v, k - 1)),k);
393422
}
394423
}
395424

396-
#line 172 "cpp2taylor.h2"
425+
#line 189 "cpp2taylor.h2"
397426
return r;
398427
}
399428

400-
#line 176 "cpp2taylor.h2"
429+
#line 193 "cpp2taylor.h2"
401430
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{
402431
R s0 {std::sin(u0)};
403432
R c0 {std::cos(u0)};
404433
{
405434
auto k{1};
406435

407-
#line 181 "cpp2taylor.h2"
436+
#line 198 "cpp2taylor.h2"
408437
for( ; cpp2::impl::cmp_less_eq(k,dim); k += 1 ) {
409438
{
410439
auto j{1};
411440

412-
#line 183 "cpp2taylor.h2"
441+
#line 200 "cpp2taylor.h2"
413442
for( ; cpp2::impl::cmp_less_eq(j,k); j += 1 ) {
414443
CPP2_ASSERT_IN_BOUNDS(s.v, k - 1) += j * u.get(j, u0) * CPP2_UFCS(get)(c, k - j, c0);
415444
CPP2_ASSERT_IN_BOUNDS(c.v, k - 1) -= j * u.get(j, u0) * CPP2_UFCS(get)(s, k - j, s0);
416445
}
417446
}
418-
#line 187 "cpp2taylor.h2"
447+
#line 204 "cpp2taylor.h2"
419448
CPP2_ASSERT_IN_BOUNDS(s.v, k - 1) /= CPP2_ASSERT_NOT_ZERO(CPP2_TYPEOF(CPP2_ASSERT_IN_BOUNDS(s.v, k - 1)),k);
420449
CPP2_ASSERT_IN_BOUNDS(c.v, k - 1) /= CPP2_ASSERT_NOT_ZERO(CPP2_TYPEOF(CPP2_ASSERT_IN_BOUNDS(c.v, k - 1)),k);
421450
}
422451
}
423-
#line 190 "cpp2taylor.h2"
452+
#line 207 "cpp2taylor.h2"
424453
}
425454

426-
#line 193 "cpp2taylor.h2"
455+
#line 210 "cpp2taylor.h2"
427456
template <typename R, int dim> [[nodiscard]] auto taylor<R,dim>::sin(cpp2::impl::in<R> v0) const& -> taylor{
428457
taylor t {};
429458
taylor r {};
@@ -434,7 +463,7 @@ auto j{1};
434463
return r;
435464
}
436465

437-
#line 203 "cpp2taylor.h2"
466+
#line 220 "cpp2taylor.h2"
438467
template <typename R, int dim> [[nodiscard]] auto taylor<R,dim>::cos(cpp2::impl::in<R> v0) const& -> taylor{
439468
taylor t {};
440469
taylor r {};
@@ -445,18 +474,18 @@ auto j{1};
445474
return r;
446475
}
447476

448-
#line 214 "cpp2taylor.h2"
477+
#line 231 "cpp2taylor.h2"
449478
template<typename R, int order> [[nodiscard]] auto to_string(taylor<R,order> const& o) -> std::string{
450479
std::string r {"("};
451480
{
452481
auto i{1};
453482

454-
#line 217 "cpp2taylor.h2"
483+
#line 234 "cpp2taylor.h2"
455484
for( ; cpp2::impl::cmp_less_eq(i,order); i += 1 ) {
456485
r += " " + cpp2::to_string(CPP2_ASSERT_IN_BOUNDS(o, i)) + "";
457486
}
458487
}
459-
#line 220 "cpp2taylor.h2"
488+
#line 237 "cpp2taylor.h2"
460489
r += " )";
461490

462491
return r;

0 commit comments

Comments
 (0)