a
    <bM                     @   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s6J t jdd} tt| dddd tddD kslJ t  } tt| ddd	d tddD ksJ d S )
Ny)prefixr   
   c                 S   s   g | ]}t d | qS zy%sr   .0i r2   m/Users/vegardjervell/Documents/master/model/venv/lib/python3.9/site-packages/sympy/simplify/tests/test_cse.py
<listcomp>+       z)test_numbered_symbols.<locals>.<listcomp>   c                 S   s   g | ]}t d | qS r-   r.   r/   r2   r2   r3   r4   .   r5   c                 S   s   g | ]}t d | qS )zx%sr.   r/   r2   r2   r3   r4   1   r5   )r    Znumbered_symbolslist	itertoolsislicerange)nsr2   r2   r3   test_numbered_symbols(   s$    r<   c                 C   s   | t  S N)r*   exprr2   r2   r3   opt16   s    r@   c                 C   s   | t  S r=   )zr>   r2   r2   r3   opt2:   s    rB   c                   C   s   t ttd fgtt ksJ t td tfgtks8J t tdgtksNJ t tttfgtt kslJ t ttd ftd fgtt t ksJ d S N)NN)r    Zpreprocess_for_csexr@   r*   rB   rA   r2   r2   r2   r3   test_preprocess_for_cse>   s    
rE   c                   C   s   t ttd fgtksJ t td tfgtt ks8J t tdgtksNJ t tttfgtt kslJ t td tfd tfgtt t ksJ d S rC   )r    Zpostprocess_for_cserD   r@   r*   rB   rA   r2   r2   r2   r3   test_postprocess_for_cseG   s    
rF   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sZJ tdg\}\}t|dkr~|dksJ tdg\}\}t|dkr|dksJ d S )N   *   r         ?)r   r   rD   r*   r   r   x0lenesubstsreducedZsubst42Zred42Z
subst_halfZred_halfr2   r2   r3   test_cse_singleQ   s    rP   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sXJ ttdgg\}}t|d ts~J td\}\}t	|dkr|dksJ td\}\}t	|dkr|dksJ d S )NrG      r   rH   rI   )
r   r   rD   r*   r   r   rJ   r   
isinstancerK   rL   r2   r2   r3   test_cse_single2^   s    rS   c                  C   sx   t tt} t| g\}}|g ks$J |tt gks6J tdtdfdg ttdtdfdg t }t|g |gfkstJ d S )N)rQ   rG      )   )rQ      )r   rD   r*   r   r   )rM   rN   rO   eqr2   r2   r3   test_cse_not_possiblem   s    
rX   c                  C   sj   t ttt t dttt t } t| g\}}|ttt t fgksLJ |tttd  gksfJ d S NrG   )r   r   wrD   r*   r   r   rJ   )rM   rN   rO   r2   r2   r3   test_nested_substitutiony   s    $r[   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sxJ 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sJ |ttt gksJ ddt   }|t  | d  d| t   } t| tjtjfgdg dgfks@J 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ZoptimizationsrQ   rG   r   rV   )rD   r*   rA   r   r   r!   r   r   rJ   rZ   x1)rM   rN   rO   nr2   r2   r3   test_subtraction_opt   s(    $
(

*0r`   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sVJ tt  t t tt g}t|\}}tt|\}}||ksJ |tt t  tgksJ tt  t tt  t t tt g}t|\}}tt|\}}||ksJ |ttt tgksJ 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stJ |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sJJ tt t t t gg t t t t gfksxJ 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sJ d S )NrV   )	rD   r*   rA   rZ   r   rJ   reversedr^   x2)e1e2rN   rO   lZrsubsts_r2   r2   r3   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stJ d S NA B CFZcommutative)r   r   rJ   ABCre   r2   r2   r3   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sbJ || | | | g}t|g |fksJ d S rh   r   r   rk   r2   r2   r3   test_bypass_non_commutatives   s    rq   c                  C   s\   t ddd\} }}t ddd}|| | ||  g}t|||| fg|| | gfksXJ d S )Nri   Frj   rJ   rp   )rl   rm   rn   rJ   re   r2   r2   r3   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spJ t tdt  t t tt d fttt fgtt t t td gfksJ t tt t t tt  tt  ttt fgtt t tt  t gfksJ td\} }}}}}}}||d  | | d|  | | | | | | |d  f}t |t|| ft| | fg|| | t dt t || | t gfksJ d S )NrG   rQ   za, b, c, d, f, g, j, mrT   )r   rD   r*   rJ   rZ   rA   r   r^   )	abcdfgjmexprsr2   r2   r3   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s8J d S rY   )r   rD   r*   rJ   r2   r2   r2   r3   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   rZ   rD   r*   rA   r2   r2   r2   r3   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sTJ d S )NrU   rT   rV   rG   r~   r\   rQ   )r   rD   rJ   r2   r2   r2   r3   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s8J d S r=   )r   r   rD   rJ   r2   r2   r2   r3   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 )NrQ   r   r~   r\   T)r	   rD   r   )rM   r2   r2   r3   test_issue_6263   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^J || |ttttfd| |ttttfd ksJ 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sJ || |ttttfdtf| |ttttfdtf ks,J d S )Nr   )Subsrw   rx   r   rQ   )sympy.core.functionr   r   r   rD   r*   rJ   )r   rw   rx   Zname_valr?   r2   r2   r3   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s8J 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sJ 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sJ t tdtd  tdtd   ttd fgtttt gfks*J t ttd ttd  ttd fgtttt gfkslJ 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sRJ t tdt  tdt   ttdt  fgtdt  gfksJ d S )NrQ   rG   )	r   rD   rJ   r^   r   r   r*   rA   r   r2   r2   r2   r3   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sJ d S )NrQ   rG   postprocess)rD   r   r*   r   r   r	   rA   r    Zcse_separaterJ   rb   r^   rW   r2   r2   r3   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sJ d S )Nr   )rs   rt   rm   GrG   rQ   r   )Z	sympy.abcrs   rt   r   r   r
   ZHalfr   rA   r   rJ   r^   rb   x3x4x5x6x7x8x9)rs   rt   rm   r   tru   ansr2   r2   r3   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s4J ttt t t t t t tt  t t kslJ d S )N   rT   rU   rG   rQ   )r   rD   r   r   r   r*   rA   rr2   r2   r3   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sJ d S )NrU   r*   )shaperD   r1   rQ   r   )r   r   r   rK   )Zlen_yr*   rD   r1   expr1expr2replacementsreduced_exprsr2   r2   r3   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sPJ 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sJ d S )Nrl   rV   r_   T)integerrm   r   )r   r   r   )r   rG   )r)   r   r   rJ   )rl   r_   rm   r2   r2   r3   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\}}|szJ t| d | | d  g\}}|sJ d S )Nrl   rV   r*   rQ   r   rG   )r)   TIr   rK   )rl   r*   r   r   r   r   r2   r2   r3   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srJ d S )Nr   T)r   rA   rD   r*   r	   r   rJ   )rw   r   Z
actual_ansr2   r2   r3   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sdJ d S )Nr   rV   rQ   rG   )r   rD   Zseriesr   r*   r   r   r   r2   r2   r3   test_ignore_order_termsz  s    &r   c                     sX   t t } tt }t| |  t|| t t g}t|\ } fdd|D |ksTJ d S )Nc                    s   g | ]}| t qS r2   subsra   r0   rM   rN   r2   r3   r4     r5   z&test_name_conflict.<locals>.<listcomp>)rJ   r*   rb   r   r   r   Zz1Zz2re   rO   r2   r   r3   test_name_conflict  s
    r   c                     s^   t t } tt }t| |  t|| t t g}t|td\ } fdd|D |ksZJ d S )Nzx:10c                    s   g | ]}| t qS r2   r   r   r   r2   r3   r4     r5   z3test_name_conflict_cust_symbols.<locals>.<listcomp>)rJ   r*   rb   r   r   r   r   r   r2   r   r3   test_name_conflict_cust_symbols  s
    r   c                  C   sn   t tt t t t tt  ttt  } tttg}tt t| |d W d    n1 s`0    Y  d S )N)r   )	r   rD   r*   rZ   r   rA   r$   
