1#[cfg(test)]
4pub mod test;
5
6pub mod special;
8
9pub mod integrate;
11
12pub mod interpolate;
14
15pub mod optimize;
17
18mod matrix;
19mod random;
20mod set;
21mod tensor;
22
23pub use matrix::{
24 Matrix,
25 square::{Banded, SquareMatrix},
26 vector::Vector,
27};
28pub use random::{
29 random_normal, random_normal_standard, random_u8, random_u64, random_uniform, random_x2_normal,
30};
31pub use set::{
32 dsu::disjoint_set_union,
33 sets::{InverseSets, Sets},
34};
35pub use tensor::{
36 Hessian, Jacobian, Rank2, Scalar, ScalarList, ScalarListVec, Scalars, Solution, Tensor,
37 TensorArray, TensorError, TensorVec,
38 list::TensorList,
39 rank_0::{TensorRank0, list::TensorRank0List, list_2d::TensorRank0List2D},
40 rank_1::{
41 TensorRank1, list::TensorRank1List, list_2d::TensorRank1List2D, vec::TensorRank1Vec,
42 vec_2d::TensorRank1Vec2D, zero as tensor_rank_1_zero,
43 },
44 rank_2::{
45 IDENTITY, IDENTITY_00, IDENTITY_10, IDENTITY_22, TensorRank2, ZERO, ZERO_10,
46 list::{TensorRank2List, vec::TensorRank2ListVec},
47 list_2d::TensorRank2List2D,
48 vec::TensorRank2Vec,
49 vec_2d::TensorRank2Vec2D,
50 },
51 rank_3::{LEVI_CIVITA, TensorRank3, levi_civita},
52 rank_4::{
53 ContractAllIndicesWithFirstIndicesOf, ContractFirstSecondIndicesWithSecondIndicesOf,
54 ContractFirstThirdFourthIndicesWithFirstIndicesOf,
55 ContractSecondFourthIndicesWithFirstIndicesOf, ContractSecondIndexWithFirstIndexOf,
56 ContractThirdFourthIndicesWithFirstSecondIndicesOf, ContractThirdIndexWithFirstIndexOf,
57 IDENTITY_1010, TensorRank4, list::TensorRank4List, vec::TensorRank4Vec,
58 },
59 test::{TestError, assert_eq, assert_eq_within, assert_eq_within_tols},
60 tuple::{
61 TensorTuple,
62 list::{TensorTupleList, vec::TensorTupleListVec, vec_2d::TensorTupleListVec2D},
63 vec::TensorTupleVec,
64 },
65 vec::{TensorRank1RefVec, TensorVector},
66};
67
68use std::fmt;
69
70fn write_tensor_rank_0(f: &mut fmt::Formatter, tensor_rank_0: &TensorRank0) -> fmt::Result {
71 let num = if tensor_rank_0.abs() > 1e-1 {
72 (tensor_rank_0 * 1e6).round() / 1e6
73 } else {
74 *tensor_rank_0
75 };
76 let num_abs = num.abs();
77 if num.is_nan() {
78 write!(f, "{num:>11}, ")
79 } else if num == 0.0 || num_abs == 1.0 {
80 let temp_1 = format!("{num:>11.6e}, ").to_string();
81 let mut temp_2 = temp_1.split("e");
82 let a = temp_2.next().unwrap();
83 let b = temp_2.next().unwrap();
84 write!(f, "{a}e+00{b}")
85 } else if num_abs <= 1e-100 {
86 write!(f, "{num:>14.6e}, ")
87 } else if num_abs >= 1e100 {
88 let temp_1 = format!("{num:>13.6e}, ").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 write!(f, "{a}e+{b}")
93 } else if num_abs < 1e-9 {
94 let temp_1 = format!("{num:>13.6e}, ").to_string();
95 let mut temp_2 = temp_1.split("e");
96 let a = temp_2.next().unwrap();
97 let b = temp_2.next().unwrap();
98 let mut c = b.split("-");
99 c.next();
100 let e = c.next().unwrap();
101 write!(f, "{a}e-0{e}")
102 } else if num_abs >= 1e10 {
103 let temp_1 = format!("{num:>12.6e}, ").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 write!(f, "{a}e+0{b}")
108 } else if num_abs <= 1e0 {
109 let temp_1 = format!("{num:>12.6e}, ").to_string();
110 let mut temp_2 = temp_1.split("e");
111 let a = temp_2.next().unwrap();
112 let b = temp_2.next().unwrap();
113 let mut c = b.split("-");
114 c.next();
115 let e = c.next().unwrap();
116 write!(f, "{a}e-00{e}")
117 } else {
118 let temp_1 = format!("{num:>11.6e}, ").to_string();
119 let mut temp_2 = temp_1.split("e");
120 let a = temp_2.next().unwrap();
121 let b = temp_2.next().unwrap();
122 write!(f, "{a}e+00{b}")
123 }
124}