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    list::TensorList,
29    rank_0::{TensorRank0, list::TensorRank0List},
30    rank_1::{
31        TensorRank1, list::TensorRank1List, list_2d::TensorRank1List2D, tensor_rank_1,
32        vec::TensorRank1Vec, vec_2d::TensorRank1Vec2D, zero as tensor_rank_1_zero,
33    },
34    rank_2::{
35        IDENTITY, IDENTITY_00, IDENTITY_10, TensorRank2, ZERO, ZERO_10, list::TensorRank2List,
36        list_2d::TensorRank2List2D, tensor_rank_2, vec::TensorRank2Vec, vec_2d::TensorRank2Vec2D,
37    },
38    rank_3::{LEVI_CIVITA, TensorRank3, levi_civita},
39    rank_4::{
40        ContractAllIndicesWithFirstIndicesOf, ContractFirstSecondIndicesWithSecondIndicesOf,
41        ContractFirstThirdFourthIndicesWithFirstIndicesOf,
42        ContractSecondFourthIndicesWithFirstIndicesOf, ContractSecondIndexWithFirstIndexOf,
43        ContractThirdFourthIndicesWithFirstSecondIndicesOf, IDENTITY_1010, TensorRank4,
44        list::TensorRank4List,
45    },
46    test::{TestError, assert_eq, assert_eq_within, assert_eq_within_tols},
47    tuple::{TensorTuple, TensorTupleVec},
48    vec::TensorVector,
49};
50
51use std::fmt;
52
53fn write_tensor_rank_0(f: &mut fmt::Formatter, tensor_rank_0: &TensorRank0) -> fmt::Result {
54    let num = if tensor_rank_0.abs() > 1e-1 {
55        (tensor_rank_0 * 1e6).round() / 1e6
56    } else {
57        *tensor_rank_0
58    };
59    let num_abs = num.abs();
60    if num.is_nan() {
61        write!(f, "{num:>11}, ")
62    } else if num == 0.0 || num_abs == 1.0 {
63        let temp_1 = format!("{num:>11.6e}, ").to_string();
64        let mut temp_2 = temp_1.split("e");
65        let a = temp_2.next().unwrap();
66        let b = temp_2.next().unwrap();
67        write!(f, "{a}e+00{b}")
68    } else if num_abs <= 1e-100 {
69        write!(f, "{num:>14.6e}, ")
70    } else if num_abs >= 1e100 {
71        let temp_1 = format!("{num:>13.6e}, ").to_string();
72        let mut temp_2 = temp_1.split("e");
73        let a = temp_2.next().unwrap();
74        let b = temp_2.next().unwrap();
75        write!(f, "{a}e+{b}")
76    } else if num_abs < 1e-9 {
77        let temp_1 = format!("{num:>13.6e}, ").to_string();
78        let mut temp_2 = temp_1.split("e");
79        let a = temp_2.next().unwrap();
80        let b = temp_2.next().unwrap();
81        let mut c = b.split("-");
82        c.next();
83        let e = c.next().unwrap();
84        write!(f, "{a}e-0{e}")
85    } else if num_abs >= 1e10 {
86        let temp_1 = format!("{num:>12.6e}, ").to_string();
87        let mut temp_2 = temp_1.split("e");
88        let a = temp_2.next().unwrap();
89        let b = temp_2.next().unwrap();
90        write!(f, "{a}e+0{b}")
91    } else if num_abs <= 1e0 {
92        let temp_1 = format!("{num:>12.6e}, ").to_string();
93        let mut temp_2 = temp_1.split("e");
94        let a = temp_2.next().unwrap();
95        let b = temp_2.next().unwrap();
96        let mut c = b.split("-");
97        c.next();
98        let e = c.next().unwrap();
99        write!(f, "{a}e-00{e}")
100    } else {
101        let temp_1 = format!("{num:>11.6e}, ").to_string();
102        let mut temp_2 = temp_1.split("e");
103        let a = temp_2.next().unwrap();
104        let b = temp_2.next().unwrap();
105        write!(f, "{a}e+00{b}")
106    }
107}