Phi2-Fine-Tuning
/
phivenv
/Lib
/site-packages
/sympy
/matrices
/expressions
/tests
/test_diagonal.py
| from sympy.matrices.expressions import MatrixSymbol | |
| from sympy.matrices.expressions.diagonal import DiagonalMatrix, DiagonalOf, DiagMatrix, diagonalize_vector | |
| from sympy.assumptions.ask import (Q, ask) | |
| from sympy.core.symbol import Symbol | |
| from sympy.functions.special.tensor_functions import KroneckerDelta | |
| from sympy.matrices.dense import Matrix | |
| from sympy.matrices.expressions.matmul import MatMul | |
| from sympy.matrices.expressions.special import Identity | |
| from sympy.testing.pytest import raises | |
| n = Symbol('n') | |
| m = Symbol('m') | |
| def test_DiagonalMatrix(): | |
| x = MatrixSymbol('x', n, m) | |
| D = DiagonalMatrix(x) | |
| assert D.diagonal_length is None | |
| assert D.shape == (n, m) | |
| x = MatrixSymbol('x', n, n) | |
| D = DiagonalMatrix(x) | |
| assert D.diagonal_length == n | |
| assert D.shape == (n, n) | |
| assert D[1, 2] == 0 | |
| assert D[1, 1] == x[1, 1] | |
| i = Symbol('i') | |
| j = Symbol('j') | |
| x = MatrixSymbol('x', 3, 3) | |
| ij = DiagonalMatrix(x)[i, j] | |
| assert ij != 0 | |
| assert ij.subs({i:0, j:0}) == x[0, 0] | |
| assert ij.subs({i:0, j:1}) == 0 | |
| assert ij.subs({i:1, j:1}) == x[1, 1] | |
| assert ask(Q.diagonal(D)) # affirm that D is diagonal | |
| x = MatrixSymbol('x', n, 3) | |
| D = DiagonalMatrix(x) | |
| assert D.diagonal_length == 3 | |
| assert D.shape == (n, 3) | |
| assert D[2, m] == KroneckerDelta(2, m)*x[2, m] | |
| assert D[3, m] == 0 | |
| raises(IndexError, lambda: D[m, 3]) | |
| x = MatrixSymbol('x', 3, n) | |
| D = DiagonalMatrix(x) | |
| assert D.diagonal_length == 3 | |
| assert D.shape == (3, n) | |
| assert D[m, 2] == KroneckerDelta(m, 2)*x[m, 2] | |
| assert D[m, 3] == 0 | |
| raises(IndexError, lambda: D[3, m]) | |
| x = MatrixSymbol('x', n, m) | |
| D = DiagonalMatrix(x) | |
| assert D.diagonal_length is None | |
| assert D.shape == (n, m) | |
| assert D[m, 4] != 0 | |
| x = MatrixSymbol('x', 3, 4) | |
| assert [DiagonalMatrix(x)[i] for i in range(12)] == [ | |
| x[0, 0], 0, 0, 0, 0, x[1, 1], 0, 0, 0, 0, x[2, 2], 0] | |
| # shape is retained, issue 12427 | |
| assert ( | |
| DiagonalMatrix(MatrixSymbol('x', 3, 4))* | |
| DiagonalMatrix(MatrixSymbol('x', 4, 2))).shape == (3, 2) | |
| def test_DiagonalOf(): | |
| x = MatrixSymbol('x', n, n) | |
| d = DiagonalOf(x) | |
| assert d.shape == (n, 1) | |
| assert d.diagonal_length == n | |
| assert d[2, 0] == d[2] == x[2, 2] | |
| x = MatrixSymbol('x', n, m) | |
| d = DiagonalOf(x) | |
| assert d.shape == (None, 1) | |
| assert d.diagonal_length is None | |
| assert d[2, 0] == d[2] == x[2, 2] | |
| d = DiagonalOf(MatrixSymbol('x', 4, 3)) | |
| assert d.shape == (3, 1) | |
| d = DiagonalOf(MatrixSymbol('x', n, 3)) | |
| assert d.shape == (3, 1) | |
| d = DiagonalOf(MatrixSymbol('x', 3, n)) | |
| assert d.shape == (3, 1) | |
| x = MatrixSymbol('x', n, m) | |
| assert [DiagonalOf(x)[i] for i in range(4)] ==[ | |
| x[0, 0], x[1, 1], x[2, 2], x[3, 3]] | |
| def test_DiagMatrix(): | |
| x = MatrixSymbol('x', n, 1) | |
| d = DiagMatrix(x) | |
| assert d.shape == (n, n) | |
| assert d[0, 1] == 0 | |
| assert d[0, 0] == x[0, 0] | |
| a = MatrixSymbol('a', 1, 1) | |
| d = diagonalize_vector(a) | |
| assert isinstance(d, MatrixSymbol) | |
| assert a == d | |
| assert diagonalize_vector(Identity(3)) == Identity(3) | |
| assert DiagMatrix(Identity(3)).doit() == Identity(3) | |
| assert isinstance(DiagMatrix(Identity(3)), DiagMatrix) | |
| # A diagonal matrix is equal to its transpose: | |
| assert DiagMatrix(x).T == DiagMatrix(x) | |
| assert diagonalize_vector(x.T) == DiagMatrix(x) | |
| dx = DiagMatrix(x) | |
| assert dx[0, 0] == x[0, 0] | |
| assert dx[1, 1] == x[1, 0] | |
| assert dx[0, 1] == 0 | |
| assert dx[0, m] == x[0, 0]*KroneckerDelta(0, m) | |
| z = MatrixSymbol('z', 1, n) | |
| dz = DiagMatrix(z) | |
| assert dz[0, 0] == z[0, 0] | |
| assert dz[1, 1] == z[0, 1] | |
| assert dz[0, 1] == 0 | |
| assert dz[0, m] == z[0, m]*KroneckerDelta(0, m) | |
| v = MatrixSymbol('v', 3, 1) | |
| dv = DiagMatrix(v) | |
| assert dv.as_explicit() == Matrix([ | |
| [v[0, 0], 0, 0], | |
| [0, v[1, 0], 0], | |
| [0, 0, v[2, 0]], | |
| ]) | |
| v = MatrixSymbol('v', 1, 3) | |
| dv = DiagMatrix(v) | |
| assert dv.as_explicit() == Matrix([ | |
| [v[0, 0], 0, 0], | |
| [0, v[0, 1], 0], | |
| [0, 0, v[0, 2]], | |
| ]) | |
| dv = DiagMatrix(3*v) | |
| assert dv.args == (3*v,) | |
| assert dv.doit() == 3*DiagMatrix(v) | |
| assert isinstance(dv.doit(), MatMul) | |
| a = MatrixSymbol("a", 3, 1).as_explicit() | |
| expr = DiagMatrix(a) | |
| result = Matrix([ | |
| [a[0, 0], 0, 0], | |
| [0, a[1, 0], 0], | |
| [0, 0, a[2, 0]], | |
| ]) | |
| assert expr.doit() == result | |
| expr = DiagMatrix(a.T) | |
| assert expr.doit() == result | |