Ë
    ÝÍ:j$É  ã                  ó®  — d dl mZ d dlZd dlZd dlZd dlZd dlmZ d dlm	Z	 d dl
Z
d dlZd dlmZmZmZ d dlmZmZmZ d dlmZ d dlmZmZmZmZ d d	lmZ d d
lmZmZmZ 	 d dl m!Z! dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,i Z- e.e«      D � ci c]  }  e/ e0e| «      e1«      sŒ e0e| «      | “Œ c} Z2 G d„ de«      Z3 G d„ de«      Z4 G d„ de«      Z5 G d„ de«      Z6ej"                  jn                   e
jp                  d«      ej"                  jr                   e
jp                  d«      ej"                  jt                   e
jp                  d «      ej"                  jv                   e
jp                  d!«      ej"                  jx                  eej"                  jz                  eej"                  j|                  eiZ?ej"                  jr                   e
j€                  d e
j‚                  ¬"«       e
j€                  d#e
j‚                  ¬"«      fej"                  jn                   e
j€                  d$e
j„                  ¬"«       e
j€                  d%e
j„                  ¬"«      fej"                  jv                   e
j€                  d e
j†                  ¬"«       e
j€                  d&e
j†                  ¬"«      fej"                  jt                   e
j€                  d'e
jˆ                  ¬"«       e
j€                  d(e
jˆ                  ¬"«      fej"                  j|                   e
j€                  d e¬"«       e
j€                  d)e¬"«      fej"                  jz                   e
j€                  d*e¬"«       e
j€                  d+e¬"«      fiZEej"                  jn                   e
j€                  d,e
j„                  ¬"«       e
j€                  d%e
j„                  ¬"«      fej"                  jt                   e
j€                  d-e
jˆ                  ¬"«       e
j€                  d(e
jˆ                  ¬"«      fiZFej"                  jr                   e
j€                  d e
j‚                  ¬"«       e
j€                  d%e
j‚                  ¬"«      fej"                  jn                   e
j€                  d.e
j„                  ¬"«       e
j€                  d/e
j„                  ¬"«      fej"                  jv                   e
j€                  d e
j†                  ¬"«       e
j€                  d(e
j†                  ¬"«      fej"                  jt                   e
j€                  d0e
jˆ                  ¬"«       e
j€                  d1e
jˆ                  ¬"«      fej"                  j|                   e
j€                  d e¬"«       e
j€                  d+e¬"«      fej"                  jz                   e
j€                  d2e¬"«       e
j€                  d3e¬"«      fiZGd4d5œd6„ZHdbd7„ZIdcd8„ZJddded9„ZKd:„ ZL	 	 	 	 	 	 	 	 	 	 	 	 dfd;„ZM	 	 	 	 dg	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dhd<„ZN	 dg	 did=„ZO	 	 	 dj	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dkd>„ZPdld?„ZQdld@„ZRdmdA„ZSdndB„ZT G dC„ dD«      ZU G dE„ dF«      ZV G dG„ dH«      ZWdI„ ZXdJ„ ZYdK„ ZZdL„ Z[dodM„Z\dN„ Z]dpdO„Z^dqdP„Z_drdQ„Z`dsdR„ZadtdS„ZbdudT„ZcdtdU„ZddudV„ZedvdW„Zf	 	 	 dj	 	 	 	 	 	 	 	 	 	 	 dwdX„ZgdxdY„ZhdydZ„Zidzd[„Zjd{d\„Zkd{d]„Zld|d^„Zmd|d_„Znd|d`„Zod|da„Zpy# e"$ r dZ!Y �Œfw xY wc c} 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                  ó*   — e Zd ZdZdZd„ Zed„ «       Zy)ÚQuantizationModer   é   c                ó   — | j                   S ©N©Úname©Úselfs    úy/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/onnxruntime/quantization/quant_utils.pyÚ__str__zQuantizationMode.__str__8   ó   € Ø�y‰yÐó    c                óD   — 	 t         |    S # t        $ r t        «       ‚w xY wr    )r   ÚKeyErrorÚ
ValueError)Úmodes    r%   Úfrom_stringzQuantizationMode.from_string;   s)   € ð	Ü# DÑ)Ð)øÜò 	Ü“,Ðð	úó   ‚ ‹N)Ú__name__Ú
__module__Ú__qualname__Ú
IntegerOpsÚ
QLinearOpsr&   Ústaticmethodr-   © r(   r%   r   r   4   s%   „ Ø€JØ€Jòð ñó ñr(   r   c                  ó*   — e Zd ZdZdZd„ Zed„ «       Zy)ÚQuantizedValueTyper   r   c                ó   — | j                   S r    r!   r#   s    r%   r&   zQuantizedValueType.__str__G   r'   r(   c                óD   — 	 t         |    S # t        $ r t        «       ‚w xY wr    )r7   r*   r+   )Úvs    r%   r-   zQuantizedValueType.from_stringJ   s)   € ð	Ü% aÑ(Ð(øÜò 	Ü“,Ðð	úr.   N)r/   r0   r1   ÚInputÚInitializerr&   r4   r-   r5   r(   r%   r7   r7   C   s%   „ Ø€EØ€Kòð ñó ñr(   r7   c                  óN   — e Zd ZdZdZdZdZdZdZdZ	d„ Z
ed	„ «       Zed
„ «       Zy)Ú	QuantTyper   r   é   é   é   é   é   c                ó   — | j                   S r    r!   r#   s    r%   r&   zQuantType.__str__[   r'   r(   c                óD   — 	 t         |    S # t        $ r t        «       ‚w xY wr    )r>   r*   r+   )Úts    r%   r-   zQuantType.from_string^   s(   € ð	Ü˜Q‘<ÐøÜò 	Ü“,Ðð	úr.   c                ó
  — | t         j                  k(  rt        j                  S | t         j                  k(  rt        j
                  S | t         j                  k(  rt        j                  S | t         j                  k(  rt        j                  S | t         j                  k(  rt        j                  S | t         j                  k(  rt        j                  S | t         j                  k(  rt        j                  S t!        d| ›d�«      ‚)NzUnexpected value qtype=ú.)r>   ÚQInt8r
   ÚINT8ÚQUInt8ÚUINT8ÚQUInt16ÚUINT16ÚQInt16ÚINT16ÚQFLOAT8E4M3FNÚFLOAT8E4M3FNÚQUInt4ÚUINT4ÚQInt4ÚINT4r+   r#   s    r%   Útensor_typezQuantType.tensor_typee   sÉ   € à”9—?‘?Ò"Ü×#Ñ#Ð#Ø”9×#Ñ#Ò#Ü×$Ñ$Ð$Ø”9×$Ñ$Ò$Ü×%Ñ%Ð%Ø”9×#Ñ#Ò#Ü×$Ñ$Ð$Ø”9×*Ñ*Ò*Ü×+Ñ+Ð+Ø”9×#Ñ#Ò#Ü×$Ñ$Ð$Ø”9—?‘?Ò"Ü×#Ñ#Ð#ÜÐ2°4°(¸!Ð<Ó=Ð=r(   N)r/   r0   r1   rI   rK   rQ   rO   rM   rU   rS   r&   r4   r-   ÚpropertyrW   r5   r(   r%   r>   r>   R   sR   „ Ø€EØ€FØ€MØ€FØ€GØ€EØ€Fòð ñó ðð ñ>ó ñ>r(   r>   c                  ó*   — e Zd ZdZdZd„ Zed„ «       Zy)ÚQuantFormatr   r   c                ó   — | j                   S r    r!   r#   s    r%   r&   zQuantFormat.__str__|   r'   r(   c                óD   — 	 t         |    S # t        $ r t        «       ‚w xY wr    )rZ   r*   r+   )Úformats    r%   r-   zQuantFormat.from_string   s)   € ð	Ü˜vÑ&Ð&øÜò 	Ü“,Ðð	úr.   N)r/   r0   r1   Ú	QOperatorÚQDQr&   r4   r-   r5   r(   r%   rZ   rZ   x   s%   „ Ø€IØ
€Còð ñó ñr(   rZ   Úint8Úuint8Úint16Úuint16©Údtypeéÿ   i€ÿÿÿé   iÿÿ  i €ÿÿiÿ  é   iøÿÿÿé   i�ÿÿÿi€ÿÿiÀÿÿÿé@   i Àÿÿi @  éüÿÿÿr@   éÿÿÿÿ©Úzero_point_indexc                ó@  — g }t        |«      D ]ñ  \  }}t        j                  t        |«      t        j                  «      r%|j                  t        j                  |«      «       n=t        |t        j                  «      r|j                  |«       nt        d|› d|› �«      ‚|| k(  sŒ›|d   }|j                  t        j                  k(  s|j                  t        j                  k(  sŒÛt        d|j                  › �«      ‚ t        |«      dkD  rt        |«      S |d   S )Nzarg z is not an array: rl   zzero_point cannot be r   r   )Ú	enumerateÚnumpyÚ
issubdtypeÚtypeÚnumberÚappendÚarrayÚ
isinstanceÚndarrayÚ	TypeErrorre   Úfloat32Úfloat16ÚlenÚtuple)rn   ÚargsÚnew_argsÚiÚar:   s         r%   Ú_check_typer‚   ©   sç   € Ø€HÜ˜$“ò 
C‰ˆˆ1Ü×ÑœD ›G¤U§\¡\Ô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ð
Cô " (›m¨aÒ/Œ5�‹?Ð@°X¸a±[Ð@r(   c                ó¾  — | t         v sJ d| › d�«       ‚| t        j                  j                  t        j                  j                  t        j                  j
                  t        j                  j                  fv �r/|dk7  rt        d|›d�«      ‚|j                  t        j                  k(  rt        j                  }nG|j                  t        j                  k(  rt        j                  }nt        d|j                  › d�«      ‚t        t!        t#        dg dgt$        j&                  j)                  d| g dg«      ¬	«      t#        d
g d¢dg«      gdt+        d|d «      t+        d|d «      gt+        d| d «      g«      «      }t-        |«      }t/        |j1                  d ||dœ«      d   «      S t         |    }	t3        | dd¬«      \  }
}|�t5        |
|«      n|
}|�t7        ||«      n|}t        j8                  |j;                  t        j                  «      |z  j=                  «       |z   «      }t        j>                  ||||¬«       t/        |j;                  |	«      «      S )NúUnexpected data type ú> requested. Only INT8, UINT8, INT16, and UINT16 are supported.r   z2zero_point is expected to be null for float 8 not rH   zUnexpected dtype ÚConstantÚ
zero_point)Úvaluer   )ÚXÚscaler‡   ÚYÚqur‰   rŠ   )r‰   rŠ   F©Úreduce_rangeÚ	symmetric)Úout) ÚONNX_TYPE_TO_NP_TYPEÚ
onnx_protor
   rR   ÚFLOAT8E4M3FNUZÚ
