o
    GZh|)                     @   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                       s\  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/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__ E/var/www/auris/lib/python3.10/site-packages/sympy/printing/pytorch.pyr   S   s   

zTorchPrinter.__init__c                    sh    j t|d }|d u rt |S  fdd|jD }t|dkr.d ||d f S  ||S )Nc                       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   sn   |j jr|j jd |j jd krdd| |j S d| |j ddd tt|j jD d d d	 S )
Nr   r&   z
{}({}).t()ztorch.transposez{}.permute({}), c                 S   s   g | ]}t |qS r   strr!   ir   r   r   r$      s    z1TorchPrinter._print_Transpose.<locals>.<listcomp>)r"   Z	is_Matrixshaper3   r   joinranger+   r4   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)r6   c                 s   s    | ]}t |V  qd S Nr7   r9   r   r   r   	<genexpr>   s    z2TorchPrinter._print_PermuteDims.<locals>.<genexpr>)r   r.   r=   ZpermutationZ
array_formr4   r   r   r   _print_PermuteDims   s   
zTorchPrinter._print_PermuteDimsc                 C   sb  |j }|j}t|dks"t|dkrgt|d tsg||d dkrg| |}i }|D ] }t|trA|\}}||d| ||< q+||dd ||< q+| D ]\}}t	|D ]}	d
|| |}qXqP|S t|dkr|d }
t|
trt|
dkr|
\}}t|tst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>   r3   r
   NotImplementedError)r   r.   rD   Zexpr_argresultZ
var_groupsvarZbase_varorder_variabler   r   r   _print_Derivative   s6   ,



zTorchPrinter._print_Derivativec                 C   s   ddl m} |jd j\}}t|jdkr&d| d| || |dS d| d| || || ||jdd   S )Nr   )	Piecewiser&   z{}({}, {}, {})ztorch.where)sympyrP   r*   r+   r3   r,   r   )r   r.   rP   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 )Nr2   r   
{}({}, {})r   )r*   expr	   ZHalfr3   r,   r   )r   r.   baserU   r   r   r   
_print_Pow   s   
zTorchPrinter._print_Powc                    sZ   dd |j D   fdd|j D }|r'd| t|td | d f S | d S )Nc                 S   s   g | ]	}t |tr|qS r   )rE   r   r    r   r   r   r$      s    z.TorchPrinter._print_MatMul.<locals>.<listcomp>c                    s   g | ]}| vr|qS r   r   r    Zmat_argsr   r   r$      s    z%s*%sr   ztorch.matmul)r*   Zparenthesizer   Zfromiterr   r-   r   r.   r*   r   rX   r   _print_MatMul   s   
zTorchPrinter._print_MatMulc                 C   s   |  d|jg|j S )Nztorch.mm)r-   rV   rU   r4   r   r   r   _print_MatPow   s   zTorchPrinter._print_MatPowc                    sh   dd  fdd| D  d }t|g}|d j   jr(|d d d	d |S )
N[r6   c                    s,   g | ]}d d  fdd|D  d qS )r\   r6   c                    r   r   r   )r!   jr#   r   r   r$      r%   z=TorchPrinter._print_MatrixBase.<locals>.<listcomp>.<listcomp>])r=   r9   r#   r   r   r$      s   , z2TorchPrinter._print_MatrixBase.<locals>.<listcomp>r^   zdtype=zrequires_grad=Truer2   ztorch.tensor)r=   tolistr8   appendr   r   r3   r,   )r   r.   dataparamsr   r#   r   _print_MatrixBase   s   $

zTorchPrinter._print_MatrixBasec                 C      d|  |jd  dS )Nztorch.isnan(r   )r   r*   r4   r   r   r   _print_isnan      zTorchPrinter._print_isnanc                 C   rd   )Nztorch.isinf(r   re   rf   r4   r   r   r   _print_isinf   rh   zTorchPrinter._print_isinfc                 C   s^   t dd |jD rd| d| |jd S d| d| |jd | |jd S )Nc                 s   s    | ]}|j V  qd S r@   )Z
is_Integer)r!   dimr   r   r   rA      s    z/TorchPrinter._print_Identity.<locals>.<genexpr>r2   z	torch.eyer   rT   r&   )allr<   r3   r,   r   r4   r   r   r   _print_Identity   s   zTorchPrinter._print_Identityc                 C      d | d| |jS )Nr2   ztorch.zerosr3   r,   r   r<   r4   r   r   r   _print_ZeroMatrix      
zTorchPrinter._print_ZeroMatrixc                 C   rm   )Nr2   z
torch.onesrn   r4   r   r   r   _print_OneMatrix  rp   zTorchPrinter._print_OneMatrixc                 C   "   |  d d| |jd  dS )Nz
torch.conj(r   re   r,   r   r*   r4   r   r   r   _print_conjugate     "zTorchPrinter._print_conjugatec                 C   s   dS )NZ1jr   r4   r   r   r   _print_ImaginaryUnit  s   z!TorchPrinter._print_ImaginaryUnitc                 C   sZ   |  |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.heavisiders   r6   re   )r   r*   r+   r,   rY   r   r   r   _print_Heaviside  s   $zTorchPrinter._print_Heavisidec                 C   rr   )Nztorch.special.gammars   r   re   rt   r4   r   r   r   _print_gamma  rv   zTorchPrinter._print_gammac                 C   s:   |j d tjkr| d d| |j d  dS td)Nr   ztorch.special.digammars   r&   re   z3PyTorch only supports digamma (0th order polygamma))r*   r	   ZZeror,   r   rI   r4   r   r   r   _print_polygamma  s   "zTorchPrinter._print_polygammar   ZeinsumaddtZonesZzerosr@   )X__name__
__module____qualname__ZprintmethodrQ   ZAbssignZceilingfloorlogrU   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   r1   Z_print_ExprZ_print_ApplicationZ_print_MatrixExprZ_print_RelationalZ
_print_NotZ
_print_AndZ	_print_OrZ_print_HadamardProductZ_print_TraceZ_print_Determinantr5   r?   rB   rO   rS   rW   rZ   r[   rc   rg   ri   rl   ro   rq   ru   rw   rx   ry   rz   _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   rQ   r	   r
   r   r   r   r   r   r   r   <module>   s     