o
    GZh@                     @   sx  d dl mZ d dlmZmZ d dlmZmZmZm	Z	m
Z
mZmZmZmZmZmZmZ d dlmZmZmZmZmZmZ d dlmZ d dlmZ d dlmZ d dlm Z  d d	l!m"Z"m#Z#m$Z$m%Z% d d
l&m'Z'm(Z(m)Z)m*Z* d dl+m,Z,m-Z- d dl.m/Z/m0Z0m1Z1 e-ddd\Z2Z3Z4Z5Z6Z7Z8ede7e7Z9ede7e7Z:ede7e7Z;ede7e7Z<ede7e7Z=ede7e7Z>e
e=e>ggZ?e
e=ge>ggZ@dd ZAdd ZBdd ZCdd ZDdd ZEd d! ZFd"d# ZGd$d% ZHd&d' ZId(d) ZJd*d+ ZKd,d- ZLd.d/ ZMd0d1 ZNed2d3 ZOd4d5 ZPd6d7 ZQd8d9 ZRd:d; ZSd<d= ZTd>d? ZUd@dA ZVdBdC ZWdDdE ZXdFdG ZYdHdI ZZdJdK Z[dLdM Z\dNdO Z]dPdQ Z^dRdS Z_dTS )U    )Trace)raisesslow)block_collapse	bc_matmulbc_block_plus_identBlockDiagMatrixBlockMatrixbc_dist	bc_mataddbc_transpose
bc_inverseblockcutreblock_2x2deblock)MatrixSymbolIdentitytracedet
ZeroMatrix	OneMatrix)Inverse)MatPow)	Transpose)NonInvertibleMatrixError)MatrixImmutableMatrixImmutableSparseMatrixzeros)TupleExprSFunction)Symbolsymbols)	transposeimrezi:n, pT)integerABCDGHc                   C   s@   t tt t t ttt t tt t  t ggksJ d S N)r   r.   b1b2r-   r	    r2   r2   `/var/www/auris/lib/python3.10/site-packages/sympy/matrices/expressions/tests/test_blockmatrix.pytest_bc_matmul   s   @r4   c                   C   s>   t tttggtttgg ttt tt ggksJ d S r/   )r   r	   r-   r.   r2   r2   r2   r3   test_bc_matadd    s   r5   c                   C   s@   t ttttgttggttjtjgtjtjggksJ d S r/   )r   r   r	   r)   r*   r+   r,   Tr2   r2   r2   r3   test_bc_transpose$   s   r7   c                  C   s^   t dtt} t dtt}t dtt}t| ||}t|| td|  d| d| s-J d S )Nr)   r*   r+      )r   nmlr   r
   equalsr)   r*   r+   Xr2   r2   r3   test_bc_dist_diag(   s
   .r?   c                  C   s   t dtt} t dtt}t dtt}t dtt}t| |g||gg}t dtt tt }t|ttt  | ttttt| | ksGJ d S )Nr)   r*   r+   r,   Z)r   r9   r:   r	   r   r   r   )r)   r*   r+   r,   r>   r@   r2   r2   r3   test_block_plus_ident0   s   rA   c                  C   s  t dtt} t dtt}t dtt}t dtt}t dtt t}t dtt tt }tt| |g||gg}|j|j	 |ks@J t dtt}t
| d|  | d|  ksVJ t d	tt}t
|j|  | |j|  | ksnJ |jtt tt fks{J |jd
ksJ t|tt| j|jg|j|jggksJ t|j|jd d d ksJ || jsJ ||jsJ || jtt tfksJ || jsJ ||jsJ || j|jksJ t dtd}t d	td}tt|g|gg}	||	 jtt dfksJ t
||	 jd | | ||  ksJ t
||	 jd || ||  ks'J t
t||	 tt
||	 ks:J t
t||	 d| t
||	 t
d| fksTJ t| gg}
t dg| jR  }t
|
| | | kspJ d S )Nr)   r*   r+   r,   MNEr8   Fr8   r8      )r   r   )rH   r   r@   )r   r9   r:   kr;   pr	   r   	__class__argsr   r6   shapeZ
blockshaper%   	is_MatMul	_blockmul	is_MatAdd	_blockaddblocksr   )r)   r*   r+   r,   rB   rC   r>   rD   rE   YZAbr@   r2   r2   r3   test_BlockMatrix:   sF    $,((&rT   c                  C   s\   t ddgddgg} tt| gg| ksJ tddgddgg} tt| gg| ks,J d S NrH   r8         )r   r   r	   r   r)   r2   r2   r3   %test_block_collapse_explicit_matricesk   s   rY   c                  C   s   t ddd} tdd}t| |g||gg}t|| t| d |g||ggks)J t|| | t| d |g||ggks?J d S )Nar8   rV   )r   r   r	   r   )rZ   zbr2   r2   r3   test_issue_17624r   s
   
(0r]   c                  C   s2   t g dg dg dg} | t t| ksJ d S )N)rH   r8   rV   )rW         )      	   )r   r   rX   r2   r2   r3   test_issue_18618y   s   rc   c                  C   sf   dd dD \} }}}t | |g||gg}t|t| t| ks#J tt tttgdks1J d S )Nc                 S      g | ]}t |d d qS rV   r   .0sr2   r2   r3   
<listcomp>~       z*test_BlockMatrix_trace.<locals>.<listcomp>ABCDr   )r	   r   r   r9   r)   r*   r+   r,   r>   r2   r2   r3   test_BlockMatrix_trace}   s    rn   c                  C   s   dd dD \} }}}t | |g||gg}ddlm} ddlm} |||  t|t| t|d ks:J W d    n1 sDw   Y  tt|t	sRJ tt | gt| ks_J tt t
ttgdksmJ d S )Nc                 S   rd   re   rf   rg   r2   r2   r3   rj      rk   z0test_BlockMatrix_Determinant.<locals>.<listcomp>rl   r   )Q)assumingr)   )r	   Zsympy.assumptions.askro   Zsympy.assumptions.assumerp   Z
invertibler   schur
isinstancer    r   r9   )r)   r*   r+   r,   r>   ro   rp   r2   r2   r3   test_BlockMatrix_Determinant   s   $ rs   c                  C   s,  t dtt} t dtt}t dtt}t dtt}t| |g||gg}t| gg}|js-J |ttt  }t|t| tt |g||tt ggksMJ |t dtt tt  js\J |t dtt tt  jskJ t|j	| j	ksuJ t
| ts~J |jrJ ttt|g||gg}|jrJ d S )Nr)   r*   r+   r,   ro   )r   r9   r:   r	   	is_squarer   r   rP   rN   Irr   inverser   Zis_Identity)r)   r*   r+   r,   r>   rS   ro   r@   r2   r2   r3   test_squareBlockMatrix   s$   
"
rw   c               	   C   sh  t dtt} t dttt }t dtt t}t dtt tt }t| |g||gg}|jr4|jttfks6J tt|j	t
s@J t dtt} t dtt}t dtt}ttt}t| |g||gg}t| t| j	| j	| |dj	 | | j	  | j	 | |dj	 g|dj	 | | j	 |dj	ggksJ t dtt} t dtt}ttt}t dtt}t| |g||gg}t| t|dj	 | |j	 |dj	g|j	|j	|  |dj	 | |j	  |j	 |  |dj	 ggksJ t dtt} ttt}t dtt}t dtt}t| |g||gg}t| t|j	 | |dj	 |j	|j	| |dj	 |  |j	  g|dj	|dj	 |  |j	 ggksUJ ttt} t dtt}t dtt}t dtt}t| |g||gg}t| t|dj	|dj	 | |j	 g|j	 | |dj	 |j	|j	| |dj	 | |j	  ggksJ d S Nr)   r*   r+   r,   )r   r9   r:   rI   r	   rt   rM   rr   r   ru   r   r   rv   rq   rm   r2   r2   r3   %test_BlockMatrix_2x2_inverse_symbolic   sV   
<"
"<
<"
"<ry   c                  C   s  t ddgddgg} t ddgddgg}t ddgddgg}t ddgddgg}| |   kr>|   kr>dksAJ  J ||  ||    kr]||    kr]dks`J  J t| |g||gg}t|  |  kszJ t|| g||gg}t|  |  ksJ t||g| |gg}t|  |  ksJ t||g|| gg}t|  |  ksJ dS )z>Test 2x2 block matrix inversion numerically for all 4 formulasrH   r8   rV   rW   rb      N)r   Zrankr	   r   invas_explicit)rB   ZD1ZD2ZD3Kr2   r2   r3   $test_BlockMatrix_2x2_inverse_numeric   s   2>   $r~   c                     sF   t ttf} ttt f t fdd| D }t|j}t|ts!J d S )Nc                    s   g | ]  fd dD qS )c                    s    g | ]}t d  |f  |qS )zM%s%srf   )rh   colsrowsr2   r3   rj      s     z<test_BlockMatrix_3x3_symbolic.<locals>.<listcomp>.<listcomp>r2   rh   colblocksizesr   r3   rj      s    z1test_BlockMatrix_3x3_symbolic.<locals>.<listcomp>)r9   r:   rI   r	   r   ru   rr   )rowblocksizesr}   Zcollapser2   r   r3   test_BlockMatrix_3x3_symbolic   s   