FLOAT8E5M2ÚFLOAT8E5M2FNUZÚNotImplementedErrorre   rq   rz   ÚFLOATr{   Ú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Úrefre   Ú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¸UÑ)CÓDÀQÑGÓHÐHô % UÑ+ˆÜ,¨UÀÐRWÔX‰
ˆˆdà$' O”#�d˜C”.¸ˆØ&*Ð&6”3�t˜T”?¸DˆÜ—=‘= #§*¡*¬U¯]©]Ó";¸eÑ"C×!JÑ!JÓ!LÈzÑ!YÓZˆÜ�
‰
�8˜W h°HÕ=Ü˜8Ÿ?™?¨5Ó1Ó2Ð2r(   c           	     óœ  — |dkD  s|dk  rt        d|› d|› �«      ‚t        j                  | t        j                  d| j                  ¬«      «      } t        j
                  |t        j                  d|j                  ¬«      «      }|�.t        || t        j                  || j                  ¬«      z   «      }|rBt        j
                  t        j                  | «      t        j                  |«      «      }| } |­}||k  sJ d| › d|› �«       ‚t        j                  || z
  t        j                  ¬«      }t        j                  |t        j                  ¬«      t        j                  |t        j                  ¬«      z
  }t        j                  ||z  «      }	|	dk\  sJ d«       ‚|	t        j                  |j                  «      j                  k  rFt        j                  d|j                  ¬«      }	t        j                  d|j                  ¬«      }
|
|	gS |r^t        j                  t        j                  ||z   t        j                  d	t        j                  ¬«      z  «      |j                  ¬«      }
n:t        j                  t        j                  || |	z  z
  «      |j                  ¬«      }
|	j                  |j                  «      }	|
|	gS )
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]

    r   úBqmin and qmax must meet requirement: qmin <= 0 <= qmax while qmin:ú, qmmax:rd   zqmin=z > qmax=zscale issueç      ð?ç       @)r+   rq   Úminimumrv   re   Ú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ÀDÇJÁJÔ OÑOÓPˆáÜ—‘œuŸy™y¨›´·	±	¸$³Ó@ˆØˆwˆØˆwˆà�4Š<Ð5˜5   h¨t¨fÐ5Ó5ˆ<Ü	�‰�T˜D‘[¬¯©Ô	6€BÜ	�‰�T¤§¡Ô	/´%·+±+¸dÌ%Ï-É-Ô2XÑ	X€BÜ�K‰K˜˜R™Ó €EØ�AŠ:Ð$�}Ó$ˆ:ØŒu�{‰{˜4Ÿ:™:Ó&×+Ñ+Ò+Ü—‘˜C t§z¡zÔ2ˆÜ—[‘[ ¨$¯*©*Ô5ˆ
ð ˜ÐÐñ ô Ÿ™Ü—‘˜T D™[¬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                ó¤  — t        |«      }t        |«      }||z   dz   dz  }t        t        j                  | «      «      } t        t        j                  |«      «      }t	        | d«      } t        |d«      }|�|dkD  rt        || t        |«      z   «      }|| k  r¸| dk\  r|n|}t        t        | «      t        |«      «      }	||k(  r||z
  nt        d||z
  dz  «      }
|	dkD  r|	ndt        d|
«      z  }|�||||z
  z  k  r|||z
  z  }t        j                  |t        j                  ¬«      t        j                  |t        j                  ¬«      fS | dk\  rQt        j                  |t        j                  ¬«      }t        j                  |||z
  z  t        j                  ¬«      }net        j                  |t        j                  ¬«      }|  ||z
  z  }|||z
  z  }t        j                  t        ||«      t        j                  ¬«      }|�?t        |«      |||z
  z  k  r+t        j                  |||z
  z  t        j                  ¬«      }||fS )a6  Snap a uint8 activation zero-point to qmin (when rmin >= 0) or mid (when rmin < 0).

    Used by the ActivationRestrictedAsymmetric quantization option. Recomputes scale so the
    dequantized range still covers [rmin, rmax] without clipping.

    :parameter rmin: calibrated minimum activation value (numpy scalar)
    :parameter rmax: calibrated maximum activation value (numpy scalar)
    :parameter qmin: minimum quantized value (int, default 0)
    :parameter qmax: maximum quantized value (int, default 255)
    :parameter min_real_range: minimum floating-point range to enforce (same semantics as compute_scale_zp).
        When not None and > 0, rmax is adjusted to max(rmax, rmin + min_real_range) before scale computation.
    :return: (zero_point, scale) with zero_point dtype uint8 and scale dtype float32
    r   r?   ç        r   r´   rd   )
