U
    ZÊ¹j©c  ã                   @   s  d dl mZ d dl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 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 d dl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$ d dl%m&Z& d dl'm(Z(m)Z)m*Z*m+Z+ d dl,m-Z- d dl.m/Z/ d dl0m1Z1 d dl2m3Z3 d dl4m5Z5m6Z6 d dlm7Z7 d dl8m9Z9m:Z: d dl;m<Z< d dl=m>Z>m?Z? d dl@mAZA d dlBmCZCmDZD d d lEmFZFmGZGmHZHmIZI d d!l'mJZJ ed"ƒ\ZKZLZMZNed#ƒ\ZOZPZQZRZSZTZUZVZWZXZYZZZ[d$d%„ Z\d&d'„ Z]d(d)„ Z^d*d+„ Z_d,d-„ Z`d.d/„ Zad0d1„ Zbd2d3„ Zcd4d5„ Zdd6d7„ Zed8d9„ ZfeCd:d;„ ƒZgd<d=„ ZheCd>d?„ ƒZieCd@dA„ ƒZjeCdBdC„ ƒZkdDdE„ ZldFdG„ ZmdHdI„ ZndJdK„ ZodLdM„ ZpdNdO„ ZqdPdQ„ ZrdRdS„ ZsdTdU„ ZtdVdW„ ZudXdY„ ZvdZd[„ Zwd\d]„ Zxd^d_„ Zyd`da„ Zzdbdc„ Z{ddde„ Z|dfdg„ Z}dhdi„ Z~djdk„ Zdldm„ Z€eCdndo„ ƒZ�dpdq„ Z‚drds„ Zƒdtdu„ Z„dvdw„ Z…dxdy„ Z†dzd{„ Z‡d|d}„ Zˆd~d„ Z‰d€d�„ ZŠd‚dƒ„ Z‹d„d…„ ZŒd†d‡„ Z�dˆd‰„ ZŽdŠd‹„ Z�dŒd�„ Z�dŽd�„ Z‘d�d‘„ Z’eCd’d“„ ƒZ“d”d•„ Z”eCd–d—„ ƒZ•d˜d™„ Z–eCdšd›„ ƒZ—dœd�„ Z˜dždŸ„ Z™d d¡„ ZšdS )¢é    )ÚreduceN)Úadd)ÚMatrixSolve)ÚAdd)ÚTuple)ÚUnevaluatedExpr)ÚFunction)ÚMul)ÚPow)ÚEq)ÚS)ÚSymbolÚsymbols)Úsympify)Úexp)Úsqrt)Ú	Piecewise)ÚcosÚsin)ÚMatrix)ÚInverseÚMatAddÚMatMulÚ	Transpose)ÚCRootOf)ÚO©Úcse)Úsignsimp)ÚIdxÚIndexedBase©Ú	count_ops)Úsub_preÚsub_post)Úmeijerg)Úcse_mainÚcse_opts)Úsubsets)ÚXFAILÚraises)ÚMutableDenseMatrixÚMutableSparseMatrixÚImmutableDenseMatrixÚImmutableSparseMatrix)ÚMatrixSymbolzw,x,y,zzx:13c                  C   s¢   t jdd�} tt | dd¡ƒdd„ tddƒD ƒks6t‚t jdd�} tt | dd¡ƒdd„ tddƒD ƒkslt‚t  ¡ } tt | dd¡ƒd	d„ tddƒD ƒksžt‚d S )
NÚy)Úprefixr   é
   c                 S   s   g | ]}t d | ƒ‘qS ©zy%s©r   ©Ú.0Úi© r8   ú\/var/www/html/bwave/python/venv/lib/python3.8/site-packages/sympy/simplify/tests/test_cse.pyÚ
<listcomp>.   s     z)test_numbered_symbols.<locals>.<listcomp>é   c                 S   s   g | ]}t d | ƒ‘qS r3   r4   r5   r8   r8   r9   r:   1   s     c                 S   s   g | ]}t d | ƒ‘qS )zx%sr4   r5   r8   r8   r9   r:   4   s     )r&   Znumbered_symbolsÚlistÚ	itertoolsÚisliceÚrangeÚAssertionError)Únsr8   r8   r9   Útest_numbered_symbols+   s0      ÿÿ  ÿÿ  ÿÿrB   c                 C   s   | t  S ©N)r0   ©Úexprr8   r8   r9   Úopt19   s    rF   c                 C   s   | t  S rC   )ÚzrD   r8   r8   r9   Úopt2=   s    rH   c                   C   s˜   t  ttd fg¡tt kst‚t  td tfg¡tks8t‚t  tdg¡tksNt‚t  tttfg¡tt kslt‚t  ttd ftd fg¡tt t ks”t‚d S ©N)NN)r&   Zpreprocess_for_cseÚxrF   r0   r@   rH   rG   r8   r8   r8   r9   Útest_preprocess_for_cseA   s     ÿ
ÿrK   c                   C   s˜   t  ttd fg¡tkst‚t  td tfg¡tt ks8t‚t  tdg¡tksNt‚t  tttfg¡tt kslt‚t  td tfd tfg¡tt t ks”t‚d S rI   )r&   Zpostprocess_for_cserJ   rF   r@   r0   rH   rG   r8   r8   r8   r9   Útest_postprocess_for_cseJ   s     ÿ
ÿrL   c                  C   s®   t ttt dƒttt ƒƒ} t| gƒ\}}|ttt fgks@t‚|ttƒtd  gksZt‚tdgƒ\}\}t|ƒdkr~|dks‚t‚tdgƒ\}\}t|ƒdkr¦|dksªt‚d S )Né   é*   r   ç      à?)	r   r
   rJ   r0   r   r   Úx0r@   Úlen©ÚeÚsubstsÚreducedZsubst42Zred42Z
