+
    G-j¥�  ã                  ó   € ^ RI Ht ^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RIH	t	 ^ RI
t
^ RIt^ RIHtHtHt ^ RIHtHtHt ^ RIHt ^ RIHtHtHtHt ^ R	IHt ^ R
IHtHtHt  ^ RI H!t! Rt#Rt$Rt%Rt&Rt'Rt(Rt)Rt*Rt+Rt,/ t-].! ]4       U u/ uF%  p ]/! ]0! ]V 4      ]14      '       g   K  ]0! ]V 4      V bK'  	  up t2 ! R R]4      t3 ! R R]4      t4 ! R R]4      t5 ! R R]4      t6]P"                  Pn                  ]
Pp                  ! R4      ]P"                  Pr                  ]
Pp                  ! R4      ]P"                  Pt                  ]
Pp                  ! R 4      ]P"                  Pv                  ]
Pp                  ! R!4      ]P"                  Px                  ]]P"                  Pz                  ]]P"                  P|                  ]/t?]P"                  Pr                  ]
P€                  ! ^ ]
P‚                  R"7      ]
P€                  ! ^ÿ]
P‚                  R"7      3]P"                  Pn                  ]
P€                  ! Rh]
P„                  R"7      ]
P€                  ! ^]
P„                  R"7      3]P"                  Pv                  ]
P€                  ! ^ ]
P†                  R"7      ]
P€                  ! R#]
P†                  R"7      3]P"                  Pt                  ]
P€                  ! Ri]
Pˆ                  R"7      ]
P€                  ! R$]
Pˆ                  R"7      3]P"                  P|                  ]
P€                  ! ^ ]R"7      ]
P€                  ! ^]R"7      3]P"                  Pz                  ]
P€                  ! Rj]R"7      ]
P€                  ! ^]R"7      3/tE]P"                  Pn                  ]
P€                  ! Rk]
P„                  R"7      ]
P€                  ! ^]
P„                  R"7      3]P"                  Pt                  ]
P€                  ! Rl]
Pˆ                  R"7      ]
P€                  ! R$]
Pˆ                  R"7      3/tF]P"                  Pr                  ]
P€                  ! ^ ]
P‚                  R"7      ]
P€                  ! ^]
P‚                  R"7      3]P"                  Pn                  ]
P€                  ! Rm]
P„                  R"7      ]
P€                  ! ^@]
P„                  R"7      3]P"                  Pv                  ]
P€                  ! ^ ]
P†                  R"7      ]
P€                  ! R$]
P†                  R"7      3]P"                  Pt                  ]
P€                  ! Rn]
Pˆ                  R"7      ]
P€                  ! R%]
Pˆ                  R"7      3]P"                  P|                  ]
P€                  ! ^ ]R"7      ]
P€                  ! ^]R"7      3]P"                  Pz                  ]
P€                  ! Ro]R"7      ]
P€                  ! ^]R"7      3/tGR&Rp/R' ltHRqR( ltIRrR) ltJR* tKRsR+ R, lltLRsR- R. lltMRqR/ R0 lltNRtR1 ltORtR2 ltPR3 R4 ltQR5 R6 ltR ! R7 R84      tS ! R9 R:4      tT ! R; R<4      tUR= tVR> tWR? tXR@ tYRA RB ltZRC t[RuRD lt\RvRE lt]RF RG lt^RH RI lt_RJ RK lt`RL RM ltaRN RO ltbRP RQ ltcRR RS ltdRT RU lteRV RW ltfRX RY ltgRZ R[ lthR\ R] ltiR^ R_ ltjR` Ra ltkRb Rc ltlRd Re ltmRf Rg ltnR#   ]" d    Rt! EL_i ; iu up i )wé    )ÚannotationsN)ÚEnum)ÚPath)Úfloat8_e4m3fnÚint4Úuint4)Ú
ModelProtoÚTensorProtoÚexternal_data_helper)Úonnx_pb)Ú
make_graphÚ
make_modelÚ	make_nodeÚmake_tensor_value_info)ÚReferenceEvaluator)ÚGraphOptimizationLevelÚInferenceSessionÚSessionOptions)Úto_array_extendedzonnx.quantizez0.1.0úai.onnxzcom.microsoftÚQuantizeLinearÚ_QuantizeLinear_InputÚDequantizeLinearÚ_DequantizeLinear_OutputÚ
_quantizedl        c                  ó4   € ] tR t^4t^ t^tR t]R 4       tRt	R# )ÚQuantizationModec                	ó   € V P                   # ©N©Úname©Úselfs   &Úu/Volumes/fast/ai/experiments/nudenet-smoke/.venv/lib/python3.14/site-packages/onnxruntime/quantization/quant_utils.pyÚ__str__ÚQuantizationMode.__str__8   ó   € Ø�y‰yÐó    c                	óP   €  \         V ,          #   \         d    \        4       hi ; ir   )r   ÚKeyErrorÚ
ValueError)Úmodes   &r$   Úfrom_stringÚQuantizationMode.from_string;   s)   € ð	Ü# DÕ)Ð)øÜô 	Ü“,Ðð	úó   ‚ �%© N)
Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú
IntegerOpsÚ
QLinearOpsr%   Ústaticmethodr-   Ú__static_attributes__r0   r(   r$   r   r   4   s%   † Ø€JØ€Jòð ñó ôr(   r   c                  ó4   € ] tR t^Ct^ t^tR t]R 4       tRt	R# )ÚQuantizedValueTypec                	ó   € V P                   # r   r    r"   s   &r$   r%   ÚQuantizedValueType.__str__G   r'   r(   c                	óP   €  \         V ,          #   \         d    \        4       hi ; ir   )r:   r*   r+   )Úvs   &r$   r-   ÚQuantizedValueType.from_stringJ   s)   € ð	Ü% aÕ(Ð(øÜô 	Ü“,Ðð	úr/   r0   N)
r1   r2   r3   r4   ÚInputÚInitializerr%   r7   r-   r8   r0   r(   r$   r:   r:   C   s%   † Ø€EØ€Kòð ñó ôr(   r:   c                  óX   € ] tR t^Rt^ t^t^t^t^t^t	^t
R t]R 4       t]R 4       tRtR# )Ú	QuantTypec                	ó   € V P                   # r   r    r"   s   &r$   r%   ÚQuantType.__str__[   r'   r(   c                	óP   €  \         V ,          #   \         d    \        4       hi ; ir   )rC   r*   r+   )Úts   &r$   r-   ÚQuantType.from_string^   s(   € ð	Ü˜Q•<ÐøÜô 	Ü“,Ðð	úr/   c                	ó(  € V \         P                  8X  d   \        P                  # V \         P                  8X  d   \        P
                  # V \         P                  8X  d   \        P                  # V \         P                  8X  d   \        P                  # V \         P                  8X  d   \        P                  # V \         P                  8X  d   \        P                  # V \         P                  8X  d   \        P                  # \!        R V : R24      h)zUnexpected value qtype=Ú.)rC   ÚQInt8r
   ÚINT8ÚQUInt8ÚUINT8ÚQUInt16ÚUINT16ÚQInt16ÚINT16ÚQFLOAT8E4M3FNÚFLOAT8E4M3FNÚQUInt4ÚUINT4ÚQInt4ÚINT4r+   r"   s   &r$   Útensor_typeÚQuantType.tensor_typee   sÉ   € à”9—?‘?Ô"Ü×#Ñ#Ð#Ø”9×#Ñ#Ô#Ü×$Ñ$Ð$Ø”9×$Ñ$Ô$Ü×%Ñ%Ð%Ø”9×#Ñ#Ô#Ü×$Ñ$Ð$Ø”9×*Ñ*Ô*Ü×+Ñ+Ð+Ø”9×#Ñ#Ô#Ü×$Ñ$Ð$Ø”9—?‘?Ô"Ü×#Ñ#Ð#ÜÐ2°4±(¸!Ð<Ó=Ð=r(   r0   N)r1   r2   r3   r4   rK   rM   rS   rQ   rO   rW   rU   r%   r7   r-   ÚpropertyrY   r8   r0   r(   r$   rC   rC   R   sR   † Ø€EØ€FØ€MØ€FØ€GØ€EØ€Fòð ñó ðð ñ>ó ô>r(   rC   c                  ó4   € ] tR t^xt^ t^tR t]R 4       tRt	R# )ÚQuantFormatc                	ó   € V P                   # r   r    r"   s   &r$   r%   ÚQuantFormat.__str__|   r'   r(   c                	óP   €  \         V ,          #   \         d    \        4       hi ; ir   )r]   r*   r+   )Úformats   &r$   r-   ÚQuantFormat.from_string   s)   € ð	Ü˜vÕ&Ð&øÜô 	Ü“,Ðð	úr/   r0   N)