r   c                     s  t dtt t dttt dttt dtt t tt t } t t d d }jd ks9J jtt t tt t fksJJ t fdd	tdD s\J j	j
 ksfJ   fksqJ ttj ts}J t t     ksJ t t     ksJ t td  d d sJ t| t   d  d  ksJ t| td  d d
 ksJ d|   jsJ d|   jsJ | jsJ | js
J d S )Nr)   r*   r+   rB   r8   rV   )rH   rH   c                 3   sN    | ]"}t d D ]}||krj||f jnj||f  fv V  qqdS )rV   N)rangerR   Zis_ZeroMatrix)rh   ijr=   r2   r3   	<genexpr>  s    :z'test_BlockDiagMatrix.<locals>.<genexpr>rW   )r   r9   r:   r;   r   rR   rM   allr   rK   rL   Zget_diag_blocksrr   r   ru   r   r   r<   rN   rP   rO   rQ   )rB   rS   r2   r=   r3   test_BlockDiagMatrix  s.   "((*0(r   c                     s   t dtt t dtt} t | }|jtt tt fksJ |jtt tt fks+J |jttgks4J |jttgks=J t dttt dtt}t|}t	|| t  | | ks_J t	||j
 t j
 | |j
 kssJ tt fdd d S )Nr)   r*   r+   r,   c                      s   t  j S r/   )r   r6   rv   r2   r)   r+   r2   r3   <lambda>2  s    z0test_BlockDiagMatrix_nonsquare.<locals>.<lambda>)r   r9   r:   rI   r;   r   rM   r   r   r   r6   r   r   )r*   r>   r,   rS   r2   r   r3   test_BlockDiagMatrix_nonsquare%  s   