subst_halfZred_halfr8   r8   r9   Útest_cse_singleT   s    rV   c                  C   sÎ   t ttt dƒttt ƒƒ} t| ƒ\}}|ttt fgks>t‚|ttƒtd  gksXt‚ttdggƒƒ\}}t	|d tƒs~t‚tdƒ\}\}t
|ƒdkr |dks¤t‚tdƒ\}\}t
|ƒdkrÆ|dksÊt‚d S )NrM   é   r   rN   rO   )r   r
   rJ   r0   r   r   rP   r@   r   Ú
isinstancerQ   rR   r8   r8   r9   Útest_cse_single2a   s    rY   c                  C   sx   t ttƒ} t| gƒ\}}|g ks$t‚|tt gks6t‚tdtdfdg tƒtdtdfdg tƒ }t|ƒg |gfkstt‚d S )N)rW   rM   é   )é   )rW   é   )r   rJ   r0   r   r@   r%   )rS   rT   rU   Úeqr8   r8   r9   Útest_cse_not_possiblep   s    
ÿr^   c                  C   sj   t ttt t dƒttt t ƒƒ} t| gƒ\}}|ttt t fgksLt‚|ttƒtd  gksft‚d S ©NrM   )	r   r
   ÚwrJ   r0   r   r   rP   r@   )rS   rT   rU   r8   r8   r9   Útest_nested_substitution|   s    $ra   c                  C   s¨  t t tt  tt t tt  ƒ } t| gtjtjfgd�\}}|tt t tt  fgks^t	‚|t tt ƒ gksxt	‚t t  tt  tt t  tt  ƒ } t| gtjtjfgd�\}}|tt t tt  fgksÚt	‚|tttƒ gksðt	‚ddt   }|t  | d  d| t   } t| tjtjfgd�g dgfk�s@t	‚tt
t  t t t
t t  t
t  d  ƒtt
t  fttt fgt
t tt  td  gfk�s¤t	‚d S )N©ZoptimizationséÿÿÿÿrW   rM   r   r\   )rJ   r0   rG   r   r   r'   r#   r$   rP   r@   r`   Úx1)rS   rT   rU   Únr8   r8   r9   Útest_subtraction_opt„   s,    $ ÿ
( ÿ
ÿ
*0ÿrf   c                  C   sÌ  t t t } t t t }t| |gƒ\}}|tt t fgks>t‚|tt tt gksVt‚tt  t t tt g}t|ƒ\}}tt|ƒƒ\}}||ks–t‚|tt t  tgks®t‚tt  t tt  t t tt g}t|ƒ\}}tt|ƒƒ\}}||ksøt‚|ttt tgk�st‚t t tt  t t tt g}t|ƒ\}}tt|ƒƒ\}}|tt ftt t ft	tt fgk�stt‚|tt fttt ft	t t fgk�sžt‚|tt	 tt	gk�s¶t‚tt t t  t t tt  t g}t|ƒttt fgtt  t t t t t gfk�st‚tt t t t t gƒtt t fgttt gfk�sJt‚tt t t t gƒg t t t t gfk�sxt‚tt t tt t  t t t d gƒtt t fgttt dtt  gfk�sÈt‚d S )Nr\   )
rJ   r0   rG   r`   r   rP   r@   Úreversedrd   Úx2)Úe1Úe2rT   rU   ÚlZrsubstsÚ_r8   r8   r9   Útest_multiple_expressions™   s8    "**$88.$"ÿrm   c                  C   sx   t ddd�\} }}| | | | | g}t|ƒg |fks:t‚| | | | | g}t|ƒt| | fgt| tgfkstt‚d S ©NúA B CF©Zcommutative)r   r   r@   rP   ©ÚAÚBÚCrk   r8   r8   r9   Útest_non_commutative_cse·   s
    ru   c                  C   sŽ   t ddd�\} }}| | | | | g}t|ƒg |fks:t‚| | | | | g}t|ƒg |fksbt‚|| | | | g}t|ƒg |fksŠt‚d S rn   ©r   r   r@   rq   r8   r8   r9   Útest_bypass_non_commutativesÁ   s    rw   c                  C   s\   t ddd�\} }}t ddd�}|| | ||  g}t|ƒ||| fg|| | gfksXt‚d S )Nro   Frp   rP   rv   )rr   rs   rt   rP   rk   r8   r8   r9   Útest_non_commutative_orderË   s    rx   c            	      C   s¶  t ttd  tt  gƒttt fgtt t gfks:t‚t tt dt t gƒttt fgttt gfkspt‚t tdt  t t tt d fƒttt fgtt t t td gfks¾t‚t tt t t tt  tt  ƒttt fgtt t tt  t gfk�st‚tdƒ\} }}}}}}}||d  | | d|  | | | | | | |d  f}t |ƒt|| ft| | fg|| | t dt t || | t gfk�s²t‚d S )NrM   rW   za, b, c, d, f, g, j, mrZ   )	r   rJ   r0   rP   r@   r`   rG   r   rd   )	ÚaÚbÚcÚdÚfÚgÚjÚmÚexprsr8   r8   r9   Útest_issue_10228Ó   s     :6" ÿ
