U
    ZÊ¹j�@  ã                   @   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<t‚d S ©N)r   r.   Úb1Úb2r-   r	   ÚAssertionError© r3   r3   úp/var/www/html/bwave/python/venv/lib/python3.8/site-packages/sympy/matrices/expressions/tests/test_blockmatrix.pyÚtest_bc_matmul   s    r5   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.   r2   r3   r3   r3   r4   Útest_bc_matadd    s    ÿr6   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,   ÚTr2   r3   r3   r3   r4   Útest_bc_transpose$   s    ÿr8   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
   Úequalsr2   ©r)   r*   r+   ÚXr3   r3   r4   Ú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   r:   r;   r	   r   r   r   r2   )r)   r*   r+   r,   r?   rA   r3   r3   r4   Útest_block_plus_ident0   s    ÿrB   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ÚEr9   ÚF©r9   r9   éÿÿÿÿé   )r   r   )rI   r   rA   )rA   )r   r:   r;   Úkr<   Úpr	   r   Ú	__class__Úargsr2   r   r7   ÚshapeZ
blockshaper%   Ú	is_MatMulÚ	_blockmulÚ	is_MatAddÚ	_blockaddÚblocksr   )r)   r*   r+   r,   rC   rD   r?   rE   rF   ÚYZAbrA   r3   r3   r4   Útest_BlockMatrix:   sH     $. ((&
 
ÿrU   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 ©NrI   r9   é   é   )r   r   r	   r2   r   ©r)   r3   r3   r4   Ú%test_block_collapse_explicit_matricesk   s    rZ   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Úar9   rW   )r   r   r	   r   r2   )r[   ÚzÚbr3   r3   r4   Útest_issue_17624r   s
    
(r^   c                  C   s8   t dddgdddgddd	ggƒ} | t t| ƒƒks4t‚d S )
NrI   r9   rW   rX   é   é   é   é   é	   )r   r   r2   rY   r3   r3   r4   Útest_issue_18618y   s     rd   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 ©rW   ©r   ©Ú.0Úsr3   r3   r4   Ú
<listcomp>~   s     z*test_BlockMatrix_trace.<locals>.<listcomp>ÚABCDr   )r	   r   r2   r   r:   ©r)   r*   r+   r,   r?   r3   r3   r4   Útest_BlockMatrix_trace}   s    rm   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 re   rf   rg   r3   r3   r4   rj   „   s     z0test_BlockMatrix_Determinant.<locals>.<listcomp>rk   r   )ÚQ)Úassumingr)   )r	   Zsympy.assumptions.askrn   Zsympy.assumptions.assumero   Z
invertibler   Úschurr2   Ú
isinstancer    r   r:   )r)   r*   r+   r,   r?   rn   ro   r3   r3   r4   Ú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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,   rn   )r   r:   r;   r	   Ú	is_squarer2   r   r   rQ   rO   ÚIrq   Úinverser   Zis_Identity)r)   r*   r+   r,   r?   rT   rn   rA   r3   r3   r4   Ú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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   r:   r;   rJ   r	   rs   rN   r2   rq   r   rt   r   r   ru   rp   rl   r3   r3   r4   Ú%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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 formulasrI   r9   rW   rX   rc   é   N)r   Zrankr2   r	   r   ÚinvÚas_explicit)rC   ZD1ZD2ZD3ÚKr3   r3   r4   Ú$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ƒsBt‚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©Úrowsr3   r4   rj   þ   s     z<test_BlockMatrix_3x3_symbolic.<locals>.<listcomp>.<listcomp>r3   ©rh   ©Úcolblocksizesr   r4   rj   ý   s   ÿz1test_BlockMatrix_3x3_symbolic.<locals>.<listcomp>)r:   r;   rJ   r	   r   rt   rq   r2   )Úrowblocksizesr|   Zcollapser3   r‚   r4   Ú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+   rC   r9   rW   )rI   rI   c                 3   sL   | ]D}t d ƒD ]6}||kr*ˆj||f jnˆj||f ˆ ˆˆfkV  qqdS )rW   N)ÚrangerS   Zis_ZeroMatrix)rh   ÚiÚjr>   r3   r4   Ú	<genexpr>  s    
 ÿz'test_BlockDiagMatrix.<locals>.<genexpr>rX   )r   r:   r;   r<   r   rS   r2   rN   Úallr†   rL   rM   Zget_diag_blocksrq   r   rt   r   r   r=   rO   rQ   rP   rR   )rC   rT   r3   r>   r4   Ú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   r7   ru   r3   ©r)   r+   r3   r4   Ú<lambda>2  ó    z0test_BlockDiagMatrix_nonsquare.<locals>.<lambda>)r   r:   r;   rJ   r<   r   rN   r2   r„   rƒ   r   r7   r   r   )r*   r?   r,   rT   r3   rŒ   r4   Ú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*   rI   r+   r,   r   )r   r:   r;   r   r   r2   ©r)   r*   r+   r,   r3   r3   r4   Ú test_BlockDiagMatrix_determinant4  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   r2   r   r:   r   r;   rq   r   r�   r3   r3   r4   Ú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   r:   r;   rJ   r<   r%   r   r2   r7   )r)   r*   r3   r3   r4   Ú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sZt‚d S r/   )r   r   r‡   rˆ   rJ   r<   r   r2   )Zbdm1Zbdm2r3   r3   r4   Ú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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)   r9   rX   ry   rG   )rI   rW   )r   rI   rW   )	r   r:   r;   r   r	   r2   r   r†   rS   )r)   r*   rC   r3   r3   r4   Útest_blockcutY  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%dr9   rf   ©rh   rˆ   ©r‡   r3   r4   rj   g  s   ÿz/test_reblock_2x2.<locals>.<listcomp>.<listcomp>rW   ©r†   r�   r3   r˜   r4   rj   g  s   þ