"(r   c                  C   s   t dtt} t dtt}tt dksJ tt| t| ks!J tt| |t| t| ks2J t dtt}t dtt}tt||dksIJ d S )Nr)   r*   rH   r+   r,   r   )r   r9   r:   r   r   r)   r*   r+   r,   r2   r2   r3    test_BlockDiagMatrix_determinant4  s   "r   c                  C   s   t t dks	J t ttttdksJ tdtt} t t| t | ks(J tdtt}t t| |t | t | ks?J tdtt}tdtt}tt t||tsWJ d S )Nr   r)   r*   r+   r,   )r   r   r   r9   r   r:   rr   r   r   r2   r2   r3   test_BlockDiagMatrix_trace@  s   "r   c                  C   sj   t dtt} t dtt}tt t ksJ tt| t| jks#J tt| |t| j|jks3J d S )Nr)   r*   )r   r9   r:   rI   r;   r%   r   r6   )r)   r*   r2   r2   r3   test_BlockDiagMatrix_transposeM  s
   $r   c                  C   s^   t ttgttg} t ttgttg}t| | t ttt gttt gks-J d S r/   )r   r   r   r   rI   r;   r   )Zbdm1Zbdm2r2   r2   r3   test_issue_2460T  s   2r   c                  C   s  t dtt} t| td td ftd td f}|t| d td d td f | d td td d f g| td d d td f | td d td d f ggksVJ tddtd}t|dd}|t|kslJ t|dd}t|jd tddggksJ d S )	Nr)   r8   rW   rz   rF   )rH   rV   )r   rH   rV   )r   r9   r:   r   r	   r   r   rR   )r)   r*   rB   r2   r2   r3   test_blockcutY  s   $:6$r   c                  C   sf   t dd tdD } | jjdksJ t| }|jjdksJ | j|jks'J |  | ks1J d S )Nc                    "   g | ]  fd dt dD qS )c                    s    g | ]}t d  |f ddqS )A_%d%dr8   rf   rh   r   r   r2   r3   rj   g      z/test_reblock_2x2.<locals>.<listcomp>.<listcomp>rV   r   r   r2   r   r3   rj   g  
    