" ÿ: (ÿr‚   c                   C   s<   t ttd  tt  ƒttt fgtt t gfks8t‚d S r_   )r   rJ   r0   rP   r@   r8   r8   r8   r9   Útest_powersá   s    rƒ   c                   C   s>   t ttt  ttt   dd�g tt tt  gfks:t‚d S )NÚbasicrb   )r   r`   rJ   r0   rG   r@   r8   r8   r8   r9   Útest_issue_4498æ   s    ÿr…   c                   C   sX   t td td  td  td  dd�ttd fgttd t t d  gfksTt‚d S )Nr[   rZ   r\   rM   r„   rb   rW   )r   rJ   rP   r@   r8   r8   r8   r9   Útest_issue_4020ë   s    &&ÿr†   c                   C   s<   t ttt ƒtt  ƒttt fgttƒt gfks8t‚d S rC   )r   r   rJ   rP   r@   r8   r8   r8   r9   Útest_issue_4203ð   s    r‡   c                  C   s>   t tt d  ttd   dƒ} t| dd�g dgfks:t‚d S )NrW   r   r„   rb   T)r   rJ   r   r@   )rS   r8   r8   r9   Útest_issue_6263ô   s     rˆ   c                  C   sh   t dƒ} t ddd�}t| |d  | |d |d    ƒd d }|j}t|ƒtdd	„ |D ƒƒksdt‚d S )
Nr{   rP   T)ÚrealrM   rZ   rc   c                 S   s   h | ]
}|j ’qS r8   )Únamer5   r8   r8   r9   Ú	<setcomp>þ   s     z#test_issue_25043.<locals>.<setcomp>)r   r   Úfree_symbolsrQ   r@   )r{   rJ   Úcse_exprÚfreer8   r8   r9   Útest_issue_25043ù   s
    ,r�   c                  C   s0  ddl m}  tdƒ}tdƒ}t| |ttƒttfdƒ| |ttƒttfdƒ ƒ\}\}|g ks^t‚|| |ttƒttfdƒ| |ttƒttfdƒ ks’t‚t| |ttƒttfdtt fƒ| |ttƒttfdtt fƒ ƒ\}\}|ttt fgksît‚|| |ttƒttfdtfƒ| |ttƒttfdtfƒ k�s,t‚d S )Nr   )ÚSubsr}   r~   ©r   rW   )Úsympy.core.functionr�   r   r   rJ   r0   r@   rP   )r�   r}   r~   Zname_valrE   r8   r8   r9   Útest_dont_cse_tuples  s*    ÿÿ
ÿ
ÿÿ
ÿr“   c                   C   s˜  t dtd  td  ƒttd fgtdt  gfks8t‚t td ddtd   td   ƒttd ftdt fgtttd   gfksŠt‚t dtd  ddtd   td   ƒttd ftdt fgttd  t gfksàt‚t tdtd  ƒtdtd  ƒ ƒttd fgttƒttƒ gfk�s*t‚t ttd ƒttd ƒ ƒttd fgttƒttƒ gfk�slt‚t tdtd   ttd  t  ƒttd fgttd  ttt   gfk�s¾t‚t t	td ƒtd tdtd  ƒ  ƒttd fgttdt ƒ t	tƒ gfk�st‚t ddtd   td  ƒttd fgttd  gfk�sRt‚t tdt  tdt   ƒttdt  fgtdt  gfk�s”t‚d S )NrW   rM   éþÿÿÿ)
r   rJ   rP   r@   rd   r   r   r0   rG   r   r8   r8   r8   r9   Útest_pow_invpow  s6    ÿ"(ÿ&(ÿ"ÿ
ÿ
"&ÿ
&&ÿ
ÿ
ÿr•   c                  C   s®   t d tt d td  ƒ ttd ƒ } t| tt td ƒtd td t d  gtjd�t	td ft
td ft t
ftt d fgtttt	 ƒ tt	ƒ td tt
 ggksªt‚d S )NrW   rM   ©Úpostprocess)rJ   r   r0   r   r   r   rG   r&   Zcse_separaterP   rh   rd   r@   ©r]   r8   r8   r9   Útest_postprocess,  s    (&ÿ&$ÿþr™   c                  C   sâ  ddl m} m} tdƒ}tdƒ}t| | tj d|  |d|  | d ttƒd d|  d  |d|  | ttƒƒ ||d ttƒƒ ||ƒ |d|  | d ƒ ttƒttƒd d|  d   ||ttƒƒ |d|  | ttƒƒ ||ƒ |d|  | d ƒ ttƒttƒd d|  d   ||d ttƒƒ |d|  | d ttƒƒ ||ƒ |d|  | d ƒ ttƒd d|  d  ||ttƒƒ |d|  | d ttƒƒ ||ƒ |d|  | d ƒ ddtjtd | d d|  | d|  fŽ }t	|ƒ}t
