U
    Ē-eO=  ć                   @   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<td S ©N)r   r*   Śb1Śb2r)   r	   ŚAssertionError© r/   r/   śr/var/www/html/Darija-Ai-Train/env/lib/python3.8/site-packages/sympy/matrices/expressions/tests/test_blockmatrix.pyŚtest_bc_matmul   s    r1   c                   C   s>   t tttggtttgg ttt tt ggks:td S r+   )r   r	   r)   r*   r.   r/   r/   r/   r0   Śtest_bc_matadd   s    ’r2   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<td S r+   )	r   r   r	   r%   r&   r'   r(   ŚTr.   r/   r/   r/   r0   Śtest_bc_transpose    s    ’r4   c                  C   s^   t dtt} t dtt}t dtt}t| ||}t||  td|  d| d| ”sZtd S )Nr%   r&   r'   é   )r   ŚnŚmŚlr   r
   Śequalsr.   ©r%   r&   r'   ŚXr/   r/   r0   Ś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std S )Nr%   r&   r'   r(   ŚZ)r   r6   r7   r	   r   r   r   r.   )r%   r&   r'   r(   r;   r=   r/   r/   r0   Ś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t
t dtt}t| d|  | d|  ks¬t
t d	tt}t|j|  | |j|  | ksÜt
|jtt tt fksöt
|jd
kst
t|tt| j|jg|j|jggks4t
t|j|jd d d ksTt
|| jsdt
| |”jsvt
|| jtt tfkst
|| js¢t
| |”js“t
|| j|jksŹt
t dtd}t d	td}tt|g|gg}	||	 jtt dfkst
t||	 jd | | ||  ks:t
t||	 jd || ||  ksbt
tt||	 tt||	 kst
tt||	 d| t||	 td| fks¼t
t| gg}
t d| j }t|
| | | ksšt
d S )Nr%   r&   r'   r(   ŚMŚNŚEr5   ŚF©r5   r5   é’’’’é   )r   r   )rE   r   r=   )r=   )r   r6   r7   Śkr8   Śpr	   r   Ś	__class__Śargsr.   r   r3   ŚshapeZ
blockshaper!   Ś	is_MatMulŚ	_blockmulŚ	is_MatAddŚ	_blockaddŚblocksr   )r%   r&   r'   r(   r?   r@   r;   rA   rB   ŚYZAbr=   r/   r/   r0   Śtest_BlockMatrix6   sH     $. ((&
 
’rQ   c                  C   s\   t ddgddgg} tt| gg| ks,ttddgddgg} tt| gg| ksXtd S ©NrE   r5   é   é   )r   r   r	   r.   r   ©r%   r/   r/   r0   Ś%test_block_collapse_explicit_matricesg   s    rV   c                  C   s   t ddd} tdd}t| |g||gg}t|| t| d |g||ggksRtt|| | t| d |g||ggks~td S )NŚar5   rS   )r   r   r	   r   r.   )rW   ŚzŚbr/   r/   r0   Śtest_issue_17624n   s
    
