
    \hc                        S SK Jr  S SKrS SKJr  S SKJr  S SKJr  S SK	J
r
  S SKJr  S SKJr  S S	KJr  S S
KJr  S SKJr  S SKJr  S SKJrJr  S SKJr  S SKJr  S SKJr  S SK J!r!  S SK"J#r#J$r$  S SK%J&r&  S SK'J(r(J)r)J*r*J+r+  S SK,J-r-  S SK.J/r/  S SK0J1r1  S SK2J3r3  S SK4J5r5J6r6  S SKJ7r7  S SK8J9r9J:r:  S SK;J<r<  S SK=J>r>J?r?  S SK@JArA  S SKBJCrCJDrD  S S KEJFrFJGrGJHrHJIrI  S S!K'JJrJ  \" S"5      u  rKrLrMrN\" S#5      u  rOrPrQrRrSrTrUrVrWrXrYrZr[S$ r\S% r]S& r^S' r_S( r`S) raS* rbS+ rcS, rdS- reS. rf\CS/ 5       rgS0 rh\CS1 5       ri\CS2 5       rj\CS3 5       rkS4 rlS5 rmS6 rnS7 roS8 rpS9 rqS: rrS; rsS< rtS= ruS> rvS? rwS@ rxSA rySB rzSC r{SD r|SE r}SF r~SG rSH r\CSI 5       rSJ rSK rSL rSM rSN rSO rSP rSQ rSR rSS rST rSU rSV rSW rSX rSY rSZ r\CS[ 5       rS\ r\CS] 5       rS^ r\CS_ 5       rS` rSa rSb rg)c    )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                  p   [         R                  " SS9n [        [        R                  " U SS5      5      [        SS5       Vs/ s H  n[        SU-  5      PM     sn:X  d   e[         R                  " SS9n [        [        R                  " U SS5      5      [        SS5       Vs/ s H  n[        SU-  5      PM     sn:X  d   e[         R                  " 5       n [        [        R                  " U SS5      5      [        SS5       Vs/ s H  n[        SU-  5      PM     sn:X  d   eg s  snf s  snf s  snf )Ny)prefixr   
   zy%s   zx%s)r'   numbered_symbolslist	itertoolsisliceranger   )nsis     U/var/www/auris/envauris/lib/python3.13/site-packages/sympy/simplify/tests/test_cse.pytest_numbered_symbolsr>   +   s/   		"	"#	.B	  
Ar 38B<@<auqy)<@A A A		"	"#	.B	  
B 49"bMBMq	*MBC C C		"	"	$B	  
Ar 38B<@<auqy)<@A A A A C As   D)%D.D3c                     U [         -   $ N)r2   exprs    r=   opt1rC   9   s    !8O    c                     U [         -  $ r@   )zrA   s    r=   opt2rG   =   s    6MrD   c                     [         R                  " [        [        S 4/5      [        [        -   :X  d   e[         R                  " [        S [        4/5      [        :X  d   e[         R                  " [        S/5      [        :X  d   e[         R                  " [        [        [
        4/5      [        [        -   :X  d   e[         R                  " [        [        S 4[
        S 4/5      [        [        -   [        -  :X  d   eg N)NN)r'   preprocess_for_csexrC   r2   rG   rF    rD   r=   test_preprocess_for_cserM   A   s    &&qD$<.9QUBBB&&qD$<.9Q>>>&&q<.9Q>>>&&qD$<.9QUBBB&&	T4L4,')-.UAI6 6 6rD   c                     [         R                  " [        [        S 4/5      [        :X  d   e[         R                  " [        S [        4/5      [        [        -   :X  d   e[         R                  " [        S/5      [        :X  d   e[         R                  " [        [        [
        4/5      [        [        -  :X  d   e[         R                  " [        S [        4S [
        4/5      [        [        -  [        -   :X  d   eg rI   )r'   postprocess_for_cserK   rC   r2   rG   rF   rL   rD   r=   test_postprocess_for_cserP   J   s    ''T4L>:a???''T4L>:a!eCCC''L>:a???''T4L>:acAAA''	T4L4,'),-aC!G4 4 4rD   c                     [        [        [        [        -   S5      [	        [        [        -   5      5      n [        U /5      u  pU[        [        [        -   4/:X  d   eU[	        [        5      [        S-  -   /:X  d   e[        S/5      u  nu  n[        U5      S:X  a  US:X  d   e[        S/5      u  nu  n[        U5      S:X  a  US:X  d   eg )N   *   r         ?)r   r   rK   r2   r   r   x0lenesubstsreducedsubst42red42
subst_halfred_halfs          r=   test_cse_singler_   T   s    CAqM4A;'A1#hOFr1q5k]"""tBx"a%'((((RD	GXew<1",,!3%jJz?aHO33OrD   c                     [        [        [        [        -   S5      [	        [        [        -   5      5      n [        U 5      u  pU[        [        [        -   4/:X  d   eU[	        [        5      [        S-  -   /:X  d   e[        [        S//5      5      u  p[        US   [        5      (       d   e[        S5      u  nu  n[        U5      S:X  a  US:X  d   e[        S5      u  nu  n[        U5      S:X  a  US:X  d   eg )NrR      r   rS   rT   )
r   r   rK   r2   r   r   rU   r   
isinstancerV   rW   s          r=   test_cse_single2rc   a   s    CAqM4A;'A!fOFr1q5k]"""tBx"a%'((((&1#-(OFgaj&))))BGXew<1",,!#hJz?aHO33OrD   c                     [        [        [        5      n [        U /5      u  pU/ :X  d   eU[        [        -   /:X  d   e[	        S[        S4S/ [        5      [	        S[        S4S/ [        5      -   n[        U5      / U/4:X  d   eg )N)ra   rR      )   )ra      )r   rK   r2   r   r&   )rX   rY   rZ   eqs       r=   test_cse_not_possibleri   p   s    Aq	A1#hOFR<<q1ug
&1a&$A
.
&1a&$A
./Br7rB4j   rD   c                  (   [        [        [        [        -  [        -   S5      [        [        [        -  [        -   5      5      n [        U /5      u  pU[        [        [        -  [        -   4/:X  d   eU[        [        5      [        S-  -   /:X  d   eg NrR   )r   r   wrK   r2   r   r   rU   )rX   rY   rZ   s      r=   test_nested_substitutionrm   |   so    C!aOT!A#']+A1#hOFr1Q37m_$$$tBx"a%'((((rD   c                     [         [        -
  [        [        -
  -  [        [         [        -
  [        [        -
  -  5      -   n [	        U /[
        R                  [
        R                  4/S9u  pU[        [         [        -
  [        [        -
  -  4/:X  d   eU[        * [        [        * 5      -   /:X  d   e[         [        -
  * [        [        -
  -  [        [         [        -
  * [        [        -
  -  5      -   n [	        U /[
        R                  [
        R                  4/S9u  pU[        [         [        -
  [        [        -
  -  4/:X  d   eU[        [        [        5      -   /:X  d   eSS[         -  -   nU[         -  U* S-  -  SU-  [         -  -
  n [	        U [
        R                  [
        R                  4/S9/ S/4:X  d   e[	        [        [         -   [        -   [        -   [        [        -
  [        -
  -  [        [         -   S-  -  5      [        [        [         -   4[        [        [        -   4/[        [        -
  [        [        -   -  [        S-  -  /4:X  d   eg )Noptimizationsra   rR   r   rg   )rK   r2   rF   r   r   r(   r$   r%   rU   rl   x1)rX   rY   rZ   ns       r=   test_subtraction_optrt      s   	
QQ#q1uq1uo..A	
X--x/@/@ABDOFrAEAE?+,,,,sS"X~&&&&
a%!a%3QxQ/00A	
X--x/@/@ABDOFrAEAE?+,,,,rCG|n$$$
QqSA	!aR!Gac!eAq("2"2H4E4E!F GH	aS	  QQQ+a!eaZ78q1u+AE{	#q2vR&8Q&>%?@A A ArD   c                     [         [        -   [        -  n [         [        -   [        -  n[	        X/5      u  p#U[
        [         [        -   4/:X  d   eU[
        [        -  [
        [        -  /:X  d   e[        [         -  [        -  [        -   [        [        -  /n[	        U5      u  p#[	        [        U5      5      u  pVX%:X  d   eU[        [         [
        -  -   [
        /:X  d   e[        [         -  [        -  [        [         -  [        -  [        -   [        [        -  /n[	        U5      u  p#[	        [        U5      5      u  pVX%:X  d   eU[        [        [        -   [
        /:X  d   e[         [        -
  [        [        -
  -  [         [        -
  [        [        -
  /n[	        U5      u  p#[	        [        U5      5      u  pVU[
        [        * 4[        [         [
        -   4[        [
        [        -   4/:X  d   eU[
        [        * 4[        [
        [        -   4[        [         [
        -   4/:X  d   eU[        [        -  [        [        /:X  d   e[        [        -  [        -   [         -   [        -   [        -   [        [         -  [        -  /n[	        U5      [
        [        [        -  4/[        [         -   [
        -   [        -   [        -   [         [
        -  /4:X  d   e[	        [         [        -   [         [        -   [        -   /5      [
        [         [        -   4/[
        [        [
        -   /4:X  d   e[	        [         [        -   [         [        -   /5      / [         [        -   [         [        -   /4:X  d   e[	        [         [        -  [        [         [        -  -   [         [        -  [        -  S-   /5      [
        [         [        -  4/[
        [        [
        -   S[
        [        -  -   /4:X  d   eg )Nrg   )	rK   r2   rF   rl   r   rU   reversedrr   x2)e1e2rY   rZ   lrsubsts_s          r=   test_multiple_expressionsr}      s   
a%B
a%B2(mOFr1q5k]"""r!tRTl"""	
1QAaCA!fOFXa[!JGq1R4xn$$$	
1Q!A	1Q3A!fOFXa[!JGr262&&&&
a%!a%!a%Q'A!fOFXa[!JGrA2hQVr26l;;;;QBx"b1fAF|<<<<r"ub"o%%%	
1q1q1	ac!e$Aq6AaCykAEBJNQ$6"#=>>>>Aq1uqy!"QU}r1r6l&CCCCAq1u~2Aq1u~"6666!Q1Wac!eai()qs)r1r61r!t8,-. . .rD   c                      [        SSS9u  pnX-  U-  X-  /n[        U5      / U4:X  d   eX-  U-  X-  /n[        U5      [        X-  4/[        U-  [        /4:X  d   eg NA B CFcommutative)r   r   rU   ABCrz   s       r=   test_non_commutative_cser      sq    g51GA!	
QAq6b!W	
QAq6ACykBqD":....rD   c                      [        SSS9u  pnX-  U-  X-  /n[        U5      / U4:X  d   eX-  U-  X-  /n[        U5      / U4:X  d   eX-  X-  U-  /n[        U5      / U4:X  d   eg r   r   r   r   s       r=   test_bypass_non_commutativesr      s    g51GA!	
QAq6b!W	
QAq6b!W	
ac!eAq6b!WrD   c                      [        SSS9u  pn[        SSS9nX-   XU-   -  /n[        U5      X1U-   4/X0U-  /4:X  d   eg )Nr   Fr   rU   r   )r   r   r   rU   rz   s        r=   test_non_commutative_orderr      sT    g51GA!	5	)B	
a1gAq6aCykB":....rD   c                  D   [        [        [        S-  -  [        [        -  -   /5      [        [        [        -  4/[        [        -  [        -   /4:X  d   e[        [        [        -   S[        -  [        -   /5      [        [        [        -   4/[        [        [        -   /4:X  d   e[        [        S[        -  -   [        -   [
        -   [        [        -   S-   45      [        [        [        -   4/[        [        -   [        -   [
        -   [        S-   /4:X  d   e[        [        [        -   [        -   [
        -   [        [        -
  -  [        [        -   -  5      [        [        [        -   4/[        [        -   [
        -   [        [        -
  -  [        -  /4:X  d   e[        S5      u  pp#pEpgX5S-  -  U-  U-  SU -  U-  U-  U-  X-  U-  US-  -  4n[        U5      [        XW-  4[        X-  4/X5-  U-  [        -  S[        -  [        -  X-  U-  [        -  /4:X  d   eg )NrR   ra   za, b, c, d, f, g, j, mre   )r   rK   r2   rU   rl   rF   r   rr   )	abcdfgjmexprss	            r=   test_issue_10228r      s   !Q$1~R1I;A"<<<<AqsQw r1q5k]RRL$AAAAAaC!aQ+,
a!eQ
QQ/11 1 1 1QQQ'!a%01
a!ea!a!e,R/062 2 2 2$%=>A!a!tVAXaZ1QqACE!Q$J/Eu:
acRIQr1R47ACE"H =   rD   c                      [        [        [        S-  -  [        [        -  -   5      [        [        [        -  4/[        [        -  [        -   /4:X  d   eg rk   )r   rK   r2   rU   rL   rD   r=   test_powersr      s>    qAv!|2qs)r!tbyk ::::rD   c                      [        [        [        [        -
  -  [        [        [        -
  -  -   SS9/ [        [        -
  [        [        -
  -  /4:X  d   eg )Nbasicro   )r   rl   rK   r2   rF   rL   rD   r=   test_issue_4498r      sG    q!a%y1a!e9$G<	q1uq1uo     rD   c                      [        [        S-  [        S-  -   [        S-  -   [        S-  -   SS9[        [        S-  4/[        [        S-  [        -   [        -   S-   -  /4:X  d   eg )Nrf   re   rg   rR   r   ro   ra   )r   rK   rU   rL   rD   r=   test_issue_4020r      sd    q!tad{QT!AqD(@!Q$ZL2q!tax"}q01234 4 4rD   c                      [        [        [        [        -  5      [        [        -  -  5      [        [        [        -  4/[        [        5      [        -  /4:X  d   eg r@   )r   r   rK   rU   rL   rD   r=   test_issue_4203r      s>    s1a4yA~RAJ<#b'"*">>>>rD   c                      [        [        [        * S-   -  [        [        S-
  -  -   S5      n [        U SS9/ S/4:X  d   eg )Nra   r   r   ro   T)r   rK   r   )rX   s    r=   test_issue_6263r      s@    
1qb1f:1q5	!1%Aq(R$L888rD   c                      [        S5      n [        SSS9n[        XS-  -  XS-  US-  -
  -  -   5      S   S   nUR                  n[        U5      [        U Vs1 s H  oDR                  iM     sn5      :X  d   eg s  snf )Nr   rU   T)realrR   re   rq   )r   r   free_symbolsrV   name)r   rK   cse_exprfreer<   s        r=   test_issue_25043r      sz    A4 A1T6A!tad{O+,R04H  Dt9T2TVVT233332s   A;
c            
      P   SSK Jn   [        S5      n[        S5      n[        U " U" [        [
        5      [        [
        4S5      U " U" [        [
        5      [        [
        4S5      -   5      u  nu  nU/ :X  d   eX@" U" [        [
        5      [        [
        4S5      U " U" [        [
        5      [        [
        4S5      -   :X  d   e[        U " U" [        [
        5      [        [
        4S[        [
        -   45      U " U" [        [
        5      [        [
        4S[        [
        -   45      -   5      u  nu  nU[        [        [
        -   4/:X  d   eX@" U" [        [
        5      [        [
        4S[        45      U " U" [        [
        5      [        [
        4S[        45      -   :X  d   eg )Nr   )Subsr   r   r   ra   )sympy.core.functionr   r	   r   rK   r2   rU   )r   r   r   name_valrB   s        r=   test_dont_cse_tuplesr     sa   (AAQq!Wq!ff%
qAwA
'	()Hgt r>>D1a1a&&11Q7QFF+, - - - Qq!Wq!fq!a%j)
qAwAAE

+	,-Hgt QU}$$$4!Q!Q!R1Qq!Wq!fq"g&' ' ' 'rD   c            	         [        S[        S-  -  [        S-  -   5      [        [        S-  4/[        S[        -  -   /4:X  d   e[        [        S-  SS[        S-  -  -   [        S-  -  -   5      [        [        S-  4[        S[        -  4/[        [        [        S-   -  -   /4:X  d   e[        S[        S-  -  SS[        S-  -  -   [        S-  -  -   5      [        [        S-  4[        S[        -  4/[        [        S-   -  [        -   /4:X  d   e[        [	        S[        S-  -  5      [        S[        S-  -  5      -   5      [        [        S-  4/[        [        5      [	        [        5      -   /4:X  d   e[        [	        [        S-  5      [        [        S-  5      -   5      [        [        S-  4/[        [        5      [	        [        5      -   /4:X  d   e[        [        S[        S-  -   -  [        [        S-  -  [        -  -   5      [        [        S-  4/[        [        S-   -  [        [        [        -  -  -   /4:X  d   e[        [        [        S-  5      [        S-  [	        S[        S-  -  5      -  -   5      [        [        S-  4/[        [	        S[        -  5      -  [        [        5      -   /4:X  d   e[        SS[        S-  -  -   [        S-  -  5      [        [        S-  4/[        [        S-   -  /4:X  d   e[        [        S[        -  -  [        S[        -  -  -   5      [        [        S[        -  -  4/[        S[        -  -   /4:X  d   eg )Nra   rR   )	r   rK   rU   rr   r   r   r2   rF   r   rL   rD   r=   test_pow_invpowr     s   qAv1}q!t*QrT	{#$ $ $q!tq1QT6z1a4''(q!t*r1R4j	!BR!V$4#567 7 7qAvQq!tVQT))*q!t*r1R4j	!BQK"$4#567 7 7s1QT6{S1a4[()q2w-3r7SW,-./ / /s1a4y3q!t9$%q!t*B#b')*+, , ,q!ad(|a1fQh&'q!t*26
Q1X-./0 0 0s1a4y1a4AadF++,q!t*3qt9s2w./01 1 1AadF
AqD !q2w-2rAv;-() ) )q1Q3x!bd)#$q1Q3x.	B2I;'( ( (rD   c                     [         S-   [        [         S-   [        S-   -  5      -   [        [        S-   5      -   n [	        U [        [         [        S-   5      [        S-
  [        S-   [         S-   -  /[        R                  S9[        [        S-   4[        [        S-   4[         [        4[        [         S-   4/[        [        [        [        -  5      -   [        [        5      -   [        S-
  [        [        -  //:X  d   eg )Nra   rR   postprocess)rK   r   r2   r   r   r   rF   r'   cse_separaterU   rw   rr   rh   s    r=   test_postprocessr   ,  s    
a%#q1uq1uo&
&QU
3BBq!a%L!a%!a%!a%9))+q1u+AE{QGb!a%[	9	c"R%j3r7	"AE2b51	33 3 3rD   c                  h   SSK Jn Jn  [        S5      n[        S5      n[	        X [
        R                  -   SU -  USU -  U-
  S-   [        [        5      S-  SU -  S-   -  U" SU -  U-
  [        [        5      5      -  U" US-
  [        [        5      5      -  U" U5      -  U" SU -  U-
  S-   5      -  [        [        5      [        [        5      S-  SU -  S-   -  -  U" U[        [        5      5      -  U" SU -  U-
  [        [        5      5      -  U" U5      -  U" SU -  U-
  S-   5      -  [        [        5      [        [        5      S-  SU -  S-   -  -  U" US-
  [        [        5      5      -  U" SU -  U-
  S-   [        [        5      5      -  U" U5      -  U" SU -  U-
  S-   5      -  [        [        5      S-  SU -  S-   -  U" U[        [        5      5      -  U" SU -  U-
  S-   [        [        5      5      -  U" U5      -  U" SU -  U-
  S-   5      -  SS[
        R                  [        S-  U* S-   SU -  U-   SU -  46 n[        U5      n[        SU -  4[        U* [        -   4[        [        S-   4[        US-
  4[        [        [        5      4[        U" [        [        5      4[         [        S-  S[        -
  -  U" U5      -  U" [        5      -  4["        [         U" [        [        5      -  4[$        U" U[        5      4[&        [         U" [        [        5      -  4/
X [
        R                  -   [        U[        [        ["        -  [        ["        -  [$        -  [        [        -  [&        -  [$        [&        -  SS[
        R                  [        S-  [        * [        * [        * 4/4nXe:X  d   eg )Nr   )r   r   r   GrR   ra   r   )	sympy.abcr   r   r	   r   r   Halfr   rF   r   rU   rr   rw   x3x4x5x6x7x8x9)r   r   r   r   tr   anss          r=   test_issue_4499r   4  sT   AA	
J!Q!a!d1gai2a4!8-DQqs	H
7F .a!eT!W%.&&'d.++,QqS1Wq[>.:QabdQh''!T!W5a!aQ7 	1	!a!n	%&*1gtAwqyBqD1H.E&EaAQG '1Q37Q;Q('))*1'../!a!n'=	abdQh!T!W-a!a!Q/ 	1	!a!n	%&'AFFAaC!aA
1		A 	AA
acR!bMBQ<"a!er47m
aBi21B/!4QrU:;b"Qr2Y,=O
a2h"b2rl+	- ZQBrE2b58RU2Xr"u
Q!bS2#s
, 	-	.C 8O8rD   c                  *   [        [        S-  S[        S-  -  -
  S-
  S5      n [        U 5      / U /4:X  d   e[        [	        [        * [
        -
  [        -  [        -
  [
        -
  5      5      [        * [        [
        -   -  [        -
  [
        -
  :X  d   eg )N   re   rf   rR   ra   )r   rK   r   r%   r$   r2   rF   )rs    r=   test_issue_6169r   L  s{    1qAv!1%Aq6b1#Y GaR!VQJNQ./0QBAJNQ4FFFFrD   c                      Sn [        SU 4S9n[        SU 4S9n[        SU S-
  5      nXS-      X   -
  X#S-      X#   -
  -  nSX#S-      X#   -
  -  n[        XE/5      u  pg[        U5      S:  d   eg )Nrf   r2   )shaperK   r<   ra   r   )r!   r    r   rV   )len_yr2   rK   r<   expr1expr2replacementsreduced_exprss           r=   test_cse_Indexedr   T  s    ECx(ACx(ACqAsVAD[1qS6!$;'Eq1vad{OE"%un"5L|q   rD   c                     [        SSS5      n [        U 5      / U /4:X  d   e[        SSS9n[        SX5      n[        U5      / U/4:X  d   e[        U S   U S   -  5      / U S   U S   -  /4:X  d   e[        U S   U S	   -  U S   U S	   -  U S
   -  -   5      [        U S   U S	   -  4/[        U S
   -  [        -   /4:X  d   eg )Nr   rg   rs   T)integerr   r   )r   r   r   )r   rR   )r0   r   r   rU   )r   rs   r   s      r=   test_cse_MatrixSymbolr   `  s    S!QAq6b1#YT"AS!Aq6b1#Yqtad{QqT!A$YK0000qvaf}qvaf}QsV3342qwqw:O9PSUVWX\V]S]`bSbRc8ddddrD   c                  R   [        SSS5      n [        SSS5      nU R                  U -  R                  U -  U-  nU R                  U -  U -  U-  n[        X#/5      u  pE[	        U5      S:  d   e[        X#-   U/5      u  pEU(       d   e[        U S-  X S-  -   /5      u  pEU(       d   eg )Nr   rg   r2   ra   r   rR   )r0   TIr   rV   )r   r2   r   r   r   r   s         r=   test_cse_MatrixExprr   m  s    S!QAS!QASSUIIMAESSUaK!OE"%un"5L|q   "%u}e&<"=L<"%q!tQAX&6"7L<rD   c                  D   [        [        * [        [        -  -   [	        [        S5      4[        * [        [        -  -
  S45      n [        U 5      n[        [        [        -  4/[        [        [        -
  [	        [        S5      4[        * [        -
  S45      /4nX:X  d   eg )Nr   T)r   rF   rK   r2   r   r   rU   )r   r   
actual_anss      r=   test_Piecewiser   }  s    A2!8R1X&!ac4(89A
a&C!9+	BFBq!H%R	78:JrD   c                  *   [        [        5      R                  [        SS5      [        [        [        S-  -   5      -   S-
  n [        U 5      / [        [        S-  [        -   5      [        -   [        S-  S-  -   [        [        S-  5      -   /4:X  d   eg )Nr   rg   ra   rR   )r   rK   seriesr   r2   r   r   r   s    r=   test_ignore_order_termsr     ss    	Qq1	AadF	+a	/Br7rC1qMA-1Q61a4@ABBBBrD   c                     [         [        -   n [        [        -   n[	        U 5      U -   [	        U5      U-   [         [        -   /n[        U5      u  p4U Vs/ s H  oUR                  [        U5      5      PM     snU:X  d   eg s  snf r@   )rU   r2   rw   r   r   r   subsrv   z1z2rz   rY   rZ   rX   s         r=   test_name_conflictr     sk    	aB	bB	R2s2w|R"W-A!fOF.56gFF8F#$g6!;;;6s   #Bc                      [         [        -   n [        [        -   n[	        U 5      U -   [	        U5      U-   [         [        -   /n[        U[        S5      5      u  p4U Vs/ s H  oUR                  [        U5      5      PM     snU:X  d   eg s  snf )Nzx:10)	rU   r2   rw   r   r   r   r   r   rv   r   s         r=   test_name_conflict_cust_symbolsr     sr    	aB	bB	R2s2w|R"W-A!WV_-OF.56gFF8F#$g6!;;;6s   #Bc                  .   [        [        [        -   5      [        -   [        -   [        [        [        -   5      -   [	        [        [        -   5      -   n [        [        [
        /n[        [        5         [        XS9  S S S 5        g ! , (       d  f       g = f)N)r   )	r   rK   r2   rl   r   rF   r+   
ValueErrorr   )rz   syms     r=   test_symbols_exhausted_errorr     sX    AaC
1S1Xc!A#h&Aa)C	
	A 
		s   3
B
Bc                     [        S5      n [        S5      nU R                  SU5      n 0 nSUS'   SUS'   U R                  U5      n[        U 5      u  pEU H&  nUS   R                  U5      X&S	   R                  '   M(     US	   R                  U5      nX7:X  d   e[        S
5      n[        U5      u  pEUS	   U:X  d   e[	        U5      S:  d   eg )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ɥ:?C392ra   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_answerrB   s	            r=   test_issue_7840r     s    	-D QD 99VD!D
CCKCK		#IIM GLL-GLL %J""" 	:D !YM1:}!!!rD   c            	      8   [         [        [        [        4 H  n U " SS[        [
        -   SSS/5      n[        [        [
        -   U/5      n[        [        [
        -   4/[        U " [        S/SS//5      /4nX#:X  d   e[        US   S   U 5      (       a  M   e   g )NrR   r   ra   rq   )	r,   r-   r.   r/   rK   r2   r   rU   rb   )clsr   resr   s       r=   test_issue_8891r     s    "$7 "791q1uaA&'1q5!*oQU}r3Q!Q'8#9:;zz#a&*c****9rD   c                  x   [        S5      u  pp#pEX-  U-  U-  U-  X-  US-  -  U-  X%-  US-  -  U-  /n[        U5      u  px[        S U 5       5      (       a   eSSKJn	  SSKJn
  [        S5      n[        S5       Vs/ s H*  n[        [        S	5       Vs/ s H
  oY" U5      PM     sn6 PM,     nn[        US
5       H{  n[        U5      n[        U5      u  px[        S U 5       5      (       a   e[        U5       H1  n[        [        U5      5       H  nX   R                  " U6 X'   M     M3     Xh:X  a  M{   e   [        S5       Vs/ s H-  n[        [        S	5       Vs/ s H  oY" US S 5      PM     sn6 PM/     nn[        US
5       H  n[        U5      n[        U5      u  px[        S U 5       5      (       a   e[        U5       H1  n[        [        U5      5       H  nX   R                  " U6 X'   M     M3     Xh Vs/ s H
  oZ" U5      PM     sn:X  a  M   e   g s  snf s  snf s  snf s  snf s  snf )Nza b f k l irR   c              3   ^   #    U  H#  oR                     H  o"R                  v   M     M%     g 7fr@   argsis_Mul.0r   r<   s      r=   	<genexpr>#test_issue_11230.<locals>.<genexpr>  s     7Q1888Q   +-r   )choice)
expand_mulza:m   rf   rg   c              3   ^   #    U  H#  oR                     H  o"R                  v   M     M%     g 7fr@   r   r  s      r=   r  r         ;AFFqxxFxr  c              3   ^   #    U  H#  oR                     H  o"R                  v   M     M%     g 7fr@   )r   is_Addr  s      r=   r  r    r
  r  )r   r   anysympy.core.randomr  r   r  r:   r
   r)   r7   rv   rV   r   r   )r   r   r   krz   r<   pRr   r  r  sexris                 r=   test_issue_11230r    s   }-A!	
QqAC1HQJAqD
+Aq6DA7Q77777 ).A7<Qx	@x!#58,8aq	8,
-xB	@R^G1v;;;;;;1+B3q6]tyy"~ #  vv  <A8	D8a#uQx0x!q!ux0
18B	DR^G1v;;;;;;1+B3q6]tyy"~ #  A.AqZ]A....  -	@ 1	D /s6    H(H#)H(H2#H-7H2H7#H(-H2c                     S n [         S-  [        S-  -  [         S-  [        -  -   [         S-  -   n[        U5      [        [         S-  4[        [         [        -  4/[         S-  [        [        -  [        -  -   [        [        -  -   /4:X  d   eU " U5        [         S-  [        S-   S-  -  [         [        S-   -  -   n[        U5      [        [        S-   4/[         S-  [        S-  -  [         [        -  -   /4:X  d   eU " U5        g )Nc                     [        U 5      u  pU R                  5       [        U5      [        S U 5       5      -   [        U5      -   :  d   eg )Nc              3   F   #    U  H  oS    R                  5       v   M     g7f)ra   Nr"   )r  r<   s     r=   r  2test_issue_11577.<locals>.check.<locals>.<genexpr>  s     51a1))1   !)r   r#   rV   sum)rh   r   r   s      r=   checktest_issue_11577.<locals>.check  sH    2w||~FS51555aL 	 rD   rf   rR   re   ra   )rK   r2   r   rU   rr   )r  rh   s     r=   test_issue_11577r    s     
AadQT!V	ad	"Br7
adb!A#Y!Q$Bq.2b5"8!9; ; ; ; 
"I	
Aq1uqj1a!e9	$Br7
a!e1RU
QrT)*, , , , 
"IrD   c                  N    [         S-   [         S-   /n [        U 5      / U 4:X  d   eg )Nrg   re   )rK   r   r   s    r=   test_hollow_rejectionr     s)    
a%QBr7r2hrD   c                     [        [        5      S[        -  S[        [        S-   5      -  -   -  [        [        5      S[        -  S[        [        S-   5      -  -   -  /n [	        U 5      u  p[        S U 5       5      (       d   S5       e[	        U [        4S9u  p4[        S U 5       5      (       a   S5       e[        S	 U 5       5      (       d   S
5       eg )Nrg   ra   rf   c              3   L   #    U  H  u  p[         UR                  ;   v   M     g 7fr@   r2   r   r  r|   r   s      r=   r  "test_cse_ignore.<locals>.<genexpr>  s     :6qC$$$6   "$z&cse failed to identify any term with yignorec              3   L   #    U  H  u  p[         UR                  ;   v   M     g 7fr@   r#  r$  s      r=   r  r%    s     >vVQ1(((vr&  z,Sub-expressions containing y must be ignoredc              3   V   #    U  H  u  pU[        [        S -   5      -
  S:H  v   M!     g7f)ra   r   N)r   rK   r$  s      r=   r  r%    s$     ;F&!sT!a%[ A%Fs   ')z4cse failed to identify sqrt(x + 1) as sub-expression)r   r2   r   rK   r   r  )r   subst1red1subst2red2s        r=   test_cse_ignorer/    s    VQqS1T!A#Y;&'Q1qac{1B)CDEu:LF:6:::d<dd:uaT*LF>v>>>n@nn>;F;;;s=ss;rD   c                  >   [         [        [        5      -  [        [        * 5      -  [        [        5      [        [        5      -  [        [        * 5      -  /n [        U [        4S9u  pU Vs/ s H  o3R                  [        U5      5      PM     nnX@:X  d   eg s  snf )Nr'  )rl   r   rK   rF   r2   r   r   rv   )rz   rY   rZ   rX   rls        r=   test_cse_ignore_issue_15002r2    sy    	#a&aRAs1vc1"g	A !QD)OF,3	4Gq&&&!
"GB	47N7 
5s   -#Bc                      [        [        S-   5      n [        SU -
  SU -
  -  /5      u  u  u  pu  nX :X  a  USU-
  SU-
  -  :X  d   eg X * :X  a  USU-   SU-   -  :X  d   eg SU  SU *  SU 3n U5       e)Nra   rq   zExpected common subexpression z or z, instead got )r   rK   r   )xp1rU   ueredmsgs        r=   test_cse_unevaluatedr8  $  s    
!a%
 Cb3h1s7345JXb	yrBw1r6****	trBw1r6****.se4v^B4PcurD   c                     Su  p[        SU-  5      n[        U 5       VVs/ s H7  n[        [        [        U5       Vs/ s H  oBU   SX4-   -  -  PM     sn5      PM9     nnnUS   US   -   R	                  5       S:X  d   e[        U5      u  pg[        U5      S:  d   S5       e[        U5       H8  u  p8UR                  [        U5      5      XS   -
  R	                  5       S:X  a  M8   e   g s  snf s  snnf )N)rg   r5   zx:%drq   r   ra   z!exprs[0] == -exprs[2], i.e. a CSE)
r   r:   r   r   simplifyr   rV   	enumerater   rv   )	nexprsntermsrK   r<   r   r   substr6  rX   s	            r=   test_cse__performancer?  1  s    NF A vA 	suV}=}!qT2+%}=> 
  !HuQx))+q000UJEu:>>>>>#x'%(2<<>!CCC  >s   C1C,C1,C1c                  
   [         [        -   S[         -   [        -   [         [        -   [        -   S[         -   [        -   [        -   /n [        U 5      u  pS[	        U5      [        S U 5       5      -   [        U5      -   :  d   eg )NrR   rg   r   c              3   F   #    U  H  u  pUR                  5       v   M     g 7fr@   r"   )r  r  vs      r=   r  #test_issue_12070.<locals>.<genexpr>B  s     !BEDA!++--Er  )rK   r2   rF   r   rV   r  r#   )r   r>  r6  s      r=   test_issue_12070rD  ?  so    UAEAIq1uqy!a%!)a-8EUJEUc!BE!BBB3  ! ! !rD   c                  n    [         S[         S-  -  [        S-  -   -  n [        U 5      S   S   nX:X  d   eg )NrR   ra   r   )rK   r2   r   )rh   cse_eqs     r=   test_issue_13000rH  F  s7    	
Bq!tGadN	BWQZ]F<<rD   c                      [        [        S-  S[        -  -   S-
  S5      [        [        S-  S[        -  -   S-
  S5      -   n [        U 5      / U /4:X  d   eg )Nrf      rR   r   ra   )r   rK   r   r   s    r=   test_issue_18203rK  L  sR    	A1q!	$wq!tbd{Q'B	BBr7rB4j   rD   c                      [        [        [        -   [        [        -   SS9n [        U 5      [        [        [        -   4/[        S-  /4:X  d   eg )NFevaluaterR   )r
   rK   r2   r   rU   r   s    r=   test_unevaluated_mulrO  Q  s?    	QUAEE	*Br7QU}r1ug....rD   c                     SSK Jn   [        S5      u  pp4n[        [        -   S-
  S-  [        [        [        -   [        [        -   S[        -  S-   -  [        [        -   S-
  S-  -   S[        -  S-   [        [        -   -  /n[        X`S9u  pxU(       d   U[        [        [        -   4[        [        S-
  S-  4[        S[        -  S-   4U[        [        -  [        -   4U[        [        -  4[        S 4U[        4[        S 4U[        4[        S 4U[        4/XX4U44:H  5       eUR                  5         U V	V
s/ s H  u  pU
c  M
  X4PM     nn	n
Xh Vs/ s H  oR                  U5      PM     sn:X  d   eg s  sn
n	f s  snf )Nr   )cse_release_variablesz_:5ra   rR   r   )sympy.simplify.cse_mainrQ  r   rK   r2   r   rU   rr   rw   reverser   )rQ  _0_1_2_3_4eqsr   rX   r  rB  r<   s               r=   test_cse_release_variablesrZ  V  sc   = BBBEAI>1	AA!a AEAI>1	
1qAEC s6DA FaQK"rAvk"R1qMBr2r6lRJRJR2t*r1g/ 240DF F F1 IIK/ADA!AA/a(a66!9a(((( 	0(s   8	E6E6E<c                  8   S n U " [         5      / [         4:X  d   eU " S5      / S4:X  d   e[         /n[        [        [        4 H  nU " U" U5      5      / U" U5      4:X  a  M   e   U " [	        U6 5      / [	        U6 4:X  d   e[         S0nU " U5      / U4:X  d   eg )Nc                     [        U SS9$ )NF)r7   r   )rK   s    r=   <lambda>test_cse_list.<locals>.<lambda>h  s    S'rD   rK   ra   )rK   r7   tuplesetr   )_cseitr   r   s       r=   test_cse_listrc  g  s    'D7r1g9S	!!!
BE3AbE{r1R5k)))   r
E2J////	
AA7r1grD   c                  \    [        SSS5      n [        U * U -  U -
  5      U * U -  U -
  :X  d   eg )Nr   rR   )r0   r   )r   s    r=   test_issue_18991re  s  s7    S!QAQBFQJA26A:---rD   c                  B    [        SSSS9/n [        U 5      / U 4:X  d   eg )Nra   rR   FrM  )r
   r   )r   s    r=   test_unevaluated_Mulrg  x  s)    	QE	"#Aq6b!WrD   c                      [        [        S5      5      R                  SS5      n [        U 5      n[	        U5      nU/ [        U 5      /4:X  d   eg NA:4rR   )r.   r   reshaper   r   r   rK   r   s      r=   "test_cse_matrix_expression_inverserm  }  sH    WU^,44Q:A
A1vHWQZL))))rD   c                      [        [        S5      5      R                  SS5      n [        [        S5      5      n[        [	        U 5      U5      n[        U5      nU/ U/4:X  d   eg Nrj  rR   zb:2)r.   r   rk  r   r   r   r   r   rK   r   s       r=   )test_cse_matrix_expression_matmul_inverserq    sX    WU^,44Q:AWU^,Awqz1A1vHQCy   rD   c                      [        [        S5      5      R                  SS5      n [        [        R
                  U 5      n[        U5      nU/ U/4:X  d   eg ri  r.   r   rk  r   r   NegativeOner   rl  s      r=   test_cse_matrix_negate_matrixru    sJ    WU^,44Q:Aq}}a A1vHQCy   rD   c                      [        [        S5      5      R                  SS5      n [        [        S5      5      R                  SS5      n[        [        R
                  X5      n[        U5      nU/ U/4:X  d   eg Nrj  rR   zB:4rs  r   r   rK   r   s       r=   +test_cse_matrix_negate_matmul_not_extractedry    se    WU^,44Q:AWU^,44Q:Aq}}a#A1vHQCy   rD   c                  6   [        [        S5      5      R                  SS5      n [        [        S5      5      R                  SS5      n[        [        R
                  [        X5      5      n[        U5      nU/ [        [        R
                  X5      /4:X  d   eg rw  rs  rx  s       r=   'test_cse_matrix_nested_matmul_collapsedr{    sv    WU^,44Q:AWU^,44Q:Aq}}fQl+A1vHVAMM189::::rD   c                      [        [        S5      5      R                  SS5      n [        [        [        U 5      5      5      n[	        U5      nU/ U /4:X  d   eg ri  )r.   r   rk  r   r   rl  s      r=   0test_cse_matrix_optimize_out_single_argument_mulr}    sM    WU^,44Q:AvfQi !A1vHQCy   rD   c            	         [        [        S5      5      R                  SS5      n [        [	        [	        [	        U 5      5      5      [	        [	        U 5      5      [	        U 5      U 5      n[        U5      nU/ [	        SU 5      /4:X  d   eg Nrj  rR   re   )r.   r   rk  r   r   r   rl  s      r=   9test_cse_matrix_optimize_out_single_argument_mul_combinedr    l    WU^,44Q:AvfVAY'(&*;VAYJA1vHVAq\N++++rD   c            	          [        [        S5      5      R                  SS5      n [        [        [        [        U 5      5      5      5      n[	        U5      nU/ U /4:X  d   eg ri  )r.   r   rk  r   r   rl  s      r=   0test_cse_matrix_optimize_out_single_argument_addr    sR    WU^,44Q:AvfVAY'()A1vHQCy   rD   c            	         [        [        S5      5      R                  SS5      n [        [	        [	        [	        U 5      5      5      [	        [	        U 5      5      [	        U 5      U 5      n[        U5      nU/ [        SU 5      /4:X  d   eg r  )r.   r   rk  r   r   r   rl  s      r=   9test_cse_matrix_optimize_out_single_argument_add_combinedr    r  rD   c                      [        [        S5      5      R                  SS5      n [        [        S5      5      n[        X5      n[	        U5      nU/ U/4:X  d   eg ro  )r.   r   rk  r   r   rp  s       r=   'test_cse_matrix_expression_matrix_solver    sR    WU^,44Q:AWU^,AAA1vHQCy   rD   c            	      p   [        [        S5      5      R                  SS5      n [        [        S5      5      n[        [	        [        [        U 5      U 5      5      [        U 5      U5      n[        U5      n[        SSS5      n[        [	        [        X@5      5      XA5      nX4[        U 5      4/U/4:X  d   eg )NzX:4rR   zy:2rU   )r.   r   rk  r   r   r   r   r0   )Xr2   r   r   rU   reduced_expr_expecteds         r=   !test_cse_matrix_matrix_expressionr    s    WU^,44Q:AWU^,AwvilA./1qAA1vH	dAq	!B"76"=#92Ail+,/D.EFFFFrD   c                  j   Sn [        [        SU  35      5      n[        [        SX -   35      5      R                  X 5      n[        [        SX -   35      5      R                  X 5      n[        [        SX -   35      5      R                  X 5      n[        [        SU  35      5      n[        U[	        U[        U5      [        [        U[	        X2[        U5      5      5      5      [        [	        X15      [	        [        R                  U5      5      5      5      n[        U[	        [        R                  U[        U5      [        [        U[	        X2[        U5      5      5      5      X25      5      n[        Xg/5      n[        SX 5      n	[        SX 5      n
U	[        U5      4U
[        [        U[	        X2U	5      5      5      4/n[        U[	        X)U
[        [	        X15      [	        [        R                  U5      5      5      5      [        U[	        [        R                  X)XU5      5      /nXU4:X  d   eg	)
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   rr   N)r.   r   rk  r   r   r   r   r   rt  r   r0   )NmuSigmaHr  datanew_mu	new_Sigmar   rU   rr   replacements_expectedreduced_exprs_expecteds                r=   test_cse_matrix_kalman_filterr    s   $ 	
A	gA3i0	1B 6!%)9!:;CCAIEWr!%\23;;AAAWr!%\23;;AAA%s 45DBuilGF1fQW`abWcFd<e4fhnouvwo|  E  FG  FS  FS  UY  Z  i[  \  ]FufQ]]E9Q<QWXY[abcluvwlx[yQzI{}~  G  HIF&'H	dA	!B	dA	!B	Yq\	WVAva3456
 	r6%RqvammUY?Z)[\]ufQ]]EreDE /EFFFFrD   )	functoolsr   r8   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   rR  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/   r0   rl   rK   r2   rF   rU   rr   rw   r   r   r   r   r   r   r   x10x11x12r>   rC   rG   rM   rP   r_   rc   ri   rm   rt   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  r?  rD  rH  rK  rO  rZ  rc  re  rg  rm  rq  ru  ry  r{  r}  r  r  r  r  r  r  rL   rD   r=   <module>r     sh      2  ' + (    $ " / & 6 9 : ? ' I I +   ' , 3 ) 5 1 - - .5 5 3 Y
1a8? 5BBBBBS#	A64
44	!)A*.< / / / /   ; ; 
4
?9
4',(*30G	!e C
<<""J+"/J  *
t
D!!
/
)"
.

*!!! ; ;! , ,! , ,!G%GrD   