U
    Mhs:                     @   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 qhe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ejdd d!Zejdd"d#Zejdd$d%Zejdd&d'Zed(ejdd)d*Zed+ejdd,d-Zed.ejdd/d0Zed1ejdd2d3Z ed4ejdd5d6Z!ed7ejdd8d9Z"ed:e
#d;d;d;d<d<ejdd=d>Z$ed?ejdd@dAZ%eje&dBdCdDZ'edEe
#d;dFd;d;d;d;dcejddHdIZ(edJe
#d;dFd;d;d;d;ddejddKdLZ)edMe
#d;dFd;d;d;deejddNdOZ*edPe
#d;dFd;d;d;d;dfejddQdRZ+edSe
#d;dFd;d;d;dgejddTdUZ,edVe
#d;dFd;d;d;d;dhejddWdXZ-edYdiejddZd[Z.ed\e
#d;d]dFd;d;d;d;djejdd^d_Z/ed`ejddadbZ0dS )ka  
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isnanZ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 |}|r8t d S t dt rZt dS |d k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 L/var/www/html/venv/lib/python3.8/site-packages/torch/onnx/symbolic_opset8.py
<listcomp>k   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   )r0   r   r/   r1   r   r.   r    _interpolateD   s    r2   zaten::__interpolater*   c           	      C   s   t |d}t |s&|r&t ddS t |sFt |rFt ddS t |sft |rft 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    __interpolatew   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rr|}||krh| }t fdd|D }q|d| S n
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   argr3   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_valueZ	UNDEFINEDZscalar_nametuplewarningswarn)r*   r+   Zfloating_scalar_typesold_typeZ	arg0_typer   r3   r    _try_cast_integer_to_float   s*     

rF   c                 C   s$   |d kr|S t td| | |dS )NZ_cast_F)getattropset9)r*   r   Zto_typer   r   r    _cast_to_type   s    rI   c                 C   s6   t |}t ||}t| ||\}}}| |||S r>   )r   r$   Z_if_scalar_type_asrF   r)   )r*   r   otherZop_name_r   r   r    _comparison_operator   s    
rL   zaten::gtc                 C   s   t | ||dS )NZGreaterrL   r*   r   rJ   r   r   r    gt   s    rO   zaten::ltc                 C   s   t | ||dS )NZLessrM   rN   r   r   r    lt   s    rP   z	aten::bmmc                 C   sD   t |r2t| ||\}}}t| | d|||S | d||S d S )NZMatMul)r   _try_get_scalar_typerF   rI   r)   )r*   selfrJ   rE   r   r   r    bmm   s    
rS   zaten::matmulc                 C   s   t | ||S r>   )rS   )r*   rR   rJ   r   r   r    matmul   s    rT   zaten::preluc                 C   s   t |}t |}|d k	rD|dkrD| jd|ttd|d d}n"|dkrf|dgkrft | |dg}t |rt| ||\}}}t	| | d|||S | d||S d S )Nr   Z	Unsqueeze   )Zaxes_ir   ZPRelu)
r   Z_get_tensor_rankZ_get_tensor_sizesr)   listr(   Z_squeeze_helperrQ   rF   rI   )r*   rR   weightZ	self_rankZweight_sizesrE   r   r   r    prelu   s    

 
rX   zaten::mmc              
   C   s   t ||}|d k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   rQ   r   ZSymbolicValueErrorr)   torchtensorrZ   rF   rI   )r*   rR   rJ   scalar_typeZzero_constantrE   r   r   r    mm   s.     
   ra   zaten::addmmvtc                 C   sp   t |rJt| |||\}}}}t| | jd|||t |t |d|S | jd|||t |t |dS d S )Nr\   r]   )r   rQ   rF   rI   r)   Z_scalar)r*   rR   Zmat1Zmat2betaalpharE   r   r   r    addmm	  s,    
rf   zaten::flattenc                 C   s   t |dd}t |dd}|  }|dk r8|| }|dkr||d krt |r|t| |\}}t| | jd||d|S | jd||dS |dkr||d krt |rt| |\}}t| | jd||d d|S | jd||d dS t	| |||S )	Nr   	start_dimend_dimr   rU   ZFlatten)Zaxis_ir   )
r   
_get_constr   r   rQ   rF   rI   r)   rH   flatten)r*   r   rg   rh   Zstart_dim_iZ	end_dim_ir   rE   r   r   r    rj   %  s0    
  
  rj   )r*   rZ   c                 C   sr   |d krt jj}n
t |}| jsV| jd|t jj d|d}| jd|| dS | jd|| d|dS d S )NZConstantFillrU   )Zdtype_iZinput_as_shape_iZvalue_fr8   r9   )r   r?   r;   rZ   Zis_floating_pointr)   Z	onnx_type)r*   r   rZ   const_valuer`   resultr   r   r    _constant_fillB  s&    



rm   zaten::emptyr   Fc                 C   s   t | |||||S r>   )zeros)r*   r   rZ   layoutdevice
pin_memorymemory_formatr   r   r    emptyZ  s    rs   zaten::empty_likec                 C   s   t | |||||S r>   )
zeros_like)r*   r   rZ   ro   rp   rq   rr   r   r   r    
empty_likeh  s    ru   zaten::zerosc                 C   s   t | ||dS )Nr   rm   r*   r   rZ   ro   rp   rq   r   r   r    rn   v  s    rn   zaten::zeros_likec                 C   s   |  d|}t| ||dS )NShaper   r)   rm   r*   r   rZ   ro   rp   rq   rr   shaper   r   r    rt   }  s    rt   z
aten::onesc                 C   s   t | ||dS )NrU   rv   rw   r   r   r    ones  s    r|   zaten::ones_likec                 C   s   |  d|}t| ||dS )Nrx   rU   ry   rz   r   r   r    	ones_like  s    r}   z
aten::fullc           	   
   C   sf   t |d}t |rFt| ||||}t| ||| jdtddS t 	|dd}t
| |||S d S )Nrc   rY   rU   r[   r   rZ   )r   r&   r'   rn   rH   addr)   r^   r_   ri   rm   )	r*   r   valuerZ   ro   rp   rq   rk   tmpr   r   r    full  s    
 r   zaten::full_likefc           	      C   s   |  d|}t| |||S )Nrx   ry   )	r*   r   Z
fill_valuerZ   ro   rp   rq   rr   r{   r   r   r    	full_like  s    r   zaten::repeatc              
   C   s   t |s| jdt|d}t |r8tt |}nt |d}t|}|	 r|
  }|t| }|dkrt| || jdtdg| | d}| d||S )NrY   r[   r   r   rU   ZTile)r   r'   r)   r^   Z
LongTensorZ_is_packed_listlenZ_unpack_listr&   ZisCompleteTensorr   r   rH   viewr_   )r*   rR   ZrepeatsZrepeat_size_lenZconst_repeatsr   Z	diff_dimsr   r   r    repeat  s     

  r   )FN)FN)F)FN)F)FN)F)FN)1__doc__	functoolsrC   r^   Ztorch._Cr   r:   Z
torch.onnxr   r   r   r   rH   Ztorch.onnx._internalr   r   partialZonnx_symbolicZ_onnx_symbolicZblock_listed_operatorsZblock_listed_opZ_block_list_in_opsetZ_apply_paramsr2   ZGraphContextr7   rF   rI   rL   rO   rP   rS   rT   rX   ra   
parse_argsrf   rj   intrm   rs   ru   rn   rt   r|   r}   r   r   r   r   r   r   r    <module>   s    !	           