ValueErrorr   )re   symr2   r2   r3   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sJ t d
}t|\}}|d	 |ksJ t|dk sJ 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C392rQ   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   namerK   )	ZC393r   subZ	ss_answerZsubstitutionsZnew_eqnpairZ
cse_answerr?   r2   r2   r3   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sjJ t|d d | sJ qd S )NrG   r   rQ   r]   )	r%   r&   r'   r(   rD   r*   r   rJ   rR   )clsrz   resr   r2   r2   r3   test_issue_8891  s    &r   c                     s  t d\} }}}}}| | | | | | | |d  | || |d  | g}t|\}}tdd |D rpJ 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 rJ t
|D ](}
tt|D ]}|| j|
 ||< qq||ksJ q fdd
tdD }	t|	dD ]}t	|}t|\}}tdd |D rrJ t
|D ],}
tt|D ]}|| j|
 ||< qqz|fdd
|D ksBJ qBd S )Nza b f k l irG   c                 s   s    | ]}|j D ]}|jV  qqd S r=   argsZis_Mulr0   rs   r1   r2   r2   r3   	<genexpr>  r5   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 r2   r2   r/   r   sr2   r3   r4     r5   /test_issue_11230.<locals>.<listcomp>.<listcomp>rU   )r   r:   r/   r   r2   r3   r4     r5   z$test_issue_11230.<locals>.<listcomp>   rV   c                 s   s    | ]}|j D ]}|jV  qqd S r=   r   r   r2   r2   r3   r     r5   c                    s(   g | ] }t  fd dtdD  qS )c                    s   g | ]} d d qS )Nr   r2   r/   r   r2   r3   r4     r5   r   rU   )r   r:   r/   r   r2   r3   r4     r5   c                 s   s    | ]}|j D ]}|jV  qqd S r=   )r   Zis_Addr   r2   r2   r3   r     r5   c                    s   g | ]} |qS r2   r2   r/   r   r2   r3   r4     r5   )r   r   anyZsympy.core.randomr   r   r   r:   r"   r7   ra   rK   r   )rs   rt   rw   kre   r1   pRrn   exrir2   )r   r   r   r3   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snJ | | t d td d  t td   }t|ttd fgt d td  t t  gfksJ | | d S )Nc                 S   s>   t | \}}|  t|tdd |D  t| ks:J d S )Nc                 S   s   g | ]}|d    qS )rQ   r   r/   r2   r2   r3   r4     r5   z3test_issue_11577.<locals>.check.<locals>.<listcomp>)r   r   rK   sum)rW   r   ru   r2   r2   r3   check  s    ztest_issue_11577.<locals>.checkrU   rG   rT   rQ   )rD   r*   r   rJ   r^   )r   rW   r2   r2   r3   test_issue_11577  s    $2
 $
