Skip to main content

conspire/math/
mod.rs

1//! Mathematical methods.
2
3/// Assertion helpers for comparing values.
4pub mod assert;
5
6/// Integration, ODEs, and DAEs.
7pub mod integrate;
8
9/// Interpolation schemes.
10pub mod interpolate;
11
12/// Optimization and root finding.
13pub mod optimize;
14
15/// Random number generation.
16pub mod random;
17
18/// Sparse data types.
19pub mod sparse;
20
21/// Special functions.
22pub mod special;
23
24mod graph;
25mod hash;
26mod matrix;
27mod set;
28mod simd;
29mod style;
30mod tensor;
31
32pub(crate) use style::{Style, StyledError, defeat_message, styled_error};
33
34pub use graph::Graph;
35pub use hash::{FxHashMap, FxHashSet, FxHasher};
36pub use matrix::{
37    Matrix,
38    square::{LdlDecomposition, LuDecomposition, SquareMatrix},
39    vector::Vector,
40};
41pub use set::{Set, sets::Sets};
42pub use tensor::{
43    Auxiliary, Configuration, ContractWith, Current, Derivative, Differentiable, Erase, Factor,
44    Flattened, Hessian, HessianAccumulate, HessianBlock, Intermediate, Is, Jacobian, Norm,
45    Projection, Quantity, Rank2, Reference, Scalar, ScalarList, ScalarListVec, Scalars, Solution,
46    Square, Tensor, TensorArray, TensorError, TensorVec, Transposed,
47    list::TensorList,
48    quantity::{
49        sparse_vec::QuantitySparseVec, sparse_vec_2d::QuantitySparseVec2D, vec::QuantityVector,
50    },
51    rank_0::{TensorRank0, list::TensorRank0List, list_2d::TensorRank0List2D},
52    rank_1::{
53        TensorRank1, cross::CrossProduct, list::TensorRank1List, list_2d::TensorRank1List2D,
54        vec::TensorRank1Vec, vec_2d::TensorRank1Vec2D, zero as tensor_rank_1_zero,
55    },
56    rank_2::{
57        IDENTITY, IDENTITY_00, IDENTITY_10, IDENTITY_22, Spectrum, TensorRank2, ZERO, ZERO_10,
58        list::{TensorRank2List, vec::TensorRank2ListVec},
59        list_2d::TensorRank2List2D,
60        sparse_symmetric_vec_2d::TensorRank2SparseVec2DSymmetric,
61        sparse_vec::TensorRank2SparseVec,
62        sparse_vec_2d::TensorRank2SparseVec2D,
63        vec::TensorRank2Vec,
64        vec_2d::TensorRank2Vec2D,
65    },
66    rank_3::{LEVI_CIVITA, TensorRank3, levi_civita},
67    rank_4::{
68        ContractAllWithFirst, ContractFirstSecondWithSecond, ContractFirstThirdFourthWithFirst,
69        ContractSecondFourthWithFirst, ContractSecondWithFirst, ContractThirdFourthWithFirstSecond,
70        ContractThirdWithFirst, IDENTITY_1010, TensorRank4, list::TensorRank4List,
71        vec::TensorRank4Vec,
72    },
73    tuple::{
74        TensorTuple,
75        list::{TensorTupleList, vec::TensorTupleListVec, vec_2d::TensorTupleListVec2D},
76        vec::TensorTupleVec,
77    },
78    vec::{TensorRank1RefVec, TensorVector},
79};
80
81use std::fmt;
82
83fn write_tensor_rank_0(f: &mut fmt::Formatter, tensor_rank_0: &TensorRank0) -> fmt::Result {
84    let num = if tensor_rank_0.abs() > 1e-1 {
85        (tensor_rank_0 * 1e6).round() / 1e6
86    } else {
87        *tensor_rank_0
88    };
89    let num_abs = num.abs();
90    if num.is_nan() {
91        write!(f, "{num:>11}, ")
92    } else if num == 0.0 || num_abs == 1.0 {
93        let temp_1 = format!("{num:>11.6e}, ").to_string();
94        let mut temp_2 = temp_1.split("e");
95        let a = temp_2.next().unwrap();
96        let b = temp_2.next().unwrap();
97        write!(f, "{a}e+00{b}")
98    } else if num_abs <= 1e-100 {
99        write!(f, "{num:>14.6e}, ")
100    } else if num_abs >= 1e100 {
101        let temp_1 = format!("{num:>13.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+{b}")
106    } else if num_abs < 1e-9 {
107        let temp_1 = format!("{num:>13.6e}, ").to_string();
108        let mut temp_2 = temp_1.split("e");
109        let a = temp_2.next().unwrap();
110        let b = temp_2.next().unwrap();
111        let mut c = b.split("-");
112        c.next();
113        let e = c.next().unwrap();
114        write!(f, "{a}e-0{e}")
115    } else if num_abs >= 1e10 {
116        let temp_1 = format!("{num:>12.6e}, ").to_string();
117        let mut temp_2 = temp_1.split("e");
118        let a = temp_2.next().unwrap();
119        let b = temp_2.next().unwrap();
120        write!(f, "{a}e+0{b}")
121    } else if num_abs <= 1e0 {
122        let temp_1 = format!("{num:>12.6e}, ").to_string();
123        let mut temp_2 = temp_1.split("e");
124        let a = temp_2.next().unwrap();
125        let b = temp_2.next().unwrap();
126        let mut c = b.split("-");
127        c.next();
128        let e = c.next().unwrap();
129        write!(f, "{a}e-00{e}")
130    } else {
131        let temp_1 = format!("{num:>11.6e}, ").to_string();
132        let mut temp_2 = temp_1.split("e");
133        let a = temp_2.next().unwrap();
134        let b = temp_2.next().unwrap();
135        write!(f, "{a}e+00{b}")
136    }
137}