r1   r2   r3   r4   Ú	QOperatorÚQDQr%   r7   r-   r8   r0   r(   r$   r]   r]   x   s%   † Ø€IØ
€Còð ñó ôr(   r]   Úint8Úuint8Úint16Úuint16©Údtypeiÿÿ  iÿ  i @  Úzero_point_indexc                ó€  € . p\        V4       EF	  w  r4\        P                  ! \        V4      \        P                  4      '       d'   VP                  \        P                  ! V4      4       MC\        V\        P                  4      '       d   VP                  V4       M\        R V RV 24      hW08X  g   K«  VR,          pVP                  \        P                  8X  g"   VP                  \        P                  8X  g   Kô  \        RVP                   24      h	  \        V4      ^8”  d   \        V4      # V^ ,          # )zarg z is not an array: zzero_point cannot be éÿÿÿÿ)Ú	enumerateÚnumpyÚ
issubdtypeÚtypeÚnumberÚappendÚarrayÚ
isinstanceÚndarrayÚ	TypeErrorrj   Úfloat32Úfloat16ÚlenÚtuple)rk   ÚargsÚnew_argsÚiÚar>   s   $*    r$   Ú_check_typer€   ©   sá   € Ø€HÜ˜$—‰ˆÜ×ÒœD ›G¤U§\¡\×2Ò2Ø�O‰OœEŸKšK¨›NÕ+Ü˜œ5Ÿ=™=×)Ò)Ø�O‰O˜AÕä˜d 1 #Ð%7¸°sÐ;Ó<Ð<ØÖ Ø˜•ˆAØ�w‰wœ%Ÿ-™-Ô'¨1¯7©7´e·m±mÖ+CÜÐ"7¸¿¹°yÐ AÓBÐBñ  ô " (›m¨aÔ/Œ5�‹?Ð@°X¸aµ[Ð@r(   c                óü  € V \         9   g   Q R V  R24       hV \        P                  P                  \        P                  P                  \        P                  P
                  \        P                  P                  39   Ed<   V^ 8w  d   \        RV: R24      hVP                  \        P                  8X  d   \        P                  pMIVP                  \        P                  8X  d   \        P                  pM\        RVP                   R24      h\        \!        \#        R. R.\$        P&                  P)                  RV . ^ .4      R7      \#        R. ROR.4      .R\+        R	VR4      \+        R
VR4      .\+        RV R4      .4      4      p\-        V4      p\/        VP1                  RR	VR
V/4      ^ ,          4      # \         V ,          p	\3        V RRR7      w  r«Ve   \5        W¤4      MT
pVe   \7        Wµ4      MTp\        P8                  ! VP;                  \        P                  4      V,          P=                  4       V,           4      p\        P>                  ! WìWÞR7       \/        VP;                  V	4      4      # )úUnexpected data type ú> requested. Only INT8, UINT8, INT16, and UINT16 are supported.z2zero_point is expected to be null for float 8 not rJ   zUnexpected dtype ÚConstantÚ
zero_point)Úvaluer   ÚXÚscaleÚYÚquNF)Úreduce_rangeÚ	symmetric)Úout)r‡   rˆ   r…   ) ÚONNX_TYPE_TO_NP_TYPEÚ
onnx_protor
   rT   ÚFLOAT8E4M3FNUZÚ
