o
    *ήcM                     @   sZ  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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* d dl+m,Z,m-Z- d dl	m.Z. d dl/m0Z0m1Z1 d dl2m3Z3 d dl4m5Z5m6Z6 d dl7m8Z8 d dl9m:Z:m;Z; d dl<m=Z=m>Z>m?Z?m@Z@ d dlAmBZB ed\ZCZDZEZFed \ZGZHZIZJZKZLZMZNZOZPZQZRZSd!d" ZTd#d$ ZUd%d& ZVd'd( ZWd)d* ZXd+d, ZYd-d. ZZd/d0 Z[d1d2 Z\d3d4 Z]d5d6 Z^e:d7d8 Z_d9d: Z`e:d;d< Zae:d=d> Zbe:d?d@ ZcdAdB ZddCdD ZedEdF ZfdGdH ZgdIdJ ZhdKdL ZidMdN ZjdOdP ZkdQdR ZldSdT ZmdUdV ZndWdX ZodYdZ Zpd[d\ Zqd]d^ Zrd_d` Zsdadb Ztdcdd Zudedf Zvdgdh Zwe:didj Zxdkdl Zydmdn Zzdodp Z{dqdr Z|dsdt Z}dudv Z~dwdx Zdydz Zd{d| Zd}d~ Zdd Zdd ZdS )    )reduceN)add)Add)Tuple)Function)Mul)Pow)Eq)S)Symbolsymbols)sympify)exp)sqrt)	Piecewise)cossin)Matrix)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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   D/tmp/pip-target-vg8gfxp4/lib/python/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   1   r6   )r    numbered_symbolslist	itertoolsislicerange)nsr3   r3   r4   test_numbered_symbols(   s$   r>   c                 C   s   | t  S N)r*   exprr3   r3   r4   opt16      rB   c                 C   s   | t  S r?   )zr@   r3   r3   r4   opt2:   rC   rE   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    preprocess_for_csexrB   r*   rE   rD   r3   r3   r3   r4   test_preprocess_for_cse>   s   
