
    gc                     
   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"          \  ZKZLZMZN ed#          \  ZOZPZQZRZSZTZUZVZWZXZYZZZ[d$ Z\d% Z]d& Z^d' Z_d( Z`d) Zad* Zbd+ Zcd, Zdd- Zed. ZfeCd/             Zgd0 ZheCd1             ZieCd2             ZjeCd3             Zkd4 Zld5 Zmd6 Znd7 Zod8 Zpd9 Zqd: Zrd; Zsd< Ztd= Zud> Zvd? Zwd@ ZxdA ZydB ZzdC Z{dD Z|dE Z}dF Z~dG ZdH ZeCdI             ZdJ ZdK ZdL ZdM ZdN ZdO ZdP ZdQ ZdR ZdS ZdT ZdU ZdV ZdW ZdX ZdY ZdZ ZeCd[             Zd\ ZeCd]             Zd^ ZeCd_             Zd` Zda Zdb ZdS )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                     t          j        d          } t          t          j        | dd                    d t          dd          D             k    sJ t          j        d          } t          t          j        | dd                    d t          dd          D             k    sJ t          j                    } t          t          j        | dd                    d t          dd          D             k    sJ d S )	Ny)prefixr   
   c                 2    g | ]}t          d |z            S zy%sr   .0is     Y/var/www/html/ai-engine/env/lib/python3.11/site-packages/sympy/simplify/tests/test_cse.py
<listcomp>z)test_numbered_symbols.<locals>.<listcomp>.   $    @@@auqy))@@@       c                 2    g | ]}t          d |z            S r6   r7   r8   s     r;   r<   z)test_numbered_symbols.<locals>.<listcomp>1   s$    BBBq	**BBBr>   c                 2    g | ]}t          d |z            S )zx%sr7   r8   s     r;   r<   z)test_numbered_symbols.<locals>.<listcomp>4   r=   r>   )r'   numbered_symbolslist	itertoolsislicerange)nss    r;   test_numbered_symbolsrH   +   s>   		"#	.	.	.B	 
Ar   @@5B<<@@@A A A A		"#	.	.	.B	 
B   BBE"bMMBBBC C C C		"	$	$B	 
Ar   @@5B<<@@@A A A A A Ar>   c                     | t           z   S N)r2   exprs    r;   opt1rM   9   s    !8Or>   c                     | t           z  S rJ   )zrK   s    r;   opt2rP   =   s    6Mr>   c                     t          j        t          t          d fg          t          t          z   k    sJ t          j        t          d t          fg          t          k    sJ t          j        t          dg          t          k    sJ t          j        t          t          t
          fg          t          t          z   k    sJ t          j        t          t          d ft
          d fg          t          t          z   t          z  k    sJ d S N)NN)r'   preprocess_for_csexrM   r2   rP   rO    r>   r;   test_preprocess_for_cserV   A   s    &qD$<.99QUBBBB&qD$<.99Q>>>>&q<.99Q>>>>&qD$<.99QUBBBB&	T4L4,') )-.UAI6 6 6 6 6 6r>   c                     t          j        t          t          d fg          t          k    sJ t          j        t          d t          fg          t          t          z   k    sJ t          j        t          dg          t          k    sJ t          j        t          t          t
          fg          t          t          z  k    sJ t          j        t          d t          fd t
          fg          t          t          z  t          z   k    sJ d S rR   )r'   postprocess_for_cserT   rM   r2   rP   rO   rU   r>   r;   test_postprocess_for_cserY   J   s    'T4L>::a????'T4L>::a!eCCCC'L>::a????'T4L>::acAAAA'	T4L4,') ),-aC!G4 4 4 4 4 4r>   c                     t          t          t          t          z   d          t	          t          t          z                       } t          | g          \  }}|t          t          t          z   fgk    sJ |t	          t                    t          dz  z   gk    sJ t          dg          \  }\  }t          |          dk    r|dk    sJ t          dg          \  }\  }t          |          dk    r|dk    sJ d S )N   *   r         ?)r   r   rT   r2   r   r   x0lenesubstsreducedsubst42red42
