1pub mod assert;
5
6pub mod integrate;
8
9pub mod interpolate;
11
12pub mod optimize;
14
15pub mod random;
17
18pub mod sparse;
20
21pub 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}