
    Xh|)                         d dl mZmZ d dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZ d d	lZ e
d
          Z G d dee          ZddZd	S )    )AbstractPythonCodePrinterArrayPrinter)
MatrixExpr)Mul)
PRECEDENCE)import_module)Sqrt)S)IntegerNtorchc                       e Zd ZdZi ej        dej        dej        dej        dej	        dej
        dedej        d	ej        d
ej        dej        dej        dej        dej        dej        dej        dej        di ej        dej        dej        dej        dej        dej        dej        dej        dej        dej        dej         dej!        dej"        dej#        d ej$        d!ej%        d"ej&        d#ej'        d$ej(        d%ej)        d&ej*        d'ej+        d(ej,        d)ej-        d*iZ. e/e0j1        d+d,d-.          Z1dJ fd/	Z2 fd0Z3e3Z4e3Z5e3Z6e3Z7e3Z8e3Z9e3Z:e3Z;e3Z<e3Z=d1 Z>d2 Z?d3 Z@d4 ZAd5 ZBd6 ZCd7 ZDd8 ZEd9 ZFd: ZGd; ZHd< ZId= ZJd> ZKd? ZLd@ ZMdA ZNdB ZOdC ZPdDZQdEZRdFZSdGZTdHZUdIZV xZWS )KTorchPrinter
_torchcodez	torch.absz
torch.signz
torch.ceilztorch.floorz	torch.logz	torch.exp
torch.sqrtz	torch.cosz
torch.acosz	torch.sinz
torch.asinz	torch.tanz
torch.atanztorch.atan2z
torch.coshztorch.acoshz
torch.sinhztorch.asinhz
torch.tanhztorch.atanh	torch.powz
torch.realz
torch.imagztorch.anglez	torch.erfztorch.lgammaztorch.eqztorch.neztorch.gtztorch.ltztorch.leztorch.geztorch.logical_andztorch.logical_orztorch.logical_notz	torch.maxz	torch.minz	torch.addz	torch.mulztorch.tracez	torch.detNFtorch.float64)torch_versionrequires_graddtypec                     t                                          |           | j        d         }| j        d         | _        | j        d         | _        |t
          rt
          j        }|| _        d S )Nr   r   r   )super__init__	_settingsr   r   r   __version__r   )selfsettingsversion	__class__s      h/var/www/tools.fuzzalab.pt/emblema-extractor/venv/lib/python3.11/site-packages/sympy/printing/pytorch.pyr   zTorchPrinter.__init__S   sc    """.1!^O<^G,
?u?'G$    c                 V     j                             t          |          d           }|!t                                          |          S  fd|j        D             }t          |          dk    r!                     |          d|d         dS                      ||          S )Nc                 :    g | ]}                     |          S  _print).0argr   s     r   
<listcomp>z0TorchPrinter._print_Function.<locals>.<listcomp>b   s%    :::DKK$$:::r       (r   ))	mappinggettyper   _print_Basicargslen_module_format_expand_fold_binary_op)r   expropchildrenr   s   `   r   _print_FunctionzTorchPrinter._print_Function]   s    \d4jj$//:77''---::::	:::x==A##B'''' 
 ..r8<<<r    c                     d                     |                     d          |                     |j        d                             S )N{}({})ztorch.linalg.invr   )formatr2   r%   r0   r   r4   s     r   _print_InversezTorchPrinter._print_Inversew   s>    t223EFF#{{49Q<88: : 	:r    c                    |j         j        rT|j         j        d         |j         j        d         k    r.d                    d|                     |j                             S d                    |                     |j                   d                    d t          t          |j         j                            D                       d d d                   S )	Nr   r)   z
{}({}).t()ztorch.transposez{}.permute({}), c                 ,    g | ]}t          |          S r#   strr&   is     r   r(   z1TorchPrinter._print_Transpose.<locals>.<listcomp>   s    FFFa3q66FFFr    )r'   	is_Matrixshaper:   r%   joinranger1   r;   s     r   _print_TransposezTorchPrinter._print_Transpose{   s    8 		$(."3tx~a7H"H"H&&'8$++dh:O:OPPP $**DH%%		FF5TX^1D1D+E+EFFFGG"M  r    c                     |                      |j                  dd                    d |j        j        D                       dS )Nz	.permute(r>   c              3   4   K   | ]}t          |          V  d S Nr@   rB   s     r   	<genexpr>z2TorchPrinter._print_PermuteDims.<locals>.<genexpr>   s(      BBc!ffBBBBBBr    r+   )r%   r4   rG   permutation
array_formr;   s     r   _print_PermuteDimszTorchPrinter._print_PermuteDims   sM    KK	""""IIBBd&6&ABBBBBBB
 	
r    c                    |j         }|j        }t          |          dk    sNt          |          dk    r t          |d         t                    s|                    |d                   dk    r|                     |          }i }|D ]U}t          |t                    r"|\  }}|                    |d          |z   ||<   9|                    |d          dz   ||<   V|                                D ]@\  }}t          |          D ]+}	d
                    ||                     |                    },A|S t          |          dk    r|d         }
