conspire/math/
mod.rs

1//! Mathematics library.
2
3#[cfg(test)]
4pub mod test;
5
6/// Special functions.
7pub mod special;
8
9/// Integration and ODEs.
10pub mod integrate;
11
12/// Interpolation schemes.
13pub mod interpolate;
14
15/// Optimization and root finding.
16pub mod optimize;
17
18mod matrix;
19mod tensor;
20
21pub use matrix::{
22    Matrix,
23    square::{Banded, SquareMatrix},
24    vector::Vector,
25};
26pub use tensor::{
27    Hessian, Jacobian, Rank2, Scalar, Solution, Tensor, TensorArray, TensorVec,
28    rank_0::{
29        TensorRank0,
30        list::{TensorRank0List, tensor_rank_0_list},
31    },
32    rank_1::{
33        TensorRank1,
34        list::{TensorRank1List, tensor_rank_1_list},
35        list_2d::{TensorRank1List2D, tensor_rank_1_list_2d},
36        tensor_rank_1,
37        vec::TensorRank1Vec,
38        vec_2d::TensorRank1Vec2D,
39        zero as tensor_rank_1_zero,
40    },
41    rank_2::{
42        IDENTITY, IDENTITY_00, IDENTITY_10, TensorRank2, ZERO, ZERO_10,
43        list::{TensorRank2List, tensor_rank_2_list},
44        list_2d::TensorRank2List2D,
45        tensor_rank_2,
46        vec::TensorRank2Vec,
47        vec_2d::TensorRank2Vec2D,
48    },
49    rank_3::{
50        LEVI_CIVITA, TensorRank3, levi_civita, list::TensorRank3List, list_2d::TensorRank3List2D,
51        list_3d::TensorRank3List3D,
52    },
53    rank_4::{
54        ContractAllIndicesWithFirstIndicesOf, ContractFirstSecondIndicesWithSecondIndicesOf,
55        ContractFirstThirdFourthIndicesWithFirstIndicesOf,
56        ContractSecondFourthIndicesWithFirstIndicesOf, ContractSecondIndexWithFirstIndexOf,
57        ContractThirdFourthIndicesWithFirstSecondIndicesOf, IDENTITY_1010, TensorRank4,
58        list::TensorRank4List,
59    },
60    test::{TestError, assert_eq, assert_eq_within, assert_eq_within_tols},
61};
62
63use std::fmt;
64
65fn write_tensor_rank_0(f: &mut fmt::Formatter, tensor_rank_0: &TensorRank0) -> fmt::Result {
66    let num = if tensor_rank_0.abs() > 1e-1 {
67        (tensor_rank_0 * 1e6).round() / 1e6
68    } else {
69        *tensor_rank_0
70    };
71    let num_abs = num.abs();
72    if num.is_nan() {
73        write!(f, "{num:>11}, ")
74    } else if num == 0.0 || num_abs == 1.0 {
75        let temp_1 = format!("{num:>11.6e}, ").to_string();
76        let mut temp_2 = temp_1.split("e");
77        let a = temp_2.next().unwrap();
78        let b = temp_2.next().unwrap();
79        write!(f, "{a}e+00{b}")
80    } else if num_abs <= 1e-100 {
81        write!(f, "{num:>14.6e}, ")
82    } else if num_abs >= 1e100 {
83        let temp_1 = format!("{num:>13.6e}, ").to_string();
84        let mut temp_2 = temp_1.split("e");
85        let a = temp_2.next().unwrap();
86        let b = temp_2.next().unwrap();
87        write!(f, "{a}e+{b}")
88    } else if num_abs < 1e-9 {
89        let temp_1 = format!("{num:>13.6e}, ").to_string();
90        let mut temp_2 = temp_1.split("e");
91        let a = temp_2.next().unwrap();
92        let b = temp_2.next().unwrap();
93        let mut c = b.split("-");
94        c.next();
95        let e = c.next().unwrap();
96        write!(f, "{a}e-0{e}")
97    } else if num_abs >= 1e10 {
98        let temp_1 = format!("{num:>12.6e}, ").to_string();
99        let mut temp_2 = temp_1.split("e");
100        let a = temp_2.next().unwrap();
101        let b = temp_2.next().unwrap();
102        write!(f, "{a}e+0{b}")
103    } else if num_abs <= 1e0 {
104        let temp_1 = format!("{num:>12.6e}, ").to_string();
105        let mut temp_2 = temp_1.split("e");
106        let a = temp_2.next().unwrap();
107        let b = temp_2.next().unwrap();
108        let mut c = b.split("-");
109        c.next();
110        let e = c.next().unwrap();
111        write!(f, "{a}e-00{e}")
112    } else {
113        let temp_1 = format!("{num:>11.6e}, ").to_string();
114        let mut temp_2 = temp_1.split("e");
115        let a = temp_2.next().unwrap();
116        let b = temp_2.next().unwrap();
117        write!(f, "{a}e+00{b}")
118    }
119}