ÿz$test_reblock_2x2.<locals>.<listcomp>rW   )rW   rW   rG   )r	   r†   rS   rN   r2   r   r{   )r*   ÚBBr3   r3   r4   Útest_reblock_2x2f  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   r:   r—   r˜   r3   r4   rj   s  s   ÿz+test_deblock.<locals>.<listcomp>.<listcomp>rX   r™   r�   r3   r˜   r4   rj   s  s   þ
ÿz test_deblock.<locals>.<listcomp>rX   )r	   r†   r   r   r2   )r*   r3   r3   r4   Ú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<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 rV   )
r   r   r7   rL   r2   r   r   r   r   r   )Zbm1Zbm2r3   r3   r4   Ú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 )Nr9   r_   )r	   r   r3   r3   r3   r4   r�   …  s   ÿz+test_invalid_block_matrix.<locals>.<lambda>c                   S   s   t ttƒttƒggƒS r/   )r	   r   r:   r;   r3   r3   r3   r4   r�   ˆ  s   ÿc                   S   s4   t tttƒtttƒgtttd ƒtttd ƒggƒS ©NrI   ©r	   r   r:   r3   r3   r3   r4   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Ÿ   r3   r3   r3   r4   r�   �  s   þ)r   Ú
ValueErrorr3   r3   r3   r4   Ú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 rw   )	r   r:   r;   r	   ZLDUdecompositionr   r2   ZUDLdecompositionZLUdecomposition)r)   r*   r+   r,   r?   ÚLÚUr3   r3   r4   Ú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   rz   r2   )r:   rt   ÚOr)   ZAinvZAinvTr3   r3   r4   Ú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 )NrW   r9   )
r   r   r   r	   r!   ZImaginaryUnitZadjointr2   r'   r&   )r)   r*   r+   r,   r?   ZX2r3   r3   r4   Ú!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s”t‚d S )NÚxrW   c                    s   g | ]}t d |› �ƒˆ ƒ‘qS )r[   )r"   )rh   r‡   ©r©   r3   r4   rj   Æ  s     z0test_block_matrix_derivative.<locals>.<listcomp>rc   r9   )r$   r   r†   r	   Údiffr   r2   )r)   Úbcr3   rª   r4   Útest_block_matrix_derivativeÄ  s    Hr­   c                  C   s¢   t dƒ} t| ƒ}t| | ƒ}t||g||ggƒ}t| ¡  ¡ ƒ|ksFt‚t| ¡  ¡ ƒ|ks^t‚tt| ¡ dƒƒt|dƒks~t‚tt|dƒ ¡ ƒt|dƒksžt‚d S )Nr:   éþÿÿÿ)	r#   r   r   r	   r   r%   ru   r2   r   )r:   rt   rA   r)   r3   r3   r4   Ú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ˆ   rJ   r<   r;   r:   rK   r)   r*   r+   r,   r-   r.   r0   r1   r5   r6   r8   r@   rB   rU   rZ   r^   rd   rm   rr   rv   rx   r}   r…   r‹   r�   r‘   r’   r“   r”   r•   r›   rœ   r�   r¡   r¤   r§   r¨   r­   r¯   r3   r3   r3   r4   Ú<module>   sh   8 
16
 