ÚintÚfloatrq   ÚsqueezerŸ   rž   r¸   rv   ra   rz   )r¼   r½   r«   r¬   r¾   Úqmin_valÚqmax_valÚmidÚdegenerate_zpÚabs_maxÚdenomÚ	scale_valr‡   rŠ   Ú	scale_negÚ	scale_poss                   r%   Úsnap_zero_point_to_uint8rÑ   ,  s  € ô �4‹y€HÜ�4‹y€HØ�hÑ Ñ" qÑ
(€Cä”—‘˜tÓ$Ó%€DÜ”—‘˜tÓ$Ó%€Dô ˆt�S‹>€DÜˆt�S‹>€Dð Ð! n°qÒ&8Ü�4˜¤ nÓ 5Ñ5Ó6ˆàˆt‚|ð %)¨C¢K™°SˆÜ”c˜$“i¤ T£Ó+ˆà)6¸(Ò)B�˜HÒ$ÌÈAÐPXÐ[cÑPcÐhiÑOiÓHjˆØ '¨!¢‘W°¼¸A¸u»ÑEˆ	ØÐ%¨)°nÈÐS[ÑH[Ñ6\Ò*\Ø&¨(°XÑ*=Ñ>ˆIÜ�{‰{˜=´·±Ô<¼e¿k¹kÈ)Ô[`×[hÑ[hÔ>iÐiÐiàˆs‚{Ü—[‘[ ´·±Ô=ˆ
Ü—‘˜D H¨xÑ$7Ñ8ÄÇÁÔN‰ô —[‘[ ¬E¯K©KÔ8ˆ
à�E˜S 8™^Ñ,ˆ	Ø˜H s™NÑ+ˆ	Ü—‘œC 	¨9Ó5¼U¿]¹]ÔKˆð Ð!¤e¨E£l°^ÀxÐRZÑGZÑ5[Ò&[Ü—‘˜N¨h¸Ñ.AÑBÌ%Ï-É-ÔXˆà�uÐÐr(   c                ó¢  — d}| t         vrµ| t        j                  k(  r‰ddlm} |}t        d«      D �cg c]  }t        |«      ‘Œ }}t        j                  |D �cg c]0  }t        j                  |«      rŒt        j                  |«      rŒ/|‘Œ2 c}t        j                  ¬«      }nt        d| › d�«      ‚|t         | <   n| t        j                  k(  rddlm} |}|€t        d| › d	�«      ‚t        j                  t         |    «      }t        j                  d|¬«      }	t        j                  ||z  |j                  ¬«      }
|	|
gS c c}w c c}w )
ar  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>`_.
    Nr   )r   é   rd   zQuantization to element_type=z not implemented.zUnexpected element_type rH   )ÚFLOAT8_DISTRIBUTIONSr
   rR   Ú	ml_dtypesr   ÚrangerÆ   rq   rv   ÚisnanÚisinfrz   r+   ry   Ústdre   )Úelement_typerÙ   Úzp_dtyper   r€   Ú
all_valuesÚfÚvaluesÚstd_f8ÚzerorŠ   s              r%   Úcompute_scale_zp_float8rá   g  s  € ð €HØÔ/Ñ/Øœ;×3Ñ3Ò3Ý/à$ˆHÜ,1°#«JÖ7 qœ% �(Ð7ˆJÐ7Ü—[‘[Ø&ÖT�q¬e¯k©k¸!­nÄUÇ[Á[ÐQRÅ^’ÒTÔ\a×\iÑ\iô‰Fô Ð<¸\¸NÐJ[Ð\Ó]Ð]Ø-3Ô˜\Ò*Ø	œ×1Ñ1Ò	1Ý+à ˆàÐÜÐ2°<°.ÀÐBÓCÐCÜ�Y‰YÔ+¨LÑ9Ó:€FÜ�;‰;�q Ô)€DÜ�K‰K˜˜f™¨C¯I©IÔ6€EØ�%ˆ=Ðùò# 8ùâTs   ³EÁEÁ5EÂEc           
     óˆ  — | j                   dk7  r&t        d| j                   › d| j                  › d�«      ‚| j                  |   }||z   dz
  |z  }t        t	        j
                  t        | j                  «      D ��cg c]  \  }}||k7  sŒ|‘Œ c}}«      «      }	t	        j                  | |d«      }
|
j                  ||	«      }
t        |d|¬«      \  }}t        |   d   j                  }||z  |z
  }|dkD  r=t	        j                  ||	f|
j                  ¬	«      }t	        j                  |
|gd¬
«      }n|
}|j                  |||	«      }|j                  d¬
«      }|j                  d¬
«      }t	        j                   |t	        j"                  |«      «      }t	        j$                  |t	        j"                  |«      «      }|rAt	        j$                  t	        j&                  |«      t	        j&                  |«      «      }| }|}t	        j(                  |«      }t	        j(                  |«      }||z
  j+                  t        j(                  «      }||z
  }||z  j+                  | j                  «      }t	        j,                  | j                  «      j.                  }||k  }t	        j0                  |t	        j2                  |«      |«      }|r?t        t	        j4                  ||z   dz  «      «      }t	        j6                  ||	f||¬	«      }n‚t	        j4                  ||j+                  t        j(                  «      |j+                  t        j(                  «      z  z
  «      }t	        j8                  |||«      }|j+                  |«      }d||<   t	        j                  |d|«      }t	        j                  |d|«      }||fS c c}}w )a³  Compute per-block scale and zero-point for a weight tensor.

    The weight is sliced along *axis* into blocks of *block_size* elements.
    Per the ONNX opset-21 spec, QuantizeLinear/DequantizeLinear require the
    scale and zero_point tensors to have the **same rank** as the input tensor.
    Only rank-2 weight tensors are supported; rank > 2 is explicitly rejected.

    Returns arrays with the same rank and dimensions as *weight*, except
    ``shape[axis] == ceil(weight.shape[axis] / block_size)``. This matches
    the ONNX opset-21 QuantizeLinear/DequantizeLinear blocked-quantization spec.

    :param weight: Float32/float16 weight array (must be rank-2).
    :param quant_type: ONNX tensor data type for quantization.
    :param axis: Axis along which to apply block-wise quantization.
    :param block_size: Number of elements per block along *axis*.
    :param symmetric: Whether to use symmetric quantization per block.
    :return: Tuple of (zero_point, scale), each with shape matching *weight*
        except ``shape[axis] == n_blocks``, where ``n_blocks == ceil(weight.shape[axis] / block_size)``.
    :raises NotImplementedError: If weight rank is not 2 (opset-21 constraint).
    r?   zXPer-block (opset-21) quantization is only supported for rank-2 weight tensors. Got rank-z tensor with shape zY. For rank > 2 tensors, reshape to 2-D before quantizing or use per-channel quantization.r   r   Fr�   rd   )Úaxisrµ   )Úndimr–   ÚshaperÅ   rq   Úprodrp   ÚmoveaxisÚreshaper�   ÚONNX_INT_TYPE_RANGEre   ÚzerosÚconcatenaterŸ   rž   r¶   Ú
zeros_liker·   r¸   r¹   r¡   rº   r»   ÚwhereÚ	ones_liker¢   Úfullr£   ) ÚweightÚ
quant_typerã   Ú
block_sizer�   ÚkÚn_blocksr€   ÚdÚotherÚmovedr«   r¬   rÛ   Úpad_lenÚpadÚmoved_paddedÚblocksr¼   r½   r¿   rÈ   rÉ   rÀ   rÁ   Ú	raw_scaler»   Ú
degenerateÚscalesÚzp_valÚzero_pointsÚraw_zps                                    r%   Úcompute_scale_zp_blockedr  ‹  s/  € ð6 ‡{�{�aÒÜ!ðØŸ™�}Ð$7¸¿¹°~ð Ffðfó
ð 	
ð 	�‰�TÑ€AØ�J‘ Ñ" zÑ1€Hô ”—
‘
¬)°F·L±LÓ*A×O¡$ ! QÀQÈ$ÃYšAÓOÓPÓQ€Eä�N‰N˜6 4¨Ó+€EØ�M‰M˜!˜UÓ#€Eä(¨À%ÐS\Ô]�J€Dˆ$Ü" :Ñ.¨qÑ1×7Ñ7€Hð ˜Ñ# aÑ'€GØ�‚{Ü�k‰k˜7 EÐ*°%·+±+Ô>ˆÜ×(Ñ(¨%°¨¸AÔ>‰àˆð ×!Ñ! (¨J¸Ó>€Fð �:‰:˜1ˆ:Ó€DØ�:‰:˜1ˆ:Ó€Dô �=‰=˜œu×/Ñ/°Ó5Ó6€DÜ�=‰=˜œu×/Ñ/°Ó5Ó6€DáÜ—‘œuŸy™y¨›´·	±	¸$³Ó@ˆØˆwˆØˆä�}‰}˜TÓ"€HÜ�}‰}˜TÓ"€HØ
�‰+×	Ñ	œeŸm™mÓ	,€BØ	�HÑ	€BØ�b‘× Ñ  §¡Ó.€Iä�;‰;�v—|‘|Ó$×)Ñ)€DØ˜TÑ!€Jä�[‰[˜¤U§_¡_°YÓ%?ÀÓK€FáÜ”U—[‘[ (¨XÑ"5¸Ñ!<Ó=Ó>ˆÜ—j‘j (¨EÐ!2°FÀ(ÔK‰ä—‘˜X¨¯©´E·M±MÓ(BÀVÇ]Á]ÔSX×S`ÑS`ÓEaÑ(aÑaÓbˆÜ—‘˜F H¨hÓ7ˆØ—m‘m HÓ-ˆØ"#ˆ�JÑô
 �^‰^˜F A tÓ,€FÜ—.‘. ¨a°Ó6€Kà˜ÐÐùóu Ps   Á<N>Â
N>c                óð  — t        | t        j                  «      st        dt	        | «      › d�«      ‚|�|}nt        | «      r| j                  «       nd}|�|}nt        | «      r| j                  «       nd}t        j                  || j                  ¬«      }t        j                  || j                  ¬«      }t        j                  d| j                  ¬«      }	|t        j                  k(  r?|rt        d«      ‚t        j                  | «      }
t        ||
«      \  }}	t        ||	d¬«      S |t        j                   t        j"                  t        j$                  t        j&                  t        j(                  t        j*                  fv r_t-        |||¬	«      \  }}t        | «      rt/        ||||||«      \  }}	n!t        j                  d|j                  ¬«      }t        ||	d¬«      S t1        d
|› d�«      ‚)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 rH   rÄ   rd   r´   z1Unsupported option reduce_range=True for float 8.r   rm   ©r�   z Unexpected value for quant_type=)rw   rq   rx   ry   rs   r|   rŸ   rž   rv   re   r
   rR   ÚRuntimeErrorrÙ   rá   r‚   rJ   rL   rP   rN   rV   rT   r�   rÂ   r+   )Údatarñ   r�   rŽ   r¾   Úrmin_overrideÚrmax_overrider¼   r½   rŠ   rÙ   r‡   r«   r¬   s                 r%   Úcompute_data_quant_paramsr	  î  sž  € ô* �dœEŸM™MÔ*ÜÐ?ÄÀTÃ
¸|È1ÐMÓNÐNØÐ Ø‰ä  œYˆt�x‰xŒz¨CˆàÐ Ø‰ä  œYˆt�x‰xŒz¨Cˆä�;‰;�t 4§:¡:Ô.€DÜ�;‰;�t 4§:¡:Ô.€DÜ�K‰K˜ 4§:¡:Ô.€Eà”[×-Ñ-Ò-ÙÜÐRÓSÐSÜ�i‰i˜‹oˆÜ3°JÀÓDÑˆ
�EÜ˜: u¸qÔAÐAàÜ×ÑÜ×ÑÜ×ÑÜ×ÑÜ×ÑÜ×Ñðñ ô -¨Z¸ÐQZÔ[‰
ˆˆdÜˆtŒ9Ü 0°°t¸TÀ4ÈÐTbÓ cÑˆJ™äŸ™ Q¨d¯j©jÔ9ˆJÜ˜: u¸qÔAÐAä
Ð7¸
°|À1ÐEÓ
FÐFr(   c                ó¸  — t        | ||||||«      \  }}|t        j                  k(  r´t        || ||«      }	t	        |	j                  t        j                  «      j                  «       dz  dk(  «      ret        j                  | «      }
t        d|
j                  «       › d|
j                  «       › d|	j                  «       › d|	j                  «       › d�	«      ‚|||	fS |t        j                  t        j                  t        j                  t        j                   t        j"                  t        j$                  fv rt        || ||«      }	|||	fS t'        d|› d�«      ‚)al  
    :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
    rg   z+One of the quantized value is NaN data in [z, z], quantized_data in [z].zUnexpected value for qType=rH   )r	  r
   rR   r°   ÚanyÚviewrq   ra   Úravelr    r  rŸ   rž   rJ   rL   rP   rN   rV   rT   r+   )r  r¤   r�   rŽ   r¾   r  r  r‡   rŠ   Úquantized_dataÚnp_datas              r%   Úquantize_datar  ,  sZ  € ô8 2ØØØØØØØóÑ€J�ð ”×(Ñ(Ò(Ü)¨%°°u¸jÓIˆÜ�×#Ñ#¤E§K¡KÓ0×6Ñ6Ó8¸3Ñ>À3ÑFÔGÜ—m‘m DÓ)ˆGÜØ=¸g¿k¹k»m¸_ÈBÈwÏ{É{Ë}Èoð ^&Ø&4×&8Ñ&8Ó&:Ð%;¸2¸n×>PÑ>PÓ>RÐ=SÐSUðWóð ð ˜5 .Ð0Ð0àÜ×ÑÜ×ÑÜ×ÑÜ×ÑÜ×ÑÜ×Ñðñ ô *¨%°°u¸jÓIˆØ˜5 .Ð0Ð0ä
Ð2°5°'¸Ð;Ó
<Ð<r(   c                óP
  — t        | «      }d}|��¸|dkD  �r²|j                  |   }	t        t        j                  t        |j                  «      D �
�cg c]  \  }
}|
|k7  sŒ|‘Œ c}}
«      «      }t        j                  ||d«      j                  |	|«      }t        j                  ||d«      }t        j                  ||d«      }|j                  d   }t        j                  j                  |«      }t        j                  ||¬«      }t        |«      D ]Z  }||z  }t        ||z   |	«      }t        |«      D ]6  }t        ||||…|f   j                  «       |||f   |||f   «      |||…|f<   Œ8 Œ\ t        j                  |j                  |	gt        |j                  «      D �
�cg c]  \  }
}|
|k7  sŒ|‘Œ c}}
z   «      d|«      }nÛ|€t        ||j                  «       ||«      }n¼|j                  |   }t!        |j                  «      }d||<   g }t        |«      D ]m  }
|j#                  |
|«      }||
   }||
   }t        ||j                  «       ||«      }|j%                  t        j&                  |«      j                  |«      «       Œo t        j(                  ||«      }|r|n| j*                  › t,        › �}|t        j.                  j0                  k(  �r"t        j.                  «       }||_        |j4                  j7                  | j4                  «       ||_        |j9                  «       j;                  «       j=                  «       |_        t@        �¢tA        |«      } | j                  |j                  k7  s!| j=                  «       |j=                  «       k7  r]tC        d|j                  › d|j=                  «       dd › d| j=                  «       dd › d	| j                  › d
tE        |«      dd › d�«      ‚|S |t        j.                  jF                  t        j.                  jH                  fv ry|jJ                  tL        tN        fvrtC        d|› d�«      ‚tQ        tS        |j=                  «       «      «      }!t        j                  jU                  ||| j4                  |!d¬«      }|S t        j                  j                  |«      }t        j&                  ||¬«      j                  | j4                  «      }t        jV                  jY                  ||«      }|S c c}}
w c c}}
w )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 or per-block. Defaults to None.
    :param quant_weight_name: The name of the quantized initializer.
                              If not specified, the quantized name is generated.
    :param block_size: Block size for opset-21 block-wise quantization. 0 means disabled.
    :return: The quantized ONNX initializer.
    Nr   rd   r   zThe initializer of shape z! could not be created, expecting é
   z, got z and shape=z
raw=éÈ   rH   zQuantized weights for z. must be 8-bit before packing as 4-bit values.T)Úraw)-Útensor_proto_to_arrayrå   rÅ   rq   ræ   rp   rç   rè   r™   rš   Útensor_dtype_to_np_dtypeÚ
empty_likerÖ   rŸ   r°   r  ÚlistÚtakeru   r    rë   r"   ÚTENSOR_NAME_QUANT_SUFFIXr
   rR   Ú	data_typeÚdimsÚextendÚflattenÚcopyÚtobytesÚraw_datar   r  ÚstrrV   rT   re   r   r   ÚbytesÚpack_bytes_to_4bitr›   Únumpy_helperÚ
from_array)"rð   rñ   r‡   rŠ   rã   Úquant_weight_namerò   Úweight_dataÚq_weight_dataró   r€   rõ   rö   r÷   Úscale_movedÚzp_movedrô   Úquant_np_dtypeÚq_movedÚblkÚstartÚendÚcolÚchannel_countÚchannel_dimsÚquantized_channel_data_listÚchannel_dataÚchannel_scaleÚchannel_zero_pointÚquantized_channel_dataÚq_weight_nameÚq_weight_initializerÚcheckÚpacked_datas"                                     r%   Úquantize_onnx_initializerr=  i  sß  € ô, (¨Ó/€KØ*.€MàÑ˜J¨›NØ×Ñ˜dÑ#ˆÜ”E—J‘J¬i¸×8IÑ8IÓ.J×X¡d a¨ÈaÐSWËi¢ÓXÓYÓZˆÜ—‘˜{¨D°!Ó4×<Ñ<¸QÀÓFˆô —n‘n U¨D°!Ó4ˆÜ—>‘> *¨d°AÓ6ˆØ×$Ñ$ QÑ'ˆÜŸ™×=Ñ=¸jÓIˆÜ×"Ñ" 5°Ô?ˆÜ˜“?ò 	ˆCØ˜*Ñ$ˆEÜ�e˜jÑ(¨!Ó,ˆCÜ˜U“|ò �Ü*:Ø  e¨C i° nÑ 5× ;Ñ ;Ó =¸{È3ÐPSÈ8Ñ?TÐV^Ð_bÐdgÐ_gÑVhó+�˜˜c˜	 3˜Ò'ñð	ô Ÿ™Ø�O‰O˜Q˜C´¸;×;LÑ;LÓ1M×"[©¨¨AÐQRÐVZÓQZ¢1Ó"[Ñ[Ó\Ð^_Ðaeó
‰ð 
ˆÜ(¨°[×5FÑ5FÓ5HÈ%ÐQ[Ó\‰à#×)Ñ)¨$Ñ/ˆÜ˜K×-Ñ-Ó.ˆØˆ�TÑØ&(Ð#ä�}Ó%ò 	lˆAØ&×+Ñ+¨A¨tÓ4ˆLØ! !™HˆMØ!+¨A¡ÐÜ%5Ø˜L×.Ñ.Ó0°-ÐASó&Ð"ð (×.Ñ.¬u¯}©}Ð=SÓ/T×/\Ñ/\Ð]iÓ/jÕkð	lô ×)Ñ)Ð*EÀtÓ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ÈBÐ;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ÐRX×R]ÑR]Ð_jÐptÐ6ÓuÐð  Ðô	 Ÿ™×=Ñ=¸jÓIˆÜŸ™ m¸>ÔJ×RÑRÐSY×S^ÑS^Ó_ˆÜ#×0Ñ0×;Ñ;¸MÈ=ÓYÐàÐùóQ  Yùó" #\s   ÁTÁ TÆ&T"Æ4T"c                ój  — | t         j                  j                  k(  rt        d«      ‚d}|rt        j                  | «      }n)|r| t        v r
t        |    }nt        j                  | «      }|st        d| › d�«      ‚|\  }}|dkD  s|dk  r't        d|› d|› d|j                  › d	|› d
|› d| › �«      ‚|S )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²   r³   z, dtype=z, reduce_range=z, symmetric=z, qType=)
r’   r
   rR   r–   ÚONNX_INT_TYPE_REDUCED_RANGEÚgetÚONNX_INT_TYPE_SYMMETRIC_RANGEré   r+   re   )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                ó.   — t        | ||¬«      \  }}||z
  S )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_qTyperD  ï  s    € ô )¨°È	ÔR�J€Dˆ$Ø�$‰;Ðr(   c                ó:   — | dk  r| |z   n| }|dk\  xr ||k  }||fS )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)
    r   r5   )rã   ÚrankÚ	axis_normÚis_valids       r%   Únormalize_axisrI  ù  s3   € ð  $ ašx��t’¨T€IØ˜A‰~Ò2 )¨dÑ"2€HØ�YÐÐr(   c                óò   — t        | «      }|dk(  r
t        «       S |dz   dz  }t        |«      }d}d}||dz
  k  r-| |dz      dz  dz  | |   dz  z  ||<   |dz  }|dz  }||dz
  k  rŒ-||k  r| |   dz  ||<   |S )aB  
    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.
    r   r   r?   rh   rA   )r|   Ú	bytearray)Úsrc_8bitÚ	num_elemsÚdst_sizeÚdstÚsrc_iÚdst_is         r%   r$  r$    s·   € ô �H“€IØ�A‚~Ü‹{Ðà˜A‘ !Ñ#€HÜ
�HÓ
€Cà€EØ€Eð �)˜a‘-Ò
Ø ¨¡	Ñ*¨SÑ0°QÑ6¸8ÀE¹?ÈSÑ;PÑQˆˆE‰
Ø�‰
ˆØ�‰
ˆð �)˜a‘-Ó
ð
 ˆyÒà˜e‘_ sÑ*ˆˆE‰
à€Jr(   c                  ó   — e Zd ZdZg g dfd„Zy)ÚQuantizedInitializerzJ
    Represents a linearly quantized weight input from ONNX operators
    Nc
                ó‚   — || _         || _        || _        || _        || _        || _        || _        || _        |	| _        y r    )	r"   ÚinitializerÚrminsÚrmaxsr   rþ   r  r  rã   )
r$   r"   rU  rV  rW  r   rþ   r  r  rã   s
             r%   Ú__init__zQuantizedInitializer.__init__(  sF   € ð ˆŒ	Ø&ˆÔØˆŒ
ØˆŒ
à&ˆÔØˆŒØˆŒ	Ø,ˆÔàˆ�	r(   ©r/   r0   r1   Ú__doc__rX  r5   r(   r%   rS  rS  #  s   „ ñð ØØôr(   rS  c                  ó    — e Zd ZdZ	 	 	 	 dd„Zy)ÚQuantizedValuezI
    Represents a linearly quantized value (input\output\intializer)
    Nc
                ó‚   — || _         || _        || _        || _        || _        || _        || _        || _        |	| _        y 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ã   rc  rd  re  s
             r%   rX  zQuantizedValue.__init__G  sD   € ð "ˆÔØ(ˆŒØ$ˆŒØ&ˆŒØ.ˆŒØˆŒ	Ø"ˆŒØ$ˆŒØ$ˆ�r(   )NNNNrY  r5   r(   r%   r\  r\  B  s   „ ñð ØØØô%r(   r\  c                  ó   — e Zd ZdZd„ Zy)ÚBiasToQuantizez+
    Represents a bias to be quantized
    c                ó.   — || _         || _        || _        y r    )Ú	bias_nameÚ
input_nameÚweight_name)r$   rl  rm  rn  s       r%   rX  zBiasToQuantize.__init__c  s   € Ø"ˆŒØ$ˆŒØ&ˆÕr(   NrY  r5   r(   r%   rj  rj  ^  s   „ ñó'r(   rj  c                óî  — | j                   dk(  rt        d| j                  › d�«      ‚| j                   dk(  r| j                  }�n#| j                   dk(  r| j                  }�n| j                   dk(  r| j
                  }nê| j                   dk(  r| j                  }nÎ| j                   dk(  r| j                  }n²| j                   d	k(  r| j                  }n–| j                   d
k(  r| j                  }nz| j                   dk(  r| j                  }n^| j                   dk(  r| j                  }nB| j                   dk(  r| j                  }n&t        d| j                  › d| j                   › d�«      ‚| j                  |iS )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 z does not have type specified.r   r?   r@   rA   rB   rC   ri   é   é	   r  z has unsupported type rH   )rs   r+   r"   rÝ   r€   ÚsrF   ÚgÚfloatsÚintsÚstringsÚtensorsÚgraphs)Ú	attributerˆ   s     r%   Úattribute_to_kwargrz  i  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                ót   — |D �cg c]  }|j                   | k(  sŒ|‘Œ }}t        |«      dkD  r|d   S dS c c}w )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"   r|   )Ú	item_nameÚ	item_listÚitemÚitemss       r%   Úfind_by_namer€  Ž  sA   € ð (ÖB�d¨4¯9©9¸	Ó+AŠTÐB€EÐBÜ˜5“z A’~ˆ5�‰8Ð/¨4Ð/ùò Cs   …5š5c                óR   — d}t        t        |«      «      D ]  }||   | k(  sŒ|}Œ |S )zC
    Helper function to return index of an item in a node list
    rl   )rÖ   r|   )Ú	elem_nameÚ	elem_listÚelem_idxr€   s       r%   Úget_elem_indexr…  ™  s9   € ð €HÜ”3�y“>Ó"ò ˆØ�Q‰<˜9Ó$Ø‰Hðð €Or(   c                óH   — t         j                  j                  d| |g|«      S )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_noderŠ  ¤  s!   € ô �;‰;× Ñ  ¨°°¸$Ó?Ð?r(   c                ól   — | j                   j                  | j                  |z   | j                  z   «      S )zp
    Helper function to generate a identifiable filepath by concatenating the given identifier as a suffix.
    )ÚparentÚjoinpathÚstemÚsuffix)ÚfilenameÚ
identifiers     r%   Úgenerate_identified_filenamer’  ¯  s+   € ð �?‰?×#Ñ# H§M¡M°JÑ$>ÀÇÁÑ$PÓQÐQr(   c                ó`  — dd l }dd lm} dd l} |j                  |j
                  ¬«       t        d«       t        | «       t        d«       t        |«       |j                  | |d¬«       |j                  d«       |j                  d«       |j                  d	«       |j                  «        y )
