From d331bbd7c16f73a47541438f2989e20fa192402c Mon Sep 17 00:00:00 2001 From: Jennifer Chukwu Date: Fri, 19 Apr 2024 14:49:14 +0000 Subject: [PATCH] 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 } }