d|  ft| t
 fttd ft|d ftttƒft|ttƒfttd dt
  ||ƒ |tƒ ftt|ttƒ ft||tƒftt|ttƒ fg
| | tj t
|ttt tt t tt t tt ddtjtd t t t
 fgf}||k�sÞt‚d S )Nr   )ry   rz   rs   ÚGrM   rW   r”   )Z	sympy.abcry   rz   r   r   r   ZHalfr   rG   r   rP   rd   rh   Úx3Úx4Úx5Úx6Úx7Úx8Úx9r@   )ry   rz   rs   rš   Útr{   Úansr8   r8   r9   Útest_issue_44994  s„    >ÿÿÿÿÿ8ÿÿÿ&ÿÿÿÿ4ÿÿÿ     
ùÿ	4 "  þ0      ÿür¤   c                  C   sp   t td dtd   d dƒ} t| ƒg | gfks4t‚ttt t t t t ƒƒt tt  t t kslt‚d S )Né   rZ   r[   rM   rW   )r   rJ   r   r@   r$   r#   r0   rG   ©Úrr8   r8   r9   Útest_issue_6169L  s    r¨   c                  C   s’   d} t d| fd�}t d| fd�}td| d ƒ}||d  ||  ||d  ||   }d||d  ||   }t||gƒ\}}t|ƒdksŽt‚d S )Nr[   r0   )ÚshaperJ   r7   rW   r   )r    r   r   rQ   r@   )Zlen_yr0   rJ   r7   Úexpr1Úexpr2ÚreplacementsÚreduced_exprsr8   r8   r9   Útest_cse_IndexedT  s    (r®   c                  C   sÚ   t dddƒ} t| ƒg | gfks"t‚tddd�}t d||ƒ}t|ƒg |gfksPt‚t| d | d  ƒg | d | d  gfks~t‚t| d | d	  | d | d	  | d
   ƒt| d | d	  fgt| d
  t gfksÖt‚d S )Nrr   r\   re   T)Úintegerrs   r   )r   r   r‘   )r   rM   )r/   r   r@   r   rP   )rr   re   rs   r8   r8   r9   Útest_cse_MatrixSymbol`  s    .r°   c                  C   s¢   t dddƒ} t dddƒ}| j|  j|  | }| j|  |  | }t||gƒ\}}t|ƒdks^t‚t|| |gƒ\}}|szt‚t| d | | d  gƒ\}}|sžt‚d S )Nrr   r\   r0   rW   r   rM   )r/   ÚTÚIr   rQ   r@   )rr   r0   rª   r«   r¬   r­   r8   r8   r9   Útest_cse_MatrixExprm  s    r³   c                  C   sv   t t tt  ttdƒft tt  dfƒ} t| ƒ}ttt fgt tt ttdƒft t dfƒgf}||ksrt‚d S )Nr   T)r   rG   rJ   r0   r   r   rP   r@   )r}   r£   Z
actual_ansr8   r8   r9   Útest_Piecewise}  s    ,"ÿr´   c                  C   sh   t tƒ tdd¡tttd  ƒ d } t| ƒg ttd t ƒt td d  ttd ƒ gfksdt‚d S )Nr   r\   rW   rM   )r   rJ   Zseriesr   r0   r   r   r@   r˜   r8   r8   r9   Útest_ignore_order_terms…  s    &rµ   c                     sX   t t } tt }t| ƒ|  t|ƒ| t t g}t|ƒ\‰ }‡ fdd„|D ƒ|ksTt‚d S )Nc                    s   g | ]}|  tˆ ƒ¡‘qS r8   ©Úsubsrg   ©r6   rS   ©rT   r8   r9   r:   �  s     z&test_name_conflict.<locals>.<listcomp>)rP   r0   rh   r›   r   r   r@   ©Zz1Zz2rk   rU   r8   r¹   r9   Útest_name_conflictŠ  s
    r»   c                     s^   t t } tt }t| ƒ|  t|ƒ| t t g}t|tdƒƒ\‰ }‡ fdd„|D ƒ|ksZt‚d S )Nzx:10c                    s   g | ]}|  tˆ ƒ¡‘qS r8   r¶   r¸   r¹   r8   r9   r:   —  s     z3test_name_conflict_cust_symbols.<locals>.<listcomp>)rP   r0   rh   r›   r   r   r   r@   rº   r8   r¹   r9   Útest_name_conflict_cust_symbols’  s
    r¼   c               	   C   sZ   t tt ƒt t t tt ƒ ttt ƒ } tttg}ttƒ� t| |d� W 5 Q R X d S )N)r   )	r   rJ   r0   r`   r   rG   r*   Ú
