conspire 0.7.7

The Rust interface to conspire.
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
macro_rules! test_explicit_variable_step {
    ($integration: expr) => {
        $crate::math::integrate::ode::explicit::variable_step::test::test_explicit_variable_step!(
            $integration,
            $crate::math::assert::Assert::default()
        );
    };
    ($integration: expr, $eval_times_assert: expr) => {
        use crate::math::{
            Tensor, TensorArray, TensorRank1, TensorRank1Vec, TensorRank2, TensorTuple,
            TensorTupleVec,
            integrate::{
                ode::explicit::test::test_explicit,
                test::{LENGTH, zero_to_one},
            },
        };
        test_explicit!($integration);
        #[test]
        fn dxdt_eq_neg_x() -> Result<(), AssertionError> {
            let (time, solution, function): (
                Times,
                TensorVector<Quantity>,
                TensorVector<Quantity<Rate>>,
            ) = $integration.integrate(
                |_: Quantity<Time>, x: &Quantity| Ok(x * -RATE),
                &[Quantity::new(0.0), Quantity::new(0.8)],
                Quantity::new(1.0),
            )?;
            time.iter()
                .zip(solution.iter().zip(function.iter()))
                .try_for_each(|(t, (y, f))| {
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(y, &(-(*t * RATE)).exp())?;
                    $crate::math::assert::Assert::default().eq_within_tols(f, &(y * -RATE))
                })
        }
        #[test]
        fn dxdt_eq_2xt() -> Result<(), AssertionError> {
            let (time, solution, function): (
                Times,
                TensorVector<Quantity>,
                TensorVector<Quantity<Rate>>,
            ) = $integration.integrate(
                |t: Quantity<Time>, x: &Quantity| Ok(x * RATE * (t * RATE) * 2.0),
                &[Quantity::new(0.0), Quantity::new(1.0)],
                Quantity::new(1.0),
            )?;
            time.iter()
                .zip(solution.iter().zip(function.iter()))
                .try_for_each(|(t, (y, f))| {
                    let t = (*t * RATE).value();
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(y, &Quantity::new(t.powi(2).exp()))?;
                    $crate::math::assert::Assert::default().eq_within_tols(f, &(y * RATE * t * 2.0))
                })
        }
        #[test]
        fn dxdt_eq_cos_t() -> Result<(), AssertionError> {
            let (time, solution, function): (
                Times,
                TensorVector<Quantity>,
                TensorVector<Quantity<Rate>>,
            ) = $integration.integrate(
                |t: Quantity<Time>, _: &Quantity| Ok(RATE * (t * RATE).cos().value()),
                &[Quantity::new(0.0), Quantity::new(1.0)],
                Quantity::new(0.0),
            )?;
            time.iter()
                .zip(solution.iter().zip(function.iter()))
                .try_for_each(|(t, (y, f))| {
                    let t = (*t * RATE).value();
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(y, &Quantity::new(t.sin()))?;
                    $crate::math::assert::Assert::default().eq_within_tols(f, &(RATE * t.cos()))
                })
        }
        #[test]
        fn dxdt_eq_ix() -> Result<(), AssertionError> {
            let a =
                TensorRank2::<3, $crate::math::Current, $crate::math::Current, Rate>::identity();
            let (time, solution, function): (
                Times,
                TensorRank1Vec<3, $crate::math::Current>,
                TensorRank1Vec<3, $crate::math::Current, Rate>,
            ) = $integration.integrate(
                |_: Quantity<Time>, x: &TensorRank1<3, $crate::math::Current>| Ok(&a * x),
                &[Quantity::new(0.0), Quantity::new(1.0)],
                TensorRank1::from([1.0, 1.0, 1.0]),
            )?;
            time.iter()
                .zip(solution.iter().zip(function.iter()))
                .try_for_each(|(t, (y, f))| {
                    let t = (*t * RATE).value();
                    y.iter().zip(f.iter()).try_for_each(|(y_n, f_n)| {
                        $crate::math::assert::Assert::default()
                            .eq_within_tols(y_n, &Quantity::new(t.exp()))?;
                        $crate::math::assert::Assert::default().eq_within_tols(f_n, &(*y_n * RATE))
                    })
                })
        }
        #[test]
        fn eval_times() -> Result<(), AssertionError> {
            let (time, solution, function): (
                Times,
                TensorVector<Quantity>,
                TensorVector<Quantity<Rate>>,
            ) = $integration.integrate(
                |t: Quantity<Time>, _: &Quantity| Ok(RATE * (t * RATE).cos().value()),
                &zero_to_one::<LENGTH>(),
                Quantity::new(0.0),
            )?;
            let eval_times_assert = $eval_times_assert;
            time.iter()
                .zip(solution.iter().zip(function.iter()))
                .try_for_each(|(t, (y, f))| {
                    let t = (*t * RATE).value();
                    eval_times_assert.eq_within_tols(y, &Quantity::new(t.sin()))?;
                    eval_times_assert.eq_within_tols(f, &(RATE * t.cos()))
                })
        }
        #[test]
        fn second_order_tensor_rank_0() -> Result<(), AssertionError> {
            let (time, solution, function): (
                Times,
                TensorRank1Vec<2, $crate::math::Current>,
                TensorRank1Vec<2, $crate::math::Current, Rate>,
            ) = $integration.integrate(
                |t: Quantity<Time>, y: &TensorRank1<2, $crate::math::Current>| {
                    let t = (t * RATE).value();
                    Ok(TensorRank1::from([y[1] * RATE, Quantity::new(-t.sin())]))
                },
                &[Quantity::new(0.0), Quantity::new(6.0)],
                TensorRank1::from([0.0, 1.0]),
            )?;
            time.iter()
                .zip(solution.iter().zip(function.iter()))
                .try_for_each(|(t, (y, f))| {
                    let t = (*t * RATE).value();
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&y[0], &Quantity::new(t.sin()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&f[0], &Quantity::new(t.cos()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&y[1], &Quantity::new(t.cos()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&f[1], &Quantity::new(-t.sin()))
                })
        }
        #[test]
        fn third_order_tensor_rank_0() -> Result<(), AssertionError> {
            let (time, solution, function): (
                Times,
                TensorRank1Vec<3, $crate::math::Current>,
                TensorRank1Vec<3, $crate::math::Current, Rate>,
            ) = $integration.integrate(
                |t: Quantity<Time>, y: &TensorRank1<3, $crate::math::Current>| {
                    let t = (t * RATE).value();
                    Ok(TensorRank1::from([
                        y[1] * RATE,
                        y[2] * RATE,
                        Quantity::new(-t.cos()),
                    ]))
                },
                &[Quantity::new(0.0), Quantity::new(1.0)],
                TensorRank1::from([0.0, 1.0, 0.0]),
            )?;
            time.iter()
                .zip(solution.iter().zip(function.iter()))
                .try_for_each(|(t, (y, f))| {
                    let t = (*t * RATE).value();
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&y[0], &Quantity::new(t.sin()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&f[0], &Quantity::new(t.cos()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&y[1], &Quantity::new(t.cos()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&f[1], &Quantity::new(-t.sin()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&y[2], &Quantity::new(-t.sin()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&f[2], &Quantity::new(-t.cos()))
                })
        }
        #[test]
        fn fourth_order_tensor_rank_0() -> Result<(), AssertionError> {
            let (time, solution, function): (
                Times,
                TensorRank1Vec<4, $crate::math::Current>,
                TensorRank1Vec<4, $crate::math::Current, Rate>,
            ) = $integration.integrate(
                |t: Quantity<Time>, y: &TensorRank1<4, $crate::math::Current>| {
                    let t = (t * RATE).value();
                    Ok(TensorRank1::from([
                        y[1] * RATE,
                        y[2] * RATE,
                        y[3] * RATE,
                        Quantity::new(t.sin()),
                    ]))
                },
                &[Quantity::new(0.0), Quantity::new(0.6)],
                TensorRank1::from([0.0, 1.0, 0.0, -1.0]),
            )?;
            time.iter()
                .zip(solution.iter().zip(function.iter()))
                .try_for_each(|(t, (y, f))| {
                    let t = (*t * RATE).value();
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&y[0], &Quantity::new(t.sin()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&f[0], &Quantity::new(t.cos()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&y[1], &Quantity::new(t.cos()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&f[1], &Quantity::new(-t.sin()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&y[2], &Quantity::new(-t.sin()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&f[2], &Quantity::new(-t.cos()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&y[3], &Quantity::new(-t.cos()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&f[3], &Quantity::new(t.sin()))
                })
        }
        #[test]
        fn flat() -> Result<(), AssertionError> {
            let (time, solution, function): (
                Times,
                TensorRank1Vec<5, $crate::math::Current>,
                TensorRank1Vec<5, $crate::math::Current, Rate>,
            ) = $integration.integrate(
                |t: Quantity<Time>, y: &TensorRank1<5, $crate::math::Current>| {
                    let t = (t * RATE).value();
                    Ok(TensorRank1::from([
                        y[1] * RATE,
                        Quantity::new(-t.sin()),
                        y[3] * RATE,
                        y[4] * RATE,
                        Quantity::new(-t.cos()),
                    ]))
                },
                &[Quantity::new(0.0), Quantity::new(1.0)],
                TensorRank1::from([0.0, 1.0, 0.0, 1.0, 0.0]),
            )?;
            time.iter()
                .zip(solution.iter().zip(function.iter()))
                .try_for_each(|(t, (y, f))| {
                    let t = (*t * RATE).value();
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&y[0], &Quantity::new(t.sin()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&f[0], &Quantity::new(t.cos()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&y[1], &Quantity::new(t.cos()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&f[1], &Quantity::new(-t.sin()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&y[2], &Quantity::new(t.sin()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&f[2], &Quantity::new(t.cos()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&y[3], &Quantity::new(t.cos()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&f[3], &Quantity::new(-t.sin()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&y[4], &Quantity::new(-t.sin()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&f[4], &Quantity::new(-t.cos()))
                })
        }
        #[test]
        fn tuple() -> Result<(), AssertionError> {
            let (time, solution, function): (
                Times,
                TensorTupleVec<
                    TensorRank1<2, $crate::math::Current>,
                    TensorRank1<3, $crate::math::Current>,
                >,
                TensorTupleVec<
                    TensorRank1<2, $crate::math::Current, Rate>,
                    TensorRank1<3, $crate::math::Current, Rate>,
                >,
            ) = $integration.integrate(
                |t: Quantity<Time>,
                 y: &TensorTuple<
                    TensorRank1<2, $crate::math::Current>,
                    TensorRank1<3, $crate::math::Current>,
                >| {
                    let t = (t * RATE).value();
                    let (y_1, y_2) = y.into();
                    Ok(TensorTuple::from((
                        TensorRank1::from([y_1[1] * RATE, Quantity::new(-t.sin())]),
                        TensorRank1::from([y_2[1] * RATE, y_2[2] * RATE, Quantity::new(-t.cos())]),
                    )))
                },
                &[Quantity::new(0.0), Quantity::new(1.0)],
                TensorTuple::from((
                    TensorRank1::from([0.0, 1.0]),
                    TensorRank1::from([0.0, 1.0, 0.0]),
                )),
            )?;
            time.iter()
                .zip(solution.iter().zip(function.iter()))
                .try_for_each(|(t, (y, f))| {
                    let t = (*t * RATE).value();
                    let (y_1, y_2) = y.into();
                    let (f_1, f_2) = f.into();
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&y_1[0], &Quantity::new(t.sin()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&f_1[0], &Quantity::new(t.cos()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&y_1[1], &Quantity::new(t.cos()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&f_1[1], &Quantity::new(-t.sin()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&y_2[0], &Quantity::new(t.sin()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&f_2[0], &Quantity::new(t.cos()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&y_2[1], &Quantity::new(t.cos()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&f_2[1], &Quantity::new(-t.sin()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&y_2[2], &Quantity::new(-t.sin()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&f_2[2], &Quantity::new(-t.cos()))
                })
        }
        #[test]
        fn tuple_nested() -> Result<(), AssertionError> {
            let (time, solution, function): (
                Times,
                TensorTupleVec<
                    TensorRank1<2, $crate::math::Current>,
                    TensorTuple<
                        TensorRank1<3, $crate::math::Current>,
                        TensorRank1<4, $crate::math::Current>,
                    >,
                >,
                TensorTupleVec<
                    TensorRank1<2, $crate::math::Current, Rate>,
                    TensorTuple<
                        TensorRank1<3, $crate::math::Current, Rate>,
                        TensorRank1<4, $crate::math::Current, Rate>,
                    >,
                >,
            ) = $integration.integrate(
                |t: Quantity<Time>,
                 y: &TensorTuple<
                    TensorRank1<2, $crate::math::Current>,
                    TensorTuple<
                        TensorRank1<3, $crate::math::Current>,
                        TensorRank1<4, $crate::math::Current>,
                    >,
                >| {
                    let t = (t * RATE).value();
                    let (y_1, y_23) = y.into();
                    let (y_2, y_3) = y_23.into();
                    Ok(TensorTuple::from((
                        TensorRank1::from([y_1[1] * RATE, Quantity::new(-t.sin())]),
                        TensorTuple::from((
                            TensorRank1::from([
                                y_2[1] * RATE,
                                y_2[2] * RATE,
                                Quantity::new(-t.cos()),
                            ]),
                            TensorRank1::from([
                                y_3[1] * RATE,
                                y_3[2] * RATE,
                                y_3[3] * RATE,
                                Quantity::new(t.sin()),
                            ]),
                        )),
                    )))
                },
                &[Quantity::new(0.0), Quantity::new(0.6)],
                TensorTuple::from((
                    TensorRank1::from([0.0, 1.0]),
                    TensorTuple::from((
                        TensorRank1::from([0.0, 1.0, 0.0]),
                        TensorRank1::from([0.0, 1.0, 0.0, -1.0]),
                    )),
                )),
            )?;
            time.iter()
                .zip(solution.iter().zip(function.iter()))
                .try_for_each(|(t, (y, f))| {
                    let t = (*t * RATE).value();
                    let (y_1, y_23) = y.into();
                    let (y_2, y_3) = y_23.into();
                    let (f_1, f_23) = f.into();
                    let (f_2, f_3) = f_23.into();
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&y_1[0], &Quantity::new(t.sin()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&f_1[0], &Quantity::new(t.cos()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&y_1[1], &Quantity::new(t.cos()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&f_1[1], &Quantity::new(-t.sin()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&y_2[0], &Quantity::new(t.sin()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&f_2[0], &Quantity::new(t.cos()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&y_2[1], &Quantity::new(t.cos()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&f_2[1], &Quantity::new(-t.sin()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&y_2[2], &Quantity::new(-t.sin()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&f_2[2], &Quantity::new(-t.cos()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&y_3[0], &Quantity::new(t.sin()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&f_3[0], &Quantity::new(t.cos()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&y_3[1], &Quantity::new(t.cos()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&f_3[1], &Quantity::new(-t.sin()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&y_3[2], &Quantity::new(-t.sin()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&f_3[2], &Quantity::new(-t.cos()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&y_3[3], &Quantity::new(-t.cos()))?;
                    $crate::math::assert::Assert::default()
                        .eq_within_tols(&f_3[3], &Quantity::new(t.sin()))
                })
        }
    };
}
pub(crate) use test_explicit_variable_step;