
    `i2                        S SK r S SKrS SKrS SKJr  S SKJr  S SKJr  Sr	Sr
SrSrS	S
SSSSSSSSSSSSSS.r " S S\5      r " S S\5      r " S S\5      r " S S \5      r\R$                  R&                  \R(                  " S!5      \R$                  R*                  \R(                  " S"5      0rS7S# jrS$ rS% rS8S& jr " S' S(5      r " S) S*5      r " S+ S,5      rS- rS. rS/ r S0 r!S1\S2\"S3\4S4 jr#S5 r$S9S6 jr%g):    N)Enum)onnx_pb)Pathzonnx.quantizez0.1.0zai.onnxzcom.microsoftFLOATUINT8INT8UINT16INT16INT32INT64STRINGBOOLFLOAT16DOUBLEUINT32UINT64	COMPLEX64
COMPLEX128)                        	   
                  c                   2    \ rS rSrSrSrS r\S 5       rSr	g)QuantizationMode%   r   r   c                     U R                   $ Nnameselfs    i/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/onnxruntime_tools/quantization/quant_utils.py__str__QuantizationMode.__str__)       yy    c                 F     [         U    $ ! [         a    [        5       ef = fr(   )r%   KeyError
ValueError)modes    r-   from_stringQuantizationMode.from_string,   s)    	#D)) 	,	      N)
__name__
__module____qualname____firstlineno__
IntegerOps
QLinearOpsr.   staticmethodr6   __static_attributes__r9   r1   r-   r%   r%   %   s%    JJ  r1   r%   c                   2    \ rS rSrSrSrS r\S 5       rSr	g)QuantizedValueType4   r   r   c                     U R                   $ r(   r)   r+   s    r-   r.   QuantizedValueType.__str__8   r0   r1   c                 F     [         U    $ ! [         a    [        5       ef = fr(   )rC   r3   r4   )vs    r-   r6   QuantizedValueType.from_string;   s)    	%a(( 	,	r8   r9   N)
r:   r;   r<   r=   InputInitializerr.   r@   r6   rA   r9   r1   r-   rC   rC   4   s%    EK  r1   rC   c                   2    \ rS rSrSrSrS r\S 5       rSr	g)	QuantTypeC   r   r   c                     U R                   $ r(   r)   r+   s    r-   r.   QuantType.__str__G   r0   r1   c                 F     [         U    $ ! [         a    [        5       ef = fr(   )rM   r3   r4   )ts    r-   r6   QuantType.from_stringJ   s(    	Q< 	,	r8   r9   N)
r:   r;   r<   r=   QInt8QUInt8r.   r@   r6   rA   r9   r1   r-   rM   rM   C   s%    EF  r1   rM   c                   2    \ rS rSrSrSrS r\S 5       rSr	g)QuantFormatR   r   r   c                     U R                   $ r(   r)   r+   s    r-   r.   QuantFormat.__str__V   r0   r1   c                 F     [         U    $ ! [         a    [        5       ef = fr(   )rW   r3   r4   )formats    r-   r6   QuantFormat.from_stringY   s)    	v&& 	,	r8   r9   N)
r:   r;   r<   r=   	QOperatorQDQr.   r@   r6   rA   r9   r1   r-   rW   rW   R   s%    I
C  r1   rW   int8uint8c                    U [         ;   d   SR                  U 5      5       e[         U    n[        U[        R                  :X  a  SOSUc  SOU5      n[        U[        R                  :X  a  SOSUc  SOU5      n[        R                  " UR                  [        R                  5      U-  R                  5       U-   5      n	[        R                  " XXS9  U	R                  U5      $ )NEUnexpected data type {} requested. Only INT8 and UINT8 are supported.r   i      )out)ONNX_TYPE_TO_NP_TYPEr\   maxnumpyra   minasarrayastypefloat32roundclip)
qTypearrscale
zero_pointlowhighdtypecliplowcliphigharr_fp32s
             r-   quantize_nparrayrz   e   s    (( ^OVVW\]^( 'Eu+!s{tPSTG%5;;.3CRVWH}}cjj7%?FFH:UVH	JJx(9??5!!r1   c                 ~   U[         R                  R                  :X  a<  [        [	        U 5      [	        U5      5      nUS:  a  [        U5      S-  U-  OSnSnXe/$ U[         R                  R                  :X  a,  X:w  a  [        U5      U -
  U-  OSn[        SU -
  U-  5      nXe/$ [        SR                  U5      5      e)Nr   r   r   rc   )

onnx_protoTensorProtor   rh   absfloatr   rn   r4   r\   )rminrmaxrp   quantize_range	max_rangerr   rs   s          r-   compute_scale_zpr   p   s    
&&+++D	3t9-	;Dq=y!A%7a
  
*((..	.9=tt#~51AH-.
  `gghmnoor1   c                     [        [        U 5      S5      n[        [        U 5      S5      n[        X4X!5      u  pV[        U[        R
                  " U 5      Xe5      nX4XVU4$ )a  
:parameter data: data to quantize
:parameter quantize_range: list of data to weight pack.
:parameter qType: data type to quantize to. Supported types UINT8 and INT8
:return: minimum, maximum, zero point, scale, and quantized weights
To pack weights, we compute a linear transformation
    - when data type == uint8 mode, from [rmin, rmax] -> [0, 2^{b-1}] and
    - when data type == int8, from [-m , m] -> [-(2^{b-1}-1), 2^{b-1}-1] where
        m = max(abs(rmin), abs(rmax))
and add necessary intermediate nodes to trasnform quantized weight to full weight using the equation
r = S(q-z), where
    r: real original value
    q: quantized value
    S: scale
    z: zero point
r   )rj   rh   r   rz   ri   rk   )datar   rp   r   r   rs   rr   quantized_datas           r-   quantize_datar   ~   sW    " s4y!Ds4y!D(UKJ%eU]]4-@%TNz.88r1   c                     U [         R                  R                  :X  a  U(       a  S$ S$ U [         R                  R                  :X  a  U(       a  S$ S$ [	        S5      e)z
Helper function to get the quantization range for a type.
    parameter qType: quantization type.
    return: quantization range.
re   rd         z"unsupported quantization data type)r|   r}   r   r   r4   )rp   reduce_ranges     r-   get_qrange_for_qTyper      sR     
&&,,,"s++	*((--	-"s++=>>r1   c                   (    \ rS rSrSr/ / S4S jrSrg)QuantizedInitializer   zB
Represents a linearly quantized weight input from ONNX operators
Nc
                 p    Xl         X l        X0l        X@l        XPl        X`l        Xpl        Xl        Xl        g r(   )	r*   initializerrminsrmaxszero_pointsscalesr   r   axis)
r,   r*   r   r   r   r   r   r   r   r   s
             r-   __init__QuantizedInitializer.__init__   s4     	&

&	,	r1   )	r   r   r   r*   r   r   r   r   r   r:   r;   r<   r=   __doc__r   rA   r9   r1   r-   r   r      s      "r1   r   c                   $    \ rS rSrSr SS jrSrg)QuantizedValue   zA
Represents a linearly quantized value (input\output\intializer)
Nc                 L    Xl         X l        X0l        X@l        XPl        X`l        g r(   )original_nameq_name
scale_namezp_name
value_typer   )r,   r*   new_quantized_namer   zero_point_namequantized_value_typer   s          r-   r   QuantizedValue.__init__   s#     "($&.	r1   )r   r   r   r   r   r   r(   r   r9   r1   r-   r   r      s     r1   r   c                       \ rS rSrSrS rSrg)BiasToQuantize   z#
Represents a bias to be quantized
c                 (    Xl         X l        X0l        g r(   	bias_name
input_nameweight_name)r,   r   r   r   s       r-   r   BiasToQuantize.__init__   s    "$&r1   r   Nr   r9   r1   r-   r   r      s    'r1   r   c                 ,   U R                   S:X  a$  [        SR                  U R                  5      5      eU R                   S:X  a  U R                  nGO5U R                   S:X  a  U R
                  nGOU R                   S:X  a  U R                  nOU R                   S:X  a  U R                  nOU R                   S:X  a  U R                  nOU R                   S:X  a  U R                  nOU R                   S	:X  a  U R                  nOU R                   S
:X  a  U R                  nOiU R                   S:X  a  U R                  nOLU R                   S:X  a  U R                  nO/[        SR                  U R                  U R                   5      5      eU R                  U0$ )z
Convert attribute to kwarg format for use with onnx.helper.make_node.
    :parameter attribute: attribute in AttributeProto format.
    :return: attribute in {key: value} format.
r   z*attribute {} does not have type specified.r   r   r   r   r   r   r   r   r   r   z%attribute {} has unsupported type {}.)typer4   r\   r*   fisrR   gfloatsintsstringstensorsgraphs)	attributevalues     r-   attribute_to_kwargr      s:    	!ELLY^^\]] 	!
..A

..A

..A

..A

..A
  
..A

..A
!!
..A
!!
..B
  @GG	XaXfXfghhNNE""r1   c                 ~    U Vs/ s H  o"R                   U :X  d  M  UPM     nn[        U5      S:  a  US   $ S$ s  snf )z
Helper function to find item by name in a list.
    parameter item_name: name of the item.
    parameter item_list: list of items.
    return: item if found. None otherwise.
r   N)r*   len)	item_name	item_listitemitemss       r-   find_by_namer     s@     (Bid99	+ATiEB5zA~58/4/ Cs   ::c                 Z    Sn[        S[        U5      5       H  nX   U :X  d  M  UnM     U$ )z;
Helper function to return index of an item in a node list
r   )ranger   )	elem_name	elem_listelem_idxr   s       r-   get_elem_indexr     s4     H1c)n%<9$H & Or1   c                 F    [         R                  R                  SX/U5      $ )z
Helper function to create a Mul node.
    parameter inputs: list of input names.
    parameter output: output name.
    parameter name: name of the node.
    return: Mul node in NodeProto format.