ValueErrorr   )rk   Úsymr8   r8   r9   Útest_symbols_exhausted_errorš  s    ,

r¿   c            	      C   sº   t dƒ} t dƒ}|  d|¡} i }d|d< d|d< |  |¡}t| ƒ\}}|D ]}|d  |¡||d	 j< qJ|d	  |¡}||ks‚t‚t d
ƒ}t|ƒ\}}|d	 |ks¦t‚t|ƒdk s¶t‚d S )NziPiecewise((C391 - 1.65, C390 < 0.5), (Piecewise((C391 - 1.65,         C391 > 2.35), (C392, True)), True))zGPiecewise((2.05*C390**(-1.03), C390 < 0.5), (2.5*C390**(-0.625), True))ÚC391g¹²gv­‚æ?ZC390g‘þÉ¥:ð?ZC392rW   r   a  Piecewise((Symbol('ON'), Equality(Symbol('mode'), Symbol('ON'))),         (Piecewise((Piecewise((Symbol('OFF'), StrictLessThan(Symbol('x'),         Symbol('threshold'))), (Symbol('ON'), true)), Equality(Symbol('mode'),         Symbol('AUTO'))), (Symbol('OFF'), true)), true)))r   r·   r   rŠ   r@   rQ   )	ZC393rÀ   ÚsubZ	ss_answerZsubstitutionsZnew_eqnÚpairZ
cse_answerrE   r8   r8   r9   Útest_issue_7840¡  s,    ÿÿ
ÿrÃ   c                  C   s†   t tttfD ]t} | ddtt dddgƒ}ttt |gƒ}ttt fgt| tdgddggƒgf}||ksjt‚t	|d d | ƒst‚qd S )NrM   r   rW   rc   )
r+   r,   r-   r.   rJ   r0   r   rP   r@   rX   )Úclsr€   Úresr£   r8   r8   r9   Útest_issue_8891Æ  s     ÿ&rÆ   c                     sÌ  t dƒ\} }}}}}| | | | | | | |d  | || |d  | g}t|ƒ\}}tdd„ |D ƒƒrpt‚ddlm‰  ddlm‰ t dƒ‰‡ ‡fd	d
„tdƒD ƒ}	t	|	dƒD ]l}t
|ƒ}t|ƒ\}}tdd„ |D ƒƒràt‚t|ƒD ](}
tt|ƒƒD ]}|| j|
Ž ||< qøqè||ks²t‚q²‡ ‡fdd
„tdƒD ƒ}	t	|	dƒD ]„}t
|ƒ}t|ƒ\}}tdd„ |D ƒƒ�rrt‚t|ƒD ],}
tt|ƒƒD ]}|| j|
Ž ||< �qŠ�qz|‡fdd
„|D ƒk�sBt‚�qBd S )Nza b f k l irM   c                 s   s    | ]}|j D ]}|jV  qqd S rC   ©ÚargsZis_Mul©r6   ry   r7   r8   r8   r9   Ú	<genexpr>Õ  s       z#test_issue_11230.<locals>.<genexpr>r   )Úchoice©Ú
expand_mulza:mc                    s(   g | ] }t ‡ ‡fd d„tdƒD ƒŽ ‘qS )c                    s   g | ]}ˆ ˆƒ‘qS r8   r8   r5   ©rË   Úsr8   r9   r:   Ü  s     ú/test_issue_11230.<locals>.<listcomp>.<listcomp>r[   )r	   r?   r5   rÎ   r8   r9   r:   Ü  s     z$test_issue_11230.<locals>.<listcomp>é   r\   c                 s   s    | ]}|j D ]}|jV  qqd S rC   rÇ   rÉ   r8   r8   r9   rÊ   à  s       c                    s(   g | ] }t ‡ ‡fd d„tdƒD ƒŽ ‘qS )c                    s   g | ]}ˆ ˆd d… ƒ‘qS )NrÑ   r8   r5   rÎ   r8   r9   r:   æ  s     rÐ   r[   )r   r?   r5   rÎ   r8   r9   r:   æ  s     c                 s   s    | ]}|j D ]}|jV  qqd S rC   )rÈ   Zis_AddrÉ   r8   r8   r9   rÊ   ê  s       c                    s   g | ]}ˆ |ƒ‘qS r8   r8   r5   rÌ   r8   r9   r:   ò  s     )r   r   Úanyr@   Zsympy.core.randomrË   r’   rÍ   r?   r(   r<   rg   rQ   r·   )ry   rz   r}   Úkrk   r7   ÚpÚRrt   ÚexÚrir8   )rË   rÍ   rÏ   r9   Útest_issue_11230Ð  s2    :rØ   c                  C   sÖ   dd„ } t d td  t d t  t d  }t|ƒtt d ftt t fgt d tt t  tt  gfksnt‚| |ƒ t d td d  t td   }t|ƒttd fgt d td  t t  gfksÊt‚| |ƒ d S )Nc                 S   s>   t | ƒ\}}|  ¡ t|ƒtdd„ |D ƒƒ t|ƒ ks:t‚d S )Nc                 s   s   | ]}|d    ¡ V  qdS )rW   Nr!   r5   r8   r8   r9   rÊ   ú  s     z2test_issue_11577.<locals>.check.<locals>.<genexpr>)r   r"   rQ   Úsumr@   )r]   r§   r{   r8   r8   r9   Úcheck÷  s    ÿÿztest_issue_11577.<locals>.checkr[   rM   rZ   rW   )rJ   r0   r   rP   rd   r@   )rÚ   r]   r8   r8   r9   Útest_issue_11577õ  s    $ ÿ
  ÿ
