nml_matrix/
lib.rs

1pub mod matrix;
2pub mod util;
3use crate::matrix::NmlMatrix;
4
5///unit tests for the Methods and Constructors of the NmlMatrix struct
6#[cfg(test)]
7mod tests {
8
9    use super::*;
10
11    #[test]
12    fn nml_identity_and_matrix_equality() {
13        let data: Vec<f64> = vec![1_f64,0_f64,0_f64,1_f64];
14        let matrix_1 = NmlMatrix::new_with_data(2, 2, data.into_boxed_slice()).expect("Unable to create matrix");
15        let matrix_2 = NmlMatrix::nml_mat_eye(2);
16        let result: bool = matrix_1== matrix_2;
17        assert_eq!(result, true);
18    }
19
20    #[test]
21    fn nml_identity_and_matrix_equality_in_tolerance() {
22        let data: Vec<f64> = vec![2_f64,1_f64,1_f64,2_f64];
23        let matrix_1 = NmlMatrix::new_with_data(2, 2, data.into_boxed_slice()).expect("Unable to create matrix");
24        let matrix_2 = NmlMatrix::nml_mat_eye(2);
25        let result: bool = matrix_1.equality_in_tolerance(matrix_2, 1_f64);
26        assert_eq!(result, true);
27    }
28
29    #[test]
30    fn nml_identity_and_matrix_inequality() {
31        let data: Vec<f64> = vec![1_f64,0_f64,1_f64,1_f64];
32        let matrix_1 = NmlMatrix::new_with_data(2, 2, data.into_boxed_slice()).expect("Unable to create matrix");
33        let matrix_2 = NmlMatrix::nml_mat_eye(2);
34        let result: bool = matrix_1 == matrix_2;
35        assert_eq!(result, false);
36    }
37
38    #[test]
39    fn get_column_equal() {
40        let data: Vec<f64> = vec![1_f64,2_f64,3_f64,4_f64];
41        let matrix = NmlMatrix::new_with_data(2, 2, data.into_boxed_slice()).expect("Unable to create matrix");
42        let column = matrix.get_column(1).expect("Unable to get column");
43        let expected_data: Vec<f64> = vec![2_f64,4_f64];
44        let expected = NmlMatrix::new_with_data(2, 1, expected_data.into_boxed_slice()).expect("Unable to create matrix");
45        assert_eq!(column == expected, true);
46    }
47
48    #[test]
49    fn get_column_unequal() {
50        let data: Vec<f64> = vec![1_f64,2_f64,3_f64,4_f64];
51        let matrix = NmlMatrix::new_with_data(2, 2, data.into_boxed_slice()).expect("Unable to create matrix");
52        let column = matrix.get_column(1).expect("Unable to get column");
53        let expected_data: Vec<f64> = vec![1_f64,4_f64];
54        let expected = NmlMatrix::new_with_data(2, 1, expected_data.into_boxed_slice()).expect("Unable to create matrix");
55        assert_eq!(column == expected, false);
56    }
57
58    #[test]
59    fn copy_matrix_equality() {
60        let data: Vec<f64> = vec![1_f64,2_f64,3_f64,4_f64];
61        let matrix = NmlMatrix::new_with_data(2, 2, data.into_boxed_slice()).expect("Unable to create matrix");
62        let copy = NmlMatrix::nml_mat_cp(&matrix);
63        assert_eq!(matrix == copy, true);
64    }
65
66    #[test]
67    fn copy_matrix_inequality() {
68        let data: Vec<f64> = vec![1_f64,2_f64,3_f64,4_f64];
69        let matrix = NmlMatrix::new_with_data(2, 2, data.into_boxed_slice()).expect("Unable to create matrix");
70        let copy = NmlMatrix::nml_mat_cp(&matrix);
71        let mut copy_data = copy.data;
72        copy_data[0] = 0_f64;
73        let copy = NmlMatrix::new_with_data(2, 2, copy_data).expect("Unable to create matrix");
74        assert_eq!(matrix == copy, false);
75    }
76
77    #[test]
78    fn rnd_matrix_tolerance_equality() {
79        let rnd_matrix: NmlMatrix<f64> = NmlMatrix::nml_mat_rnd(2, 2, 0_f64, 1_f64);
80        let matrix: NmlMatrix<f64> = NmlMatrix::nml_mat_sqr(2);
81        assert_eq!(rnd_matrix.equality_in_tolerance(matrix, 1_f64), true);
82    }
83
84    #[test]
85    fn rnd_matrix_tolerance_inequality() {
86        let rnd_matrix: NmlMatrix<f64> = NmlMatrix::nml_mat_rnd(2, 2, 2_f64, 3_f64);
87        let matrix: NmlMatrix<f64> = NmlMatrix::nml_mat_sqr(2);
88        assert_eq!(rnd_matrix.equality_in_tolerance(matrix, 1_f64), false);
89    }
90
91    #[test]
92    pub fn get_column_invalid() {
93        let data: Vec<f64> = vec![1_f64,2_f64,3_f64,4_f64];
94        let matrix = NmlMatrix::new_with_data(2, 2, data.into_boxed_slice()).expect("Unable to create matrix");
95        let column = matrix.get_column(2);
96        assert_eq!(column.is_err(), true);
97    }
98
99    #[test]
100    pub fn get_row_equality() {
101        let data: Vec<f64> = vec![1_f64,2_f64,3_f64, 4_f64];
102        let matrix = NmlMatrix::new_with_data(1, 4, data.into_boxed_slice()).expect("Unable to create matrix");
103        let row = matrix.get_row(0).expect("Unable to get row");
104        assert_eq!(matrix == row, true);
105    }
106
107    #[test]
108    pub fn get_row_inequality() {
109        let data: Vec<f64> = vec![1_f64,2_f64,3_f64, 4_f64];
110        let matrix = NmlMatrix::new_with_data(1, 4, data.into_boxed_slice()).expect("Unable to create matrix");
111        let row = matrix.get_row(0).expect("Unable to get row");
112        let mut row_data = row.data;
113        row_data[0] = 0_f64;
114        let row = NmlMatrix::new_with_data(1, 4, row_data).expect("Unable to create matrix");
115        assert_eq!(matrix == row, false);
116    }
117
118    #[test]
119    pub fn set_all_values_equality() {
120        let data: Vec<f64> = vec![1_f64,2_f64,3_f64, 4_f64];
121        let mut matrix = NmlMatrix::new_with_data(1, 4, data.into_boxed_slice()).expect("Unable to create matrix");
122        matrix.set_all_values(0_f64);
123        let expected_data: Vec<f64> = vec![0_f64,0_f64,0_f64, 0_f64];
124        let expected = NmlMatrix::new_with_data(1, 4, expected_data.into_boxed_slice()).expect("Unable to create matrix");
125        assert_eq!(matrix == expected, true);
126    }
127
128    #[test]
129    pub fn set_all_values_ineqality() {
130        let data: Vec<f64> = vec![1_f64,2_f64,3_f64, 4_f64];
131        let mut matrix = NmlMatrix::new_with_data(1, 4, data.into_boxed_slice()).expect("Unable to create matrix");
132        matrix.set_all_values(0_f64);
133        let expected_data: Vec<f64> = vec![0_f64,0_f64,0_f64, 1_f64];
134        let expected = NmlMatrix::new_with_data(1, 4, expected_data.into_boxed_slice()).expect("Unable to create matrix");
135        assert_eq!(matrix == expected, false);
136    }
137
138    #[test]
139    pub fn set_value_equality() {
140        let data: Vec<f64> = vec![1_f64,2_f64,3_f64, 4_f64];
141        let mut matrix = NmlMatrix::new_with_data(1, 4, data.into_boxed_slice()).expect("Unable to create matrix");
142        matrix.set_value(0, 0, 0_f64);
143        let expected_data: Vec<f64> = vec![0_f64,2_f64,3_f64, 4_f64];
144        let expected = NmlMatrix::new_with_data(1, 4, expected_data.into_boxed_slice()).expect("Unable to create matrix");
145        assert_eq!(matrix == expected, true);
146    }
147
148    #[test]
149    pub fn set_value_inqality() {
150        let data: Vec<f64> = vec![1_f64,2_f64,3_f64, 4_f64];
151        let mut matrix = NmlMatrix::new_with_data(1, 4, data.into_boxed_slice()).expect("Unable to create matrix");
152        let expected = NmlMatrix::nml_mat_cp(&matrix);
153        matrix.set_value(0, 0, 0_f64);
154        assert_eq!(matrix == expected, false);
155    }
156
157    #[test]
158    pub fn set_diagonal_values_equality() {
159        let data: Vec<f64> = vec![1_f64,2_f64,3_f64, 4_f64];
160        let mut matrix = NmlMatrix::new_with_data(2, 2, data.into_boxed_slice()).expect("Unable to create matrix");
161        matrix.set_dig_values(0_f64).expect("Matrix is not square");
162        let expected_data: Vec<f64> = vec![0_f64,2_f64,3_f64, 0_f64];
163        let expected = NmlMatrix::new_with_data(2, 2, expected_data.into_boxed_slice()).expect("Unable to create matrix");
164        assert_eq!(matrix == expected, true);
165    }
166
167    #[test]
168    pub fn  multiply_column_scalar() {
169        let data: Vec<f64> = vec![1_f64,2_f64,3_f64, 4_f64];
170        let mut matrix = NmlMatrix::new_with_data(2, 2, data.into_boxed_slice()).expect("Unable to create matrix");
171        matrix.multiply_col_scalar(0, 2_f64).expect("Invalid column");
172        let expected_data: Vec<f64> = vec![2_f64,2_f64,6_f64, 4_f64];
173        let expected = NmlMatrix::new_with_data(2, 2, expected_data.into_boxed_slice()).expect("Unable to create matrix");
174        assert_eq!(matrix == expected, true);
175    }
176
177    #[test]
178    pub fn multiply_row_scalar() {
179        let data: Vec<f64> = vec![1_f64,2_f64,3_f64, 4_f64];
180        let mut matrix = NmlMatrix::new_with_data(2, 2, data.into_boxed_slice()).expect("Unable to create matrix");
181        matrix.multiply_row_scalar(0, 2_f64).expect("Invalid row");
182        let expected_data: Vec<f64> = vec![2_f64,4_f64,3_f64, 4_f64];
183        let expected = NmlMatrix::new_with_data(2, 2, expected_data.into_boxed_slice()).expect("Unable to create matrix");
184        assert_eq!(matrix == expected, true);
185    }
186
187    #[test]
188    pub fn multiply_matrix_scalar() {
189        let data: Vec<f64> = vec![1_f64,2_f64,3_f64, 4_f64];
190        let mut matrix = NmlMatrix::new_with_data(2, 2, data.into_boxed_slice()).expect("Unable to create matrix");
191        matrix.multiply_matrix_scalar(2_f64);
192        let expected_data: Vec<f64> = vec![2_f64,4_f64,6_f64, 8_f64];
193        let expected = NmlMatrix::new_with_data(2, 2, expected_data.into_boxed_slice()).expect("Unable to create matrix");
194        assert_eq!(matrix == expected, true);
195    }
196
197    #[test]
198    pub fn add_rows() {
199        let data: Vec<f64> = vec![1_f64,2_f64,3_f64, 4_f64];
200        let mut matrix = NmlMatrix::new_with_data(2, 2, data.into_boxed_slice()).expect("Unable to create matrix");
201        matrix.add_rows(0, 2_f64, 1, 1_f64).expect("Invalid row");
202        let expected_data: Vec<f64> = vec![5_f64,8_f64,3_f64, 4_f64];
203        let expected = NmlMatrix::new_with_data(2, 2, expected_data.into_boxed_slice()).expect("Unable to create matrix");
204        assert_eq!(matrix == expected, true);
205    }
206
207    #[test]
208    pub fn remove_column() {
209        let data: Vec<f64> = vec![1_f64,2_f64,3_f64, 4_f64, 5_f64, 6_f64];
210        let matrix = NmlMatrix::new_with_data(3, 2, data.into_boxed_slice()).expect("Unable to create matrix");
211        let result = matrix.remove_column(0).expect("Invalid column");
212        let expected_data: Vec<f64> = vec![2_f64,4_f64, 6_f64];
213        let expected = NmlMatrix::new_with_data(3, 1, expected_data.into_boxed_slice()).expect("Unable to create matrix");
214        assert_eq!(result == expected, true);
215    }
216
217    #[test]
218    pub fn remove_row() {
219        let data: Vec<f64> = vec![1_f64,2_f64,3_f64, 4_f64, 5_f64, 6_f64];
220        let matrix = NmlMatrix::new_with_data(2, 3, data.into_boxed_slice()).expect("Unable to create matrix");
221        let result = matrix.remove_row(0).expect("Invalid row");
222        let expected_data: Vec<f64> = vec![4_f64,5_f64, 6_f64];
223        let expected = NmlMatrix::new_with_data(1, 3, expected_data.into_boxed_slice()).expect("Unable to create matrix");
224        assert_eq!(result == expected, true);
225    }
226
227    #[test]
228    pub fn swap_row() {
229        let data: Vec<f64> = vec![1_f64,2_f64,3_f64, 4_f64, 5_f64, 6_f64];
230        let mut matrix = NmlMatrix::new_with_data(2, 3, data.into_boxed_slice()).expect("Unable to create matrix");
231        matrix.swap_rows(0, 1).expect("Invalid row");
232        let expected_data: Vec<f64> = vec![4_f64,5_f64, 6_f64, 1_f64,2_f64,3_f64];
233        let expected =    NmlMatrix::new_with_data(2, 3, expected_data.into_boxed_slice()).expect("Unable to create matrix");
234        assert_eq!(matrix == expected, true);
235    }
236
237    #[test]
238    pub fn add_matrix() {
239        let data: Vec<f64> = vec![1_f64,2_f64,3_f64, 4_f64];
240        let matrix_1 = NmlMatrix::new_with_data(2, 2, data.into_boxed_slice()).expect("Unable to create matrix");
241        let matrix_2 = NmlMatrix::nml_mat_sqr(2);
242        let expected_matrix: NmlMatrix<f64> = NmlMatrix::nml_mat_cp(&matrix_1);
243        let result = matrix_1 + matrix_2;
244        let result_matrix = result.expect("Unable to add matrices");
245        assert_eq!(result_matrix == expected_matrix, true);
246    }
247
248    #[test]
249    pub fn mul_naive() {
250        let data_1: Vec<f64> = vec![1.0, 0.0, 0.0, 1.0];
251        let data_2: Vec<f64> = vec![1.0, 2.0, 3.0, 4.0];
252        let matrix_1 = NmlMatrix::new_with_data(2,2, data_1.into_boxed_slice()).expect("");
253        let matrix_2 = NmlMatrix::new_with_data(2,2, data_2.into_boxed_slice()).expect("");
254        let result = matrix_2.mul_naive(&matrix_1).expect("");
255        let expect = NmlMatrix::nml_mat_cp(&matrix_2);
256        assert_eq!(result == expect, true);
257    }
258
259    #[test]
260    pub fn mul_transpose() {
261        let data_1: Vec<f64> = vec![1.0, 0.0, 0.0, 1.0];
262        let data_2: Vec<f64> = vec![1.0, 2.0, 3.0, 4.0];
263        let matrix_1 = NmlMatrix::new_with_data(2,2, data_1.into_boxed_slice()).expect("");
264        let matrix_2 = NmlMatrix::new_with_data(2,2, data_2.into_boxed_slice()).expect("");
265        let result = matrix_2.mul_transpose(&matrix_1).expect("");
266        let expect = NmlMatrix::nml_mat_cp(&matrix_2);
267        assert_eq!(result == expect, true);
268    }
269
270    #[test]
271    pub fn transpose() {
272        let matrix_1: NmlMatrix<f64> = NmlMatrix::new_with_data(3,3, vec![1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0].into_boxed_slice()).expect("matrix not created");
273        let matrix_2: NmlMatrix<f64> = matrix_1.transpose();
274        assert_eq!(matrix_1 == matrix_2, true);
275    }
276
277    #[test]
278    pub fn data_2d() {
279        let mut data: Vec<Vec<f64>> = vec![vec![1.0, 0.0], vec![0.0, 1.0]];
280        let matrix_1: NmlMatrix<f64> = NmlMatrix::new_with_2d_vec(2,2, &mut data).expect("matrix not created");
281        let data_2d: Box<[f64]> = vec![1.0, 0.0, 0.0, 1.0].into_boxed_slice();
282        assert_eq!(matrix_1.data, data_2d);
283    }
284
285}