1pub mod matrix;
2pub mod util;
3use crate::matrix::NmlMatrix;
4
5#[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}