Nr   )Ú	thresholdz
Histogram:zHistogram Edges:T)ÚfillzTensor valueÚCountszTensor value V.S. Counts)ÚsysÚmatplotlib.pyplotÚpyplotrq   Úset_printoptionsÚmaxsizeÚprintÚstairsÚxlabelÚylabelÚtitleÚshow)ÚhistÚ
hist_edgesr—  Úpltrq   s        r%   Ú
apply_plotr¥  ¶  s   € Ûå#Ûà€E×Ñ S§[¡[Õ1Ü	ˆ,ÔÜ	ˆ$„KÜ	Ð
ÔÜ	ˆ*ÔØ‡J�Jˆt�Z d€JÔ+Ø‡J�Jˆ~ÔØ‡J�JˆxÔØ‡I�IÐ(Ô)Ø‡H�H…Jr(   c           	     óú  — ddl }ddl}ddl}ddlmc mc m} ddlmc mc m} ddl	m
} t        j                  d| › �«       |j                  | |¬«      }t        t        j                   j#                  |d«      d«      5 }	|	j%                  |«       ddd«       |j'                  d«      }
|j)                  d«      }g }t+        | j-                  «       «      D ]ö  }| |   }|j/                  «       }t1        |j3                  d	|
«      j5                  «       «      t1        |j3                  d
|
«      j5                  «       «      g}t7        t9        |«      «      }|j;                  |«      }|j;                  |«      }|j=                  |«       |j?                  ||«       |jA                  ||«       |jC                  |«      }|jE                  |«       Œø |jG                  |tI        |«      «       |D ]  }|jK                  |«       Œ |jM                  «       }|jO                  |«       |jQ                  ||«       |jS                  |«      }|jU                  |«       |jW                  «       }t        t        j                   j#                  |d«      d«      5 }	|	j%                  |«       ddd«       t        jX                  j3                  dd«      dv r“|j                  j[                  |d«      }|j]                  «       }t_        |«      D ]Y  }|ja                  |«      }t        j                  |jc                  «       «       t        j                  |je                  «       «       Œ[ t        t        j                   j#                  |d«      d«      5 }	t+        | j-                  «       «      D ]¥  }| |   }|j/                  «       }t1        |j3                  d	|
«      j5                  «       «      t1        |j3                  d
|
«      j5                  «       «      g}|dz   t7        t9        |«      «      z   }|	j%                  |«       |	j%                  d«       Œ§ 	 ddd«       y# 1 sw Y   �ŒÇxY w# 1 sw Y   �ŒÂxY w# 1 sw Y   yxY w)z>
    Helper function to write calibration table to files.
    r   N)ÚCalibrationCacheEncoderzcalibration cache: )Úclszcalibration.jsonÚwi   ÚhighestÚlowestzcalibration.flatbuffersÚwbÚQUANTIZATION_DEBUGÚ0)r   Ú1zcalibration.cacheú ú
)3ÚjsonÚflatbuffersrq   Ú5onnxruntime.quantization.CalTableFlatBuffers.KeyValueÚquantizationÚCalTableFlatBuffersÚKeyValueÚ5onnxruntime.quantization.CalTableFlatBuffers.TrtTableÚTrtTableÚ"onnxruntime.quantization.calibrater§  ÚloggingÚinfoÚdumpsÚopenÚosÚpathÚjoinÚwriterv   ÚBuilderÚsortedÚkeysÚto_dictrÆ   r@  r~  r"  rž   ÚCreateStringÚKeyValueStartÚKeyValueAddKeyÚKeyValueAddValueÚKeyValueEndru   ÚTrtTableStartDictVectorr|   ÚPrependUOffsetTRelativeÚ	EndVectorÚTrtTableStartÚTrtTableAddDictÚTrtTableEndÚFinishÚOutputÚenvironÚGetRootAsTrtTableÚ
DictLengthrÖ   ÚDictÚKeyÚValue)Úcalibration_cacheÚdirr²  r³  Únpr·  r¹  r§  Ú	json_dataÚfilerà   ÚbuilderÚkey_value_listÚkeyrÞ   Úd_valuesrt  rˆ   Úflat_keyÚ
flat_valueÚ	key_valueÚ	main_dictÚ	cal_tableÚbufÚdict_lenr€   s                             r%   Úwrite_calibration_tablerê  È  sÁ  € ó
 ãÛçLÓLßLÓLõ Kä‡L�LÐ&Ð'8Ð&9Ð:Ô;à—
