o
    jgc                     @   s  d dl mZ d dlZd dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZmZ d dlmZ d dlmZ d dlmZ d dl m!Z! d dl"m#Z#m$Z$ d dl%m&Z& d dl'm(Z(m)Z)m*Z*m+Z+ d dl,m-Z- d dl.m/Z/ d dl0m1Z1 d dl2m3Z3 d dl4m5Z5m6Z6 d dlm7Z7 d dl8m9Z9m:Z: d dl;m<Z< d dl=m>Z>m?Z? d dl@mAZA d dlBmCZCmDZD d d lEmFZFmGZGmHZHmIZI d d!l'mJZJ ed"\ZKZLZMZNed#\ZOZPZQZRZSZTZUZVZWZXZYZZZ[d$d% Z\d&d' Z]d(d) Z^d*d+ Z_d,d- Z`d.d/ Zad0d1 Zbd2d3 Zcd4d5 Zdd6d7 Zed8d9 ZfeCd:d; Zgd<d= ZheCd>d? ZieCd@dA ZjeCdBdC ZkdDdE ZldFdG ZmdHdI ZndJdK ZodLdM ZpdNdO ZqdPdQ ZrdRdS ZsdTdU ZtdVdW ZudXdY ZvdZd[ Zwd\d] Zxd^d_ Zyd`da Zzdbdc Z{ddde Z|dfdg Z}dhdi Z~djdk Zdldm ZeCdndo Zdpdq Zdrds Zdtdu Zdvdw Zdxdy Zdzd{ Zd|d} Zd~d Zdd 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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 r9   U/var/www/html/zoom/venv/lib/python3.10/site-packages/sympy/simplify/tests/test_cse.py
<listcomp>.       z)test_numbered_symbols.<locals>.<listcomp>   c                 S   r3   r4   r5   r6   r9   r9   r:   r;   1   r<   c                 S   r3   )zx%sr5   r6   r9   r9   r:   r;   4   r<   )r&   numbered_symbolslist	itertoolsislicerange)nsr9   r9   r:   test_numbered_symbols+   s$   rD   c                 C   s   | t  S N)r0   exprr9   r9   r:   opt19      rH   c                 C   s   | t  S rE   )zrF   r9   r9   r:   opt2=   rI   rK   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xrH   r0   rK   rJ   r9   r9   r9   r:   test_preprocess_for_cseA   s   
rO   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 rL   )r&   postprocess_for_cserN   rH   r0   rK   rJ   r9   r9   r9   r:   test_postprocess_for_cseJ   s   
rQ   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
   rN   r0   r   r   x0lenesubstsreducedsubst42red42
subst_halfred_halfr9   r9   r:   test_cse_singleT   s   r_   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 )NrR      r   rS   rT   )
r   r
   rN   r0   r   r   rU   r   
