U
    <c]q                     @   s  d dl Z d dlZd dlZd dlmZmZ d dlZd dlm  m	Z
 d dlZd dlmZ d dlmZmZmZmZmZ d dlmZ d dlmZmZmZ ddd	d
dddddddddddddddddddddd gZe jejd!d"Zd#d$ Zed%ejejd&d'dZe d(d(d)ejejd&d*d+Z!ed,ejejd&d-d.Z"ed/e d(d0d0d1ejdejd&d2dZ#ed3e d(d(d0d0d0d1ejdejd&d4d Z$ed5ed6ej%j&j'j(d7d8d9gd:ed;ed<ej%j&j'j)d=d8d9gd:ed>ed?ej%j&j'j*d@d8d9gd:edAedBej%j&j'j(d7dCd9gd:edDedEej%j&j'j)d=dCd9gd:edFedGej%j&j'j*d@dCd9gd:eje+ee,e-dHdIdJZ.edKedLej%j&j'j(gd:edMedNej%j&j'j)gd:edOedPej%j&j'j*gd:ejdQdR Z/edSedTd@dUgd:edVedWdXdUgd:edYedZd[dUgd:ed\ed]d@d^gd:ed_ed`dXd^gd:edaedbd[d^gd:ejdcdd Z0edeejejd&dfdgZ1ejdejd&dhdiZ2edjejejd&dkdZ3edle d(dmejejd&dndZ4edoejejd&dpdZ5edqe d(d(d(d0d0d0d(d0d0	ejejd&drd	Z6edse d(d(d(d0d0ejdejd&dvd
Z7edwejejd&dxdZ8edyejejd&dzdZ9ed{ejejd&d|dZ:ed}ejejd&d~dZ;ede d(dddejejd&ddZ<edejejd&ddZ=edejejd&ddZ>edejejd&ddZ?edejejd&ddZ@edejejd&ddZAedejejd&ddZBedejejd&ddZCedejejd&ddZDedejejd&ddZEede d(d(d(dd(d(ejejd&ddZFedejejd&ddZGedejejd&ddZHede d(d0d(d(ejejejIe,ejIejIejIdddZJdS )    N)CallableSequence)_C)_patch_torch_type_utilserrorssymbolic_helpersymbolic_opset9)GLOBALS)	_beartype	jit_utilsregistration
dequantizedivembedding_bagfake_quantize_per_tensor_affineflipfmodisfiniteisinf
nan_to_numquantize_per_tensorquantized_add_reluquantized_addquantized_catquantized_conv2d_reluquantized_conv2dquantized_group_normquantized_hardswishquantized_instance_normquantized_layer_normquantized_leaky_reluquantized_linearquantized_mulquantized_sigmoidslicesorttopk
   )Zopsetc                     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_opset10.py_applyB   s    z_apply_params.<locals>._applyr*   )r-   r.   r0   r*   r,   r/   _apply_params?   s    r1   z	aten::divgc                 G   s0   t |dkrt| ||S t| ||f| S d S Nr   )lenopset9true_divide_div_rounding_mode)r3   selfotherr-   r*   r*   r/   r   H   s    vsc                 C   s(   |dkrt | ||S t| |||S d S )Nfloor)_floor_divider6   r8   )r3   r9   r:   Zrounding_moder*   r*   r/   r8   Q   s    r8   zaten::_floor_dividec                 C   s   t |st |r.t| ||}| d|S | d||}| jdtjdtjdd}| d| d||| d||}| jd	||dd
}| d|| d| d||}| jdtjdtjdd}	| d||	}
| d||
|S d S )NZFloorZDivConstantr   dtypeZvalue_tZXorZLessModZfmod_iAndZNotZEqual   ZSubWhere)r   _is_fpr6   r7   optorchtensorZint64)r3   r9   r:   outr   ZzeronegativemodZ
fixup_maskZonefixupr*   r*   r/   r>   Z   s    " r>   z
aten::sortinonec                 C   s   t j| ||||dS )N)	decendingrL   )r   Z_sort_helper)r3   r9   dimrR   rL   r*   r*   r/   r&   p   s    z
aten::topkc              	   C   s   t j| ||||||dS )N)largestsortedrL   )r   Z_topk_helper)r3   r9   krS   rT   rU   rL   r*   r*   r/   r'   w   s          zaten::max_pool1dZ
max_pool1drF   F)return_indices)Zdecoratezaten::max_pool2dZ
max_pool2d   zaten::max_pool3dZ
max_pool3d   zaten::max_pool1d_with_indicesZmax_pool1d_with_indicesTzaten::max_pool2d_with_indicesZmax_pool2d_with_indiceszaten::max_pool3d_with_indicesZmax_pool3d_with_indices)nametuple_fnndimsrW   c              	      s<   t ddddddt dddddd fdd}|S )NTFr;   isrP   c                    s   |s|}||d ||d}t |dhkrD||d< r| jd|fddi|\}}	| jd|ddd t D d	d t D d
\}
}tj| |dd t D ddd}t| |	|}	||	fS | jd|fddi|}|S d S )NrX   )kernel_shape_ipads_i	strides_iceil_mode_irF   Zdilations_iZMaxPooloutputsc                 S   s   g | ]}d qS rF   r*   .0_r*   r*   r/   
<listcomp>   s     z2_max_pool.<locals>.symbolic_fn.<locals>.<listcomp>c                 S   s   g | ]}d qS rc   r*   rd   r*   r*   r/   rg      s     )rb   r^   r`   c                 S   s   g | ]}d | qS )rX   r*   )re   rP   r*   r*   r/   rg      s     r   )axesstartsends)setrI   ranger   _slice_helperr6   sub)r3   inputkernel_sizestridepaddingdilation	ceil_moder.   rindicesrf   Zflattened_indicesr<   r\   rW   r[   r*   r/   symbolic_fn   s:    

z_max_pool.<locals>.symbolic_fn)r   quantized_args
parse_args)rZ   r[   r\   rW   rx   r*   rw   r/   	_max_pool   s    ;/r{   zaten::avg_pool1dZ
avg_pool1dzaten::avg_pool2dZ
avg_pool2dzaten::avg_pool3dZ
avg_pool3dc                    sd   t dddddddt dddddddtjd
tjtt tt tt ttd fdd	}|S )NTFr;   r]   rP   rQ   )ro   rp   rq   rr   rt   count_include_padc           	   	      s   |s|}t |||| }t|ts*t|rZtj| d|d| d dddd}dt| }| jd	||||d |d
}|S )NZPad)r   r   rX   Zconstant           )r_   mode_sZvalue_fZopset_beforer   ZAveragePool)r^   r`   r_   ra   )	r   Z_avgpool_helper
isinstancetupleAssertionErrorr6   Z_op_with_optional_float_castr5   rI   )	r3   ro   rp   rq   rr   rt   r|   Zdivisor_overrideoutputrZ   r[   r*   r/   rx      s>         
	z_avg_pool.<locals>.symbolic_fn)N)	r   ry   rz   r   beartyper   Valuer   int)rZ   r[   rx   r*   r   r/   	_avg_pool   s    	 %r   zaten::upsample_nearest1dZupsample_nearest1dZnearestzaten::upsample_nearest2dZupsample_nearest2d   zaten::upsample_nearest3dZupsample_nearest3d   zaten::upsample_linear1dZupsample_linear1dlinearzaten::upsample_bilinear2dZupsample_bilinear2dzaten::upsample_trilinear3dZupsample_trilinear3dc                    s(   t dddtj fdd}|S )NTFc                    sb   t | |\}}t  t |}|r8t d|S |d krPt | || }| jd||dS )Nzalign_corners == TrueResizer   )r   Z_get_interpolate_attributesZ_interpolate_warning_maybe_get_scalarZ_unimplementedZ_interpolate_size_to_scalesrI   )r3   ro   Zoutput_sizer-   scalesalign_cornersrS   interpolate_moderZ   r*   r/   rx   B  s"      

   z!_interpolate.<locals>.symbolic_fn)r   ry   r   r   )rZ   rS   r   rx   r*   r   r/   _interpolate(  s    r   zaten::__interpolatec           	      C   s*   t | |||||\}}| jd|||dS )Nr   r   )r   Z _interpolate_get_scales_and_moderI   )	r3   ro   sizeZscale_factormoder   Zrecompute_scale_factorZ	antialiasr   r*   r*   r/   __interpolateU  s         r   c                 C   s`  |rTt | |dg}t | |dg}t|trB| jdt|d}t | |dg}nt|t|kshtt|t|ks|t|d kst|t|kstt|dkr|d dkr|d dkr|d kst|dkr|d dkr|S | jdt|d}| jdt|d}| jdt|d}|d kr8| d||||S | jdt|d}| d|||||S )Nr   r?   rB   rF       Slice)	r   _unsqueeze_helperr   r   rI   rJ   rK   r5   r   )r3   ro   rh   ri   rj   stepsdynamic_slicer*   r*   r/   _sliceg  s:    







r   zaten::slicec              	   G   s|  t |dkr|\}}}}n(t |dkr6|\}}}d}ntd||  dko`t| tj}|  dkot| tj}|  dk}	|  dk}
t	
|d}|s|	rt|ts|s|
rt|ts |  dkr d}|r| jd	tdd
}|rb| jd	tdd
}nB|r*dn
t	
|dg}|rBdn
t	
|dg}t	
|dg}d}t	j| |||||g|dS )Nr   rY   r   zUnknown aten::slice signaturezprim::Constantzonnx::ConstantrP   Tr?   rB   r   F)rh   ri   rj   r   r   )r5   r   SymbolicValueErrornodekindr   typer   ZNoneTyper   Z
_parse_argr   rI   rJ   rK   rm   )r3   r9   r-   rS   startendstepZis_start_noneZis_end_noneZis_start_onnx_constZis_end_onnx_constr   r*   r*   r/   r%     sd    
  z
