U
    •Ê¹jiø  ã                   @  s	  U d dl mZ d dlZd dlZd dlZd dlZd dlZd dlmZmZm	Z	m
Z
mZmZmZmZmZmZ d dlZd dlm  mZ d dlmZ d dlmZmZmZmZ d dlmZ d dlmZmZ d dl m!Z! d	d
ddddddddddddgZ"e
d Z#ej$�d ddddœdd„ƒZ%ej$dddœd d!„ƒZ&ej$d"d#œd$d%„ƒZ'ej$d&dd'œd(d)„ƒZ(ej$d*d+„ ƒZ)ej$d,d-„ ƒZ*ej$d"d.d/œd0d1„ƒZ+ej$d"d2d3œd4d5„ƒZ,ej$d"d2d3œd6d7„ƒZ-ej$d8d9d/œd:d;„ƒZ.ej$dd<œd=d„ƒZ/ej$ddd>d?œd9d@dAd9dBœdCd„ƒZ0ej$d8dDdEœdFdG„ƒZ1ej$dHdI„ ƒZ2ej$d8d9dEœdJdK„ƒZ3ej$d8d9dEœdLdM„ƒZ4ej$d8d9dNœdOdP„ƒZ5ej$d"d9dEœdQdR„ƒZ6dSdTdUœdVdW„Z7ej$d"d9dEœdXdY„ƒZ8ej$d"d9dEœdZd[„ƒZ9ej$d"d9dEœd\d]„ƒZ:ej$d"d9dEœd^d_„ƒZ;ej$d"d9dEœd`d„ƒZ<ej$d9daœdbd„ƒZ=ej$d"dAdEœdcdd„ƒZ>ej$�dd"d9deœdfdg„ƒZ?ej$d"dhdAdiœdjdk„ƒZ@ej$d"dAdlœdmdn„ƒZAej$�ddddodpdqœdrds„ƒZBej$�dddodtduœdvdw„ƒZCej$�dddhdhdodtdxœdydz„ƒZDej$�dddhdhddodtd{œd|d}„ƒZEej$dd~œdd€„ƒZFej$d�daœd‚dƒ„ƒZGej$�dd„d…œd†d‡„ƒZHej$�dd„d…œdˆd‰„ƒZIej$d9daœdŠd‹„ƒZJej$d9daœdŒd�„ƒZKej$d„d…œdŽd�„ƒZLej$�dd„d…œd�d‘„ƒZMej$�d	d„d…œd“d”„ƒZNej$d„d…œd•d–„ƒZOej$d—d˜„ ƒZPej$d„d…œd™dš„ƒZQej$d„d…œd›dœ„ƒZRej$�d
d„d…œdždŸ„ƒZSej$d„d…œd d¡„ƒZTej$d„d…œd¢d£„ƒZUej$d„d…œd¤d¥„ƒZVej$d„d…œd¦d§„ƒZWej$d„d…œd¨d©„ƒZXej$d„dªdªd9dd«œd¬d­„ƒZYej$d®d¯„ ƒZZej$d„d…œd°d±„ƒZ[ej$d„d…œd²d³„ƒZ\ej$d„d…œd´dµ„ƒZ]ej$d„d…œd¶d·„ƒZ^ej$d„d…œd¸d¹„ƒZ_ej$�dd„dºd»œd¼d½„ƒZ`ej$d„d…œd¾d¿„ƒZaej$d„d…œdÀdÁ„ƒZbej$d„d…œdÂdÃ„ƒZcej$�dd„d…œdÄdÅ„ƒZdej$d„d…œdÆdÇ„ƒZeej$dÈdÉdÊdËœdÌdÍ„ƒZfej$dhddpdÎœdÏd„ƒZgej$d„d…œdÐdÑ„ƒZhej$dÒdÓ„ ƒZiej$dÔdÕ„ ƒZjej$d„d…œdÖd×„ƒZkej$�dd„d"dØdÙdÚœdÛd„ƒZlej$�dd„d"d"d"dod"dÜœdÝd„ƒZmej$�dd„d…œdÞd„ƒZnej$dßd	„ ƒZoe pdàdádâ¡dhdãœdädå„ƒZqe pdàdádâ¡dædç„ ƒZre pdàdádâ¡d9dèœdédê„ƒZsejtjuejtjvejtjwejtjxejtjyejtjzejtj{ejtj|ejtj}ejtj~ejtjejtj€ejtj�dëœZ‚dìdídîdïdðdñdòdódôdõdöd÷dødùdúdûœZƒej„ej…ej†ej‡ejˆej‰ejŠej‹ejŒej�ejŽej�ej�ej‘ej’ej“gZ”ej„ej…ej‹ejŠej‰ej‡ejˆej†ej�ej�ejŽej�ej‘ej’ej“düœZ•e‚dì e‚dí e‚dó e‚dñ e‚dò e‚dð e‚dï e‚dî e‚dý e‚dõ e‚dö e‚dô e‚dí e‚dì e‚dñ e‚dú gZ–e—ƒ Z˜dþe™dÿ< dS (  é    )ÚannotationsN)
ÚAnyÚCallableÚListÚLiteralÚNoReturnÚOptionalÚSequenceÚSetÚTupleÚUnion)Ú_C)Ú
_constantsÚ_deprecationÚ_type_utilsÚerrors)ÚGLOBALS)Ú	_beartypeÚ	jit_utils)ÚNumberÚargs_have_same_dtypeÚcast_pytorch_to_onnxÚcheck_training_modeÚdequantize_helperÚis_caffe2_aten_fallbackÚis_complex_valueÚ
parse_argsÚpytorch_name_to_typeÚquantize_helperÚquantized_argsÚrequantize_bias_helperÚscalar_name_to_pytorchÚscalar_type_to_onnxÚscalar_type_to_pytorch_type)	ÚvÚiÚisÚfÚfsÚbÚsÚtÚnoneÚ_ValueDescriptorzOptional[str])ÚdescÚarg_nameÚ	node_namec              	   C  s´  |dkr| S |dkst | ƒs | S |  ¡ }| ¡ r4d S | ¡ dkrÞt|dƒ}|dkrZt|ƒS |dkrjt|ƒS |dkrzt|ƒS |dkrŠt|ƒS |d	kr–|S |d
kr¬dd„ |D ƒS |dkrÂdd„ |D ƒS t	 
d|› d|› d�| ¡‚n‚| ¡ dk�r`|d
k�rL| ¡ D ]6}| ¡ }| ¡ dk� rþt	 
d|› d|› d�| ¡‚� qþdd„ |  ¡  ¡ D ƒS t	 
d|› d�| ¡‚|d k�st|d k�rŒt	 
d| ¡ › d�| ¡‚t	 
d|› d|› d| ¡ › d�| ¡‚d S )Nr,   r$   úonnx::ConstantÚvaluer%   r'   r)   r*   r+   r&   c                 S  s   g | ]}t |ƒ‘qS © )Úint©Ú.0r$   r3   r3   úY/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/onnx/symbolic_helper.pyÚ
<listcomp>]   s     z_parse_arg.<locals>.<listcomp>r(   c                 S  s   g | ]}t |ƒ‘qS r3   )Úfloatr5   r3   r3   r7   r8   _   s     z5ONNX symbolic does not understand the Constant node 'z' specified with descriptor 'ú'.úprim::ListConstructzFailed to export a node 'z' (in list node z_) because it is not constant. Please try to make things (e.g. kernel sizes) static if possible.c                 S  s   g | ]}t t| ¡ d ƒƒ‘qS ©r2   )r4   Ú	_node_getÚnoder5   r3   r3   r7   r8   r   s     zbONNX symbolic does not know how to unpack the ListConstruct node that is not a list of integers: 'ú'z*Expected node type 'onnx::Constant', got 'z2Expected node type 'onnx::Constant' for argument 'z' of node 'z', got ')Ú	_is_valuer>   Ú
mustBeNoneÚkindr=   r4   r9   ÚboolÚstrr   ÚSymbolicValueErrorÚinputs)r2   r.   r/   r0   r>   Znode_valr$   Zelement_noder3   r3   r7   Ú
_parse_argA   sd    
ý
û
ýþýrG   z_C.NoderD   )r>   Úkeyc                 C  s(   t | tjƒst‚|  |¡}t| |ƒ|ƒS )z@Gets attributes of a node which is polymorphic over return type.)Ú
isinstancer   ÚNodeÚAssertionErrorZkindOfÚgetattr)r>   rH   Úselr3   r3   r7   r=   ‡   s    
r=   z_C.Valuer<   c                 C  s   |   ¡  ¡ dkS )z$Whether a Value is an ONNX constant.r1   ©r>   rB   r<   r3   r3   r7   Ú_is_onnx_constant�   s    rO   z9Optional[Union[_C.Value, torch.Tensor, Number, Sequence]]©r2   Ú
descriptorc                 C  s"   t | tjƒrt| ƒrt| |ƒS | S ©N)rI   r   ÚValuerO   rG   rP   r3   r3   r7   Ú_maybe_get_const•   s    
rT   c                 C  s(   t | dƒ}t|tjƒr$|jdkr$|S | S )Nr+   r3   )rT   rI   ÚtorchÚTensorÚshape)r2   Úvalue_tr3   r3   r7   Ú_maybe_get_scalar¢   s    
rY   c                 C  s,   t | ƒs"t d|› d| › d�| ¡‚t| |ƒS )Nz0ONNX symbolic expected a constant value of the 'z' argument, got 'r?   )Ú_is_constantr   rE   rG   )r2   r.   r/   r3   r3   r7   Ú
_get_constª   s    ýr[   zList[_C.Value])Ú
list_valueÚreturnc                 C  s4   |   ¡ }| ¡ dkr(t d|› d�| ¡‚t| ¡ ƒS )Nr;   z;ONNX symbolic expected node type prim::ListConstruct, got 'r:   )r>   rB   r   rE   ÚlistrF   )r\   Z	list_noder3   r3   r7   Ú_unpack_listµ   s    
ýr_   zTuple[_C.Value, ...])Útuple_valuer]   c                 C  s4   |   ¡ }t| ƒs(t d| ¡ › d�| ¡‚t| ¡ ƒS )Nz>ONNX symbolic expected node type 'prim::TupleConstruct', got 'r:   )r>   Ú_is_tuple_constructr   rE   rB   ÚtuplerF   )r`   Ú
tuple_noder3   r3   r7   Ú_unpack_tupleÁ   s    ýrd   c                 C  s`   |   ¡ }t| ƒs4t d|› d| ¡ › dtj› �| ¡‚t| ¡ ƒ}t	|ƒdks\t	|ƒdks\t
‚|S )zöUnpacks a quantized tensor into a tuple of tensor and scale/zero_point.
    Args:
        tuple_value: A tuple of tensor, scale, zero_point, and optionally axis.
    Returns:
        A tuple of tensor, scale, zero_point, and optionally axis.
    z&ONNX symbolic expected the output of `zQ` to be a quantized tensor. Is this likely due to missing support for quantized `z`. Please create an issue on é   é   )r>   ra   r   rE   rB   r   ÚPYTORCH_GITHUB_ISSUES_URLrb   rF   ÚlenrK   )r`   rc   Úunpackedr3   r3   r7   Ú_unpack_quantized_tensorÍ   s    ürj   r   rC   c                 C  s   t | ƒo|  ¡  ¡ dkS )Nr;   ©r@   r>   rB   )r\   r3   r3   r7   Ú_is_packed_listå   s    rl   ©Úarg_descriptorsc                    s   ‡ fdd„}|S )aå  A decorator which converts args from torch._C.Value to built-in types.

    For example:

    ```
    @parse_args('v', 'i', 'fs')
    foo(g, a, b, c):
        assert isinstance(a, torch._C.Value)
        assert isinstance(b, int)
        assert isinstance(c, list)
        assert isinstance(c[0], float)
    ```

    Args:
        arg_descriptors: list of str, where each element is
            a string that specifies the type to convert to. Valid descriptors:
            "v": no conversion, keep torch._C.Value.
            "i": int
            "is": list of int
            "f": float
            "fs": list of float
            "b": bool
            "s": str
            "t": torch.Tensor
            "none": the variable is unused
    c                   s"   ˆˆ _ t ˆ ¡‡‡ fdd„ƒ}|S )Nc              	     s  d}t ˆƒt |ƒks>tdt |ƒ› dt ˆƒ› dˆj› d|› �ƒ‚z*t ˆ¡}t|j ¡ ƒdd … }ˆj‰ W n& tk
