U
    9%e:                     @   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 qhd
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d0ejd!d1d2Zed3ejd!d4d5Z ed6ejd!d7d8Z!ed9ejd!d:d;Z"ed<e
#d=d=d=d>d>ejd!d?d@Z$edAejd!dBdCZ%eje&dDdEdFZ'edGe
#d=dHd=d=d=d=deejd!dJdKZ(edLe
#d=dHd=d=d=d=dfejd!dMdNZ)edOe
#d=dHd=d=d=dgejd!dPdQZ*edRe
#d=dHd=d=d=d=dhejd!dSdTZ+edUe
#d=dHd=d=d=diejd!dVdWZ,edXe
#d=dHd=d=d=d=djejd!dYdZZ-ed[dkejd!d\d]Z.ed^e
#d=d_dHd=d=d=d=dlejd!d`daZ/edbejd!dcddZ0dS )ma  
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::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   Y/var/www/html/Darija-Ai-API/env/lib/python3.8/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_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>s   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_fne   s(      


 z!_interpolate.<locals>.symbolic_fnr   )r7   r&   r6   r8   r   r5   r   _interpolateL   s    r9   zaten::__interpolater2   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_moder1   )	r2   r'   sizeZscale_factormoder4   Zrecompute_scale_factorZ	antialiasr3   r   r   r   __interpolate   s*          r>   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)r1   _C_onnxZTensorProtoDataTypeFLOAT)r$   argr:   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   JitScalarTypeZHALFrB   DOUBLE
from_value	UNDEFINEDZscalar_nametuplewarningswarn)r2   r   Zfloating_scalar_typesold_typeZ	arg0_typer   r:   r   _try_cast_integer_to_float   s*     

rM   c                 C   s$   |d kr|S t td| | |dS )NZ_cast_F)getattropset9)r2   r'   Zto_typer   r   r   _cast_to_type   s    rP   c                 C   s6   t |}t ||}t| ||\}}}| |||S r   )r   r,   Z_if_scalar_type_asrM   r1   )r2   r'   otherZop_name_r   r   r   _comparison_operator   s    
rS   zaten::gtc                 C   s   t | ||dS )NZGreaterrS   r2   r'   rQ   r   r   r   gt   s    rV   zaten::ltc                 C   s   t | ||dS )NZLessrT   rU   r   r   r   lt   s    rW   z	aten::bmmc                 C   sD   t |r2t| ||\}}}t| | d|||S | d||S d S )NZMatMul)r   _try_get_scalar_typerM   rP   r1   )r2   selfrQ   rL   r   r   r   bmm   s    
rZ   zaten::matmulc                 C   s   t | ||S r   )rZ   )r2   rY   rQ   r   r   r   matmul   s    r[   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_sizesr1   listr0   Z_squeeze_helperrX   rM   rP   )r2   rY   weightZ	self_rankZweight_sizesrL   r   r   r   prelu   s    

 
r_   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   rX   r   ZSymbolicValueErrorr1   torchtensorra   rM   rP   )r2   rY   rQ   scalar_typeZzero_constantrL   r   r   r   mm   s.     
   rh   zaten::addmmvtc                 C   sp   t |rJt| |||\}}}}t| | jd|||t |t |d|S | jd|||t |t |dS d S )Nrc   rd   )r   rX   rM   rP   r1   Z_scalar)r2   rY   Zmat1Zmat2betaalpharL   r   r   r   addmm  s,    
rm   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   r\   ZFlatten)Zaxis_ir   )
r   
_get_constr"   r&   rX   rM   rP   r1   rO   flatten)r2   r'   rn   ro   Zstart_dim_iZ	end_dim_ir&   rL   r   r   r   rq   -  s0    
  
  rq   )r2   ra   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ConstantFillr\   )Zdtype_iZinput_as_shape_iZvalue_fr?   r@   )r   rE   rB   ra   Zis_floating_pointr1   Z	onnx_type)r2   r#   ra   const_valuerg   resultr   r   r   _constant_fillJ  s&    



rt   zaten::emptyr%   Fc                 C   s   t | |||||S r   )zeros)r2   r#   ra   layoutdevice
pin_memorymemory_formatr   r   r   emptyb  s    rz   zaten::empty_likec                 C   s   t | |||||S r   )
zeros_like)r2   r'   ra   rv   rw   rx   ry   r   r   r   
empty_likep  s    r|   zaten::zerosc                 C   s   t | ||dS )Nr   rt   r2   r#   ra   rv   rw   rx   r   r   r   ru   ~  s    ru   zaten::zeros_likec                 C   s   |  d|}t| ||dS )NShaper   r1   rt   r2   r'   ra   rv   rw   rx   ry   shaper   r   r   r{     s    r{   z
aten::onesc                 C   s   t | ||dS )Nr\   r}   r~   r   r   r   ones  s    r   zaten::ones_likec                 C   s   |  d|}t| ||dS )Nr   r\   r   r   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 )Nrj   r`   r\   rb   r%   ra   )r   r.   r/   ru   rO   addr1   re   rf   rp   rt   )	r2   r#   valuera   rv   rw   rx   rr   tmpr   r   r   full  s    
 r   zaten::full_likefc           	      C   s   |  d|}t| |||S )Nr   r   )	r2   r'   Z
fill_valuera   rv   rw   rx   ry   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 )Nr`   rb   r   r   r\   ZTile)r   r/   r1   re   Z
LongTensorZ_is_packed_listlenZ_unpack_listr.   ZisCompleteTensorr"   r#   rO   viewrf   )r2   rY   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__	functoolsrJ   re   Ztorch._Cr   rA   Z
torch.onnxr   r   r   r   rO   Ztorch.onnx._internalr   r   partialZonnx_symbolicZ_onnx_symbolicZblock_listed_operatorsZblock_listed_opZ_block_list_in_opsetr   r9   ZGraphContextr>   rM   rP   rS   rV   rW   rZ   r[   r_   rh   
parse_argsrm   rq   intrt   rz   r|   ru   r{   r   r   r   r   r   r   r   r   r   <module>   s    	!	           