FLOAT8E5M2ÚFLOAT8E5M2FNUZÚNotImplementedErrorrj   ro   rx   ÚFLOATry   ÚFLOAT16r+   r   r   r   ÚonnxÚhelperÚmake_tensorr   r   r€   ÚrunÚget_qmin_qmax_for_qTypeÚmaxÚminÚasarrayÚastypeÚroundÚclip)ÚqTypeÚarrrˆ   r…   ÚlowÚhighÚ	onnx_typeÚ
onnx_modelÚrefrj   ÚqminÚqmaxÚcliplowÚcliphighÚarr_fp32s   &&&&&&         r$   Úquantize_nparrayr­   ¹   s'  € ØÔ(Ô(ð Ø
 ˜wÐ&dÐeóÐ(ð Ü×Ñ×+Ñ+Ü×Ñ×-Ñ-Ü×Ñ×)Ñ)Ü×Ñ×-Ñ-ð	õ ð ˜Œ?Ü%Ð(ZÐ[eÑZhÐhiÐ&jÓkÐkØ�9‰9œŸ™Ô%Ü#×)Ñ)‰IØ�Y‰Yœ%Ÿ-™-Ô'Ü#×+Ñ+‰IäÐ0°·±°¸1Ð=Ó>Ð>ÜÜäØ" B¨¨¼d¿k¹k×>UÑ>UÐVbÐdiÐkmÐpqÐorÓ>sôô Ð.Ò0LÈsÈeÓTð	ð ä*¨3°	¸4Ó@Ü*¨7°I¸tÓDðô (¨¨U°DÓ9Ð:óó
ˆ
ô  ! Ó,ˆÜ˜3Ÿ7™7 4¨#¨s°G¸UÐ)CÓDÀQÕGÓHÐHô % UÕ+ˆÜ,¨UÀÐRWÔX‰
ˆà$'¢O”#�d”.¸ˆØ&*Ò&6”3�t”?¸DˆÜ—=’= #§*¡*¬U¯]©]Ó";¸eÕ"C×!JÑ!JÓ!LÈzÕ!YÓZˆÜ�
Š
�8 hÕ=Ü˜8Ÿ?™?¨5Ó1Ó2Ð2r(   c           
     ó"  € V^ 8”  g   V^ 8  d   \        RV RV 24      h\        P                  ! V \        P                  ! ^ V P                  R7      4      p \        P
                  ! V\        P                  ! ^ VP                  R7      4      pVe2   \        W\        P                  ! WPP                  R7      ,           4      pV'       dF   \        P
                  ! \        P                  ! V 4      \        P                  ! V4      4      pV) p V5pW#8:  g   Q RV  RV 24       h\        P                  ! W,
          \        P                  R7      p\        P                  ! V\        P                  R7      \        P                  ! V\        P                  R7      ,
          p\        P                  ! Wx,          4      p	V	^ 8¼  g   Q R4       hV	\        P                  ! VP                  4      P                  8  dH   \        P                  ! RVP                  R7      p	\        P                  ! ^ VP                  R7      p
W©.# V'       di   \        P                  ! \        P                  ! W#,           \        P                  ! R\        P                  R7      ,          4      VP                  R7      p
MC\        P                  ! \        P                  ! W V	,          ,
          4      VP                  R7      p
V	P                  VP                  4      p	W©.# )	a¬  Calculate the scale s and zero point z for the quantization relation
r = s(q-z), where r are the original values and q are the corresponding
quantized values.

r and z are calculated such that every value within [rmin,rmax] has an
approximate representation within [qmin,qmax]. In addition, qmin <= z <=
qmax is enforced. If the symmetric flag is set to True, the interval
[rmin,rmax] is symmetrized to [-absmax, +absmax], where
absmax = max(abs(rmin), abs(rmax)).

:parameter rmin: minimum value of r
:parameter rmax: maximum value of r
:parameter qmin: minimum value representable by the target quantization data type
:parameter qmax: maximum value representable by the target quantization data type
:parameter symmetric: True if the floating-point range should be made symmetric. Defaults to False.
:parameter min_real_range: Minimum floating-point range (i.e., rmax - rmin) to enforce. Defaults to None.
:return: zero and scale [z, s]

úBqmin and qmax must meet requirement: qmin <= 0 <= qmax while qmin:ú, qmmax:ri   zqmin=z > qmax=zscale issueç      ð?g       @)r+   ro   Úminimumrt   rj   Úmaximumr›   r�   ÚabsÚfloat64ÚfinfoÚtinyrŸ   rž   )ÚrminÚrmaxr¨   r©   rŒ   Úmin_real_rangeÚabsmaxÚdrÚdqrˆ   r…   s   &&&&&&     r$   Úcompute_scale_zpr¾   í   s  € ð( ˆa„x�4˜!”8ÜÐ]Ð^bÐ]cÐckÐlpÐkqÐrÓsÐsô
 �=Š=˜œuŸ{š{¨1°D·J±JÔ?Ó@€DÜ�=Š=˜œuŸ{š{¨1°D·J±JÔ?Ó@€Dð Ò!Ü�4¤§¢¨nÇJÁJÔ OÕOÓPˆçÜ—’œuŸyšy¨›´·	²	¸$³Ó@ˆØˆwˆØˆwˆàŒ<Ð5˜5   h¨t¨fÐ5Ó5ˆ<Ü	�Š�T•[¬¯©Ô	6€BÜ	�Š�T¤§¡Ô	/´%·+²+¸dÌ%Ï-É-Ô2XÕ	X€BÜ�KŠK˜�Ó €EØ�AŒ:Ð$�}Ó$ˆ:ØŒu�{Š{˜4Ÿ:™:Ó&×+Ñ+Ô+Ü—’˜C t§z¡zÔ2ˆÜ—[’[ ¨$¯*©*Ô5ˆ
ð ÐÐ÷ ô ŸšÜ—’˜T�[¬E¯KªK¸Ä5Ç=Á=Ô,QÕQÓRÐZ^×ZdÑZdô‰Jô Ÿš¤U§[¢[°¸u½Õ1DÓ%EÈTÏZÉZÔXˆJØ—‘˜TŸZ™ZÓ(ˆàÐÐr(   c                óð  € RpV \         9  dÍ   V \        P                  8X  dŸ   ^ RIHp Tp\        R4       Uu. uF  p\        V4      NK  	  pp\        P                  ! V Uu. uFA  p\        P                  ! V4      '       d   K!  \        P                  ! V4      '       d   K?  VNKC  	  up\        P                  R7      pM\        RV  R24      hV\         V &   MV \        P                  8X  d	   ^ RIHp TpVf   \        RV  R24      h\        P                  ! \         V ,          4      p\        P                  ! ^ VR7      p	\        P                  ! W,          VP                  R7      p
Wš.# u upi u upi )	aZ  Calculate the scale s for a float8 type (E4M3FN).
The function assumes the coefficient distribution and the float 8
distribution are similar to two gaussian laws.

:return: zero and scale [z, s]

More details in notebook `quantization_fp8.ipynb
<https://github.com/microsoft/onnxruntime/blob/main/docs/python/notebooks/quantization_fp8.ipynb>`_.
N)r   é   ri   zQuantization to element_type=z not implemented.zUnexpected element_type rJ   )ÚFLOAT8_DISTRIBUTIONSr
   rT   Ú	ml_dtypesr   ÚrangeÚfloatro   rt   ÚisnanÚisinfrx   r+   rw   Ústdrj   )Úelement_typerÇ   Úzp_dtyper   r~   Ú
all_valuesÚfÚvaluesÚstd_f8Úzerorˆ   s   &&         r$   Úcompute_scale_zp_float8rÏ   ,  s$  € ð €HØÔ/Ô/Øœ;×3Ñ3Ô3Ý/à$ˆHÜ,1°#¬JÓ7©J qœ% ž(©JˆJÐ7Ü—[’[Ù&ÓT™J�q¬e¯kªk¸!¯n”ÄUÇ[Â[ÐQRÇ^—�™JÑTÔ\a×\iÑ\iô‰Fô Ð<¸\¸NÐJ[Ð\Ó]Ð]Ø-3Ô˜\Ò*Ø	œ×1Ñ1Ô	1Ý+à ˆàÒÜÐ2°<°.ÀÐBÓCÐCÜ�YŠYÔ+¨LÕ9Ó:€FÜ�;Š;�q Ô)€DÜ�KŠK˜�¨C¯I©IÔ6€EØˆ=Ðùò# 8ùâTs   ¸E.Á"E3ÂE3Â#E3c               ó8   € V ^8„  d   QhRRRRRRRRRR	R
R	RR	RR/# )é   Údataúnumpy.ndarrayÚ
quant_typeúonnx.TensorProto.DataTyperŒ   Úboolr‹   rº   zfloat | NoneÚrmin_overrideÚrmax_overrideÚreturnz#tuple[numpy.ndarray, numpy.ndarray]r0   )ra   s   "r$   Ú__annotate__rÚ   P  sb   € ÷ ;Gñ ;GØ
ð;Gà)ð;Gð ð;Gð ð	;Gð
 !ð;Gð  ð;Gð  ð;Gð )ñ;Gr(   c                ó0  € \        V \        P                  4      '       g   \        R\	        V 4       R24      hVe   TpM#\        V 4      '       d   V P                  4       MRpVe   TpM#\        V 4      '       d   V P                  4       MRp\        P                  ! WpP                  R7      p\        P                  ! W€P                  R7      p\        P                  ! RV P                  R7      p	V\        P                  8X  dD   V'       d   \        R4      h\        P                  ! V 4      p
\        W4      w  r¹\        W¹^ R7      # V\        P                   \        P"                  \        P$                  \        P&                  \        P(                  \        P*                  39   d`   \-        WVR7      w  rÍ\        V 4      '       d   \/        WxWÍW$4      w  r¹M"\        P                  ! ^ VP                  R7      p\        W¹^ R7      # \1        R	V R24      h)
a‡  
Returns the zero_point and scale for the given data.

:param data: The data for which to compute quantization parameters.
:param quant_type: The quantization data type.
:param symmetric: whether symmetric quantization is used or not.
:parameter reduce_range: True if the quantization range should be reduced. Defaults to False.
:parameter min_real_range: Minimum floating-point range (i.e., rmax - rmin) to enforce. Defaults to None.
:parameter rmin_override: The value of rmin to use if not None. Otherwise, uses min(data).
:parameter rmax_override: The value of rmax to use if not None. Otherwise, uses max(data).
:return: zero point and scale
z%Weight must be given as an array not rJ   g        ri   r±   z1Unsupported option reduce_range=True for float 8.)rk   ©rŒ   z Unexpected value for quant_type=)ru   ro   rv   rw   rq   rz   rœ   r›   rt   rj   r
   rT   ÚRuntimeErrorrÇ   rÏ   r€   rL   rN   rR   rP   rX   rV   rš   r¾   r+   )rÒ   rÔ   rŒ   r‹   rº   r×   rØ   r¸   r¹   rˆ   rÇ   r…   r¨   r©   s   &&&&&&&       r$   Úcompute_data_quant_paramsrÞ   P  s�  € ô* �dœEŸM™M×*Ò*ÜÐ?ÄÀTÃ
¸|È1ÐMÓNÐNØÒ Ø‰ä  ŸYšYˆt�x‰xŒz¨CˆàÒ Ø‰ä  ŸYšYˆt�x‰xŒz¨Cˆä�;Š;�t§:¡:Ô.€DÜ�;Š;�t§:¡:Ô.€DÜ�KŠK˜ 4§:¡:Ô.€Eà”[×-Ñ-Ô-ßÜÐRÓSÐSÜ�iŠi˜‹oˆÜ3°JÓDÑˆ
Ü˜:¸qÔAÐAàÜ×ÑÜ×ÑÜ×ÑÜ×ÑÜ×ÑÜ×Ñðô ô -¨ZÐQZÔ[‰
ˆÜˆt�9Š9Ü 0°¸TÈÓ cÑˆJ˜äŸš Q¨d¯j©jÔ9ˆJÜ˜:¸qÔAÐAä
Ð7¸
°|À1ÐEÓ
FÐFr(   c               ó   € V ^8„  d   QhRR/# )rÑ   rÙ   z2tuple[numpy.ndarray, numpy.ndarray, numpy.ndarray]r0   )ra   s   "r$   rÚ   rÚ   Ž  s   € ÷ :=ñ :=à7ñ:=r(   c                óÊ  € \        V VVVVVV4      w  rxV\        P                  8X  d½   \        WW‡4      p	\	        V	P                  \        P                  4      P                  4       ^,          ^8H  4      '       dg   \        P                  ! V 4      p
\        RV
P                  4        RV
P                  4        RV	P                  4        RV	P                  4        R2	4      hWxV	3# V\        P                  \        P                  \        P                  \        P                   \        P"                  \        P$                  39   d   \        WW‡4      p	WxV	3# \'        RV R24      h)a   
:param data: data to quantize
:param qType: data type to quantize to.
:param symmetric: whether symmetric quantization is used or not.
:parameter reduce_range: True if the quantization range should be reduced. Defaults to False.
:parameter min_real_range: Minimum floating-point range (i.e., rmax - rmin) to enforce. Defaults to None.
:parameter rmin_override: The value of rmin to use if not None. Otherwise, uses min(data).
:parameter rmax_override: The value of rmax to use if not None. Otherwise, uses max(data).
: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]` -> :math:`[0, 2^{b-1}]` and
- when data `type == int8`, from `[-m , m]` -> :math:`[-(2^{b-1}-1), 2^{b-1}-1]` where
    `m = max(abs(rmin), abs(rmax))`

and add necessary intermediate nodes to transform quantized weight to full weight using the equation

:math:`r = S(q-z)`, where

- *r*: real original value
- *q*: quantized value
- *S*: scale
- *z*: zero point
z+One of the quantized value is NaN data in [z, z], quantized_data in [z].zUnexpected value for qType=rJ   )rÞ   r
   rT   r­   ÚanyÚviewro   rf   Úravelr�   rÝ   rœ   r›   rL   rN   rR   rP   rX   rV   r+   )rÒ   r¡   rŒ   r‹   rº   r×   rØ   r…   rˆ   Úquantized_dataÚnp_datas   &&&&&&&    r$   Úquantize_dataræ   Ž  sO  € ô8 2ØØØØØØØóÑ€Jð ”×(Ñ(Ô(Ü)¨%°uÓIˆÜ�×#Ñ#¤E§K¡KÓ0×6Ñ6Ó8¸3Õ>À3ÑF×GÒGÜ—m’m DÓ)ˆGÜØ=¸g¿k¹k»m¸_ÈBÈwÏ{É{Ë}Èoð ^&Ø&4×&8Ñ&8Ó&:Ð%;¸2¸n×>PÑ>PÓ>RÐ=SÐSUðWóð ð  .Ð0Ð0àÜ×ÑÜ×ÑÜ×ÑÜ×ÑÜ×ÑÜ×Ñðô ô *¨%°uÓIˆØ .Ð0Ð0ä
Ð2°5°'¸Ð;Ó
<Ð<r(   c               ó4   € V ^8„  d   QhRRRRRRRRRR	R
RRR/# )rÑ   Úweightzonnx.TensorProtorÔ   rÕ   r…   rÓ   rˆ   Úaxisz
int | NoneÚquant_weight_namez
str | NonerÙ   r0   )ra   s   "r$   rÚ   rÚ   Ë  sW   € ÷ L ñ L ØðL à)ðL ð ðL ð ð	L ð
 ðL ð "ðL ð ñL r(   c                ó  € \        V 4      pRpVf   \        WP                  4       W24      pMÅVP                  V,          p\	        VP                  4      p	^W”&   . p
\        V4       Fr  pVP                  W´4      pW;,          pW+,          p\        WP                  4       WÞ4      pV
P                  \        P                  ! V4      P                  V	4      4       Kt  	  \        P                  ! W¤4      pV'       d   TMV P                   \         2pV\        P                  P                   8X  Ed6   \        P                  ! 4       pVVn        VP$                  P'                  V P$                  4       VVn        VP)                  4       P+                  4       P-                  4       Vn        \0        e³   \1        V4      pVP                  VP                  8w  g$   VP-                  4       VP-                  4       8w  dj   \3        RVP                   RVP-                  4       R,           RVP-                  4       R,           RV P                   R\5        V4      R,           R	24      hV# V\        P                  P6                  \        P                  P8                  39   d|   VP:                  \<        \>        39  d   \3        R
V R24      h\A        \C        VP-                  4       4      4      p\        PD                  PG                  VWP$                  VRR7      pV# \        PD                  PI                  V4      p\        P                  ! VVR7      P                  V P$                  4      p\        PJ                  PM                  VV4      pV# )a  
Returns a quantized version of the given ONNX initializer.

:param weight: The ONNX initializer to quantize.
:param quant_type: The final quantized data type.
:param zero_point: The zero-point value to use for quantization.
:param scale: The scale value to use for quantization.
:param axis: The quantization axis if quantizing per-channel. Defaults to None.
:param quant_weight_name: The name of the quantized initializer.
                          If not specified, the quantized name is generated.
:return: The quantized ONNX initializer.
NzThe initializer of shape z! could not be created, expecting :Né
   Nz, got z and shape=z
raw=:NéÈ   NrJ   zQuantized weights for z. must be 8-bit before packing as 4-bit values.T)Úrawri   )'Útensor_proto_to_arrayr­   rã   ÚshapeÚlistrÃ   Útakers   ro   r�   ÚreshapeÚconcatenater!   ÚTENSOR_NAME_QUANT_SUFFIXr–   r
   rT   Ú	data_typeÚdimsÚextendÚflattenÚcopyÚtobytesÚraw_datar   rÝ   ÚstrrX   rV   rj   r   r   ÚbytesÚpack_bytes_to_4bitr—   r˜   Útensor_dtype_to_np_dtypeÚnumpy_helperÚ
from_array)rè   rÔ   r…   rˆ   ré   rê   Úweight_dataÚq_weight_dataÚchannel_countÚchannel_dimsÚquantized_channel_data_listr~   Úchannel_dataÚchannel_scaleÚchannel_zero_pointÚquantized_channel_dataÚq_weight_nameÚq_weight_initializerÚcheckÚpacked_dataÚquant_np_dtypes   &&&&&&               r$   Úquantize_onnx_initializerr  Ë  s  € ô( (¨Ó/€KØ*.€Mà‚|Ü(¨×5FÑ5FÓ5HÈ%Ó\‰à#×)Ñ)¨$Õ/ˆÜ˜K×-Ñ-Ó.ˆØˆÑØ&(Ð#ä�}Ö%ˆAØ&×+Ñ+¨AÓ4ˆLØ!�HˆMØ!+¥ÐÜ%5Ø×.Ñ.Ó0°-ó&Ð"ð (×.Ñ.¬u¯}ª}Ð=SÓ/T×/\Ñ/\Ð]iÓ/jÖkñ &ô ×)Ò)Ð*EÓLˆç):Ñ%À6Ç;Á;À-ÔPhÐOiÐ@j€Mà”T×%Ñ%×2Ñ2Õ2Ü#×/Ò/Ó1ÐØ)3ÐÔ&Ø×!Ñ!×(Ñ(¨¯©Ô5Ø$1ÐÔ!à(5×(=Ñ(=Ó(?×(DÑ(DÓ(F×(NÑ(NÓ(PÐÔ%ÜÒ(ô &Ð&:Ó;ˆEØ�{‰{˜k×/Ñ/Ô/°5·=±=³?Àm×F[ÑF[ÓF]Ô3]Ü"Ø/°×0AÑ0AÐ/BÐBcØ$×,Ñ,Ó.¨sÕ3Ð4°F¸5¿=¹=»?È3Õ;OÐ:PÐP[Ð\b×\hÑ\hÐ[iØœSÐ!5Ó6°tÕ<Ð=¸Qð@óð ð(  Ðð 
œ×(Ñ(×-Ñ-¬t×/?Ñ/?×/EÑ/EÐFÔ	FØ×Ñ¤t¬U mÔ3ÜÐ!7¸°ÐFtÐuÓvÐvô Ô.¨}×/DÑ/DÓ/FÓGÓHˆô  $Ÿ{™{×6Ñ6°}Àj×R]ÑR]Ð_jÐptÐ6ÓuÐð  Ðô	 Ÿ™×=Ñ=¸jÓIˆÜŸš m¸>ÔJ×RÑRÐSY×S^ÑS^Ó_ˆÜ#×0Ñ0×;Ñ;¸MÈ=ÓYÐàÐr(   c                ó¦  € V \         P                  P                  8X  d   \        R4      hRpV'       d   \        P                  V 4      pM6V'       d   V \        9   d   \        V ,          pM\        P                  V 4      pV'       g   \        RV  R24      hVw  rEV^ 8”  g   V^ 8  d(   \        RV RV RVP                   RV R	V R
V  24      hV# )z½
Return qmin and qmax, the minimum and maximum value representable by the given qType
:parameter qType: onnx.onnx_pb.TensorProto.UINT8 or onnx.onnx_pb.TensorProto.UINT8
:return: qmin, qmax
z;This function is not implemented for float 8 as not needed.Nr‚   rƒ   r¯   r°   z, dtype=z, reduce_range=z, symmetric=z, qType=)
r�   r
   rT   r“   ÚONNX_INT_TYPE_REDUCED_RANGEÚgetÚONNX_INT_TYPE_SYMMETRIC_RANGEÚONNX_INT_TYPE_RANGEr+   rj   )r¡   r‹   rŒ   Úqranger¨   r©   s   &&&   r$   rš   rš     sØ   € ð ”
×&Ñ&×3Ñ3Ô3Ü!Ð"_Ó`Ð`à€FçÜ,×0Ñ0°Ó7‰ß	�uÔ =Ô=Ü.¨uÕ5‰ä$×(Ñ(¨Ó/ˆçÜÐ0°°Ð7uÐvÓwÐwà�J€DØˆa„x�4˜!”8ÜðØ�6˜ $  x°·
±
¨|¸?È<È.ð YØ"˜ 8¨E¨7ð4ó
ð 	
ð €Mr(   c                ó0   € \        WVR7      w  r4WC,
          # )zƒ
Helper function to get the quantization range for a type.
    parameter qType: quantization type.
    return: quantization range.
rÜ   )rš   )r¡   r‹   rŒ   r¨   r©   s   &&&  r$   Úget_qrange_for_qTyper  :  s   € ô )¨È	ÔR�J€DØ�;Ðr(   c               ó$   € V ^8„  d   QhRRRRRR/# )rÑ   ré   ÚintÚrankrÙ   ztuple[bool, int]r0   )ra   s   "r$   rÚ   rÚ   D  s"   € ÷ 	ñ 	˜ð 	 Cð 	Ð,<ñ 	r(   c                óL   € V ^ 8  d	   W,           MT pV^ 8¬  ;'       d    W!8  pW23# )zÓ
Helper function that tries to return a normalized axis in the range [0, rank - 1].
:parameter axis: The axis to normalize.
:parameter rank: The tensor rank (number of dimensions).
:return (is_valid, axis_norm)
r0   )ré   r  Ú	axis_normÚis_valids   &&  r$   Únormalize_axisr   D  s0   € ð  $ aœx�–¨T€IØ˜A‰~×2Ð2 )Ñ"2€HØÐÐr(   c               ó    € V ^8„  d   QhRRRR/# )rÑ   Úsrc_8bitrþ   rÙ   Ú	bytearrayr0   )ra   s   "r$   rÚ   rÚ   P  s   € ÷ ñ  ð ¨9ñ r(   c                óR  € \        V 4      pV^ 8X  d   \        4       # V^,           ^,          p\        V4      p^ p^ pWA^,
          8  dH   W^,           ,          ^,          ^,          W,          ^,          ,          W5&   V^,          pV^,          pKT  WA8  d   W,          ^,          W5&   V# )a.  
Copies a source array of 8-bit values into a destination bytearray of packed 4-bit values.
Assumes that the source values are already in the appropriate int4 range.
:parameter src_8bit: The 8-bit element values to pack.
:return A bytearray with every two 8-bit src elements packed into a single byte.
)rz   r#  )r"  Ú	num_elemsÚdst_sizeÚdstÚsrc_iÚdst_is   &     r$   rÿ   rÿ   P  s™   € ô �H“€IØ�A„~Ü‹{Ðà˜A• !Õ#€HÜ
�HÓ
€Cà€EØ€Eð ˜a•-Ô
Ø¨¥	Õ*¨SÕ0°QÕ6¸8½?ÈSÕ;PÕQˆ‰
Ø��
ˆØ��
ŠàÔà•_ sÕ*ˆ‰
à€Jr(   c                  ó*   € ] tR tRtRt. . R3R ltRtR# )ÚQuantizedInitializerin  zB
Represents a linearly quantized weight input from ONNX operators
Nc
                	ór   € Wn         W n        W0n        W@n        WPn        W`n        Wpn        W€n        W�n        R # r   )	r!   ÚinitializerÚrminsÚrmaxsÚzero_pointsÚscalesrÒ   rä   ré   )
r#   r!   r-  r.  r/  r0  r1  rÒ   rä   ré   s
   &&&&&&&&&&r$   Ú__init__ÚQuantizedInitializer.__init__s  s4   € ð Œ	Ø&ÔØŒ
ØŒ
à&ÔØŒØŒ	Ø,ÔàŽ	r(   )	ré   rÒ   r-  r!   rä   r/  r.  r1  r0  ©r1   r2   r3   r4   Ú__doc__r2  r8   r0   r(   r$   r+  r+  n  s   † ñð ØØ÷ð r(   r+  c                  ó$   € ] tR tRtRtRR ltRtR# )ÚQuantizedValuei�  zA
Represents a linearly quantized value (input\output\intializer)
Nc
                	ór   € Wn         W n        W0n        W@n        WPn        W`n        Wpn        W€n        W�n        R # r   )	Úoriginal_nameÚq_nameÚ
scale_nameÚzp_nameÚ
value_typeré   Ú	node_typeÚ
node_qtypeÚ
scale_type)
r#   r!   Únew_quantized_namer;  Úzero_point_nameÚquantized_value_typeré   r>  r?  r@  s
   &&&&&&&&&&r$   r2  ÚQuantizedValue.__init__’  s2   € ð "ÔØ(ŒØ$ŒØ&ŒØ.ŒØŒ	Ø"ŒØ$ŒØ$Žr(   )	ré   r?  r>  r9  r:  r;  r@  r=  r<  )NNNNr4  r0   r(   r$   r7  r7  �  s   † ñ÷%ð %r(   r7  c                  ó    € ] tR tRtRtR tRtR# )ÚBiasToQuantizei©  z#
Represents a bias to be quantized
c                	ó*   € Wn         W n        W0n        R # r   ©Ú	bias_nameÚ
input_nameÚweight_name)r#   rI  rJ  rK  s   &&&&r$   r2  ÚBiasToQuantize.__init__®  s   € Ø"ŒØ$ŒØ&Ör(   rH  Nr4  r0   r(   r$   rF  rF  ©  s   † ñö'r(   rF  c                ó  € V P                   ^ 8X  d   \        RV P                   R24      hV P                   ^8X  d   V P                  pEM5V P                   ^8X  d   V P                  pEMV P                   ^8X  d   V P
                  pMøV P                   ^8X  d   V P                  pMÚV P                   ^8X  d   V P                  pM¼V P                   ^8X  d   V P                  pMžV P                   ^8X  d   V P                  pM€V P                   ^8X  d   V P                  pMbV P                   ^	8X  d   V P                  pMDV P                   ^
8X  d   V P                  pM&\        RV P                   RV P                    R24      hV P                  V/# )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.
z
attribute z does not have type specified.z has unsupported type rJ   )rq   r+   r!   rË   r~   ÚsrG   ÚgÚfloatsÚintsÚstringsÚtensorsÚgraphs)Ú	attributer†   s   & r$   Úattribute_to_kwargrV  ´  s;  € ð ‡~�~˜ÔÜ˜: i§n¡nÐ%5Ð5SÐTÓUÐUð ‡~�~˜ÔØ—‘ŠØ	�‰˜1Ô	Ø—‘ŠØ	�‰˜1Ô	Ø—‘‰Ø	�‰˜1Ô	Ø—‘‰Ø	�‰˜1Ô	Ø—‘‰Ø	�‰˜1Ô	Ø× Ñ ‰Ø	�‰˜1Ô	Ø—‘‰Ø	�‰˜1Ô	Ø×!Ñ!‰Ø	�‰˜1Ô	Ø×!Ñ!‰Ø	�‰˜2Ô	Ø× Ñ ‰ä˜: i§n¡nÐ%5Ð5KÈIÏNÉNÐK[Ð[\Ð]Ó^Ð^à�N‰N˜EÐ"Ð"r(   c                óˆ   € V Uu. uF  q"P                   V 8X  g   K  VNK  	  pp\        V4      ^ 8”  d
   V^ ,          # R# u upi )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.
N)r!   rz   )Ú	item_nameÚ	item_listÚitemÚitemss   &&  r$   Úfind_by_namer\  Ù  sB   € ñ (ÓB™i�d¯9©9¸	Ñ+A�TˆT™i€EÐBÜ˜5“z A”~ˆ5��8Ð/¨4Ð/ùò Cs   …?œ?c                ób   € Rp\        \        V4      4       F  pW,          V 8X  g   K  TpK  	  V# )z;
Helper function to return index of an item in a node list
rm   )rÃ   rz   )Ú	elem_nameÚ	elem_listÚelem_idxr~   s   &&  r$   Úget_elem_indexra  ä  s2   € ð €HÜ”3�y“>Ö"ˆØ�<˜9Ö$ØŠHñ #ð €Or(   c                óF   € \         P                  P                  RW.V4      # )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)r–   r—   r   )ÚinputsÚoutputr!   s   &&&r$   Úget_mul_noderf  ï  s   € ô �;‰;× Ñ  ¨°¸$Ó?Ð?r(   c               ó$   € V ^8„  d   QhRRRRRR/# )rÑ   Úfilenamer   Ú
identifierrý   rÙ   r0   )ra   s   "r$   rÚ   rÚ   ú  s&   € ÷ Rñ R¨4ð R¸Sð RÀTñ Rr(   c                ó|   € V P                   P                  V P                  V,           V P                  ,           4      # )zh
Helper function to generate a identifiable filepath by concatenating the given identifier as a suffix.
)ÚparentÚjoinpathÚstemÚsuffix)rh  ri  s   &&r$   Úgenerate_identified_filenamero  ú  s+   € ð �?‰?×#Ñ# H§M¡M°JÕ$>ÀÇÁÕ$PÓQÐQr(   c                ó`  € ^ RI p^ RIHp ^ RIpVP                  ! VP
                  R7       \        R4       \        V 4       \        R4       \        V4       VP                  WRR7       VP                  R4       VP                  R4       VP                  R	4       VP                  4        R# )
r   N)Ú	thresholdz
Histogram:zHistogram Edges:T)ÚfillzTensor valueÚCountszTensor value V.S. Counts)ÚsysÚmatplotlib.pyplotÚpyplotro   Úset_printoptionsÚmaxsizeÚprintÚstairsÚxlabelÚylabelÚtitleÚshow)ÚhistÚ
hist_edgesrt  Úpltro   s   &&   r$   Ú
apply_plotr‚    s{   € Ûå#Ûà	×Ò S§[¡[Õ1Ü	ˆ,ÔÜ	ˆ$„KÜ	Ð
ÔÜ	ˆ*ÔØ‡J�Jˆt d€JÔ+Ø‡J�Jˆ~ÔØ‡J�JˆxÔØ‡I�IÐ(Ô)Ø‡H�H†Jr(   c           
     óÖ	  aaaaa€ ^ RI o^ RIp^ RIo^ RIHu Hu Hp ^ RIHu Hu Hp ^ RI	H
oHoHo \        P                  ! RV  24        ! VVVVV3R lRSP                  4      pSP!                  WR7      p\#        \$        P&                  P)                  VR4      R4      ;_uu_ 4       pVP+                  V4       RRR4       SP-                  ^ 4      pVP/                  R	4      p	. p
\1        V P3                  4       4       Fú  pW,          pVP5                  4       p\7        VP9                  R
V4      P;                  4       4      \7        VP9                  RV4      P;                  4       4      .p\=        \?        V4      4      pV	PA                  V4      pV	PA                  V4      pVPC                  V	4       VPE                  V	V4       VPG                  V	V4       VPI                  V	4      pV
PK                  V4       Kü  	  VPM                  V	\O        V
4      4       V
 F  pV	PQ                  V4       K  	  V	PS                  4       pVPU                  V	4       VPW                  V	V4       VPY                  V	4      pV	P[                  V4       V	P]                  4       p\#        \$        P&                  P)                  VR4      R4      ;_uu_ 4       pVP+                  V4       RRR4       \$        P^                  P9                  RR4      R9   d˜   VP                  Pa                  V^ 4      pVPc                  4       p\e        V4       F\  pVPg                  V4      p\        P                  ! VPi                  4       4       \        P                  ! VPk                  4       4       K^  	  \#        \$        P&                  P)                  VR4      R4      ;_uu_ 4       p\1        V P3                  4       4       F±  pW,          pVP5                  4       p\7        VP9                  R
V4      P;                  4       4      \7        VP9                  RV4      P;                  4       4      .pVR,           \=        \?        V4      4      ,           pVP+                  V4       VP+                  R4       K³  	  RRR4       R#   + '       g   i     ELù; i  + '       g   i     ELì; i  + '       g   i     R# ; i)z6
Helper function to write calibration table to files.
N)ÚCalibrationMethodÚ
TensorDataÚTensorsDatazcalibration cache: c                  ó,   <€ ] tR tRtV VVVV3R ltRtR# )Ú*write_calibration_table.<locals>.MyEncoderi#  c                	óv  <€ \        VSS34      '       d   VP                  4       # \        VSP                  4      '       d*   R VP                  4       R\	        VP
                  4      RR/# \        VS4      '       d$   RVP                  P                  R\	        V4      /# SP                  P                  W4      # )rÒ   rj   ÚCLSznumpy.arrayr†   )
ru   Úto_dictrv   Útolistrý   rj   Ú	__class__r1   ÚJSONEncoderÚdefault)r#   Úobjr„  r…  r†  ÚjsonÚnps   &&€€€€€r$   r�  Ú2write_calibration_table.<locals>.MyEncoder.default$  s•   ø€ Ü˜# 
¨KÐ8×9Ò9Ø—{‘{“}Ð$Ü˜#˜rŸz™z×*Ò*Ø §
¡
£¨g´s¸3¿9¹9³~ÀuÈmÐ\Ð\Ü˜#Ð0×1Ò1Ø˜sŸ}™}×5Ñ5°wÄÀCÃÐIÐIØ×#Ñ#×+Ñ+¨DÓ6Ð6r(   r0   N)r1   r2   r3   r4   r�  r8   )r„  r…  r†  r‘  r’  s   €€€€€r$   Ú	MyEncoderrˆ  #  s   ø† ÷	7õ 	7r(   r”  )Úclszcalibration.jsonÚwi   ÚhighestÚlowestzcalibration.flatbuffersÚwbÚQUANTIZATION_DEBUGÚ0zcalibration.cacheÚ Ú
)é   Ú1)6r‘  Úflatbuffersro   Ú5onnxruntime.quantization.CalTableFlatBuffers.KeyValueÚquantizationÚCalTableFlatBuffersÚKeyValueÚ5onnxruntime.quantization.CalTableFlatBuffers.TrtTableÚTrtTableÚ"onnxruntime.quantization.calibrater„  r…  r†  ÚloggingÚinforŽ  ÚdumpsÚopenÚosÚpathÚjoinÚwritert   ÚBuilderÚsortedÚkeysr‹  rÄ   r  rZ  rý   r›   ÚCreateStringÚKeyValueStartÚKeyValueAddKeyÚKeyValueAddValueÚKeyValueEndrs   ÚTrtTableStartDictVectorrz   ÚPrependUOffsetTRelativeÚ	EndVectorÚTrtTableStartÚTrtTableAddDictÚTrtTableEndÚFinishÚOutputÚenvironÚGetRootAsTrtTableÚ
DictLengthrÃ   ÚDictÚKeyÚValue)Úcalibration_cacheÚdirr   r¤  r¦  r”  Ú	json_dataÚfilerÎ   ÚbuilderÚkey_value_listÚkeyrÌ   Úd_valuesrP  r†   Úflat_keyÚ
flat_valueÚ	key_valueÚ	main_dictÚ	cal_tableÚbufÚdict_lenr~   r„  r…  r†  r‘  r’  s   &&                      @@@@@r$   Úwrite_calibration_tablerÕ    s½  ü€ ó
 ãÛçLÓLßLÓLß]Ñ]ä‡L‚LÐ&Ð'8Ð&9Ð:Ô;÷7ó 7�D×$Ñ$ô 7ð —