aten::flipr]   c              	   C   s4   t j| ||dgt| dgt| dgt| dS )Nl )rh   ri   rj   r   )r   rm   r5   )r3   ro   Zdimsr*   r*   r/   r     s    z
aten::fmodc                 C   s   | j d||ddS )NrC   rF   rD   )rI   )r3   ro   r:   r*   r*   r/   r     s    zaten::embedding_bagc
                 C   s  |rt jrtdS |	d k	r,|	dkr,tdtd t|d}
|
d k	r|r^|
d }|}n4|
}|| jdt	
tjgdg}| jd|d	di}g }t|D ]8}t| t| |t	
dt	
|dg}t| t| |t	
dt	
|d dg}| jdt	
dgd}| d
||||}| d||}t|sj| d
||||}t| |dg}| d||}|dkrtj| |dgdd}n4|dkr| jd|dgdd}n| jd|dgdd}t| |dg}|| q| jd|d	di}|d d d fS tdS d S )Nz7embedding_bag with scale_grad_by_freq for training moder   zembedding_bag with padding_idxzExport of embedding_bag with dynamic input/offsets shape is not supported in opset 10. Please use opset 11 or higher to export model for dynamic input shape.'rF   r?   rB   Concataxis_ir   ZGatherZMul)Zaxes_iZ
keepdims_iZ
ReduceMeanZ	ReduceMaxziembedding_bag with unknown shape of offsets for opset 10 is not supported. please use opset 11 or higher.)r   )r   )r
   Zexport_trainingr   Z_onnx_unsupportedRuntimeErrorwarningswarnZ_get_tensor_dim_sizerI   rJ   rK   sysmaxsizerl   r   r6   selectZ_is_noneZ_reducesum_helperappend)r3   Zembedding_matrixrv   offsetsZscale_grad_by_freqr   sparseZper_sample_weightsZinclude_last_offsetZpadding_idxZoffsets_dim_0Z