‘
Ð,Ð2I�
ÓJ€Iä	Œb�g‰g�l‰l˜3Ð 2Ó3°SÓ	9ð ¸TØ�
‰
�9Ô÷ð �8‰8�A‹;€DØ×!Ñ! $Ó'€GØ€NÜÐ'×,Ñ,Ó.Ó/ò )ˆØ" 3Ñ'ˆØ—>‘>Ó#ˆä�(—,‘,˜y¨$Ó/×4Ñ4Ó6Ó7Ü�(—,‘,˜x¨Ó.×3Ñ3Ó5Ó6ð
ˆô ”C˜“KÓ ˆà×'Ñ'¨Ó,ˆØ×)Ñ)¨%Ó0ˆ
à×Ñ˜wÔ'Ø×Ñ ¨Ô2Ø×!Ñ! '¨:Ô6Ø×(Ñ(¨Ó1ˆ	à×Ñ˜iÕ(ð#)ð& ×$Ñ$ W¬c°.Ó.AÔBØ#ò 3ˆ	Ø×'Ñ'¨	Õ2ð3à×!Ñ!Ó#€Ià×Ñ˜7Ô#Ø×Ñ˜W iÔ0Ø×$Ñ$ WÓ-€Ià‡N�N�9ÔØ
�.‰.Ó
€Cä	Œb�g‰g�l‰l˜3Ð 9Ó:¸DÓ	Að ÀTØ�
‰
�3Œ÷ô 
‡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Ø& sÑ+ˆ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Õñ		÷
ð 
÷gñ ú÷Lñ ú÷
ð 
ús%   Â QÊQ$ÎCQ1ÑQ!Ñ$Q.Ñ1Q:c                ó¼  — | dk(  j                  t        j                  «      }| dk7  j                  t        j                  «      }|j                  «       }| j                  |z
  }|sy|t        |«      z  t        |«      z  }|dk  sJ d|› d|› d|› �«       ‚| j                  t        j                  «      }|||z  | |z  z   z  }|dk  j                  «       dk(  sJ ‚|S )a~  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´   zn_zeros=z, n_nonzeros=z, eps1=)r¡   rq   rz   ÚsumÚsizerÆ   )ÚpÚepsÚis_zerosÚis_nonzerosÚn_zerosÚ