‘
Ð,�
Ó<€Iä	Œb�g‰g�l‰l˜3Ð 2Ó3°S×	9Ô	9¸TØ�
‰
�9Ô÷ 
:ð �8‰8�A‹;€DØ×!Ñ! $Ó'€GØ€NÜÐ'×,Ñ,Ó.Ö/ˆØ"Õ'ˆØ—>‘>Ó#ˆä�(—,‘,˜y¨$Ó/×4Ñ4Ó6Ó7Ü�(—,‘,˜x¨Ó.×3Ñ3Ó5Ó6ð
ˆô ”C˜“KÓ ˆà×'Ñ'¨Ó,ˆØ×)Ñ)¨%Ó0ˆ
à×Ñ˜wÔ'Ø×Ñ ¨Ô2Ø×!Ñ! '¨:Ô6Ø×(Ñ(¨Ó1ˆ	à×Ñ˜iÖ(ñ# 0ð& ×$Ñ$ W¬c°.Ó.AÔBÛ#ˆ	Ø×'Ñ'¨	Ö2ñ $à×!Ñ!Ó#€Ià×Ñ˜7Ô#Ø×Ñ˜W iÔ0Ø×$Ñ$ WÓ-€Ià‡N�N�9ÔØ
�.‰.Ó
€Cä	Œb�g‰g�l‰l˜3Ð 9Ó:¸D×	AÔ	AÀTØ�
‰
�3Œ÷ 
Bô 
‡z�z‡~�~Ð*¨CÓ0°HÔ<Ø×%Ñ%×7Ñ7¸¸QÓ?ˆ	Ø×'Ñ'Ó)ˆÜ�x–ˆAØ!Ÿ™ qÓ)ˆIÜ�LŠL˜Ÿ™›Ô)Ü�LŠL˜Ÿ™Ó*Ö+ñ !ô 
Œb�g‰g�l‰l˜3Ð 3Ó4°c×	:Ô	:¸dÜÐ+×0Ñ0Ó2Ö3ˆCØ&Õ+ˆFØ—~‘~Ó'ˆHä�h—l‘l 9¨dÓ3×8Ñ8Ó:Ó;Ü�h—l‘l 8¨TÓ2×7Ñ7Ó9Ó:ðˆFð ˜#•I¤¤C¨£KÓ 0Õ0ˆEØ�J‰J�uÔØ�J‰J�tÖñ 4÷ 
;Ñ	:÷g 
:×	9Ð	9ú÷L 
B×	AÐ	Aú÷ 
;×	:Ð	:ús%   Â-R/ËSÏCSÒ/S 	ÓS	ÓS(	c                ó  € V ^ 8H  P                  \        P                  4      pV ^ 8g  P                  \        P                  4      pVP                  4       pV P                  V,
          pV'       g   R# V\        V4      ,          \        V4      ,          pVR8  g   Q RV RV RV 24       hV P                  \        P                  4      pWqV,          V) V,          ,           ,          pV^ 8*  P                  4       ^ 8X  g   Q hV# )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
Nr±   zn_zeros=z, n_nonzeros=z, eps1=)rž   ro   rx   ÚsumÚsizerÄ   )ÚpÚepsÚis_zerosÚis_nonzerosÚn_zerosÚ
n_nonzerosÚeps1r  s   &&      r$   Úsmooth_distributionrà  o  sÓ   € ð �Q‘�‰œuŸ}™}Ó-€HØ˜‘6—/‘/¤%§-¡-Ó0€KØ�l‰l‹n€GØ—‘˜'Õ!€JçáØ”�w“Õ¤%¨
Ó"3Õ3€DØ�#Œ:ÐQ˜ ' ¨-¸
°|À7È4È&ÐQÓQˆ:à�8‰8”E—M‘MÓ"€DØ�(�N˜t˜e {Õ2Õ2Õ2€DØ�A‰I�?‰?Ó Ô!Ð!Ð!à€Kr(   c               ó   € V ^8„  d   QhRR/# )rÑ   Ú
model_pathr   r0   )ra   s   "r$   rÚ   rÚ   ˆ  s   € ÷ nñ n¨ñ nr(   c                ó  € \         P                  ! V P                  4       R R7      p\        ;QJ d0    R VP                  P
                   4       F  '       g   K   R# 	  R # ! R VP                  P
                   4       4      # )F)Úload_external_datac              3  óN   "  € T F  p\         P                  ! V4      x € K  	  R # 5ir   )r   Úuses_external_data)Ú.0Ú