Mul)onnxhelper	make_node)inputsoutputr*   s      r-   get_mul_noder     s     ;;  $??r1   filename
identifierreturnc                     U R                   R                  U R                  U-   5      R                  U R                  5      $ )zk
Helper function to generate a identifiable filepath by concatenating the given identifier as a suffix.   
)parentjoinpathstemwith_suffixsuffix)r   r   s     r-   generate_identified_filenamer   %  s1     ??##HMMJ$>?KKHOO\\r1   c                    SSK nSSKnSSKJs  Js  Jn  SSKJs  Js  Jn  [        R                  " SR                  U 5      5        [        SS5       nUR                  UR                  U 5      5        SSS5        UR                  S5      n/ n[        U R!                  5       5       H  nX   n	[#        [%        ['        U	S   5      ['        U	S   5      5      5      n
UR)                  U5      nUR)                  U
5      nUR+                  U5        UR-                  Xk5        UR/                  Xl5        UR1                  U5      nUR3                  U5        M     UR5                  U[7        U5      5        U H  nUR9                  U5        M     UR;                  [7        U5      5      nUR=                  U5        UR?                  Xn5        URA                  U5      nURC                  U5        URE                  5       n[        SS	5       nUR                  U5        SSS5         [        S
S5       n[        U R!                  5       5       H\  nX   n
US-   [#        [%        ['        U
S   5      ['        U
S   5      5      5      -   nUR                  U5        UR                  S5        M^     SSS5        g! , (       d  f       GNC= f! , (       d  f       N= f! , (       d  f       g= f)z9
Helper function to write calibration table to files.   
r   Nzcalibration cache: {}zcalibration.jsonwi   r   zcalibration.flatbufferswbzcalibration.cache 
))jsonflatbuffers5onnxruntime.quantization.CalTableFlatBuffers.TrtTablequantizationCalTableFlatBuffersTrtTable5onnxruntime.quantization.CalTableFlatBuffers.KeyValueKeyValuelogginginfor\   openwritedumpsBuildersortedkeysstrrh   r~   CreateStringKeyValueStartKeyValueAddKeyKeyValueAddValueKeyValueEndappendTrtTableStartDictVectorr   PrependUOffsetTRelative	EndVectorTrtTableStartTrtTableAddDictTrtTableEndFinishOutputGetRootAsTrtTable
DictLengthr   DictKeyValue)calibration_cacher   r   r   r   filebuilderkey_value_listkeyvaluesr   flat_key
flat_value	key_value	main_dict	cal_tablebufdict_lenr   r   s                       r-   write_calibration_tabler  +  sX   
 LLLLLL(//0ABC	 #	&$

4::/01 
' !!$'GN',,./"'CF1IF1I78'',))%0
w'2!!'6((1	i( 0 $$Wc..AB#	''	2 $!!#n"56I7#W0$$W-INN9
..
C	'	.$

3 
/  
!3	'4+0023C%*Ec	CCaM3uQx= ABBAJJqMJJt	 4 
(	'[ 
'	&@ 
/	. 
(	's%   !J/K,A:K/
J>
K
K c                    SSK nU S:H  R                  UR                  5      nU S:g  R                  UR                  5      nUR                  5       nU R                  U-
  nU(       d  gU[        U5      -  [        U5      -  nUS:  d   SXVU4-  5       eU R                  UR                  5      nXU-  U* U-  -   -  nUS:*  R                  5       S:X  d   eU$ )aj  Given a discrete distribution (may have not been normalized to 1),
smooth it by replacing zeros with eps multiplied by a scaling factor
and taking the corresponding amount off the non-zero values.
Ref: http://web.engr.illinois.edu/~hanj/cs412/bk3/KL-divergence.pdf
     https://github.com//apache/incubator-mxnet/blob/master/python/mxnet/contrib/quantization.py
r   Nr   g      ?z"n_zeros=%d, n_nonzeros=%d, eps1=%f)ri   rl   rm   sumsizer   )	pepsnpis_zerosis_nonzerosn_zeros
n_nonzeroseps1hists	            r-   smooth_distributionr#  k  s     Qrzz*H6//"**-KllnG'!Jw%
"33D#:Y;wTX>YYY:88BJJD(Nte{222DAI??!!!Kr1   )NN)F)g-C6?)&r   ri   r   enumr   r   r|   pathlibr   __producer____version__onnx_domain	ms_domaintype_to_namer%   rC   rM   rW   r}   r   rv   r   rg   rz   r   r   r   r   r   r   r   r   r   r   r   r   r  r#  r9   r1   r-   <module>r+     s@       & 	 .t   $  V!4  5;;w#7 
"94? 8 &' '"#J0@]4 ]S ]T ]>@r1   