rŽ   d gt |ƒ }d ‰ Y nX ‡ fdd„t	|ˆ|ƒD ƒ}t |ƒdksÌtd	ˆj› d
|› �ƒ‚t |ƒdkröd|ksötd	ˆj› d|› �ƒ‚ˆ| f|ž|ŽS )NzÛIf you believe this is not due to custom symbolic implementation within your code or an external library, please file an issue at https://github.com/pytorch/pytorch/issues/new?template=bug-report.yml to report this bug.z,A mismatch between the number of arguments (z) and their descriptors (z") was found at symbolic function 'z'. é   c                   s    g | ]\}}}t |||ˆ ƒ‘qS r3   )rG   )r6   ÚargZarg_descr/   ©Úfn_namer3   r7   r8   !  s   ÿzBparse_args.<locals>.decorator.<locals>.wrapper.<locals>.<listcomp>zSymbolic function z4's '**kwargs' can contain a single key/value entry. Ú_outputsz='s '**kwargs' can only contain '_outputs' key at '**kwargs'. )
rh   rK   Ú__name__ÚinspectÚ	signaturer^   Ú
parametersÚkeysÚ	ExceptionÚzip)ÚgÚargsÚkwargsZFILE_BUG_MSGÚsigÚ	arg_names)rn   Úfnrq   r7   Úwrapper
  s.    ÿ$ÿ