intializers   & r$   Ú	<genexpr>Ú*model_has_external_data.<locals>.<genexpr>Š  s!   é € ÐmÑUlÀzÔ#×6Ò6°z×BÐBÓUlùs   ‚#%T)r–   ÚloadÚas_posixrá   Úgraphr-  )râ  Úmodels   & r$   Úmodel_has_external_datarï  ˆ  s^   € Ü�IŠI�j×)Ñ)Ó+ÀÔF€Eß‹3ÑmÐUZ×U`ÑU`×UlÒUlÓm�3Œ3ÐmŠ3Ðmˆ3ÑmÐUZ×U`ÑU`×UlÒUlÓmÓmÐmr(   c               ó    € V ^8„  d   QhRRRR/# )rÑ   râ  r   Úopt_model_pathr0   )ra   s   "r$   rÚ   rÚ   �  s   € ÷ kñ k˜tð k°Tñ kr(   c                óº   € \        4       pVP                  4       Vn        \        P                  Vn        / pR.VR&   \        V P                  4       V3RR./VB pR# )zä
    Generate model that applies graph optimization (constant folding, etc.)
    parameter model_path: path to the original onnx model
    parameter opt_model_path: path to the optimized onnx model
:return: optimized onnx model
ÚConstantSharingÚdisabled_optimizersÚ	providersÚCPUExecutionProviderN)r   rì  Úoptimized_model_filepathr   ÚORT_ENABLE_BASICÚgraph_optimization_levelr   )râ  rñ  Úsess_optionÚkwargsÚ_s   &&   r$   Úoptimize_modelrý  �  sb   € ô !Ó"€KØ+9×+BÑ+BÓ+D€KÔ(Ü+A×+RÑ+R€KÔ(Ø€Fà%6Ð$7€FÐ Ñ!Ü˜×,Ñ,Ó.°ÑjÐH^ÐG_ÐjÐciÑj‚Ar(   c               ó   € V ^8„  d   QhRR/# ©rÑ   rî  r	   r0   )ra   s   "r$   rÚ   rÚ   �  s   € ÷ 7ñ 7 Jñ 7r(   c                óä   € RR/pV P                   '       d;   V P                    F*  pVP                  VP                  VP                  /4       K,  	  \        P
                  P                  W4       R# )z>Tag the model that it went through quantization pre-processingúonnx.quant.pre_processúonnxruntime.quantN©Úmetadata_propsÚupdaterÌ  r†   r–   r—   Úset_model_props)rî  r  Úprops   &  r$   Úadd_pre_process_metadatar  �  sV   € à.Ð0CÐD€NØ××ÐØ×(Ô(ˆDØ×!Ñ! 4§8¡8¨T¯Z©ZÐ"8Ö9ñ )ä‡K�K×Ñ Ö6r(   c               ó    € V ^8„  d   QhRRRR/# ©rÑ   rî  r	   rÙ   rÖ   r0   )ra   s   "r$   rÚ   rÚ   ¦  s   € ÷ ñ ¨*ð ¸ñ r(   c                óž   € V P                   '       d;   V P                    F*  pVP                  R8X  g   K  VP                  R8X  g   K)   R# 	  R# )zCCheck the model whether it went through quantization pre-processingr  r  TF©r  rÌ  r†   )rî  r  s   & r$   Úmodel_has_pre_process_metadatar  ¦  s?   € à××ÐØ×(Ô(ˆDØ�x‰xÐ3Ö3¸¿
¹
ÐFYÖ8YÚñ )ñ r(   c               ó   € V ^8„  d   QhRR/# rÿ  r0   )ra   s   "r$   rÚ   rÚ   ¯  s   € ÷ 7ñ 7˜jñ 7r(   c                óä   € R R/pV P                   '       d;   V P                    F*  pVP                  VP                  VP                  /4       K,  	  \        P
                  P                  W4       R# )ú
onnx.inferr  Nr  )rî  r  rÙ  s   &  r$   Úadd_infer_metadatar  ¯  sV   € Ø"Ð$7Ð8€NØ××ÐØ×%Ô%ˆAØ×!Ñ! 1§5¡5¨!¯'©'Ð"2Ö3ñ &ä‡K�K×Ñ Ö6r(   c               ó    € V ^8„  d   QhRRRR/# r
  r0   )ra   s   "r$   rÚ   rÚ   ·  s   € ÷ ñ  Jð °4ñ r(   c                óž   € V P                   '       d;   V P                    F*  pVP                  R 8X  g   K  VP                  R8X  g   K)   R# 	  R# )r  r  TFr  )rî  rÙ  s   & r$   Úmodel_has_infer_metadatar  ·  s>   € Ø××ÐØ×%Ô%ˆAØ�u‰u˜Ö$¨¯©Ð4GÖ)GÚñ &ñ r(   c               ó    € V ^8„  d   QhRRRR/# )rÑ   rî  r	   rÙ   r  r0   )ra   s   "r$   rÚ   rÚ   ¿  s   € ÷ ñ ˜Zð ¨Cñ r(   c                óê   € V P                    Uu. uF)  qP                  '       d   VP                  R 8X  g   K'  VNK+  	  pp\        V4      ^8w  d   \        R4      hV^ ,          P                  pV# u upi )r   z$Failed to find proper ai.onnx domain)Úopset_importÚdomainrz   r+   Úversion)rî  ÚopsetÚai_onnx_domainÚopset_versions   &   r$   Úget_opset_versionr  ¿  sj   € Ø).×);Ò);ÓmÑ); Ç<Ç<À<ÐSX×S_ÑS_ÐclÑSl—e�eÑ);€NÐmÜ