offset_lenZoffsets_extendedlist_rP   Zstart_end_Zaxes_Zindices_rowZ
embeddingsZper_sample_weights_rowr   r*   r*   r/   r     s    

         
   
z%aten::fake_quantize_per_tensor_affine   c              	   C   s   ||fdkrt dddd| ||fdkrDtd| d| d	|t |}|d krht dddd
| | j}|dkr| jd|tj	j
d}n| jd|tj	jd}| d| d|||||S )N)r   r   r   r(      z=Quantize range (0, 127) not supported, requires opset 13 Clip))r      )r   r   zLFor (quant_min, quant_max), ONNX allows only (0, 255) and (-128, 127). Got (z, )z Non-constant scale not supportedr   CastZto_iZDequantizeLinearZQuantizeLinear)r   Z _onnx_opset_unsupported_detailedr   r   r   floatdatarI   _C_onnxTensorProtoDataTypeZUINT8ZINT8)r3   inputsscale
zero_pointZ	quant_minZ	quant_maxr*   r*   r/   r   '  s@    

zaten::isinfc                 C   s   |  dt| |dS )NZIsInfF)rI   r6   Z_cast_Doubler3   ro   r*   r*   r/   r   X  s    zaten::isfinitec                 C   s,   t | |}t| |}t| t| ||S r)   )r   r6   isnanZ__not_Z__or_)r3   ro   Zinf_nodeZnan_noder*   r*   r/   r   ^  s    
zaten::quantize_per_tensorc                 C   sL   t |dd}| jd|t| d}| jd|tjjd}t 	| |||S )NrP   rA   r   r   )
r   Z
_get_constrI   r   JitScalarTypeZ	onnx_typer   r   FLOATquantize_helper)r3   ro   r   r   rA   r*   r*   r/   r   f  s      zaten::dequantizec                 C   s   t | |d S r4   r   dequantize_helperr   r*   r*   r/   r   r  s    zaten::nan_to_numfc                 C   s6  t |s|S tj|   }|d kr2d}t	| |}| 
d|| j
dtj|g|dd|}t|}|d kr||j}t| t| |t| || j
dtdgd}	| 
d|	| j
dtj|g|dd|}
|d kr|j}t| t| |
t| |
| j
dtdgd}| 
d|| j
dtj|g|dd|
S )Nr}   rG   r?   r@   rB   r   )r   rH   r   r   	from_namer   Z
scalarTyperA   r6   r   rI   rJ   rK   finfomaxlogical_andr   gtZ
LongTensorminlt)r3   ro   nanZposinfZneginfZinput_dtypeZnan_condZ
nan_resultr   Zposinf_condZnan_posinf_resultZneginf_condr*   r*   r/   r   x  sV    
	
  zquantized::linearc                 C   sl   t | |\}}}}t | |\}	}
}}t | |||
}t | |\}}}}t| ||	|}t | |||S r)   )r   r   requantize_bias_helperr6   r   r   )r3   q_inputq_weightbiasop_scaleop_zero_pointro   input_scalerf   weightweight_scaleq_biasr   r*   r*   r/   r"     s    zquantized::addc                 C   sF   t | |\}}}}t | |\}}}}t| ||}t | |||S r)   )r   r   r6   addr   r3   xyr   r   rf   r   r*   r*   r/   r     s    zquantized::add_reluc                 C   sR   t | |\}}}}t | |\}}}}t| ||}t| |}t | |||S r)   )r   r   r6   r   relur   r   r*   r*   r/   r     s
    zquantized::mulc                 C   sF   t | |\}}}}t | |\}}}}t| ||}t | |||S r)   )r   r   r6   mulr   r   r*   r*   r/   r#     s    zquantized::hardswishc                 C   s0   t | |\}}}}t| |}t | |||S r)   )r   r   r6   Z	hardswishr   r3   r   r   r   rf   r   r*   r*   r/   r     s    zquantized::sigmoidc                 C   s0   t | |\}}}}t| |}t | |||S r)   )r   r   r6   Zsigmoidr   r   r*   r*   r/   r$     s    zquantized::leaky_reluc                 C   s4   t | |\}}}}t| |||}t | |||S r)   )r   r   r6   Z
