demo/
demo.rs

1use vectra::Array;
2
3fn main() {
4    println!("=== Vectra Multi-dimensional Array Library Demo ===");
5    
6    // 1. Array Creation
7    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    // 2. Create array from vector
18    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    // 3. Array operations
24    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    // 4. Mathematical operations
32    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    // 5. Scalar operations
49    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    // 6. Aggregation functions
57    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    // 7. Sum along axis
64    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    // 8. Function mapping
72    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    // 9. Index access
80    println!("\n9. Index access:");
81    println!("A[0, 0] = {}", a[[0, 0]]);
82    println!("A[1, 1] = {}", a[[1, 1]]);
83    
84    // 10. Large array example
85    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    // 11. Random number generation
95    println!("\n11. Random number generation:");
96    
97    // Generate random numbers between 0-1
98    let random_arr = Array::<f64>::random(vec![2, 3]);
99    println!("Random array (0-1):\n{}", random_arr);
100    
101    // Generate random integers in specified range
102    let randint_arr = Array::<i32>::randint(vec![2, 3], 1, 10);
103    println!("\nRandom integer array (1-9):\n{}", randint_arr);
104    
105    // Generate normal distribution random numbers
106    let randn_arr = Array::<f64>::randn(vec![2, 2]);
107    println!("\nNormal distribution random array:\n{}", randn_arr);
108    
109    // Generate uniform distribution random numbers in specified range
110    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    // Random array statistics
114    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    // 12. Broadcasting examples
120    println!("\n12. Broadcasting examples:");
121    
122    // Example 1: Scalar-like array with matrix
123    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    // Example 2: Vector with matrix
131    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    // Example 3: Broadcasting with multiplication
139    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    // 13. Trigonometric functions
147    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    // Inverse trigonometric functions
162    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    // Hyperbolic functions
171    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    // Angle conversion
182    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    // 14. Logarithmic and exponential functions
192    println!("\n14. Logarithmic and exponential functions:");
193    
194    // Natural logarithm and exponential
195    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    // Base-10 and base-2 logarithms
208    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    // Custom base logarithm
229    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    // High precision functions for small values
238    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}