a
    rh|)                     @   s   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 deeZdddZd	S )    )AbstractPythonCodePrinterArrayPrinter)
MatrixExpr)Mul)
PRECEDENCE)import_module)Sqrt)S)IntegerNtorchc                R       s  e Zd ZdZ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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/e0j1d+d,d-d.Z1d_ fd/d0	Z2 fd1d2Z3e3Z4e3Z5e3Z6e3Z7e3Z8e3Z9e3Z:e3Z;e3Z<e3Z=d3d4 Z>d5d6 Z?d7d8 Z@d9d: ZAd;d< ZBd=d> ZCd?d@ ZDdAdB ZEdCdD ZFdEdF ZGdGdH ZHdIdJ ZIdKdL ZJdMdN ZKdOdP ZLdQdR ZMdSdT ZNdUdV ZOdWdX ZPdYZQdZZRd[ZSd\ZTd]ZUd^ZV  ZWS )`TorchPrinterZ
_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                    sJ   t  | | jd }| jd | _| jd | _|d u r@tr@tj}|| _d S )Nr   r   r   )super__init__Z	_settingsr   r   r   __version__r   )selfsettingsversion	__class__ R/var/www/html/assistant/venv/lib/python3.9/site-packages/sympy/printing/pytorch.pyr   S   s    
zTorchPrinter.__init__c                    sl    j t|d }|d u r&t |S  fdd|jD }t|dkr\d ||d f S  ||S d S )Nc                    s   g | ]}  |qS r   _print.0argr   r   r   
<listcomp>b       z0TorchPrinter._print_Function.<locals>.<listcomp>   z%s(%s)r   )	mappinggettyper   Z_print_Basicargslen_module_format_expand_fold_binary_op)r   expropchildrenr   r"   r   _print_Function]   s    zTorchPrinter._print_Functionc                 C   s   d | d| |jd S )N{}({})ztorch.linalg.invr   )formatr+   r   r)   r   r-   r   r   r   _print_Inversew   s    zTorchPrinter._print_Inversec              	   C   sr   |j jr4|j jd |j jd kr4dd| |j S d| |j ddd tt|j jD d d d	 S d S )
Nr   r%   z
{}({}).t()ztorch.transposez{}.permute({}), c                 S   s   g | ]}t |qS r   strr    ir   r   r   r#      r$   z1TorchPrinter._print_Transpose.<locals>.<listcomp>)r!   Z	is_Matrixshaper2   r   joinranger*   r3   r   r   r   _print_Transpose{   s     
(zTorchPrinter._print_Transposec                 C   s(   d|  |jddd |jjD f S )Nz%s.permute(%s)r5   c                 s   s   | ]}t |V  qd S Nr6   r8   r   r   r   	<genexpr>   r$   z2TorchPrinter._print_PermuteDims.<locals>.<genexpr>)r   r-   r<   ZpermutationZ
array_formr3   r   r   r   _print_PermuteDims   s    
zTorchPrinter._print_PermuteDimsc                 C   sl  |j }|j}t|dksDt|dkrt|d ts||d dkr| |}i }|D ]@}t|tr|\}}||d| ||< qV||dd ||< qV| D ](\}}t	|D ]}	d
|| |}qq|S t|dkrb|d }
t|
trJt|
dkrJ|
\}}t|tstd| |}t	|D ]}	d
|| |}q,|S d
| || |
S | |S )Nr%   r   z1torch.autograd.grad({}, {}, create_graph=True)[0]   z!Only integer orders are supportedztorch.autograd.grad({}, {})[0])	variablesr-   r*   
isinstancetuplecountr   r'   itemsr=   r2   r
   NotImplementedError)r   r-   rC   Zexpr_argresultZ
var_groupsvarZbase_varorder_variabler   r   r   _print_Derivative   s>    



zTorchPrinter._print_Derivativec                 C   s   ddl m} |jd j\}}t|jdkrLd| d| || |dS d| d| || || ||jdd   S )Nr   )	Piecewiser%   z{}({}, {}, {})ztorch.where)sympyrO   r)   r*   r2   r+   r   )r   r-   rO   eZcondr   r   r   _print_Piecewise   s    zTorchPrinter._print_Piecewisec                 C   sN   |j \}}|jtjkr.d| d| |S d| d| || |S )Nr1   r   
{}({}, {})r   )r)   expr	   ZHalfr2   r+   r   )r   r-   baserT   r   r   r   
_print_Pow   s    
zTorchPrinter._print_Powc                    s^   dd |j D   fdd|j D }|rNd| t|td | d f S | d S d S )Nc                 S   s   g | ]}t |tr|qS r   )rD   r   r   r   r   r   r#      r$   z.TorchPrinter._print_MatMul.<locals>.<listcomp>c                    s   g | ]}| vr|qS r   r   r   Zmat_argsr   r   r#      r$   z%s*%sr   ztorch.matmul)r)   Zparenthesizer   Zfromiterr   r,   r   r-   r)   r   rW   r   _print_MatMul   s    
zTorchPrinter._print_MatMulc                 C   s   |  d|jg|j S )Nztorch.mm)r,   rU   rT   r3   r   r   r   _print_MatPow   s    zTorchPrinter._print_MatPowc                    sh   dd  fdd| D  d }t|g}|d j   jrP|d d d	d |S )
N[r5   c                    s,   g | ]$}d d  fdd|D  d qS )r[   r5   c                    s   g | ]}  |qS r   r   )r    jr"   r   r   r#      r$   z=TorchPrinter._print_MatrixBase.<locals>.<listcomp>.<listcomp>])r<   r8   r"   r   r   r#      r$   z2TorchPrinter._print_MatrixBase.<locals>.<listcomp>r]   zdtype=zrequires_grad=Truer1   ztorch.tensor)r<   tolistr7   appendr   r   r2   r+   )r   r-   dataparamsr   r"   r   _print_MatrixBase   s    $

zTorchPrinter._print_MatrixBasec                 C   s   d|  |jd  dS )Nztorch.isnan(r   )r   r)   r3   r   r   r   _print_isnan   s    zTorchPrinter._print_isnanc                 C   s   d|  |jd  dS )Nztorch.isinf(r   rc   rd   r3   r   r   r   _print_isinf   s    zTorchPrinter._print_isinfc                 C   sb   t dd |jD r2d| d| |jd S d| d| |jd | |jd S d S )Nc                 s   s   | ]}|j V  qd S r?   )Z
is_Integer)r    dimr   r   r   r@      r$   z/TorchPrinter._print_Identity.<locals>.<genexpr>r1   z	torch.eyer   rS   r%   )allr;   r2   r+   r   r3   r   r   r   _print_Identity   s    zTorchPrinter._print_Identityc                 C   s   d | d| |jS )Nr1   ztorch.zerosr2   r+   r   r;   r3   r   r   r   _print_ZeroMatrix   s    
zTorchPrinter._print_ZeroMatrixc                 C   s   d | d| |jS )Nr1   z
torch.onesrj   r3   r   r   r   _print_OneMatrix  s    
zTorchPrinter._print_OneMatrixc                 C   s"   |  d d| |jd  dS )Nz
torch.conj(r   rc   r+   r   r)   r3   r   r   r   _print_conjugate  s    zTorchPrinter._print_conjugatec                 C   s   dS )NZ1jr   r3   r   r   r   _print_ImaginaryUnit  s    z!TorchPrinter._print_ImaginaryUnitc                 C   sZ   |  |jd dg}t|jdkr6|  |jd |d< | d d|d  d|d  dS )Nr   z0.5r%   ztorch.heavisiderm   r5   rc   )r   r)   r*   r+   rX   r   r   r   _print_Heaviside  s    zTorchPrinter._print_Heavisidec                 C   s"   |  d d| |jd  dS )Nztorch.special.gammarm   r   rc   rn   r3   r   r   r   _print_gamma  s    zTorchPrinter._print_gammac                 C   s>   |j d tjkr2| d d| |j d  dS tdd S )Nr   ztorch.special.digammarm   r%   rc   z3PyTorch only supports digamma (0th order polygamma))r)   r	   ZZeror+   r   rH   r3   r   r   r   _print_polygamma  s    "zTorchPrinter._print_polygammar   ZeinsumaddtZonesZzeros)N)X__name__
__module____qualname__ZprintmethodrP   ZAbssignZceilingfloorlogrT   r   cosacossinasintanatanatan2coshacoshsinhasinhtanhatanhPowreZimr!   erfZloggammaEqZNeZStrictGreaterThanZStrictLessThanZLessThanZGreaterThanAndOrNotZMaxZMinZMatAddZHadamardProductTraceZDeterminantr&   dictr   Z_default_settingsr   r0   Z_print_ExprZ_print_ApplicationZ_print_MatrixExprZ_print_RelationalZ
_print_NotZ
_print_AndZ	_print_OrZ_print_HadamardProductZ_print_TraceZ_print_Determinantr4   r>   rA   rN   rR   rV   rY   rZ   rb   re   rf   ri   rk   rl   ro   rp   rq   rr   rs   _moduleZ_einsum_addZ
_transposeZ_onesZ_zeros__classcell__r   r   r   r   r      s   8
'r   Fr   c                 K   s"   t ||dd}|j| fi |S )N)r   r   )r   )r   Zdoprint)r-   r   r   r   printerr   r   r   
torch_code'  s    r   )Fr   )Zsympy.printing.pycoder   r   Zsympy.matrices.expressionsr   Zsympy.core.mulr   Zsympy.printing.precedencer   Zsympy.externalr   Zsympy.codegen.cfunctionsr   rP   r	   r
   r   r   r   r   r   r   r   <module>   s     