From 38e4be1c12cb8d9380cec5fa76beef1a5ad3793b Mon Sep 17 00:00:00 2001 From: Elad Date: Fri, 9 Jun 2023 09:28:07 +0300 Subject: [PATCH 01/12] added diagonally dominant method --- toqito/matrix_props/is_diagonally_dominant.py | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 toqito/matrix_props/is_diagonally_dominant.py diff --git a/toqito/matrix_props/is_diagonally_dominant.py b/toqito/matrix_props/is_diagonally_dominant.py new file mode 100644 index 000000000..8c8545ac9 --- /dev/null +++ b/toqito/matrix_props/is_diagonally_dominant.py @@ -0,0 +1,61 @@ +"""Is matrix diagonally dominant.""" +import numpy as np +from toqito.matrix_props import is_square + + +def is_diagonally_dominant(mat: np.ndarray, is_strict=True) -> bool: + r""" + Check if matrix is diagnal dominant (DD) [WikPD]_. + + Examples + ========== + + Consider the following matrix + + .. math:: + A = \begin{pmatrix} + 2 & -1 & 0 \\ + 0 & 2 & -1 \\ + 0 & -1 & 2 + \end{pmatrix} + + our function indicates that this is indeed a diagonally dominant matrix. + + >>> from toqito.matrix_props import is_diagonally_dominant + >>> import numpy as np + >>> A = np.array([[2, -1, 0], [0, 2, -1], [0, -1, 2]]) + >>> is_diagonally_dominant(A) + True + + Alternatively, the following example matrix :math:`B` defined as + + .. math:: + B = \begin{pmatrix} + -1 & 2 \\ + -1 & -1 + \end{pmatrix} + + is not positive definite. + + >>> from toqito.matrix_props import is_positive_definite + >>> import numpy as np + >>> B = np.array([[-1, 2], [-1, -1]]) + >>> is_diagonally_dominant(B) + False + + References + ========== + .. [WikPD] Wikipedia: Definiteness of a matrix. + https://en.wikipedia.org/wiki/Diagonally_dominant_matrix + + :param mat: Matrix to check. + :param is_strict: Wether the inequlity is strict. + :return: Return :code:`True` if matrix is diagnally dominant, and :code:`False` otherwise. + """ + if not is_square(mat): + return False + + mat = np.abs(mat) + diag_coeffs = np.diag(mat) + row_sum = np.sum(mat, axis=1) - diag_coeffs + return np.all(diag_coeffs > row_sum) if is_strict else np.all(diag_coeffs >= row_sum) \ No newline at end of file From cf64c95a3ed19139c1cdb6bf25cffcd45fbb76b5 Mon Sep 17 00:00:00 2001 From: Elad Date: Fri, 9 Jun 2023 09:32:57 +0300 Subject: [PATCH 02/12] added diagonally dominant to docs/matrices --- docs/matrices.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/matrices.rst b/docs/matrices.rst index 1fba53db0..cc34c9138 100644 --- a/docs/matrices.rst +++ b/docs/matrices.rst @@ -63,3 +63,4 @@ Properties of Matrices and Vectors toqito.matrix_props.is_unitary toqito.matrix_props.majorizes toqito.matrix_props.sk_operator_norm + toqito.matrix_props.is_diagonally_dominant From d03d8256ae8535c643e861afc56367ae4cfae22c Mon Sep 17 00:00:00 2001 From: Elad Date: Fri, 9 Jun 2023 09:45:31 +0300 Subject: [PATCH 03/12] modified documentation in diagonally dominant --- toqito/matrix_props/is_diagonally_dominant.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/toqito/matrix_props/is_diagonally_dominant.py b/toqito/matrix_props/is_diagonally_dominant.py index 8c8545ac9..6848a45e0 100644 --- a/toqito/matrix_props/is_diagonally_dominant.py +++ b/toqito/matrix_props/is_diagonally_dominant.py @@ -5,12 +5,16 @@ def is_diagonally_dominant(mat: np.ndarray, is_strict=True) -> bool: r""" - Check if matrix is diagnal dominant (DD) [WikPD]_. + Check if matrix is diagnal dominant (DD) [WikDD]_. + + A matrix is diagonally dominant if the matrix is square + and if for every row of the matrix, the magnitude of the diagonal entry in a row is larger + than or equal to the sum of the magnitudes of all the other (non-diagonal) entries in that row. Examples ========== - Consider the following matrix + The following is an example of a 3-by-3 diagonal matrix: .. math:: A = \begin{pmatrix} @@ -35,7 +39,7 @@ def is_diagonally_dominant(mat: np.ndarray, is_strict=True) -> bool: -1 & -1 \end{pmatrix} - is not positive definite. + is not diagonally dominant. >>> from toqito.matrix_props import is_positive_definite >>> import numpy as np @@ -45,7 +49,7 @@ def is_diagonally_dominant(mat: np.ndarray, is_strict=True) -> bool: References ========== - .. [WikPD] Wikipedia: Definiteness of a matrix. + .. [WikDD] Wikipedia: Definiteness of a matrix. https://en.wikipedia.org/wiki/Diagonally_dominant_matrix :param mat: Matrix to check. @@ -58,4 +62,4 @@ def is_diagonally_dominant(mat: np.ndarray, is_strict=True) -> bool: mat = np.abs(mat) diag_coeffs = np.diag(mat) row_sum = np.sum(mat, axis=1) - diag_coeffs - return np.all(diag_coeffs > row_sum) if is_strict else np.all(diag_coeffs >= row_sum) \ No newline at end of file + return np.all(diag_coeffs > row_sum) if is_strict else np.all(diag_coeffs >= row_sum) From f0056197e477d8bb6d7dba30184c978248b56957 Mon Sep 17 00:00:00 2001 From: Elad Date: Fri, 9 Jun 2023 09:48:02 +0300 Subject: [PATCH 04/12] added diagonally dominant to __init__ --- toqito/matrix_props/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/toqito/matrix_props/__init__.py b/toqito/matrix_props/__init__.py index 46be4ec77..b4cf02a37 100644 --- a/toqito/matrix_props/__init__.py +++ b/toqito/matrix_props/__init__.py @@ -16,4 +16,5 @@ from toqito.matrix_props.majorizes import majorizes from toqito.matrix_props.sk_norm import sk_operator_norm from toqito.matrix_props.is_block_positive import is_block_positive -from toqito.matrix_props.is_orthonormal import is_orthonormal \ No newline at end of file +from toqito.matrix_props.is_orthonormal import is_orthonormal +from toqito.matrix_props.is_diagonally_dominant import is_diagonally_dominant From bcf4f9d0be4745ebacab4d2f68ad5199eb3fa892 Mon Sep 17 00:00:00 2001 From: Elad Date: Fri, 9 Jun 2023 10:08:41 +0300 Subject: [PATCH 05/12] modified example in is_diagonally_dominant --- toqito/matrix_props/is_diagonally_dominant.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/toqito/matrix_props/is_diagonally_dominant.py b/toqito/matrix_props/is_diagonally_dominant.py index 6848a45e0..55629a850 100644 --- a/toqito/matrix_props/is_diagonally_dominant.py +++ b/toqito/matrix_props/is_diagonally_dominant.py @@ -41,7 +41,7 @@ def is_diagonally_dominant(mat: np.ndarray, is_strict=True) -> bool: is not diagonally dominant. - >>> from toqito.matrix_props import is_positive_definite + >>> from toqito.matrix_props import is_diagonally_dominant >>> import numpy as np >>> B = np.array([[-1, 2], [-1, -1]]) >>> is_diagonally_dominant(B) From 8604e5ad3021438dadb2a3dfda737a916f6f038a Mon Sep 17 00:00:00 2001 From: Elad Date: Fri, 9 Jun 2023 10:09:02 +0300 Subject: [PATCH 06/12] added tests to diagonally dominant --- .../test_is_diagonally_dominant.py | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 tests/test_matrix_props/test_is_diagonally_dominant.py diff --git a/tests/test_matrix_props/test_is_diagonally_dominant.py b/tests/test_matrix_props/test_is_diagonally_dominant.py new file mode 100644 index 000000000..ef0c37a79 --- /dev/null +++ b/tests/test_matrix_props/test_is_diagonally_dominant.py @@ -0,0 +1,22 @@ +"""Test is_diagonally_dominant""" +import numpy as np + +from toqito.matrix_props import is_diagonally_dominant + +def test_is_diagonally_dominant(): + """Check that diagonally dominant matrix returns True.""" + mat = np.array([[2, -1, 0], [0, 2, -1], [0, -1, 2]]) + np.testing.assert_equal(is_diagonally_dominant(mat), True) + +def test_is_not_diagonally_dominant(): + """Check that diagonally dominant matrix returns False.""" + mat = np.array([[-1, 2], [-1, -1]]) + np.testing.assert_equal(is_diagonally_dominant(mat), False) + +def test_strict_diagonally_dominant(): + """Check that strict diagonally dominant matrix returns False.""" + mat = np.array([[-1, 1], [-1, -1]]) + np.testing.assert_equal(is_diagonally_dominant(mat), False) + +if __name__ == "__main__": + np.testing.run_module_suite() \ No newline at end of file From 28b3b042029be98645b9c9c82b1aa0db84334054 Mon Sep 17 00:00:00 2001 From: elads888 <77694201+elads888@users.noreply.github.com> Date: Sat, 10 Jun 2023 20:26:23 +0300 Subject: [PATCH 07/12] Update toqito/matrix_props/is_diagonally_dominant.py Co-authored-by: Vincent Russo --- toqito/matrix_props/is_diagonally_dominant.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/toqito/matrix_props/is_diagonally_dominant.py b/toqito/matrix_props/is_diagonally_dominant.py index 55629a850..ef6fd05e1 100644 --- a/toqito/matrix_props/is_diagonally_dominant.py +++ b/toqito/matrix_props/is_diagonally_dominant.py @@ -3,7 +3,7 @@ from toqito.matrix_props import is_square -def is_diagonally_dominant(mat: np.ndarray, is_strict=True) -> bool: +def is_diagonally_dominant(mat: np.ndarray, is_strict: bool = True) -> bool: r""" Check if matrix is diagnal dominant (DD) [WikDD]_. From 331174a8673ec8174df3668ad5f56408263adfc5 Mon Sep 17 00:00:00 2001 From: elads888 <77694201+elads888@users.noreply.github.com> Date: Sat, 10 Jun 2023 20:26:58 +0300 Subject: [PATCH 08/12] Update toqito/matrix_props/is_diagonally_dominant.py Co-authored-by: Vincent Russo --- toqito/matrix_props/is_diagonally_dominant.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/toqito/matrix_props/is_diagonally_dominant.py b/toqito/matrix_props/is_diagonally_dominant.py index ef6fd05e1..d56e45f61 100644 --- a/toqito/matrix_props/is_diagonally_dominant.py +++ b/toqito/matrix_props/is_diagonally_dominant.py @@ -49,7 +49,7 @@ def is_diagonally_dominant(mat: np.ndarray, is_strict: bool = True) -> bool: References ========== - .. [WikDD] Wikipedia: Definiteness of a matrix. + .. [WikDD] Wikipedia: Diagonally dominant matrix. https://en.wikipedia.org/wiki/Diagonally_dominant_matrix :param mat: Matrix to check. From 0999bcbf0662780f81a9e1934565e546729f509e Mon Sep 17 00:00:00 2001 From: Elad Date: Sun, 11 Jun 2023 08:54:25 +0300 Subject: [PATCH 09/12] added PR comments --- tests/test_matrix_props/test_is_diagonally_dominant.py | 8 ++++++-- toqito/matrix_props/is_diagonally_dominant.py | 8 ++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/tests/test_matrix_props/test_is_diagonally_dominant.py b/tests/test_matrix_props/test_is_diagonally_dominant.py index ef0c37a79..67d7e09ac 100644 --- a/tests/test_matrix_props/test_is_diagonally_dominant.py +++ b/tests/test_matrix_props/test_is_diagonally_dominant.py @@ -1,22 +1,26 @@ -"""Test is_diagonally_dominant""" +"""Test is_diagonally_dominant.""" import numpy as np from toqito.matrix_props import is_diagonally_dominant + def test_is_diagonally_dominant(): """Check that diagonally dominant matrix returns True.""" mat = np.array([[2, -1, 0], [0, 2, -1], [0, -1, 2]]) np.testing.assert_equal(is_diagonally_dominant(mat), True) + def test_is_not_diagonally_dominant(): """Check that diagonally dominant matrix returns False.""" mat = np.array([[-1, 2], [-1, -1]]) np.testing.assert_equal(is_diagonally_dominant(mat), False) + def test_strict_diagonally_dominant(): """Check that strict diagonally dominant matrix returns False.""" mat = np.array([[-1, 1], [-1, -1]]) np.testing.assert_equal(is_diagonally_dominant(mat), False) + if __name__ == "__main__": - np.testing.run_module_suite() \ No newline at end of file + np.testing.run_module_suite() diff --git a/toqito/matrix_props/is_diagonally_dominant.py b/toqito/matrix_props/is_diagonally_dominant.py index 55629a850..120053408 100644 --- a/toqito/matrix_props/is_diagonally_dominant.py +++ b/toqito/matrix_props/is_diagonally_dominant.py @@ -3,12 +3,12 @@ from toqito.matrix_props import is_square -def is_diagonally_dominant(mat: np.ndarray, is_strict=True) -> bool: +def is_diagonally_dominant(mat: np.ndarray, is_strict: bool = True) -> bool: r""" Check if matrix is diagnal dominant (DD) [WikDD]_. A matrix is diagonally dominant if the matrix is square - and if for every row of the matrix, the magnitude of the diagonal entry in a row is larger + and if for every row of the matrix, the magnitude of the diagonal entry in a row is greater than or equal to the sum of the magnitudes of all the other (non-diagonal) entries in that row. Examples @@ -49,11 +49,11 @@ def is_diagonally_dominant(mat: np.ndarray, is_strict=True) -> bool: References ========== - .. [WikDD] Wikipedia: Definiteness of a matrix. + .. [WikDD] Wikipedia: Diagonally dominant matrix. https://en.wikipedia.org/wiki/Diagonally_dominant_matrix :param mat: Matrix to check. - :param is_strict: Wether the inequlity is strict. + :param is_strict: Whether the inequality is strict. :return: Return :code:`True` if matrix is diagnally dominant, and :code:`False` otherwise. """ if not is_square(mat): From 082cc547d31b014fadba3d318745b92be56b6b1b Mon Sep 17 00:00:00 2001 From: Elad Date: Sun, 11 Jun 2023 09:12:41 +0300 Subject: [PATCH 10/12] resolved merge conflict --- docs/matrices.rst | 66 ----------------------------------------------- 1 file changed, 66 deletions(-) delete mode 100644 docs/matrices.rst diff --git a/docs/matrices.rst b/docs/matrices.rst deleted file mode 100644 index cc34c9138..000000000 --- a/docs/matrices.rst +++ /dev/null @@ -1,66 +0,0 @@ -Linear Algebra -============== - -A number of linear algebra-related functions. - -Matrices ------------ - -.. toctree:: - -.. autosummary:: - :toctree: _autosummary - - toqito.matrices.clock - toqito.matrices.cnot - toqito.matrices.fourier - toqito.matrices.gell_mann - toqito.matrices.gen_gell_mann - toqito.matrices.gen_pauli - toqito.matrices.hadamard - toqito.matrices.iden - toqito.matrices.pauli - toqito.matrices.shift - toqito.matrices.standard_basis - -Operations on Matrices and Vectors ----------------------------------- - -.. toctree:: - -.. autosummary:: - :toctree: _autosummary - - toqito.matrix_ops.tensor - toqito.matrix_ops.unvec - toqito.matrix_ops.vec - toqito.matrix_ops.inner_product - toqito.matrix_ops.outer_product - -Properties of Matrices and Vectors ----------------------------------- - -.. toctree:: - -.. autosummary:: - :toctree: _autosummary - - toqito.matrix_props.is_block_positive - toqito.matrix_props.is_commuting - toqito.matrix_props.is_density - toqito.matrix_props.is_diagonal - toqito.matrix_props.is_hermitian - toqito.matrix_props.is_identity - toqito.matrix_props.is_idempotent - toqito.matrix_props.is_normal - toqito.matrix_props.is_orthonormal - toqito.matrix_props.is_permutation - toqito.matrix_props.is_positive_definite - toqito.matrix_props.is_projection - toqito.matrix_props.is_positive_semidefinite - toqito.matrix_props.is_square - toqito.matrix_props.is_symmetric - toqito.matrix_props.is_unitary - toqito.matrix_props.majorizes - toqito.matrix_props.sk_operator_norm - toqito.matrix_props.is_diagonally_dominant From c2fa4e9ac73a4aa88b144453062bc9b997811a2c Mon Sep 17 00:00:00 2001 From: Elad Date: Sun, 11 Jun 2023 09:18:16 +0300 Subject: [PATCH 11/12] matrices.rst changes --- docs/matrices.rst | 66 ----------------------------------------------- 1 file changed, 66 deletions(-) delete mode 100644 docs/matrices.rst diff --git a/docs/matrices.rst b/docs/matrices.rst deleted file mode 100644 index cc34c9138..000000000 --- a/docs/matrices.rst +++ /dev/null @@ -1,66 +0,0 @@ -Linear Algebra -============== - -A number of linear algebra-related functions. - -Matrices ------------ - -.. toctree:: - -.. autosummary:: - :toctree: _autosummary - - toqito.matrices.clock - toqito.matrices.cnot - toqito.matrices.fourier - toqito.matrices.gell_mann - toqito.matrices.gen_gell_mann - toqito.matrices.gen_pauli - toqito.matrices.hadamard - toqito.matrices.iden - toqito.matrices.pauli - toqito.matrices.shift - toqito.matrices.standard_basis - -Operations on Matrices and Vectors ----------------------------------- - -.. toctree:: - -.. autosummary:: - :toctree: _autosummary - - toqito.matrix_ops.tensor - toqito.matrix_ops.unvec - toqito.matrix_ops.vec - toqito.matrix_ops.inner_product - toqito.matrix_ops.outer_product - -Properties of Matrices and Vectors ----------------------------------- - -.. toctree:: - -.. autosummary:: - :toctree: _autosummary - - toqito.matrix_props.is_block_positive - toqito.matrix_props.is_commuting - toqito.matrix_props.is_density - toqito.matrix_props.is_diagonal - toqito.matrix_props.is_hermitian - toqito.matrix_props.is_identity - toqito.matrix_props.is_idempotent - toqito.matrix_props.is_normal - toqito.matrix_props.is_orthonormal - toqito.matrix_props.is_permutation - toqito.matrix_props.is_positive_definite - toqito.matrix_props.is_projection - toqito.matrix_props.is_positive_semidefinite - toqito.matrix_props.is_square - toqito.matrix_props.is_symmetric - toqito.matrix_props.is_unitary - toqito.matrix_props.majorizes - toqito.matrix_props.sk_operator_norm - toqito.matrix_props.is_diagonally_dominant From 4a1d71097bcd8eb4b00e70af3607550a0ff853fd Mon Sep 17 00:00:00 2001 From: Elad Date: Tue, 13 Jun 2023 14:56:14 +0300 Subject: [PATCH 12/12] added new tests to diagonally dominant --- .../test_is_diagonally_dominant.py | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/tests/test_matrix_props/test_is_diagonally_dominant.py b/tests/test_matrix_props/test_is_diagonally_dominant.py index 67d7e09ac..a4f044d1f 100644 --- a/tests/test_matrix_props/test_is_diagonally_dominant.py +++ b/tests/test_matrix_props/test_is_diagonally_dominant.py @@ -4,10 +4,28 @@ from toqito.matrix_props import is_diagonally_dominant -def test_is_diagonally_dominant(): - """Check that diagonally dominant matrix returns True.""" - mat = np.array([[2, -1, 0], [0, 2, -1], [0, -1, 2]]) - np.testing.assert_equal(is_diagonally_dominant(mat), True) +def test_is_not_square(): + """Test that non-square matrix returns False.""" + mat = np.array([[1, 2, 3], [4, 5, 6]]) + np.testing.assert_equal(is_diagonally_dominant(mat), False) + + +def test_diagonally_dominant(): + """Check that strict diagonally dominance. + + Matrix examples from: https://en.wikipedia.org/wiki/Diagonally_dominant_matrix + """ + # Diagonally dominant (but not strict) + mat = np.array([[3, -2, 1], [1, 3, 2], [-1, 2, 4]]) + np.testing.assert_equal(is_diagonally_dominant(mat, is_strict=False), True) + + # Non-diagonally dominant + mat = np.array([[-2, 2, 1], [1, 3, 2], [1, -2, 0]]) + np.testing.assert_equal(is_diagonally_dominant(mat), False) + + # Strictly diagonally dominant + mat = np.array([[-4, 2, 1], [1, 6, 2], [1, -2, 5]]) + np.testing.assert_equal(is_diagonally_dominant(mat, is_strict=True), True) def test_is_not_diagonally_dominant():