(rZ   c                  C   s8   t dddgdddgddd	gg} | t t| ks4td S )
NrE   r5   rS   rT   é   é   é   é   é	   )r   r   r.   rU   r/   r/   r0   Śtest_issue_18618u   s     r`   c                  C   sf   dd dD \} }}}t | |g||gg}t|t| t| ksFttt tttgdksbtd S )Nc                 S   s   g | ]}t |d d qS ©rS   ©r   ©Ś.0Śsr/   r/   r0   Ś
<listcomp>z   s     z*test_BlockMatrix_trace.<locals>.<listcomp>ŚABCDr   )r	   r   r.   r   r6   ©r%   r&   r'   r(   r;   r/   r/   r0   Śtest_BlockMatrix_tracey   s    ri   c               	   C   sŹ   dd dD \} }}}t | |g||gg}ddlm} ddlm} || | ”( t|t| t| d” ksttW 5 Q R X t	t|t
sttt | gt| ksŖttt tttgdksĘtd S )Nc                 S   s   g | ]}t |d d qS ra   rb   rc   r/   r/   r0   rf      s     z0test_BlockMatrix_Determinant.<locals>.<listcomp>rg   r   )ŚQ)Śassumingr%   )r	   Zsympy.assumptions.askrj   Zsympy.assumptions.assumerk   Z
invertibler   Śschurr.   Ś
isinstancer   r   r6   )r%   r&   r'   r(   r;   rj   rk   r/   r/   r0   Śtest_BlockMatrix_Determinant   s    ,rn   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sZt|ttt  }t|t| tt |g||tt ggkst|t dtt tt  jsøt|t dtt tt  j	sÖtt|j
| j
ksźtt| ” tsüt|jrtttt|g||gg}|jr,td S )Nr%   r&   r'   r(   rj   )r   r6   r7   r	   Ś	is_squarer.   r   r   rM   rK   ŚIrm   Śinverser   Zis_Identity)r%   r&   r'   r(   r;   rP   rj   r=   r/   r/   r0   Śtest_squareBlockMatrix   s$    
"’rr   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slttt	|j
tst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:t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sōt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s®t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shtd S ©Nr%   r&   r'   r(   )r   r6   r7   rF   r	   ro   rJ   r.   rm   r   rp   r   r   rq   rl   rh   r/   r/   r0   Ś%test_BlockMatrix_2x2_inverse_symbolic¦   sV    
<"ž
"<ž
<"ž
"<žrt   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sn t||  ” ||  ”   kr¶||  ”   kr¶dks¼n tt| |g||gg}t| ”  ” | ”  ” ksštt|| g||gg}t| ”  ” | ”  ” ks&tt||g| |gg}t| ”  ” | ”  ” ks\tt||g|| gg}t| ”  ” | ”  ” kstdS )z>Test 2x2 block matrix inversion numerically for all 4 formulasrE   r5   rS   rT   r_   é   N)r   Zrankr.   r	   r   ŚinvŚas_explicit)r?   ZD1ZD2ZD3ŚKr/   r/   r0   Ś$test_BlockMatrix_2x2_inverse_numericÜ   s    0< ""ry   c                     sF   t ttf} ttt f t fdd| D }t|j}t|tsBtd S )Nc                    s   g | ]  fd dD qS )c                    s    g | ]}t d  |f  |qS )zM%s%srb   )rd   Ścols©Śrowsr/   r0   rf   ś   s     z<test_BlockMatrix_3x3_symbolic.<locals>.<listcomp>.<listcomp>r/   ©rd   ©Ścolblocksizesr{   r0   rf   ł   s   ’z1test_BlockMatrix_3x3_symbolic.<locals>.<listcomp>)r6   r7   rF   r	   r   rp   rm   r.   )Śrowblocksizesrx   Zcollapser/   r~   r0   Ś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srtjtt t tt t fkstt fdd	t	dD søtj
j ksĢt ”  fksātttj tsśtt t     ks$tt t     ksNtt  td  d d ”sztt| t   d  d  ks¬tt| td  d d
 ksÖtd|   jsźtd|   jsžt | ”jst | ”js"td S )Nr%   r&   r'   r?   r5   rS   )rE   rE   c                 3   sL   | ]D}t d D ]6}||kr*j||f jnj||f  fkV  qqdS )rS   N)ŚrangerO   Zis_ZeroMatrix)rd   ŚiŚjr:   r/   r0   Ś	<genexpr>  s    
 ’z'test_BlockDiagMatrix.<locals>.<genexpr>rT   )r   r6   r7   r8   r   rO   r.   rJ   Śallr   rH   rI   Zget_diag_blocksrm   r   rp   r   r   r9   rK   rM   rL   rN   )r?   rP   r/   r:   r0   Śtest_BlockDiagMatrix  s.    "’**,2*r   c                     sž   t dtt t dtt} t | }|jtt tt fks<t|jtt tt fksVt|jttgksht|j	ttgksztt dttt dtt}t|}t
|| t  | | ks¾tt
||j t j | |j ksęttt fdd d S )Nr%   r&   r'   r(   c                      s   t  j ” S r+   )r   r3   rq   r/   ©r%   r'   r/   r0   Ś<lambda>.  ó    z0test_BlockDiagMatrix_nonsquare.<locals>.<lambda>)r   r6   r7   rF   r8   r   rJ   r.   r   r   r   r3   r   r   )r&   r;   r(   rP   r/   r   r0   Śtest_BlockDiagMatrix_nonsquare!  s    

"(r   c                  C   s   t dtt} t dtt}tt dks*ttt| t| ksBttt| |t| t| ksdtt dtt}t dtt}tt||dkstd S )Nr%   r&   rE   r'   r(   r   )r   r6   r7   r   r   r.   ©r%   r&   r'   r(   r/   r/   r0   Ś test_BlockDiagMatrix_determinant0  s    "r   c                  C   s²   t t dkstt ttttdks,ttdtt} t t| t | ksPttdtt}t t| |t | t | ks~ttdtt}tdtt}tt t||ts®td S )Nr   r%   r&   r'   r(   )	r   r   r.   r   r6   r   r7   rm   r   r   r/   r/   r0   Śtest_BlockDiagMatrix_trace<  s    "r   c                  C   sj   t dtt} t dtt}tt t ks,ttt| t| jksFttt| |t| j|jksftd S )Nr%   r&   )	r   r6   r7   rF   r8   r!   r   r.   r3   )r%   r&   r/   r/   r0   Ś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sZtd S r+   )r   r   r   r   rF   r8   r   r.   )Zbdm1Zbdm2r/   r/   r0   Śtest_issue_2460P  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s¬ttddtd}t|dd}|t|ksŲtt|dd}t|jd tddggkstd S )	Nr%   r5   rT   ru   rC   )rE   rS   )r   rE   rS   )	r   r6   r7   r   r	   r.   r   r   rO   )r%   r&   r?   r/   r/   r0   Śtest_blockcutU  s    $:6’r   c                  C   sf   t dd tdD } | jjdks&tt| }|jjdks>t| j|jksNt|  ” | ” ksbt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%dr5   rb   ©rd   r   ©r   r/   r0   rf   c  s   ’z/test_reblock_2x2.<locals>.<listcomp>.<listcomp>rS   ©r   r}   r/   r   r0   rf   c  s   ž
’z$test_reblock_2x2.<locals>.<listcomp>rS   )rS   rS   rC   )r	   r   rO   rJ   r.   r   rw   )r&   ŚBBr/   r/   r0   Śtest_reblock_2x2b  s    žr   c                  C   s.   t dd tdD } tt| | ks*t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   r6   r   r   r/   r0   rf   o  s   ’z+test_deblock.<locals>.<listcomp>.<listcomp>rT   r   r}   r/   r   r0   rf   o  s   ž
’z test_deblock.<locals>.<listcomp>rT   )r	   r   r   r   r.   )r&   r/   r/   r0   Ś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<tt| | jt ksRttt| jt kshttt| jt ks~ttt| jt kstt	t| jt ksŖtd S rR   )
r   r   r3   rH   r.   r   r   r   r   r   )Zbm1Zbm2r/   r/   r0   Ś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 )Nr5   r[   )r	   r   r/   r/   r/   r0   r     s   ’z+test_invalid_block_matrix.<locals>.<lambda>c                   S   s   t ttttggS r+   )r	   r   r6   r7   r/   r/   r/   r0   r     s   ’c                   S   s4   t ttttttgtttd tttd ggS ©NrE   ©r	   r   r6   r/   r/   r/   r0   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/   r0   r     s   ž)r   Ś
ValueErrorr/   r/   r/   r0   Ś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sjt| ” \}}}t|| | |kst| ” \}}t|| |ks°td S rs   )	r   r6   r7   r	   ZLDUdecompositionr   r.   ZUDLdecompositionZLUdecomposition)r%   r&   r'   r(   r;   ŚLŚUr/   r/   r0   Ś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std S )Né
   )r   r   r	   r   rv   r.   )r6   rp   ŚOr%   ZAinvZAinvTr/   r/   r0   Ś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~tt||kst| ” t| tddgtj tdd |ggksĀtt	|ttddtddgtddtddggksśtd S )NrS   r5   )
r   r   r   r	   r    ZImaginaryUnitZadjointr.   r#   r"   )r%   r&   r'   r(   r;   ZX2r/   r/   r0   Ś!test_adjoint_and_special_matrices³  s    

,4r¤   N)VZ 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   r   r   Zsympy.matrices.commonr   Zsympy.matricesr   r   r   Z
sympy.corer   r   r   r    Zsympy.functionsr!   r"   r#   r   r   rF   r8   r7   r6   rG   r%   r&   r'   r(   r)   r*   r,   r-   r1   r2   r4   r<   r>   rQ   rV   rZ   r`   ri   rn   rr   rt   ry   r   r   r   r   r   r   r   r   r   r   r   r   r    r£   r¤   r/   r/   r/   r0   Ś<module>   s\   8(
16
 