ˆ>Ó˜aÔÜÐ?Ó@Ð@Ø" 1Õ%×-Ñ-€MàÐùò ns
   �$A0¸A0c               ó$   € V ^8„  d   QhRRRRRR/# )rÑ   rî  r	   Úweight_typerC   rÙ   r0   )ra   s   "r$   rÚ   rÚ   È  s!   € ÷ !ñ ! 
ð !¸ð !Àzñ !r(   c                óª  € \        V 4      pTp\        VR V4      pV^8  d=   V\        P                  P                  8X  d   \
        P                  ! RV R24       ^pMEV^
8X  d   \
        P                  ! RV R24       M#V^
8  d   \
        P                  ! RV R24       ^pW28w  d+   \        P                  P                  W4      p \        V 4      p V # )rY   z$The original model opset version is z¨, which does not support quantization to float 8. Please update the model to opset >= 19. Automatically update the model to opset 19. Please verify the quantized model.ze, which does not support node fusions. Please update the model to opset >= 11 for better performance.z�, which does not support quantization. Please update the model to opset >= 11. Automatically update the model to opset 11. Please verify the quantized model.)
r  Úgetattrr–   r
   rT   r¨  ÚwarningÚversion_converterÚconvert_versionÚ&save_and_reload_model_with_shape_infer)rî  r  r  Útarget_opset_versionÚweight_quant_types   &&   r$   Úupdate_opset_versionr(  È  sè   € Ü% eÓ,€MØ(ÐÜ ¨]¸KÓHÐà�rÔÐ/´4×3CÑ3C×3PÑ3PÔPÜ�ŠØ2°=°/ð B1ð 1ô	
ð
  "Ñà	˜"Ô	Ü�ŠØ2°=°/ð BMð Mõ	
ð
 
˜Ô	Ü�ŠØ2°=°/ð B1ð 1ô	
ð
  "ÐàÔ,Ü×&Ñ&×6Ñ6°uÓSˆô 7°uÓ=ˆà€Lr(   c               ó    € V ^8„  d   QhRRRR/# )rÑ   râ  r   rÙ   r	   r0   )ra   s   "r$   rÚ   rÚ   ì  s   € ÷ ñ ¨Dð °Zñ r(   c                ó   € \        V R 4      p\        P                  P                  \	        V 4      \	        V4      4       \        P
                  ! VP                  4       4      p\        V4       VP                  4        V# )z	-inferred)	ro  r–   Úshape_inferenceÚinfer_shapes_pathrý   rë  rì  r  Úunlink)râ  Úinferred_model_pathrî  s   &  r$   Úload_model_with_shape_inferr/  ì  s`   € Ü6°zÀ;ÓOÐÜ×Ñ×*Ñ*¬3¨z«?¼CÐ@SÓ<TÔUÜ�IŠIÐ)×2Ñ2Ó4Ó5€EÜ�uÔØ×ÑÔ Ø€Lr(   c               ó    € V ^8„  d   QhRRRR/# )rÑ   rî  r	   rÙ   r0   )ra   s   "r$   rÚ   rÚ   õ  s   € ÷ 7ñ 7°*ð 7Àñ 7r(   c                ó@  € \         P                  ! R R7      ;_uu_ 4       p\        P                  ! V 4      p\	        V4      P                  R4      p\        P                  ! W#P                  4       RR7       \        V4      uuRRR4       #   + '       g   i     R# ; i)z
ort.quant.)Úprefixz
model.onnxT)Úsave_as_external_dataN)
ÚtempfileÚTemporaryDirectoryrú   Údeepcopyr   rl  r–   Ú
save_modelrì  r/  )rî  Úquant_tmp_dirÚ
model_copyrâ  s   &   r$   r%  r%  õ  sg   € Ü	×	$Ò	$¨L×	9Õ	9¸]Ü—]’] 5Ó)ˆ
Ü˜-Ó(×1Ñ1°,Ó?ˆ
Ü�Š˜
×$7Ñ$7Ó$9ÐQUÕVÜ*¨:Ó6÷	 
:×	9×	9Ó	9ús    A!BÂB	c               ó    € V ^8„  d   QhRRRR/# )rÑ   r-  r
   rÙ   rÓ   r0   )ra   s   "r$   rÚ   rÚ   ý  s   € ÷ ñ  {ð °}ñ r(   c                ó&  € V P                   \        P                  P                  \        P                  P                  39   d    \
        P                  P                  V 4      # \        R V P                   R\        V P                   ,           24      h)z&Only float type is supported. Weights z is )rö   r�   r
   r”   r•   r–   r  Úto_arrayr+   r!   Útype_to_name)r-  s   &r$   rï   rï   ý  su   € Ø×Ñ¤×!7Ñ!7×!=Ñ!=¼z×?UÑ?U×?]Ñ?]Ð ^Ô^Ü× Ñ ×)Ñ)¨+Ó6Ð6ä
