o
    *ήcO=                     @   s8  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mZmZ d dlmZ d dlmZmZm Z  d dl!m"Z"m#Z#m$Z$m%Z% d dl&m'Z'm(Z(m)Z) e#d	d
d\Z*Z+Z,Z-Z.Z/Z0ede/e/Z1ede/e/Z2ede/e/Z3ede/e/Z4ede/e/Z5ede/e/Z6e
e5e6ggZ7e
e5ge6ggZ8dd Z9dd Z:dd Z;dd Z<dd Z=dd Z>dd Z?d d! Z@d"d# ZAd$d% ZBd&d' ZCd(d) ZDd*d+ ZEd,d- ZFed.d/ ZGd0d1 ZHd2d3 ZId4d5 ZJd6d7 ZKd8d9 ZLd:d; ZMd<d= ZNd>d? ZOd@dA ZPdBdC ZQdDdE ZRdFdG ZSdHdI ZTdJdK ZUdLS )M    )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Inversetrace	Transposedet
ZeroMatrix	OneMatrix)NonInvertibleMatrixError)MatrixImmutableMatrixImmutableSparseMatrix)TuplesymbolsExprS)	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	    r.   r.   X/tmp/pip-target-vg8gfxp4/lib/python/sympy/matrices/expressions/tests/test_blockmatrix.pytest_bc_matmul   s   @r0   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*   r.   r.   r.   r/   test_bc_matadd   s   r1   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(   Tr.   r.   r.   r/   test_bc_transpose    s   r3   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'   Xr.   r.   r/   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   r5   r6   r	   r   r   r   )r%   r&   r'   r(   r:   r<   r.   r.   r/   test_block_plus_ident,   s   r=   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Er4   Fr4   r4      )r   r   )rD   r   r<   )r   r5   r6   kr7   pr	   r   	__class__argsr   r2   shape
blockshaper!   	is_MatMul	_blockmul	is_MatAdd	_blockaddblocksr   )r%   r&   r'   r(   r>   r?   r:   r@   rA   YAbr<   r.   r.   r/   test_BlockMatrix6   sF    $,((&rR   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 NrD   r4         )r   r   r	   r   r%   r.   r.   r/   %test_block_collapse_explicit_matricesg   s   rW   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ar4   rT   )r   r   r	   r   )rX   zbr.   r.   r/   test_issue_17624n   s
   