rI   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 rF   )r    postprocess_for_cserH   rB   r*   rE   rD   r3   r3   r3   r4   test_postprocess_for_cseG   s   
rK   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   rH   r*   r   r   x0lenesubstsreducedsubst42red42
subst_halfred_halfr3   r3   r4   test_cse_singleQ   s   rY   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 )NrL      r   rM   rN   )
r   r   rH   r*   r   r   rO   r   
isinstancerP   rQ   r3   r3   r4   test_cse_single2^   s   r\   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)rZ   rL      )   )rZ      )r   rH   r*   r   r   )rR   rS   rT   eqr3   r3   r4   test_cse_not_possiblem   s   
ra   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 NrL   )r   r   wrH   r*   r   r   rO   )rR   rS   rT   r3   r3   r4   test_nested_substitutiony   s   $rd   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/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 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sJ d S )NoptimizationsrZ   rL   r   r_   )rH   r*   rD   r   r   r!   r   r   rO   rc   x1)rR   rS   rT   nr3   r3   r4   test_subtraction_opt   s(   $
(
*0rj   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 )Nr_   )	rH   r*   rD   rc   r   rO   reversedrh   x2)e1e2rS   rT   lrsubsts_r3   r3   r4   test_multiple_expressions   s8   "(($88.$"rr   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commutative)r   r   rO   ABCro   r3   r3   r4   test_non_commutative_cse   s
   *r{   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 rs   r   r   rw   r3   r3   r4   test_bypass_non_commutatives   s   r}   c                  C   s\   t ddd\} }}t ddd}|| | ||  g}t|||| fg|| | gfks,J d S )Nrt   Fru   rO   r|   )rx   ry   rz   rO   ro   r3   r3   r4   test_non_commutative_order   s   *r~   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 )NrL   rZ   za, b, c, d, f, g, j, mr]   )r   rH   r*   rO   rc   rD   r   rh   )	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 rb   )r   rH   r*   rO   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basicre   )r   rc   rH   r*   rD   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 )Nr^   r]   r_   rL   r   re   rZ   )r   rH   rO   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   rH   rO   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 )NrZ   r   r   re   T)r	   rH   r   )rR   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   )Subsr   r   r   rZ   )sympy.core.functionr   r   r   rH   r*   rO   )r   r   r   name_valrA   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 )NrZ   rL   )	r   rH   rO   rh   r   r   r*   rD   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 )NrZ   rL   postprocess)rH   r   r*   r   r   r	   rD   r    cse_separaterO   rl   rh   r`   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| 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soJ d S )Nr   )r   r   ry   GrL   rZ   r   )	sympy.abcr   r   r   r   r
   Halfr   rD   r   rO   rh   rl   x3x4x5x6x7x8x9)r   r   ry   r   tr   ansr3   r3   r4   test_issue_4499)  sh   >8&4 	4>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   r]   r^   rL   rZ   )r   rH   r   r   r   r*   rD   rr3   r3   r4   test_issue_6169A  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 )Nr^   r*   )shaperH   r2   rZ   r   )r   r   r   rP   )len_yr*   rH   r2   expr1expr2replacementsreduced_exprsr3   r3   r4   test_cse_IndexedI  s   (r   c                  C   s   t ddd} t| g | gfksJ tddd}t d||}t|g |gfks(J t| d | d  g | d | d  gfks?J t| d | d	  | d | d	  | d
   t| d | d	  fgt| d
  t gfkskJ d S )Nrx   r_   ri   T)integerry   r   )r   r   r   )r   rL   )r)   r   r   rO   )rx   ri   ry   r3   r3   r4   test_cse_MatrixSymbolU  s   .\r   c                  C   s   t ddd} t ddd}| j|  j|  | }| j|  |  | }t||g\}}t|dks/J t|| |g\}}|s=J t| d | | d  g\}}|sOJ d S )Nrx   r_   r*   rZ   r   rL   )r)   TIr   rP   )rx   r*   r   r   r   r   r3   r3   r4   test_cse_MatrixExprb  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s9J d S )Nr   T)r   rD   rH   r*   r	   r   rO   )r   r   
actual_ansr3   r3   r4   test_Piecewiser  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   r_   rZ   rL   )r   rH   seriesr   r*   r   r   r   r3   r3   r4   test_ignore_order_termsz  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   subsrk   r1   rR   rS   r3   r4   r5         z&test_name_conflict.<locals>.<listcomp>)rO   r*   rl   r   r   r   z1z2ro   rT   r3   r   r4   test_name_conflict  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     r   z3test_name_conflict_cust_symbols.<locals>.<listcomp>)rO   r*   rl   r   r   r   r   r   r3   r   r4   test_name_conflict_cust_symbols  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   rH   r*   rc   r   rD   r$   
ValueErrorr   )ro   symr3   r3   r4   test_symbols_exhausted_error  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?C390gɥ:?C392rZ   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   namerP   )	C393r   sub	ss_answersubstitutionsnew_eqnpair
cse_answerrA   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 )NrL   r   rZ   rg   )	r%   r&   r'   r(   rH   r*   r   rO   r[   )clsr   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 irL   c                 s   "    | ]}|j D ]}|jV  qqd S r?   argsis_Mulr1   r   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>r^   )r   r<   r0   r   r3   r4   r5        ( z$test_issue_11230.<locals>.<listcomp>   r_   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   r^   )r   r<   r0   r   r3   r4   r5     r   c                 s   r   r?   )r   is_Addr   r3   r3   r4   r     r   c                    s   g | ]} |qS r3   r3   r0   r   r3   r4   r5     r   )r   r   anysympy.core.randomr   r   r   r<   r"   r9   rk   rP   r   )r   r   r   kro   r2   pRrz   ex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 )rZ   r   r0   r3   r3   r4   r5     r6   z3test_issue_11577.<locals>.check.<locals>.<listcomp>)r   r   rP   sum)r`   r   r   r3   r3   r4   check  s   ztest_issue_11577.<locals>.checkr^   rL   r]   rZ   )rH   r*   r   rO   rh   )r   r`   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 )Nr_   r]   )rH   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 )Nr_   rZ   r^   c                 s       | ]
\}}t |jv V  qd S r?   r*   free_symbolsr1   rq   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 )rZ   r   N)r   rH   r   r3   r3   r4   r     s   & z4cse failed to identify sqrt(x + 1) as sub-expression)r   r*   r   rH   r   r   )r   subst1red1subst2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>)rc   r   rH   rD   r*   r   )ro   rT   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)r_   r7   zx:%dc                    s*   g | ] t t fd dtD qS )c                    s    g | ]}| d  |   qS )rg   r3   )r1   r   )r2   rH   r3   r4   r5     s     z4test_cse__performance.<locals>.<listcomp>.<listcomp>)r   r   r<   )r1   ntermsrH   )r2   r4   r5     s    z)test_cse__performance.<locals>.<listcomp>r   rZ   z!exprs[0] == -exprs[2], i.e. a CSE)r   r<   simplifyr   rP   	enumerater   rk   )nexprsr   substredr2   rR   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 )NrL   r_   r   c                 S   s   g | ]\}}|  qS r3   r   )r1   r   vr3   r3   r4   r5   (  r6   z$test_issue_12070.<locals>.<listcomp>)rH   r*   rD   r   rP   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 )NrL   rZ   r   )rH   r*   r   )r`   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 )Nr^      rL   r   rZ   )r   rH   r   r   r3   r3   r4   test_issue_182032  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evaluaterL   )r   rH   r*   r   rO   r   r3   r3   r4   test_unevaluated_mul7  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_:5rZ   rL   r   c                    s   g | ]}|  qS r3   )r   r0   r   r3   r4   r5   H  s    z.test_cse_release_variables.<locals>.<listcomp>)
sympy.simplify.cse_mainr  r   rH   r*   r   rO   rh   rl   reverse)r  _0_1_2_3_4eqsrR   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fD ]}| ||g ||fks0J q | t| g t| fks?J t di}| |g |fksMJ d S )Nc                 S   s   t | ddS )NF)r9   r   )rH   r3   r3   r4   <lambda>K  s    ztest_cse_list.<locals>.<lambda>rH   rZ   )rH   r9   tuplesetr   )_cseitr   r   r3   r3   r4   test_cse_listJ  s   r'  c                  C   s4   t ddd} t|  |  |  |  |  |  ksJ d S )Nrx   rL   )r)   r   )rx   r3   r3   r4   test_issue_18991V  s   (r(  c                  C   s(   t ddddg} t| g | fksJ d S )NrZ   rL   Fr  )r   r   )r   r3   r3   r4   test_unevaluated_Mul[  r   r)  )	functoolsr   r:   operatorr   sympy.core.addr   sympy.core.containersr   r   r   sympy.core.mulr   sympy.core.powerr   sympy.core.relationalr	   sympy.core.singletonr
   sympy.core.symbolr   r   sympy.core.sympifyr   &sympy.functions.elementary.exponentialr   (sympy.functions.elementary.miscellaneousr   $sympy.functions.elementary.piecewiser   (sympy.functions.elementary.trigonometricr   r   sympy.matrices.denser   sympy.polys.rootoftoolsr   sympy.series.orderr   r  r   sympy.simplify.simplifyr   sympy.tensor.indexedr   r   r   sympy.simplify.cse_optsr   r   sympy.functions.special.hyperr   sympy.simplifyr    r!   sympy.utilities.iterablesr"   sympy.testing.pytestr#   r$   sympy.matricesr%   r&   r'   r(   sympy.matrices.expressionsr)   rc   rH   r*   rD   rO   rh   rl   r   r   r   r   r   r   r   x10x11x12r>   rB   rE   rI   rK   rY   r\   ra   rd   rj   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!  r'  r(  r)  r3   r3   r3   r4   <module>   s    "	

	

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