n_nonzerosÚeps1r¢  s           r%   Úsmooth_distributionrõ    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ØˆC�(‰N˜t˜e {Ñ2Ñ2Ñ2€DØ�A‰I�?‰?Ó Ò!Ð!Ð!à€Kr(   c                ó˜   — t        j                  | j                  «       d¬«      }t        d„ |j                  j
                  D «       «      S )NF)Úload_external_datac              3  óF   K  — | ]  }t        j                  |«      –— Œ y ­wr    )r   Úuses_external_data)Ú.0Ú
intializers     r%   ú	<genexpr>z*model_has_external_data.<locals>.<genexpr>8  s   è ø€ ÒmÀzÔ#×6Ñ6°z×BÑmùs   ‚!)r™   ÚloadÚas_posixr  ÚgraphrU  )Ú
model_pathÚmodels     r%   Úmodel_has_external_datar  6  s9   € Ü�I‰I�j×)Ñ)Ó+ÀÔF€EÜÑmÐUZ×U`ÑU`×UlÑUlÔmÓmÐmr(   c                ó¸   — t        «       }|j                  «       |_        t        j                  |_        i }dg|d<   t        | j                  «       |fddgi|¤Ž}y)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   Úopt_model_pathÚ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                óÔ   — ddi}| j                   r8| j                   D ])  }|j                  |j                  |j                  i«       Œ+ t        j
                  j                  | |«       y)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  K  sZ   € à.Ð0CÐD€NØ×ÒØ×(Ñ(ò 	:ˆDØ×!Ñ! 4§8¡8¨T¯Z©ZÐ"8Õ9ð	:ä‡K�K×Ñ  ~Õ6r(   c                ó€   — | j                   r2| j                   D ]#  }|j                  dk(  sŒ|j                  dk(  sŒ# y y)zCCheck the model whether it went through quantization pre-processingr  r  TF©r  rá  rˆ   )r  r  s     r%   Úmodel_has_pre_process_metadatar  T  sA   € à×ÒØ×(Ñ(ò 	ˆDØ�x‰xÐ3Ó3¸¿
¹
ÐFYÓ8YÙð	ð r(   c                óÔ   — ddi}| j                   r8| j                   D ])  }|j                  |j                  |j                  i«       Œ+ t        j
                  j                  | |«       y )Nú
