
    oVhA              
          d dl Z d dlZd dlmZmZ d dlmZ d dlmZmZm	Z	 d dl
mZ d dlmZmZmZmZmZ d dlmZ d dlmZmZmZmZmZmZ d d	lmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3 d d
l4m5Z5 d dl6m7Z7 d dl8m9Z9m:Z:m;Z;m<Z< d dl=m>Z> d dl=m?Z?m@Z@mAZA d dlmBZBmCZC d dlmDZDmEZEmFZF  e7d      ZG eddd      ZH eddd      ZI eddd      ZJ eddd      ZK ed      \  ZLZMZNZOeGM ePd dd      D  cg c]  }  eQ eP| | dz                c} ZReGj                  eReGj                        ZU e	eR      ZVd ZWd fdZXd fdZYd ZZd  Z[d! Z\d" Z]d# Z^d$ Z_d% Z`d& Zad' Zbd( Zcd) Zdd* Zed+ Zfd, Zgyc c} w )-    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                    t        | |d      }| D cg c](  }t        |j                  d   |j                  d         * }}|D cg c]5  }t        j	                  |j                         t        j                        7 }} || }|j                  t        t        | |                  j                         }t        |t              r|j                         }t        |d      rh|j                  r\t        |t        j                        rB|j!                         dk(  r/|j#                         }t%        |      }t'        ||z
        dk  sJ y |j(                  st        |t*              rNt        j	                  |j                         t        j                        }t        j-                  ||d      sJ y t/        dt1        |       d	t1        |             c c}w c c}w )
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           O/home/dcms/DCMS/lib/python3.12/site-packages/sympy/printing/tests/test_torch.py_compare_torch_matrixrh   +   sm   D'*ACLMaz!''!*aggaj9MOMO^_!QXXZu}}E__	A		$s9o678==?A!*+FFHq+1;;a&1557a<AaAq1u:$$${{jI.LL5==L9~~a~.../$q'&a	BCC' N_s   -G:Gc                  .    t        j                  dd      S N   randomuniform     rg   <lambda>rr   D   s    v~~b!7L rq   c                    t        | |d      }| D cg c]	  } |        }}|D cg c]'  }t        j                  |t        j                        ) }} || }t	        |t        j
                        r|j                         }|j                  t        t        | |                  j                         }	t        ||	z
        dk  sJ y c c}w c c}w )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    D'*A#
$Q35
$C
$;>?aU\\!5==\1?E?	5	A!U\\"FFH		$s9c*+,113Aq1u: %?s
   C	,Cc                  .    t        j                  dd      S )Nr   
   )rn   randintrp   rq   rg   rr   rr   O   s    6>>!R;P rq   c           
      h   t        | |d      }| D cg c]	  } |        }}|D cg c]'  }t        j                  |t        j                        ) }} || }t	        |j                  t        t        | |                  j                               }	|j                         |	k(  sJ y c c}w c c}w )Nr=   rD   )
r   r=   rM   rO   boolrP   rQ   rR   rS   rX   rt   s
             rg   _compare_torch_relationalr   O   s    D'*A#