rÛ   c                  C   s(   t d t d g} t| ƒg | fks$t‚d S )Nr\   rZ   )rJ   r   r@   r˜   r8   r8   r9   Útest_hollow_rejection  s    rÜ   c                  C   s°   t tƒdt dttd ƒ   t tƒdt dttd ƒ   g} t| ƒ\}}tdd„ |D ƒƒsftdƒ‚t| tfd�\}}tdd„ |D ƒƒr’td	ƒ‚td
d„ |D ƒƒs¬tdƒ‚d S )Nr\   rW   r[   c                 s   s   | ]\}}t |jkV  qd S rC   ©r0   rŒ   ©r6   rl   rÁ   r8   r8   r9   rÊ     s     z"test_cse_ignore.<locals>.<genexpr>z&cse failed to identify any term with y©Úignorec                 s   s   | ]\}}t |jkV  qd S rC   rÝ   rÞ   r8   r8   r9   rÊ     s     z,Sub-expressions containing y must be ignoredc                 s   s&   | ]\}}|t td  ƒ dkV  qdS )rW   r   N)r   rJ   rÞ   r8   r8   r9   rÊ     s     z4cse failed to identify sqrt(x + 1) as sub-expression)r   r0   r   rJ   r   rÒ   r@   )r�   Zsubst1Úred1Zsubst2Úred2r8   r8   r9   Útest_cse_ignore  s    @rã   c                     sd   t ttƒ tt ƒ ttƒttƒ tt ƒ g} t| tfd�\‰ }‡ fdd„|D ƒ}|| ks`t‚d S )Nrß   c                    s   g | ]}|  tˆ ƒ¡‘qS r8   r¶   r¸   r¹   r8   r9   r:     s     z/test_cse_ignore_issue_15002.<locals>.<listcomp>)r`   r   rJ   rG   r0   r   r@   )rk   rU   Zrlr8   r¹   r9   Útest_cse_ignore_issue_15002  s    þrä   c                  C   sœ   t td ƒ} td|  d|   gƒ\\\}}\}|| krP|d| d|  ks˜t‚nH||  krt|d| d|  ks˜t‚n$d| › d|  › d|› �}ds˜t|ƒ‚d S )NrW   rc   zExpected common subexpression z or z, instead got F)r   rJ   r   r@   )Zxp1rP   ZueÚredÚmsgr8   r8   r9   Útest_cse_unevaluated#  s    "
rç   c                     s    d\} ‰ t dˆ  ƒ‰‡ ‡fdd„t| ƒD ƒ}|d |d   ¡ dksHt‚t|ƒ\}}t|ƒdkshtdƒ‚t|ƒD ]*\}}| t|ƒ¡||   ¡ dkspt‚qpd S )N)r\   r;   zx:%dc                    s*   g | ]"‰ t t‡ ‡fd d„tˆƒD ƒƒ‘qS )c                    s    g | ]}ˆ| d ˆ |   ‘qS )rc   r8   )r6   r   )r7   rJ   r8   r9   r:   4  s     z4test_cse__performance.<locals>.<listcomp>.<listcomp>)r   r   r?   )r6   ©ZntermsrJ   )r7   r9   r:   3  s   ÿz)test_cse__performance.<locals>.<listcomp>r   rW   z!exprs[0] == -exprs[2], i.e. a CSE)	r   r?   Úsimplifyr@   r   rQ   Ú	enumerater·   rg   )Znexprsr�   Úsubstrå   r7   rS   r8   rè   r9   Útest_cse__performance0  s    þrì   c                  C   sf   t t dt  t t t t dt  t t g} t| ƒ\}}dt|ƒtdd„ |D ƒƒ t|ƒ ksbt‚d S )NrM   r\   r¥   c                 s   s   | ]\}}|  ¡ V  qd S rC   r!   )r6   rÓ   Úvr8   r8   r9   rÊ   A  s     z#test_issue_12070.<locals>.<genexpr>)rJ   r0   rG   r   rQ   rÙ   r"   r@   )r�   rë   rå   r8   r8   r9   Útest_issue_12070>  s
    ,ÿrî   c                  C   s8   t dt d  td   } t| ƒd d }|| ks4t‚d S )NéüÿÿÿrM   rW   r   )rJ   r0   r   r@   )r]   Zcse_eqr8   r8   r9   Útest_issue_13000E  s    rð   c                  C   sN   t td dt  d dƒt td dt  d dƒ } t| ƒg | gfksJt‚d S )Nr[   é   rM   r   rW   )r   rJ   r   r@   r˜   r8   r8   r9   Útest_issue_18203K  s    4rò   c                  C   s>   t tt tt dd�} t| ƒttt fgtd gfks:t‚d S )NF©ÚevaluaterM   )r	   rJ   r0   r   rP   r@   r˜   r8   r8   r9   Útest_unevaluated_mulP  s    rõ   c                     s2  ddl m}  tdƒ\}}}}}tt d d ttt tt dt d  tt d d  dt d tt  g}t|| d�\‰ }ˆ süt|ttt fttd d ft	dt d f|tt	 t f|t	t ft	d f|tftd f|tftd f|tfg|||||ffkƒ‚ˆ  