onnx.inferr  r  )r  r  rî  s      r%   Úadd_infer_metadatar  ]  sZ   € Ø"Ð$7Ð8€NØ×ÒØ×%Ñ%ò 	4ˆAØ×!Ñ! 1§5¡5¨!¯'©'Ð"2Õ3ð	4ä‡K�K×Ñ  ~Õ6r(   c                ó€   — | j                   r2| j                   D ]#  }|j                  dk(  sŒ|j                  dk(  sŒ# y y)Nr  r  TFr  )r  rî  s     r%   Úmodel_has_infer_metadatar   e  s@   € Ø×ÒØ×%Ñ%ò 	ˆAØ�u‰u˜Ó$¨¯©Ð4GÓ)GÙð	ð r(   c                óÊ   — | j                   D �cg c]   }|j                  r|j                  dk(  sŒ|‘Œ" }}t        |«      dk7  rt        d«      ‚|d   j                  }|S c c}w )Nr   r   z$Failed to find proper ai.onnx domainr   )Úopset_importÚdomainr|   r+   Úversion)r  ÚopsetÚai_onnx_domainÚopset_versions       r%   Úget_opset_versionr(  m  se   € Ø).×);Ñ);Öm À5Ç<Â<ÐSX×S_ÑS_ÐclÓSl’eÐm€NÐmÜ
ˆ>Ó˜aÒÜÐ?Ó@Ð@Ø" 1Ñ%×-Ñ-€MàÐùò ns
   � A °A c                ó0  — t        | «      }|}t        |d|«      }|�t        |d|«      nd }t        j                  j                  t        j                  j
                  f}	||	v xs ||	v }
|
s‰|r‡t        j                  t        j                  h}	 |j                  «       D ]S  }|D ]H  }|j                  d«      }||v rd}
 n/|j                  d«      }|€Œ0|j                  d«      }||v sŒFd}
 n |
sŒS n |dk  r!|dkD  rt        j                  d|› d	�«       d}n |d
k  r9|t        j                  j                   k(  rt        j                  d|› d�«       d
}nb|dk  r|
rt        j                  d|› d�«       d}n?|dk(  rt        j                  d|› d�«       n |dk  rt        j                  d|› d�«       d}||k7  r+t        j"                  j%                  | |«      } t'        | «      } | S # t        t        f$ r t        j                  d«       Y �Œw xY w)NrW   rñ   TÚconvertzYSkipping 16-bit opset bump heuristic for TensorQuantOverrides: structure not as expected.é   r   z$The original model opset version is z³, which does not support block-wise quantization natively. Please update the model to opset >= 21. Automatically updating the model to opset 21. Please verify the quantized model.é   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.zµ, which does not support 16-bit integer quantization natively. Please update the model to opset >= 21. Automatically update the model to opset 21. Please verify the quantized model.r  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
   rN   rP   r>   rO   rM   rÞ   r@  ÚAttributeErrorry   r»  ÚdebugÚwarningrR   Úversion_converterÚconvert_versionÚ&save_and_reload_model_with_shape_infer)r  Úweight_typeÚactivation_typeÚtensor_quant_overridesrò   r'  Útarget_opset_versionÚweight_quant_typeÚactivation_quant_typeÚ_int16_typesÚneeds_opset21_for_16bitÚ_int16_quant_typesÚoverrides_listÚoverrideÚqtr*  Ú
convert_qts                    r%   Úupdate_opset_versionrB  v  sz  € ô & eÓ,€MØ(ÐÜ ¨]¸KÓHÐàDSÐD_Œ� °Ô@Ðeið ô ×$Ñ$×+Ñ+¬T×-=Ñ-=×-CÑ-CÐD€LØ/°<Ð?ÒhÐCXÐ\hÐChÐñ #Ñ'=Ü'×.Ñ.´	×0AÑ0AÐBÐð	wØ"8×"?Ñ"?Ó"Aò �Ø .ò 
"�HØ!Ÿ™ lÓ3�BØÐ/Ñ/Ø26Ð/ÙØ&Ÿl™l¨9Ó5�GØÑ*Ø%,§[¡[°Ó%>˜
Ø%Ð);Ò;Ø6:Ð3Ù!ð
"ò +Ùðð& �rÒ˜j¨1šnÜ�‰Ø2°=°/ð B1ð 1ô	
ð  "Ñà	˜Ò	Ð 1´T×5EÑ5E×5RÑ5RÒ RÜ�‰Ø2°=°/ð B1ð 1ô	
ð
  "Ñà	˜Ò	Ñ 7Ü�‰Ø2°=°/ð B1ð 1ô	
ð  "Ñà	˜"Ò	Ü�‰Ø2°=°/ð BMð Mõ	
ð
 