t          |
t                    rt          |
          dk    r{|
\  }}t          |t                    st          d          |                     |          }t          |          D ]+}	d
                    ||                     |                    },|S d
                    |                     |          |                     |
                    S |                     |          S )Nr)   r   z1torch.autograd.grad({}, {}, create_graph=True)[0]   z!Only integer orders are supportedztorch.autograd.grad({}, {})[0])	variablesr4   r1   
isinstancetuplecountr%   r-   itemsrH   r:   r   NotImplementedError)r   r4   rS   expr_argresult
var_groupsvarbase_varorder_variables              r   _print_DerivativezTorchPrinter._print_Derivative   sT   N	9 y>>A	NNa
9Q<(G(GIOO\efg\hLiLilmLmLm[[**FJ ! A Ac5)) A&)OHe+5>>(A+F+F+NJx((&0nnS!&<&<q&@JsOO )..00 r r
Uu r rAPWWX^`d`k`klo`p`pqqFFrM y>>Q |H(E** s8}}/A/A"*%!%11q9LMp9q9q3qX..u w wAPWWX^`d`k`klt`u`uvvFF3::4;;x;P;PRVR]R]^fRgRghhh{{8$$$r    c                    ddl m} |j        d         j        \  }}t          |j                  dk    rQd                    |                     d          |                     |          |                     |          d          S d                    |                     d          |                     |          |                     |          |                      ||j        dd                               S )Nr   )	Piecewiser)   z{}({}, {}, {})ztorch.where)sympyrc   r0   r1   r:   r2   r%   )r   r4   rc   econds        r   _print_PiecewisezTorchPrinter._print_Piecewise   s    ######)A,#4ty>>Q#**##M22D!!A	    &&..KKKKNNKK		49QRR=122	4 4 	4r    c                 X   |j         \  }}|j        t          j        k    r<d                    |                     d          |                     |                    S d                    |                     d          |                     |          |                     |                    S )Nr9   r   
{}({}, {})r   )r0   expr
   Halfr:   r2   r%   )r   r4   baserj   s       r   
_print_PowzTorchPrinter._print_Pow   s     I	c8qv??##L114;;t3D3DF F F"",,KKt{{3//1 1 	1r    c                    d |j         D             fd|j         D             }|rL|                     t          j        |          t          d                   d|                     d          S |                     d          S )Nc                 <    g | ]}t          |t                    |S r#   )rT   r   )r&   r'   s     r   r(   z.TorchPrinter._print_MatMul.<locals>.<listcomp>   s'    LLLC
3
0K0KLCLLLr    c                     g | ]}|v|	S r#   r#   )r&   r'   mat_argss     r   r(   z.TorchPrinter._print_MatMul.<locals>.<listcomp>   s#    @@@Cx,?,?,?,?,?r    r   *ztorch.matmul)r0   parenthesizer   fromiterr   r3   )r   r4   r0   rq   s      @r   _print_MatMulzTorchPrinter._print_MatMul   s    LL49LLL@@@@ty@@@ 	I!!#,t"4"4j6GHHHH++NHEEE 
 ..~xHHHr    c                 J    |                      d|j        g|j        z            S )Nztorch.mm)r3   rl   rj   r;   s     r   _print_MatPowzTorchPrinter._print_MatPow   s#    **:	{487KLLLr    c                     dd                      fd|                                D                       z   dz   }t          |          g}|                    d j                     j        r|                    d           d                                         d          d                     |                    S )	N[r>   c                 ^    g | ])}d d                     fd|D                       z   dz   *S )ry   r>   c                 :    g | ]}                     |          S r#   r$   )r&   jr   s     r   r(   z=TorchPrinter._print_MatrixBase.<locals>.<listcomp>.<listcomp>   s#    0K0K0KAQ0K0K0Kr    ])rG   )r&   rC   r   s     r   r(   z2TorchPrinter._print_MatrixBase.<locals>.<listcomp>   sE    jjjWXdii0K0K0K0K0K0K0K&L&L Ls Rjjjr    r}   zdtype=zrequires_grad=Truer9   ztorch.tensor)rG   tolistrA   appendr   r   r:   r2   )r   r4   dataparamss   `   r   _print_MatrixBasezTorchPrinter._print_MatrixBase   s    TYYjjjj\`\g\g\i\ijjjkkknqqd))+tz++,,, 	0MM./////IIf
 
 	
