
    ЦiR              	          S r SSKrSSKJr  SSKJrJr  SSKJr  \R                  " S5      r
\
R                  \R                  5        \" S5      r\
R                  \R                  5        \(       a  SSKr\R"                  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 V s/ s H  n \RA                  U S5      PM     sn u  r!r"r#S Vs/ s H  n\R#                  SSUS9PM     snu  r$r%r&OSr'SSK(r)SSK*J+r+  SSK,J-r-J.r.J/r/J0r0  SSKJ1r1J2r2J3r3  S Vs/ s H  n\)Ri                  USS5      PM     snu  r5r6r7\)Rp                  " S5      " \05      r9S r:S r;S r<S r=S r>S r?S r@S  rA\S! 5       rBS" rCS# rDS$ rES% rFS& rGS' rHS( rIS) rJS* rKS+ rLS, rMS- rNS. rOS/ rPS0 rQS1 rRS2 rSS3 rTS4 rUS5 rVS6 rWS7 rXS8 rYS9 rZS: r[\S; 5       r\S< r]S= r^S> r_S? r`S@ raSA rbSB rcSC rdSD reSE rfgs  sn f s  snf s  snf )Fa  
Important note on tests in this module - the Aesara printing functions use a
global cache by default, which means that tests using it will modify global
state and thus not be independent from each other. Instead of using the "cache"
keyword argument each time, this module uses the aesara_code_ and
aesara_function_ functions defined below which default to using a new, empty
cache instead.
    N)import_module)raisesSKIP)ignore_warningszaesara.configdefaultsaesara)