˜Ò	Ü�‰Ø2°=°/ð B1ð 1ô	
ð
  "Ðà˜}Ò,Ü×&Ñ&×6Ñ6°uÐ>RÓSˆô 7°uÓ=ˆà€Løôg ¤	Ð*ò 	wô �M‰MÐu×vð	wús%   ÂAG- ÃG- Ã*G- Ã2G- Ç-$HÈHc                óþ   — t        | d«      }t        j                  j                  t	        | «      t	        |«      «       t        j
                  |j                  «       «      }t        |«       |j                  «        |S )Nz	-inferred)	r’  r™   Úshape_inferenceÚinfer_shapes_pathr"  rý  rþ  r  Úunlink)r   Úinferred_model_pathr  s      r%   Úload_model_with_shape_inferrH  Ð  s`   € Ü6°zÀ;ÓOÐÜ×Ñ×*Ñ*¬3¨z«?¼CÐ@SÓ<TÔUÜ�I‰IÐ)×2Ñ2Ó4Ó5€EÜ�uÔØ×ÑÔ Ø€Lr(   c                ó  — t        j                  d¬«      5 }t        j                  | «      }t	        |«      j                  d«      }t        j                  ||j                  «       d¬«       t        |«      cd d d «       S # 1 sw Y   y xY w)Nz
ort.quant.)Úprefixz
model.onnxT)Úsave_as_external_data)
ÚtempfileÚTemporaryDirectoryr  Údeepcopyr   r�  r™   Ú
save_modelrþ  rH  )r  Úquant_tmp_dirÚ
model_copyr   s       r%   r4  r4  Ù  sl   € Ü	×	$Ñ	$¨LÔ	9ð 7¸]Ü—]‘] 5Ó)ˆ
Ü˜-Ó(×1Ñ1°,Ó?ˆ
Ü�‰˜
 J×$7Ñ$7Ó$9ÐQUÕVÜ*¨:Ó6÷	7÷ 7ò 7ús   —A BÂB
c                ó  — | j                   t        j                  j                  t        j                  j                  fv rt
        j                  j                  | «      S t        d| j                  › dt        | j                      › �«      ‚)Nz&Only float type is supported. Weights z is )r  r’   r
   r—   r˜   r™   r%  Úto_arrayr+   r"   Útype_to_name)rU  s    r%   r  r  á  su   € Ø×Ñ¤×!7Ñ!7×!=Ñ!=¼z×?UÑ?U×?]Ñ?]Ð ^Ñ^Ü× Ñ ×)Ñ)¨+Ó6Ð6ä
Ø
0°×1AÑ1AÐ0BÀ$Ä|ÐT_×TiÑTiÑGjÐFkÐlóð r(   c                ó   — | dz   S )NÚ_QuantizeLinearr5   ©Útensor_names    r%   Úadd_quant_suffixrY  ê  s   € ØÐ*Ñ*Ð*r(   c                ó   — | t         z   S r    )ÚQUANT_INPUT_SUFFIXrW  s    r%   Úadd_quant_input_suffixr\  î  s   € ØÔ+Ñ+Ð+r(   c                ó   — | dz   S )NÚ_QuantizeLinear_Outputr5   rW  s    r%   Úadd_quant_output_suffixr_  ò  s   € ØÐ1Ñ1Ð1r(   c                ó   — | dz   S )NÚ_DequantizeLinearr5   rW  s    r%   Úadd_dequant_suffixrb  ö  s   € ØÐ,Ñ,Ð,r(   c                ó   — | dz   S )NÚ_DequantizeLinear_Inputr5   rW  s    r%   Úadd_dequant_input_suffixre  ú  s   € ØÐ2Ñ2Ð2r(   c                ó   — | t         z   S r    )ÚDEQUANT_OUTPUT_SUFFIXrW  s    r%   Úadd_dequant_output_suffixrh  þ  s   € ØÔ.Ñ.Ð.r(   )NN)FN)r   rf   N)r«   rÅ   r¬   rÅ   r¾   úfloat | None)rð   únumpy.ndarrayrñ   rÅ   rã   rÅ   rò   rÅ   r�   ÚboolÚreturnú#tuple[numpy.ndarray, numpy.ndarray])FNNN)r  rj  rñ   úonnx.TensorProto.DataTyper�   rk  rŽ   rk  r¾   ri  r  ri  r  ri  rl  rm  )rl  z2tuple[numpy.ndarray, numpy.ndarray, numpy.ndarray])NNr   )rð   úonnx.TensorProtorñ   rn  r‡   rj  rŠ   rj  rã   z
int | Noner'  z
str | Nonerò   rÅ   rl  ro  )FF)rã   rÅ   rF  rÅ   rl  ztuple[bool, int])rL  r#  rl  rK  )r�  r   r‘  r"  rl  r   )rH   )g-Cëâ6?)r   r   )r   r   r  r   )r  r	   )r  r	   rl  rk  )r  r	   rl  rÅ   )r  r	   r5  r>   r6  zQuantType | Noner7  zdict | Nonerò   rÅ   rl  r	   )r   r   rl  r	   )r  r	   rl  r	   )rU  r
   rl  rj  )rX  r"  rl  r"  )rl  r"  )qÚ
__future__r   r  r»  r¿  rL  Úenumr   Úpathlibr   rq   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_NAMEr[  ÚDEQUANT_OP_NAMErg  r  ÚMODEL_SIZE_THRESHOLDrÔ   rÛ  rw   r.  rÅ   rT  r   r7   r>   rZ   rJ   re   rL   rP   rN   rR   rV   rT   r‘   rv   ra   r`   rc   rb   ré   rA  r?  r‚   r°   rÂ   rÑ   rá   r  r	  r  r=  r�   rD  rI  r$  rS  r\  rj  rz  r€  r…  rŠ  r’  r¥  rê  rõ  r  r  r  r  r  r   r(  rB  rH  r4  r  rY  r\  r_  rb  re  rh  )ró   s   0r%   ú<module>r     s>  ðõ #ã Û Û 	Û Ý Ý ã Û ß 0Ñ 0ß >Ñ >Ý &ß QÓ QÝ -ç PÑ PðÝ7ð €Ø€Ø€Ø€	Ø €Ø,Ð Ø$€Ø2Ð Ø'Ð Ø!Ð àÐ á47¸Ó4DÖq¨qÉ
ÑSZÐ[fÐhiÓSjÐloÕHp‘˜ QÓ'¨Ñ*Òq€ô�tô ô˜ô ô#>�ô #>ôL�$ô ð  ×Ñ×Ñ  §¡¨VÓ!4Ø×Ñ× Ñ  + %§+¡+¨gÓ"6Ø×Ñ× Ñ  + %§+¡+¨gÓ"6Ø×Ñ×!Ñ! ; 5§;¡;¨xÓ#8Ø×Ñ×'Ñ'¨Ø×Ñ×Ñ Ø×Ñ× Ñ  %ðÐ ð ×Ñ× Ñ  ; 5§;¡;¨q¸¿¹Ô#DÀkÀeÇkÁkÐRUÐ]b×]hÑ]hÔFiÐ"jØ×Ñ×Ñ + %§+¡+¨d¸%¿*¹*Ô"EÀ{ÀuÇ{Á{ÐSVÐ^c×^hÑ^hÔGiÐ!jØ×Ñ×!Ñ! K 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ÀkÀeÇkÁkÐRUÐ]b×]hÑ]hÔFiÐ"jØ×Ñ×Ñ + %§+¡+¨c¸¿¹Ô"DÀkÀeÇkÁkÐRTÐ\a×\fÑ\fÔFgÐ!hØ×Ñ×!Ñ! K 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ó 13óh<ô~8òv!ðH`Øð`àð`ð ð`ð ð	`ð
 ð`ð )ó`ðN Ø#'Ø"&Ø"&ð;GØ
ð;Gà)ð;Gð ð;Gð ð	;Gð
 !ð;Gð  ð;Gð  ð;Gð )ó;Gð~ hlð:=à7ó:=ðD Ø$(Øðc Øðc à)ðc ð ðc ð ð	c ð
 ðc ð "ðc ð ðc ð óc óLó@ó	ó÷<ñ ÷>%ñ %÷8'ñ 'ò"#òJ0òò@óRòó$Rójó2nó
kó 7óó7óóð )-Ø*.ØðWØðWàðWð &ðWð (ð	Wð
 ðWð óWótó7óó+ó,ó2ó-ó3ô/øðG' ò àÓðüò$ rs   Á"[ Â[Â[Û[Û[