isinstancerV   rW   r9   r9   r:   test_cse_single2a   s   rb   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)r`   rR      )   )r`      )r   rN   r0   r   r%   )rX   rY   rZ   eqr9   r9   r:   test_cse_not_possiblep   s   
rg   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 NrR   )r   r
   wrN   r0   r   r   rU   )rX   rY   rZ   r9   r9   r:   test_nested_substitution|   s   $rj   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optimizationsr`   rR   r   re   )rN   r0   rJ   r   r   r'   r#   r$   rU   ri   x1)rX   rY   rZ   nr9   r9   r:   test_subtraction_opt   s(   $
(
*0rp   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 )Nre   )	rN   r0   rJ   ri   r   rU   reversedrn   x2)e1e2rY   rZ   lrsubsts_r9   r9   r:   test_multiple_expressions   s8   "(($88.$"rx   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   rU   ABCru   r9   r9   r:   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 ry   r   r   r}   r9   r9   r:   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 )Nrz   Fr{   rU   r   )r~   r   r   rU   ru   r9   r9   r:   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 )NrR   r`   za, b, c, d, f, g, j, mrc   )r   rN   r0   rU   ri   rJ   r   rn   )	abcdfgjmexprsr9   r9   r:   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 rh   )r   rN   r0   rU   r9   r9   r9   r:   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basicrk   )r   ri   rN   r0   rJ   r9   r9   r9   r:   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 )Nrd   rc   re   rR   r   rk   r`   )r   rN   rU   r9   r9   r9   r:   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 rE   )r   r   rN   rU   r9   r9   r9   r:   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 )Nr`   r   r   rk   T)r   rN   r   )rX   r9   r9   r:   test_issue_6263   s    r   c                  C   sh   t d} t ddd}t| |d  | |d |d    d d }|j}t|tdd	 |D ks2J d S )
Nr   rU   T)realrR   rc   rm   c                 S   s   h | ]}|j qS r9   )namer6   r9   r9   r:   	<setcomp>   s    z#test_issue_25043.<locals>.<setcomp>)r   r   free_symbolsrV   )r   rN   cse_exprfreer9   r9   r:   test_issue_25043   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   r`   )sympy.core.functionr   r   r   rN   r0   rU   )r   r   r   name_valrG   r9   r9   r:   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 )Nr`   rR   )	r   rN   rU   rn   r   r   r0   rJ   r   r9   r9   r9   r:   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 )Nr`   rR   postprocess)rN   r   r0   r   r   r   rJ   r&   cse_separaterU   rr   rn   rf   r9   r9   r:   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   r   GrR   r`   r   )	sympy.abcr   r   r   r   r   Halfr   rJ   r   rU   rn   rr   x3x4x5x6x7x8x9)r   r   r   r   tr   ansr9   r9   r:   test_issue_44994  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   rc   rd   rR   r`   )r   rN   r   r$   r#   r0   rJ   rr9   r9   r:   test_issue_6169L  s   <r   c                  C   s   d} t d| fd}t d| fd}td| d }||d  ||  ||d  ||   }d||d  ||   }t||g\}}t|dksGJ d S )Nrd   r0   )shaperN   r8   r`   r   )r    r   r   rV   )len_yr0   rN   r8   expr1expr2replacementsreduced_exprsr9   r9   r:   test_cse_IndexedT  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 )Nr~   re   ro   T)integerr   r   )r   r   r   )r   rR   )r/   r   r   rU   )r~   ro   r   r9   r9   r:   test_cse_MatrixSymbol`  s   .\r   c                  C   s   t ddd} t ddd}| j|  j|  | }| j|  |  | }t||g\}}t|dks/J t|| |g\}}|s=J t| d | | d  g\}}|sOJ d S )Nr~   re   r0   r`   r   rR   )r/   TIr   rV   )r~   r0   r   r   r   r   r9   r9   r:   test_cse_MatrixExprm  s   r   c                  C   sv   t t tt  ttdft tt  df} t| }ttt fgt tt ttdft t dfgf}||ks9J d S )Nr   T)r   rJ   rN   r0   r   r   rU   )r   r   
actual_ansr9   r9   r:   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   re   r`   rR   )r   rN   seriesr   r0   r   r   r   r9   r9   r:   test_ignore_order_terms  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 r9   subsrq   r7   rX   rY   r9   r:   r;         z&test_name_conflict.<locals>.<listcomp>)rU   r0   rr   r   r   r   z1z2ru   rZ   r9   r   r:   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   r9   r   r   r   r9   r:   r;     r   z3test_name_conflict_cust_symbols.<locals>.<listcomp>)rU   r0   rr   r   r   r   r   r   r9   r   r:   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   rN   r0   ri   r   rJ   r*   
ValueErrorr   )ru   symr9   r9   r:   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ɥ:?C392r`   r   a  Piecewise((Symbol('ON'), Equality(Symbol('mode'), Symbol('ON'))),         (Piecewise((Piecewise((Symbol('OFF'), StrictLessThan(Symbol('x'),         Symbol('threshold'))), (Symbol('ON'), true)), Equality(Symbol('mode'),         Symbol('AUTO'))), (Symbol('OFF'), true)), true)))r   r   r   r   rV   )	C393r   sub	ss_answersubstitutionsnew_eqnpair
cse_answerrG   r9   r9   r:   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 )NrR   r   r`   rm   )	r+   r,   r-   r.   rN   r0   r   rU   ra   )clsr   resr   r9   r9   r:   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 irR   c                 s   "    | ]}|j D ]}|jV  qqd S rE   argsis_Mulr7   r   r8   r9   r9   r:   	<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 r9   r9   r6   r   sr9   r:   r;         /test_issue_11230.<locals>.<listcomp>.<listcomp>rd   )r	   rB   r6   r   r9   r:   r;        ( z$test_issue_11230.<locals>.<listcomp>   re   c                 s   r   rE   r   r   r9   r9   r:   r     r   c                    r   )c                    s   g | ]
} d d qS )Nr   r9   r6   r   r9   r:   r;     s    r   rd   )r   rB   r6   r   r9   r:   r;     r   c                 s   r   rE   )r   is_Addr   r9   r9   r:   r     r   c                    s   g | ]} |qS r9   r9   r6   r   r9   r:   r;     r   )r   r   anysympy.core.randomr   r   r   rB   r(   r?   rq   rV   r   )r   r   r   kru   r8   pRr   exrir9   )r   r   r   r:   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    | ]	}|d    V  qdS )r`   Nr!   r6   r9   r9   r:   r         z2test_issue_11577.<locals>.check.<locals>.<genexpr>)r   r"   rV   sum)rf   r   r   r9   r9   r:   check  s   ztest_issue_11577.<locals>.checkrd   rR   rc   r`   )rN   r0   r   rU   rn   )r  rf   r9   r9   r:   test_issue_11577  s   $2
 $
