o
    wZh:                     @   s  d Z ddlZddlZddlZddlmZ ddlmZm	Z	m
Z
mZ ddlmZmZ ejejddZdZeD ]Zed	e e
e q4ed
e
dddgdede
dddgdede
dddgdede
dddgdede
dddgdede
dddgddd Zeddejfd d!Zdejfd"d#Zdejfd$d%Zdejfd&d'Zed(dejfd)d*Zed+dejfd,d-Zed.dejfd/d0Zed1dejfd2d3Z ed4dejfd5d6Z!ed7dejfd8d9Z"ed:e
#d;d;d;d<d<dejfd=d>Z$ed?dejfd@dAZ%dejdBe&fdCdDZ'edEe
#d;dFd;d;d;d;	G	dcdejfdHdIZ(edJe
#d;dFd;d;d;d;	G	dcdejfdKdLZ)edMe
#d;dFd;d;d;dddejfdNdOZ*edPe
#d;dFd;d;d;d;	G	dcdejfdQdRZ+edSe
#d;dFd;d;d;dddejfdTdUZ,edVe
#d;dFd;d;d;d;	G	dcdejfdWdXZ-edY	GdddejfdZd[Z.ed\e
#d;d]dFd;d;d;d;	G	dcdejfd^d_Z/ed`dejfdadbZ0dS )ea  
Note [ONNX operators that are added/updated from opset 8 to opset 9]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
New operators:
    Compress
    ConstantOfShape
    EyeLike
    MaxUnpool
    OneHot
    Sinh
    Cosh
    Asinh
    Acosh
    Atanh
    Shrink
    IsNaN
    Sign
    Erf
    Scatter
    Where
    NonZero
    TfIdfVectorizer
    MeanVarianceNormalization

Updated operators:
    BatchNormalization: removed spatial attribute.
    Greater, Less, Constant, MatMul, PRelu, Gemm, Flatten: more data types{integers} supported.
    Cast: more data types{string} supported.
    Upsample: moved scales from attribute to input.
    Scan
    N)_onnx)_type_utilserrorssymbolic_helpersymbolic_opset9)	jit_utilsregistration   )Zopset)ZnonzerowhereZscatterZscatter_adderfsignisnangatherZarangeZmasked_fillZ
index_fillZ
index_copyZrepeat_interleaveanyallzaten::zaten::upsample_nearest1dZupsample_nearest1d   Znearest)Zdecoratezaten::upsample_nearest2dZupsample_nearest2d   zaten::upsample_nearest3dZupsample_nearest3d   zaten::upsample_linear1dZupsample_linear1dZlinearzaten::upsample_bilinear2dZupsample_bilinear2dzaten::upsample_trilinear3dZupsample_trilinear3dc                    s    fdd}|S )Nc                    s   t | |\}}t  t |}|rt d S t dt r-t dS |d u r? fddtdD }| jd |dS )	Nalign_corners == Trueisz%torch._C.Value (output_size) indexingc                    sD   g | ]}|d k r
dnt  |   t    |    qS )         ?)floattypesizes).0i)diminputoutput_size I/var/www/auris/lib/python3.10/site-packages/torch/onnx/symbolic_opset8.py
<listcomp>l   s    z5_interpolate.<locals>.symbolic_fn.<locals>.<listcomp>r   UpsampleZmode_sZscales_f)	r   Z_get_interpolate_attributesZ_interpolate_warning_maybe_get_scalar_unimplemented_maybe_get_const	_is_valuerangeop)gr   r   argsscalesalign_cornersr   interpolate_modename)r   r   r!   symbolic_fn^   s"   


z!_interpolate.<locals>.symbolic_fnr    )r1   r   r0   r2   r    r/   r!   _interpolateE   s   r3   zaten::__interpolater+   c           	      C   s   t |d}t |s|rt ddS t |s#t |r#t ddS t |s3t |r3t ddS t | |||||\}}| jd|||dS )NbZinterpolater   zdynamic scales in opset 8zdynamic size in opset 8r#   r$   )r   r'   Z_is_noner&   r(   Z _interpolate_get_scales_and_moder*   )	r+   r   sizeZscale_factormoder.   Zrecompute_scale_factorZ	antialiasr-   r    r    r!   __interpolatex   s   r7   c                    s   t jjt jjt jjh}d }t j|d t jj}|t jjkr8|}||vr4| }t fdd|D }n	d| S t	
d |f| S )Nr   c                 3   s$    | ]} j d |tjjdV  qdS )CastZto_iN)r*   _C_onnxZTensorProtoDataTypeFLOAT)r   argr+   r    r!   	<genexpr>   s
    
