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