z$test_reblock_2x2.<locals>.<listcomp>rV   )rV   rV   rF   )r	   r   rR   rM   r   r|   )r*   BBr2   r2   r3   test_reblock_2x2f  s   r   c                  C   s.   t dd tdD } tt| | ksJ d S )Nc                    r   )c                    s    g | ]}t d  |f ttqS )r   )r   r9   r   r   r2   r3   rj   s  r   z+test_deblock.<locals>.<listcomp>.<listcomp>rW   r   r   r2   r   r3   rj   s  r   z test_deblock.<locals>.<listcomp>rW   )r	   r   r   r   )r*   r2   r2   r3   test_deblockr  s   r   c                  C   s   t tdgtdg} t tdgtdg}| jjt ksJ t| | jt ks)J tt| jt ks4J tt| jt ks?J tt| jt ksJJ tt| jt ksUJ d S rU   )	r   r   r6   rK   r   r   r   r   r   )Zbm1Zbm2r2   r2   r3   test_block_collapse_typey  s   r   c                   C   s<   t tdd  t tdd  t tdd  t tdd  d S )Nc                   S   s   t tdtdggS )Nr8   r^   )r	   r   r2   r2   r2   r3   r         z+test_invalid_block_matrix.<locals>.<lambda>c                   S   s   t ttttggS r/   )r	   r   r9   r:   r2   r2   r2   r3   r     r   c                   S   s4   t ttttttgtttd tttd ggS NrH   r	   r   r9   r2   r2   r2   r3   r     s    c                   S   s4   t ttd ttttgttd ttttggS r   r   r2   r2   r2   r3   r     s    )r   
ValueErrorr2   r2   r2   r3   test_invalid_block_matrix  s   r   c                  C   s   t dtt} t dtt}t dtt}t dtt}t| |g||gg}| \}}}t|| | |ks5J | \}}}t|| | |ksHJ | \}}t|| |ksXJ d S rx   )r   r9   r:   r	   ZLDUdecompositionr   ZUDLdecompositionZLUdecomposition)r)   r*   r+   r,   r>   LUr2   r2   r3   test_block_lu_decomposition  s   r   c                  C   s   d} t | }t| | }t||||g||||g||||g||||gg}t| }t||||g||||g||||g| |||gg}||ksHJ d S )N
   )r   r   r	   r   r{   )r9   ru   Or)   ZAinvZAinvTr2   r2   r3   test_issue_21866  s   





r   c                  C   s   t d} tdd}tdd}t d}t| |g||gg}t| tj| g||gg}| t| tddgtdd|ggks?J t||ksGJ | t| tddgtj tdd |ggksaJ t|ttddtddgtddtddggks}J d S )NrV   r8   )	r   r   r   r	   r!   ZImaginaryUnitZadjointr'   r&   )r)   r*   r+   r,   r>   ZX2r2   r2   r3   !test_adjoint_and_special_matrices  s   

,4<r   c                     s   t d tdd fddtdD } t| d dd df | d ddf g| dd df | dd df gg}t| |   tddksJJ d S )NxrV   c                    s   g | ]}t d |  qS )rZ   )r"   )rh   r   r   r2   r3   rj     s    z0test_block_matrix_derivative.<locals>.<listcomp>rb   r8   )r$   r   r   r	   diffr   )r)   bcr2   r   r3   test_block_matrix_derivative  s   H*r   c                  C   s   t d} t| }t| | }t||g||gg}t|  |ks#J t|  |ks/J tt| dt|dks?J tt|d t|dksOJ d S )Nr9   )r#   r   r   r	   r   r%   rv   r   )r9   ru   r@   r)   r2   r2   r3   test_transpose_inverse_commute  s   
 $r   N)`Z sympy.matrices.expressions.tracer   Zsympy.testing.pytestr   r   Z&sympy.matrices.expressions.blockmatrixr   r   r   r   r	   r
   r   r   r   r   r   r   Zsympy.matrices.expressionsr   r   r   r   r   r   Z"sympy.matrices.expressions.inverser   Z!sympy.matrices.expressions.matpowr   Z$sympy.matrices.expressions.transposer   Zsympy.matrices.exceptionsr   Zsympy.matricesr   r   r   r   Z
sympy.corer   r    r!   r"   Zsympy.core.symbolr#   r$   Zsympy.functionsr%   r&   r'   r   r   rI   r;   r:   r9   rJ   r)   r*   r+   r,   r-   r.   r0   r1   r4   r5   r7   r?   rA   rT   rY   r]   rc   rn   rs   rw   ry   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r2   r2   r2   r3   <module>   sj    8 
16
 