þÿ
ÿz.parse_args.<locals>.decorator.<locals>.wrapper)Z_arg_descriptorsÚ	functoolsÚwraps©r€   r�   rm   ©r€   r7   Ú	decorator  s    )zparse_args.<locals>.decoratorr3   )rn   r†   r3   rm   r7   r   ê   s    /T)ÚscaleÚ
zero_pointÚquantize_outputzOptional[float]zOptional[int])Úarg_q_descriptorsr‡   rˆ   r‰   c                   s   ‡ ‡‡‡fdd„}|S )a  A decorator which extends support for quantized version of the base operator.

    Quantization is detected by examining the arguments that are annotated by
    `arg_q_descriptors`.

    If quantization is detected, the base operator symbolic function will be wrapped with
    argument de-quantization and output quantization.

    Otherwise, only the base symbolic function will be invoked.

    For example:

    ```
    @quantized_args(True, False)
    def foo(g, x, y):
        return x + y
    ```

    is equivalent to

    ```
    def q_foo(g, x, y):
        if is_quantized_tensor(x):
            x = dequantize(x)
            out = foo(g, x, y)
            return quantize(out)
        else:
            return foo(g, x, y)
    ```

    Args:
        arg_q_descriptors: A sequence of bool, where each element represents if the
          argument is QTensor for quantized version of this operator. It defaults
          to False for unspecified (variable length) arguments.
        scale: Quantized output scale. If None, derive from
          the first quantized input scale.
        zero_point: Quantized output zero point. If None,
          derive from the first quantized input zero point.
        quantize_output: If True, quantize the output of the base operator. Default is True
    c                   s"   t  ˆ ¡‡‡ ‡‡‡fdd„ƒ}|S )Nc                   sö  ˆd k	r| j dt ˆ¡d�}nd }ˆd k	r@| j dt ˆ¡d�}nd }ˆ dt|ƒtˆ ƒ   }tt||ƒƒ}dd„ }tƒ }|D ]D\}	}
t|
ƒr°|
 ¡  	¡ D ]}| 
||	|ƒ¡ q˜q|| 
||	|
ƒ¡ q|t|ƒsÚˆ| f|ž|ŽS g }|D ]Æ\}	}
||	|
ƒ�r0t| |
ƒ\}}}}| 
|¡ |d k�r |}|d k�r¨|}qât|
ƒ�rž|
 ¡  	¡ D ]J}||	|ƒ�rFt| |ƒ\}}}}|d k�rv|}|d k�r„|}| |¡ �qF| 
|
¡ qâ| 
|
¡ qâˆ| f|ž|Ž}|d k	�sÌtdƒ‚|d k	�sÞtdƒ‚ˆ�ròt| |||ƒS |S )NÚConstant©rX   )Fc                 S  s   | ot |ƒot|ƒS rR   )r@   ra   )rQ   rp   r3   r3   r7   Ú_is_arg_quantized}  s    zMquantized_args.<locals>.decorator.<locals>.wrapper.<locals>._is_arg_quantizedz-Bug: Scale must be set for quantized operatorz2Bug: Zero point must be set for quantized operator)ÚoprU   Útensorrh   rb   rz   r^   rl   r>   rF   ÚappendÚanyr   ZreplaceAllUsesWithrK   r   )r{   r|   r}   Z_scaleZ_zero_pointZarg_q_descriptors_extendedZdescriptor_argsr�   Zis_quantizedrQ   rp   Z	arg_inputZnon_quantized_argsZdequantized_argZ	arg_scaleZarg_zero_pointÚ_Úoutput)rŠ   r€   r‰   r‡   rˆ   r3   r7   r�   j  sp    ÿ ÿ



û

ÿþz2quantized_args.<locals>.decorator.<locals>.wrapper)r‚   rƒ   r„   ©rŠ   r‰   r‡   rˆ   r…   r7   r†   i  s    Rz!quantized_args.<locals>.decoratorr3   )r‡   rˆ   r‰   rŠ   r†   r3   r”   r7   r   9  s    0VzOptional[Number])Úxr]   c                 C  s"   t | tjƒr| jdkr|  ¡ S dS )z,Convert a scalar tensor into a Python value.r3   N)rI   rU   rV   rW   Úitem©r•   r3   r3   r7   Ú_scalarÂ  s    r˜   c                 C  sJ   t | tjƒr| S tj |tjj¡}|tjjkrF| ¡  ¡ }t	| |ƒƒ S | S )zÔ
    Convert self into the same type of tensor, as necessary.
    We only support implicit casting for scalars, so we never
    actually need to insert an ONNX cast operator here; just
    fix up the scalar.
    )
rI   r   rS   r   ÚJitScalarTypeÚ
from_valueÚ	UNDEFINEDZscalar_nameÚlowerrL   )Úselfr�   Úscalar_typeÚtyr3   r3   r7   Ú_if_scalar_type_asÊ  s     ÿr    c                 C  s$   | d kp"t | tjƒr |  ¡  ¡ S dS ©NF)rI   r   rS   r>   rA   r—   r3   r3   r7   Ú_is_noneÞ  s    r¢   c                 C  s   t | tjƒS rR   )rI   r   rS   r—   r3   r3   r7   r@   ã  s    r@   )r2   r]   c                 C  s   t | ƒ p|  ¡  ¡ dkS )N>   r1   úprim::Constantrk   r<   r3   r3   r7   rZ   è  s    rZ   c                 C  s   |   ¡  tj ¡ ¡S rR   )ÚtypeZisSubtypeOfr   Ú
TensorTypeÚgetr—   r3   r3   r7   Ú
_is_tensorð  s    r§   z
_C.JitTypezOptional[_C.ListType])Újit_typer]   c                 C  s   t | tjƒr| S d S rR   )rI   r   ÚListType)r¨   r3   r3   r7   Ú_as_list_typeö  s    rª   c                 C  s   t |  ¡ ƒd k	S rR   )rª   r¤   r—   r3   r3   r7   Ú_is_listü  s    r«   c                 C  s(   t |  ¡ ƒ}|d krdS t| ¡ tjƒS r¡   )rª   r¤   rI   ZgetElementTyper   r¥   ©r•   Úx_typer3   r3   r7   Ú_is_tensor_list  s    r®   c                 C  s,   t |  ¡ ƒ}|dkrdS tj | ¡}| ¡ S )z±Checks if x is a scalar list, for example: List[float], List[int].

    Besides checking the type is ListType, we also check if the data type is
    a valid ONNX data type.
    NF)rª   r¤   r   r™   rš   Zonnx_compatible)r•   r­   rž   r3   r3   r7   Ú_is_scalar_list	  s
    r¯   c                 C  s   |   ¡  ¡ dkS )Núprim::TupleConstructrN   r—   r3   r3   r7   ra     s    ra   c                 C  s4   t | ƒst‚tj | tjj¡tjjtjjtjjhkS rR   )	r@   rK   r   r™   rš   r›   Z	COMPLEX32Ú	COMPLEX64Ú
