o
    GZhc                     @   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   L/var/www/auris/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&   Znumbered_symbolslist	itertoolsislicerange)nsr9   r9   r:   test_numbered_symbols+   s$   rC   c                 C   s   | t  S N)r0   exprr9   r9   r:   opt19      rG   c                 C   s   | t  S rD   )zrE   r9   r9   r:   opt2=   rH   rJ   c                   C   s   t ttd fgtt ksJ t td tfgtksJ t tdgtks'J t tttfgtt ks6J t ttd ftd fgtt t ksJJ d S N)NN)r&   Zpreprocess_for_csexrG   r0   rJ   rI   r9   r9   r9   r:   test_preprocess_for_cseA   s   
rM   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 rK   )r&   Zpostprocess_for_cserL   rG   r0   rJ   rI   r9   r9   r9   r:   test_postprocess_for_cseJ   s   
rN   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
   rL   r0   r   r   x0lenesubstsreducedZsubst42Zred42Z
subst_halfZred_halfr9   r9   r:   test_cse_singleT   s   rX   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 )NrO      r   rP   rQ   )
r   r
   rL   r0   r   r   rR   r   
isinstancerS   rT   r9   r9   r:   test_cse_single2a   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)rY   rO      )   )rY      )r   rL   r0   r   r%   )rU   rV   rW   eqr9   r9   r:   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s&J |tttd  gks3J d S NrO   )r   r
   wrL   r0   r   r   rR   )rU   rV   rW   r9   r9   r:   test_nested_substitution|   s   $rc   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ZoptimizationsrY   rO   r   r^   )rL   r0   rI   r   r   r'   r#   r$   rR   rb   x1)rU   rV   rW   nr9   r9   r:   test_subtraction_opt   s(   $