subst_halfred_halfs          r;   test_cse_singlerh   T   s    CAqMM4A;;''A1#hhOFGr1q5k]""""tBxx"a%'(((((RD		GXew<<1"!3%jjJz??aHOOOOOOr>   c                  r   t          t          t          t          z   d          t	          t          t          z                       } t          |           \  }}|t          t          t          z   fgk    sJ |t	          t                    t          dz  z   gk    sJ t          t          dgg                    \  }}t          |d         t                    sJ t          d          \  }\  }t          |          dk    r|dk    sJ t          d          \  }\  }t          |          dk    r|dk    sJ d S )Nr[      r   r\   r]   )
r   r   rT   r2   r   r   r^   r   
isinstancer_   r`   s          r;   test_cse_single2rl   a   s   CAqMM4A;;''A!ffOFGr1q5k]""""tBxx"a%'(((((&1#--((OFGgaj&)))))BGXew<<1"!#hhJz??aHOOOOOOr>   c                  J   t          t          t                    } t          | g          \  }}|g k    sJ |t          t          z   gk    sJ t	          dt          dfdg t                    t	          dt          dfdg t                    z   }t          |          g |gfk    sJ d S )N)rj   r[      )   )rj      )r   rT   r2   r   r&   )ra   rb   rc   eqs       r;   test_cse_not_possiblerr   p   s    Aq		A1#hhOFGR<<<<q1ug
&1a&$A
.
.
&1a&$A
.
./Br77rB4j      r>   c                  l   t          t          t          t          z  t          z   d          t          t          t          z  t          z                       } t          | g          \  }}|t          t          t          z  t          z   fgk    sJ |t          t                    t          dz  z   gk    sJ d S Nr[   )r   r   wrT   r2   r   r   r^   )ra   rb   rc   s      r;   test_nested_substitutionrv   |   s    C!aOOT!A#']]++A1#hhOFGr1Q37m_$$$$tBxx"a%'(((((((r>   c                  L   t           t          z
  t          t          z
  z  t          t           t          z
  t          t          z
  z            z   } t	          | gt
          j        t
          j        fg          \  }}|t          t           t          z
  t          t          z
  z  fgk    sJ |t           t          t                     z   gk    sJ t           t          z
   t          t          z
  z  t          t           t          z
   t          t          z
  z            z   } t	          | gt
          j        t
          j        fg          \  }}|t          t           t          z
  t          t          z
  z  fgk    sJ |t          t          t                    z   gk    sJ ddt           z  z   }|t           z  | dz  z  d|z  t           z  z
  } t	          | t
          j        t
          j        fg          g dgfk    sJ t	          t          t           z   t          z   t          z   t          t          z
  t          z
  z  t          t           z   dz  z            t          t          t           z   ft          t          t          z   fgt          t          z
  t          t          z   z  t          dz  z  gfk    sJ d S )Noptimizationsrj   r[   r   rp   )rT   r2   rO   r   r   r(   r$   r%   r^   ru   x1)ra   rb   rc   ns       r;   test_subtraction_optr}      s8   	
QQ#q1uq1uo...A	
X-x/@ABD D DOFGrAEAE?+,,,,,sS"XX~&&&&&
a%!a%3QxQ/000A	
X-x/@ABD D DOFGrAEAE?+,,,,,rCGG|n$$$$
QqSA	!aR!Gac!eAq("2H4E!F GHHH	aS	   QQQ+a!eaZ788q1u+AE{	#q2vR&8Q&>%?@A A A A A Ar>   c                  L	   t           t          z   t          z  } t           t          z   t          z  }t	          | |g          \  }}|t
          t           t          z   fgk    sJ |t
          t          z  t
          t          z  gk    sJ t          t           z  t          z  t          z   t          t          z  g}t	          |          \  }}t	          t          |                    \  }}||k    sJ |t          t           t
          z  z   t
          gk    sJ t          t           z  t          z  t          t           z  t          z  t          z   t          t          z  g}t	          |          \  }}t	          t          |                    \  }}||k    sJ |t          t          t          z   t
          gk    sJ t           t          z
  t          t          z
  z  t           t          z
  t          t          z
  g}t	          |          \  }}t	          t          |                    \  }}|t
          t           ft          t           t
          z   ft          t
          t          z   fgk    sJ |t
          t           ft          t
          t          z   ft          t           t
          z   fgk    sJ |t          t          z  t          t          gk    sJ t          t          z  t          z   t           z   t          z   t          z   t          t           z  t          z  g}t	          |          t
          t          t          z  fgt          t           z   t
          z   t          z   t          z   t           t
          z  gfk    sJ t	          t           t          z   t           t          z   t          z   g          t
          t           t          z   fgt
          t          t
          z   gfk    sJ t	          t           t          z   t           t          z   g          g t           t          z   t           t          z   gfk    sJ t	          t           t          z  t          t           t          z  z   t           t          z  t          z  dz   g          t
          t           t          z  fgt
          t          t
          z   dt
          t          z  z   gfk    sJ d S )Nrp   )	rT   r2   rO   ru   r   r^   reversedr{   x2)e1e2rb   rc   lrsubsts_s          r;   test_multiple_expressionsr      sT   
a%B
a%B2r(mmOFGr1q5k]""""r!tRTl""""	
1QAaCA!ffOFGXa[[!!JGQWq1R4xn$$$$	
1Q!A	1Q3A!ffOFGXa[[!!JGQWr262&&&&&
a%!a%!a%Q'A!ffOFGXa[[!!JGQrA2hQVr26l;;;;;QBx"b1fAF|<<<<<r"ub"o%%%%	
1q1q1	ac!e$Aq66AaCykAEBJNQ$6"#=>>>>>Aq1uqy!""QU}r1r6l&CCCCCAq1u~2Aq1u~"66666!Q1Wac!eai())qs)r1r61r!t8,-. . . . . .r>   c                      t          dd          \  } }}| |z  |z  | |z  g}t          |          g |fk    sJ | |z  |z  | |z  g}t          |          t          | |z  fgt          |z  t          gfk    sJ d S NA B CFcommutative)r   r   r^   ABCr   s       r;   test_non_commutative_cser      s    g5111GAq!	
1Q!Aq66b!W	
1Q!Aq66AaCykBqD":.......r>   c                     t          dd          \  } }}| |z  |z  | |z  g}t          |          g |fk    sJ | |z  |z  | |z  g}t          |          g |fk    sJ ||z  | |z  |z  g}t          |          g |fk    sJ d S r   r   r   r   s       r;   test_bypass_non_commutativesr      s    g5111GAq!	
1Q!Aq66b!W	
1Q!Aq66b!W	
1ac!eAq66b!Wr>   c                      t          dd          \  } }}t          dd          }||z   | ||z   z  g}t          |          |||z   fg|| |z  gfk    sJ d S )Nr   Fr   r^   r   )r   r   r   r^   r   s        r;   test_non_commutative_orderr      su    g5111GAq!	5	)	)	)B	
1a1gAq66AaCykB":.......r>   c                     t          t          t          dz  z  t          t          z  z   g          t          t          t          z  fgt          t          z  t          z   gfk    sJ t          t          t          z   dt          z  t          z   g          t          t          t          z   fgt          t          t          z   gfk    sJ t          t          dt          z  z   t          z   t
          z   t          t          z   dz   f          t          t          t          z   fgt          t          z   t          z   t
          z   t          dz   gfk    sJ t          t          t          z   t          z   t
          z   t          t          z
  z  t          t          z   z            t          t          t          z   fgt          t          z   t
          z   t          t          z
  z  t          z  gfk    sJ t          d          \  } }}}}}}}||dz  z  |z  |z  d| z  |z  |z  |z  | |z  |z  |dz  z  f}t          |          t          ||z  ft          | |z  fg||z  |z  t          z  dt          z  t          z  ||z  |z  t          z  gfk    sJ d S )Nr[   rj   za, b, c, d, f, g, j, mrn   )r   rT   r2   r^   ru   rO   r   r{   )	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AAaC!aQ+,,
a!eQ
QQ/11 1 1 1 1QQQ'!a%011
a!ea!a!e,R/062 2 2 2 2$%=>>Aq!Q1aq!tVAXaZ1QqAaCE!Q$J/Eu::
acR1I1Qr1R47AaCE"H =      r>   c                      t          t          t          dz  z  t          t          z  z             t          t          t          z  fgt          t          z  t          z   gfk    sJ d S rt   )r   rT   r2   r^   rU   r>   r;   test_powersr      sJ    qAv!|2qs)r!tbyk :::::::r>   c                      t          t          t          t          z
  z  t          t          t          z
  z  z   d          g t          t          z
  t          t          z
  z  gfk    sJ d S )Nbasicrx   )r   ru   rT   r2   rO   rU   r>   r;   test_issue_4498r      s\    q!a%y1a!e9$G<<<	q1uq1uo           r>   c                      t          t          dz  t          dz  z   t          dz  z   t          dz  z   d          t          t          dz  fgt          t          dz  t          z   t          z   dz   z  gfk    sJ d S )Nro   rn   rp   r[   r   rx   rj   )r   rT   r^   rU   r>   r;   test_issue_4020r      sy    q!tad{QT!AqD(@@@!Q$ZL2q!tax"}q01234 4 4 4 4 4r>   c                      t          t          t          t          z            t          t          z  z            t          t          t          z  fgt          t                    t          z  gfk    sJ d S rJ   )r   r   rT   r^   rU   r>   r;   test_issue_4203r      sN    s1a4yyA~RAJ<#b''"*">>>>>>>r>   c                      t          t          t           dz   z  t          t          dz
  z  z   d          } t          | d          g dgfk    sJ d S )Nrj   r   r   rx   T)r   rT   r   )ra   s    r;   test_issue_6263r      sR    
1qb1f:1q5	!1%%Aq(((R$L888888r>   c                     t          d          } t          dd          }t          | |dz  z  | |dz  |dz  z
  z  z             d         d         }|j        }t          |          t          d |D                       k    sJ d S )	Nr   r^   T)realr[   rn   rz   c                     h | ]	}|j         
S rU   )namer8   s     r;   	<setcomp>z#test_issue_25043.<locals>.<setcomp>   s    222QV222r>   )r   r   free_symbolsr_   )r   rT   cse_exprfrees       r;   test_issue_25043r      s    A4   A1QT6Aq!tad{O+,,R04H Dt9922T22233333333r>   c            
      (   ddl m}  t          d          }t          d          }t           |  |t          t
                    t          t
          fd           |  |t          t
                    t          t
          fd          z             \  }\  }|g k    sJ | |  |t          t
                    t          t
          fd           |  |t          t
                    t          t
          fd          z   k    sJ t           |  |t          t
                    t          t
          fdt          t
          z   f           |  |t          t
                    t          t
          fdt          t
          z   f          z             \  }\  }|t          t          t
          z   fgk    sJ | |  |t          t
                    t          t
          fdt          f           |  |t          t
                    t          t
          fdt          f          z   k    sJ d S )Nr   )Subsr   r   r   rj   )sympy.core.functionr   r	   r   rT   r2   r^   )r   r   r   name_valrL   s        r;   test_dont_cse_tuplesr     s   ((((((AAQQq!WWq!ff%%
$qqAwwA
'
'	() )Hgt r>>>>DD1a1a&&11d11Q77QFF++, - - - - QQq!WWq!fq!a%j))
$qqAwwAAE

+
+	,- -Hgt QU}$$$$44!Q!Q!R11QQq!WWq!fq"g&&' ' ' ' ' ' 'r>   c            	         t          dt          dz  z  t          dz  z             t          t          dz  fgt          dt          z  z   gfk    sJ t          t          dz  ddt          dz  z  z   t          dz  z  z             t          t          dz  ft          dt          z  fgt          t          t          dz   z  z   gfk    sJ t          dt          dz  z  ddt          dz  z  z   t          dz  z  z             t          t          dz  ft          dt          z  fgt          t          dz   z  t          z   gfk    sJ t          t	          dt          dz  z            t          dt          dz  z            z             t          t          dz  fgt          t                    t	          t                    z   gfk    sJ t          t	          t          dz            t          t          dz            z             t          t          dz  fgt          t                    t	          t                    z   gfk    sJ t          t          dt          dz  z   z  t          t          dz  z  t          z  z             t          t          dz  fgt          t          dz   z  t          t          t          z  z  z   gfk    sJ t          t          t          dz            t          dz  t	          dt          dz  z            z  z             t          t          dz  fgt          t	          dt          z            z  t          t                    z   gfk    sJ t          ddt          dz  z  z   t          dz  z            t          t          dz  fgt          t          dz   z  gfk    sJ t          t          dt          z  z  t          dt          z  z  z             t          t          dt          z  z  fgt          dt          z  z   gfk    sJ d S )Nrj   r[   )	r   rT   r^   r{   r   r   r2   rO   r   rU   r>   r;   test_pow_invpowr     sq   qAv1}q!t*QrT	{#$ $ $ $q!tq1QT6z1a4''((q!t*r1R4j	!BR!V$4#567 7 7 7qAvQq!tVQT))**q!t*r1R4j	!BQK"$4#567 7 7 7s1QT6{{S1a4[[())q2w-3r77SWW,-./ / / /s1a4yy3q!t99$%%q!t*B#b'')*+, , , ,q!ad(|a1fQh&''q!t*26
Q1X-./0 0 0 0s1a4yy1a4AadF++,,q!t*3qt99s2ww./01 1 1 1AadF
AqD !!q2w-2rAv;-() ) ) )q1Q3x!bd)#$$q1Q3x.	B2I;'( ( ( ( ( (r>   c                  b   t           dz   t          t           dz   t          dz   z            z   t          t          dz             z   } t	          | t          t           t          dz             t          dz
  t          dz   t           dz   z  gt          j                  t          t          dz   ft          t          dz   ft           t          ft          t           dz   fgt          t          t          t          z            z   t          t                    z   t          dz
  t          t          z  ggk    sJ d S )Nrj   r[   postprocess)rT   r   r2   r   r   r   rO   r'   cse_separater^   r   r{   rq   s    r;   test_postprocessr   ,  s    
a%#q1uq1uo&&
&QU
3BBq!a%LL!a%!a%!a%9)+ + +q1u+AE{QGb!a%[	9	c"R%jj3r77	"AE2b51	33 3 3 3 3 3r>   c                     ddl m} m} t          d          }t          d          }t	          | | t
          j        z   d| z  |d| z  |z
  dz   t          t                    dz  d| z  dz   z   |d| z  |z
  t          t                              z   ||dz
  t          t                              z   ||          z   |d| z  |z
  dz             z  t          t                    t          t                    dz  d| z  dz   z  z   ||t          t                              z   |d| z  |z
  t          t                              z   ||          z   |d| z  |z
  dz             z  t          t                    t          t                    dz  d| z  dz   z  z   ||dz
  t          t                              z   |d| z  |z
  dz   t          t                              z   ||          z   |d| z  |z
  dz             z  t          t                    dz  d| z  dz   z   ||t          t                              z   |d| z  |z
  dz   t          t                              z   ||          z   |d| z  |z
  dz             z  ddt
          j        t          dz  | dz   d| z  |z   d| z  f }t          |          }t          d| z  ft          | t          z   ft          t          dz   ft          |dz
  ft          t          t                    ft           |t          t                    ft           t          dz  dt          z
  z   ||          z   |t                    z  ft"          t            |t          t                    z  ft$           ||t                    ft&          t            |t          t                    z  fg
| | t
          j        z   t          |t          t          t"          z  t          t"          z  t$          z  t          t          z  t&          z  t$          t&          z  ddt
          j        t          dz  t           t           t           fgf}||k    sJ d S )Nr   )r   r   r   Gr[   rj   r   )	sympy.abcr   r   r	   r   r   Halfr   rO   r   r^   r{   r   x3x4x5x6x7x8x9)r   r   r   r   tr   anss          r;   test_issue_4499r   4  s   AA	
AJ!Q!a!d1ggai2a4!8-DQQqs	H
77F F .Aa!eT!WW%%.&&'add.++,1QqS1Wq[>>.:QabdQh''!T!WW5aa!aQ7 7 	1	a!a!nn	%&*1ggtAwwqyBqD1H.E&EaaAQG G '1Q37Q;Q(('))*1'../a!a!nn'=	abdQh!T!WW-aa!a!Q/ / 	1	a!a!nn	%&'AFAaC!aA
1		A 	AA
acR!bMBQ<"a!er477m
aaBii21B/!4QQrUU:;b"QQr2YY,=O
aa2hh"b2rl+	- QZQBrE2b58RU2Xr"u
Q!bS2#s
, 	-	.C !888888r>   c                  d   t          t          dz  dt          dz  z  z
  dz
  d          } t          |           g | gfk    sJ t          t	          t           t
          z
  t          z  t          z
  t
          z
                      t           t          t
          z   z  t          z
  t
          z
  k    sJ d S )N   rn   ro   r[   rj   )r   rT   r   r%   r$   r2   rO   )rs    r;   test_issue_6169r   L  s    1qAv!1%%Aq66b1#Y GaR!VQJNQ.//00QBAJNQ4FFFFFFFr>   c                  J   d} t          d| f          }t          d| f          }t          d| dz
            }||dz            ||         z
  ||dz            ||         z
  z  }d||dz            ||         z
  z  }t          ||g          \  }}t          |          dk    sJ d S )Nro   r2   )shaperT   r:   rj   r   )r!   r    r   r_   )len_yr2   rT   r:   expr1expr2replacementsreduced_exprss           r;   test_cse_Indexedr   T  s    ECx(((ACx(((ACqAqsVAaD[1QqS6!A$;'Eq1vad{OE"%uen"5"5L-|q      r>   c                     t          ddd          } t          |           g | gfk    sJ t          dd          }t          d||          }t          |          g |gfk    sJ t          | d         | d         z            g | d         | d         z  gfk    sJ t          | d         | d	         z  | d         | d	         z  | d
         z  z             t          | d         | d	         z  fgt          | d
         z  t          z   gfk    sJ d S )Nr   rp   r|   T)integerr   r   )r   r   r   )r   r[   )r0   r   r   r^   )r   r|   r   s      r;   test_cse_MatrixSymbolr   `  s   S!QAq66b1#YT"""AS!QAq66b1#Yqtad{QqT!A$YK00000qvaf}qvaf}QsV33442qwqw:O9PSUVWX\V]S]`bSbRc8dddddddr>   c                  ^   t          ddd          } t          ddd          }| j        | z  j        | z  |z  }| j        | z  | z  |z  }t          ||g          \  }}t	          |          dk    sJ t          ||z   |g          \  }}|sJ t          | dz  | | dz  z   g          \  }}|sJ d S )Nr   rp   r2   rj   r   r[   )r0   TIr   r_   )r   r2   r   r   r   r   s         r;   test_cse_MatrixExprr   m  s    S!QAS!QASUIMAESUaK!OE"%uen"5"5L-|q    "%uu}e&<"="=L-"%q!tQAX&6"7"7L-r>   c                     t          t           t          t          z  z   t	          t          d          ft           t          t          z  z
  df          } t          |           }t          t          t          z  fgt          t          t          z
  t	          t          d          ft           t          z
  df          gf}||k    sJ d S )Nr   T)r   rO   rT   r2   r   r   r^   )r   r   
