U
    9%eb                     @   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eCdldm Zdndo Zdpdq Zdrds Zdtdu Zdvdw Zdxdy Zdzd{ Zd|d} Zd~d Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZeCdd Zdd ZeCdd Zdd ZeCdd Zdd Zdd Zdd Zd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std S )
Ny)prefixr   
   c                 S   s   g | ]}t d | qS zy%sr   .0i r8   \/var/www/html/Darija-Ai-API/env/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st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st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sttdg\}\}t|dkr|dkst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sttd\}\}t
|dkr|dkst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st	|ttt gkst	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st	d S )NZoptimizationsrW   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,    $ 
( 

*0rf   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st|tt t  tgksttt  t tt  t t tt g}t|\}}tt|\}}||kst|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st|tt	 tt	gkst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st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st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st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st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   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st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st|| |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st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st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st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st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st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st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_4499,  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_6169D  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st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_IndexedL  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st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_MatrixSymbolX  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\}}|std S )Nrr   r\   r0   rW   r   rM   )r/   TIr   rQ   r@   )rr   r0   r   r   r   r   r8   r8   r9   test_cse_MatrixExpre  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_Piecewiseu  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stt d
}t|\}}|d	 |kstt|dk st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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   namer@   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 rtt|D ](}
tt|D ]}|| j|
 ||< qq||kst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st| | d S )Nc                 S   s>   t | \}}|  t|tdd |D  t| ks:td S )Nc                 S   s   g | ]}|d    qS )rW   r!   r5   r8   r8   r9   r:     s     z3test_issue_11577.<locals>.check.<locals>.<listcomp>)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 rtd	td
d |D stdd S )Nr\   rW   r[   c                 s   s   | ]\}}t |jkV  qd S rC   r0   Zfree_symbols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stnH||  krt|d| d|  kstn$d|  d|   d| }dst|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:   ,  s     z4test_cse__performance.<locals>.<listcomp>.<listcomp>)r   r   r?   )r6   ZntermsrJ   )r7   r9   r:   +  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__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sbtd S )NrM   r\   r   c                 S   s   g | ]\}}|  qS r8   r!   )r6   r   vr8   r8   r9   r:   9  s     z$test_issue_12070.<locals>.<listcomp>)rJ   r0   rG   r   rQ   r   r"   r@   )r   r   r   r8   r8   r9   test_issue_120706  s
    ,r   c                  C   s8   t dt d  td   } t| d d }|| ks4td S )NrM   rW   r   )rJ   r0   r   r@   )r]   Zcse_eqr8   r8   r9   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sJtd S )Nr[      rM   r   rW   )r   rJ   r   r@   r   r8   r8   r9   test_issue_18203C  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_mulH  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\ } st|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:   Y  s      z.test_cse_release_variables.<locals>.<listcomp>c                    s   g | ]}|  qS r8   )r   r5   r   r8   r9   r:   Z  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_variablesL  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std S )Nc                 S   s   t | ddS )NF)r<   r   )rJ   r8   r8   r9   <lambda>]      ztest_cse_list.<locals>.<lambda>rJ   rW   )rJ   r@   r<   tuplesetr   )Z_cseitr{   r|   r8   r8   r9   test_cse_list\  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_18991h  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_Mulm  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   cse_exprr8   r8   r9   "test_cse_matrix_expression_inverser  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_inversey  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st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st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  r8   r8   r8   r9   <module>   s   "	

	



%
%
	