$Q35
$C
$;>?aU\\!5==\1?E?	5	ATYYtC	3/016689A668q==	 %?s
   B*,B/c                  	   t         st        d       t        t              } t	        |       dk(  sJ t        t        | d      }t         j                  g dgt         j                        } ||      }t         j                  |      }t         j                  ||k(        sJ t        t              } t	        |       dk(  sJ t        t        f| d        t        t              } t	        |       d	k(  sJ t        t        f| d
        t        t              } t	        |       dk(  sJ t        t        f| d        t        t              } t	        |       dk(  sJ t        t        f| d        t        t              } t	        |       dk(  sJ t        t        f| d        t        dz  } t	        |       dk(  sJ t        t        f| d        t!        t              } t	        |       dk(  sJ t        t        f| d        t#        t              } t	        |       dk(  sJ t        t        f| d        t%        t              } t	        |       dk(  sJ t        t        f| d        t'        t              } t	        |       dk(  sJ t        t        f| d        t)        t              } t	        |       dk(  sJ t        t        f| d        t+        t              } t	        |       dk(  sJ t        t        f| d        t-        t.        t              } t	        |       d k(  sJ t        t.        t        f| d!        t1        t              } t	        |       d"k(  sJ t        t        f| d#        t3        t              } t	        |       d$k(  sJ t        t        f| d%        t5        t              } t	        |       d&k(  sJ t        t        f| d'        t7        t              } t	        |       d(k(  sJ t        t        f| d)        t9        t              } t	        |       d*k(  sJ t        t        f| d+        t;        t              } t	        |       d,k(  sJ t        t        f| d-        t=        t              } t	        |       d.k(  sJ t        t        f| d/        t?        t              } t	        |       d0k(  sJ t        t        f| d1        y )2NPyTorch not installedztorch.abs(x)r=   )   rD   ztorch.sign(x)c                  .    t        j                  dd      S )Nir{   rm   rp   rq   rg   rr   z!test_torch_math.<locals>.<lambda>f   s    &..b2I rq   )ru   ztorch.ceil(x)c                  *    t        j                          S Nrn   rp   rq   rg   rr   z!test_torch_math.<locals>.<lambda>j       &--/ rq   ztorch.floor(x)c                  *    t        j                          S r   r   rp   rq   rg   rr   z!test_torch_math.<locals>.<lambda>n   r   rq   ztorch.exp(x)c                  .    t        j                  dd      S Nr   rm   rp   rq   rg   rr   z!test_torch_math.<locals>.<lambda>r       &..Q2G rq   ztorch.sqrt(x)c                  *    t        j                          S r   r   rp   rq   rg   rr   z!test_torch_math.<locals>.<lambda>v   r   rq      ztorch.pow(x, 4)c                  *    t        j                          S r   r   rp   rq   rg   rr   z!test_torch_math.<locals>.<lambda>z   r   rq   ztorch.cos(x)c                  *    t        j                          S r   r   rp   rq   rg   rr   z!test_torch_math.<locals>.<lambda>~   r   rq   ztorch.acos(x)c                  .    t        j                  dd      S NgGzgGz?rm   rp   rq   rg   rr   z!test_torch_math.<locals>.<lambda>       &..2M rq   ztorch.sin(x)c                  *    t        j                          S r   r   rp   rq   rg   rr   z!test_torch_math.<locals>.<lambda>   r   rq   ztorch.asin(x)c                  .    t        j                  dd      S r   rm   rp   rq   rg   rr   z!test_torch_math.<locals>.<lambda>   r   rq   ztorch.tan(x)c                  .    t        j                  dd      S )Ng      g      ?rm   rp   rq   rg   rr   z!test_torch_math.<locals>.<lambda>       &..s2K rq   ztorch.atan(x)c                  .    t        j                  dd      S rj   rm   rp   rq   rg   rr   z!test_torch_math.<locals>.<lambda>   r   rq   ztorch.atan2(y, x)c                  .    t        j                  dd      S rj   rm   rp   rq   rg   rr   z!test_torch_math.<locals>.<lambda>   s    FNN2q4I rq   ztorch.cosh(x)c                  .    t        j                  dd      S r   rm   rp   rq   rg   rr   z!test_torch_math.<locals>.<lambda>   r   rq   ztorch.acosh(x)c                  .    t        j                  dd      S )Ng?rl   rm   rp   rq   rg   rr   z!test_torch_math.<locals>.<lambda>       &..a2H rq   ztorch.sinh(x)c                  .    t        j                  dd      S r   rm   rp   rq   rg   rr   z!test_torch_math.<locals>.<lambda>   r   rq   ztorch.asinh(x)c                  .    t        j                  dd      S rj   rm   rp   rq   rg   rr   z!test_torch_math.<locals>.<lambda>   r   rq   ztorch.tanh(x)c                  .    t        j                  dd      S r   rm   rp   rq   rg   rr   z!test_torch_math.<locals>.<lambda>   r   rq   ztorch.atanh(x)c                  .    t        j                  dd      S )Ngg?rm   rp   rq   rg   rr   z!test_torch_math.<locals>.<lambda>   r   rq   ztorch.erf(x)c                  .    t        j                  dd      S r   rm   rp   rq   rg   rr   z!test_torch_math.<locals>.<lambda>   r   rq   ztorch.lgamma(x)c                  .    t        j                  dd      S )Ng      ?rl   rm   rp   rq   rg   rr   z!test_torch_math.<locals>.<lambda>   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   $%q6Dd~---D'"A	'u}}	=BbEE		"A99UaZ   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                      t        t        t                    dk(  sJ t        t        t                    dk(  sJ t        t	        t                    dk(  sJ y )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                     t         st        d       t        t        t              } t        |       dk(  sJ t        t        t        f|        t        t        t              } t        |       dk(  sJ t        t        t        f|        t        t        t              } t        |       dk(  sJ t        t        t        f|        t        t        t              } t        |       dk(  sJ t        t        t        f|        t        t        t              } t        |       dk(  sJ t        t        t        f|        t        t        t              } t        |       dk(  sJ t        t        t        f|        y )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   $%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                     t         t        d       t        } t        |       dk(  sJ t	        t        f| d      }t        d      }t         j                  |j                         t         j                        }t         j                   ||      |      sJ t        t        z  } t        |       dk(  sJ t        t        t        f|        t        dz  } t        |       dk(  sJ t        t        f|        t        t        z  t        z  t        z  } t        |       dk(  sJ t        t        t        t        t        f|        t        t              } t        |       d	k(  sJ t        t        f|        t        t              } t        |       d
k(  sJ t        t        f|        t!        t        t              } t        |       dk(  sJ t        t        t        f|        t#        t              } t        |       dk(  sJ t        d      }t         j                  |j                         t         j                        }t	        t        f| d      } ||      }t         j$                  j'                  |      }t         j                  ||      sJ y )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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                  B   t         st        d       t        ddd      } t        ddd      }t        ddd      }t        ddd      }t         j                  ddgd	d
ggt         j                        }t         j                  ddgdd	ggt         j                        }t         j                  ddgddggt         j                        }t         j                  ddgd
dggt         j                        }t        | |      }t        |      dk(  sJ t        | |f|d      }	 |	||      }
t         j                  d||      }t         j                  |
|      sJ t        | |      }t        |      dk(  sJ t        | |f|d      }	 |	||      }
||z   }t         j                  |
|      sJ t        | ||      }t        |      dk(  sJ t        | ||f|d      }	 |	|||      }
||z   |z   }t         j                  |
|      sJ t        | |||      }t        |      dk(  sJ t        | |||f|d      }	 |	||||      }
||z   |z   |z   }t         j                  |
|      sJ t        | ddg      }t        |      dk(  sJ t        | f|d      }	 |	|      }
|j                  }t         j                  |
|      sJ t        t        | |      g d      }t        |      dk(  sJ t        | |f|d      }	 |	||      }
t         j                  d||      j                  dddd      }t         j                  |
|      sJ t        t        | |      d      }t        |      dk(  sJ t        | |f|d      }	 |	||      }
t         j                  d||      }t         j                  |
|      sJ y ) 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     s   $%S!QAS!QAS!QAS!QA	Bx"b*%--	@B	Cy3),EMM	BB	Bx"b*%--	@B	Cy2r(+5==	AB	Aq	!Bb>::::!QW%A	"b	AWb"%A>>!Q	!QBb>....!QW%A	"b	A
RA>>!Q	!Q	Bb><<<<!QB(A	"b"A
R"A>>!Q	!Q1	Bb>JJJJ!Q1r7+A	"b"bA
R"rA>>!Q	QA	Bb>....!r7#A	"A
A>>!Q	'1-|	<Bb>NNNN!QW%A	"b	AWb"%--aAq9A>>!Q	)!Q/	8Bb>????!QW%A	"b	A\2r*A>>!Qrq   c                  ^    t        t        t              t              } t        |       dk(  sJ y)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                  4   t         st        d       t        t        t	        t
              gt        t              t         gg      } dt        |       v sJ dt        | d      v sJ t        | d      }d|v sJ d|v sJ t        | dd	      }d|v sJ d|v sJ y )
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    $% As1v;Q!-.D Jt$4444 !Jt?$KKKK D1F6))) F*** DHF6))) F***rq   c                  j   t         st        d       t        t              t	        t
              z   } t        t        t
        g| d      }t         j                  dd      }t         j                  dd      } |||      }|j                  sJ |j                          t        |j                  j                         t        t	        d      j                               z
        dk  sJ t        |j                  j                         t        t        d      j                                z
        dk  sJ y )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    $%q6CF?D!Qw'A LLDL1ELLDL1Eue_F
