mathhook_core/algebra/
matrix_correctness_tests.rs

1//! Mathematical correctness tests for the unified matrix system
2//!
3//! These tests verify that all matrix operations maintain perfect mathematical accuracy
4//! and satisfy fundamental linear algebra properties and invariants.
5
6#[cfg(test)]
7mod mathematical_correctness_tests {
8    use crate::core::expression::Expression;
9    use crate::matrices::operations::MatrixOperations;
10
11    /// Test fundamental matrix properties and invariants
12    #[test]
13    fn test_matrix_addition_properties() {
14        let a = Expression::matrix(vec![
15            vec![Expression::integer(1), Expression::integer(2)],
16            vec![Expression::integer(3), Expression::integer(4)],
17        ]);
18        let b = Expression::matrix(vec![
19            vec![Expression::integer(5), Expression::integer(6)],
20            vec![Expression::integer(7), Expression::integer(8)],
21        ]);
22        let c = Expression::matrix(vec![
23            vec![Expression::integer(9), Expression::integer(10)],
24            vec![Expression::integer(11), Expression::integer(12)],
25        ]);
26
27        // Commutativity: A + B = B + A
28        let ab = a.matrix_add(&b);
29        let ba = b.matrix_add(&a);
30        assert_eq!(ab, ba);
31
32        // Associativity: (A + B) + C = A + (B + C)
33        let ab_c = ab.matrix_add(&c);
34        let bc = b.matrix_add(&c);
35        let a_bc = a.matrix_add(&bc);
36        assert_eq!(ab_c, a_bc);
37
38        // Zero matrix identity: A + 0 = A
39        let zero = Expression::zero_matrix(2, 2);
40        let a_plus_zero = a.matrix_add(&zero);
41        assert_eq!(a, a_plus_zero);
42    }
43
44    #[test]
45    fn test_matrix_multiplication_properties() {
46        let a = Expression::matrix(vec![
47            vec![Expression::integer(1), Expression::integer(2)],
48            vec![Expression::integer(3), Expression::integer(4)],
49        ]);
50        let b = Expression::matrix(vec![
51            vec![Expression::integer(5), Expression::integer(6)],
52            vec![Expression::integer(7), Expression::integer(8)],
53        ]);
54        let c = Expression::matrix(vec![
55            vec![Expression::integer(1), Expression::integer(0)],
56            vec![Expression::integer(0), Expression::integer(1)],
57        ]);
58
59        // Identity matrix property: A * I = I * A = A
60        let identity = Expression::identity_matrix(2);
61        let ai = a.matrix_multiply(&identity);
62        let ia = identity.matrix_multiply(&a);
63        assert_eq!(a, ai);
64        assert_eq!(a, ia);
65
66        // Zero matrix property: A * 0 = 0 * A = 0
67        let zero = Expression::zero_matrix(2, 2);
68        let a_zero = a.matrix_multiply(&zero);
69        let zero_a = zero.matrix_multiply(&a);
70        assert!(a_zero.is_zero_matrix());
71        assert!(zero_a.is_zero_matrix());
72
73        // Associativity: (A * B) * C = A * (B * C)
74        let ab = a.matrix_multiply(&b);
75        let ab_c = ab.matrix_multiply(&c);
76        let bc = b.matrix_multiply(&c);
77        let a_bc = a.matrix_multiply(&bc);
78        assert_eq!(ab_c, a_bc);
79    }
80}