1use vectra::Array;
2
3fn main() {
4 println!("=== Vectra Multi-dimensional Array Library Demo ===");
5
6 println!("\n1. Array Creation:");
8 let zeros = Array::<f64>::zeros(vec![2, 3]);
9 println!("Zero array (2x3):\n{}", zeros);
10
11 let ones = Array::<i32>::ones(vec![3, 3]);
12 println!("\nOnes array (3x3):\n{}", ones);
13
14 let eye = Array::<i32>::eye(3);
15 println!("\nIdentity matrix (3x3):\n{}", eye);
16
17 println!("\n2. Create array from vector:");
19 let data = vec![1, 2, 3, 4, 5, 6];
20 let arr = Array::from_vec(data, vec![2, 3]).unwrap();
21 println!("Array created from vector (2x3):\n{}", arr);
22
23 println!("\n3. Array operations:");
25 let reshaped = arr.reshape(vec![3, 2]).unwrap();
26 println!("Reshaped to (3x2):\n{}", reshaped);
27
28 let transposed = arr.transpose().unwrap();
29 println!("\nTransposed (3x2):\n{}", transposed);
30
31 println!("\n4. Mathematical operations:");
33 let a = Array::from_vec(vec![1, 2, 3, 4], vec![2, 2]).unwrap();
34 let b = Array::from_vec(vec![5, 6, 7, 8], vec![2, 2]).unwrap();
35
36 println!("Matrix A:\n{}", a);
37 println!("\nMatrix B:\n{}", b);
38
39 let sum = a.clone() + b.clone();
40 println!("\nA + B:\n{}", sum);
41
42 let product = a.clone() * b.clone();
43 println!("\nA * B (element-wise multiplication):\n{}", product);
44
45 let dot_product = a.dot(&b).unwrap();
46 println!("\nA ยท B (matrix multiplication):\n{}", dot_product);
47
48 println!("\n5. Scalar operations:");
50 let scalar_mult = a.mul_scalar(3);
51 println!("A * 3:\n{}", scalar_mult);
52
53 let scalar_add = a.add_scalar(10);
54 println!("\nA + 10:\n{}", scalar_add);
55
56 println!("\n6. Aggregation functions:");
58 println!("Sum of A: {}", a.sum());
59 println!("Mean of A: {}", a.mean_int());
60 println!("Max of A: {:?}", a.max());
61 println!("Min of A: {:?}", a.min());
62
63 println!("\n7. Sum along axis:");
65 let sum_axis0 = a.sum_axis(0).unwrap();
66 println!("Sum along axis 0: {}", sum_axis0);
67
68 let sum_axis1 = a.sum_axis(1).unwrap();
69 println!("Sum along axis 1: {}", sum_axis1);
70
71 println!("\n8. Function mapping:");
73 let squared = a.map(|x| x * x);
74 println!("A squared:\n{}", squared);
75
76 let doubled = a.map(|x| x * 2);
77 println!("\nA doubled:\n{}", doubled);
78
79 println!("\n9. Index access:");
81 println!("A[0, 0] = {}", a[[0, 0]]);
82 println!("A[1, 1] = {}", a[[1, 1]]);
83
84 println!("\n10. Large array example:");
86 let large_data: Vec<f64> = (1..=20).map(|x| x as f64).collect();
87 let large_arr = Array::from_vec(large_data, vec![4, 5]).unwrap();
88 println!("4x5 array:\n{}", large_arr);
89
90 let large_sum = large_arr.sum();
91 println!("\nSum of large array: {}", large_sum);
92 println!("Mean of large array: {:.2}", large_arr.mean());
93
94 println!("\n11. Random number generation:");
96
97 let random_arr = Array::<f64>::random(vec![2, 3]);
99 println!("Random array (0-1):\n{}", random_arr);
100
101 let randint_arr = Array::<i32>::randint(vec![2, 3], 1, 10);
103 println!("\nRandom integer array (1-9):\n{}", randint_arr);
104
105 let randn_arr = Array::<f64>::randn(vec![2, 2]);
107 println!("\nNormal distribution random array:\n{}", randn_arr);
108
109 let uniform_arr = Array::<f64>::uniform(vec![2, 2], -2.0, 2.0);
111 println!("\nUniform distribution random array (-2.0 to 2.0):\n{}", uniform_arr);
112
113 println!("\nRandom array statistics:");
115 println!("Random array mean: {:.4}", random_arr.mean());
116 println!("Random array max: {:.4}", random_arr.max().unwrap());
117 println!("Random array min: {:.4}", random_arr.min().unwrap());
118
119 println!("\n12. Broadcasting examples:");
121
122 let matrix = Array::from_vec(vec![1, 2, 3, 4], vec![2, 2]).unwrap();
124 let scalar = Array::from_vec(vec![10], vec![1, 1]).unwrap();
125 let broadcast_result1 = matrix.clone() + scalar.clone();
126 println!("Matrix (2x2):\n{}", matrix);
127 println!("Scalar-like (1x1):\n{}", scalar);
128 println!("Matrix + Scalar:\n{}", broadcast_result1);
129
130 let vector = Array::from_vec(vec![1, 2], vec![2]).unwrap();
132 let column = Array::from_vec(vec![10, 20], vec![2, 1]).unwrap();
133 let broadcast_result2 = vector.clone() + column.clone();
134 println!("\nVector (2,):\n{}", vector);
135 println!("Column (2x1):\n{}", column);
136 println!("Vector + Column:\n{}", broadcast_result2);
137
138 let row = Array::from_vec(vec![2, 3], vec![1, 2]).unwrap();
140 let col = Array::from_vec(vec![4, 5, 6], vec![3, 1]).unwrap();
141 let broadcast_result3 = row.clone() * col.clone();
142 println!("\nRow (1x2):\n{}", row);
143 println!("Column (3x1):\n{}", col);
144 println!("Row * Column:\n{}", broadcast_result3);
145
146 println!("\n13. Trigonometric functions:");
148
149 use std::f64::consts::PI;
150 let angles = Array::from_vec(vec![0.0, PI/6.0, PI/4.0, PI/3.0, PI/2.0], vec![5]).unwrap();
151 println!("Angles (radians):\n{}", angles);
152
153 let sin_values = angles.sin();
154 let cos_values = angles.cos();
155 let tan_values = angles.tan();
156
157 println!("\nSine values:\n{}", sin_values);
158 println!("Cosine values:\n{}", cos_values);
159 println!("Tangent values:\n{}", tan_values);
160
161 let values = Array::from_vec(vec![0.0, 0.5, 0.866, 1.0], vec![4]).unwrap();
163 let asin_values = values.asin();
164 let acos_values = values.acos();
165
166 println!("\nValues for inverse functions:\n{}", values);
167 println!("Arcsine values:\n{}", asin_values);
168 println!("Arccosine values:\n{}", acos_values);
169
170 let hyp_values = Array::from_vec(vec![0.0, 1.0, 2.0], vec![3]).unwrap();
172 let sinh_values = hyp_values.sinh();
173 let cosh_values = hyp_values.cosh();
174 let tanh_values = hyp_values.tanh();
175
176 println!("\nHyperbolic functions for [0, 1, 2]:");
177 println!("Sinh values:\n{}", sinh_values);
178 println!("Cosh values:\n{}", cosh_values);
179 println!("Tanh values:\n{}", tanh_values);
180
181 let degrees = Array::from_vec(vec![0.0, 30.0, 45.0, 60.0, 90.0], vec![5]).unwrap();
183 let radians_converted = degrees.to_radians();
184 let back_to_degrees = radians_converted.to_degrees();
185
186 println!("\nAngle conversion:");
187 println!("Degrees:\n{}", degrees);
188 println!("Converted to radians:\n{}", radians_converted);
189 println!("Back to degrees:\n{}", back_to_degrees);
190
191 println!("\n14. Logarithmic and exponential functions:");
193
194 let exp_values = Array::from_vec(vec![0.0, 1.0, 2.0, 3.0], vec![4]).unwrap();
196 println!("Values for exp/ln:");
197 println!("{}", exp_values);
198
199 let exp_results = exp_values.exp();
200 println!("Exponential (e^x):");
201 println!("{}", exp_results);
202
203 let ln_results = exp_results.ln();
204 println!("Natural log (should match original):");
205 println!("{}", ln_results);
206
207 let powers_of_10 = Array::from_vec(vec![1.0, 10.0, 100.0, 1000.0], vec![4]).unwrap();
209 println!("\nPowers of 10:");
210 println!("{}", powers_of_10);
211
212 let log10_results = powers_of_10.log10();
213 println!("Base-10 logarithm:");
214 println!("{}", log10_results);
215
216 let powers_of_2 = Array::from_vec(vec![1.0, 2.0, 4.0, 8.0, 16.0], vec![5]).unwrap();
217 println!("\nPowers of 2:");
218 println!("{}", powers_of_2);
219
220 let log2_results = powers_of_2.log2();
221 println!("Base-2 logarithm:");
222 println!("{}", log2_results);
223
224 let exp2_results = log2_results.exp2();
225 println!("2^x (should match original):");
226 println!("{}", exp2_results);
227
228 let base_3_values = Array::from_vec(vec![1.0, 3.0, 9.0, 27.0], vec![4]).unwrap();
230 println!("\nPowers of 3:");
231 println!("{}", base_3_values);
232
233 let log3_results = base_3_values.log(3.0);
234 println!("Base-3 logarithm:");
235 println!("{}", log3_results);
236
237 let small_values = Array::from_vec(vec![0.0, 0.01, 0.1, 0.5], vec![4]).unwrap();
239 println!("\nSmall values:");
240 println!("{}", small_values);
241
242 let exp_m1_results = small_values.exp_m1();
243 println!("exp(x) - 1 (more accurate for small x):");
244 println!("{}", exp_m1_results);
245
246 let ln_1p_results = small_values.ln_1p();
247 println!("ln(1 + x) (more accurate for small x):");
248 println!("{}", ln_1p_results);
249
250 println!("\n=== Demo Complete ===");
251}