OO uzz 5S)9#::;dBBB uzz 5#c(..*:):#;;<tCCCrq   c                     t         st        d       t        d      \  } }}t        t	        |       |       }t        |      dk(  sJ t        t	        |       | df      }t        |      dk(  sJ t        t	        | |z        | |      }t        |      }d}|j                  dd      }|j                  dd      }||k(  sJ t        t	        |       | |       }t        |      }d}||k(  sJ t        t	        | |z  |z        | |df|      }t        |      }d	}|j                  dd      }|j                  dd      }||k(  sJ y )
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   |  sd   $%gGAq!c!fa DdHHHHc!fq!f%D{| | | c!a%j!Q'DF{HsB/"**33 3333c!fa#DFyHXc!a%!)na!Q3DF ZHsB/"**33 3333rq   c                     t         st        d       t        d      } t        d      }t        | dz  |       }t	        | |d      }t         j                  dd      } ||      }t         j                  |t         j                  d	            sJ t        t        |       | df      }t	        | |d      }t         j                  d
d      } ||      }t         j                  |t         j                  d
      d      sJ t         j                  t        j                  dz  d      } ||      }t         j                  |t         j                  d      d      sJ t        | |dz  z  | |      }t	        | |f|d      }t         j                  dd      }t         j                  dd      } |||      }t         j                  |t         j                  d            sJ y )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   $%AAa1fa DD'"ALLDL1EuXF==c!2333c!fq!f%DD'"ALLDL1EuXF==c!2=>>>LL1DL9EuXF==d!3$=???a!q&j!Q'D!Qw'ALLDL1ELLDL1Eue_F==c!2333rq   c                     t         st        d       t        d      } t        |       dk(  sJ t	        d      }t        |      } t        |       dk(  sJ t        dd      } t        |       dk(  sJ t	        d      \  }}t        ||      } t        |       d	k(  sJ t        dd      } t        |       d
