K i\SdZddlZddlmZddlmZmZmZddlm Z ejdZ e jejedZe jejerddlZej$ZddlmZdd lmZdd lmZdd lmZmZdd lmZdd lm Z dDcgc]}ejC|dc}\Z"Z#Z$dDcgc]}ej%dd|c}\Z%Z&Z'ndZ(ddl)Z*ddl+m,Z,ddl-m.Z.m/Z/m0Z0m1Z1ddlm2Z2m3Z3m4Z4dDcgc]}e*jj|ddc}\Z6Z7Z8e*jrde1Z:dZ;dZdZ?dZ@dZAd ZBed!ZCd"ZDd#ZEd$ZFd%ZGd&ZHd'ZId(ZJd)ZKd*ZLd+ZMd,ZNd-ZOd.ZPd/ZQd0ZRd1ZSd2ZTd3ZUd4ZVd5ZWd6ZXd7ZYd8ZZd9Z[d:Z\ed;Z]d<Z^d=Z_d>Z`d?Zad@ZbdAZcdBZddCZedDZfdEZgycc}wcc}wcc}w)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)raisesSKIPwarns_deprecated_sympy)ignore_warningszaesara.configdefaultsaesara) ScalarType)Variable)TensorVariable)Elemwise DimShuffle)Dot) true_dividexyzfloatXXYZFF)nameT)S)xyzt) aesara_code dim_handlingaesara_functionfc ~|jdit5t|fi|cdddS#1swYyxYw)zB Wrapper for aesara_code that uses a new, empty cache by default. cacheN) setdefaultrr)exprkwargss j/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/sympy/printing/tests/test_aesaracode.py aesara_code_r%8s: gr"  !+4*6*+++s 3<c |jdit5t||fi|cdddS#1swYyxYw)zF Wrapper for aesara_function that uses a new, empty cache by default. r N)r!rr)inputsoutputsr#s r$aesara_function_r)>s< gr"  !:vw9&9:::s 4=cFttt|}ttjj j |}tjj j||\}}tjjj||S)z Transform SymPy expressions into Aesara Computation. Parameters ========== exprs SymPy expressions Returns ======= aesara.graph.fg.FunctionGraph ) listmapr%rgraphbasic graph_inputsclonefg FunctionGraph)exprsoutsinss r$ fgraph_ofr6Eso L%( )D v||!!..t4 5C ""((d3IC <> * * , 6 6x @D \\^FNN6" Mr7c |tttjf}t ||}t ||}|s|r |r|sy||k(St |t t f}t |t t f}|s|rO|r|rt|t|k7ryt tt|t tt|k(Stjj|d}tjj|d}d||fd||ffD])\} } } | dk(s td| d| d t| d ||k(S) 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. Fstr)fileabzaesara.printing.debugprint(z) returned empty string (z is instance of ))intfloatnpnumber isinstancetupler+typer,theqrprinting debugprint TypeError) rErF numeric_typesa_is_numb_is_numa_is_seqb_is_seqastrbstrargnameargvalargstrs r$rPrPhs2%+M!]+H!]+H8XAv !eT]+H!eT]+H8X$q'T!W*<CaL!T#dA,%777 ?? % %ae % 4D ?? % %ae % 4D&)!TNS!TN#C R<GT&\3  4<r7cxttttsJtttt sJtt ttsJttttsJttttsJttttsJy)z Check that the example symbols in this module print to their Aesara equivalents, as many of the other tests depend on this. N)rPxtr%rytrztrXtXYtYZtZr7r$test_example_symbolsris| LO $$ $ LO $$ $ LO $$ $ LO $$ $ LO $$ $ LO $$ $r7c4tt}t|tsJ|jdk(sJ|j tj k(sJtttdi}|jdk(sJ|j tj k(sJy)z. Test printing a Symbol to a aesara variable. rhFbroadcastablesN)r%rrMr broadcastabler)xxxx2s r$ test_Symbolrqs aB b( ## #  r !! ! 77aff   q!X 7C    (( ( 88qvv  r7chtt}t|tsJ|jdk(sJy)z4 Test printing a MatrixSymbol to a aesara variable. rN)r%rcrMr rn)XXs r$test_MatrixSymbolrts/ aB b. )) )  ~ -- -r7cgd}|D]1}tt5ttt|iddd3y#1swY>xYw)z/ Test MatrixSymbol with invalid broadcastable. )rhrkTTFFT)TTrlN)r ValueErrorr%rc)bcsbcs r$test_MatrixSymbol_wrong_dimsr|sI OC4 J  4 Ar7 3 4 44 4 4s <A ctt}t|tsJ|jdk(sJ|j dk(sJy)zG Test printing AppliedUndef instance, which works similarly to Symbol. rhf_tN)r%r~rMr rnr)ftts r$test_AppliedUndefrsB s C c> ** *    "" " 88u  r7cttz}t|}|jjt j jk(sJyN)rrr%owneroprtensoraddr"comps r$test_addrs5 q5D  D ::==FMM-- -- -r7ctttjtt jt sJtttjtt jt sJyr)rPr%sysinraetr_tanrhr7r$ test_trigrsL  RVVAY' 55 5  RVVAY' 55 5r7ctjtdztjtztj dt zz}t|}tjtdztjtztj dtzz}t||sJy)z; Test printing a complex expression with multiple symbols. N) rexprcosrlogrr%rr_r`rarP)r"rexpecteds r$ test_manyrs| 66!Q$" #bffQqSk 1D  Dwwr1uswwr{*+cggadm;H h  r7cdD]2}ttt|ijj|k(r2JtttdijjdvsJttdztdijjdk(sJtttztdtdijjdk(sJy) zA Test specifying specific data types through the dtype argument. )float32float64int8int16int32int64dtypesr)rrrrN)r%rrOdtyper)rs r$ test_dtypersJFAq%j166<<EEEF 1h- 0 5 5 ; ;?U UU U Aq)n 5 : : @ @I MM M Aq)Q &B C H H N NR[ [[ [r7cpttfD]'}dD] }t|||ij|k(r J)y)zG Test the "broadcastables" argument when printing symbol-like objects. )rhrkrvrrwrlN)rr~r%rn)sr{s r$test_broadcastablesrsIXOH OB1b':HHBN NN OOr7cttz}gdgdgdgdgdg}|D]0\}}}t|t|t|i}|j|k(r0Jy)zG Test "broadcastable" attribute after applying element-wise binary op. )rhrhrh)rkrkrk)rvrkrk)rxrr)rwrrrlN)rrr%rn)r"casesbc1bc2bc3rs r$test_broadcastingrse q5D &%77  E) S#D!S!S1AB!!S((()r7cttztz}t|}t |j j tsJt|tjtjtsJyr) rcrergr%rMrrrrPrbdotrdrf)r"expr_ts r$ test_MatMulrsR Q3q5D $ F flloos ++ + r r* ++ +r7c~tttjjj t sJyr)rMr%rcTrrr rhr7r$test_Transposers' l133'--00* == =r7cttztz}tt |j j tsJyr)rcrergrMr%rrr r"s r$ test_MatAddr s0 Q3q5D l4(..118 << z!test_Derivative..sOIdO<r7Fevaluate) r UserWarningrPr%r Derivativerrrgradrr_)simps r$test_Derivativersr  %8<DbmmBFF1Iq5&QRSSWWR["568 88888s BB!!B*cdtttgttzg}|dddk(sJy)z, Test aesara_function() with single output. rrNr)rr)rs r$test_aesara_function_simpler s*!Q!A#'A Q7a<)rrN) r)rrrKlinalgnormasarrayarangeastype)rroyys r$test_aesara_function_numpyr,s!Q!A#A!"Iq) < >A 99>>!QFQF+bjj!Q.@@ AD HH H!Q!A#9a/K A 1  Y 'B 299Q<  y ) )B 99>>!B)a ! n4 5 << *+Axx#sc?%;<=H!QQC(AJJqc3/:!QQC5AJJqc3/:!QQF+A aS#&R 11 1JJqc3/2H=JJqc3/2H=r7cttgdtdik(sJtttgtdtditdtdik(sJttgtditdik(sJy) Nr)rrr)dimsrxrkrl)rrrrhr7r$test_dim_handlingrEst  #>': :: : AaAq\ 2q-78.7J JJ J QM :q(m KK Kr7c ddl}ttttgttzgddtdtdtdi}|j j |ddgdd gddg|jd d gz d ksJttttgttzgtdtdtdidd }|jdjd}d|jdjdz}d|jdjdz}|j j ||||d|jdzz d ksJy) zU Test passing additional kwargs from aesara_function() to aesara.function(). rNrignorer)ron_unused_inputrrrrrr)rrr) numpyr)rrrrrrrr)rKrrorzzs r$test_aesara_function_kwargsrKs8!QQqSEq(y!Y9= ?A 99>>!QFQFQF3jbjj!Q6HH ID PP P!QQqSE !9aAyIx 9A 1  Y 'B 9299Q<  y ) )B 9299Q<  y ) )B 99>>!BB-!IBIIaL.8 9D @@ @r7c ddlm}ttgttzgddgftt gtt zgddgfttgttzgtdtdidgfttgttzttz gdddgftttt gttztt zgdddgfg}|D],\}}}}dD]}t ||||}t|j|sJ|jjD cgc]=}tj|jjD cgc]} | rdnd c} ?} }} || } t| ts| g} t|t| k(sJt!|| D]V\} } |r"| dk(rt| tj"r(Jt| tj$sJ| j&| k(rVJ!/ycc} wcc} }w) z2 Test the "scalar" argument to aesara_function(). r)FunctionNrrrx)rrr)aesara.compile.function.typesrrrrcrer)rMr input_storagerKonesrOrnr+lenziprLndarrayndim)rargsr'r(in_dimsout_dimsrrir{ in_values out_valuesdvalues r$test_aesara_function_scalarr\s6 Q!a%$$ Q!a%$$ Q!a%1aA,, Q!a%Q1v. Q1Aq1u~taV4  D/3+*(# +F wvNAa//: :: **88!&&2F2FGBbaGHIIJj$/(\ x=C O3 33*5 +5a1f%eRYY777&eRZZ888 ::?*? +% ++Hs,G=  G8 G= 8G= c&ttdy)za Passing an unknown keyword argument to aesara_function() should raise an exception. c8ttgtdzgdS)Nrr)foobar)r)rrhr7r$rz0test_aesara_function_bad_kwarg..s/acU1Er7N)r Exceptionrhr7r$test_aesara_function_bad_kwargr s  9EFr7c Nttdddtdddk(sJd}tdtdi}|tttt|ttt sJ|ttdtd|tdtdsJy)NrrrcvdD]4}t||}t||}|||"|%yt||r4yy)N)startstopstepFT)getattrrP)s1s2attra1a2s r$ theq_sliceztest_slice..theq_slicesO- DT"BT"BzRZ bj "b\ r7rr)r%slicerrr_r`)rrs r$ test_slicers aA '5Aq> 99 9 !W %F l5A;v>b" NN N l5Aq>&A5BPQ? SS Sr7cT i}tjdd}tjd||}|ddddd d f}t||  t d }t j jjt|||t|||fk(sJ j jd t|| k(sJt fdtddDsJtjd}t||did|d}}}||||}t||d|di y)NrTintegerrcrrrrrrr rrc3jK|]*}jj|j|k(,ywr)rr'data).0rrds r$ z#test_MatrixSlice..s)Arxxq!&&!+As03krr) rr MatrixSymbolr%r rNrridx_listrr'allrange) r rrcrerr!r r rrds @r$test_MatrixSlicer&s E #t$A Q"A !Aa%1Q,A au %B7A %% &5Aq>5Aq>*J JJ J 88??1 au!= == = AU1a[A AA A #AAw<(1a4E %T/A aGQ 8 9Br7c @ tjdd}dDcgc]}tj|||c}\}}}}tt||||f\}}}} tj ||g||gg} t |  t jdt jd||t jd|| t jdt jd||t jd|| g} t fd| DsJycc}w)NrTrABCDrrc36K|]}t|ywr)rP)rsolutionBlockts r$rz#test_BlockMatrix..s@(tFH%@s) rrr"r,r% BlockMatrixrjoinany) rrABCDAtBtCtDtBlock solutionsr+s @r$test_BlockMatrixr9s #t$A:@A$"//$1-AJAq!Q1a|4NBB NNQFQF+ ,E % F!SXXaR0#((1b"2EF!SXXaR0#((1b"2EFHI @i@ @@ @ BsDc  d\}}d}tjd||}tjd||}||f}|j|z}||dz|dzf|dz|dzfg||dz|dzf|dz|dzfgi}|Dcgc]}tj|g||} }|j t t || } t t ||gt|z} t||g| i} t|tj| g| i} |Dcgc]7}tjj|jj|9}}tj||zj!|jj|tj"|j|g}|dxxtj$|jdzz cc<tj&| || |d sJycc}wcc}w) N)rrrr/r0r)rr rgh㈵>)rtol)rr"Iblockcutsubsdictrrr)block_collapserKrandomrandshaperrreshapeeyerallclose)r!rrr/r0r'outputcutsizesr cutinputs cutoutputrrfblockedrninputss r$"test_BlockMatrix_Inverse_executionrMs DAq E Q"A Q"A TF SSUFQT1a4L1a4A,/QT1a4L1a4A,/1H7=>!Q-!->I> DVY!789I #fugc&k12 3F&&CA):):9)E(F'-R9H@FF!ryy~~qww'..u5FGFyy1~%%agg.55e<vvay&(G AJ"''!''"4''J ;;q'{Hg$6T BB B?Gs 7 H>+,- .#g, >> >52 # % 5q."4 44 5 55 5 5s CC( ctjttd}t|}t |t t zsJt |t ttzrJy)zf Test that a symbol is cached and reused when it appears in an expression more than once. FrN)rAddrr%rPr_rs r$test_symbols_are_created_oncerk(sP 66!Q 'D  D b2g  D"|A.// //r7c|tdzttjtz tjt ttzz zz}|j Dchc]}|j}}t|}t}tjjj|gD]y}|jt|tjjj r?|j|vsJ|j|vsJ|j#|j{||k(sJycc}w)zf Test caching on a complicated expression with multiple symbols appearing multiple times. rN)rrrrrr free_symbolsrr%rcrr-r. ancestorsrrMConstantr)r"r symbol_namesrseenvs r$test_cache_complexrs3s 6Q]bffQQY&77 7D$($5$56qAFF6L6 $ F 5D \\   ) )6( 3 77?:a1C1C1L1L#M66\) ))66% %% HHQVV   <  7s!D9c .tjdtdkfttdkfd}t|}|jj t jk(sJt jtdkdt jtdktd}t||sJtjttdkf}t|}t jtdkttj}t||sJtjdtjtdkDtdkfttjtdkDtdkf}t|}t jt jtdkDtdkdt jt jtdkDtdkttj}t||sJy)Nrr)rTr)r Piecewiserr%rrrswitchr_rPrKnanAndOrand_or_)r"resultrs r$test_Piecewiser}Ksq <<AaC1ac(I 6D $ F < :: :  QU#R"W -- -  QU#R"W -- -  Q!V$bBh // /  Q!V$bBh // /r7c tdtdi}t5tt|tt|}}dddddlm}ddlm}ddlm}t5ttt|tz|jzsJttdtz||d|d |dd zzzsJ dddy#1swYxYw#1swYyxYw) N complex128rr) conjugate)as_tensor_variable)complexy?@rrr) rrrr$sympy.functions.elementary.complexesr aesara.tensorrrrPconj)rr_r`ratvcplxs r$test_complexfunctionsrjs a -F  !NQv. Af0MBN>7-  !MK)A,v>BGGIOOOKq)2s3xCa8J/J+KLLLMM NN MMs#C  A6C, C),C5ctt5tgdg}ddddk(sJy#1swYxYw)Ny??)rr)tfs r$test_constantfunctionsrvs9  !( R '( 4::((s.7)h__doc__loggingsympy.externalrsympy.testing.pytestrrrsympy.utilities.exceptionsr getLogger aesaraloggersetLevelCRITICALrWARNINGrrKrraesara.scalar.basicr aesara.graph.basicr aesara.tensor.varr aesara.tensor.elemwiser r aesara.tensor.mathrr\rrr_r`rarbrdrfdisabledsympyrsympy.core.singletonr sympy.abcrrrrrrrr"rcrergrr~r%r)r6rArPrirqrtr|rrrrrrrrrrrrrrrrrrrrrr rr&r9rMrUrYr`rhrkrsr}rrr)rrs00r$rs@(EE6!w  !89 g&&' x  goo&  --C.+0;&59>?#**T8,?JBBHMN1#**X~A*>NJBBH"  .3 3?2??1a # 31akbkk#q+ :4$"-` % . 44. 6  \O)$, >= 9,)8  = >L A")+VGT$:.ACC2-3.$$50 0 0",0 Mg@N 4s)G" G'G,