z-_try_cast_integer_to_float.<locals>.<genexpr>NzOnly floating datatype is supported for these operators: {Greater, Less, MatMul, PRelu, Gemm, Flatten}. This might cause the onnx model to be incorrect, if inputs have integer datatypes.)r   JitScalarTypeZHALFr;   DOUBLE
from_value	UNDEFINEDZscalar_nametuplewarningswarn)r+   r,   Zfloating_scalar_typesold_typeZ	arg0_typer    r=   r!   _try_cast_integer_to_float   s(   

rH   c                 C   s$   |d u r|S t td| | |dS )NZ_cast_F)getattropset9)r+   r   Zto_typer    r    r!   _cast_to_type   s   rK   c                 C   s6   t |}t ||}t| ||\}}}| |||S r?   )r   r%   Z_if_scalar_type_asrH   r*   )r+   r   otherZop_name_r    r    r!   _comparison_operator   s   
rN   zaten::gtc                 C      t | ||dS )NZGreaterrN   r+   r   rL   r    r    r!   gt      rR   zaten::ltc                 C   rO   )NZLessrP   rQ   r    r    r!   lt   rS   rT   z	aten::bmmc                 C   s@   t |rt| ||\}}}t| | d|||S | d||S )NZMatMul)r   _try_get_scalar_typerH   rK   r*   )r+   selfrL   rG   r    r    r!   bmm   s   
rW   zaten::matmulc                 C   s   t | ||S r?   )rW   )r+   rV   rL   r    r    r!   matmul   s   rX   zaten::preluc                 C   s   t |}t |}|d ur"|dkr"| jd|ttd|d d}n|dkr3|dgkr3t | |dg}t |rLt| ||\}}}t	| | d|||S | d||S )Nr   Z	Unsqueeze   )Zaxes_ir   ZPRelu)
r   Z_get_tensor_rankZ_get_tensor_sizesr*   listr)   Z_squeeze_helperrU   rH   rK   )r+   rV   weightZ	self_rankZweight_sizesrG   r    r    r!   prelu   s   

 
r\   zaten::mmc              
   C   s   t ||}|d u rtd|| jdtjdg| dd}t |r>t| |||\}}}}t	| | jd|||ddd	|S | jd|||ddd	S )
Nz/mm can only operate on tensors with known typesConstantr   )dtypeZvalue_tGemmg        r   Zbeta_fZalpha_f)
r   rU   r   ZSymbolicValueErrorr*   torchtensorr^   rH   rK   )r+   rV   rL   scalar_typeZzero_constantrG   r    r    r!   mm   s&   
re   zaten::addmmvtc                 C   sl   t |r%t| |||\}}}}t| | jd|||t |t |d|S | jd|||t |t |dS )Nr`   ra   )r   rU   rH   rK   r*   Z_scalar)r+   rV   Zmat1Zmat2betaalpharG   r    r    r!   addmm
  s,   
rj   zaten::flattenc                 C   s   t |dd}t |dd}|  }|dk r|| }|dkrF||d krFt |r>t| |\}}t| | jd||d|S | jd||dS |dkrt||d krtt |rjt| |\}}t| | jd||d d|S | jd||d dS t	| |||S )	Nr   	start_dimend_dimr   rY   ZFlatten)Zaxis_ir   )
r   
_get_constr   r   rU   rH   rK   r*   rJ   flatten)r+   r   rk   rl   Zstart_dim_iZ	end_dim_ir   rG   r    r    r!   rn   &  s(   

rn   r^   c                 C   sn   |d u r	t jj}nt |}| js+| jd|t jj d|d}| jd|| dS | jd|| d|dS )NZConstantFillrY   )Zdtype_iZinput_as_shape_iZvalue_fr8   r9   )r   r@   r;   r^   Zis_floating_pointr*   Z	onnx_type)r+   r   r^   const_valuerd   resultr    r    r!   _constant_fillC  s&   



rq   zaten::emptyr   Fc                 C      t | |||||S r?   )zeros)r+   r   r^   layoutdevice
pin_memorymemory_formatr    r    r!   empty[     rx   zaten::empty_likec                 C   rr   r?   )
zeros_like)r+   r   r^   rt   ru   rv   rw   r    r    r!   
empty_likei  ry   r{   zaten::zerosc                 C   rO   )Nr   rq   r+   r   r^   rt   ru   rv   r    r    r!   rs   w  s   rs   zaten::zeros_likec                 C      |  d|}t| ||dS )NShaper   r*   rq   r+   r   r^   rt   ru   rv   rw   shaper    r    r!   rz   ~     rz   z
aten::onesc                 C   rO   )NrY   r|   r}   r    r    r!   ones  s   r   zaten::ones_likec                 C   r~   )Nr   rY   r   r   r    r    r!   	ones_like  r   r   z
aten::fullc           	   
   C   sb   t |d}t |r#t| ||||}t| ||| jdtddS t 	|dd}t
| |||S )Nrg   r]   rY   r_   r   r^   )r   r'   r(   rs   rJ   addr*   rb   rc   rm   rq   )	r+   r   valuer^   rt   ru   rv   ro   tmpr    r    r!   full  s   
 r   zaten::full_likefc           	      C   s   |  d|}t| |||S )Nr   r   )	r+   r   Z
fill_valuer^   rt   ru   rv   rw   r   r    r    r!   	full_like  s   r   zaten::repeatc              
   C   s   t |s| jdt|d}t |rtt |}n
t |d}t|}|	 rN|
  }|t| }|dkrNt| || jdtdg| | d}| d||S )Nr]   r_   r   r   rY   ZTile)r   r(   r*   rb   Z
LongTensorZ_is_packed_listlenZ_unpack_listr'   ZisCompleteTensorr   r   rJ   viewrc   )r+   rV   ZrepeatsZrepeat_size_lenZconst_repeatsr   Z	diff_dimsr    r    r!   repeat  s   

 r   )FN)F)1__doc__	functoolsrE   rb   Ztorch._Cr   r:   Z
torch.onnxr   r   r   r   rJ   Ztorch.onnx._internalr   r   partialZonnx_symbolicZ_onnx_symbolicZblock_listed_operatorsZblock_listed_opZ_block_list_in_opsetZ_apply_paramsr3   ZGraphContextr7   rH   rK   rN   rR   rT   rW   rX   r\   re   
parse_argsrj   rn   intrq   rx   r{   rs   rz   r   r   r   r   r   r    r    r    r!   <module>   s    !	