U
    q±Ëhÿ  ã                   @  s`   d dl mZ d dlZdZdZd ZdZdddd	œd
d„Zdddddœdd„Z	dddd	œdd„Z
dS )é    )ÚannotationsNiøÿÿÿé   é   znp.ndarray | np.dtype | floatÚboolz
np.ndarray)ÚxÚsignedÚreturnc                 C  s\   |r
t jnt j}|rtnt}|r$tnt}t| t jƒs>t  	| ¡} t  
| ||¡}t  |¡ |¡S )a  Cast to 4bit via rounding and clipping (without packing).

    Args:
        x: element to be converted
        signed: boolean, whether to convert to signed int4.

    Returns:
        An ndarray with a single int4 element (sign-extended to int8/uint8)
    )ÚnpÚint8Úuint8ÚINT4_MINÚ	UINT4_MINÚINT4_MAXÚ	UINT4_MAXÚ
isinstanceÚndarrayÚasarrayZclipZrintÚastype)r   r   ÚdtypeZclip_lowZ	clip_highZclipped© r   ú0/tmp/pip-unpacked-wheel-xnis5xre/onnx/subbyte.pyÚfloat32_to_4bit_unpacked   s    
r   znp.dtype)Úval_lowÚval_highr   r   c                 C  s$   t ||ƒ}t | |ƒ}|d> |d@ B S )af  Cast two elements to 4bit (via rounding and clipping) and pack
    to a single byte
    Args:
        val_low: element to be packed in the 4 LSB
        val_high: element to be packed in the 4 MSB
        signed: boolean, whether to convert to signed int4.

    Returns:
        An ndarray with a single int8/uint8 element, containing both int4 elements
    é   r   )r   )r   r   r   Zi8_highZi8_lowr   r   r   Úfloat32x2_to_4bitx2$   s    

r   ztuple[np.ndarray, np.ndarray]c                 C  sr   dd„ }t | tjƒst | ¡} | d@ }| d? }|r:||ƒn|}|rJ||ƒn|}|rXtjntj}| |¡| |¡fS )Nc                 S  s   t  | d? dk| | dB ¡S )Né   r   éð   )r	   Úwhere)r   r   r   r   Ú<lambda>9   ó    z&unpack_single_4bitx2.<locals>.<lambda>r   r   )r   r	   r   r   r
   r   r   )r   r   Zunpack_signedZx_lowZx_highr   r   r   r   Úunpack_single_4bitx26   s    
r!   )Ú
__future__r   Znumpyr	   r   r   r   r   r   r   r!   r   r   r   r   Ú<module>   s   