COMPLEX128r—   r3   r3   r7   r     s     ÿýþ)r]   c                   C  s   t jtjjkotjS rR   )r   Úoperator_export_typeÚ_C_onnxÚOperatorExportTypesZONNX_ATEN_FALLBACKÚ_CAFFE2_ATEN_FALLBACKr3   r3   r3   r7   r   (  s    þc                 C  s6   t | ƒr|  ¡ d krd S |  ¡ }t tj|¡}| ¡ S rR   )r§   r¤   ÚtypingÚcastr   r¥   Údimr¬   r3   r3   r7   Ú_get_tensor_rank0  s
    rº   )r•   Úallow_nonstaticc                 C  sB   t | ƒr|  ¡ d krd S |  ¡ }t tj|¡}|r:| ¡ S | ¡ S rR   )r§   r¤   r·   r¸   r   r¥   ZvaryingSizesÚsizes)r•   r»   r­   r3   r3   r7   Ú_get_tensor_sizes9  s    r½   r4   )r•   r¹   r]   c                 C  s   t | ƒ}|r|| S d S rR   )r½   )r•   r¹   r¼   r3   r3   r7   Ú_get_tensor_dim_sizeH  s    r¾   )r•   r¹   c                 C  sn   |dkr$t | ƒ}|d k	st‚|| S |d krjt| ƒ}|d k	s@t‚t|ƒD ] \}}|d k	rH|dkrH|  S qH|S )Néÿÿÿÿre   )rº   rK   r½   Ú	enumerate)r•   r¹   Ztensor_rankr¼   ÚindexÚsizer3   r3   r7   Ú_get_dim_for_crossN  s    
rÃ   zOptional[_C.Value]ÚNone)rŽ   Úmsgr2   r]   c                 C  sF   t jr t d| › d|› d�¡ n"tjt jjkrBt| › d|› �|ƒ d S )NúONNX export failed on z	 because z not supportedz, )	r´   r¶   ÚwarningsÚwarnr   r³   rµ   ZONNXÚ_onnx_unsupported)rŽ   rÅ   r2   r3   r3   r7   Ú_unimplemented^  s    rÊ   r   )Úop_namer2   r]   c                 C  s8   d| › dt j› �}t|tjƒr*t ||¡‚t |¡‚d S )Nz%Unsupported: ONNX export of operator zR. Please feel free to request support or submit a pull request on PyTorch GitHub: )r   rg   rI   r   rS   r   rE   ÚOnnxExporterError)rË   r2   Úmessager3   r3   r7   rÉ   g  s    ÿþrÉ   )rË   Úcurrent_opsetÚsupported_opsetr2   r]   c                 C  s>   d| › d|› d|› d�}t |tjƒr0t ||¡‚t |¡‚d S )NúUnsupported: ONNX export of ú
 in opset ú. Please try opset version Ú.©rI   r   rS   r   rE   rÌ   )rË   rÎ   rÏ   r2   rÍ   r3   r3   r7   Ú_onnx_opset_unsupportedv  s    ÿþrÕ   )rË   rÎ   rÏ   Úreasonr2   r]   c              	   C  sD   d| › d|› d|› d|› d�	}t |tjƒr6t ||¡‚t |¡‚d S )NrÐ   rÑ   z. rÒ   rÓ   rÔ   )rË   rÎ   rÏ   rÖ   r2   rÍ   r3   r3   r7   Ú _onnx_opset_unsupported_detailed‰  s    	ÿþr×   ©Únamec                   s   ‡ fdd„}|S )Nc                    s   t  dˆ › dtj› d�¡‚d S )NrÆ   z%, which is not implemented for opset z*. Try exporting with other opset versions.)r   rÌ   r   Úexport_onnx_opset_version)r|   r}   rØ   r3   r7   Úsymbolic_fnŸ  s    ÿz)_block_list_in_opset.<locals>.symbolic_fnr3   )rÙ   rÛ   r3   rØ   r7   Ú_block_list_in_opset�  s    rÜ   z#Optional[_type_utils.JitScalarType]c                  G  s4   | D ]*}t j |t jj¡}|t jjkr|  S qd S rR   )r   r™   rš   r›   )r|   rp   rž   r3   r3   r7   Ú_try_get_scalar_type©  s     ÿ
rÝ   zjit_utils.GraphContext)r{   c                 C  s®   t |ƒ}t|ƒ}t|ƒs0| jdt |g¡d�}n2|d k	rb|rb|dkrbt| || jdt dg¡d�ƒ}tj 	|tjj
¡}|tjjtjjhkrœ| jd|tjjd�}| jd|||d�S )	Nr‹   rŒ   r   ro   ÚCast©Zto_iÚGather©Úaxis_i)rY   rº   r@   rŽ   rU   Ú
LongTensorÚ_reshape_helperr   r™   rš   r›   ÚINT64ÚINTr´   ÚTensorProtoDataType)r{   r�   r¹   rÁ   Zapply_reshapeZindex_constZ	index_dimZindex_scalar_typer3   r3   r7   Ú_select_helper´  s*      ÿ ÿþrè   c                 C  sH   | j dkr&ddlm} || ||||ƒS ddlm} || |||||ƒS d S )Né	   r   )Ú_slice)ÚopsetÚtorch.onnx.symbolic_opset9rê   Ztorch.onnx.symbolic_opset10)r{   ÚinputÚaxesÚstartsÚendsZstepsZ_slice9Z_slice10r3   r3   r7   Ú_slice_helperÍ  s
    	
rñ   c                 C  s.   t j | t jj¡t jjt jjt jjt jjhkS rR   )r   r™   rš   r›   ÚFLOATÚDOUBLEZHALFÚBFLOAT16r<   r3   r3   r7   Ú_is_fpà  s     ÿüþrõ   c                 C  s   t j | t jj¡t jjhkS rR   )r   r™   rš   r›   ÚBOOLr<   r3   r3   r7   Ú_is_boolì  s     ÿþr÷   c                 C  sH   t |tjƒrt‚t |tƒr4| jdtj|tjd�d�S | jdt |¡d�S )a  Creates a wrapped number based on https://github.com/pytorch/pytorch/issues/9515.

    A Tensor is a considered a "wrapped number" if it is
    auto-wrapped from a C++ or Python number type. Integer types are
    wrapped as 0-dim int64 tensors and floating-point types are
    wrapped as 0-dim double tensors.

    The input to this function is constant value. If the data type
    is a floating point type, it is converted to a 0-dim double
    tensor, else it is converted to a 0-dim tensor of its original type
    r‹   ©ÚdtyperŒ   )rI   rU   rV   rK   r9   rŽ   r�   Údouble)r{   Úscalarr3   r3   r7   Ú_generate_wrapped_numberó  s    
rü   c              
   C  sŠ   |d k	rt ddƒ |  d|¡}|  d|| jdtj|gtjd�d�¡}| jdkrp|s\t dd	ƒ | jd
|||dd�S | jd
||||dd�S d S )NZSortúOut parameter is not supportedÚShaperà   r‹   rø   rŒ   é
   úAscending is not supportedÚTopKé   ©râ   Úoutputs)râ   Ú	largest_ir  )rÊ   rŽ   rU   r�   Úint64rë   )r{   rí   r¹   Z	decendingÚoutZshape_Z	dim_size_r3   r3   r7   Ú_sort_helper  s(    
ý

     ÿr  Fc              	   C  sÂ   |d k	rt ddƒ t|ƒs8| jdtj|gtjd�d�}nBt| || jdt dg¡d�ƒ}t|ƒtj	j