actual_anss      r;   test_Piecewiser   }  s    A2!8R1XX&!ac4(899A
a&&C!9+	BFBq!HH%R	7	78:J*r>   c                  n   t          t                                        t          dd          t          t          t          dz  z             z   dz
  } t          |           g t          t          dz  t          z             t          z   t          dz  dz  z   t          t          dz            z   gfk    sJ d S )Nr   rp   rj   r[   )r   rT   seriesr   r2   r   r   r   s    r;   test_ignore_order_termsr     s    	Qq1		AadF	+a	/Br77rC1qMMA-1Q61a4@ABBBBBBBr>   c                      t           t          z   } t          t          z   }t	          |           | z   t	          |          |z   t           t          z   g}t          |          \  }fd|D             |k    sJ d S )Nc                 T    g | ]$}|                     t                              %S rU   subsr   r9   ra   rb   s     r;   r<   z&test_name_conflict.<locals>.<listcomp>  -    666AFF8F##$$666r>   )r^   r2   r   r   r   r   z1z2r   rc   rb   s       @r;   test_name_conflictr     ss    	aB	bB	R2s2ww|R"W-A!ffOFG6666g666!;;;;;;r>   c                     t           t          z   } t          t          z   }t	          |           | z   t	          |          |z   t           t          z   g}t          |t          d                    \  }fd|D             |k    sJ d S )Nzx:10c                 T    g | ]$}|                     t                              %S rU   r   r   s     r;   r<   z3test_name_conflict_cust_symbols.<locals>.<listcomp>  r   r>   )r^   r2   r   r   r   r   r   r   s       @r;   test_name_conflict_cust_symbolsr     s}    	aB	bB	R2s2ww|R"W-A!WV__--OFG6666g666!;;;;;;r>   c                  v   t          t          t          z             t          z   t          z   t          t          t          z             z   t	          t          t          z             z   } t          t          t
          g}t          t                    5  t          | |           d d d            d S # 1 swxY w Y   d S )N)r   )	r   rT   r2   ru   r   rO   r+   