(
*0rh   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^   )	rL   r0   rI   rb   r   rR   reversedrf   x2)e1e2rV   rW   lZrsubsts_r9   r9   r:   test_multiple_expressions   s8   "(($88.$"ro   c                  C   sx   t ddd\} }}| | | | | g}t|g |fksJ | | | | | g}t|t| | fgt| tgfks:J d S NA B CFZcommutative)r   r   rR   ABCrm   r9   r9   r:   test_non_commutative_cse   s
   *rw   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 rp   r   r   rs   r9   r9   r:   test_bypass_non_commutatives   s   ry   c                  C   s\   t ddd\} }}t ddd}|| | ||  g}t|||| fg|| | gfks,J d S )Nrq   Frr   rR   rx   )rt   ru   rv   rR   rm   r9   r9   r:   test_non_commutative_order   s   *rz   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 )NrO   rY   za, b, c, d, f, g, j, mr\   )r   rL   r0   rR   rb   rI   r   rf   )	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 ra   )r   rL   r0   rR   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basicrd   )r   rb   rL   r0   rI   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 )Nr]   r\   r^   rO   r   rd   rY   )r   rL   rR   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 rD   )r   r   rL   rR   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 )NrY   r   r   rd   T)r   rL   r   )rU   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}   rR   T)realrO   r\   re   c                 S   s   h | ]}|j qS r9   )namer6   r9   r9   r:   	<setcomp>   s    z#test_issue_25043.<locals>.<setcomp>)r   r   free_symbolsrS   )r}   rL   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   rY   )sympy.core.functionr   r   r   rL   r0   rR   )r   r   r   Zname_valrF   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 )NrY   rO   )	r   rL   rR   rf   r   r   r0   rI   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 )NrY   rO   postprocess)rL   r   r0   r   r   r   rI   r&   Zcse_separaterR   rj   rf   r_   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|   ru   GrO   rY   r   )Z	sympy.abcr{   r|   r   r   r   ZHalfr   rI   r   rR   rf   rj   x3x4x5x6x7x8x9)r{   r|   ru   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   r\   r]   rO   rY   )r   rL   r   r$   r#   r0   rI   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 )Nr]   r0   )shaperL   r8   rY   r   )r    r   r   rS   )Zlen_yr0   rL   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 )Nrt   r^   rg   T)integerru   r   )r   r   r   )r   rO   )r/   r   r   rR   )rt   rg   ru   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 )Nrt   r^   r0   rY   r   rO   )r/   TIr   rS   )rt   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   rI   rL   r0   r   r   rR   )r   r   Z
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   r^   rY   rO   )r   rL   Z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   subsri   r7   rU   rV   r9   r:   r;         z&test_name_conflict.<locals>.<listcomp>)rR   r0   rj   r   r   r   Zz1Zz2rm   rW   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>)rR   r0   rj   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   rL   r0   rb   r   rI   r*   
ValueErrorr   )rm   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?ZC390gɥ:?ZC392rY   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   rS   )	ZC393r   subZ	ss_answerZsubstitutionsZnew_eqnpairZ
cse_answerrF   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 )NrO   r   rY   re   )	r+   r,   r-   r.   rL   r0   r   rR   rZ   )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 irO   c                 s   "    | ]}|j D ]}|jV  qqd S rD   argsZ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>r]   )r	   rA   r6   r   r9   r:   r;        ( z$test_issue_11230.<locals>.<listcomp>   r^   c                 s   r   rD   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   r]   )r   rA   r6   r   r9   r:   r;     r   c                 s   r   rD   )r   Zis_Addr   r9   r9   r:   r     r   c                    s   g | ]} |qS r9   r9   r6   r   r9   r:   r;     r   )r   r   anyZsympy.core.randomr   r   r   rA   r(   r>   ri   rS   r   )r{   r|   r   krm   r8   pRrv   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 )rY   Nr!   r6   r9   r9   r:   r         z2test_issue_11577.<locals>.check.<locals>.<genexpr>)r   r"   rS   sum)r_   r   r}   r9   r9   r:   check  s   ztest_issue_11577.<locals>.checkr]   rO   r\   rY   )rL   r0   r   rR   rf   )r   r_   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 )Nr^   r\   )rL   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 )Nr^   rY   r]   c                 s       | ]
\}}t |jv V  qd S rD   r0   r   r7   rn   r   r9   r9   r:   r         z"test_cse_ignore.<locals>.<genexpr>z&cse failed to identify any term with yignorec                 s   r   rD   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 )rY   r   N)r   rL   r   r9   r9   r:   r     s   & z4cse failed to identify sqrt(x + 1) as sub-expression)r   r0   r   rL   r   r   )r   Zsubst1red1Z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>)rb   r   rL   rI   r0   r   )rm   rW   Z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 |)NrY   re   zExpected common subexpression z or z, instead got )r   rL   r   )Zxp1rR   Z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)r^   r=   zx:%dc                    s*   g | ] t t fd dtD qS )c                    s    g | ]}| d  |   qS )re   r9   )r7   r   )r8   rL   r9   r:   r;   5       z4test_cse__performance.<locals>.<listcomp>.<listcomp>)r   r   rA   )r7   ZntermsrL   )r8   r:   r;   4  s    z)test_cse__performance.<locals>.<listcomp>r   rY   z!exprs[0] == -exprs[2], i.e. a CSE)r   rA   simplifyr   rS   	enumerater   ri   )Znexprsr   substr   r8   rU   r9   r   r:   test_cse__performance1  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 )NrO   r^   r   c                 s   s    | ]	\}}|  V  qd S rD   r!   )r7   r   vr9   r9   r:   r   B  r   z#test_issue_12070.<locals>.<genexpr>)rL   r0   rI   r   rS   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 )NrO   rY   r   )rL   r0   r   )r_   Zcse_eqr9   r9   r:   test_issue_13000F  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]      rO   r   rY   )r   rL   r   r   r9   r9   r:   test_issue_18203L  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evaluaterO   )r	   rL   r0   r   rR   r   r9   r9   r:   test_unevaluated_mulQ  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_:5rY   rO   r   c                 S   s    g | ]\}}|d ur||fqS rD   r9   )r7   r   r   r9   r9   r:   r;   c  r   z.test_cse_release_variables.<locals>.<listcomp>c                    s   g | ]}|  qS r9   )r   r6   r   r9   r:   r;   d  s    )
sympy.simplify.cse_mainr  r   rL   r0   r   rR   rf   rj   reverse)r  Z_0Z_1Z_2Z_3Z_4ZeqsrU   r9   r   r:   test_cse_release_variablesV  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)r>   r   )rL   r9   r9   r:   <lambda>h  s    ztest_cse_list.<locals>.<lambda>rL   rY   )rL   r>   tuplesetr   )Z_cseitr}   r~   r9   r9   r:   test_cse_listg  s   r  c                  C   s4   t ddd} t|  |  |  |  |  |  ksJ d S )Nrt   rO   )r/   r   )rt   r9   r9   r:   test_issue_18991s  s   (r  c                  C   s(   t ddddg} t| g | fksJ d S )NrY   rO   Fr  )r	   r   )r   r9   r9   r:   test_unevaluated_Mulx  r   r  c                  C   s>   t tddd} t| }t|}|g t| gfksJ d S NA:4rO   )r-   r   reshaper   r   rt   rL   r   r9   r9   r:   "test_cse_matrix_expression_inverse}  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  rO   zb:2)r-   r   r  r   r   r   rt   r|   rL   r   r9   r9   r:   )test_cse_matrix_expression_matmul_inverse  s
   r  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   r  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  rO   zB:4r  rt   ru   rL   r   r9   r9   r:   +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/J d S r  r  r  r9   r9   r:   '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J d S r  )r-   r   r  r   r   r  r9   r9   r:   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s-J d S Nr  rO   r\   )r-   r   r  r   r   r   r  r9   r9   r:   9test_cse_matrix_optimize_out_single_argument_mul_combined     &r   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   r"  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 r  )r-   r   r  r   r   r   r  r9   r9   r:   9test_cse_matrix_optimize_out_single_argument_add_combined  r!  r#  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   r  r9   r9   r:   '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sBJ d S )NzX:4rO   zy:2rR   )r-   r   r  r   r   r   r   r/   )Xr0   r|   r   rR   Zreduced_expr_expectedr9   r9   r:   !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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))

    rO   zmu:zSigma:zH:zR:zdata:rR   rf   N)r-   r   r  r   r   r   r   r   r  r   r/   )NmuSigmaHr   dataZnew_muZ	new_Sigmar   rR   rf   Zreplacements_expectedZreduced_exprs_expectedr9   r9   r:   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/   rb   rL   r0   rI   rR   rf   rj   r   r   r   r   r   r   r   x10Zx11Zx12rC   rG   rJ   rM   rN   rX   r[   r`   rc   rh   ro   rw   ry   rz   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&  r,  r9   r9   r9   r:   <module>   s    "	

	

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