a
    .=ic0                  	   @   s  d Z ddlZddlZddlmZ ddlmZ g dZeD ]Ze	ee
 e< q8dd Zedd	d
Zeddd
Zeddd
Zedd	dZedddZedddZdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zed'd'd'd(d(d)d* Zd+d, Zd-d. Zed'd/d'd'd'd'dDd1d2Z ed'd/d'd'd'd'dEd3d4Z!ed'd/d'd'd'dFd5d6Z"ed'd/d'd'd'd'dGd7d8Z#ed'd/d'd'd'dHd9d:Z$ed'd/d'd'd'd'dId;d<Z%dJd=d>Z&ed'd?d/d'd'd'd'dKd@dAZ'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)symbolic_helper)symbolic_opset9)ZnonzerowhereZscatterZscatter_adderfsignisnangatherZarangeZmasked_fillZ
index_fillZ
index_copyZrepeat_interleaver   anyallc                    s    fdd}|S )Nc                    s   t | |\}}t  t |}|r6t dS t dt rXt 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 k/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/torch/onnx/symbolic_opset8.py
<listcomp>M   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   )r(   r   r'   r)   r   r&   r   _interpolate>   s    r*   upsample_nearest1d   Znearestupsample_nearest2d   upsample_nearest3d   upsample_linear1dZlinearupsample_bilinear2dupsample_trilinear3dc           	      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b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   __interpolatea   s    r8   c                    sf   g d}d }|d    }|d urR|}||vrHt fdd|D }q\d| S n
td |f| S )N)ZHalfFloatDoubler   c                 3   s   | ]}t  |d V  qdS )FN)opset9Z_cast_Float)r   argr"   r   r   	<genexpr>       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   Z
scalarTypetuplewarningswarn)r"   r#   Zfloating_scalar_typesold_typeZ	arg0_typer   r=   r   _try_cast_integer_to_float{   s    
rE   c                 C   s$   |d u r|S t td|| |dS )Nz_cast_{}F)getattrr;   format)r"   r   Zto_typer   r   r   _cast_to_type   s    rH   c                 C   s8   t |}t | ||}t| ||\}}}| |||S r@   )r   r   Z_if_scalar_type_asrE   r!   )r"   r   otherZop_name_r   r   r   _comparison_operator   s    
rK   c                 C   s   t | ||dS )NZGreaterrK   r"   r   rI   r   r   r   gt   s    rN   c                 C   s   t | ||dS )NZLessrL   rM   r   r   r   lt   s    rO   c                 C   sD   t |r2t| ||\}}}t| | d|||S | d||S d S )NZMatMul)r   _try_get_scalar_typerE   rH   r!   )r"   selfrI   rD   r   r   r   bmm   s    
rR   c                 C   s   t | ||S r@   )rR   )r"   rQ   rI   r   r   r   matmul   s    rS   c                 C   s|   t |}|d ur8|dkr8| jd|ttd|d d}t |rjt| ||\}}}t| | d|||S | d||S d S )Nr   Z	Unsqueeze   )Zaxes_iZPRelu)r   Z_get_tensor_rankr!   listr    rP   rE   rH   )r"   rQ   weightZ	self_rankrD   r   r   r   prelu   s    

rW   c              
   C   sx   t || }| ddg|}t |r^t| |||\}}}}t| | jd|||ddd|S | jd|||dddS d S )Nr   rT   Gemmg        r   Zbeta_fZalpha_f)r   rP   lowerZconstantrE   rH   r!   )r"   rQ   rI   tyCrD   r   r   r   mm   s    
r]   vtc                 C   sp   t |rJt| |||\}}}}t| | jd|||t |t |d|S | jd|||t |t |dS d S )NrX   rY   )r   rP   rE   rH   r!   Z_scalar)r"   rQ   Zmat1Zmat2betaalpharD   r   r   r   addmm   s,    
rb   c                 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   rT   ZFlatten)Zaxis_ir   )
r   
_get_constr   r   rP   rE   rH   r!   r;   flatten)r"   r   rc   rd   Zstart_dim_iZ	end_dim_ir   rD   r   r   r   rf      s(    

rf   c                 C   sj   |d u rt jj}t j| jsL| jd|t jd d|d}t t j| | |d S | jd|t j| d|dS d S )NZConstantFillr9   rT   )Zdtype_iZinput_as_shape_iZvalue_f)	r   Z
ScalarTypeFLOATZscalar_type_to_pytorch_typeZis_floating_pointr!   Zcast_pytorch_to_onnxZ_cast_func_templateZscalar_type_to_onnx)r"   r   dtypeconst_valueresultr   r   r   _constant_fill  s(    rk   r   Fc                 C   s   t | |||||S r@   )zeros)r"   r   rh   layoutdevice
pin_memorymemory_formatr   r   r   empty  s    rq   c                 C   s   t | |||||S r@   )
zeros_like)r"   r   rh   rm   rn   ro   rp   r   r   r   
empty_like$  s    rs   c                 C   s   t | ||dS )Nr   rk   r"   r   rh   rm   rn   ro   r   r   r   rl   )  s    rl   c                 C   s   |  d|}t| ||dS )NShaper   r!   rk   r"   r   rh   rm   rn   ro   rp   shaper   r   r   rr   /  s    rr   c                 C   s   t | ||dS )NrT   rt   ru   r   r   r   ones5  s    rz   c                 C   s   |  d|}t| ||dS )Nrv   rT   rw   rx   r   r   r   	ones_like:  s    r{   c           	   
   C   sf   t |d}t |rFt| ||||}t| ||| jdtddS t 	|dd}t
| |||S d S )Nr_   ConstantrT   Zvalue_tr   rh   )r   r   r   rl   r;   addr!   torchtensorre   rk   )	r"   r   valuerh   rm   rn   ro   ri   tmpr   r   r   full@  s    
 r   fc           	      C   s   |  d|}t| |||S )Nrv   rw   )	r"   r   Z
fill_valuerh   rm   rn   ro   rp   ry   r   r   r   	full_likeJ  s    r   c              
   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|   r}   r   r   rT   ZTile)r   r   r!   r   Z
LongTensorZ_is_packed_listlenZ_unpack_listr   ZisCompleteTensorr   r   r;   viewr   )r"   rQ   ZrepeatsZrepeat_size_lenZconst_repeatsr   Z	diff_dimsr   r   r   repeatR  s    

 r   )FN)FN)F)FN)F)FN)F)FN))__doc__rB   r   Z
torch.onnxr   r   r;   Zblock_listed_operatorsZblock_listed_opZ_block_list_in_opsetvarsr*   r+   r-   r/   r1   r2   r3   r8   rE   rH   rK   rN   rO   rR   rS   rW   r]   
parse_argsrb   rf   rk   rq   rs   rl   rr   rz   r{   r   r   r   r   r   r   r   <module>   sZ    	


 