krz| jd|tjj
d�}| jd	kr¦|s’t dd
ƒ | jd|||dd�S | jd|||||dd�S d S )Nr  rý   r‹   rø   rŒ   ro   rÞ   rß   rÿ   r   r  r  )râ   r  Zsorted_ir  )rÊ   r@   rŽ   rU   r�   r  rä   rÝ   r   r™   rå   r´   rç   rë   )r{   rí   Úkr¹   ÚlargestÚsortedr  r3   r3   r7   Ú_topk_helper  s(    


      ÿr  c                 C  s>   | j dkr"ddlm} || ||ƒS ddlm} || ||ƒS d S )Né   r   )Últ)rë   Ztorch.onnx.symbolic_opset8r  rì   )r{   rí   ÚotherZ_lt8Z_lt9r3   r3   r7   Ú
_lt_helper0  s
    
r  c                 C  s6   t jdkrdnd}t d| d tt jƒ d ¡ d S )Nrÿ   zonnx:Resizezonnx:Upsamplez(You are trying to export the model with z for ONNX opset version aœ  . This operator might cause results to not match the expected results by PyTorch.
ONNX's Upsample/Resize operator did not match Pytorch's Interpolation until opset 11. Attributes to determine how to transform the input were added in onnx:Resize in opset 11 to support Pytorch's behavior (like coordinate_transformation_mode and nearest_mode).
We recommend using opset 11 and above for models using this operator.)r   rÚ   rÇ   rÈ   rD   )Úinterpolate_modeZonnx_opr3   r3   r7   Ú_interpolate_warning<  s    ÿÿþýýÿr  c                 C  sv   t |d ƒrN| jdkr>| jdtj|tjd�d�}|  d||¡S | jd||d�S | jdk rdt d|¡‚|  d||d ¡S )	Nr   é   r‹   rø   rŒ   Z	Unsqueeze©Úaxes_iz<Opset version must be >= 13 for Unsqueeze with dynamic axes.)rZ   rë   rŽ   rU   r�   Úlongr   rE   )r{   rí   r  rî   r3   r3   r7   Ú_unsqueeze_helperN  s    

 ÿr  c                 C  sÈ   t |d ƒrN| jdkr>| jdtj|tjd�d�}|  d||¡S | jd||d�S | jdk rdt d|¡‚|d }t|ƒ}|d k	s€t	‚|d	kr–t d