(0r[   c                  C   s2   t g dg dg dg} | t t| ksJ d S )N)rD   r4   rT   )rU         )      	   )r   r   rV   r.   r.   r/   test_issue_18618u   s   ra   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 rT   r   .0sr.   r.   r/   
<listcomp>z       z*test_BlockMatrix_trace.<locals>.<listcomp>ABCDr   )r	   r   r   r5   r%   r&   r'   r(   r:   r.   r.   r/   test_BlockMatrix_tracey   s    rl   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   rb   rc   rd   re   r.   r.   r/   rh      ri   z0test_BlockMatrix_Determinant.<locals>.<listcomp>rj   r   )Q)assumingr%   )r	   sympy.assumptions.askrm   sympy.assumptions.assumern   
invertibler   schur
isinstancer   r   r5   )r%   r&   r'   r(   r:   rm   rn   r.   r.   r/   test_BlockMatrix_Determinant   s   $ rt   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(   rm   )r   r5   r6   r	   	is_squarer   r   rM   rK   Irs   inverser   is_Identity)r%   r&   r'   r(   r:   rP   rm   r<   r.   r.   r/   test_squareBlockMatrix   s$   
"
ry   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   r5   r6   rE   r	   ru   rI   rs   r   rv   r   r   rw   rr   rk   r.   r.   r/   %test_BlockMatrix_2x2_inverse_symbolic   sV   
<"
"<
<"
"<r{   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 formulasrD   r4   rT   rU   r`      N)r   rankr	   r   invas_explicit)r>   D1D2D3Kr.   r.   r/   $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%srd   )rf   colsrowsr.   r/   rh      s     z<test_BlockMatrix_3x3_symbolic.<locals>.<listcomp>.<listcomp>r.   rf   colblocksizesr   r/   rh      s    z1test_BlockMatrix_3x3_symbolic.<locals>.<listcomp>)r5   r6   rE   r	   r   rv   rs   )rowblocksizesr   collapser.   r   r/   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'   r>   r4   rT   )rD   rD   c                 3   sN    | ]"}t d D ]}||krj||f jnj||f  fv V  qqdS )rT   N)rangerO   is_ZeroMatrix)rf   ijr9   r.   r/   	<genexpr>  s    :z'test_BlockDiagMatrix.<locals>.<genexpr>rU   )r   r5   r6   r7   r   rO   rI   allr   rG   rH   get_diag_blocksrs   r   rv   r   r   r8   rK   rM   rL   rN   )r>   rP   r.   r9   r/   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   r2   rw   r.   r%   r'   r.   r/   <lambda>.  s    z0test_BlockDiagMatrix_nonsquare.<locals>.<lambda>)r   r5   r6   rE   r7   r   rI   r   r   r   r2   r   r   )r&   r:   r(   rP   r.   r   r/   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&   rD   r'   r(   r   )r   r5   r6   r   r   r%   r&   r'   r(   r.   r.   r/    test_BlockDiagMatrix_determinant0  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   r5   r   r6   rs   r   r   r.   r.   r/   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   r5   r6   rE   r7   r!   r   r2   )r%   r&   r.   r.   r/   test_BlockDiagMatrix_transposeI  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   rE   r7   r   )bdm1bdm2r.   r.   r/   test_issue_2460P  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%   r4   rU   r|   rB   )rD   rT   )r   rD   rT   )r   r5   r6   r   r	   r   r   rO   )r%   r&   r>   r.   r.   r/   test_blockcutU  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%dr4   rd   rf   r   r   r.   r/   rh   c      z/test_reblock_2x2.<locals>.<listcomp>.<listcomp>rT   r   r   r.   r   r/   rh   c  
    

z$test_reblock_2x2.<locals>.<listcomp>rT   )rT   rT   rB   )r	   r   rO   rI   r   r   )r&   BBr.   r.   r/   test_reblock_2x2b  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   r5   r   r   r.   r/   rh   o  r   z+test_deblock.<locals>.<listcomp>.<listcomp>rU   r   r   r.   r   r/   rh   o  r   z test_deblock.<locals>.<listcomp>rU   )r	   r   r   r   )r&   r.   r.   r/   test_deblockn  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 rS   )	r   r   r2   rG   r   r   r   r   r   )bm1bm2r.   r.   r/   test_block_collapse_typeu  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 )Nr4   r\   )r	   r   r.   r.   r.   r/   r         z+test_invalid_block_matrix.<locals>.<lambda>c                   S   s   t ttttggS r+   )r	   r   r5   r6   r.   r.   r.   r/   r     r   c                   S   s4   t ttttttgtttd tttd ggS NrD   r	   r   r5   r.   r.   r.   r/   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   r.   r.   r.   r/   r     s    )r   
ValueErrorr.   r.   r.   r/   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 rz   )r   r5   r6   r	   LDUdecompositionr   UDLdecompositionLUdecomposition)r%   r&   r'   r(   r:   LUr.   r.   r/   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~   )r5   rv   Or%   AinvAinvTr.   r.   r/   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 )NrT   r4   )	r   r   r   r	   r    ImaginaryUnitadjointr#   r"   )r%   r&   r'   r(   r:   X2r.   r.   r/   !test_adjoint_and_special_matrices  s   

,4<r   N)V sympy.matrices.expressions.tracer   sympy.testing.pytestr   r   &sympy.matrices.expressions.blockmatrixr   r   r   r   r	   r
   r   r   r   r   r   r   sympy.matrices.expressionsr   r   r   r   r   r   r   r   sympy.matrices.commonr   sympy.matricesr   r   r   
sympy.corer   r   r   r    sympy.functionsr!   r"   r#   r   r   rE   r7   r6   r5   rF   r%   r&   r'   r(   r)   r*   r,   r-   r0   r1   r3   r;   r=   rR   rW   r[   ra   rl   rt   ry   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r.   r.   r.   r/   <module>   s^    8(
16
 