
    bIg                         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Z G d	 d
e      Z G d de      Z G d de      Z G d de      Zy)    )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)OpRunc           
        t        | j                        dk(  r| S t        | j                        dkD  r| j                  dk(  r| d   S |sSt        | j                        dk(  sJ dgt        |      z  }	 | j                  ||<   | j                  t	        |            S |dk  rt        d      t        j                  | ||	      } ||   | j                  |   k7  r| j                  t        ||         |
      } | j                  |k7  rt        d      t        j                  || j                        |k(  sJ | S # t
        $ r%}t        d| d| j                   d| d      |d}~ww xY w)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.)repeatsaxis)indicesr   zInvalid shapes for Blocked Quantization. Input 2 shape should identical to Input 1 shape, except for one dimension, in which blocking is performed)lenshapesizereshapetuple
IndexError
ValueErrornprepeattakerangebroadcast_shapes)valuer   r   
block_sizedimses         b/var/www/html/answerous/venv/lib/python3.12/site-packages/onnx/reference/ops/op_quantize_linear.pyreshape_inputr)      sq   " 5;;1
5;;!

aQx5;;1$$$sSZ	DJ==t-- QABB IIeZd;Edu{{4((

5t#5D
A{{e a
 	
 uekk2e;;;L)  	0 7${{m8E7!= 	s   3(D9 9	E' E""E'c            
         e Zd ZU  ej                  e      Z ej                  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Z	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd	Zy)_CommonQuantizeLinear)r      )i   )r   i  )i i  z0ClassVar[dict[TensorProto.DataType, tuple[int]]]quant_integer_rangesc                d   d }|j                   t        k(  r1|j                   j                  d   d   dk(  rt        j                  }|S |j                   t
        k(  r1|j                   j                  d   d   dk(  rt        j                  }|S |j                   t        k(  r1|j                   j                  d   d   dk(  rt        j                  }|S |j                   t        k(  r1|j                   j                  d   d   dk(  rt        j                  }|S |j                   t        k(  r1|j                   j                  d   d   dk(  rt        j                  }|S |j                   t        k(  r1|j                   j                  d   d   dk(  rt        j                  }|S t        |j                         }|S )Nr   e4m3fne4m3fnuze5m2e5m2fnuzr   r   )dtyper   descrr   FLOAT8E4M3FNr   FLOAT8E4M3FNUZr	   
FLOAT8E5M2r
   FLOAT8E5M2FNUZr   UINT4r   INT4r   )self
zero_pointzero_point_types      r(   get_zero_point_typez)_CommonQuantizeLinear.get_zero_point_typef   s   ,  &&q)!,8)66O& # .  &&q)!,
:)88O  +
0@0@0F0Fq0I!0LPV0V)44O  .  &&q)!,
:)88O  &:+;+;+A+A!+DQ+G7+R)//O
 	 %**:*:*@*@*CA*F&*P)..O  7z7G7GHO    Nc                   t        ||j                  ||      }||+| j                  |      }|r||k7  rt        d| d|       |xs t        j
                  t        j                  vrt        d d      |t        ||j                  ||      nd}||z  }t        j                  v rt        j                  |      j                  t        j                        }	|	|z  }	t              }
t        j                     }t        j                  |	|d   |d         j                  |
      fS t        j                  k(  r-t        j!                  ||      }|j                  t"              fS t        j$                  k(  r.t        j!                  |d|	      }|j                  t&              fS t        j(                  k(  r-t        j+                  ||      }|j                  t,              fS t        j.                  k(  r/t        j+                  |dd|
      }|j                  t0              fS t        j2                  t        j4                  fv r\t        j                  |      j                  t        j                        }	|	|z  }	fd}t        j6                  |      } ||	      }|fS t        d d      )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   )saturateT)uzrB   )fnrC   rB   c                T    t        j                  | t        j                  k(        S )N)signed)r   float32_to_4bit_unpackedr   r;   )xtensor_types    r(   <lambda>z,_CommonQuantizeLinear._run.<locals>.<lambda>   s"    G$D$D;+*:*::% r@   )r)   r   r?   r   r   UINT8r+   quant_typesr.   r   rintastypeint32r   clipr6   r   r   r7   r   r8   r   r	   r9   r
   r:   r;   	vectorize)r<   rH   y_scaler=   r   rB   r%   output_dtyper>   xir4   quant_rangef8single_funcfunci4rI   s                   @r(   _runz_CommonQuantizeLinear._run   s     $
C #!"66zBO ? A,Oabqars  *K!6[%6%63???0=`a  % *aggtZ@ 	
 K/DDD""288,B*B,[9E/DD[QKGGBAA?FFuMOO+222&<<Q<RBIIl+--+444&<<dX = B IIn-//+000&<<Q<RBIIj)+++444&<<dth = B IIn-//;,,k.>.>??""288,B*BK <<,DbB5L,[M9\]
 	
r@   )r=   
np.ndarrayreturnint)Nr   TNN)rH   r[   rR   r[   r=   znp.ndarray | Noner   r]   rB   boolr%   
int | NonerS   znp.dtype | Noner\   ztuple[np.ndarray])__name__
__module____qualname__r   rQ   r   r   r   rK   INT8UINT16INT16r.   __annotations__r:   r;   r6   r7   r8   r9   rL   r?   rZ    r@   r(   r+   r+   P   s8   (BLL)>?(BLL)>?8+J?	NJ  	  """"K> )-!%(,K
K
 K
 &	K

 K
 K
 K
 &K
 
K
r@   r+   c                        e Zd Zd fd	Z xZS )QuantizeLinear_10c                p    t        |j                        dkD  rt        d      t        |   ||||      S )Nr   %Input 2 must be a vector or a number.)r   r   r   r   superrZ   )r<   rH   rR   r=   r   	__class__s        r(   rZ   zQuantizeLinear_10._run   s7    w}}!DEEw|Aw
|>>r@   NNr`   ra   rb   rZ   __classcell__rn   s   @r(   ri   ri      s    ? ?r@   ri   c                        e Zd Zd fd	Z xZS )QuantizeLinear_19c                r    t        |j                        dkD  rt        d      t        |   |||||      S )Nr   rk   )r   rB   rl   )r<   rH   rR   r=   r   rB   rn   s         r(   rZ   zQuantizeLinear_19._run   s9    w}}!DEEw|Aw
|QQr@   )NNNrp   rr   s   @r(   rt   rt      s    R Rr@   rt   c                  *     e Zd Zddddd fd
Z xZS )QuantizeLinear_21Nr   rB   r%   rS   c               (    t        |   |||||dS )Nrx   )rm   rZ   )r<   r   rB   r%   rS   argsrn   s         r(   rZ   zQuantizeLinear_21._run   s#    w|!%
 	
r@   rp   rr   s   @r(   rw   rw      s    #dtRV 
 
r@   rw   ro   )
r$   r[   r   ztuple[int, ...]r   r_   r%   r_   r\   r[   )
__future__r   typingr   numpyr   onnxr   r   onnx._custom_element_typesr   r   r	   r
   r   r   onnx.helperr   r   r   r   onnx.reference.op_runr   r)   r+   ri   rt   rw   rg   r@   r(   <module>r      s    #   %   ( !	/// / 	/
 /d|
E |
~?- ?R- R	
- 	
r@   