From acd8a92154c3b86092fd73d73ed9a9fd3120d940 Mon Sep 17 00:00:00 2001 From: AdityaSavara <39929571+AdityaSavara@users.noreply.github.com> Date: Tue, 11 Feb 2020 01:33:13 -0500 Subject: [PATCH 1/3] Removing unumpy.py core dependency on matrices Changed "asmatrix" to "asarray" Changed * to @ Passed unit tests on my computer except for the lib2to3 unit test since I do not have that module. --- uncertainties/unumpy/core.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/uncertainties/unumpy/core.py b/uncertainties/unumpy/core.py index e24a1d10..fb193ebc 100644 --- a/uncertainties/unumpy/core.py +++ b/uncertainties/unumpy/core.py @@ -462,12 +462,12 @@ def inv_with_derivatives(arr, input_type, derivatives): yield inverse # It is mathematically convenient to work with matrices: - inverse_mat = numpy.asmatrix(inverse) + inverse_mat = numpy.asarray(inverse) # Successive derivatives of the inverse: for derivative in derivatives: - derivative_mat = numpy.asmatrix(derivative) - yield -inverse_mat * derivative_mat * inverse_mat + derivative_mat = numpy.asarray(derivative) + yield -inverse_mat @ derivative_mat @ inverse_mat inv = func_with_deriv_to_uncert_func(inv_with_derivatives) inv.__doc__ = """\ @@ -504,7 +504,7 @@ def pinv_with_derivatives(arr, input_type, derivatives, rcond): yield inverse # It is mathematically convenient to work with matrices: - inverse_mat = numpy.asmatrix(inverse) + inverse_mat = numpy.asarray(inverse) # Formula (4.12) from The Differentiation of Pseudo-Inverses and # Nonlinear Least Squares Problems Whose Variables @@ -516,20 +516,20 @@ def pinv_with_derivatives(arr, input_type, derivatives, rcond): # http://mathoverflow.net/questions/25778/analytical-formula-for-numerical-derivative-of-the-matrix-pseudo-inverse # Shortcuts. All the following factors should be numpy.matrix objects: - PA = arr*inverse_mat - AP = inverse_mat*arr - factor21 = inverse_mat*inverse_mat.H + PA = arr@inverse_mat + AP = inverse_mat@arr + factor21 = inverse_mat@numpy.transpose(inverse_mat) factor22 = numpy.eye(arr.shape[0])-PA factor31 = numpy.eye(arr.shape[1])-AP - factor32 = inverse_mat.H*inverse_mat + factor32 = numpy.transpose(inverse_mat)@inverse_mat # Successive derivatives of the inverse: for derivative in derivatives: - derivative_mat = numpy.asmatrix(derivative) - term1 = -inverse_mat*derivative_mat*inverse_mat - derivative_mat_H = derivative_mat.H - term2 = factor21*derivative_mat_H*factor22 - term3 = factor31*derivative_mat_H*factor32 + derivative_mat = numpy.asarray(derivative) + term1 = -inverse_mat@derivative_mat@inverse_mat + derivative_mat_H = numpy.transpose(derivative_mat) + term2 = factor21@derivative_mat_H@factor22 + term3 = factor31@derivative_mat_H@factor32 yield term1+term2+term3 # Default rcond argument for the generalization of numpy.linalg.pinv: From 3e44594e1dc0cc7e46b928f9622c798c46ddf6a5 Mon Sep 17 00:00:00 2001 From: AdityaSavara <39929571+AdityaSavara@users.noreply.github.com> Date: Tue, 11 Feb 2020 01:51:42 -0500 Subject: [PATCH 2/3] Adding .conj() for non-real numbers. The transpose() function was used to replace .H, but that only works for real numbers. So a .conj() call has been placed prior to the transpose call. --- uncertainties/unumpy/core.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/uncertainties/unumpy/core.py b/uncertainties/unumpy/core.py index fb193ebc..39c4359c 100644 --- a/uncertainties/unumpy/core.py +++ b/uncertainties/unumpy/core.py @@ -518,16 +518,16 @@ def pinv_with_derivatives(arr, input_type, derivatives, rcond): # Shortcuts. All the following factors should be numpy.matrix objects: PA = arr@inverse_mat AP = inverse_mat@arr - factor21 = inverse_mat@numpy.transpose(inverse_mat) + factor21 = inverse_mat@numpy.transpose(inverse_mat.conj()) factor22 = numpy.eye(arr.shape[0])-PA factor31 = numpy.eye(arr.shape[1])-AP - factor32 = numpy.transpose(inverse_mat)@inverse_mat + factor32 = numpy.transpose(inverse_mat.conj())@inverse_mat # Successive derivatives of the inverse: for derivative in derivatives: derivative_mat = numpy.asarray(derivative) term1 = -inverse_mat@derivative_mat@inverse_mat - derivative_mat_H = numpy.transpose(derivative_mat) + derivative_mat_H = numpy.transpose(derivative_mat.conj()) term2 = factor21@derivative_mat_H@factor22 term3 = factor31@derivative_mat_H@factor32 yield term1+term2+term3 From 7fbe4713eb6088d53860a26f37f354f313800f5e Mon Sep 17 00:00:00 2001 From: AdityaSavara <39929571+AdityaSavara@users.noreply.github.com> Date: Tue, 11 Feb 2020 02:02:21 -0500 Subject: [PATCH 3/3] Changing some of the comments to help save time Of course these edits do not need to be accepted. However, old comments were deprecated. --- uncertainties/unumpy/core.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/uncertainties/unumpy/core.py b/uncertainties/unumpy/core.py index 39c4359c..9c6de52e 100644 --- a/uncertainties/unumpy/core.py +++ b/uncertainties/unumpy/core.py @@ -503,7 +503,7 @@ def pinv_with_derivatives(arr, input_type, derivatives, rcond): inverse = inverse.view(numpy.matrix) yield inverse - # It is mathematically convenient to work with matrices: + # Numpy arrays will allow matrix multiplication with the @ operator: inverse_mat = numpy.asarray(inverse) # Formula (4.12) from The Differentiation of Pseudo-Inverses and @@ -515,7 +515,7 @@ def pinv_with_derivatives(arr, input_type, derivatives, rcond): # See also # http://mathoverflow.net/questions/25778/analytical-formula-for-numerical-derivative-of-the-matrix-pseudo-inverse - # Shortcuts. All the following factors should be numpy.matrix objects: + # Shortcuts. The @ operator is used for matrix multiplication of the factors: PA = arr@inverse_mat AP = inverse_mat@arr factor21 = inverse_mat@numpy.transpose(inverse_mat.conj())