U
    d0                     @   s  d Z ddlZddlZddlmZ ddlmZ ddddd	d
ddddddddddgZeD ]Ze	ee
 e< qTd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/d0 Zd1d2 Zd3d4 Zed5d5d5d6d6d7d8 Zd9d: Zd;d< Zed5d=d5d5d5d5dRd?d@Z ed5d=d5d5d5d5dSdAdBZ!ed5d=d5d5d5dTdCdDZ"ed5d=d5d5d5d5dUdEdFZ#ed5d=d5d5d5dVdGdHZ$ed5d=d5d5d5d5dWdIdJZ%dXdKdLZ&ed5dMd=d5d5d5d5dYdNdOZ'dPdQ Z(dS )Za  
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_opset9ZnonzerowhereZscatterZscatter_adderfsignisnanZgatherZarangeZmasked_fillZ
index_fillZ
index_copyZrepeat_interleaveanyallc                    s    fdd}|S )Nc                    s   t | |\}}t  t |}|r6t dS t dt rXt 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 >/tmp/pip-unpacked-wheel-ua33x9lu/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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   __interpolatea   s*          r6   c                    sh   dddg}d }|d    }|d k	rT|}||krJt fdd|D }q^d| S n
td |f| S )	NZHalfFloatDoubler   c                 3   s   | ]}t  |d V  qdS )FN)opset9Z_cast_Float)r   argr!   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   Z
scalarTypetuplewarningswarn)r!   r"   Zfloating_scalar_typesold_typeZ	arg0_typer   r;   r   _try_cast_integer_to_float{   s    

rB   c                 C   s$   |d kr|S t td|| |dS )Nz_cast_{}F)getattrr9   format)r!   r   Zto_typer   r   r   _cast_to_type   s    rE   c                 C   s8   t |}t | ||}t| ||\}}}| |||S r=   )r   r   Z_if_scalar_type_asrB   r    )r!   r   otherZop_name_r   r   r   _comparison_operator   s    
rH   c                 C   s   t | ||dS )NZGreaterrH   r!   r   rF   r   r   r   gt   s    rK   c                 C   s   t | ||dS )NZLessrI   rJ   r   r   r   lt   s    rL   c                 C   sD   t |r2t| ||\}}}t| | d|||S | d||S d S )NZMatMul)r   _try_get_scalar_typerB   rE   r    )r!   selfrF   rA   r   r   r   bmm   s    
rO   c                 C   s   t | ||S r=   )rO   )r!   rN   rF   r   r   r   matmul   s    rP   c                 C   s|   t |}|d k	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   rM   rB   rE   )r!   rN   ZweightZ	self_rankrA   r   r   r   prelu   s    

rS   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   rQ   Gemmg        r   Zbeta_fZalpha_f)r   rM   lowerZconstantrB   rE   r    )r!   rN   rF   tyCrA   r   r   r   mm   s    
  rY   vtc                 C   sp   t |rJt| |||\}}}}t| | jd|||t |t |d|S | jd|||t |t |dS d S )NrT   rU   )r   rM   rB   rE   r    Z_scalar)r!   rN   Zmat1Zmat2betaalpharA   r   r   r   addmm   s,    
r^   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   rQ   ZFlatten)Zaxis_ir   )
r   
_get_constr   r   rM   rB   rE   r    r9   flatten)r!   r   r_   r`   Zstart_dim_iZ	end_dim_ir   rA   r   r   r   rb      s0    
  
  rb   c                 C   sj   |d k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ConstantFillr7   rQ   )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.       rg   r   Fc                 C   s   t | |||||S r=   )zeros)r!   r   rd   layoutdevice
pin_memorymemory_formatr   r   r   empty  s    rm   c                 C   s   t | |||||S r=   )
zeros_like)r!   r   rd   ri   rj   rk   rl   r   r   r   
empty_like$  s    ro   c                 C   s   t | ||dS )Nr   rg   r!   r   rd   ri   rj   rk   r   r   r   rh   )  s    rh   c                 C   s   |  d|}t| ||dS )NShaper   r    rg   r!   r   rd   ri   rj   rk   rl   shaper   r   r   rn   /  s    rn   c                 C   s   t | ||dS )NrQ   rp   rq   r   r   r   ones5  s    rv   c                 C   s   |  d|}t| ||dS )Nrr   rQ   rs   rt   r   r   r   	ones_like:  s    rw   c           	   
   C   sf   t |d}t |rFt| ||||}t| ||| jdtddS t 	|dd}t
| |||S d S )Nr[   ConstantrQ   Zvalue_tr   rd   )r   r   r   rh   r9   addr    torchtensorra   rg   )	r!   r   valuerd   ri   rj   rk   re   tmpr   r   r   full@  s    
 r   fc           	      C   s   |  d|}t| |||S )Nrr   rs   )	r!   r   Z
fill_valuerd   ri   rj   rk   rl   ru   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 )Nrx   ry   r   r   rQ   ZTile)r   r   r    r{   Z
LongTensorZ_is_packed_listlenZ_unpack_listr   ZisCompleteTensorr   r   r9   viewr|   )r!   rN   ZrepeatsZrepeat_size_lenZconst_repeatsr   Z	diff_dimsr   r   r   repeatR  s     

  r   )FN)FN)F)FN)F)FN)F)FN))__doc__r?   r{   Z
torch.onnxr   r   r9   Zblock_listed_operatorsZblock_listed_opZ_block_list_in_opsetvarsr)   r*   r,   r.   r0   r1   r2   r6   rB   rE   rH   rK   rL   rO   rP   rS   rY   
parse_argsr^   rb   rg   rm   ro   rh   rn   rv   rw   r   r   r   r   r   r   r   <module>   s|    	


   