¡  dd„ ˆ D ƒ‰ |‡ fd	d„|D ƒk�s.t‚d S )
Nr   )Úcse_release_variablesz_:5rW   rM   r–   c                 S   s    g | ]\}}|d k	r||f‘qS rC   r8   )r6   rÏ   rí   r8   r8   r9   r:   a  s      z.test_cse_release_variables.<locals>.<listcomp>c                    s   g | ]}|  ˆ ¡‘qS r8   )r·   r5   r¦   r8   r9   r:   b  s     )Úsympy.simplify.cse_mainrö   r   rJ   r0   r   r@   rP   rd   rh   Úreverse)rö   Z_0Z_1Z_2Z_3Z_4ZeqsrS   r8   r¦   r9   Útest_cse_release_variablesT  s4     "þ
   
     ýýrù   c                  C   sž   dd„ } | t ƒg t fkst‚| dƒg dfks0t‚t g}tttfD ] }| ||ƒƒg ||ƒfks@t‚q@| t|Ž ƒg t|Ž fks~t‚t di}| |ƒg |fksšt‚d S )Nc                 S   s   t | dd�S )NF)r<   r   )rJ   r8   r8   r9   Ú<lambda>e  ó    ztest_cse_list.<locals>.<lambda>rJ   rW   )rJ   r@   r<   ÚtupleÚsetr   )Z_cseÚitr{   r|   r8   r8   r9   Útest_cse_listd  s    rÿ   c                  C   s4   t dddƒ} t|  |  |  ƒ|  |  |  ks0t‚d S )Nrr   rM   )r/   r   r@   )rr   r8   r8   r9   Útest_issue_18991p  s    r   c                  C   s(   t dddd�g} t| ƒg | fks$t‚d S )NrW   rM   Fró   )r	   r   r@   )r€   r8   r8   r9   Útest_unevaluated_Mulu  s    r  c                  C   s>   t tdƒƒ dd¡} t| ƒ}t|ƒ}|g t| ƒgfks:t‚d S ©NúA:4rM   )r-   r   Úreshaper   r   r@   ©rr   rJ   r�   r8   r8   r9   Ú"test_cse_matrix_expression_inversez  s    r  c                  C   sL   t tdƒƒ dd¡} t tdƒƒ}tt| ƒ|ƒ}t|ƒ}|g |gfksHt‚d S ©Nr  rM   zb:2)r-   r   r  r   r   r   r@   ©rr   rz   rJ   r�   r8   r8   r9   Ú)test_cse_matrix_expression_matmul_inverse�  s
    r	  c                  C   s>   t tdƒƒ dd¡} ttj| ƒ}t|ƒ}|g |gfks:t‚d S r  ©r-   r   r  r   r   ÚNegativeOner   r@   r  r8   r8   r9   Útest_cse_matrix_negate_matrix‰  s    r  c                  C   sT   t tdƒƒ dd¡} t tdƒƒ dd¡}ttj| |ƒ}t|ƒ}|g |gfksPt‚d S ©Nr  rM   zB:4r
  ©rr   rs   rJ   r�   r8   r8   r9   Ú+test_cse_matrix_negate_matmul_not_extracted�  s
    r  c                  C   sb   t tdƒƒ dd¡} t tdƒƒ dd¡}ttjt| |ƒƒ}t|ƒ}|g ttj| |ƒgfks^t‚d S r  r
  r  r8   r8   r9   Ú'test_cse_matrix_nested_matmul_collapsed˜  s
    r  c                  C   sB   t tdƒƒ dd¡} ttt| ƒƒƒ}t|ƒ}|g | gfks>t‚d S r  )r-   r   r  r   r   r@   r  r8   r8   r9   Ú0test_cse_matrix_optimize_out_single_argument_mul¡  s    r  c                  C   s^   t tdƒƒ dd¡} tttt| ƒƒƒtt| ƒƒt| ƒ| ƒ}t|ƒ}|g td| ƒgfksZt‚d S ©Nr  rM   rZ   )r-   r   r  r   r   r   r@   r  r8   r8   r9   Ú9test_cse_matrix_optimize_out_single_argument_mul_combined¨  s    &r  c                  C   sF   t tdƒƒ dd¡} tttt| ƒƒƒƒ}t|ƒ}|g | gfksBt‚d S r  )r-   r   r  r   r   r@   r  r8   r8   r9   Ú0test_cse_matrix_optimize_out_single_argument_add°  s    r  c                  C   s^   t tdƒƒ dd¡} tttt| ƒƒƒtt| ƒƒt| ƒ| ƒ}t|ƒ}|g td| ƒgfksZt‚d S r  )r-   r   r  r   r   r   r@   r  r8   r8   r9   Ú9test_cse_matrix_optimize_out_single_argument_add_combined·  s    &r  c                  C   sH   t tdƒƒ dd¡} t tdƒƒ}t| |ƒ}t|ƒ}|g |gfksDt‚d S r  )r-   r   r  r   r   r@   r  r8   r8   r9   Ú'test_cse_matrix_expression_matrix_solve¿  s
    
