U
    q±ËhÕ   ã                   @  sÐ   d dl mZ d dlmZ d dlZd dlmZmZ d dl	m
Z
mZmZmZmZmZ d dlmZmZmZmZ d dlmZ ddd	d
d
ddœdd„ZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZdS )é    )Úannotations)ÚClassVarN)ÚTensorProtoÚsubbyte)Úfloat8e4m3fnÚfloat8e4m3fnuzÚ
float8e5m2Úfloat8e5m2fnuzÚint4Úuint4)Úfloat32_to_float8e4m3Úfloat32_to_float8e5m2Únp_dtype_to_tensor_dtypeÚtensor_dtype_to_np_dtype)ÚOpRunú
np.ndarrayztuple[int, ...]ú
int | None)ÚvalueÚshapeÚaxisÚ
block_sizeÚreturnc                 C  s.  t | jƒdkr| S t | jƒdkr2| jdkr2| d S |s´t | jƒdksHt‚dgt |ƒ }z| j||< |  t|ƒ¡W S  tk
r² } z$td|› d| j› d|› dƒ|‚W 5 d}~X Y nX |dkrÄtdƒ‚tj	| ||d	} || | j| k rþ| j
t|| ƒ|d
} | j|krtdƒ‚t || j¡|ks*t‚| S )a¨  Reshape/Replicate scale/zero-point to be broadcastable to shape.

    Args:
        value: the array to be reshaped/replicated
        shape: the rarget shape
        axis: quantization axis, applicable for per-axis and blocked quantization
        block_size: size of quantization block, applicable only for blocked quantization

    Returns:
        value array after reshape/replicate according to quantization mode.
    r   é   zaxis is out of boundary, axis=z, value.shape=z, shape=Ú.Nz&block_size must be a positive integer.)Zrepeatsr   )Úindicesr   z’Invalid shapes for Blocked Quantization. Input 2 shape should identical to Input 1 shape, except for one dimension, in which blocking is performed)Úlenr   ÚsizeÚAssertionErrorZreshapeÚtupleÚ
IndexErrorÚ
ValueErrorÚnpÚrepeatZtakeÚrangeZbroadcast_shapes)r   r   r   r   ZdimsÚe© r%   úI/tmp/pip-unpacked-wheel-xnis5xre/onnx/reference/ops/op_quantize_linear.pyÚreshape_input   s8    
ÿýÿÿr'   c                
   @  s    e Zd ZU e e¡Ze e¡Zejdej	dej
dejdiZded< ejej	ej
ejejejejejejejf
Zddd	œd
d„Zddddddddddœdd„ZdS )Ú_CommonQuantizeLinear)r   éÿ   )i€ÿÿÿé   )r   iÿÿ  )i €ÿÿiÿ  z0ClassVar[dict[TensorProto.DataType, tuple[int]]]Úquant_integer_rangesr   Úint)Ú
zero_pointr   c                 C  sö   d }|j tkr*|j jd d dkr*tj}nÈ|j tkrP|j jd d dkrPtj}n¢|j tkrv|j jd d dkrvtj}n||j t	krœ|j jd d dkrœtj
}nV|j tkrÂ|j jd d dkrÂtj}n0|j tkrè|j jd d dkrètj}n
t|j ƒ}|S )Nr   Ze4m3fnZe4m3fnuzZe5m2Ze5m2fnuzr   r
   )Údtyper   Údescrr   ÚFLOAT8E4M3FNr   ÚFLOAT8E4M3FNUZr   Ú
FLOAT8E5M2r	   ÚFLOAT8E5M2FNUZr   ÚUINT4r
   ÚINT4r   )Úselfr-   Úzero_point_typer%   r%   r&   Úget_zero_point_typef   s0    ÿþÿþÿþ