ValueErrorr   )r   syms     r;   test_symbols_exhausted_errorr     s    AaC
1S1XXc!A#hh&Aa)C	
		  As                 s   B..B25B2c                     t          d          } t          d          }|                     d|          } i }d|d<   d|d<   |                     |          }t          |           \  }}|D ]+}|d                             |          ||d	         j        <   ,|d	                             |          }||k    sJ t          d
          }t          |          \  }}|d	         |k    sJ 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ɥ:?C392rj   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   r_   )	C393r   sub	ss_answersubstitutionsnew_eqnpair
cse_answerrL   s	            r;   test_issue_7840r    s)   	- D Q D 99VD!!D
CCKCK		#IIIM' . . GLL--DGL%%J
"""" 	: D !YYM71:}!!!!!!r>   c            	      l   t           t          t          t          fD ]}  | ddt          t
          z   dddg          }t          t          t
          z   |g          }t          t          t
          z   fgt           | t          dgddgg          gf}||k    sJ t          |d         d         |           sJ d S )Nr[   r   rj   rz   )	r,   r-   r.   r/   rT   r2   r   r^   rk   )clsr   resr   s       r;   test_issue_8891r    s    "$7 "79 + +C1q1uaA&''1q5!*ooQU}r33Q!Q'8#9#9:;czzzz#a&*c******+ +r>   c                     t          d          \  } }}}}}| |z  |z  |z  |z  | |z  |dz  z  |z  ||z  |dz  z  |z  g}t          |          \  }}t          d |D                       rJ ddlm ddlm t          d          fdt          d	          D             }	t          |	d
          D ]}t          |          }t          |          \  }}t          d |D                       rJ t          |          D ]4}
t          t          |                    D ]} ||         j        |
 ||<   5||k    sJ fdt          d	          D             }	t          |	d
          D ]}t          |          }t          |          \  }}t          d |D                       rJ t          |          D ]4}
t          t          |                    D ]} ||         j        |
 ||<   5|fd|D             k    sJ d S )Nza b f k l ir[   c              3   8   K   | ]}|j         D ]}|j        V  d S rJ   argsis_Mulr9   r   r:   s      r;   	<genexpr>z#test_issue_11230.<locals>.<genexpr>  s3      77771187777777r>   r   )choice)
expand_mulza:mc                 V    g | ]%}t          fd t          d          D              &S )c                 &    g | ]}           S rU   rU   r9   r:   r  ss     r;   r<   z/test_issue_11230.<locals>.<listcomp>.<listcomp>  s!    ,,,aq		,,,r>   ro   )r
   rF   r  s     r;   r<   z$test_issue_11230.<locals>.<listcomp>  s<    	@	@	@!#,,,,,588,,,
-	@	@	@r>      rp   c              3   8   K   | ]}|j         D ]}|j        V  d S rJ   r  r  s      r;   r  z#test_issue_11230.<locals>.<genexpr>  3      ;;AAF;;qqx;;;;;;;r>   c                 V    g | ]%}t          fd t          d          D              &S )c                 6    g | ]} d d                   S )Nr  rU   r  s     r;   r<   z/test_issue_11230.<locals>.<listcomp>.<listcomp>  s)    000!q!u000r>   ro   )r   rF   r  s     r;   r<   z$test_issue_11230.<locals>.<listcomp>  s<    	D	D	Da#00000uQxx000
1	D	D	Dr>   c              3   8   K   | ]}|j         D ]}|j        V  d S rJ   )r  is_Addr  s      r;   r  z#test_issue_11230.<locals>.<genexpr>  r  r>   c                 &    g | ]} |          S rU   rU   )r9   r:   r  s     r;   r<   z$test_issue_11230.<locals>.<listcomp>  s!    ...qZZ]]...r>   )r   r   anysympy.core.randomr  r   r  rF   r)   rC   r   r_   r   )r   r   r   kr   r:   pRr   exrir  r  r  s              @@@r;   test_issue_11230r(    s   }--Aq!Q1	
1QqAaC1HQJ!AqD
+Aq66DAq77Q77777777 )(((((......A	@	@	@	@	@uQxx	@	@	@BR^^  GG1vv1;;;;;;;;;;1++ 	& 	&B3q66]] & & qty"~!&Avvvvv	D	D	D	D	D588	D	D	DBR^^ / /GG1vv1;;;;;;;;;;1++ 	& 	&B3q66]] & & qty"~!& ....A......../ /r>   c                  d   d } t           dz  t          dz  z  t           dz  t          z  z   t           dz  z   }t          |          t          t           dz  ft          t           t          z  fgt           dz  t          t          z  t          z  z   t          t          z  z   gfk    sJ  | |           t           dz  t          dz   dz  z  t           t          dz   z  z   }t          |          t          t          dz   fgt           dz  t          dz  z  t           t          z  z   gfk    sJ  | |           d S )Nc                     t          |           \  }}|                                 t          |          t          d |D                       z   t          |          z   k    sJ d S )Nc              3   J   K   | ]}|d                                           V  dS )rj   Nr"   r8   s     r;   r  z2test_issue_11577.<locals>.check.<locals>.<genexpr>  s0      55a1))555555r>   )r   r#   r_   sum)rq   r   r   s      r;   checkztest_issue_11577.<locals>.check  sm    2ww1||~~FFS551555555aLL     r>   ro   r[   rn   rj   )rT   r2   r   r^   r{   )r-  rq   s     r;   test_issue_11577r.    s      
AadQT!V	ad	"Br77
adb!A#Y!Q$Bq.2b5"8!9; ; ; ; ; 
E"III	
Aq1uqj1a!e9	$Br77
a!e1RU
QrT)*, , , , , 
E"IIIIIr>   c                  \    t           dz   t           dz   g} t          |           g | fk    sJ d S )Nrp   rn   )rT   r   r   s    r;   test_hollow_rejectionr0    s4    
a%QBr77r2hr>   c                     t          t                    dt          z  dt          t          dz             z  z   z  t          t                    dt          z  dt          t          dz             z  z   z  g} t	          |           \  }}t          d |D                       s
J d            t	          | t          f          \  }}t          d |D                       r
J d            t          d	 |D                       s
J d
            d S )Nrp   rj   ro   c              3   8   K   | ]\  }}t           |j        v V  d S rJ   r2   r   r9   r   r  s      r;   r  z"test_cse_ignore.<locals>.<genexpr>  s.      ::CqC$$::::::r>   z&cse failed to identify any term with yignorec              3   8   K   | ]\  }}t           |j        v V  d S rJ   r3  r4  s      r;   r  z"test_cse_ignore.<locals>.<genexpr>  s.      >>VQ1((>>>>>>r>   z,Sub-expressions containing y must be ignoredc              3   X   K   | ]%\  }}|t          t          d z             z
  dk    V  &dS )rj   r   N)r   rT   r4  s      r;   r  z"test_cse_ignore.<locals>.<genexpr>  s:      ;;&!SsT!a%[[ A%;;;;;;r>   z4cse failed to identify sqrt(x + 1) as sub-expression)r   r2   r   rT   r   r!  )r   subst1red1subst2red2s        r;   test_cse_ignorer=    s   VVQqS1T!A#YY;&'Q1qac{1B)CDEu::LFD::6:::::dd<dddduaT***LFD>>v>>>>>nn@nnnn;;F;;;;;ss=ssssssr>   c                  J   t           t          t                    z  t          t                     z  t          t                    t          t                    z  t          t                     z  g} t          | t          f          \  }fd|D             }|| k    sJ d S )Nr5  c                 T    g | ]$}|                     t                              %S rU   r   r   s     r;   r<   z/test_cse_ignore_issue_15002.<locals>.<listcomp>  s-    	4	4	4q!&&&!!
"
"	4	4	4r>   )ru   r   rT   rO   r2   r   )r   rc   rlrb   s      @r;   test_cse_ignore_issue_15002rA    s    	#a&&aRAs1vvc1"gg	A !QD)))OFG	4	4	4	4G	4	4	4B777777r>   c                     t          t          dz             } t          d| z
  d| z
  z  g          \  \  \  }}\  }|| k    r|d|z
  d|z
  z  k    sJ d S ||  k    r|d|z   d|z   z  k    sJ d S d|  d|   d| }J |            )Nrj   rz   zExpected common subexpression z or z, instead got )r   rT   r   )xp1r^   ueredmsgs        r;   test_cse_unevaluatedrG  #  s    
!a%
 
 Cb3h1s73455JXb"	SyyrBw1r6*******	trBw1r6*******PsPPPPBPPcr>   c                     d\  } t          dz            fdt          |           D             }|d         |d         z                                   dk    sJ t          |          \  }}t	          |          dk    s
J d            t          |          D ]H\  }}|                    t          |                    ||         z
                                  dk    sJ Id S )N)rp   r?   zx:%dc           	      p    g | ]1t          t          fd t                    D                       2S )c                 2    g | ]}|         d |z   z  z  S )rz   rU   )r9   r   r:   rT   s     r;   r<   z4test_cse__performance.<locals>.<listcomp>.<listcomp>4  s*    ===!QqT21+%===r>   )r   r   rF   )r9   r:   ntermsrT   s    @r;   r<   z)test_cse__performance.<locals>.<listcomp>3  sR        	s=====uV}}===>>  r>   r   rj   z!exprs[0] == -exprs[2], i.e. a CSE)r   rF   simplifyr   r_   	enumerater   r   )nexprsr   substrE  r:   ra   rK  rT   s         @@r;   test_cse__performancerP  0  s   NFF  A    v  E !HuQx))++q0000UJE3u::>>>>>>># D D1x''%(2<<>>!CCCCCD Dr>   c                  H   t           t          z   dt           z   t          z   t           t          z   t          z   dt           z   t          z   t          z   g} t          |           \  }}dt	          |          t          d |D                       z   t          |          z   k    sJ d S )Nr[   rp   r   c              3   D   K   | ]\  }}|                                 V  d S rJ   r"   )r9   r#  vs      r;   r  z#test_issue_12070.<locals>.<genexpr>A  s.      !B!BDAq!++--!B!B!B!B!B!Br>   )rT   r2   rO   r   r_   r,  r#   )r   rO  rE  s      r;   test_issue_12070rT  >  s    UAEAIq1uqy!a%!)a-8EUJE3Uc!B!BE!B!B!BBBB3  ! ! ! ! ! !r>   c                      t           dt           dz  z  t          dz  z   z  } t          |           d         d         }|| k    sJ d S )Nr[   rj   r   )rT   r2   r   )rq   cse_eqs     r;   test_issue_13000rX  E  s@    	
Bq!tGadN	BWWQZ]FR<<<<<<r>   c                      t          t          dz  dt          z  z   dz
  d          t          t          dz  dt          z  z   dz
  d          z   } t          |           g | gfk    sJ d S )Nro      r[   r   rj   )r   rT   r   r   s    r;   test_issue_18203r[  K  sc    	A1q!	$	$wq!tbd{Q'B'B	BBr77rB4j      r>   c                      t          t          t          z   t          t          z   d          } t          |           t          t          t          z   fgt          dz  gfk    sJ d S )NFevaluater[   )r
   rT   r2   r   r^   r   s    r;   test_unevaluated_mulr_  P  sP    	QUAEE	*	*	*Br77QU}r1ug.......r>   c                     ddl m}  t          d          \  }}}}}t          t          z   dz
  dz  t          t          t          z   t          t          z   dt          z  dz   z  t          t          z   dz
  dz  z   dt          z  dz   t          t          z   z  g}t          ||           \  }sJ |t          t          t          z   ft          t          dz
  dz  ft          dt          z  dz   f|t          t          z  t          z   f|t          t          z  ft          d f|t          ft          d f|t          ft          d f|t          fg|||||ffk                	                                 d D             |fd|D             k    sJ d S )	Nr   )cse_release_variablesz_:5rj   r[   r   c                      g | ]\  }}|||fS rJ   rU   )r9   r  rS  s      r;   r<   z.test_cse_release_variables.<locals>.<listcomp>a  s!    ///DAq!Qr>   c                 :    g | ]}|                               S rU   )r   )r9   r:   r   s     r;   r<   z.test_cse_release_variables.<locals>.<listcomp>b  s#    (((166!99(((r>   )
sympy.simplify.cse_mainra  r   rT   r2   r   r^   r{   r   reverse)	ra  _0_1_2_3_4eqsra   r   s	           @r;   test_cse_release_variablesrl  T  s   ====== BBBEAI>1	AA!a AEAI>1	
1qAEC s 5666DAq F FaQK"rAvk"R1qMBr2r6lRJRJR2t*r1g/ 24RR0DF F F F F IIKKK//A///A((((a(((((((((r>   c                  n   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    sJ ( | t	          |           g t	          | fk    sJ t           di} | |          g |fk    sJ d S )Nc                 $    t          | d          S )NF)rC   r   )rT   s    r;   <lambda>ztest_cse_list.<locals>.<lambda>e  s    S''' r>   rT   rj   )rT   rC   tuplesetr   )_cseitr   r   s       r;   test_cse_listrt  d  s    ''D477r1g499S	!!!!
BE3 * *tAAbEE{{r11R55k)))))4r
E2J/////	
AA477r1gr>   c                  n    t          ddd          } t          |  | z  | z
            |  | z  | z
  k    sJ d S )Nr   r[   )r0   r   )r   s    r;   test_issue_18991rv  p  sF    S!QAQBFQJA26A:------r>   c                  Z    t          ddd          g} t          |           g | fk    sJ d S )Nrj   r[   Fr]  )r
   r   )r   s    r;   test_unevaluated_Mulrx  u  s:    	QE	"	"	"#Aq66b!Wr>   c                      t          t          d                                        dd          } t          |           }t	          |          }|g t          |           gfk    sJ d S NA:4r[   )r.   r   reshaper   r   r   rT   r   s      r;   "test_cse_matrix_expression_inverser~  z  s_    WU^^,,44Q::A

A1vvHWQZZL)))))))r>   c                     t          t          d                                        dd          } t          t          d                    }t          t	          |           |          }t          |          }|g |gfk    sJ d S Nr{  r[   zb:2)r.   r   r|  r   r   r   r   r   rT   r   s       r;   )test_cse_matrix_expression_matmul_inverser    su    WU^^,,44Q::AWU^^,,Awqzz1A1vvHQCy      r>   c                      t          t          d                                        dd          } t          t          j        |           }t          |          }|g |gfk    sJ d S rz  r.   r   r|  r   r   NegativeOner   r}  s      r;   test_cse_matrix_negate_matrixr    s^    WU^^,,44Q::Aq}a  A1vvHQCy      r>   c                  0   t          t          d                                        dd          } t          t          d                                        dd          }t          t          j        | |          }t          |          }|g |gfk    sJ d S Nr{  r[   zB:4r  r   r   rT   r   s       r;   +test_cse_matrix_negate_matmul_not_extractedr    s    WU^^,,44Q::AWU^^,,44Q::Aq}a##A1vvHQCy      r>   c                  |   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  s       r;   'test_cse_matrix_nested_matmul_collapsedr    s    WU^^,,44Q::AWU^^,,44Q::Aq}fQll++A1vvHVAM1a889:::::::r>   c                      t          t          d                                        dd          } t          t          t          |                               }t	          |          }|g | gfk    sJ d S rz  )r.   r   r|  r   r   r}  s      r;   0test_cse_matrix_optimize_out_single_argument_mulr    sh    WU^^,,44Q::AvfQii  !!A1vvHQCy      r>   c            	      v   t          t          d                                        dd          } t          t	          t	          t	          |                               t	          t	          |                     t	          |           |           }t          |          }|g t	          d|           gfk    sJ d S Nr{  r[   rn   )r.   r   r|  r   r   r   r}  s      r;   9test_cse_matrix_optimize_out_single_argument_mul_combinedr        WU^^,,44Q::AvfVAYY''((&*;*;VAYYJJA1vvHVAq\\N+++++++r>   c            	         t          t          d                                        dd          } t          t          t          t          |                                         }t	          |          }|g | gfk    sJ d S rz  )r.   r   r|  r   r   r}  s      r;   0test_cse_matrix_optimize_out_single_argument_addr    sp    WU^^,,44Q::AvfVAYY''(())A1vvHQCy      r>   c            	      v   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}  s      r;   9test_cse_matrix_optimize_out_single_argument_add_combinedr    r  r>   c                      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  s       r;   'test_cse_matrix_expression_matrix_solver    so    WU^^,,44Q::AWU^^,,AAqA1vvHQCy      r>   c            	         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    sJ d S )NzX:4r[   zy:2r^   )r.   r   r|  r   r   r   r   r0   )Xr2   r   r   r^   reduced_expr_expecteds         r;   !test_cse_matrix_matrix_expressionr    s    WU^^,,44Q::AWU^^,,AwvillA..//1qAAA1vvH	dAq	!	!B"76"a==#9#92qAA"ill+,/D.EFFFFFFFr>   c                     d} t          t          d|                      }t          t          d| | z                                           | |           }t          t          d| | z                                           | |           }t          t          d| | z                                           | |           }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    sJ 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))

    r[   zmu:zSigma:zH:zR:zdata:r^   r{   N)r.   r   r|  r   r   r   r   r   r  r   r0   )NmuSigmaHr%  datanew_mu	new_Sigmar   r^   r{   replacements_expectedreduced_exprs_expecteds                r;   test_cse_matrix_kalman_filterr    s   $ 	
A	giAii00	1	1B )9!a%)9)9!:!:;;CCAqIIEW\!a%\\2233;;AqAAAW\!a%\\2233;;AqAAA 4 455DBuillGF1fQPUW`abWcWcFdFd<e<e4f4fhnouvwy{o|o|  E  FG  FS  UY  Z  Z  i[  i[  \  \  ]  ]FufQ]E9Q<<QWXY[abcejluvwlxlx[y[yQzQzI{I{}~  AF  G  G  H  HIFI&''H	dAq	!	!B	dAq	!	!B	Yq\\	WVAva3344556
 	r6%Rq"vamUY?Z?Z)[)[\\]]ufQ]E2r1eDDEE -/EFFFFFFFr>   )	functoolsr   rD   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   rd  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   ru   rT   r2   rO   r^   r{   r   r   r   r   r   r   r   r   x10x11x12rH   rM   rP   rV   rY   rh   rl   rr   rv   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.  r0  r=  rA  rG  rP  rT  rX  r[  r_  rl  rt  rv  rx  r~  r  r  r  r  r  r  r  r  r  r  r  rU   r>   r;   <module>r     s,                   2 2 2 2 2 2       ' ' ' ' ' ' + + + + + + ( ( ( ( ( (                   $ $ $ $ $ $ " " " " " " / / / / / / / / & & & & & & 6 6 6 6 6 6 9 9 9 9 9 9 : : : : : : ? ? ? ? ? ? ? ? ' ' ' ' ' ' I I I I I I I I I I I I + + + + + +             ' ' ' ' ' ' , , , , , , 3 3 3 3 3 3 3 3 ) ) ) ) ) ) 5 5 5 5 5 5 5 5 1 1 1 1 1 1 - - - - - - - - - - - - - - . . . . . . . .5 5 5 5 5 5 5 5 5 5 5 5 3 3 3 3 3 3 WY
1a8? 5BBBBBS#	A 	A 	A    6 6 64 4 4
4 
4 
44 4 4	! 	! 	!) ) )A A A*. . .< / / /   / / /    ; ; ;     
4 4 4
? ? ?9 9 9
4 4 4' ' ',( ( (*3 3 3  0G G G	! 	! 	!e e e     C C C
< < << < <  "" "" ""J+ + +"/ "/ "/J   *  
t t t  
 
 
D D D! ! !  ! ! !
/ / /) ) ) 
 
 
. . .
  
* * *! ! !! ! !! ! ! ; ; ;! ! ! , , ,! ! ! , , ,! ! !G G G%G %G %G %G %Gr>   