leaky_relur   )r3   r   Znegative_slopeZinplacer   r   rf   r   r*   r*   r/   r!     s    zquantized::layer_normc           
   	   C   s:   t | |\}}}}t| |||||d}	t | |	||S NF)r   r   r6   Z
layer_normr   )
r3   r   Znormalized_shaper   r   epsr   r   rf   r   r*   r*   r/   r      s    zquantized::group_normc           
   	   C   s:   t | |\}}}}t| |||||d}	t | |	||S r   )r   r   r6   Z
group_normr   )
r3   r   Z
num_groupsr   r   r   r   r   rf   r   r*   r*   r/   r     s    zquantized::instance_normc           
      C   s@   t | |\}}}}t| |||d d dd|d
}	t | |	||S )NFr}   )r   r   r6   Zinstance_normr   )
r3   r   r   r   r   r   r   ro   rf   r   r*   r*   r/   r   (  s             zquantized::conv2d_reluc
              
   C   s   t | |\}
}}}t | |\}}}}t | |||}t | |\}}}}t| |
||||||}t| |}t | |||	S r)   )r   r   r   r6   conv2dr   r   r3   r   r   r   rq   rr   rs   groupsr   r   ro   r   rf   r   r   r   r   r*   r*   r/   r   =  s    zquantized::conv2dc
              
   C   st   t | |\}
}}}t | |\}}}}t | |||}t | |\}}}}t| |
||||||}t | |||	S r)   )r   r   r   r6   r   r   r   r*   r*   r/   r   V  s    zquantized::cat)r3   q_inputsrS   r   r   returnc                    s@   t |} fdd|D } jd|d|i}t  |||S )Nc                    s   g | ]}t  |d  qS r   r   )re   ro   r2   r*   r/   rg   y  s    z!quantized_cat.<locals>.<listcomp>r   r   )r   )r   Z_unpack_listrI   r   )r3   r   rS   r   r   Zunpacked_inputsZdequantizedZconcatenatedr*   r2   r/   r   n  s    


)N)N)NF)r   r   )K	functoolsr   r   typingr   r   rJ   Ztorch._C._onnxr   Z_onnxr   Z
torch.onnxr   r   r   r   r	   r6   Ztorch.onnx._globalsr
   Ztorch.onnx._internalr   r   r   __all__partialZonnx_symbolicZ_onnx_symbolicr1   r   ZGraphContextr   rz   r8   r>   r&   r'   nnmodulesutilsZ_singleZ_pairZ_triplestrr   boolr{   r   r   r   r   r%   r   r   r   r   r   r   r   r   r   r"   r   r   r#   r   r$   r!   r    r   r   r   r   r   r   r*   r*   r*   r/   <module>   s
  	 
   
   
  


"5,  #/
T  .
6	
	
