a
    kh@                     @   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.9/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| sZJ 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sJ 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sJ t dtt}t
| d|  | d|  ksJ t d	tt}t
|j|  | |j|  | ksJ |jtt tt fksJ |jd
ksJ t|tt| j|jg|j|jggks4J t|j|jd d d ksTJ || jsdJ ||jsvJ || 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sJ t
||	 jd | | ||  ks:J t
||	 jd || ||  ksbJ t
t||	 tt
||	 ksJ t
t||	 d| t
||	 t
d| fksJ t| gg}
t dg| jR  }t
|
| | | ksJ 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sXJ 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sRJ 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
    
(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sFJ tt tttgdksbJ d S )Nc                 S   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    rm   c                  C   s   dd dD \} }}}t | |g||gg}ddlm} ddlm} ||| 2 t|t| t|d kstJ W d    n1 s0    Y  tt|t	sJ tt | gt| ksJ tt t
ttgdksJ d S )Nc                 S   s   g | ]}t |d d qS rd   re   rf   r2   r2   r3   ri      rj   z0test_BlockMatrix_Determinant.<locals>.<listcomp>rk   r   )Q)assumingr)   )r	   Zsympy.assumptions.askrn   Zsympy.assumptions.assumero   Z
invertibler   schur
isinstancer    r   r9   )r)   r*   r+   r,   r>   rn   ro   r2   r2   r3   test_BlockMatrix_Determinant   s    @rr   c                  C   s0  t dtt} t dtt}t dtt}t dtt}t| |g||gg}t| gg}|jsZJ |ttt  }t|t| tt |g||tt ggksJ |t dtt tt  jsJ |t dtt tt  jsJ t|j	| j	ksJ t
| tsJ |jrJ ttt|g||gg}|jr,J d S )Nr)   r*   r+   r,   rn   )r   r9   r:   r	   	is_squarer   r   rP   rN   Irq   inverser   Zis_Identity)r)   r*   r+   r,   r>   rS   rn   r@   r2   r2   r3   test_squareBlockMatrix   s$    
"rv   c               	   C   sl  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rh|jttfkslJ tt|j	t
sJ 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s:J 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sJ 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shJ d S Nr)   r*   r+   r,   )r   r9   r:   rI   r	   rs   rM   rq   r   rt   r   r   ru   rp   rl   r2   r2   r3   %test_BlockMatrix_2x2_inverse_symbolic   sV    
<"
"<
<"
"<rx   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rz|   krzdksn J ||  ||    kr||    krdksn J t| |g||gg}t|  |  ksJ t|| g||gg}t|  |  ks&J t||g| |gg}t|  |  ks\J 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    0< ""r}   c                     sF   t ttf} ttt f t fdd| D }t|j}t|tsBJ d S )Nc                    s   g | ]  fd dD qS )c                    s    g | ]}t d  |f  |qS )zM%s%sre   )rg   colsrowsr2   r3   ri      rj   z<test_BlockMatrix_3x3_symbolic.<locals>.<listcomp>.<listcomp>r2   rg   colblocksizesr   r3   ri      s   z1test_BlockMatrix_3x3_symbolic.<locals>.<listcomp>)r9   r:   rI   r	   r   rt   rq   )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srJ jtt t tt t fksJ t fdd	tdD sJ j	j
 ksJ   fksJ ttj tsJ t t     ks$J t t     ksNJ t td  d d szJ 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   sL   | ]D}t d D ]6}||kr*j||f jnj||f  fv V  qqdS )rV   N)rangerR   Zis_ZeroMatrix)rg   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_blocksrq   r   rt   r   r   r<   rN   rP   rO   rQ   )rB   rS   r2   r=   r3   test_BlockDiagMatrix  s.    "**,2*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sVJ |jttgkshJ |jttgkszJ t dttt dtt}t|}t	|| t  | | ksJ t	||j
 t j
 | |j
 ksJ tt fdd d S )Nr)   r*   r+   r,   c                      s   t  j S r/   )r   r6   ru   r2   r)   r+   r2   r3   <lambda>2  rj   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sBJ tt| |t| t| ksdJ t dtt}t dtt}tt||dksJ 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sPJ tdtt}t t| |t | t | ks~J tdtt}tdtt}tt t||tsJ d S )Nr   r)   r*   r+   r,   )r   r   r   r9   r   r:   rq   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sFJ tt| |t| j|jksfJ 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sZJ d S r/   )r   r   r   r   rI   r;   r   )Zbdm1Zbdm2r2   r2   r3   test_issue_2460T  s    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sJ tddtd}t|dd}|t|ksJ t|dd}t|jd tddggksJ d S )	Nr)   r8   rW   ry   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sNJ |  | ksbJ d S )Nc                    s"   g | ]  fd dt dD qS )c                    s    g | ]}t d  |f ddqS )A_%d%dr8   re   rg   r   r   r2   r3   ri   g  s   z/test_reblock_2x2.<locals>.<listcomp>.<listcomp>rV   r   r   r2   r   r3   ri   g  s   
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                    s"   g | ]  fd dt dD qS )c                    s    g | ]}t d  |f ttqS )r   )r   r9   r   r   r2   r3   ri   s  s   z+test_deblock.<locals>.<listcomp>.<listcomp>rW   r   r   r2   r   r3   ri   s  s   
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sRJ tt| jt kshJ tt| jt ks~J tt| jt ksJ tt| jt ksJ 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     s   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     s   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sjJ | \}}}t|| | |ksJ | \}}t|| |ksJ d S rw   )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sJ d S )N
   )r   r   r	   r   rz   )r9   rt   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sJ | t| tddgtj tdd |ggksJ t|ttddtddgtddtddggksJ 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sJ d S )NxrV   c                    s   g | ]}t d |  qS )rZ   )r"   )rg   r   r   r2   r3   ri     rj   z0test_block_matrix_derivative.<locals>.<listcomp>rb   r8   )r$   r   r   r	   diffr   )r)   Zbcr2   r   r3   test_block_matrix_derivative  s    Hr   c                  C   s   t d} t| }t| | }t||g||gg}t|  |ksFJ t|  |ks^J tt| dt|dks~J tt|d t|dksJ d S )Nr9   )r#   r   r   r	   r   r%   ru   r   )r9   rt   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   rm   rr   rv   rx   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r2   r2   r2   r3   <module>   sh   8 
16
 