r  c                  C   s(   t d t d g} t| g | fksJ d S )Nre   rc   )rN   r   r   r9   r9   r:   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 )Nre   r`   rd   c                 s       | ]
\}}t |jv V  qd S rE   r0   r   r7   rw   r   r9   r9   r:   r         z"test_cse_ignore.<locals>.<genexpr>z&cse failed to identify any term with yignorec                 s   r  rE   r  r  r9   r9   r:   r     r  z,Sub-expressions containing y must be ignoredc                 s   s(    | ]\}}|t td   dkV  qdS )r`   r   N)r   rN   r  r9   r9   r:   r     s   & z4cse failed to identify sqrt(x + 1) as sub-expression)r   r0   r   rN   r   r   )r   subst1red1subst2red2r9   r9   r:   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   r9   r   r   r   r9   r:   r;     r   z/test_cse_ignore_issue_15002.<locals>.<listcomp>)ri   r   rN   rJ   r0   r   )ru   rZ   rlr9   r   r:   test_cse_ignore_issue_15002  s   r  c                  C   s   t td } td|  d|   g\\\}}\}|| kr)|d| d|  ks'J d S ||  kr<|d| d|  ks:J d S d|  d|   d| }J |)Nr`   rm   zExpected common subexpression z or z, instead got )r   rN   r   )xp1rU   ueredmsgr9   r9   r:   test_cse_unevaluated#  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)re   r=   zx:%dc                    s*   g | ] t t fd dtD qS )c                    s    g | ]}| d  |   qS )rm   r9   )r7   r   )r8   rN   r9   r:   r;   4       z4test_cse__performance.<locals>.<listcomp>.<listcomp>)r   r   rB   )r7   ntermsrN   )r8   r:   r;   3  s    z)test_cse__performance.<locals>.<listcomp>r   r`   z!exprs[0] == -exprs[2], i.e. a CSE)r   rB   simplifyr   rV   	enumerater   rq   )nexprsr   substr  r8   rX   r9   r  r:   test_cse__performance0  s   $r  c                  C   sf   t t dt  t t t t dt  t t g} t| \}}dt|tdd |D  t| ks1J d S )NrR   re   r   c                 s   s    | ]	\}}|  V  qd S rE   r!   )r7   r   vr9   r9   r:   r   A  r   z#test_issue_12070.<locals>.<genexpr>)rN   r0   rJ   r   rV   r   r"   )r   r  r  r9   r9   r:   test_issue_12070>  s
   ,r   c                  C   s8   t dt d  td   } t| d d }|| ksJ d S )NrR   r`   r   )rN   r0   r   )rf   cse_eqr9   r9   r:   test_issue_13000E  s   r#  c                  C   sN   t td dt  d dt td dt  d d } t| g | gfks%J d S )Nrd      rR   r   r`   )r   rN   r   r   r9   r9   r:   test_issue_18203K  s   4r%  c                  C   s>   t tt tt dd} t| ttt fgtd gfksJ d S )NFevaluaterR   )r	   rN   r0   r   rU   r   r9   r9   r:   test_unevaluated_mulP  s   (r(  c                     s0  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 	  dd  D  | fd	d|D ksJ d S )
Nr   )cse_release_variablesz_:5r`   rR   r   c                 S   s    g | ]\}}|d ur||fqS rE   r9   )r7   r   r  r9   r9   r:   r;   a  r  z.test_cse_release_variables.<locals>.<listcomp>c                    s   g | ]}|  qS r9   )r   r6   r   r9   r:   r;   b  s    )
sympy.simplify.cse_mainr)  r   rN   r0   r   rU   rn   rr   reverse)r)  _0_1_2_3_4eqsrX   r9   r   r:   test_cse_release_variablesT  s"   (&$r2  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)r?   r   )rN   r9   r9   r:   <lambda>e  s    ztest_cse_list.<locals>.<lambda>rN   r`   )rN   r?   tuplesetr   )_cseitr   r   r9   r9   r:   test_cse_listd  s   r8  c                  C   s4   t ddd} t|  |  |  |  |  |  ksJ d S )Nr~   rR   )r/   r   )r~   r9   r9   r:   test_issue_18991p  s   (r9  c                  C   s(   t ddddg} t| g | fksJ d S )Nr`   rR   Fr&  )r	   r   )r   r9   r9   r:   test_unevaluated_Mulu  r  r:  c                  C   s>   t tddd} t| }t|}|g t| gfksJ d S NA:4rR   )r-   r   reshaper   r   r~   rN   r   r9   r9   r:   "test_cse_matrix_expression_inversez  s   r?  c                  C   sL   t tddd} t td}tt| |}t|}|g |gfks$J d S Nr<  rR   zb:2)r-   r   r=  r   r   r   r~   r   rN   r   r9   r9   r:   )test_cse_matrix_expression_matmul_inverse  s
   rB  c                  C   s>   t tddd} ttj| }t|}|g |gfksJ d S r;  r-   r   r=  r   r   NegativeOner   r>  r9   r9   r:   test_cse_matrix_negate_matrix  s   rE  c                  C   sT   t tddd} t tddd}ttj| |}t|}|g |gfks(J d S Nr<  rR   zB:4rC  r~   r   rN   r   r9   r9   r:   +test_cse_matrix_negate_matmul_not_extracted  s
   rH  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/J d S rF  rC  rG  r9   r9   r:   'test_cse_matrix_nested_matmul_collapsed  s
    rI  c                  C   sB   t tddd} ttt| }t|}|g | gfksJ d S r;  )r-   r   r=  r   r   r>  r9   r9   r:   0test_cse_matrix_optimize_out_single_argument_mul  s   rJ  c                  C   s^   t tddd} tttt| tt| t| | }t|}|g td| gfks-J d S Nr<  rR   rc   )r-   r   r=  r   r   r   r>  r9   r9   r:   9test_cse_matrix_optimize_out_single_argument_mul_combined     &rL  c                  C   sF   t tddd} tttt| }t|}|g | gfks!J d S r;  )r-   r   r=  r   r   r>  r9   r9   r:   0test_cse_matrix_optimize_out_single_argument_add  s   rN  c                  C   s^   t tddd} tttt| tt| t| | }t|}|g td| gfks-J d S rK  )r-   r   r=  r   r   r   r>  r9   r9   r:   9test_cse_matrix_optimize_out_single_argument_add_combined  rM  rO  c                  C   sH   t tddd} t td}t| |}t|}|g |gfks"J d S r@  )r-   r   r=  r   r   rA  r9   r9   r:   'test_cse_matrix_expression_matrix_solve  s
   
rP  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sBJ d S )NzX:4rR   zy:2rU   )r-   r   r=  r   r   r   r   r/   )Xr0   r   r   rU   reduced_expr_expectedr9   r9   r:   !test_cse_matrix_matrix_expression  s    rS  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sJ 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))

    rR   zmu:zSigma:zH:zR:zdata:rU   rn   N)r-   r   r=  r   r   r   r   r   rD  r   r/   )NmuSigmaHr   datanew_mu	new_Sigmar   rU   rn   replacements_expectedreduced_exprs_expectedr9   r9   r:   test_cse_matrix_kalman_filter  s$   B4
&r]  )	functoolsr   r@   operatorr   sympy.codegen.matrix_nodesr   sympy.core.addr   sympy.core.containersr   sympy.core.exprr   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.matrices.expressionsr   r   r   r   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.   r/   ri   rN   r0   rJ   rU   rn   rr   r   r   r   r   r   r   r   x10x11x12rD   rH   rK   rO   rQ   r_   rb   rg   rj   rp   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(  r2  r8  r9  r:  r?  rB  rE  rH  rI  rJ  rL  rN  rO  rP  rS  r]  r9   r9   r9   r:   <module>   s    "	

	

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