o
    8VaI                     @   s  d dl mZ d dlZd dl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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 d dlmZ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* d dl+m,Z,m-Z-m.Z.m/Z/ d dl0m1Z1 ed\Z2Z3Z4Z5ed\Z6Z7Z8Z9Z:Z;Z<Z=Z>Z?Z@ZAZBdd ZCdd ZDdd ZEdd ZFdd ZGdd ZHdd ZIdd ZJdd  ZKd!d" ZLd#d$ ZMe)d%d& ZNd'd( ZOe)d)d* ZPe)d+d, ZQe)d-d. ZRd/d0 ZSd1d2 ZTd3d4 ZUd5d6 ZVd7d8 ZWd9d: ZXd;d< ZYd=d> ZZd?d@ Z[dAdB Z\dCdD Z]dEdF Z^dGdH Z_dIdJ Z`dKdL ZadMdN ZbdOdP ZcdQdR ZddSdT ZedUdV Zfe)dWdX ZgdYdZ Zhd[d\ Zid]d^ Zjd_d` Zkdadb Zldcdd Zmdedf Zndgdh Zodidj Zpdkdl Zqdmdn Zrdodp ZsdS )q    )reduceN)add)AddMulPowSymbolexpsqrtsymbolssympifycseMatrixScossinEqFunctionTupleCRootOfIndexedBaseIdx	PiecewiseOsignsimp	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sJ t jdd} tt| dddd tddD ks6J t  } tt| ddd	d tddD ksOJ d S )
Ny)prefixr   
   c                 S      g | ]}t d | qS zy%sr   .0i r3   ?/usr/lib/python3/dist-packages/sympy/simplify/tests/test_cse.py