ScalarType)Variable)TensorVariable)Elemwise
DimShuffle)Dot)true_dividexyzfloatXXYZFF)nameT)S)xyzt)aesara_codedim_handlingaesara_function   fc                 >    UR                  S0 5        [        U 40 UD6$ )zAWrapper for aesara_code that uses a new, empty cache by default. cache)
setdefaultr   )exprkwargss     c/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/sympy/printing/tests/test_aesaracode.pyaesara_code_r$   8   s"    
gr"t&v&&    c                 >    UR                  S0 5        [        X40 UD6$ )zEWrapper for aesara_function that uses a new, empty cache by default. r   )r    r   )inputsoutputsr"   s      r#   aesara_function_r)   =   s"    
gr"65f55r%   c                  @   [        [        [        U 5      5      n[        [        R                  R
                  R                  U5      5      n[        R                  R
                  R                  X!5      u  p![        R                  R                  R                  X!5      $ )zTransform SymPy expressions into Aesara Computation.

Parameters
==========
exprs
    SymPy expressions

Returns
=======
aesara.graph.fg.FunctionGraph
)
listmapr$   r   graphbasicgraph_inputsclonefgFunctionGraph)exprsoutsinss      r#   	fgraph_ofr6   C   si     L%()D
v||!!..t4
5C""((3IC<<??((33r%   c                     [         R                  R                  5       R                  S5      nU R	                  5       n UR
                  R                  U 5        U $ )zSimplify a Aesara Computation.

Parameters
==========
fgraph : aesara.graph.fg.FunctionGraph

Returns
=======
aesara.graph.fg.FunctionGraph
fusion)r   compileget_default_mode	excludingr0   	optimizerrewrite)fgraphmodes     r#   aesara_simplifyr@   U   sC     >>**,66x@D\\^FNN6"Mr%   c                    [         [        [        R                  4n[	        X5      n[	        X5      nU(       d  U(       a  U(       a  U(       d  gX:H  $ [	        U [
        [        45      n[	        U[
        [        45      nU(       d  U(       aZ  U(       a  U(       a  [        U 5      [        U5      :w  a  g[        [        [        U 5      5      [        [        [        U5      5      :H  $ [        R                  R                  U SS9n[        R                  R                  USS9nSX4SX44 H-  u  pnUS:X  d  M  [        SU	< SU	< S	[        U
5      < S
35      e   Xx:H  $ )a  Test two Aesara objects for equality.

Also accepts numeric types and lists/tuples of supported types.

Note - debugprint() has a bug where it will accept numeric types but does
not respect the "file" argument and in this case and instead prints the number
to stdout and returns an empty string. This can lead to tests passing where
they should fail because any two numbers will always compare as equal. To
prevent this we treat numbers as a separate case.
Fstr)fileab zaesara.printing.debugprint(z) returned empty string (z is instance of ))intfloatnpnumber
isinstancetupler+   typer,   theqr   printing
debugprint	TypeError)rD   rE   numeric_typesa_is_numb_is_numa_is_seqb_is_seqastrbstrargnameargvalargstrs               r#   rO   rO   f   s     %+M!+H!+H 8Xv !eT]+H!eT]+H8X$q'T!W*<CaL!T#dA,%777 ??%%ae%4D??%%ae%4D &)!NS!N#CR< GT&\3  $D <r%   c                     [        [        [        [        5      5      (       d   e[        [        [        [
        5      5      (       d   e[        [        [        [        5      5      (       d   e[        [        [        [        5      5      (       d   e[        [        [        [        5      5      (       d   e[        [        [        [        5      5      (       d   eg)z}
Check that the example symbols in this module print to their Aesara
equivalents, as many of the other tests depend on this.
N)rO   xtr$   r   ytr   ztr   XtXYtYZtZ r%   r#   test_example_symbolsrh      s    
 LO$$$$LO$$$$LO$$$$LO$$$$LO$$$$LO$$$$r%   c                  @   [        [        5      n [        U [        5      (       d   eU R                  S:X  d   eU R
                  [        R
                  :X  d   e[        [        [        S0S9nUR                  S:X  d   eUR
                  [        R
                  :X  d   eg)z-Test printing a Symbol to a aesara variable. rg   FbroadcastablesN)r$   r   rL   r	   broadcastabler   )xxxx2s     r#   test_Symbolrp      s    	aBb(####r!!!77aff
q!X
7C(((88qvvr%   c                  t    [        [        5      n [        U [        5      (       d   eU R                  S:X  d   eg)z3Test printing a MatrixSymbol to a aesara variable. r   N)r$   rb   rL   r
   rm   )XXs    r#   test_MatrixSymbolrs      s2    	aBb.))))~---r%   c                      / SQn U  H/  n[        [        5         [        [        [        U0S9  SSS5        M1     g! , (       d  f       MC  = f)z.Test MatrixSymbol with invalid broadcastable. )rg   rj   TTFFT)TTrk   N)r   
ValueErrorr$   rb   )bcsbcs     r#   test_MatrixSymbol_wrong_dimsr{      s9     OCJAr73   s	   ;
A
	c                      [        [        5      n [        U [        5      (       d   eU R                  S:X  d   eU R
                  S:X  d   eg)zFTest printing AppliedUndef instance, which works similarly to Symbol. rg   f_tN)r$   r}   rL   r
   rm   r   )ftts    r#   test_AppliedUndefr      sE    
s
Cc>****"""88ur%   c                      [         [        -   n [        U 5      nUR                  R                  [
        R                  R                  :X  d   eg N)r   r   r$   owneropr   tensoraddr!   comps     r#   test_addr      s5    q5DD::==FMM-----r%   c                  0   [        [        [        R                  " [        5      5      [
        R                  [        5      5      (       d   e[        [        [        R                  " [        5      5      [
        R                  [        5      5      (       d   eg r   )rO   r$   sysinr   aetr^   tanrg   r%   r#   	test_trigr      sR    RVVAY'5555RVVAY'5555r%   c                     [         R                  " [        S-  [         R                  " [        5      -   5      [         R
                  " S[        -  5      -  n [        U 5      n[        R                  [        S-  [        R                  [        5      -   5      [        R                  S[        -  5      -  n[        X5      (       d   eg)z:Test printing a complex expression with multiple symbols.    N)r   expr   cosr   logr   r$   r   r^   r_   r`   rO   )r!   r   expecteds      r#   	test_manyr      s}    66!Q$"#bffQqSk1DDwwr1uswwr{*+cggadm;Hr%   c                     S H1  n [        [        [        U 0S9R                  R                  U :X  a  M1   e   [        [        [        S0S9R                  R                  S;   d   e[        [        S-   [        S0S9R                  R                  S:X  d   e[        [        [        -   [        S[        S0S9R                  R                  S:X  d   eg)	z@Test specifying specific data types through the dtype argument. )float32float64int8int16int32int64dtypesr   )r   r      r   r   N)r$   r   rN   dtyper   )r   s    r#   
test_dtyper      s    JAq%j166<<EEE K 1h-055;;?UUUU Aq)n5::@@IMMMAq)Q	&BCHHNNR[[[[r%   c                  r    [         [        4 H'  n S H  n[        X U0S9R                  U:X  a  M   e   M)     g)zFTest the "broadcastables" argument when printing symbol-like objects. )rg   rj   ru   r   rv   rk   N)r   r}   r$   rm   )srz   s     r#   test_broadcastablesr      s:     XHBb':HHBNNN I r%   c                      [         [        -   n / SQ/ SQ/ SQ/ SQ/ SQ/nU H.  u  p#n[        U [         U[        U0S9nUR                  U:X  a  M.   e   g)zFTest "broadcastable" attribute after applying element-wise binary op. )rg   rg   rg   )rj   rj   rj   )ru   rj   rj   )rw   r   r   )rv   r   r   rk   N)r   r   r$   rm   )r!   casesbc1bc2bc3r   s         r#   test_broadcastingr      s^     q5D 	&%77E #D!S!S1AB!!S((( r%   c                     [         [        -  [        -  n [        U 5      n[	        UR
                  R                  [        5      (       d   e[        U[        R                  [        5      R                  [        5      5      (       d   eg r   )rb   rd   rf   r$   rL   r   r   r   rO   ra   dotrc   re   )r!   expr_ts     r#   test_MatMulr      sX    Q3q5D$Fflloos++++r
r*++++r%   c                      [        [        [        R                  5      R                  R
                  [        5      (       d   eg r   )rL   r$   rb   Tr   r   r   rg   r%   r#   test_Transposer     s*    l133'--00*====r%   c                      [         [        -   [        -   n [        [	        U 5      R
                  R                  [        5      (       d   eg r   )rb   rd   rf   rL   r$   r   r   r   r!   s    r#   test_MatAddr     s3    Q3q5Dl4(..118<<<<r%   c                      [        [        [        R                  " S5      S-  5      [	        SS5      5      (       d   e[        [        [
        R                  5      [	        SS5      5      (       d   eg )Nr      r   )rO   r$   r   Integerr   r   Halfrg   r%   r#   test_Rationalsr     sQ    RZZ]Q./Q1BCCCCQVV$k!Q&78888r%   c                  N    [        [        R                  " S5      5      S:X  d   eg )Nr   )r$   r   r   rg   r%   r#   test_Integersr     s    

1&!+++r%   c                  |    [         R                  " S5      n [        [         R                  " U 5      5      (       d   eg )Nn)r   Symbolr$   	factorial)r   s    r#   test_factorialr     s(    
		#AQ((((r%   c                  l   [        [        5         S n [        U " [        [        R
                  " [        R                  " [        5      [        SS95      5      U " [        R                  [        R                  [        5      [        5      5      5      (       d   e S S S 5        g ! , (       d  f       g = f)Nc                 *    [        [        U 5      5      $ r   )r@   r6   r   s    r#   <lambda>!test_Derivative.<locals>.<lambda>  s    OIdO<r%   Fevaluate)r   UserWarningrO   r$   r   
Derivativer   r   r   gradr   r^   )simps    r#   test_Derivativer     sn    		%<DbmmBFF1Iq5&QRSSWWR["568 8 	8 8 
&	%	%s   BB%%
B3c                  f    [        [        [        /[        [        -   /5      n U " SS5      S:X  d   eg)z+Test aesara_function() with single output. r   r      Nr)   r   r   )r   s    r#   test_aesara_function_simpler     s*    !Q!A#'AQ7a<<r%   c                      [        [        [        /[        [        -   [        [        -
  /5      n U " SS5      u  pUS:X  d   eUS:X  d   eg)z.Test aesara_function() with multiple outputs. r   r   r   Nr   )r   o1o2s      r#   test_aesara_function_multir   #  sA    !Q!A#qs,Aq!WFB7N78O8r%   c            	      r   [        [        [        /[        [        -   /S[        S[        S0S9n [        R                  R                  U " SS/SS/5      [        R                  " SS/5      -
  5      S:  d   e[        [        [        /[        [        -   /[        S[        S0SS	9n [        R                  " S5      R                  S5      nS[        R                  " S5      R                  S5      -  n[        R                  R                  U " X5      S[        R                  " S5      -  -
  5      S:  d   eg
)z0Test aesara_function() vs Numpy implementation. r   r   )dimr   r   r   r      &.>)r   r   N)	r)   r   r   rJ   linalgnormasarrayarangeastype)r   rn   yys      r#   test_aesara_function_numpyr   *  s    !Q!A#A!"Iq) <	>A99>>!QFQF+bjj!Q.@@ADHHH!Q!A#9a/K	 A	1		Y	'B	
299Q<y)	)B99>>!B)a		!n45<<<r%   c                     [         R                  " [        [        /[        [        [        -   [        -   //5      n [
        R                  " SS/SS//5      n[        [        [        [        /U /5      n[
        R                  R                  U" SSS5      U5        [        [        [        [        /U /SS9n[
        R                  R                  U" SSS5      U5        [        [        [        [        /X /5      n[        U" SSS5      [        / 5      5      (       d   e[
        R                  R                  U" SSS5      S   U5        [
        R                  R                  U" SSS5      S   U5        g )	N      ?       @g      @g      @T)scalarr   r   )r   Matrixr   r   r   rJ   arrayr)   testingassert_allcloserL   rN   )mr   r   s      r#   test_aesara_function_matrixr   7  s   
		Aq6Aq1uqy>*+Axx#sc?%;<=H!QQC(AJJqc3/:!QQC5AJJqc3/:!QQF+AaS#&R1111JJqc3/2H=JJqc3/2H=r%   c                      [        [        /SS9[        S0:X  d   e[        [        [        /[        S[        S0S9[        S[        S0:X  d   e[        [        /[        S0S9[        S0:X  d   eg )	Nr   )r   r   r   )dimsrw   rj   rk   )r   r   r   rg   r%   r#   test_dim_handlingr   C  st    #>'::::AaAq\2q-78.7J J J JQM:q(mKKKr%   c                     SSK n [        [        [        [        /[        [        -   /SS[        S[        S[        S0S9nU R
                  R                  U" SS/SS	/SS/5      U R                  " S	S
/5      -
  5      S:  d   e[        [        [        [        /[        [        -   /[        S[        S[        S0SSS9nU R                  " S5      R                  S5      nSU R                  " S5      R                  S5      -  nSU R                  " S5      R                  S5      -  nU R
                  R                  U" X#U5      SU R                  " S5      -  -
  5      S:  d   eg)zM
Test passing additional kwargs from aesara_function() to aesara.function().
r   Nr   ignorer   )r   on_unused_inputr   r   r   r   r   r   )r   r   r   )
numpyr)   r   r   r   r   r   r   r   r   )rJ   r   rn   r   zzs        r#   test_aesara_function_kwargsr   I  s,    !QQqSEq(y!Y9=	?A99>>!QFQFQF3bjj!Q6HHIDPPP!QQqSE !9aAyIx	9A 
1		Y	'B	
299Q<y)	)B	
299Q<y)	)B99>>!BB-!BIIaL.89D@@@r%   c                  P   SSK Jn   [        [        /[        [        -   /SS/4[        [
        /[        [
        -   /SS/4[        [        /[        [        -   /[        S[        S0S/4[        [        /[        [        -   [        [        -
  /SSS/4[        [        [        [
        /[        [        -   [        [
        -   /SSS/4/nU GHP  u  p#pES GHB  n[        X#XFS9n[        UR                  U 5      (       d   eUR                  R                   VV	s/ s HF  n[        R                  " UR                  R                   V	s/ s H  o(       a  SOSPM     sn	5      PMH     n
nn	U" U
6 n[        U[        5      (       d  U/n[        U5      [        U5      :X  d   e[!        X[5       Hh  u  pU(       a)  US:X  a#  [        U[        R"                  5      (       d   eM5  [        U[        R$                  5      (       d   eUR&                  U:X  a  Mh   e   GME     GMS     gs  sn	f s  sn	nf )	z1Test the "scalar" argument to aesara_function(). r   )FunctionNr   r   rw   )r   r   r   )aesara.compile.function.typesr   r   r   rb   rd   r)   rL   r   input_storagerJ   onesrN   rm   r+   lenziprK   ndarrayndim)r   argsr'   r(   in_dimsout_dimsr   r   irz   	in_values
out_valuesdvalues                 r#   test_aesara_function_scalarr  Z  s   6 Q!a%$$
Q!a%$$
Q!a%1aA,,
Q!a%Q1v.
Q1Aq1u~taV4D /3*#F wNA a//::::
 **888A !&&2F2FG2FBba2FGH8   IJj$//(\
 x=C
O3335a1f%eRYY7777 &eRZZ8888 ::?*? 6% $ /3 Hs   .H"
HH"
H"
c                  &    [        [        S 5        g)zU
Passing an unknown keyword argument to aesara_function() should raise an
exception.
c                  2    [        [        /[        S-   /SS9$ )Nr   r   )foobar)r)   r   rg   r%   r#   r   0test_aesara_function_bad_kwarg.<locals>.<lambda>  s    /acU1Er%   N)r   	Exceptionrg   r%   r#   test_aesara_function_bad_kwargr
    s    
 9EFr%   c            	      X   [        [        SSS5      5      [        SSS5      :X  d   eS n [        S[        S0nU " [        [        [        [        5      US9[        [        [
        5      5      (       d   eU " [        [        S[        S5      US9[        S[        S5      5      (       d   eg )Nr   r   r   c                     S H=  n[        X5      n[        X5      nUb  Uc  Ub  Ub    gM)  M+  [        X45      (       a  M=    g   g)N)startstopstepFT)getattrrO   )s1s2attra1a2s        r#   
theq_slicetest_slice.<locals>.theq_slice  sM    -D"B"BzRZ
bj  '1
"\\ . r%   r   r   )r$   slicer   r   r^   r_   )r  r   s     r#   
test_slicer    s    aA'5Aq>999	 !W%Fl5A;v>b"NNNNl5Aq>&A5BPQ?SSSSr%   c                  8  ^	 0 n [         R                  " SSS9n[         R                  " SX5      nUSSS2SS	S
24   n[        X0S9m	[	        S5      n[        T	R                  R                  R                  5      [        XDU5      [        XDU5      4:X  d   eT	R                  R                  S   [        X S9:X  d   e[        U	4S j[        SS5       5       5      (       d   e[         R                  " S5      n[        XUS0S9  SUSpnX&Xx2   n[        X1SUS0S9m	g )Nr   Tintegerrb   r   r   r   r   r   r   r   r   r   c              3   p   >#    U  H+  nTR                   R                  U   R                  U:H  v   M-     g 7fr   )r   r'   data).0r   rc   s     r#   	<genexpr>#test_MatrixSlice.<locals>.<genexpr>  s)     A[rxxq!&&!+[s   36   kr   r   )r   r   MatrixSymbolr$   r   rM   r   r   idx_listr  r'   allrange)
r   r   rb   rd   r   r$  r  r  r  rc   s
            @r#   test_MatrixSlicer)    s	   E
		#t$A
Q"A	!Aa%1Q,A	a	%B7A%%&5q>5q>*JJJJ88??1a!==== AU1a[AAAAA
		#Aw<(1aE	/A	aGQ 8	9Br%   c            
      8  ^ [         R                  " SSS9n S Vs/ s H  n[         R                  " XU 5      PM     snu  p#pE[        [        X#XE45      u  pgp[         R
                  " X#/XE//5      n
[	        U
5      m[        R                  S[        R                  SXg5      [        R                  SX5      5      [        R                  S[        R                  SXh5      [        R                  SXy5      5      /n[        U4S jU 5       5      (       d   eg s  snf )Nr   Tr  ABCDr   r   c              3   <   >#    U  H  n[        TU5      v   M     g 7fr   )rO   )r   solutionBlockts     r#   r!  #test_BlockMatrix.<locals>.<genexpr>  s     @i(tFH%%is   )	r   r   r%  r,   r$   BlockMatrixr   joinany)r   r   ABCDAtBtCtDtBlock	solutionsr.  s               @r#   test_BlockMatrixr=    s    
		#t$A:@A&$"//$1-&AJA!a|4NBBNNQFQF+,E% F!SXXa0#((1b2EF!SXXa0#((1b2EFHI@i@@@@@ Bs   !Dc            	          Su  pSn[         R                  " SX5      n[         R                  " SX5      nX44nUR                  U-  nX1S-  US-  4U S-  U S-  4/XAS-  US-  4US-  US-  4/0nU Vs/ s H  n[         R                  " U/Xx   Q76 PM     n	nUR	                  [        [        XY5      5      5      n
[        [        XR/[        U5      -  5      5      n[        XV/U0 S9n[        U[         R                  " U
5      /U0 S9nU Vs/ s H9  n[        R                  R                  " UR                  6 R                  U5      PM;     nn[        R                  " X-  5      R!                  UR                  5      R                  U5      [        R"                  " U5      R                  U5      /nUS==   [        R$                  " UR                  5      S-  -  ss'   [        R&                  " U" U6 U" U6 SS	9(       d   eg s  snf s  snf )
N)r   r   r   r3  r4  r   )r   r   r   gh㈵>)rtol)r   r%  Iblockcutsubsdictr   r   r)   block_collapserJ   randomrandshaper   r   reshapeeyer   allclose)r$  r   r   r3  r4  r'   outputcutsizesr   	cutinputs	cutoutputr   r   fblockedr   ninputss                   r#   "test_BlockMatrix_Inverse_executionrQ    s   DAE
Q"A
Q"ATFSSUFT1a4L1a4A,/T1a4L1a4A,/1H7=>v!Q--vI>DV!789I#fgc&k123F&CA):):9)E(F'-R9H @FFv!ryy~~qww'..u5vGFyy~%%agg.55e<vvay&(GAJ"''!''"4''J;;q'{Hg$6TBBB ? Gs   3#HA Hc                     SSK Jn   [        R                  " S5      n[        R                  [        R
                  4 H  nU" [        R                  " U5      [        R                  " U5      * /[        R                  " U5      [        R                  " U5      //5      n[        U5      n[        U[        5      (       d   e[        UR                  R                  U 5      (       a  M   e   g )Nr   )Jointheta)aesara.tensor.basicrS  r   r   r   ImmutableMatrixr   r   r$   rL   r
   r   r   )rS  r   
MatrixTyperb   tXs        r#   test_DenseMatrixrY    s    (
		'Ayy""4"45
RVVAYJ/"&&)RVVAY1GHI!_"n----"((++t,,,,	 6r%   c                  ~   [         [        R                  " S5      4[        [        R                  " S/[        R
                  Q76 4[        [        R                  " S5      " [        R                  " S5      5      4/n U  H;  u  p0 n[        XS9n[        XS9UL d   e[        U0 S9ULd   e[        X#S9UL a  M;   e   g)zGTest single symbol-like objects are cached when printed by themselves. r   rb   r   r   r  N)	r   r   r   rb   r%  rG  r}   r   r$   )pairsr  r  r   sts        r#   test_cache_basicr]    s    
 
BIIcN	
BOOC*!''*+	bkk#ryy~./E "* B,222 Bb)333 B,222 r%   c                      SSK Jn   [        U 5      n U R                  5         [        [
        [        4 H  n[        U5      n[        U5      UL a  M   e   U R                  U5        g! U R                  U5        f = f)zTest use of the global cache. r   )global_cacheN)	sympy.printing.aesaracoder_  rC  clearr   rb   r}   r   update)r_  backupr   r\  s       r#   test_global_cacherd    sj    6,F
$QAQBq>R'''  	F#F#s   ;A( A( (A;c            	         [         R                  " S5      [         R                  " SSS5      [        /n 0 n0 nU  H%  n[	        X1S9nXBR                  5       ;  d   eXBU'   M'     [        [        [        [        UR                  5       5      5      5      [        U 5      :X  d   eUR                  5        H  u  p4[        X1S9UL a  M   e   g)z
Test that symbol-like objects of different types (Symbol, MatrixSymbol,
AppliedUndef) are distinguished by the cache even if they have the same
name.
r}   r   r  N)r   r   r%  r}   r$   valuesr   setr,   iditemsr   )symbolsr   printedr   r\  s        r#   test_cache_types_distinctrl    s     yy1!=sCGEG!)))))
  s3r7>>+,-.#g,>>> 1*b000 !r%   c                      [         R                  " [        [        SS9n [        U 5      n[	        U[
        [
        -   5      (       d   e[	        U[
        [        [        5      -   5      (       a   eg)zZ
Test that a symbol is cached and reused when it appears in an expression
more than once.
Fr   N)r   Addr   r$   rO   r^   r   s     r#   test_symbols_are_created_oncero  $  sV    
 66!Q'DDb2gD"|A./////r%   c                     [         S-  [        [        R                  " [         5      -
  [        R                  " [
        [         [        -  -
  5      -  -   n U R                   Vs1 s H  oR                  iM     nn[        U 5      n[        5       n[        R                  R                  R                  U/5       H  nUR                  b  M  [        U[        R                  R                  R                   5      (       a  MG  UR                  U;   d   eUR                  U;  d   eUR#                  UR                  5        M     XB:X  d   egs  snf )zZ
Test caching on a complicated expression with multiple symbols appearing
multiple times.
r   N)r   r   r   r   r   r   free_symbolsr   r$   rg  r   r-   r.   	ancestorsr   rL   Constantr   )r!   r   symbol_namesr   seenvs         r#   test_cache_complexrw  /  s    
 6Q]bffQQY&777D$($5$56$5qFF$5L6$F 5D\\))6(377?:a1C1C1L1L#M#M66\)))66%%%HHQVV 4  7s   #Ec                  R   [         R                  " S[        S:  4[        [        S:  4S5      n [        U 5      nUR                  R
                  [        R                  :X  d   e[        R                  [        S:  S[        R                  [        S:  [        S5      5      n[        X5      (       d   e[         R                  " [        [        S:  45      n [        U 5      n[        R                  [        S:  [        [        R                  5      n[        X5      (       d   e[         R                  " S[         R                  " [        S:  [        S:  5      4[        [         R                  " [        S:  [        S:  5      45      n [        U 5      n[        R                  [        R                  [        S:  [        S:  5      S[        R                  [        R                  [        S:  [        S:  5      [        [        R                  5      5      n[        X5      (       d   eg )Nr   r   )r   Tr   )r   	Piecewiser   r$   r   r   r   switchr^   rO   rJ   nanAndOrand_or_)r!   resultr   s      r#   test_Piecewiser  G  st   <<AaC1ac(I6D$F<<??cjj(((zz"Q$3::bdB#:;H!!!!<<AE
#D$Fzz"q&"bff-H!!!!<<BFF1Q3!,-	
BEE!A#qsOD$Fzz#((2a41-q

3772a4A&BFF35H!!!!r%   c                  >   [        [        [        R                  " [        [
        5      5      [        R                  [        [        5      5      (       d   e[        [        [        [
        :  5      [        [        :  5      (       d   e[        [        [        [
        :  5      [        [        :  5      (       d   e[        [        [        [
        :  5      [        [        :  5      (       d   e[        [        [        [
        :*  5      [        [        :*  5      (       d   eg r   )
rO   r$   r   Eqr   r   r   eqr^   r_   rg   r%   r#   test_Relationalsr  ]  s    RUU1a[)366"b>::::QU#R"W----QU#R"W----Q!V$bBh////Q!V$bBh////r%   c            
      n   [         S[        S0n [        [         U S9[        [        U S9p!SSKJn  SSKJn  SSKJn  [        [        [        U" [         5      -  U S9X!R                  5       -  5      (       d   e[        [        S[         -  5      X" S5      U" S	5      U" SS
5      -  -   -  5      (       d   eg )N
complex128r   r   )	conjugate)as_tensor_variable)complexy      ?       @r   r   r   )
r   r   r   $sympy.functions.elementary.complexesr  aesara.tensorr  r  rO   conj)r   r^   r_   r  atvcplxs         r#   test_complexfunctionsr  f  s    a-F6*K&,I>7-AilN6:B	NKKKKT1H%r3s8CHT!AY4F+F'GHHHHr%   c                  8    [        / S/5      n U " 5       S:X  d   eg )Ny      ?      ?)r   )tfs    r#   test_constantfunctionsr  p  s    	TF	#B4::r%   )g__doc__loggingsympy.externalr   sympy.testing.pytestr   r   sympy.utilities.exceptionsr   	getLoggeraesaraloggersetLevelCRITICALr   WARNINGr   rJ   r   r   aesara.scalar.basicr   aesara.graph.basicr	   aesara.tensor.varr
   aesara.tensor.elemwiser   r   aesara.tensor.mathr   r`  r   r   r^   r_   r`   ra   rc   re   disabledsympyr   sympy.core.singletonr   	sympy.abcr   r   r   r   r   r   r   r%  rb   rd   rf   r   r}   r$   r)   r6   r@   rO   rh   rp   rs   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=  rQ  rY  r]  rd  rl  ro  rw  r  r  r  r  )r   r   s   00r#   <module>r     sA    ( - 6   !89   g&& '	x	    goo & 

--C.+0;&59>?#**T8,?JBBHMN1#**X~A*>NJBB H  "      .3
3U2??1a#U
31a 	kk#q'
64$"-`
%	. 4 4.
6 
\O)$,>=
9,)8

=
>LA")+VGT$:.A C C2-3.$"1.	0 0",0I[ @N 4s   ,G*G/G4