r   c                  C   s(   t d t d g} t| g | fks$J d S )NrV   rT   )rD   r   r   r2   r2   r3   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 sfJ dt| tfd\}}tdd |D rJ d	td
d |D sJ dd S )NrV   rQ   rU   c                 s   s   | ]\}}t |jv V  qd S r=   r*   Zfree_symbolsr0   rf   r   r2   r2   r3   r     r5   z"test_cse_ignore.<locals>.<genexpr>z&cse failed to identify any term with yignorec                 s   s   | ]\}}t |jv V  qd S r=   r   r   r2   r2   r3   r     r5   z,Sub-expressions containing y must be ignoredc                 s   s&   | ]\}}|t td   dkV  qdS )rQ   r   N)r   rD   r   r2   r2   r3   r     r5   z4cse failed to identify sqrt(x + 1) as sub-expression)r   r*   r   rD   r   r   )r{   Zsubst1Zred1Zsubst2Zred2r2   r2   r3   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`J d S )Nr   c                    s   g | ]}| t qS r2   r   r   r   r2   r3   r4     r5   z/test_cse_ignore_issue_15002.<locals>.<listcomp>)rZ   r   rD   rA   r*   r   )re   rO   Zrlr2   r   r3   test_cse_ignore_issue_15002  s    r   c                     s   d\}  t d   fddt| D }|d |d   dksHJ t|\}}t|dkshJ dt|D ]*\}}|t|||   dkspJ qpd S )N)rV   r6   zx:%dc                    s*   g | ]" t t fd dtD qS )c                    s    g | ]}| d  |   qS )r]   r2   )r0   ry   )r1   rD   r2   r3   r4     r5   z4test_cse__performance.<locals>.<listcomp>.<listcomp>)r   r   r:   )r0   ZntermsrD   )r1   r3   r4     s   z)test_cse__performance.<locals>.<listcomp>r   rQ   z!exprs[0] == -exprs[2], i.e. a CSE)r   r:   Zsimplifyr   rK   	enumerater   ra   )Znexprsr{   substredr1   rM   r2   r   r3   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sbJ d S )NrG   rV   r   c                 S   s   g | ]\}}|  qS r2   r   )r0   r   vr2   r2   r3   r4   (  r5   z$test_issue_12070.<locals>.<listcomp>)rD   r*   rA   r   rK   r   r   )r{   r   r   r2   r2   r3   test_issue_12070%  s
    ,r   c                  C   s8   t dt d  td   } t| d d }|| ks4J d S )NrG   rQ   r   )rD   r*   r   )rW   Zcse_eqr2   r2   r3   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sJJ d S )NrU      rG   r   rQ   )r   rD   r   r   r2   r2   r3   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evaluaterG   )r   rD   r*   r   rJ   r   r2   r2   r3   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\ } sJ |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s J d S )	Nr   )cse_release_variablesz_:5rQ   rG   r   c                    s   g | ]}|  qS r2   )r   r/   r   r2   r3   r4   H  r5   z.test_cse_release_variables.<locals>.<listcomp>)
