U
    1þjgþ  ã                   @   s<  d Z ddlZddlmZmZ ddlZddlmZ ddlmZm	Z	m
Z
 ddlmZmZmZ ddd	gZejejd
dZedƒe
 dddddd¡ejejee ejejeedœdd„ƒƒZedƒejdœdd	„ƒZdd„ Zedƒe
 dddddddd¡ejdejejeee ee eej eee ee ejdœ
dd„ƒƒƒZdS ) a‘  This file exports ONNX ops for opset 17.

Note [ONNX Operators that are added/updated in opset 17]

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
https://github.com/onnx/onnx/blob/main/docs/Changelog.md#version-17-of-the-default-onnx-operator-set
New operators:
    BlackmanWindow
    DFT
    HammingWindow
    HannWindow
    LayerNormalization
    MelWeightMatrix
    STFT
    SequenceMap
é    N)ÚOptionalÚSequence)Ú_C)Ú_type_utilsÚerrorsÚsymbolic_helper)Ú	_beartypeÚ	jit_utilsÚregistrationÚ
layer_normÚstftÚquantized_layer_normé   )Zopsetzaten::layer_normÚvÚisÚfÚnone)ÚgÚinputÚnormalized_shapeÚweightÚbiasÚepsÚcudnn_enablec                 C   s†   t |ƒ }tj |tjj¡}| ¡ }	t |¡rJtj	||	d}
| j
d|
d}t |¡rptj||	d}| j
d|d}| j
d|||||dS )N©ÚdtypeÚConstant©Zvalue_tZLayerNormalization)Z	epsilon_fÚaxis_i)Úlenr   ÚJitScalarTypeÚ
from_valueÚFLOATr   r   Ú_is_noneÚtorchÚonesÚopÚzeros)r   r   r   r   r   r   r   ZaxisZscalar_typer   Zweight_valueZ
bias_value© r(   ú?/tmp/pip-unpacked-wheel-ttp2cnii/torch/onnx/symbolic_opset17.pyr   #   s(    
 ÿ

úzquantized::layer_norm)r   c           
      C   s8   t  | |¡\}}}}t| |||||dƒ}	t  | |	||¡S )NF)r   Zdequantize_helperr   Zquantize_helper)
r   Úxr   r   r   r   Zop_scaleZop_zero_pointÚ_Úoutputr(   r(   r)   r   G   s    c                 C   s    | | d }| | | }||fS )zuHelper function to compute the sizes of the edges (left and right)
    of a given window centered within an FFT size.é   r(   )Ún_fftZwindow_sizeÚleftÚrightr(   r(   r)   Ú_compute_edge_sizesY   s    r1   z
aten::stftÚiÚbFT)
r   r   r.   Ú
hop_lengthÚ
win_lengthÚwindowÚ
normalizedÚonesidedÚreturn_complexÚreturnc	              
   C   sª  |rt jd|d‚|dk	r|n|d }	| jdtj|	tjdd}
| jdtj|tjdd}|}t |¡}|dkr˜|  d	|| jdtjd
gtjdd¡}n|dkr¶t jd|› d|d‚tj|d
d}|dk	rH|rÖ|n|}||ksôt	d|› dfƒ‚||k rHt
||ƒ\}}| jdt |¡d}| jdt |¡d}| jd|||d
d}t |¡rÞ|r²||kr€t jd|› d|› d|d‚t
||ƒ\}}t t |¡t |¡t |¡f¡}n
t |¡}|jd
 |ksÐt	‚| jd|d}| jd|tj |¡ ¡ d}| jd||
|||dks|rdnd
d}| jd|d
dddgd}|dkrl|  d|| jdtjd
gtjdd¡}|r¦t tj|| ¡  ¡ d¡}|  d|| jd|d¡}|S )a®  Associates `torch.stft` with the `STFT` ONNX operator.
    Note that torch.stft calls _VF.stft, without centering or padding options.
    Hence, this function does not contain these two arguments.
    See torch.stft source code for more info.

    Args:
        g: Graph to write the ONNX representation into
        input: Input tensor for the transformation
        n_fft: FFT size
        hop_length: Size of the hop. Defaults to `floot(n_fft // 4)`
        win_length: Size of the analysis window. Defaults to `n_fft`
        window: Analysis window. Defaults to a window of all ones
        normalized: Whether to return a normalized STFT
        onesided: Whether to return only half (+1) of the results, given the
            symmetry of the STFT
        return_complex: Whether to return the complex value (Note: Must be
            `False` or `None`)

    Returns:
        op: Operator for torch.stft associated with STFT (ONNX)
    z-STFT does not currently support complex types)ÚmsgÚvalueNé   r   r   r   é   Z	Unsqueezer   r-   zcSTFT can only take inputs of 1 [signal] or 2 [batch, signal] dimensions. Current rank of signal is z, please reduce it.)ZdimzuAnalysis window size must equal `win_length` or `n_fft`. Please, set `win_length` or `n_fft` to match `window` size (ú)ZConcat)r   zWThe analysis window can't be longer than the size of the FFT. Please set `win_length` (z) to `n_fft` (z
) or less.ZCast)Zto_iZSTFT)Z
onesided_iZ	Transposeé   )Zperm_iZSqueezeZDiv)r   ZSymbolicValueErrorr&   r$   ZtensorZint64r   Z_get_tensor_rankZ_get_tensor_dim_sizeÚAssertionErrorr1   r'   r#   Zhstackr%   Úshaper   r    r!   Z	onnx_typeÚsqrtÚtyper   )r   r   r.   r4   r5   r6   r7   r8   r9   Zframe_step_valueZframe_step_constZframe_length_constÚsignalZsignal_rankZn_winZwin_length_defaultr/   r0   Zleft_winZ	right_winZtorch_windowÚresultZ	sqrt_nfftr(   r(   r)   r   a   s˜    $ ÿ ÿ ÿ
ý
ý


ÿ

ýÿ
  ÿú

ý)NNNFTF)Ú__doc__Ú	functoolsÚtypingr   r   r$   r   Z
torch.onnxr   r   r   Ztorch.onnx._internalr   r	   r
   Ú__all__ÚpartialZonnx_symbolicZ_onnx_symbolicÚ
parse_argsZGraphContextÚValueÚintÚfloatÚboolr   r   r1   Zbeartyper   r(   r(   r(   r)   Ú<module>   sV   
ù"ÿ      ÷ö