|¡‚n$|dkrºt
| |dgƒ}|  d||¡S |  d||¡S )Nr   r  r‹   rø   rŒ   ZSqueezer  z:Opset version must be >= 13 for Squeeze with dynamic axes.ro   zCFor Squeeze axses as input, the axes rank must be one in ONNX spec.)rZ   rë   rŽ   rU   r�   r  r   rE   rº   rK   r  )r{   rí   r  rî   Zaxes_tZ	axes_rankr3   r3   r7   Ú_squeeze_helper]  s,    

 ÿ ÿr  ro   c                 C  sv   t |dƒ}| jdkr`|rNt|ƒs:| jdtj|tjd�d�}| jd||||d�S | jd|||d�S | jd|||d�S d S )	Nr%   r  r‹   rø   rŒ   Z	ReduceSum)Ú
keepdims_iÚnoop_with_empty_axes_i)r  r  )rT   rë   r@   rŽ   rU   r�   r  )r{   rí   r  r  r  r3   r3   r7   Ú_reducesum_helperw  s,    

 ÿûür  c                   sÖ   t ˆdƒ‰tˆƒrœd}| jdtj|tjd�d�}| jdˆtjjd�}t	| |  dˆ¡d	gt
jg|gd
�}| jd|tjjd�}|  d||¡}| jd||d	d�}	n6‡ ‡‡fdd„td	ˆ ƒD ƒ}
| jdtj|
tjd�d�}	|	S )Nr&   r  r‹   rø   rŒ   rÞ   rß   rþ   r   ©rî   rð   rï   ÚDivÚConcatrá   c                   sD   g | ]<}|d k rdn*t ˆˆ |   ƒt ˆ ¡  ¡ ˆ |   ƒ ‘qS )r  ç      ð?)r9   r¤   r¼   ©r6   r%   ©r¹   rí   Úoutput_sizer3   r7   r8   ¥  s   ýÿÿz/_interpolate_size_to_scales.<locals>.<listcomp>)rT   r@   rŽ   rU   ÚonesÚfloat32r´   rç   rò   rñ   ÚsysÚmaxsizeÚranger�   )r{   rí   r"  r¹   ÚoffsetÚoffsetsZdividendZdivisorZ
scale_dimsÚscalesZscales_constantr3   r!  r7   Ú_interpolate_size_to_scales—  s.    
 
   ÿû ÿr+  c                 C  sv   t |d dƒdkot|d ƒ }|s(d S | jdtjdtjd�d�}| jdt t |d dƒ¡d�}| jd||dd	�}|S )
Nr   r(   r¿   r‹   r  rø   rŒ   r  rá   )rT   r¢   rŽ   rU   r#  r$  r�   )r{   r*  Zavailable_scalesr)  Zscales_listr3   r3   r7   Ú$_interpolate_get_scales_if_available²  s    ÿ ÿr,  c                 C  s@   |dkrd }|dd … }n|d }|dd … }t | |ƒ}||fS )NÚnearestr   ro   )r,  )r{   Úmoder|   Úalign_cornersr*  r3   r3   r7   Ú_get_interpolate_attributesÃ  s    
r0  c                   s¬   | j dtjdtjd�d�}tˆ ƒ}tˆ  ¡ tjƒsB|d k	rT|dkrT| j d|ˆ dd�S t	| ˆ dgƒ‰ | j dˆ t
jjd	�‰ ‡ fd
d„t|d ƒD ƒ}| j d|f|žddiŽ‰ ˆ S )Nr‹   r  rø   rŒ   r   r  rá   rÞ   rß   c                   s   g | ]}ˆ ‘qS r3   r3   r   ©Úscale_factorr3   r7   r8   Ü  s     z+_interpolate_get_scales.<locals>.<listcomp>râ   )rŽ   rU   r#  r$  rº   rI   r¤   r   r©   r  r´   rç   rò   r'  )r{   r2  r¹   r)  Zscale_factor_rankr*  r3   r1  r7   Ú_interpolate_get_scalesÏ  s"    ÿÿ  ÿr3  c                   s  t |dƒ}d|krd}d|kr"d}t|ƒ t |dƒ}t|tƒrL|rLtddƒS | ¡  ¡ sbtddƒS | ¡  ¡ }t|ƒs„t| ||ƒ}n|tˆ ƒsöt	ˆ ƒsæt ˆ dƒ ¡ d	k}|ræt
| ˆ d	gƒ‰ ‡ fd
d„t|d ƒD ƒ‰ | jdˆ ždd	iŽ‰ t| |ˆ |ƒ}n
tddƒS ||fS )Nr*   ÚlinearÚcubicr)   Zinterpolatezalign_corners == Trueúmissing input shaper+   r   c                   s   g | ]}ˆ ‘qS r3   r3   r   ©rÂ   r3   r7   r8   û  s     z4_interpolate_get_scales_and_mode.<locals>.<listcomp>r  r  râ   z.Both size and scales are None in __interpolate)r  )rT   r  rI   rC   rÊ   r¤   r¹   r¢   r3  rl   r  r'  rŽ   r+  )r{   rí   rÂ   r2  r.  r/  r¹   Ú	is_scalarr3   r7  r7   Ú _interpolate_get_scales_and_modeá  s6    



 ÿr9  ztorch._C.Value)r{   rí   r¹   ÚkeepdimrË   c                   s¦   ‡ ‡fdd„}t |ƒrŽtˆ |ˆ jdt dg¡d�ƒ}||ddd�}|rŠˆ  d	|¡}ˆ  d	|¡}	ˆ jd
|	tjdgtjd�d�}
ˆ  d||
¡}|S t|dƒ}||||d�S )Nc                   s0   ˆ j dkrˆ jˆ| ||dd�S ˆ jˆ| ||d�S )Né   F)râ   r  Zselect_last_index_i©râ   r  )rë   rŽ   )rí   râ   r  ©r{   rË   r3   r7   Ú
op_wrapper  s    
ûz)_argmin_argmax_helper.<locals>.op_wrapperr‹   r¿   rŒ   r   Fr<  rþ   ÚConstantOfShapero   rø   ÚReshaper%   )r¢   rä   rŽ   rU   r�   r  rG   )r{   rí   r¹   r:  rË   r>  Z	flattenedr“   Zinput_shapeZinput_shape_shapeZ	new_shaper3   r=  r7   Ú_argmin_argmax_helper  s(      ÿý
rA  c                   s   t dddƒ‡ fdd„ƒ}|S )NTFc                   s<  t | ˆ |ƒ\}}t|ƒ}ˆ dkr$dn
|r,dnd}|d krî|  d|¡}t| |dgdgdgd�}| jd	|tjjd
�}| jd||dd�}| jdkržt| ƒ}	t| ƒ}
n4| jdt	j
g t	jd�d�}	| jdt	j
g t	jd�d�}
| jd||	|
||dˆ dd�	S | jdk�rt| ƒ}	n| jdt	j
g t	jd�d�}	| jd||	||dˆ dd�S d S )Nr-  Ú
asymmetricr/  Ú
half_pixelrþ   r   r  r  rÞ   rß   r  rá   r  r‹   rø   rŒ   ÚResizeç      è¿Úfloor©Z coordinate_transformation_mode_sZcubic_coeff_a_fZmode_sZnearest_mode_s)r0  rY   rŽ   rñ   r´   rç   rå   rë   Ú"_optional_input_placeholder_tensorrU   r�   r$  )r{   rí   r"  r|   r*  r/  Úcoordinate_transformation_modeÚ
input_sizeZinput_size_begÚ	empty_roiÚempty_scales©r  r3   r7   rÛ   .  sz    ÿÿû    ÿ  ÿ

 ÿ ÿ÷
 ÿøz(_interpolate_helper.<locals>.symbolic_fn)r   )rÙ   r¹   r  rÛ   r3   rM  r7   Ú_interpolate_helper,  s    
>rN  c                   s8  t |dƒ}d|krd}d|kr"d}t |dƒ}t|tƒs:dn|}|dkrJdn
|rRdnd	}tˆ ƒ�sÂ|  d
|¡}t| |dgdgdgd�}z tˆ ƒ o t ˆ dƒ ¡ dk}	W n, tk
rÐ   tˆ ƒ }	|	sÌt	 
d¡ Y nX |	�r.t|ƒ}
|
d kròtddƒS t| ˆ dgƒ‰ ‡ fdd„t|
d ƒD ƒ‰ | jd#ˆ žddiŽ‰ | jdˆ tjjd�‰ | jd|ˆ dd�‰ | jdk�rrt| ƒ}t| ƒ}n4| jdtjg tjd�d�}| jdtjg tjd�d�}| jd|||ˆ |d|dd �	S t|ƒ}
|
d k�rÞtd!d"ƒS | jdk�rôt| ƒ}n| jdtjg tjd�d�}t| ||
ƒ}| jd||||d|dd �S d S )$Nr*   r4  r5  r)   Fr-  rB  r/  rC  rþ   r   r  r  r+   zkCannot verify if the output_size is a scalar while exporting interpolate. Assuming that it is not a scalar.z'interpolate (with a scalar output_size)z?missing input shape (try giving an array of output_size values)c                   s   g | ]}ˆ ‘qS r3   r3   r   r7  r3   r7   r8   ¤  s     z(__interpolate_helper.<locals>.<listcomp>r  râ   rÞ   rß   rá   r  r‹   rø   rŒ   rD  rE  rF  rG  zinterpolate (with scales)r6  )r  )rT   rI   rC   r¢   rŽ   rñ   rl   r¹   ÚAttributeErrorrÇ   rÈ   rº   rÊ   r  r'  r´   rç   rå   rë   rH  rU   r�   r$  r3  )r{   rí   rÂ   r2  r.  r/  Zrecompute_scale_factorrI  rJ  r8  ÚrankrK  rL  r*  r3   r7  r7   Ú__interpolate_helperp  s”    


ÿÿû

ÿ
ÿ
þ
 ÿ÷


ørQ  c                 C  sJ   | j dk rddlm} n$| j dkr0ddlm} nddlm} || |||ƒS )Né   r   )Úunbindr;  )rë   rì   rS  Útorch.onnx.symbolic_opset11Útorch.onnx.symbolic_opset13)r{   r�   r¹   rs   rS  r3   r3   r7   Ú_unbind_helperÔ  s    

rV  c                 C  s4   | j dkrddlm} nddlm} || ||||ƒS )Nrÿ   r   ©Úscatter)rë   rì   rX  rT  )r{   r�   r¹   rÁ   ÚsrcrX  r3   r3   r7   Ú_scatter_helperß  s    
rZ  c                 C  sp   | j dkr&| jd|dg| ||d�}n8ddlm} | jdt dg| ¡d�}|| ||||d	�}|dkrj|S |gS )
Nr;  ZSplitro   )Zsplit_irâ   r  r   )Úsplitr‹   rŒ   )rs   )rë   rŽ   rU  r[  rU   r�   )r{   r�   Úrepsr¹   Z	split_outr[  Úrepeatsr3   r3   r7   Ú_repeat_interleave_split_helperé  s    
r^  c                 C  s,  ddl m}m} t|ƒs,| jdt |¡d�}t|ƒ}t|dƒ}t	|ƒdkrj|  d|| jdt 
dg¡d�¡}|| ||d ƒ}|r®tjt	|ƒtjd�}	||	|d < | jd|	d�}
n^|  d	|| |d dƒ| jdt 
t	|ƒ¡d�| jd
| jdt 
dg¡d�|dd�¡}	|| |	ddƒ}
|  d||
¡}|| |||d ƒS )Nr   )ÚflattenÚ	unsqueezer‹   rŒ   r+   r@  ro   rø   ZOneHotr  rá   ZTile)rì   r_  r`  r§   rŽ   rU   rã   rZ   rT   rº   r�   r#  r  )r{   r�   r]  r¹   r_  r`  Zconst_repeatsr\  Z
unsqueezedZonehotZrepeats_per_dimZtiledr3   r3   r7   Ú-_repeat_interleave_single_value_repeat_helperõ  s:    
  ÿ   ÿú