sympy.simplify.cse_mainr   r   rD   r*   r   rJ   r^   rb   reverse)r   Z_0Z_1Z_2Z_3Z_4ZeqsrM   r2   r   r3   test_cse_release_variables;  s     (&$r   c                  C   s   dd } | t g t fksJ | dg dfks0J t g}tttfD ] }| ||g ||fks@J q@| t| g t| fks~J t di}| |g |fksJ d S )Nc                 S   s   t | ddS )NF)r7   r   )rD   r2   r2   r3   <lambda>K  r5   ztest_cse_list.<locals>.<lambda>rD   rQ   )rD   r7   tuplesetr   )Z_cseitru   rv   r2   r2   r3   test_cse_listJ  s    r   c                  C   s4   t ddd} t|  |  |  |  |  |  ks0J d S )Nrl   rG   )r)   r   )rl   r2   r2   r3   test_issue_18991V  s    r   c                  C   s(   t ddddg} t| g | fks$J d S )NrQ   rG   Fr   )r   r   )rz   r2   r2   r3   test_unevaluated_Mul[  s    r   )	functoolsr   r8   operatorr   Zsympy.core.addr   Zsympy.core.containersr   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.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(   Zsympy.matrices.expressionsr)   rZ   rD   r*   rA   rJ   r^   rb   r   r   r   r   r   r   r   Zx10Zx11Zx12r<   r@   rB   rE   rF   rP   rS   rX   r[   r`   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   r2   r2   r2   r3   <module>   s   "	

	



%
%
		