r    c                 J    d|                      |j        d                    dS )Nztorch.isnan(r   r+   r%   r0   r;   s     r   _print_isnanzTorchPrinter._print_isnan   %    :dkk$)A,77::::r    c                 J    d|                      |j        d                    dS )Nztorch.isinf(r   r+   r   r;   s     r   _print_isinfzTorchPrinter._print_isinf   r   r    c                    t          d |j        D                       rGd                    |                     d          |                     |j        d                             S d                    |                     d          |                     |j        d                   |                     |j        d                             S )Nc              3   $   K   | ]}|j         V  d S rL   )
is_Integer)r&   dims     r   rM   z/TorchPrinter._print_Identity.<locals>.<genexpr>   s$      44#s~444444r    r9   z	torch.eyer   ri   r)   )allrF   r:   r2   r%   r;   s     r   _print_IdentityzTorchPrinter._print_Identity   s    4444444 	??##K00DJqM**    &&##K00DJqM**DJqM**  r    c                     d                     |                     d          |                     |j                            S )Nr9   ztorch.zerosr:   r2   r%   rF   r;   s     r   _print_ZeroMatrixzTorchPrinter._print_ZeroMatrix   s:    ..KK
##
 
 	
r    c                     d                     |                     d          |                     |j                            S )Nr9   z
torch.onesr   r;   s     r   _print_OneMatrixzTorchPrinter._print_OneMatrix  s:    --KK
##
 
 	
r    c                 t    |                      d           d|                     |j        d                    dS )Nz
torch.conjr*   r   r+   r2   r%   r0   r;   s     r   _print_conjugatezTorchPrinter._print_conjugate  s9    %%l33RRdkk$)A,6O6ORRRRr    c                     dS )N1jr#   r;   s     r   _print_ImaginaryUnitz!TorchPrinter._print_ImaginaryUnit  s    tr    c                    |                      |j        d                   dg}t          |j                  dk    r#|                      |j        d                   |d<   |                     d           d|d          d|d          dS )Nr   z0.5r)   ztorch.heavisider*   r>   r+   )r%   r0   r1   r2   )r   r4   r0   s      r   _print_HeavisidezTorchPrinter._print_Heaviside  s    DIaL))51ty>>Akk$)A,//DG%%&788PP47PPd1gPPPPr    c                 t    |                      d           d|                     |j        d                    dS )Nztorch.special.gammar*   r   r+   r   r;   s     r   _print_gammazTorchPrinter._print_gamma  s;    %%&;<<[[t{{49UV<?X?X[[[[r    c                     |j         d         t          j        k    r9|                     d           d|                     |j         d                    dS t          d          )Nr   ztorch.special.digammar*   r)   r+   z3PyTorch only supports digamma (0th order polygamma))r0   r
   Zeror2   r%   rX   r;   s     r   _print_polygammazTorchPrinter._print_polygamma  s`    9Q<16!!))*ABBaaT[[QUQZ[\Q]E^E^aaaa%&[\\\r    r   einsumaddtoneszerosrL   )X__name__
__module____qualname__printmethodrd   Abssignceilingfloorlogrj   r	   cosacossinasintanatanatan2coshacoshsinhasinhtanhatanhPowreimr'   erfloggammaEqNeStrictGreaterThanStrictLessThanLessThanGreaterThanAndOrNotMaxMinMatAddHadamardProductTraceDeterminantr,   dictr   _default_settingsr   r7   _print_Expr_print_Application_print_MatrixExpr_print_Relational
_print_Not
_print_And	_print_Or_print_HadamardProduct_print_Trace_print_Determinantr<   rI   rP   ra   rg   rm   ru   rw   r   r   r   r   r   r   r   r   r   r   r   _module_einsum_add
_transpose_ones_zeros__classcell__)r   s   @r   r   r      sE       K6	;6
L6
 	|6 	]6 		;6 		;6 	l6 		;6 	
L6 		;6 	
L6 		;6 	
L6  	]!6$ 	
L%6& 	]'6( 	
L)6 6* 	]+6, 	
L-6. 	]/60 		;164 	,566 	,768 		=96> 		;?6@ 	A6D 	*E6F 	*G6H 	I6J 	jK6L 	
M6N 	:O6R 		&S6T 	$U6 6V 		&	;	; 	k{] 	;k6 6Gp !3	  % % % % % %= = = = = "K('' J JI,"L(: : :
 
 

 
 
%% %% %%N4 4 4 	1 	1 	1I I IM M M

 

 

; ; ;; ; ;  
 
 

 
 
S S S  Q Q Q\ \ \] ] ] GGDJEFFFFFr    r   Fr   c                 D    t          ||d          } |j        | fi |S )N)r   r   )r   )r   doprint)r4   r   r   r   printers        r   
torch_coder   '  s4    me$T$TUUUG7?4,,8,,,r    )Fr   )sympy.printing.pycoder   r   sympy.matrices.expressionsr   sympy.core.mulr   sympy.printing.precedencer   sympy.externalr   sympy.codegen.cfunctionsr	   rd   r
   r   r   r   r   r#   r    r   <module>r      s   I I I I I I I I 1 1 1 1 1 1       0 0 0 0 0 0 ( ( ( ( ( ( ) ) ) ) ) )             gU U U U U<!: U U Un- - - - - -r    