<listcomp>       z)test_numbered_symbols.<locals>.<listcomp>   c                 S   r-   r.   r/   r0   r3   r3   r4   r5      r6   c                 S   r-   )zx%sr/   r0   r3   r3   r4   r5   "   r6   )r   Znumbered_symbolslist	itertoolsislicerange)nsr3   r3   r4   test_numbered_symbols   s$   r=   c                 C   s   | t  S N)r*   exprr3   r3   r4   opt1'      rA   c                 C   s   | t  S r>   )zr?   r3   r3   r4   opt2+   rB   rD   c                   C   s   t ttd fgtt ksJ t td tfgtksJ t tdgtks'J t tttfgtt ks6J t ttd ftd fgtt t ksJJ d S N)NN)r   Zpreprocess_for_csexrA   r*   rD   rC   r3   r3   r3   r4   test_preprocess_for_cse/   s   
rG   c                   C   s   t ttd fgtksJ t td tfgtt ksJ t tdgtks'J t tttfgtt ks6J t td tfd tfgtt t ksJJ d S rE   )r   Zpostprocess_for_cserF   rA   r*   rD   rC   r3   r3   r3   r4   test_postprocess_for_cse8   s   
rH   c                  C   s   t ttt dttt } t| g\}}|ttt fgks J |tttd  gks-J tdg\}\}t|dkr?|dksAJ tdg\}\}t|dkrS|dksUJ d S )N   *   r         ?)r   r   rF   r*   r	   r   x0lenesubstsreducedZsubst42Zred42Z
subst_halfZred_halfr3   r3   r4   test_cse_singleB   s   rR   c                  C   s   t ttt dttt } t| \}}|ttt fgksJ |tttd  gks,J ttdgg\}}t|d ts?J td\}\}t	|dkrP|dksRJ td\}\}t	|dkrc|dkseJ d S )NrI      r   rJ   rK   )
r   r   rF   r*   r	   r   rL   r   
isinstancerM   rN   r3   r3   r4   test_cse_single2O   s   rU   c                  C   sx   t tt} t| g\}}|g ksJ |tt gksJ tdtdfdg ttdtdfdg t }t|g |gfks:J d S )N)rS   rI      )   )rS      )r   rF   r*   r   r   )rO   rP   rQ   eqr3   r3   r4   test_cse_not_possible]   s   
rZ   c                  C   sj   t ttt t dttt t } t| g\}}|ttt t fgks&J |tttd  gks3J d S NrI   )r   r   wrF   r*   r	   r   rL   )rO   rP   rQ   r3   r3   r4   test_nested_substitutioni   s   $r]   c                  C   sB  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/J |t tt  gks<J 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smJ |ttt gksxJ ddt   }|t  | d  d| t   } t| tjtjfgdg dgfksJ d S )NZoptimizationsrS   rI   r   )	rF   r*   rC   r   r   r    r   r   rL   )rO   rP   rQ   nr3   r3   r4   test_subtraction_optq   s"   $
(
ra   c                  C   s  t t t } t t t }t| |g\}}|tt t fgksJ |tt tt gks+J tt  t t tt g}t|\}}tt|\}}||ksKJ |tt t  tgksWJ tt  t tt  t t tt g}t|\}}tt|\}}||ks|J |ttt tgksJ 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sJ |tt fttt ftt t fgksJ |tt ttgksJ 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J tt t t t t gtt t fgttt gfks!J tt t t t gg t t t t gfks8J 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`J d S )NrX   )	rF   r*   rC   r\   r   rL   reversedx1x2)Ze1Ze2rP   rQ   lZrsubsts_r3   r3   r4   test_multiple_expressions   s8   "(($88.$"rg   c                  C   sx   t ddd\} }}| | | | | g}t|g |fksJ | | | | | g}t|t| | fgt| tgfks:J d S NA B CFZcommutative)r
   r   rL   ABCre   r3   r3   r4   test_non_commutative_cse   s
   *ro   c                  C   s   t ddd\} }}| | | | | g}t|g |fksJ | | | | | g}t|g |fks1J || | | | g}t|g |fksEJ d S rh   r
   r   rk   r3   r3   r4   test_bypass_non_commutatives   s   rq   c                  C   s\   t ddd\} }}t ddd}|| | ||  g}t|||| fg|| | gfks,J d S )Nri   Frj   rL   rp   )rl   rm   rn   rL   re   r3   r3   r4   test_non_commutative_order   s   *rr   c            	      C   s  t ttd  tt  gttt fgtt t gfksJ t tt dt t gttt fgttt gfks8J 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_J t tt t t tt  tt  ttt fgtt t tt  t gfksJ td\} }}}}}}}||d  | | d|  | | | | | | |d  f}t |t|| ft| | fg|| | t dt t || | t gfksJ d S )NrI   rS   za, b, c, d, f, g, j, mrV   )r   rF   r*   rL   r\   rC   r
   rc   )	abcdfgjmexprsr3   r3   r4   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sJ d S r[   )r   rF   r*   rL   r3   r3   r3   r4   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J d S )Nbasicr^   )r   r\   rF   r*   rC   r3   r3   r3   r4   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s*J d S )NrW   rV   rX   rI   r~   r^   rS   )r   rF   rL   r3   r3   r3   r4   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sJ d S r>   )r   r   rF   rL   r3   r3   r3   r4   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J d S )NrS   r   r~   r^   T)r   rF   r   )rO   r3   r3   r4   test_issue_6263   s    r   c                  C   s.  ddl m}  td}td}t| |ttttfd| |ttttfd \}\}|g ks/J || |ttttfd| |ttttfd ksIJ 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swJ || |ttttfdtf| |ttttfdtf ksJ d S )Nr   )Subsrw   rx   )r   rS   )sympyr   r   r   rF   r*   rL   )r   rw   rx   Zname_valr@   r3   r3   r4   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sJ 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sEJ 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spJ t tdtd  tdtd   ttd fgtttt gfksJ t ttd ttd  ttd fgtttt gfksJ t tdtd   ttd  t  ttd fgttd  ttt   gfksJ 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J t ddtd   td  ttd fgttd  gfks&J t tdt  tdt   ttdt  fgtdt  gfksGJ d S )NrS   rI   )	r   rF   rL   rc   r   r   r*   rC   r   r3   r3   r3   r4   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sUJ d S )NrS   rI   Zpostprocess)rF   r   r*   r   r   r   rC   r   Zcse_separaterL   rd   rc   rY   r3   r3   r4   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| ftt
t fttd ftttft||d tftt
 fttd td  || |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d |t tfgf}||kstJ d S )Nr   )rs   rt   rm   GrI   rS   r   )Z	sympy.abcrs   rt   r   r   r   ZHalfr	   rC   r   rL   rc   rd   x3x4x5x6x7x8x9x10)rs   rt   rm   r   tru   ansr3   r3   r4   test_issue_4499  sp   >8&4 	2,0r   c                  C   sp   t td dtd   d d} t| g | gfksJ ttt t t t t t tt  t t ks6J d S )N   rV   rW   rI   rS   )r   rF   r   r   r   r*   rC   rr3   r3   r4   test_issue_6169/  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sGJ d S )NrW   r*   )shaperF   r2   rS   r   )r   r   r   rM   )Zlen_yr*   rF   r2   expr1expr2replacementsreduced_exprsr3   r3   r4   test_cse_Indexed7  s   (r   c                  C   sT   t ddd} t| g | gfksJ tddd}t d||}t|g |gfks(J d S )Nrl   rX   r`   T)Zintegerrm   )r)   r   r
   )rl   r`   rm   r3   r3   r4   test_cse_MatrixSymbolC  s
   r   c                  C   s   ddl m}  | ddd}| ddd}|j| j| | }|j| | | }t||g\}}t|dks5J t|| |g\}}|sCJ t|d ||d  g\}}|sUJ d S )Nr   r(   rl   rX   r*   rS   rI   )r   r)   TIr   rM   )r)   rl   r*   r   r   r   r   r3   r3   r4   test_cse_MatrixExprL  s   r   c                  C   s|   t t tt  ttdft tt  df} t| }tt fttt fgt tt ttdftt dfgf}||ks<J d S )Nr   T)r   rC   rF   r*   r   r   rL   rc   )rw   r   Z
actual_ansr3   r3   r4   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s2J d S )Nr   rX   rS   rI   )r   rF   Zseriesr   r*   r   r   r   r3   r3   r4   test_ignore_order_termsd  s   &Br   c                     sX   t t } tt }t| |  t|| t t g}t|\ } fdd|D |ks*J d S )Nc                       g | ]	}| t qS r3   subsrb   r1   rO   rP   r3   r4   r5   n      z&test_name_conflict.<locals>.<listcomp>)rL   r*   rd   r   r   r   Zz1Zz2re   rQ   r3   r   r4   test_name_conflicti  s
   r   c                     s^   t t } tt }t| |  t|| t t g}t|td\ } fdd|D |ks-J d S )Nzx:10c                    r   r3   r   r   r   r3   r4   r5   v  r   z3test_name_conflict_cust_symbols.<locals>.<listcomp>)rL   r*   rd   r   r   r   r
   r   r3   r   r4   test_name_conflict_cust_symbolsq  s
   r   c                  C   sp   t tt t t t tt  ttt  } tttg}tt t| |d W d    d S 1 s1w   Y  d S )N)r
   )	r   rF   r*   r\   r   rC   r#   
ValueErrorr   )re   Zsymr3   r3   r4   test_symbols_exhausted_errory  s
   ,

"r   c            	      C   s   t d} t d}| d|} i }d|d< d|d< | |}t| \}}|D ]}|d |||d	 j< q%|d	 |}||ksAJ t d
}t|\}}|d	 |ksSJ t|dk s[J 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))C391ggv?ZC390gɥ:?ZC392rS   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   namerM   )	ZC393r   subZ	ss_answerZsubstitutionsZnew_eqnZpairZ
cse_answerr@   r3   r3   r4   test_issue_7840  s,   
r   c                  C   s   t tttfD ]:} | 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s5J t|d d | s@J qd S )NrI   r   rS   r_   )	r$   r%   r&   r'   rF   r*   r   rL   rT   )clsrz   resr   r3   r3   r4   test_issue_8891  s   &r   c                     s  t d\} }}}}}| | | | | | | |d  | || |d  | g}t|\}}tdd |D r8J ddlm  ddlm t d fd	d
tdD }	t|	dD ]6}t	|}t|\}}tdd |D rpJ t
|D ]}
tt|D ]}|| j|
 ||< q|qt||ksJ qY fdd
tdD }	t|	dD ]=}t	|}t|\}}tdd |D rJ t
|D ]}
tt|D ]}|| j|
 ||< qq|fdd
|D ksJ qd S )Nza b f k l irI   c                 s   "    | ]}|j D ]}|jV  qqd S r>   argsZis_Mulr1   rs   r2   r3   r3   r4   	<genexpr>       z#test_issue_11230.<locals>.<genexpr>r   )choice
expand_mulza:mc                    (   g | ]}t  fd dtdD  qS )c                    s   g | ]} qS r3   r3   r0   r   sr3   r4   r5         /test_issue_11230.<locals>.<listcomp>.<listcomp>rW   )r   r;   r0   r   r3   r4   r5        ( z$test_issue_11230.<locals>.<listcomp>   rX   c                 s   r   r>   r   r   r3   r3   r4   r     r   c                    r   )c                    s   g | ]
} d d qS )Nr   r3   r0   r   r3   r4   r5     s    r   rW   )r   r;   r0   r   r3   r4   r5     r   c                 s   r   r>   )r   Zis_Addr   r3   r3   r4   r     r   c                    s   g | ]} |qS r3   r3   r0   r   r3   r4   r5     r   )r
   r   anyZrandomr   sympy.core.functionr   r;   r!   r8   rb   rM   r   )rs   rt   rw   kre   r2   pRrn   exZrir3   )r   r   r   r4   test_issue_11230  s8   :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s7J | | t d td d  t td   }t|ttd fgt d td  t t  gfkseJ | | d S )Nc                 S   s>   t | \}}|  t|tdd |D  t| ksJ d S )Nc                 S   s   g | ]}|d    qS )rS   r   r0   r3   r3   r4   r5     r6   z3test_issue_11577.<locals>.check.<locals>.<listcomp>)r   r   rM   sum)rY   r   ru   r3   r3   r4   check  s   ztest_issue_11577.<locals>.checkrW   rI   rV   rS   )rF   r*   r   rL   rc   )r   rY   r3   r3   r4   test_issue_11577  s   $2
 $
r   c                  C   s(   t d t d g} t| g | fksJ d S )NrX   rV   )rF   r   r   r3   r3   r4   test_hollow_rejection     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 s3J dt| tfd\}}tdd |D rIJ d	td
d |D sVJ dd S )NrX   rS   rW   c                 s       | ]
\}}t |jv V  qd S r>   r*   Zfree_symbolsr1   rf   r   r3   r3   r4   r         z"test_cse_ignore.<locals>.<genexpr>z&cse failed to identify any term with yignorec                 s   r   r>   r   r   r3   r3   r4   r     r   z,Sub-expressions containing y must be ignoredc                 s   s(    | ]\}}|t td   dkV  qdS )rS   r   N)r	   rF   r   r3   r3   r4   r     s   & z4cse failed to identify sqrt(x + 1) as sub-expression)r   r*   r	   rF   r   r   )r{   Zsubst1Zred1Zsubst2Zred2r3   r3   r4   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s0J d S )Nr   c                    r   r3   r   r   r   r3   r4   r5     r   z/test_cse_ignore_issue_15002.<locals>.<listcomp>)r\   r   rF   rC   r*   r   )re   rQ   Zrlr3   r   r4   test_cse_ignore_issue_15002  s   r   c                     s   d\}  t d   fddt| D }|d |d   dks$J t|\}}t|dks4J dt|D ]\}}|t|||   dksMJ q8d S )N)rX   r7   zx:%dc                    s*   g | ] t t fd dtD qS )c                    s    g | ]}| d  |   qS )r_   r3   )r1   ry   )r2   rF   r3   r4   r5     s     z4test_cse__performance.<locals>.<listcomp>.<listcomp>)r   r   r;   )r1   ZntermsrF   )r2   r4   r5     s    z)test_cse__performance.<locals>.<listcomp>r   rS   z!exprs[0] == -exprs[2], i.e. a CSE)r
   r;   Zsimplifyr   rM   	enumerater   rb   )Znexprsr{   substredr2   rO   r3   r   r4   test_cse__performance  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s1J d S )NrI   rX   r   c                 S   s   g | ]\}}|  qS r3   r   )r1   r   vr3   r3   r4   r5     r6   z$test_issue_12070.<locals>.<listcomp>)rF   r*   rC   r   rM   r   r   )r{   r   r   r3   r3   r4   test_issue_12070  s
   ,r   c                  C   s8   t dt d  td   } t| d d }|| ksJ d S )NrI   rS   r   )rF   r*   r   )rY   Zcse_eqr3   r3   r4   test_issue_13000  s   r   c                  C   sN   t td dt  d dt td dt  d d } t| g | gfks%J d S )NrW      rI   r   rS   )r   rF   r   r   r3   r3   r4   test_issue_18203  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J d S )NFZevaluaterI   )r   rF   r*   r   rL   r   r3   r3   r4   test_unevaluated_mul!  s   (r   c                     s"  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~J |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 	  | fdd|D ksJ d S )	Nr   )cse_release_variablesz_:5rS   rI   r   c                    s   g | ]}|  qS r3   )r   r0   r   r3   r4   r5   2  s    z.test_cse_release_variables.<locals>.<listcomp>)
Zsympy.simplify.cse_mainr   r
   rF   r*   r   rL   rc   rd   reverse)r   Z_0Z_1Z_2Z_3Z_4ZeqsrO   r3   r   r4   test_cse_release_variables%  s    (&$r   c                  C   s   dd } | t g t fksJ | dg dfksJ t g}ttttfD ]}| ||g ||fks1J q!t di}| |g |fks@J d S )Nc                 S   s   t | ddS )NF)r8   )r   )rF   r3   r3   r4   <lambda>5  s    ztest_cse_list.<locals>.<lambda>rF   rS   )rF   r8   tuplesetr   )Z_cseitru   rv   r3   r3   r4   test_cse_list4  s   r   c                  C   s4   t ddd} t|  |  |  |  |  |  ksJ d S )Nrl   rI   )r)   r   )rl   r3   r3   r4   test_issue_18991>  s   (r   c                  C   s(   t ddddg} t| g | fksJ d S )NrS   rI   Fr   )r   r   )rz   r3   r3   r4   test_unevaluated_MulC  r   r   )t	functoolsr   r9   operatorr   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   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'   Zsympy.matrices.expressionsr)   r\   rF   r*   rC   rL   rc   rd   r   r   r   r   r   r   r   r   Zx11Zx12r=   rA   rD   rG   rH   rR   rU   rZ   r]   ra   rg   ro   rq   rr   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   r3   r3   r3   r4   <module>   s    `"	

	



	%
%
		