Ø
0°×1AÑ1AÐ0BÀ$Ä|ÐT_×TiÑTiÕGjÐFkÐlóð r(   c               ó    € V ^8„  d   QhRRRR/# ©rÑ   Útensor_namerý   rÙ   r0   )ra   s   "r$   rÚ   rÚ     s   € ÷ +ñ + #ð +¨#ñ +r(   c                ó   € V R ,           # )Ú_QuantizeLinearr0   ©r@  s   &r$   Úadd_quant_suffixrD    s   € ØÐ*Õ*Ð*r(   c               ó    € V ^8„  d   QhRRRR/# r?  r0   )ra   s   "r$   rÚ   rÚ   
  s   € ÷ ,ñ ,¨ð ,°ñ ,r(   c                ó   € V \         ,           # r   )ÚQUANT_INPUT_SUFFIXrC  s   &r$   Úadd_quant_input_suffixrH  
  s   € ØÔ+Õ+Ð+r(   c               ó   € V ^8„  d   QhRR/# ©rÑ   rÙ   rý   r0   )ra   s   "r$   rÚ   rÚ     s   € ÷ 2ñ 2¨Cñ 2r(   c                ó   € V R ,           # )Ú_QuantizeLinear_Outputr0   rC  s   &r$   Úadd_quant_output_suffixrM    s   € ØÐ1Õ1Ð1r(   c               ó   € V ^8„  d   QhRR/# rJ  r0   )ra   s   "r$   rÚ   rÚ     s   € ÷ -ñ - sñ -r(   c                ó   € V R ,           # )Ú_DequantizeLinearr0   rC  s   &r$   Úadd_dequant_suffixrQ    s   € ØÐ,Õ,Ð,r(   c               ó   € V ^8„  d   QhRR/# rJ  r0   )ra   s   "r$   rÚ   rÚ     s   € ÷ 3ñ 3¨Sñ 3r(   c                ó   € V R ,           # )Ú_DequantizeLinear_Inputr0   rC  s   &r$   Úadd_dequant_input_suffixrU    s   € ØÐ2Õ2Ð2r(   c               ó   € V ^8„  d   QhRR/# rJ  r0   )ra   s   "r$   rÚ   rÚ     s   € ÷ /ñ /¨cñ /r(   c                ó   € V \         ,           # r   )ÚDEQUANT_OUTPUT_SUFFIXrC  s   &r$   Úadd_dequant_output_suffixrY    s   € ØÔ.Õ.Ð.r(   i€ÿÿÿi €ÿÿiøÿÿÿi�ÿÿÿi€ÿÿiÀÿÿÿi Àÿÿéüÿÿÿrm   )NN)FN)FNNN)FF)rJ   )g-Cëâ6?)oÚ
__future__r   rú   r¨  r¬  r4  Úenumr   Úpathlibr   ro   r–   rÂ   r   r   r   r	   r
   r   r   r�   Úonnx.helperr   r   r   r   Úonnx.referencer   Úonnxruntimer   r   r   Úonnx.reference.op_runr   ÚImportErrorÚ__producer__Ú__version__Úonnx_domainÚ	ms_domainÚQUANT_OP_NAMErG  ÚDEQUANT_OP_NAMErX  rõ   ÚMODEL_SIZE_THRESHOLDrÁ   rÇ  ru   r!  r  r=  r   r:   rC   r]   rL   rj   rN   rR   rP   rT   rX   rV   rŽ   rt   rf   re   rh   rg   r  r  r  r€   r­   r¾   rÏ   rÞ   ræ   r  rš   r  r   rÿ   r+  r7  rF  rV  r\  ra  rf  ro  r‚  rÕ  rà  rï  rý  r  r  r  r  r  r(  r/  r%  rï   rD  rH  rM  rQ  rU  rY  )Úks   0r$   Ú<module>rk     s¥  ðõ #ã Û Û 	Û Ý Ý ã Û ß 0Ñ 0ß >Ñ >Ý &ß QÓ QÝ -ç PÑ PðÝ7ð €Ø€Ø€Ø€	Ø €Ø,Ð Ø$€Ø2Ð Ø'Ð Ø!Ð àÐ á47¸Ô4DÓqÑ4D¨qÉ
ÑSZÐ[fÐhiÓSjÐlo×HpÔ*‘˜ QÓ'¨Ò*Ñ4DÑq€ô�tô ô˜ô ô#>�ô #>ôL�$ô ð  ×Ñ×Ñ §¢¨VÓ!4Ø×Ñ× Ñ  %§+¢+¨gÓ"6Ø×Ñ× Ñ  %§+¢+¨gÓ"6Ø×Ñ×!Ñ! 5§;¢;¨xÓ#8Ø×Ñ×'Ñ'¨Ø×Ñ×Ñ Ø×Ñ× Ñ  %ðÐ ð ×Ñ× Ñ  5§;¢;¨q¸¿¹Ô#DÀeÇkÂkÐRUÐ]b×]hÑ]hÔFiÐ"jØ×Ñ×Ñ %§+¢+¨d¸%¿*¹*Ô"EÀuÇ{Â{ÐSVÐ^c×^hÑ^hÔGiÐ!jØ×Ñ×!Ñ! E§K¢K°¸¿¹Ô$FÈÏÊÐTYÐaf×amÑamÔHnÐ#oØ×Ñ× Ñ  5§;¢;¨v¸U¿[¹[Ô#IÈ5Ï;Ê;ÐW\Ðdi×doÑdoÔKpÐ"qØ×Ñ× Ñ  5§;¢;¨q¸Ô#>ÀÇÂÈBÐV[Ô@\Ð"]Ø×Ñ×Ñ %§+¢+¨b¸Ô"=¸u¿{º{È1ÐTXÔ?YÐ!ZðÐ ð ×Ñ×Ñ %§+¢+¨d¸%¿*¹*Ô"EÀuÇ{Â{ÐSVÐ^c×^hÑ^hÔGiÐ!jØ×Ñ× Ñ  5§;¢;¨v¸U¿[¹[Ô#IÈ5Ï;Ê;ÐW\Ðdi×doÑdoÔKpÐ"qð!Ð ð ×Ñ× Ñ  5§;¢;¨q¸¿¹Ô#DÀeÇkÂkÐRUÐ]b×]hÑ]hÔFiÐ"jØ×Ñ×Ñ %§+¢+¨c¸¿¹Ô"DÀeÇkÂkÐRTÐ\a×\fÑ\fÔFgÐ!hØ×Ñ×!Ñ! E§K¢K°¸¿¹Ô$FÈÏÊÐTYÐaf×amÑamÔHnÐ#oØ×Ñ× Ñ  5§;¢;¨v¸U¿[¹[Ô#IÈ5Ï;Ê;ÐW\Ðdi×doÑdoÔKpÐ"qØ×Ñ× Ñ  5§;¢;¨q¸Ô#>ÀÇÂÈAÐUZÔ@[Ð"\Ø×Ñ×Ñ %§+¢+¨b¸Ô"=¸u¿{º{È1ÐTXÔ?YÐ!ZðÐ ðA¨ô Aô 13ôh<ò~!÷H;G÷|:=÷zL ô^ô@õ	õ÷<ñ ÷>%ñ %÷8'ñ 'ò"#òJ0òò@õRòô$Yôxõ2nõ
kõ 7õõ7õõõ!õHõ7õõ+õ,õ2õ-õ3÷/øð ô àÓðüò$ rs   Á"Z; Â[Â%[Ú;	[Û[