o
    h:                     @   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 q4d
d Z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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d0d!ejfd1d2Zed3d!ejfd4d5Z ed6d!ejfd7d8Z!ed9d!ejfd:d;Z"ed<e
#d=d=d=d>d>d!ejfd?d@Z$edAd!ejfdBdCZ%d!ejdDe&fdEdFZ'edGe
#d=dHd=d=d=d=	I	ded!ejfdJdKZ(edLe
#d=dHd=d=d=d=	I	ded!ejfdMdNZ)edOe
#d=dHd=d=d=dfd!ejfdPdQZ*edRe
#d=dHd=d=d=d=	I	ded!ejfdSdTZ+edUe
#d=dHd=d=d=dfd!ejfdVdWZ,edXe
#d=dHd=d=d=d=	I	ded!ejfdYdZZ-ed[	Idfd!ejfd\d]Z.ed^e
#d=d_dHd=d=d=d=	I	ded!ejfd`daZ/edbd!ejfdcddZ0dS )ga  
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   )opset)nonzerowherescatterscatter_adderfsignisnangatherarangemasked_fill
index_fill
index_copyrepeat_interleaveanyallzaten::c                     s    fdd}|S )z_Returns a decorator that calls the decorated (higher-order) function with the given parameters.c                    s   |  i S N )fnargskwargsr   P/var/www/html/ai/venv/lib/python3.10/site-packages/torch/onnx/symbolic_opset8.py_applyF   s   z_apply_params.<locals>._applyr   )r   r   r!   r   r   r    _apply_paramsC   s   r"   zaten::upsample_nearest1dupsample_nearest1d   nearest)decoratezaten::upsample_nearest2dupsample_nearest2d   zaten::upsample_nearest3dupsample_nearest3d   zaten::upsample_linear1dupsample_linear1dlinearzaten::upsample_bilinear2dupsample_bilinear2dzaten::upsample_trilinear3d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_sizer   r    
<listcomp>s   s    z5_interpolate.<locals>.symbolic_fn.<locals>.<listcomp>r   Upsamplemode_sscales_f)	r   _get_interpolate_attributes_interpolate_warning_maybe_get_scalar_unimplemented_maybe_get_const	_is_valuerangeop)gr9   r:   r   scalesalign_cornersr8   interpolate_modename)r9   r:   r    symbolic_fne   s"   


z!_interpolate.<locals>.symbolic_fnr   )rM   r8   rL   rN   r   rK   r    _interpolateL   s   rO   zaten::__interpolaterH   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binterpolater/   zdynamic scales in opset 8zdynamic size in opset 8r<   r=   )r   rD   _is_nonerC   rE    _interpolate_get_scales_and_moderG   )	rH   r9   sizescale_factormoderJ   recompute_scale_factor	antialiasrI   r   r   r    __interpolate   s   rY   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to_iN)rG   _C_onnxTensorProtoDataTypeFLOAT)r6   argrH   r   r    	<genexpr>   s
    
z-_try_cast_integer_to_float.<locals>.<genexpr>r   zOnly 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   JitScalarTypeHALFr_   DOUBLE
from_value	UNDEFINEDscalar_nametuplewarningswarn)rH   r   floating_scalar_typesold_type	arg0_typer   ra   r    _try_cast_integer_to_float   s(   

ro   c                 C   s$   |d u r|S t td| | |dS )N_cast_F)getattropset9)rH   r9   to_typer   r   r    _cast_to_type   s   rt   c                 C   s6   t |}t ||}t| ||\}}}| |||S r   )r   rB   _if_scalar_type_asro   rG   )rH   r9   otherop_name_r   r   r    _comparison_operator   s   
ry   zaten::gtc                 C      t | ||dS )NGreaterry   rH   r9   rv   r   r   r    gt      r~   zaten::ltc                 C   rz   )NLessr|   r}   r   r   r    lt   r   r   z	aten::bmmc                 C   s@   t |rt| ||\}}}t| | d|||S | d||S )NMatMul)r   _try_get_scalar_typero   rt   rG   )rH   selfrv   rm   r   r   r    bmm   s   
r   zaten::matmulc                 C   s   t | ||S r   )r   )rH   r   rv   r   r   r    matmul   s   r   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 )Nr1   	Unsqueeze   )axes_ir   PRelu)
r   _get_tensor_rank_get_tensor_sizesrG   listrF   _squeeze_helperr   ro   rt   )rH   r   weight	self_rankweight_sizesrm   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value_tGemmg        r2   beta_falpha_f)
r   r   r   SymbolicValueErrorrG   torchtensorr   ro   rt   )rH   r   rv   scalar_typezero_constantrm   r   r   r    mm   s&   
r   zaten::addmmvtc                 C   sl   t |r%t| |||\}}}}t| | jd|||t |t |d|S | jd|||t |t |dS )Nr   r   )r   r   ro   rt   rG   _scalar)rH   r   mat1mat2betaalpharm   r   r   r    addmm  s,   
r   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 )	Nr7   	start_dimend_dimr   r   Flatten)axis_ir1   )
r   
_get_constr4   r8   r   ro   rt   rG   rr   flatten)rH   r9   r   r   start_dim_i	end_dim_ir8   rm   r   r   r    r   -  s(   

r   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 )NConstantFillr   )dtype_iinput_as_shape_ivalue_frZ   r[   )r   rc   r_   r   is_floating_pointrG   	onnx_type)rH   r5   r   const_valuer   resultr   r   r    _constant_fillJ  s&   



r   zaten::emptyr7   Fc                 C      t | |||||S r   )zeros)rH   r5   r   layoutdevice
pin_memorymemory_formatr   r   r    emptyb     r   zaten::empty_likec                 C   r   r   )
zeros_like)rH   r9   r   r   r   r   r   r   r   r    
empty_likep  r   r   zaten::zerosc                 C   rz   )Nr   r   rH   r5   r   r   r   r   r   r   r    r   ~  s   r   zaten::zeros_likec                 C      |  d|}t| ||dS )NShaper   rG   r   rH   r9   r   r   r   r   r   shaper   r   r    r        r   z
aten::onesc                 C   rz   )Nr   r   r   r   r   r    ones  s   r   zaten::ones_likec                 C   r   )Nr   r   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 )Nr   r   r   r   r7   r   )r   rD   rE   r   rr   addrG   r   r   r   r   )	rH   r5   valuer   r   r   r   r   tmpr   r   r    full  s   
 r   zaten::full_likefc           	      C   s   |  d|}t| |||S )Nr   r   )	rH   r9   
fill_valuer   r   r   r   r   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   r0   r   r   Tile)r   rE   rG   r   
LongTensor_is_packed_listlen_unpack_listrD   isCompleteTensorr4   r5   rr   viewr   )rH   r   repeatsrepeat_size_lenconst_repeatsr5   	diff_dimsr   r   r    repeat  s   

 r   )FN)F)1__doc__	functoolsrj   r   torch._Cr   r]   
torch.onnxr   r   r   r   rr   torch.onnx._internalr   r   partialonnx_symbolic_onnx_symbolicblock_listed_operatorsblock_listed_op_block_list_in_opsetr"   rO   GraphContextrY   ro   rt   ry   r~   r   r   r   r   r   
parse_argsr   r   intr   r   r   r   r   r   r   r   r   r   r   r   r   r    <module>   s     	!	