From d331bbd7c16f73a47541438f2989e20fa192402c Mon Sep 17 00:00:00 2001 From: Jennifer Chukwu Date: Fri, 19 Apr 2024 14:49:14 +0000 Subject: [PATCH 1/8] inversion --- src/linalg/inverse.rs | 231 +++++++++++++++++++++++------------------- 1 file changed, 127 insertions(+), 104 deletions(-) diff --git a/src/linalg/inverse.rs b/src/linalg/inverse.rs index 91d45587..aa629e9f 100644 --- a/src/linalg/inverse.rs +++ b/src/linalg/inverse.rs @@ -145,124 +145,149 @@ where { let m = m.as_slice(); - out[(0, 0)] = m[5].clone() * m[10].clone() * m[15].clone() - - m[5].clone() * m[11].clone() * m[14].clone() - - m[9].clone() * m[6].clone() * m[15].clone() - + m[9].clone() * m[7].clone() * m[14].clone() - + m[13].clone() * m[6].clone() * m[11].clone() - - m[13].clone() * m[7].clone() * m[10].clone(); + let det = m[0].clone() + * (m[5].clone() * m[10].clone() * m[15].clone() + + m[6].clone() * m[11].clone() * m[13].clone() + + m[7].clone() * m[9].clone() * m[14].clone() + - m[7].clone() * m[10].clone() * m[13].clone() + - m[6].clone() * m[9].clone() * m[15].clone() + - m[5].clone() * m[11].clone() * m[14].clone()) + - m[1].clone() + * (m[4].clone() * m[10].clone() * m[15].clone() + + m[6].clone() * m[11].clone() * m[12].clone() + + m[7].clone() * m[8].clone() * m[14].clone() + - m[7].clone() * m[10].clone() * m[12].clone() + - m[6].clone() * m[8].clone() * m[15].clone() + - m[4].clone() * m[11].clone() * m[14].clone()) + + m[2].clone() + * (m[4].clone() * m[9].clone() * m[15].clone() + + m[5].clone() * m[11].clone() * m[12].clone() + + m[7].clone() * m[8].clone() * m[13].clone() + - m[7].clone() * m[9].clone() * m[12].clone() + - m[5].clone() * m[8].clone() * m[15].clone() + - m[4].clone() * m[11].clone() * m[13].clone()) + - m[3].clone() + * (m[4].clone() * m[9].clone() * m[14].clone() + + m[5].clone() * m[10].clone() * m[12].clone() + + m[6].clone() * m[8].clone() * m[13].clone() + - m[6].clone() * m[9].clone() * m[12].clone() + - m[5].clone() * m[8].clone() * m[14].clone() + - m[4].clone() * m[10].clone() * m[13].clone()); + if det.is_zero() { + false + } else { + out[(0, 0)] = m[5].clone() * m[10].clone() * m[15].clone() + - m[5].clone() * m[11].clone() * m[14].clone() + - m[9].clone() * m[6].clone() * m[15].clone() + + m[9].clone() * m[7].clone() * m[14].clone() + + m[13].clone() * m[6].clone() * m[11].clone() + - m[13].clone() * m[7].clone() * m[10].clone(); - out[(1, 0)] = -m[1].clone() * m[10].clone() * m[15].clone() - + m[1].clone() * m[11].clone() * m[14].clone() - + m[9].clone() * m[2].clone() * m[15].clone() - - m[9].clone() * m[3].clone() * m[14].clone() - - m[13].clone() * m[2].clone() * m[11].clone() - + m[13].clone() * m[3].clone() * m[10].clone(); + out[(1, 0)] = -m[1].clone() * m[10].clone() * m[15].clone() + + m[1].clone() * m[11].clone() * m[14].clone() + + m[9].clone() * m[2].clone() * m[15].clone() + - m[9].clone() * m[3].clone() * m[14].clone() + - m[13].clone() * m[2].clone() * m[11].clone() + + m[13].clone() * m[3].clone() * m[10].clone(); - out[(2, 0)] = m[1].clone() * m[6].clone() * m[15].clone() - - m[1].clone() * m[7].clone() * m[14].clone() - - m[5].clone() * m[2].clone() * m[15].clone() - + m[5].clone() * m[3].clone() * m[14].clone() - + m[13].clone() * m[2].clone() * m[7].clone() - - m[13].clone() * m[3].clone() * m[6].clone(); + out[(2, 0)] = m[1].clone() * m[6].clone() * m[15].clone() + - m[1].clone() * m[7].clone() * m[14].clone() + - m[5].clone() * m[2].clone() * m[15].clone() + + m[5].clone() * m[3].clone() * m[14].clone() + + m[13].clone() * m[2].clone() * m[7].clone() + - m[13].clone() * m[3].clone() * m[6].clone(); - out[(3, 0)] = -m[1].clone() * m[6].clone() * m[11].clone() - + m[1].clone() * m[7].clone() * m[10].clone() - + m[5].clone() * m[2].clone() * m[11].clone() - - m[5].clone() * m[3].clone() * m[10].clone() - - m[9].clone() * m[2].clone() * m[7].clone() - + m[9].clone() * m[3].clone() * m[6].clone(); + out[(3, 0)] = -m[1].clone() * m[6].clone() * m[11].clone() + + m[1].clone() * m[7].clone() * m[10].clone() + + m[5].clone() * m[2].clone() * m[11].clone() + - m[5].clone() * m[3].clone() * m[10].clone() + - m[9].clone() * m[2].clone() * m[7].clone() + + m[9].clone() * m[3].clone() * m[6].clone(); - out[(0, 1)] = -m[4].clone() * m[10].clone() * m[15].clone() - + m[4].clone() * m[11].clone() * m[14].clone() - + m[8].clone() * m[6].clone() * m[15].clone() - - m[8].clone() * m[7].clone() * m[14].clone() - - m[12].clone() * m[6].clone() * m[11].clone() - + m[12].clone() * m[7].clone() * m[10].clone(); + out[(0, 1)] = -m[4].clone() * m[10].clone() * m[15].clone() + + m[4].clone() * m[11].clone() * m[14].clone() + + m[8].clone() * m[6].clone() * m[15].clone() + - m[8].clone() * m[7].clone() * m[14].clone() + - m[12].clone() * m[6].clone() * m[11].clone() + + m[12].clone() * m[7].clone() * m[10].clone(); - out[(1, 1)] = m[0].clone() * m[10].clone() * m[15].clone() - - m[0].clone() * m[11].clone() * m[14].clone() - - m[8].clone() * m[2].clone() * m[15].clone() - + m[8].clone() * m[3].clone() * m[14].clone() - + m[12].clone() * m[2].clone() * m[11].clone() - - m[12].clone() * m[3].clone() * m[10].clone(); + out[(1, 1)] = m[0].clone() * m[10].clone() * m[15].clone() + - m[0].clone() * m[11].clone() * m[14].clone() + - m[8].clone() * m[2].clone() * m[15].clone() + + m[8].clone() * m[3].clone() * m[14].clone() + + m[12].clone() * m[2].clone() * m[11].clone() + - m[12].clone() * m[3].clone() * m[10].clone(); - out[(2, 1)] = -m[0].clone() * m[6].clone() * m[15].clone() - + m[0].clone() * m[7].clone() * m[14].clone() - + m[4].clone() * m[2].clone() * m[15].clone() - - m[4].clone() * m[3].clone() * m[14].clone() - - m[12].clone() * m[2].clone() * m[7].clone() - + m[12].clone() * m[3].clone() * m[6].clone(); + out[(2, 1)] = -m[0].clone() * m[6].clone() * m[15].clone() + + m[0].clone() * m[7].clone() * m[14].clone() + + m[4].clone() * m[2].clone() * m[15].clone() + - m[4].clone() * m[3].clone() * m[14].clone() + - m[12].clone() * m[2].clone() * m[7].clone() + + m[12].clone() * m[3].clone() * m[6].clone(); - out[(3, 1)] = m[0].clone() * m[6].clone() * m[11].clone() - - m[0].clone() * m[7].clone() * m[10].clone() - - m[4].clone() * m[2].clone() * m[11].clone() - + m[4].clone() * m[3].clone() * m[10].clone() - + m[8].clone() * m[2].clone() * m[7].clone() - - m[8].clone() * m[3].clone() * m[6].clone(); + out[(3, 1)] = m[0].clone() * m[6].clone() * m[11].clone() + - m[0].clone() * m[7].clone() * m[10].clone() + - m[4].clone() * m[2].clone() * m[11].clone() + + m[4].clone() * m[3].clone() * m[10].clone() + + m[8].clone() * m[2].clone() * m[7].clone() + - m[8].clone() * m[3].clone() * m[6].clone(); - out[(0, 2)] = m[4].clone() * m[9].clone() * m[15].clone() - - m[4].clone() * m[11].clone() * m[13].clone() - - m[8].clone() * m[5].clone() * m[15].clone() - + m[8].clone() * m[7].clone() * m[13].clone() - + m[12].clone() * m[5].clone() * m[11].clone() - - m[12].clone() * m[7].clone() * m[9].clone(); + out[(0, 2)] = m[4].clone() * m[9].clone() * m[15].clone() + - m[4].clone() * m[11].clone() * m[13].clone() + - m[8].clone() * m[5].clone() * m[15].clone() + + m[8].clone() * m[7].clone() * m[13].clone() + + m[12].clone() * m[5].clone() * m[11].clone() + - m[12].clone() * m[7].clone() * m[9].clone(); - out[(1, 2)] = -m[0].clone() * m[9].clone() * m[15].clone() - + m[0].clone() * m[11].clone() * m[13].clone() - + m[8].clone() * m[1].clone() * m[15].clone() - - m[8].clone() * m[3].clone() * m[13].clone() - - m[12].clone() * m[1].clone() * m[11].clone() - + m[12].clone() * m[3].clone() * m[9].clone(); + out[(1, 2)] = -m[0].clone() * m[9].clone() * m[15].clone() + + m[0].clone() * m[11].clone() * m[13].clone() + + m[8].clone() * m[1].clone() * m[15].clone() + - m[8].clone() * m[3].clone() * m[13].clone() + - m[12].clone() * m[1].clone() * m[11].clone() + + m[12].clone() * m[3].clone() * m[9].clone(); - out[(2, 2)] = m[0].clone() * m[5].clone() * m[15].clone() - - m[0].clone() * m[7].clone() * m[13].clone() - - m[4].clone() * m[1].clone() * m[15].clone() - + m[4].clone() * m[3].clone() * m[13].clone() - + m[12].clone() * m[1].clone() * m[7].clone() - - m[12].clone() * m[3].clone() * m[5].clone(); + out[(2, 2)] = m[0].clone() * m[5].clone() * m[15].clone() + - m[0].clone() * m[7].clone() * m[13].clone() + - m[4].clone() * m[1].clone() * m[15].clone() + + m[4].clone() * m[3].clone() * m[13].clone() + + m[12].clone() * m[1].clone() * m[7].clone() + - m[12].clone() * m[3].clone() * m[5].clone(); - out[(0, 3)] = -m[4].clone() * m[9].clone() * m[14].clone() - + m[4].clone() * m[10].clone() * m[13].clone() - + m[8].clone() * m[5].clone() * m[14].clone() - - m[8].clone() * m[6].clone() * m[13].clone() - - m[12].clone() * m[5].clone() * m[10].clone() - + m[12].clone() * m[6].clone() * m[9].clone(); + out[(0, 3)] = -m[4].clone() * m[9].clone() * m[14].clone() + + m[4].clone() * m[10].clone() * m[13].clone() + + m[8].clone() * m[5].clone() * m[14].clone() + - m[8].clone() * m[6].clone() * m[13].clone() + - m[12].clone() * m[5].clone() * m[10].clone() + + m[12].clone() * m[6].clone() * m[9].clone(); - out[(3, 2)] = -m[0].clone() * m[5].clone() * m[11].clone() - + m[0].clone() * m[7].clone() * m[9].clone() - + m[4].clone() * m[1].clone() * m[11].clone() - - m[4].clone() * m[3].clone() * m[9].clone() - - m[8].clone() * m[1].clone() * m[7].clone() - + m[8].clone() * m[3].clone() * m[5].clone(); + out[(3, 2)] = -m[0].clone() * m[5].clone() * m[11].clone() + + m[0].clone() * m[7].clone() * m[9].clone() + + m[4].clone() * m[1].clone() * m[11].clone() + - m[4].clone() * m[3].clone() * m[9].clone() + - m[8].clone() * m[1].clone() * m[7].clone() + + m[8].clone() * m[3].clone() * m[5].clone(); - out[(1, 3)] = m[0].clone() * m[9].clone() * m[14].clone() - - m[0].clone() * m[10].clone() * m[13].clone() - - m[8].clone() * m[1].clone() * m[14].clone() - + m[8].clone() * m[2].clone() * m[13].clone() - + m[12].clone() * m[1].clone() * m[10].clone() - - m[12].clone() * m[2].clone() * m[9].clone(); + out[(1, 3)] = m[0].clone() * m[9].clone() * m[14].clone() + - m[0].clone() * m[10].clone() * m[13].clone() + - m[8].clone() * m[1].clone() * m[14].clone() + + m[8].clone() * m[2].clone() * m[13].clone() + + m[12].clone() * m[1].clone() * m[10].clone() + - m[12].clone() * m[2].clone() * m[9].clone(); - out[(2, 3)] = -m[0].clone() * m[5].clone() * m[14].clone() - + m[0].clone() * m[6].clone() * m[13].clone() - + m[4].clone() * m[1].clone() * m[14].clone() - - m[4].clone() * m[2].clone() * m[13].clone() - - m[12].clone() * m[1].clone() * m[6].clone() - + m[12].clone() * m[2].clone() * m[5].clone(); + out[(2, 3)] = -m[0].clone() * m[5].clone() * m[14].clone() + + m[0].clone() * m[6].clone() * m[13].clone() + + m[4].clone() * m[1].clone() * m[14].clone() + - m[4].clone() * m[2].clone() * m[13].clone() + - m[12].clone() * m[1].clone() * m[6].clone() + + m[12].clone() * m[2].clone() * m[5].clone(); - out[(3, 3)] = m[0].clone() * m[5].clone() * m[10].clone() - - m[0].clone() * m[6].clone() * m[9].clone() - - m[4].clone() * m[1].clone() * m[10].clone() - + m[4].clone() * m[2].clone() * m[9].clone() - + m[8].clone() * m[1].clone() * m[6].clone() - - m[8].clone() * m[2].clone() * m[5].clone(); + out[(3, 3)] = m[0].clone() * m[5].clone() * m[10].clone() + - m[0].clone() * m[6].clone() * m[9].clone() + - m[4].clone() * m[1].clone() * m[10].clone() + + m[4].clone() * m[2].clone() * m[9].clone() + + m[8].clone() * m[1].clone() * m[6].clone() + - m[8].clone() * m[2].clone() * m[5].clone(); - let det = m[0].clone() * out[(0, 0)].clone() - + m[1].clone() * out[(0, 1)].clone() - + m[2].clone() * out[(0, 2)].clone() - + m[3].clone() * out[(0, 3)].clone(); - - if !det.is_zero() { let inv_det = T::one() / det; for j in 0..4 { @@ -271,7 +296,5 @@ where } } true - } else { - false } } From a0da49fb83b5f005a3c3da50a45345b132311ea7 Mon Sep 17 00:00:00 2001 From: Jennifer Chukwu Date: Mon, 22 Apr 2024 12:36:35 +0000 Subject: [PATCH 2/8] early return --- src/linalg/inverse.rs | 100 ++++++++++++++++-------------------------- 1 file changed, 39 insertions(+), 61 deletions(-) diff --git a/src/linalg/inverse.rs b/src/linalg/inverse.rs index aa629e9f..a1f7b186 100644 --- a/src/linalg/inverse.rs +++ b/src/linalg/inverse.rs @@ -145,50 +145,43 @@ where { let m = m.as_slice(); - let det = m[0].clone() - * (m[5].clone() * m[10].clone() * m[15].clone() - + m[6].clone() * m[11].clone() * m[13].clone() - + m[7].clone() * m[9].clone() * m[14].clone() - - m[7].clone() * m[10].clone() * m[13].clone() - - m[6].clone() * m[9].clone() * m[15].clone() - - m[5].clone() * m[11].clone() * m[14].clone()) - - m[1].clone() - * (m[4].clone() * m[10].clone() * m[15].clone() - + m[6].clone() * m[11].clone() * m[12].clone() - + m[7].clone() * m[8].clone() * m[14].clone() - - m[7].clone() * m[10].clone() * m[12].clone() - - m[6].clone() * m[8].clone() * m[15].clone() - - m[4].clone() * m[11].clone() * m[14].clone()) - + m[2].clone() - * (m[4].clone() * m[9].clone() * m[15].clone() - + m[5].clone() * m[11].clone() * m[12].clone() - + m[7].clone() * m[8].clone() * m[13].clone() - - m[7].clone() * m[9].clone() * m[12].clone() - - m[5].clone() * m[8].clone() * m[15].clone() - - m[4].clone() * m[11].clone() * m[13].clone()) - - m[3].clone() - * (m[4].clone() * m[9].clone() * m[14].clone() - + m[5].clone() * m[10].clone() * m[12].clone() - + m[6].clone() * m[8].clone() * m[13].clone() - - m[6].clone() * m[9].clone() * m[12].clone() - - m[5].clone() * m[8].clone() * m[14].clone() - - m[4].clone() * m[10].clone() * m[13].clone()); - if det.is_zero() { - false - } else { - out[(0, 0)] = m[5].clone() * m[10].clone() * m[15].clone() - - m[5].clone() * m[11].clone() * m[14].clone() - - m[9].clone() * m[6].clone() * m[15].clone() - + m[9].clone() * m[7].clone() * m[14].clone() - + m[13].clone() * m[6].clone() * m[11].clone() - - m[13].clone() * m[7].clone() * m[10].clone(); + let cofactor00 = m[5].clone() * m[10].clone() * m[15].clone() + - m[5].clone() * m[11].clone() * m[14].clone() + - m[9].clone() * m[6].clone() * m[15].clone() + + m[9].clone() * m[7].clone() * m[14].clone() + + m[13].clone() * m[6].clone() * m[11].clone() + - m[13].clone() * m[7].clone() * m[10].clone(); - out[(1, 0)] = -m[1].clone() * m[10].clone() * m[15].clone() - + m[1].clone() * m[11].clone() * m[14].clone() - + m[9].clone() * m[2].clone() * m[15].clone() - - m[9].clone() * m[3].clone() * m[14].clone() - - m[13].clone() * m[2].clone() * m[11].clone() - + m[13].clone() * m[3].clone() * m[10].clone(); + let cofactor01 = -m[4].clone() * m[10].clone() * m[15].clone() + + m[4].clone() * m[11].clone() * m[14].clone() + + m[8].clone() * m[6].clone() * m[15].clone() + - m[8].clone() * m[7].clone() * m[14].clone() + - m[12].clone() * m[6].clone() * m[11].clone() + + m[12].clone() * m[7].clone() * m[10].clone(); + + let cofactor02 = m[4].clone() * m[9].clone() * m[15].clone() + - m[4].clone() * m[11].clone() * m[13].clone() + - m[8].clone() * m[5].clone() * m[15].clone() + + m[8].clone() * m[7].clone() * m[13].clone() + + m[12].clone() * m[5].clone() * m[11].clone() + - m[12].clone() * m[7].clone() * m[9].clone(); + + let cofactor03 = -m[4].clone() * m[9].clone() * m[14].clone() + + m[4].clone() * m[10].clone() * m[13].clone() + + m[8].clone() * m[5].clone() * m[14].clone() + - m[8].clone() * m[6].clone() * m[13].clone() + - m[12].clone() * m[5].clone() * m[10].clone() + + m[12].clone() * m[6].clone() * m[9].clone(); + + let det = m[0].clone() * cofactor00.clone() + + m[1].clone() * cofactor01.clone() + + m[2].clone() * cofactor02.clone() + + m[3].clone() * cofactor03.clone(); + + if det.is_zero() { + return false; + } else { + out[(0, 0)] = cofactor00; out[(2, 0)] = m[1].clone() * m[6].clone() * m[15].clone() - m[1].clone() * m[7].clone() * m[14].clone() @@ -204,12 +197,7 @@ where - m[9].clone() * m[2].clone() * m[7].clone() + m[9].clone() * m[3].clone() * m[6].clone(); - out[(0, 1)] = -m[4].clone() * m[10].clone() * m[15].clone() - + m[4].clone() * m[11].clone() * m[14].clone() - + m[8].clone() * m[6].clone() * m[15].clone() - - m[8].clone() * m[7].clone() * m[14].clone() - - m[12].clone() * m[6].clone() * m[11].clone() - + m[12].clone() * m[7].clone() * m[10].clone(); + out[(0, 1)] = cofactor01; out[(1, 1)] = m[0].clone() * m[10].clone() * m[15].clone() - m[0].clone() * m[11].clone() * m[14].clone() @@ -232,12 +220,7 @@ where + m[8].clone() * m[2].clone() * m[7].clone() - m[8].clone() * m[3].clone() * m[6].clone(); - out[(0, 2)] = m[4].clone() * m[9].clone() * m[15].clone() - - m[4].clone() * m[11].clone() * m[13].clone() - - m[8].clone() * m[5].clone() * m[15].clone() - + m[8].clone() * m[7].clone() * m[13].clone() - + m[12].clone() * m[5].clone() * m[11].clone() - - m[12].clone() * m[7].clone() * m[9].clone(); + out[(0, 2)] = cofactor02; out[(1, 2)] = -m[0].clone() * m[9].clone() * m[15].clone() + m[0].clone() * m[11].clone() * m[13].clone() @@ -253,12 +236,7 @@ where + m[12].clone() * m[1].clone() * m[7].clone() - m[12].clone() * m[3].clone() * m[5].clone(); - out[(0, 3)] = -m[4].clone() * m[9].clone() * m[14].clone() - + m[4].clone() * m[10].clone() * m[13].clone() - + m[8].clone() * m[5].clone() * m[14].clone() - - m[8].clone() * m[6].clone() * m[13].clone() - - m[12].clone() * m[5].clone() * m[10].clone() - + m[12].clone() * m[6].clone() * m[9].clone(); + out[(0, 3)] = cofactor03; out[(3, 2)] = -m[0].clone() * m[5].clone() * m[11].clone() + m[0].clone() * m[7].clone() * m[9].clone() From c21df4e1a3a807ea5db447959b25e0ca15613d12 Mon Sep 17 00:00:00 2001 From: Jennifer Chukwu Date: Mon, 22 Apr 2024 19:00:44 +0000 Subject: [PATCH 3/8] remove else --- src/linalg/inverse.rs | 187 +++++++++++++++++++++--------------------- 1 file changed, 93 insertions(+), 94 deletions(-) diff --git a/src/linalg/inverse.rs b/src/linalg/inverse.rs index a1f7b186..3d8e266e 100644 --- a/src/linalg/inverse.rs +++ b/src/linalg/inverse.rs @@ -180,99 +180,98 @@ where if det.is_zero() { return false; - } else { - out[(0, 0)] = cofactor00; - - out[(2, 0)] = m[1].clone() * m[6].clone() * m[15].clone() - - m[1].clone() * m[7].clone() * m[14].clone() - - m[5].clone() * m[2].clone() * m[15].clone() - + m[5].clone() * m[3].clone() * m[14].clone() - + m[13].clone() * m[2].clone() * m[7].clone() - - m[13].clone() * m[3].clone() * m[6].clone(); - - out[(3, 0)] = -m[1].clone() * m[6].clone() * m[11].clone() - + m[1].clone() * m[7].clone() * m[10].clone() - + m[5].clone() * m[2].clone() * m[11].clone() - - m[5].clone() * m[3].clone() * m[10].clone() - - m[9].clone() * m[2].clone() * m[7].clone() - + m[9].clone() * m[3].clone() * m[6].clone(); - - out[(0, 1)] = cofactor01; - - out[(1, 1)] = m[0].clone() * m[10].clone() * m[15].clone() - - m[0].clone() * m[11].clone() * m[14].clone() - - m[8].clone() * m[2].clone() * m[15].clone() - + m[8].clone() * m[3].clone() * m[14].clone() - + m[12].clone() * m[2].clone() * m[11].clone() - - m[12].clone() * m[3].clone() * m[10].clone(); - - out[(2, 1)] = -m[0].clone() * m[6].clone() * m[15].clone() - + m[0].clone() * m[7].clone() * m[14].clone() - + m[4].clone() * m[2].clone() * m[15].clone() - - m[4].clone() * m[3].clone() * m[14].clone() - - m[12].clone() * m[2].clone() * m[7].clone() - + m[12].clone() * m[3].clone() * m[6].clone(); - - out[(3, 1)] = m[0].clone() * m[6].clone() * m[11].clone() - - m[0].clone() * m[7].clone() * m[10].clone() - - m[4].clone() * m[2].clone() * m[11].clone() - + m[4].clone() * m[3].clone() * m[10].clone() - + m[8].clone() * m[2].clone() * m[7].clone() - - m[8].clone() * m[3].clone() * m[6].clone(); - - out[(0, 2)] = cofactor02; - - out[(1, 2)] = -m[0].clone() * m[9].clone() * m[15].clone() - + m[0].clone() * m[11].clone() * m[13].clone() - + m[8].clone() * m[1].clone() * m[15].clone() - - m[8].clone() * m[3].clone() * m[13].clone() - - m[12].clone() * m[1].clone() * m[11].clone() - + m[12].clone() * m[3].clone() * m[9].clone(); - - out[(2, 2)] = m[0].clone() * m[5].clone() * m[15].clone() - - m[0].clone() * m[7].clone() * m[13].clone() - - m[4].clone() * m[1].clone() * m[15].clone() - + m[4].clone() * m[3].clone() * m[13].clone() - + m[12].clone() * m[1].clone() * m[7].clone() - - m[12].clone() * m[3].clone() * m[5].clone(); - - out[(0, 3)] = cofactor03; - - out[(3, 2)] = -m[0].clone() * m[5].clone() * m[11].clone() - + m[0].clone() * m[7].clone() * m[9].clone() - + m[4].clone() * m[1].clone() * m[11].clone() - - m[4].clone() * m[3].clone() * m[9].clone() - - m[8].clone() * m[1].clone() * m[7].clone() - + m[8].clone() * m[3].clone() * m[5].clone(); - - out[(1, 3)] = m[0].clone() * m[9].clone() * m[14].clone() - - m[0].clone() * m[10].clone() * m[13].clone() - - m[8].clone() * m[1].clone() * m[14].clone() - + m[8].clone() * m[2].clone() * m[13].clone() - + m[12].clone() * m[1].clone() * m[10].clone() - - m[12].clone() * m[2].clone() * m[9].clone(); - - out[(2, 3)] = -m[0].clone() * m[5].clone() * m[14].clone() - + m[0].clone() * m[6].clone() * m[13].clone() - + m[4].clone() * m[1].clone() * m[14].clone() - - m[4].clone() * m[2].clone() * m[13].clone() - - m[12].clone() * m[1].clone() * m[6].clone() - + m[12].clone() * m[2].clone() * m[5].clone(); - - out[(3, 3)] = m[0].clone() * m[5].clone() * m[10].clone() - - m[0].clone() * m[6].clone() * m[9].clone() - - m[4].clone() * m[1].clone() * m[10].clone() - + m[4].clone() * m[2].clone() * m[9].clone() - + m[8].clone() * m[1].clone() * m[6].clone() - - m[8].clone() * m[2].clone() * m[5].clone(); - - let inv_det = T::one() / det; - - for j in 0..4 { - for i in 0..4 { - out[(i, j)] *= inv_det.clone(); - } - } - true } + out[(0, 0)] = cofactor00; + + out[(2, 0)] = m[1].clone() * m[6].clone() * m[15].clone() + - m[1].clone() * m[7].clone() * m[14].clone() + - m[5].clone() * m[2].clone() * m[15].clone() + + m[5].clone() * m[3].clone() * m[14].clone() + + m[13].clone() * m[2].clone() * m[7].clone() + - m[13].clone() * m[3].clone() * m[6].clone(); + + out[(3, 0)] = -m[1].clone() * m[6].clone() * m[11].clone() + + m[1].clone() * m[7].clone() * m[10].clone() + + m[5].clone() * m[2].clone() * m[11].clone() + - m[5].clone() * m[3].clone() * m[10].clone() + - m[9].clone() * m[2].clone() * m[7].clone() + + m[9].clone() * m[3].clone() * m[6].clone(); + + out[(0, 1)] = cofactor01; + + out[(1, 1)] = m[0].clone() * m[10].clone() * m[15].clone() + - m[0].clone() * m[11].clone() * m[14].clone() + - m[8].clone() * m[2].clone() * m[15].clone() + + m[8].clone() * m[3].clone() * m[14].clone() + + m[12].clone() * m[2].clone() * m[11].clone() + - m[12].clone() * m[3].clone() * m[10].clone(); + + out[(2, 1)] = -m[0].clone() * m[6].clone() * m[15].clone() + + m[0].clone() * m[7].clone() * m[14].clone() + + m[4].clone() * m[2].clone() * m[15].clone() + - m[4].clone() * m[3].clone() * m[14].clone() + - m[12].clone() * m[2].clone() * m[7].clone() + + m[12].clone() * m[3].clone() * m[6].clone(); + + out[(3, 1)] = m[0].clone() * m[6].clone() * m[11].clone() + - m[0].clone() * m[7].clone() * m[10].clone() + - m[4].clone() * m[2].clone() * m[11].clone() + + m[4].clone() * m[3].clone() * m[10].clone() + + m[8].clone() * m[2].clone() * m[7].clone() + - m[8].clone() * m[3].clone() * m[6].clone(); + + out[(0, 2)] = cofactor02; + + out[(1, 2)] = -m[0].clone() * m[9].clone() * m[15].clone() + + m[0].clone() * m[11].clone() * m[13].clone() + + m[8].clone() * m[1].clone() * m[15].clone() + - m[8].clone() * m[3].clone() * m[13].clone() + - m[12].clone() * m[1].clone() * m[11].clone() + + m[12].clone() * m[3].clone() * m[9].clone(); + + out[(2, 2)] = m[0].clone() * m[5].clone() * m[15].clone() + - m[0].clone() * m[7].clone() * m[13].clone() + - m[4].clone() * m[1].clone() * m[15].clone() + + m[4].clone() * m[3].clone() * m[13].clone() + + m[12].clone() * m[1].clone() * m[7].clone() + - m[12].clone() * m[3].clone() * m[5].clone(); + + out[(0, 3)] = cofactor03; + + out[(3, 2)] = -m[0].clone() * m[5].clone() * m[11].clone() + + m[0].clone() * m[7].clone() * m[9].clone() + + m[4].clone() * m[1].clone() * m[11].clone() + - m[4].clone() * m[3].clone() * m[9].clone() + - m[8].clone() * m[1].clone() * m[7].clone() + + m[8].clone() * m[3].clone() * m[5].clone(); + + out[(1, 3)] = m[0].clone() * m[9].clone() * m[14].clone() + - m[0].clone() * m[10].clone() * m[13].clone() + - m[8].clone() * m[1].clone() * m[14].clone() + + m[8].clone() * m[2].clone() * m[13].clone() + + m[12].clone() * m[1].clone() * m[10].clone() + - m[12].clone() * m[2].clone() * m[9].clone(); + + out[(2, 3)] = -m[0].clone() * m[5].clone() * m[14].clone() + + m[0].clone() * m[6].clone() * m[13].clone() + + m[4].clone() * m[1].clone() * m[14].clone() + - m[4].clone() * m[2].clone() * m[13].clone() + - m[12].clone() * m[1].clone() * m[6].clone() + + m[12].clone() * m[2].clone() * m[5].clone(); + + out[(3, 3)] = m[0].clone() * m[5].clone() * m[10].clone() + - m[0].clone() * m[6].clone() * m[9].clone() + - m[4].clone() * m[1].clone() * m[10].clone() + + m[4].clone() * m[2].clone() * m[9].clone() + + m[8].clone() * m[1].clone() * m[6].clone() + - m[8].clone() * m[2].clone() * m[5].clone(); + + let inv_det = T::one() / det; + + for j in 0..4 { + for i in 0..4 { + out[(i, j)] *= inv_det.clone(); + } + } + true } From 5e8779957e891af468410716abc503ee3eef0b33 Mon Sep 17 00:00:00 2001 From: Jennifer Chukwu Date: Sun, 28 Apr 2024 16:02:46 +0000 Subject: [PATCH 4/8] missed one cofactor --- src/linalg/inverse.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/linalg/inverse.rs b/src/linalg/inverse.rs index 3d8e266e..0f6e6614 100644 --- a/src/linalg/inverse.rs +++ b/src/linalg/inverse.rs @@ -183,6 +183,13 @@ where } out[(0, 0)] = cofactor00; + out[(1, 0)] = -m[1].clone() * m[10].clone() * m[15].clone() + + m[1].clone() * m[11].clone() * m[14].clone() + + m[9].clone() * m[2].clone() * m[15].clone() + - m[9].clone() * m[3].clone() * m[14].clone() + - m[13].clone() * m[2].clone() * m[11].clone() + + m[13].clone() * m[3].clone() * m[10].clone(); + out[(2, 0)] = m[1].clone() * m[6].clone() * m[15].clone() - m[1].clone() * m[7].clone() * m[14].clone() - m[5].clone() * m[2].clone() * m[15].clone() From 825d0782944699c467de24fa2d666cf30fdb2d9e Mon Sep 17 00:00:00 2001 From: Jennifer Chukwu Date: Tue, 30 Apr 2024 16:25:35 +0000 Subject: [PATCH 5/8] add tests --- tests/core/matrix.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tests/core/matrix.rs b/tests/core/matrix.rs index 501a0566..62b2efb8 100644 --- a/tests/core/matrix.rs +++ b/tests/core/matrix.rs @@ -931,7 +931,7 @@ mod inversion_tests { use super::*; use crate::proptest::*; use na::Matrix1; - use proptest::{prop_assert, proptest}; + use proptest::{prop_assert, proptest, prop_assert_eq}; proptest! { #[test] @@ -970,6 +970,14 @@ mod inversion_tests { } } + #[test] + fn test_inversion_failure_leaves_matrix_unchanged(m in matrix4()) { + let original_matrix = m.clone(); + if m.try_inverse().is_none() { + prop_assert_eq!(m, original_matrix); + } + } + #[test] fn self_mul_inv_is_id_dim6(m in matrix6()) { if let Some(im) = m.try_inverse() { From e3a08c9b60f363708ff9d3d713cd70f290252fc2 Mon Sep 17 00:00:00 2001 From: Jennifer Chukwu Date: Thu, 2 May 2024 10:16:45 +0000 Subject: [PATCH 6/8] test with a fixed input --- tests/core/matrix.rs | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/tests/core/matrix.rs b/tests/core/matrix.rs index 62b2efb8..757fef98 100644 --- a/tests/core/matrix.rs +++ b/tests/core/matrix.rs @@ -931,7 +931,7 @@ mod inversion_tests { use super::*; use crate::proptest::*; use na::Matrix1; - use proptest::{prop_assert, proptest, prop_assert_eq}; + use proptest::{prop_assert, proptest}; proptest! { #[test] @@ -970,14 +970,6 @@ mod inversion_tests { } } - #[test] - fn test_inversion_failure_leaves_matrix_unchanged(m in matrix4()) { - let original_matrix = m.clone(); - if m.try_inverse().is_none() { - prop_assert_eq!(m, original_matrix); - } - } - #[test] fn self_mul_inv_is_id_dim6(m in matrix6()) { if let Some(im) = m.try_inverse() { @@ -1271,6 +1263,20 @@ fn column_iterator_double_ended_mut() { assert_eq!(col_iter_mut.next(), None); } +#[test] +fn test_inversion_failure_leaves_matrix_unchanged() { + let mut mat = na::Matrix4::new( + 1.0, 2.0, 3.0, 4.0, + 2.0, 4.0, 6.0, 8.0, + 3.0, 6.0, 9.0, 12.0, + 4.0, 8.0, 12.0, 16.0 + ); + let expected = mat.clone(); + if !mat.try_inverse_mut() { + assert_eq!(mat, expected); + } +} + #[test] #[cfg(feature = "rayon")] fn parallel_column_iteration() { From 914a7cf1fac798f9efe337b2e3ec391df2a77bfb Mon Sep 17 00:00:00 2001 From: Jennifer Chukwu Date: Thu, 2 May 2024 14:36:28 +0000 Subject: [PATCH 7/8] add assert --- tests/core/matrix.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tests/core/matrix.rs b/tests/core/matrix.rs index 757fef98..0ee41cf8 100644 --- a/tests/core/matrix.rs +++ b/tests/core/matrix.rs @@ -1264,7 +1264,7 @@ fn column_iterator_double_ended_mut() { } #[test] -fn test_inversion_failure_leaves_matrix_unchanged() { +fn test_inversion_failure_leaves_matrix4_unchanged() { let mut mat = na::Matrix4::new( 1.0, 2.0, 3.0, 4.0, 2.0, 4.0, 6.0, 8.0, @@ -1272,9 +1272,8 @@ fn test_inversion_failure_leaves_matrix_unchanged() { 4.0, 8.0, 12.0, 16.0 ); let expected = mat.clone(); - if !mat.try_inverse_mut() { - assert_eq!(mat, expected); - } + assert!(!mat.try_inverse_mut()); + assert_eq!(mat, expected); } #[test] From 343eb214ef749e862b32d7c5e712a097bf2cfd1a Mon Sep 17 00:00:00 2001 From: Jennifer Chukwu Date: Sun, 5 May 2024 09:39:20 +0000 Subject: [PATCH 8/8] format --- tests/core/matrix.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tests/core/matrix.rs b/tests/core/matrix.rs index 0ee41cf8..7aa551cd 100644 --- a/tests/core/matrix.rs +++ b/tests/core/matrix.rs @@ -1266,10 +1266,7 @@ fn column_iterator_double_ended_mut() { #[test] fn test_inversion_failure_leaves_matrix4_unchanged() { let mut mat = na::Matrix4::new( - 1.0, 2.0, 3.0, 4.0, - 2.0, 4.0, 6.0, 8.0, - 3.0, 6.0, 9.0, 12.0, - 4.0, 8.0, 12.0, 16.0 + 1.0, 2.0, 3.0, 4.0, 2.0, 4.0, 6.0, 8.0, 3.0, 6.0, 9.0, 12.0, 4.0, 8.0, 12.0, 16.0, ); let expected = mat.clone(); assert!(!mat.try_inverse_mut());