
    \hA              
          S SK r S SKrS SKJrJr  S SKJr  S SKJrJrJ	r	  S SK
Jr  S SKJrJrJrJrJr  S SKJr  S SKJrJrJrJrJrJr  S S	KJrJrJrJrJ r J!r!J"r"J#r#J$r$J%r%J&r&J'r'J(r(J)r)J*r*J+r+J,r,J-r-J.r.J/r/J0r0J1r1J2r2J3r3  S S
K4J5r5  S SK6J7r7  S SK8J9r9J:r:J;r;J<r<  S SK=J>r>  S SK=J?r?J@r@JArA  S SKJBrBJCrC  S SKJDrDJErEJFrF  \7" S5      rG\" SSS5      rH\" SSS5      rI\" SSS5      rJ\" SSS5      rK\" S5      u  rLrMrNrO\GbL  \P" S SS5       V s/ s H  n \Q" \P" X S-   5      5      PM     sn rR\GR                  \R\GR                  S9rU\	" \R5      rVS rWS 4S jrXS 4S jrYS rZS  r[S! r\S" r]S# r^S$ r_S% r`S& raS' rbS( rcS) rdS* reS+ rfS, rggs  sn f )-    N)symbols
Derivative)
torch_code)eyeMatrixSymbolMatrix)	NDimArray)ArrayTensorProductArrayAddPermuteDimsArrayDiagonal_CodegenArrayAbstract)lambdify)EqNeGeGtLeLt)Absceilingexpfloorsignsinasincosacostanatanatan2coshacoshsinhasinhtanhatanhreimargerfloggammasqrt)skip)import_module)DeterminantHadamardProductInverseTrace)
randMatrix)Identity
ZeroMatrix	OneMatrix)	conjugateI)	Heavisidegamma	polygammatorchM   NPQzx y z t	   dtypec                    [        XS5      nU  Vs/ s H)  n[        UR                  S   UR                  S   5      PM+     nnU Vs/ s H3  n[        R	                  UR                  5       [        R                  S9PM5     nnU" U6 nUR                  [        [        X5      5      5      R                  5       n[        U[        5      (       a  UR                  5       n[        US5      (       as  UR                  (       ab  [        U[        R                  5      (       aC  UR!                  5       S:X  a/  UR#                  5       n[%        U5      n['        Xg-
  5      S:  d   eg UR(                  (       d  [        U[*        5      (       aL  [        R	                  UR                  5       [        R                  S9n[        R-                  XgSS9(       d   eg [/        S[1        U5       S	[1        U5       35      es  snf s  snf )
Nr=   r      rD   	is_numberư>atolzCannot compare z with )r   r4   shaper=   tensortolistfloat64subsdictzipdoit
isinstancer   hasattrrH   Tensordimitemfloatabs	is_Matrixr	   allclose	TypeErrortype)	variablesexprfirandom_matricesrandom_variablesres           W/var/www/auris/envauris/lib/python3.13/site-packages/sympy/printing/tests/test_torch.py_compare_torch_matrixrh   +   ss   '*ACLM9az!''!*aggaj99OMO^_!QXXZu}}E_	A		$s9678==?A!*++FFHq+1;;a&&1557a<AaAqu:$$${{jI..LL5==L9~~a~.../$q'&a	BCC' N_s   0G7:G<c                  0    [         R                  " SS5      $ N   randomuniform     rg   <lambda>rr   D   s    v~~b!7Lrq   c                    [        XS5      nU  Vs/ s H	  oB" 5       PM     nnU Vs/ s H%  n[        R                  U[        R                  S9PM'     nnU" U6 n[	        U[        R
                  5      (       a  UR                  5       nUR                  [        [        X5      5      5      R                  5       n	[        X-
  5      S:  d   eg s  snf s  snf )Nr=   rD   rI   )r   r=   rM   rO   rT   rV   rX   rP   rQ   rR   rS   rZ   
r_   r`   rngra   vrvsrb   t_rvsre   rf   s
             rg   _compare_torch_scalarry   D   s    '*A#
$)Q35)C
$;>?3aU\\!5==\13E?	5	A!U\\""FFH		$s9*+,113Aqu: %?s
   C,Cc                  0    [         R                  " SS5      $ )Nr   
   )rn   randintrp   rq   rg   rr   rr   O   s    6>>!R;Prq   c           
      j   [        XS5      nU  Vs/ s H	  oB" 5       PM     nnU Vs/ s H%  n[        R                  U[        R                  S9PM'     nnU" U6 n[	        UR                  [        [        X5      5      5      R                  5       5      n	UR                  5       U	:X  d   eg s  snf s  snf )Nr=   rD   )
r   r=   rM   rO   boolrP   rQ   rR   rS   rX   rt   s
             rg   _compare_torch_relationalr   O   s    '*A#
$)Q35)C
$;>?3aU\\!5==\13E?	5	ATYYtC	/016689A668q==	 %?s
   B+,B0c                  d	   [         (       d  [        S5        [        [        5      n [	        U 5      S:X  d   e[        [        U S5      n[         R                  / SQ/[         R                  S9nU" U5      n[         R                  U5      n[         R                  X4:H  5      (       d   e[        [        5      n [	        U 5      S:X  d   e[        [        4U S S9  [        [        5      n [	        U 5      S	:X  d   e[        [        4U S
 S9  [        [        5      n [	        U 5      S:X  d   e[        [        4U S S9  [        [        5      n [	        U 5      S:X  d   e[        [        4U S S9  [        [        5      n [	        U 5      S:X  d   e[        [        4U S S9  [        S-  n [	        U 5      S:X  d   e[        [        4U S S9  [!        [        5      n [	        U 5      S:X  d   e[        [        4U S S9  [#        [        5      n [	        U 5      S:X  d   e[        [        4U S S9  [%        [        5      n [	        U 5      S:X  d   e[        [        4U S S9  ['        [        5      n [	        U 5      S:X  d   e[        [        4U S S9  [)        [        5      n [	        U 5      S:X  d   e[        [        4U S S9  [+        [        5      n [	        U 5      S:X  d   e[        [        4U S S9  [-        [.        [        5      n [	        U 5      S :X  d   e[        [.        [        4U S! S9  [1        [        5      n [	        U 5      S":X  d   e[        [        4U S# S9  [3        [        5      n [	        U 5      S$:X  d   e[        [        4U S% S9  [5        [        5      n [	        U 5      S&:X  d   e[        [        4U S' S9  [7        [        5      n [	        U 5      S(:X  d   e[        [        4U S) S9  [9        [        5      n [	        U 5      S*:X  d   e[        [        4U S+ S9  [;        [        5      n [	        U 5      S,:X  d   e[        [        4U S- S9  [=        [        5      n [	        U 5      S.:X  d   e[        [        4U S/ S9  [?        [        5      n [	        U 5      S0:X  d   e[        [        4U S1 S9  g )2NPyTorch not installedztorch.abs(x)r=   )   rD   ztorch.sign(x)c                  0    [         R                  " SS5      $ )Nir{   rm   rp   rq   rg   rr   !test_torch_math.<locals>.<lambda>f   s    &..b2Irq   )ru   ztorch.ceil(x)c                  ,    [         R                   " 5       $ Nrn   rp   rq   rg   rr   r   j   
    &--/rq   ztorch.floor(x)c                  ,    [         R                   " 5       $ r   r   rp   rq   rg   rr   r   n   r   rq   ztorch.exp(x)c                  0    [         R                  " SS5      $ Nr   rm   rp   rq   rg   rr   r   r       &..Q2Grq   ztorch.sqrt(x)c                  ,    [         R                   " 5       $ r   r   rp   rq   rg   rr   r   v   r   rq      ztorch.pow(x, 4)c                  ,    [         R                   " 5       $ r   r   rp   rq   rg   rr   r   z   r   rq   ztorch.cos(x)c                  ,    [         R                   " 5       $ r   r   rp   rq   rg   rr   r   ~   r   rq   ztorch.acos(x)c                  0    [         R                  " SS5      $ NgGzgGz?rm   rp   rq   rg   rr   r          &..2Mrq   ztorch.sin(x)c                  ,    [         R                   " 5       $ r   r   rp   rq   rg   rr   r      r   rq   ztorch.asin(x)c                  0    [         R                  " SS5      $ r   rm   rp   rq   rg   rr   r      r   rq   ztorch.tan(x)c                  0    [         R                  " SS5      $ )Ng      g      ?rm   rp   rq   rg   rr   r          &..s2Krq   ztorch.atan(x)c                  0    [         R                  " SS5      $ rj   rm   rp   rq   rg   rr   r      r   rq   ztorch.atan2(y, x)c                  0    [         R                  " SS5      $ rj   rm   rp   rq   rg   rr   r      s    FNN2q4Irq   ztorch.cosh(x)c                  0    [         R                  " SS5      $ r   rm   rp   rq   rg   rr   r      r   rq   ztorch.acosh(x)c                  0    [         R                  " SS5      $ )Ng?rl   rm   rp   rq   rg   rr   r          &..a2Hrq   ztorch.sinh(x)c                  0    [         R                  " SS5      $ r   rm   rp   rq   rg   rr   r      r   rq   ztorch.asinh(x)c                  0    [         R                  " SS5      $ rj   rm   rp   rq   rg   rr   r      r   rq   ztorch.tanh(x)c                  0    [         R                  " SS5      $ r   rm   rp   rq   rg   rr   r      r   rq   ztorch.atanh(x)c                  0    [         R                  " SS5      $ )Ngg?rm   rp   rq   rg   rr   r      r   rq   ztorch.erf(x)c                  0    [         R                  " SS5      $ r   rm   rp   rq   rg   rr   r      r   rq   ztorch.lgamma(x)c                  0    [         R                  " SS5      $ )Ng      ?rl   rm   rp   rq   rg   rr   r      r   rq   ) r=   r.   r   xr   r   rM   rO   rZ   allr   ry   r   r   r   r-   r   r   r   r   r   r    r!   yr"   r#   r$   r%   r&   r'   r+   r,   )r`   ra   may_abscs        rg   test_torch_mathr   X   s   5$%q6Dd~---D'"A	'u}}	=BbEE		"A99UZ    7Dd...1$*IJ1:Dd...1$*AB8Dd////1$*ABq6Dd~---1$*GH7Dd...1$*AB6Dd00001$*ABq6Dd~---1$*AB7Dd...1$*MNq6Dd~---1$*AB7Dd...1$*MNq6Dd~---1$*KL7Dd...1$*GHA;Dd22221a&$,IJ7Dd...1$*GH8Dd////1$*HI7Dd...1$*GH8Dd////1$*GH7Dd...1$*GH8Dd////1$*KLq6Dd~---1$*GHA;Dd00001$*HIrq   c                      [        [        [        5      5      S:X  d   e[        [        [        5      5      S:X  d   e[        [	        [        5      5      S:X  d   eg )Nztorch.real(x)ztorch.imag(x)ztorch.angle(x))r   r(   r   r)   r*   rp   rq   rg   test_torch_complexesr      sH    be///be///c!f!1111rq   c                     [         (       d  [        S5        [        [        [        5      n [        U 5      S:X  d   e[        [        [        4U 5        [        [        [        5      n [        U 5      S:X  d   e[        [        [        4U 5        [        [        [        5      n [        U 5      S:X  d   e[        [        [        4U 5        [        [        [        5      n [        U 5      S:X  d   e[        [        [        4U 5        [        [        [        5      n [        U 5      S:X  d   e[        [        [        4U 5        [        [        [        5      n [        U 5      S:X  d   e[        [        [        4U 5        g )Nr   ztorch.eq(x, y)ztorch.ne(x, y)ztorch.ge(x, y)ztorch.gt(x, y)ztorch.le(x, y)ztorch.lt(x, y))r=   r.   r   r   r   r   r   r   r   r   r   r   r`   s    rg   test_torch_relationalr      s   5$%a8Dd////q!fd+a8Dd////q!fd+a8Dd////q!fd+a8Dd////q!fd+a8Dd////q!fd+a8Dd////q!fd+rq   c                  &   [         c  [        S5        [        n [        U 5      S:X  d   e[	        [        4U S5      n[        S5      n[         R                  UR                  5       [         R                  S9n[         R                  U" U5      U5      (       d   e[        [        -  n [        U 5      S:X  d   e[        [        [        4U 5        [        S-  n [        U 5      S:X  d   e[        [        4U 5        [        [        -  [        -  [        -  n [        U 5      S:X  d   e[        [        [        [        [        4U 5        [        [        5      n [        U 5      S	:X  d   e[        [        4U 5        [        [        5      n [        U 5      S
:X  d   e[        [        4U 5        [!        [        [        5      n [        U 5      S:X  d   e[        [        [        4U 5        [#        [        5      n [        U 5      S:X  d   e[        S5      n[         R                  UR                  5       [         R                  S9n[	        [        4U S5      nU" U5      n[         R$                  R'                  U5      n[         R                  XE5      (       d   eg )Nr   r>   r=   r?   rD   ztorch.matmul(M, N)ztorch.mm(torch.mm(M, M), M)z4torch.matmul(torch.matmul(torch.matmul(M, N), P), Q)ztorch.trace(M)ztorch.det(M)ztorch.mul(M, N)ztorch.linalg.inv(M))r=   r.   r>   r   r   r   rM   rN   rO   r\   r@   rh   rA   rB   r3   r0   r1   r2   linalginv)r`   ra   eye_mat
eye_tensorresultexpecteds         rg   test_torch_matrixr      s
   }$%Dds"""!tW%A!fGgnn.emmDJ>>!J-4444q5Dd33331a&$'6Dd<<<<1$%q519q=DdUUUU1aA,-8Dd////1$%q>Dd~---1$%1a Dd00001a&$'1:Dd4444 !fGgnn.emmDJ!tW%Az]F||
+H>>&++++rq   c                  D   [         (       d  [        S5        [        SSS5      n [        SSS5      n[        SSS5      n[        SSS5      n[         R                  SS/S	S
//[         R                  S9n[         R                  SS/SS	//[         R                  S9n[         R                  SS/SS//[         R                  S9n[         R                  SS/S
S//[         R                  S9n[        X5      n[        U5      S:X  d   e[        X4US5      n	U	" XE5      n
[         R                  SXE5      n[         R                  X5      (       d   e[        X5      n[        U5      S:X  d   e[        X4US5      n	U	" XE5      n
XE-   n[         R                  X5      (       d   e[        XU5      n[        U5      S:X  d   e[        XU4US5      n	U	" XEU5      n
XE-   U-   n[         R                  X5      (       d   e[        XX#5      n[        U5      S:X  d   e[        XX#4US5      n	U	" XEXg5      n
XE-   U-   U-   n[         R                  X5      (       d   e[        U SS/5      n[        U5      S:X  d   e[        U 4US5      n	U	" U5      n
UR                  n[         R                  X5      (       d   e[        [        X5      / SQ5      n[        U5      S:X  d   e[        X4US5      n	U	" XE5      n
[         R                  SXE5      R                  SSSS5      n[         R                  X5      (       d   e[        [        X5      S5      n[        U5      S:X  d   e[        X4US5      n	U	" XE5      n
[         R                  SXE5      n[         R                  X5      (       d   eg ) Nr   r>   r   r@   rA   rB         ?       @      @      @rD   g                     g      @ztorch.einsum("ab,cd", M, N)r=   zij,klztorch.add(M, N)ztorch.add(torch.add(M, N), P)z+torch.add(torch.add(torch.add(M, N), P), Q)rG   r   zM.permute(1, 0))rG   r   r?   r   z/torch.einsum("ab,cd", M, N).permute(1, 2, 3, 0)zab,cdr?   )rG   r   z torch.einsum("ab,bc->acb", M, N)z
ab,bc->acb)r=   r.   r   rM   rO   r
   r   r   einsumr\   r   r   Tpermuter   )r>   r@   rA   rB   r   mbmcmdcgra   r   r   s               rg   test_torch_array_operationsr     so   5$%S!QAS!QAS!QAS!QA	Bx"b*%--	@B	Cy3),EMM	BB	Bx"b*%--	@B	Cy2r(+5==	AB	A	!Bb>::::!W%A	"	AWb%A>>!	!Bb>....!W%A	"	A
A>>!	!	Bb><<<<!B(A	""A
"A>>!	!	Bb>JJJJ!r7+A	""A
"rA>>!	QA	Bb>....!r7#A	"A
A>>!	'-|	<Bb>NNNN!W%A	"	AWb%--aAq9A>>!	)!/	8Bb>????!W%A	"	A\2*A>>!rq   c                  `    [        [        [        5      [        5      n [        U 5      S:X  d   eg)zTest derivative handling.'torch.autograd.grad(torch.sin(x), x)[0]N)r   r   r   r   r   s    rg   test_torch_derivativer   K  s&    c!fa DdHHHHrq   c                  D   [         (       d  [        S5        [        [        [	        [
        5      /[        [        5      [        * //5      n S[        U 5      ;   d   eS[        U SS9;   d   e[        U SS9nSU;   d   eSU;   d   e[        U SSS	9nSU;   d   eSU;   d   eg )
Nr   zdtype=torch.float64zdtype=torch.float32ztorch.float32rD   Trequires_gradzrequires_grad=True)r   rE   )
r=   r.   r   r   r   r   r   ztr   )r`   r   s     rg   test_torch_printing_dtyper   Q  s    5$% As1v;Q!-.D Jt$4444 !Jt?$KKKK D1F6))) F*** DHF6))) F***rq   c                  t   [         (       d  [        S5        [        [        5      [	        [
        5      -   n [        [        [
        /U S5      n[         R                  SSS9n[         R                  SSS9nU" X#5      nUR                  (       d   eUR                  5         [        UR                  R                  5       [        [	        S5      R                  5       5      -
  5      S:  d   e[        UR                  R                  5       [        [        S5      R                  5       * 5      -
  5      S:  d   eg )Nr   r=   r   Tr   r   rI   )r=   r.   r   r   r   r   r   rM   r   backwardrZ   gradrX   rY   evalf)r`   ra   x_valy_valr   s        rg   test_requires_gradr   g  s    5$%q6CF?D!Qw'A LLDL1ELLDL1Eu_F
OO uzz 5S)9#::;dBBB uzz 5#c(..*:):#;;<tCCCrq   c                     [         (       d  [        S5        [        S5      u  pn[        [	        U 5      U 5      n[        U5      S:X  d   e[        [	        U 5      U S45      n[        U5      S:X  d   e[        [	        X-  5      X5      n[        U5      nSnUR                  SS5      nUR                  SS5      nXg:X  d   e[        [	        U 5      X 5      n[        U5      nSnXE:X  d   e[        [	        X-  U-  5      XS4U5      n[        U5      nS	nUR                  SS5      nUR                  SS5      nXg:X  d   eg )
Nr   zx y zr   r   zhtorch.autograd.grad(torch.autograd.grad(torch.sin(x), x, create_graph=True)[0], x, create_graph=True)[0]zjtorch.autograd.grad(torch.autograd.grad(torch.sin(x*y), x, create_graph=True)[0], y, create_graph=True)[0]  ztorch.autograd.grad(torch.autograd.grad(torch.autograd.grad(torch.autograd.grad(torch.sin(x*y*z), x, create_graph=True)[0], y, create_graph=True)[0], y, create_graph=True)[0], z, create_graph=True)[0])r=   r.   r   r   r   r   replace)r   r   r   r`   r   r   normalized_resultnormalized_expecteds           rg   %test_torch_multi_variable_derivativesr   |  sR   5$%gGA!c!fa DdHHHHc!fq!f%D{| | | c!%j!'DF{HsB/"**33333c!fa#DFyHc!%!)naQ3DF ZHsB/"**33333rq   c                     [         (       d  [        S5        [        S5      n [        S5      n[        U S-  U 5      n[	        XS5      n[         R                  SSS9nU" U5      n[         R                  U[         R                  S	5      5      (       d   e[        [        U 5      U S45      n[	        XS5      n[         R                  S
SS9nU" U5      n[         R                  U[         R                  S
5      SS9(       d   e[         R                  [        R                  S-  SS9nU" U5      n[         R                  U[         R                  S5      SS9(       d   e[        XS-  -  X5      n[	        X4US5      n[         R                  SSS9n[         R                  SSS9nU" XF5      n[         R                  U[         R                  S5      5      (       d   eg )Nr   r   r   r   r=   r   Tr   r   r   gh㈵>rJ   r   r   g      @)
r=   r.   r   r   r   rM   iscloser   mathpi)r   r   r`   ra   r   r   r   s          rg   test_torch_derivative_lambdifyr     s   5$%AAa1fa D'"ALLDL1EuXF==c!23333c!fq!f%D'"ALLDL1EuXF==c!2=>>>LL1DL9EuXF==d!3$=???aq&j!'D!w'ALLDL1ELLDL1Eu_F==c!23333rq   c                     [         (       d  [        S5        [        S5      n [        U 5      S:X  d   e[	        S5      n[        U5      n [        U 5      S:X  d   e[        SS5      n [        U 5      S:X  d   e[	        S5      u  p![        X!5      n [        U 5      S	:X  d   e[        SS5      n [        U 5      S
:X  d   e[        X!5      n [        U 5      S:X  d   eg )Nr   r?   ztorch.eye(3)nztorch.eye(n, n)r   ztorch.zeros((2, 3))zm nztorch.zeros((m, n))ztorch.ones((2, 3))ztorch.ones((m, n)))r=   r.   r5   r   r   r6   r7   )r`   r   ms      rg   test_torch_special_matricesr     s    5$%A;Dd~---AA;Dd0000aDd44445>DAaDd4444Q?Dd3333Q?Dd3333rq   c                     [         (       d  [        S5        [        S5      n [        / U S5      nU" 5       n[         R	                  S5      n[         R                  X#5      (       d   e[        SS5      n [        / U S5      nU" 5       n[         R                  S5      n[         R                  X#5      (       d   e[        SS5      n [        / U S5      nU" 5       n[         R                  S5      n[         R                  X#5      (       d   eg )Nr   r?   r=   r   )r   r?   )
r=   r.   r5   r   r   r\   r6   zerosr7   ones)r`   ra   r   r   s       rg   $test_torch_special_matrices_lambdifyr     s    5$%A;DT7#ASFyy|H>>&++++aDT7#ASF{{6"H>>&++++Q?DT7#ASFzz&!H>>&++++rq   c                     [         (       d  [        S5        [        [        5      n [	        U 5      S:X  d   e[        [        [        5      [        [        [        5      -  -   5      n [	        U 5      S:X  d   e[        n [	        U 5      S:X  d   eS[        -  [        -   n [	        U 5      S:X  d   e[        [        [        -  5      n [	        U 5      S:X  d   eg )Nr   ztorch.conj(x)z6torch.sin(torch.conj(x)) - 1j*torch.cos(torch.conj(y))1jr   zx + 2*1jztorch.exp(1j*x))
r=   r.   r8   r   r   r   r9   r   r   r   r   s    rg   test_torch_complex_operationsr     s    5$%Q<Dd... SVa#a&j()DdWWWWDdt###q519Ddz)))q1u:Dd0000rq   c                     [         (       d  [        S5        [        [        5      n [	        U 5      S:X  d   e[        [        S5      n [	        U 5      S:X  d   e[        [        5      n [	        U 5      S:X  d   e[        S[        5      n [	        U 5      S:X  d   e[        [        [        5      5      n [	        U 5      S:X  d   eg )Nr   ztorch.heaviside(x, 1/2)r   ztorch.heaviside(x, 0)ztorch.special.gamma(x)ztorch.special.digamma(x)z!torch.special.gamma(torch.sin(x)))r=   r.   r:   r   r   r;   r<   r   r   s    rg   test_torch_special_functionsr     s    5$%Q<Dd8888Q?Dd66668Dd7777Q?Dd9999Q=DdBBBBrq   )hrn   r   sympyr   r   sympy.printing.pytorchr   r   r   r   sympy.tensor.arrayr	   0sympy.tensor.array.expressions.array_expressionsr
   r   r   r   r   sympy.utilities.lambdifyr   sympy.core.relationalr   r   r   r   r   r   sympy.functionsr   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   sympy.testing.pytestr.   sympy.externalr/   sympy.matrices.expressionsr0   r1   r2   r3   sympy.matricesr4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r@   rA   rB   r   r   r   r   rangelistllorM   rO   m3x3	m3x3sympyrh   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )rb   s   0rg   <module>r     s     % - - - (7 7 . 8 8% % % % % % % & (1 1 % : :  - - 	gaaaaY
1a*/1a.
9.Q4aQ .
9C<<5==<1DsID2 0M  4Q ^JB2,:,,^= @I+,D*4B4@42,.1*Cy :s   F