k(  sJ t        ||      } t        |       dk(  sJ y )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    $%A;Dd~---AA;Dd0000aDd44445>DAqaDd4444Q?Dd3333Q?Dd3333rq   c                     t         st        d       t        d      } t        g | d      } |       }t         j	                  d      }t         j                  ||      sJ t        dd      } t        g | d      } |       }t         j                  d      }t         j                  ||      sJ t        dd      } t        g | d      } |       }t         j                  d      }t         j                  ||      sJ y )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    $%A;DT7#ASFyy|H>>&(+++aDT7#ASF{{6"H>>&(+++Q?DT7#ASFzz&!H>>&(+++rq   c                     t         st        d       t        t              } t	        |       dk(  sJ t        t        t              t        t        t              z  z         } t	        |       dk(  sJ t        } t	        |       dk(  sJ dt        z  t        z   } t	        |       dk(  sJ t        t        t        z        } t	        |       dk(  sJ y )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    $%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                  r   t         st        d       t        t              } t	        |       dk(  sJ t        t        d      } t	        |       dk(  sJ t        t              } t	        |       dk(  sJ t        dt              } t	        |       dk(  sJ t        t        t                    } t	        |       dk(  sJ y )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    $%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.
9Q4aQ 
9C<<5==<1DsID2 0M  4Q ^JB2,:,,^= @I+,D*4B4@42,.1*Cy :s   E?