ra  z\Tuple[_type_utils.JitScalarType, Optional[_C.Value], Optional[_C.Value], Optional[_C.Value]])r{   r]   c                 C  sÂ   dd„ }|d ks t |ƒrJt|ƒrJ||||gƒr8tjj}qbtj t ¡ ¡}nt|t	ƒsXt
‚t |¡}|rz| jd|| ¡ d�nd }|r–| jd|| ¡ d�nd }|r²| jd|| ¡ d�nd }||||fS )Nc                 S  s>   | D ]4}t j |t jj¡}|t jjkr|t jjkr dS qdS )NFT)r   r™   rš   r›   rå   )Zscalarsrû   rž   r3   r3   r7   Ú_is_all_integral)  s     ÿ
ÿ
þz-_arange_cast_helper.<locals>._is_all_integralrÞ   rß   )r@   r¢   r   r™   rå   Z
from_dtyperU   Zget_default_dtyperI   r4   rK   rŽ   Ú	onnx_type)r{   ÚendÚstartÚsteprù   rb  rž   r3   r3   r7   Ú_arange_cast_helper   s    	
ÿ
rg  c                 G  s2   | j dkrddlm} nddlm} || f|žŽ S )Nrÿ   r   )Úarange)rë   rì   rh  rT  )r{   r|   rh  r3   r3   r7   Ú_arange_helperK  s    
ri  c                 C  s8   |   d|¡}ddlm} || || j dt dg¡d�|ƒS )Nrþ   r   )Úselectr‹   rŒ   )rŽ   rì   rj  rU   r�   )r{   r�   r¹   Z
full_shaperj  r3   r3   r7   Ú_size_helperT  s    rk  c           
   	     s¾   ddl m} | jdkr$ddl m} nddlm} | ¡  ¡ d krJtddƒS | ¡  ¡ }t|dƒ‰ t	| |‡ fdd	„t
|ƒD ƒƒ}|| |  d
|¡dt	| |dgƒ|  d
|¡ƒ}|| ||d ƒ}	||	fS )Nr   )Úexpandrÿ   rW  Z
index_fillzinput rank not accessibler%   c                   s   g | ]}|ˆ kr|‘qS r3   r3   r   ©Z	dim_valuer3   r7   r8   p  s      z._index_fill_reshape_helper.<locals>.<listcomp>rþ   )rì   rl  rë   rX  rT  r¤   r¹   rÊ   rG   r  r'  rŽ   )
r{   r�   r¹   rÁ   rl  rX  Zself_dimZunsqueezed_indexZexpanded_index_shapeZexpanded_indexr3   rm  r7   Ú_index_fill_reshape_helper\  s,    


  ÿ 
   
ÿrn  c                 C  sl   t |dƒ}t|ƒs&| jdt |¡d�}| jdkrV|dkrHtdtjd|ƒ |  d||¡S | jd|||d	�S d S )
Nr&   r‹   rŒ   r  ro   zReshape with allowzero=1é   r@  )Zallowzero_i)	rT   r@   rŽ   rU   rã   rë   rÕ   r   rÚ   )r{   rí   rW   Z	allowzeror3   r3   r7   rä   ~  s    

   ÿrä   c              	   C  sr  ddl m} t|dƒ}t|dƒ}|d ks0t|ƒrr|d krDt d|¡‚tjdg| tj	 
|¡ ¡ d�}	| jd|	d�}|d ks‚t|ƒrÄ|d kr–t d|¡‚tjd	g| tj	 
|¡ ¡ d�}
| jd|
d�}|d ksæt|ƒsæ|d ksæt|ƒ�rf|d k	rö|d k	sút‚t| || jdtj||d
gtjd�d�ƒ}| jd|dddgd�}|| || jdtjddgtjd�d�ddƒ\}}||||fS )Nr   )Ú	_var_meanro   z@Unsupported: ONNX export of batch_norm for unknown channel size.r  rø   r‹   rŒ   g        r¿   Z	Transposer  )Zperm_iF)rì   rp  r¾   r¢   r   rE   rU   r�   r   r™   rš   rù   rŽ   rK   rä   r  )r{   rí   ÚweightÚbiasZrunning_meanZrunning_varrp  Z
batch_sizeZchannel_sizeZweight_valueZ
bias_valueZ
reshape_inZtrans_inr3   r3   r7   Ú_batchnorm_helper�  sf    

þþþþÿþýüþýûrs  zCallable[[Any], Sequence[int]]zUnion[int, Sequence[int]]zTuple[int, ...])Útuple_fnÚpaddingr]   c                 C  s*   |r|  ¡  ¡ dkrt|dƒ t| |ƒƒS )Nr£   Údivisor_override)r>   rB   rÊ   rb   )rt  ru  Zkernel_sizeZstriderv  rÙ   r3   r3   r7   Ú_avgpool_helperÇ  s    	
rw  )Úop_train_moderË   r]   c                 C  sn   t jtjjkrdS | r tjj}ntjj}|t jkr6dS dt| ƒ› �}t 	dt j› d|› d|› d|› d�	¡ dS )zMWarns the user if the model's training mode and the export mode do not agree.Nztrain=zONNX export mode is set to z, but operator 'z' is set to z. Exporting with rÓ   )
r   Ztraining_moder´   ZTrainingModeZPRESERVEZTRAININGZEVALrC   rÇ   rÈ   )rx  rË   Zop_mode_enumZop_mode_textr3   r3   r7   r   Õ  s    

ÿc                 C  sº   |   d|¡}t| |dgdg|gd�}|| j dtjdgtjd�d�g}||d k rŽt| |dg|d g|gd�}|| j dtjdgtjd�d�|g}| j d|žd
diŽ}	ddlm}
 |