z)_CommonQuantizeLinear.get_zero_point_typeNr   Tznp.ndarray | NoneÚboolr   znp.dtype | Noneztuple[np.ndarray])ÚxÚy_scaler-   r   Úsaturater   Úoutput_dtyper   c                   sè  t ||j||ƒ}|‰ |d k	rJ|  |¡}|rF||krFtd|› d|› ƒ‚|‰ ˆ pRtj‰ ˆ tjkrntdˆ › dƒ‚|d k	r†t ||j||ƒnd}|| }ˆ tjkræt	 
|¡ t	j¡}	|	|7 }	tˆ ƒ}
tjˆ  }t	 |	|d |d ¡ |
¡fS ˆ tjkrtj||d}| t¡fS ˆ tjkr4tj|d|d	}| t¡fS ˆ tjkrZtj||d}| t¡fS ˆ tjkr„tj|dd|d
}| t¡fS ˆ tjtjfkrÔt	 
|¡ t	j¡}	|	|7 }	‡ fdd„}t	 |¡}||	ƒ}|fS tdˆ › dƒ‚d S )Nz+Mismatched output data-types: output_dtype=z, zero_point type=zUnexpected type: output_dtype=z# is not a supported quantized type.r   r   )r<   T)Úuzr<   )Úfnr>   r<   c                   s   t j| ˆ tjkdS )N)Úsigned)r   Zfloat32_to_4bit_unpackedr   r5   )r:   ©Ztensor_typer%   r&   Ú<lambda>Ã   s    ÿz,_CommonQuantizeLinear._run.<locals>.<lambda>)r'   r   r8   r    r   ÚUINT8r(   Úquant_typesr+   r!   ZrintZastypeZint32r   Zclipr0   r   r   r1   r   r2   r   r   r3   r	   r4   r5   Ú	vectorize)r6   r:   r;   r-   r   r<   r   r=   r7   Úxir.   Zquant_rangeZf8Zsingle_funcÚfuncÚi4r%   rA   r&   Ú_run   sp    

ÿ


ÿÿý

  ÿ   ÿ

ÿz_CommonQuantizeLinear._run)Nr   TNN)Ú__name__Ú
__module__Ú__qualname__r!   rE   r   r   r   rC   ZINT8ZUINT16ZINT16r+   Ú__annotations__r4   r5   r0   r1   r2   r3   rD   r8   rI   r%   r%   r%   r&   r(   P   s:   


    üö     ør(   c                      s   e Zd Zd‡ fdd„	Z‡  ZS )ÚQuantizeLinear_10Nc                   s*   t |jƒdkrtdƒ‚tƒ j||||dS )Nr   ú%Input 2 must be a vector or a number.)r   ©r   r   r    ÚsuperrI   )r6   r:   r;   r-   r   ©Ú	__class__r%   r&   rI   Ð   s    zQuantizeLinear_10._run)NN©rJ   rK   rL   rI   Ú__classcell__r%   r%   rR   r&   rN   Ï   s   rN   c                      s   e Zd Zd‡ fdd„	Z‡  ZS )ÚQuantizeLinear_19Nc                   s,   t |jƒdkrtdƒ‚tƒ j|||||dS )Nr   rO   )r   r<   rP   )r6   r:   r;   r-   r   r<   rR   r%   r&   rI   ×   s    zQuantizeLinear_19._run)NNNrT   r%   r%   rR   r&   rV   Ö   s   rV   c                      s(   e Zd Zdddddœ‡ fdd„
Z‡  ZS )ÚQuantizeLinear_21N©r   r<   r   r=   c                  s   t ƒ j|||||dœŽS )NrX   )rQ   rI   )r6   r   r<   r   r=   ÚargsrR   r%   r&   rI   Þ   s    ûzQuantizeLinear_21._runrT   r%   r%   rR   r&   rW   Ý   s   rW   )NN)Ú
__future__r   Útypingr   Znumpyr!   Zonnxr   r   Zonnx._custom_element_typesr   r   r   r	   r
   r   Zonnx.helperr   r   r   r   Zonnx.reference.op_runr   r'   r(   rN   rV   rW   r%   r%   r%   r&   Ú<module>   s      ü2