r  c                  C   sˆ   t tdƒƒ dd¡} t tdƒƒ}tttt| ƒ| ƒƒt| ƒ|ƒ}t|ƒ}tdddƒ}ttt|| ƒƒ||ƒ}||t| ƒfg|gfks„t‚d S )NzX:4rM   zy:2rP   )	r-   r   r  r   r   r   r   r/   r@   )ÚXr0   rz   r�   rP   Zreduced_expr_expectedr8   r8   r9   Ú!test_cse_matrix_matrix_expressionÇ  s    r  c                  C   sš  d} t td| › �ƒƒ}t td| |  › �ƒƒ | | ¡}t td| |  › �ƒƒ | | ¡}t td| |  › �ƒƒ | | ¡}t td| › �ƒƒ}t|t|t|ƒtt|t||t|ƒƒƒƒtt||ƒttj|ƒƒƒƒ}t|ttj|t|ƒtt|t||t|ƒƒƒƒ||ƒƒ}t	||gƒ}t
d| | ƒ}	t
d| | ƒ}
|	t|ƒf|
tt|t|||	ƒƒƒfg}t|t||	|
tt||ƒttj|ƒƒƒƒt|ttj||	|
||ƒƒg}|||fk�s–t‚d	S )
aÇ  Kalman Filter example from Matthew Rocklin's SciPy 2013 talk.

    Talk titled: "Matrix Expressions and BLAS/LAPACK; SciPy 2013 Presentation"

    Video: https://pyvideo.org/scipy-2013/matrix-expressions-and-blaslapack-scipy-2013-pr.html

    Notes
    =====

    Equations are:

    new_mu = mu + Sigma*H.T * (R + H*Sigma*H.T).I * (H*mu - data)
           = MatAdd(mu, MatMul(Sigma, Transpose(H), Inverse(MatAdd(R, MatMul(H, Sigma, Transpose(H)))), MatAdd(MatMul(H, mu), MatMul(S.NegativeOne, data))))
    new_Sigma = Sigma - Sigma*H.T * (R + H*Sigma*H.T).I * H * Sigma
              = MatAdd(Sigma, MatMul(S.NegativeOne, Sigma, Transpose(H)), Inverse(MatAdd(R, MatMul(H*Sigma*Transpose(H)))), H, Sigma))

    rM   zmu:zSigma:zH:zR:zdata:rP   rd   N)r-   r   r  r   r   r   r   r   r  r   r/   r@   )ÚNÚmuÚSigmaÚHrÕ   ÚdataZnew_muZ	new_Sigmar�   rP   rd   Zreplacements_expectedZreduced_exprs_expectedr8   r8   r9   Útest_cse_matrix_kalman_filterÑ  s$    B4
þ&þr  )›Ú	functoolsr   r=   Úoperatorr   Zsympy.codegen.matrix_nodesr   Zsympy.core.addr   Zsympy.core.containersr   Zsympy.core.exprr   r’   r   Zsympy.core.mulr	   Zsympy.core.powerr
   Zsympy.core.relationalr   Zsympy.core.singletonr   Zsympy.core.symbolr   r   Zsympy.core.sympifyr   Z&sympy.functions.elementary.exponentialr   Z(sympy.functions.elementary.miscellaneousr   Z$sympy.functions.elementary.piecewiser   Z(sympy.functions.elementary.trigonometricr   r   Zsympy.matrices.denser   Zsympy.matrices.expressionsr   r   r   r   Zsympy.polys.rootoftoolsr   Zsympy.series.orderr   r÷   r   Zsympy.simplify.simplifyr   Zsympy.tensor.indexedr   r    r"   Zsympy.simplify.cse_optsr#   r$   Zsympy.functions.special.hyperr%   Zsympy.simplifyr&   r'   Zsympy.utilities.iterablesr(   Zsympy.testing.pytestr)   r*   Zsympy.matricesr+   r,   r-   r.   r/   r`   rJ   r0   rG   rP   rd   rh   r›   rœ   r�   rž   rŸ   r    r¡   Úx10Zx11Zx12rB   rF   rH   rK   rL   rV   rY   r^   ra   rf   rm   ru   rw   rx   r‚   rƒ   r…   r†   r‡   rˆ   r�   r“   r•   r™   r¤   r¨   r®   r°   r³   r´   rµ   r»   r¼   r¿   rÃ   rÆ   rØ   rÛ   rÜ   rã   rä   rç   rì   rî   rð   rò   rõ   rù   rÿ   r   r  r  r	  r  r  r  r  r  r  r  r  r  r  r8   r8   r8   r9   Ú<module>   sÒ   "	

	



%
%
	