| ||	ƒS )Nrþ   r   )rî   rï   rð   r‹   r¿   rø   rŒ   ro   r  râ   )Ú_reshape_from_tensor)r  )rŽ   rñ   rU   r�   r  rì   ry  )r{   rí   Z	start_dimZend_dimr¹   rJ  Zslice1ZslicesZslice3Zfinal_shapery  r3   r3   r7   Ú_flatten_helperï  s$         ÿýrz  c                 C  s,   |d krdS t | ƒr(|  ¡  ¡ dkr(dS dS )NFr1   Trk   )Zsplit_size_or_sizesrs   r3   r3   r7   Ú_is_split_static  s    ÿþr{  c                 C  s   |   d¡}| tj ¡ ¡ |S )Nr£   )rŽ   ZsetTyper   ZOptionalTypeZofTensor)r{   Únr3   r3   r7   rH    s    
rH  c                   sJ   t ˆ ƒ}|d k	r:t‡ fdd„t|ƒD ƒƒr:| j|ˆ dd�S | j|ˆ dd�S )Nc                 3  s   | ]}t ˆ |ƒd kV  qdS )r   N)r¾   r   ©r�   r3   r7   Ú	<genexpr>  s    z*_handle_reduce_dim_none.<locals>.<genexpr>ro   )r  r   )rº   r‘   r'  rŽ   )r{   r�   rË   rP  r3   r}  r7   Ú_handle_reduce_dim_none  s    ÿr  z%Optional[_C_onnx.TensorProtoDataType]z7Tuple[_C.Value, _C.Value, _C.Value, Optional[_C.Value]])r{   ÚqtensorÚqdtyper]   c                 C  sà   t |ƒ}|dd… \}}}t|ƒdkr.|d nd}t|ddƒ}tj |¡}	|dkrl|	dk	rd|	 ¡ }ntjj	}| j
d||d�}
| j
d|tjjd�}| j
d||d�}|dk	rÄtjdk rÄtd	tjdd
|ƒ | j
d	|
|||d�|||fS )a’  Appends to graph `g` ONNX nodes that dequantizes `qtensor` into `tensor`.

    Args:
        g: Graph, the ONNX IR graph that is under construction.
        qtensor: torch._C.Value, either a tuple of (quantized_tensor, scale, zero_point)
            for per tensor quantization, or
            (quantized_tensor, scale, zero_point, axis) for per channel quantization,
            representing the quantized tensor.
        qdtype: torch.onnx.TensorProtoDataType default None, if not None, represents the
            data type of quantized tensor. It must be either
            torch.onnx.TensorProtoDataType.UINT8 or torch.onnx.TensorProtoDataType.INT8.
    Nre   rf   r%   ÚaxisrÞ   rß   r  ZDequantizeLinearú Attribute axis is not supported.rá   )rj   rh   r[   r   r™   rš   rc  r´   rç   ÚUINT8rŽ   rò   r   rÚ   r×   )r{   r€  r�  Zunpacked_qtensorsr�   r‡   rˆ   r‚  râ   Zinput_qdtyper2   r3   r3   r7   r   #  s2    
û	ü)r{   r�   r‡   rˆ   r‚  r]   c              	   C  sö   |dk	r,t |ƒs,tjdk r,tdtjdd|ƒ |dk	s8t‚tj |tjj¡tjj	krf| j
d|tjj	d�}|dk	srt‚tj |tjj¡tjjtjjhkr¨| j
d|tjjd�}| j
d|||t|ddƒd	�}|||g}|dk	rèt |ƒsè| |¡ | j
d|žŽ S )ai  Appends to graph `g` ONNX nodes that quantizes `tensor` based on `scale`, `zero_point` and `axis`.

    Args:
        g: Graph, the ONNX IR graph that is under construction.
        tensor: torch._C.Value, representing the tensor to be quantized.
        scale: torch._C.Value, quantized scale.
        zero_point: torch._C.Value, quantized zero point.
        axis: Optional[torch._C.Value] default None, if None, represents per tensor quantization.
            Otherwise, represents per channel quantization, along given axis.

    Returns:
        A TupleConstruct storing information of the quantized tensor.
    Nr  ZQuantizeLinearrƒ  rÞ   rß   r%   r‚  rá   r°   )r°   )r¢   r   rÚ   r×   rK   r   r™   rš   r›   rò   rŽ   r´   rç   r„  ÚINT8r[   r�   )r{   r�   r‡   rˆ   r‚  r“   r|   r3   r3   r7   r   T  sP    ÿþýûÿÿ ÿþþ
û

c           
      C  sŠ   |   d||¡}|   d|¡}| j d|tjdgtjd�d�}| j d|   d||¡tjjd	�}g }	|d
k	rtt|ƒst|	 |¡ | j d|||f|	žŽ S )ad  In PyTorch, bias is float and is quantized to int32 implicitly inside the quantized ATen op kernel.
    In ONNX we need to make the quantization explicit because operators expect all of their inputs to be quantized.
    Since int32 is not a supported output type by ONNX operator `QuantizeLinear`, quantization is exported using
    regular operators.
    ZMulrþ   r?  r   rø   rŒ   rÞ   r  rß   Nr°   )	rŽ   rU   r�   r4   r´   rç   ÚINT32r¢   r�   )
r{   rr  Zinput_scaleZweight_scaler‚  Z
bias_scaleZbias_scale_shapeZbias_zero_pointZq_biasZ	axis_argsr3   r3   r7   r    ’  s     	  ÿ  ÿ
c                   s2   | st ‚tj | d ¡‰ t‡ fdd„| D ƒƒ}|S )Nr   c                 3  s   | ]}t j |¡ˆ kV  qd S rR   )r   r™   rš   )r6   Úelem©Z
base_dtyper3   r7   r~  ­  s    z'args_have_same_dtype.<locals>.<genexpr>)rK   r   r™   rš   Úall)r|   Zhas_same_dtyper3   rˆ  r7   r   ©  s    ÿz1.13z2.0z>remove its usage and avoid setting internal variables directly©Zopset_versionc                 C  s
   | t _d S rR   )r   rÚ   rŠ  r3   r3   r7   Ú_set_opset_version´  s    r‹  c                 C  s
   | t _d S rR   )r   r³   )r³   r3   r3   r7   Ú_set_operator_export_type½  s    rŒ  ©Úonnx_shape_inferencec                 C  s
   | t _d S rR   )r   rŽ  r�  r3   r3   r7   Ú_set_onnx_shape_inferenceÈ  s    r�  )ÚByteÚCharÚDoubleÚFloatÚHalfÚIntÚLongÚShortÚBoolÚComplexFloatÚComplexDoubleÚBFloat16Ú	Undefinedr�  r‘  r’  r“  r”  r•  r–  r—  r˜  r™  rš  ÚQInt8ÚQUInt8ÚQInt32r›  )Zuint8_tZint8_trú   r9   Úhalfr4   Zint64_tZint16_trC   Ú	complex64Ú
complex128Úqint8Úquint8Úqint32Úbfloat16)r�  r‘  r’  r“  r”  r•  r–  r—  r˜  r™  rš  r�  rž  rŸ  r›  rœ  zSet[int]Ú_quantized_ops)NN)T)N)N)N)N)T)N)TN)TFN)Nro   r   )NNN)r   )N)N)N)šÚ
__future__r   r‚   ru   r%  r·   rÇ   r   r   r   r   r   r   r	   r
   r   r   rU   Ztorch._C._onnxr   Z_onnxr´   Z
torch.onnxr   r   r   r   Ztorch.onnx._globalsr   Ztorch.onnx._internalr   r   Ztorch.typesr   Ú__all__r-   ZbeartyperG   r=   rO   rT   rY   r[   r_   rd   rj   rl   r   r   r˜   r    r¢   r@   rZ   r§   rª   r«   r®   r¯   ra   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,  r0  r3  r9  rA  rN  rQ  rV  rZ  r^  ra  rg  ri  rk  rn  rä   rs  rw  r   rz  r{  rH  r  r   r   r    r   Ú
deprecatedr‹  rŒ  r�  rç   r„  r…  ró   rò   ZFLOAT16r†  rå   ZINT16rö   r±   r²   rô   r›   r   r!   Zuint8Zint8Úshortr4   r  r   r9   rú   Z	complex32r¡  r¢  rC   r£  r¤  r¥  r¦  r#   r   r"   Úsetr§  Ú__annotations__r3   r3   r3   r7   Ú<module>   sZ   0òÿ üE


Nü 	
üû
ú    ÿ
  û#&
Cc
	*    ÿ*!9

ý0û=ÿ

ýý
ýóñðñð