U
    <c:                     @   s  d Z ddlZddlZddl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 q\d	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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 d0d1Zed2ejd d3d4Zed5ejd d6d7Zed8ejd d9d:Zed;e d<d<d<d=d=ejd d>d?Z!ed@ejd dAdBZ"eje#dCdDdEZ$edFe d<dGd<d<d<d<ddejd dIdJZ%edKe d<dGd<d<d<d<deejd dLdMZ&edNe d<dGd<d<d<dfejd dOdPZ'edQe d<dGd<d<d<d<dgejd dRdSZ(edTe d<dGd<d<d<dhejd dUdVZ)edWe d<dGd<d<d<d<diejd dXdYZ*edZdjejd d[d\Z+ed]e d<d^dGd<d<d<d<dkejd d_d`Z,edaejd dbdcZ-dS )la  
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)_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::c                     s    fdd}|S )z_Returns a decorator that calls the decorated (higher-order) function with the given parameters.c                    s
   |  S N )fnargskwargsr   >/tmp/pip-unpacked-wheel-gikjz4vx/torch/onnx/symbolic_opset8.py_applyE   s    z_apply_params.<locals>._applyr   )r   r   r   r   r   r   _apply_paramsB   s    r   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_sizer   r   
<listcomp>r   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&   r   scalesalign_cornersr$   interpolate_modename)r%   r&   r   symbolic_fnd   s(      


 z!_interpolate.<locals>.symbolic_fnr   )r5   r$   r4   r6   r   r3   r   _interpolateK   s    r7   zaten::__interpolater0   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/   )	r0   r%   sizeZscale_factormoder2   Zrecompute_scale_factorZ	antialiasr1   r   r   r   __interpolate~   s*          r<   c                    sh   dddh}d }|d    }|d k	rT|}||krJt fdd|D }q^d| S n
td |f| S )	NZHalfZFloatDoubler   c                 3   s   | ]}t  |d V  qdS )FN)opset9Z_cast_Float)r"   argr8   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    Z
scalarTypetuplewarningswarn)r0   r   Zfloating_scalar_typesold_typeZ	arg0_typer   r8   r   _try_cast_integer_to_float   s    

rE   c                 C   s$   |d kr|S t td| | |dS )NZ_cast_F)getattrr>   )r0   r%   Zto_typer   r   r   _cast_to_type   s    rG   c                 C   s6   t |}t ||}t| ||\}}}| |||S r   )r   r*   Z_if_scalar_type_asrE   r/   )r0   r%   otherZop_name_r   r   r   _comparison_operator   s    
rJ   zaten::gtc                 C   s   t | ||dS )NZGreaterrJ   r0   r%   rH   r   r   r   gt   s    rM   zaten::ltc                 C   s   t | ||dS )NZLessrK   rL   r   r   r   lt   s    rN   z	aten::bmmc                 C   sD   t |r2t| ||\}}}t| | d|||S | d||S d S )NZMatMul)r   _try_get_scalar_typerE   rG   r/   )r0   selfrH   rD   r   r   r   bmm   s    
rQ   zaten::matmulc                 C   s   t | ||S r   )rQ   )r0   rP   rH   r   r   r   matmul   s    rR   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_helperrO   rE   rG   )r0   rP   ZweightZ	self_rankZweight_sizesrD   r   r   r   prelu   s    

 
rU   zaten::mmc              
   C   s   t ||}|d kr td|| jdtjdgtj	|
 dd}t |rt| |||\}}}}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   rO   r   ZSymbolicValueErrorr/   torchtensorr   JitScalarType	from_namerW   rE   rG   )r0   rP   rH   scalar_typeZzero_constantrD   r   r   r   mm   s4      
   r`   zaten::addmmvtc                 C   sp   t |rJt| |||\}}}}t| | jd|||t |t |d|S | jd|||t |t |dS d S )NrY   rZ   )r   rO   rE   rG   r/   Z_scalar)r0   rP   Zmat1Zmat2betaalpharD   r   r   r   addmm  s,    
re   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   rS   ZFlatten)Zaxis_ir   )
r   
_get_constr    r$   rO   rE   rG   r/   r>   flatten)r0   r%   rf   rg   Zstart_dim_iZ	end_dim_ir$   rD   r   r   r   ri   (  s0    
  
  ri   )r0   rW   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ConstantFillrS   )Zdtype_iZinput_as_shape_iZvalue_fZCast)Zto_i)r   r]   FLOATrW   Zis_floating_pointr/   Z	onnx_type)r0   r!   rW   const_valuer_   resultr   r   r   _constant_fillE  s&    



rm   zaten::emptyr#   Fc                 C   s   t | |||||S r   )zeros)r0   r!   rW   layoutdevice
pin_memorymemory_formatr   r   r   empty]  s    rs   zaten::empty_likec                 C   s   t | |||||S r   )
zeros_like)r0   r%   rW   ro   rp   rq   rr   r   r   r   
empty_likek  s    ru   zaten::zerosc                 C   s   t | ||dS )Nr   rm   r0   r!   rW   ro   rp   rq   r   r   r   rn   y  s    rn   zaten::zeros_likec                 C   s   |  d|}t| ||dS )NShaper   r/   rm   r0   r%   rW   ro   rp   rq   rr   shaper   r   r   rt     s    rt   z
aten::onesc                 C   s   t | ||dS )NrS   rv   rw   r   r   r   ones  s    r|   zaten::ones_likec                 C   s   |  d|}t| ||dS )Nrx   rS   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 )Nrb   rV   rS   rX   r#   rW   )r   r,   r-   rn   r>   addr/   r[   r\   rh   rm   )	r0   r!   valuerW   ro   rp   rq   rk   tmpr   r   r   full  s    
 r   zaten::full_likefc           	      C   s   |  d|}t| |||S )Nrx   ry   )	r0   r%   Z
fill_valuerW   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 )NrV   rX   r   r   rS   ZTile)r   r-   r/   r[   Z
LongTensorZ_is_packed_listlenZ_unpack_listr,   ZisCompleteTensorr    r!   r>   viewr\   )r0   rP   ZrepeatsZrepeat_size_lenZconst_repeatsr!   Z	diff_dimsr   r   r   repeat  s     

  r   )FN)FN)F)FN)F)FN)F)FN).__doc__	functoolsrB   r[   Z
torch.onnxr   r   r   r   r>   Ztorch.onnx._internalr   r   partialZonnx_symbolicZ_onnx_symbolicZblock_listed_operatorsZblock_listed_opZ_block_list_in_opsetr   r7   ZGraphContextr<   rE   rG   rJ   rM   rN   rQ   rR   rU   r`   
parse_argsre   ri   intrm   rs   ru   rn   rt   r|   r}   r   r   r   r   r   r   r   <module>   s    	!	           