§
    kŠtjÊ  ã                  ó 
  — 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! n# e"$ r dZ!Y nw xY wdZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,i Z-ej        j.        ej        j/        ej        j0        ej        j1        fZ2d„  e3e¦  «        D ¦   «         Z4 G d„ de¦  «        Z5 G d„ de¦  «        Z6 G d„ de¦  «        Z7 G d„ de¦  «        Z8ej        j9         e
j:        d¦  «        ej        j;         e
j:        d ¦  «        ej        j<         e
j:        d!¦  «        ej        j=         e
j:        d"¦  «        ej        j.        eej        j>        eej        j?        eiZ@ej        j;         e
jA        d e
jB        ¬#¦  «         e
jA        d$e
jB        ¬#¦  «        fej        j9         e
jA        d%e
jC        ¬#¦  «         e
jA        d&e
jC        ¬#¦  «        fej        j=         e
jA        d e
jD        ¬#¦  «         e
jA        d'e
jD        ¬#¦  «        fej        j<         e
jA        d(e
jE        ¬#¦  «         e
jA        d)e
jE        ¬#¦  «        fej        j?         e
jA        d e¬#¦  «         e
jA        d*e¬#¦  «        fej        j>         e
jA        d+e¬#¦  «         e
jA        d,e¬#¦  «        fiZFej        j9         e
jA        d-e
jC        ¬#¦  «         e
jA        d&e
jC        ¬#¦  «        fej        j<         e
jA        d.e
jE        ¬#¦  «         e
jA        d)e
jE        ¬#¦  «        fiZGej        j;         e
jA        d e
jB        ¬#¦  «         e
jA        d&e
jB        ¬#¦  «        fej        j9         e
jA        d/e
jC        ¬#¦  «         e
jA        d0e
jC        ¬#¦  «        fej        j=         e
jA        d e
jD        ¬#¦  «         e
jA        d)e
jD        ¬#¦  «        fej        j<         e
jA        d1e
jE        ¬#¦  «         e
jA        d2e
jE        ¬#¦  «        fej        j?         e
jA        d e¬#¦  «         e
jA        d,e¬#¦  «        fej        j>         e
jA        d3e¬#¦  «         e
jA        d4e¬#¦  «        fiZHd5d6œd7„ZId•d8„ZJd–d:„ZKd—d˜d@„ZLdA„ ZMd™dK„ZN	 	 	 	 dšd›dQ„ZO	 dšdœdS„ZP	 	 	 d�dždZ„ZQdŸd[„ZRdŸd\„ZSd d_„ZTd¡dc„ZU G dd„ de¦  «        ZV G df„ dg¦  «        ZW G dh„ di¦  «        ZXdj„ ZYdk„ ZZdl„ Z[dm„ Z\d¢dr„Z]ds„ Z^d£du„Z_d¤dw„Z`d¥dy„Zad¦d{„Zbd§d~„Zcd¨d„Zdd§d€„Zed¨d�„Zfd©d‚„Zg	 	 	 d�dªdˆ„Zhd«d‰„Zid¬dŠ„Zjd­d�„Zkd®d�„Zld®d�„Zmd¯d‘„Znd¯d’„Zod¯d“„Zpd¯d”„ZqdS )°é    )Ú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                óŠ   — i | ]@}t          t          t          |¦  «        t          ¦  «        ¯*t          t          |¦  «        |“ŒAS © )Ú
isinstanceÚgetattrr
   Úint)Ú.0Úks     úb/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/onnxruntime/quantization/quant_utils.pyú
<dictcomp>r$   3   sA   € ÐqÐqÐq¨qÍ
ÕSZÕ[fÐhiÑSjÔSjÕloÑHpÔHpÐq•� QÑ'Ô'¨ÐqÐqÐqó    c                  ó2   — e Zd ZdZdZd„ Zed„ ¦   «         ZdS )ÚQuantizationModer   é   c                ó   — | j         S ©N©Úname©Úselfs    r#   Ú__str__zQuantizationMode.__str__>   ó
   € ØŒyÐr%   c                óV   — 	 t           |          S # t          $ r t          ¦   «         ‚w xY wr*   )r'   ÚKeyErrorÚ
ValueError)Úmodes    r#   Úfrom_stringzQuantizationMode.from_stringA   s7   € ð	Ý# DÔ)Ð)øÝð 	ð 	ð 	Ý‘,”,Ðð	øøøó   ‚ �(N)Ú__name__Ú
__module__Ú__qualname__Ú
IntegerOpsÚ
QLinearOpsr/   Ústaticmethodr5   r   r%   r#   r'   r'   :   sH   € € € € € Ø€JØ€Jðð ð ð ðð ñ „\ðð ð r%   r'   c                  ó2   — e Zd ZdZdZd„ Zed„ ¦   «         ZdS )ÚQuantizedValueTyper   r(   c                ó   — | j         S r*   r+   r-   s    r#   r/   zQuantizedValueType.__str__M   r0   r%   c                óV   — 	 t           |          S # t          $ r t          ¦   «         ‚w xY wr*   )r>   r2   r3   )Úvs    r#   r5   zQuantizedValueType.from_stringP   s7   € ð	Ý% aÔ(Ð(øÝð 	ð 	ð 	Ý‘,”,Ðð	øøør6   N)r7   r8   r9   ÚInputÚInitializerr/   r<   r5   r   r%   r#   r>   r>   I   sH   € € € € € Ø€EØ€Kðð ð ð ðð ñ „\ðð ð r%   r>   c                  ó\   — 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dS )Ú	QuantTyper   r(   é   é   é   é   é   c                ó   — | j         S r*   r+   r-   s    r#   r/   zQuantType.__str__a   r0   r%   c                óV   — 	 t           |          S # t          $ r t          ¦   «         ‚w xY wr*   )rE   r2   r3   )Úts    r#   r5   zQuantType.from_stringd   s6   € ð	Ý˜Q”<ÐøÝð 	ð 	ð 	Ý‘,”,Ðð	øøør6   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=ú.)rE   ÚQInt8r
   ÚINT8ÚQUInt8ÚUINT8ÚQUInt16ÚUINT16ÚQInt16ÚINT16ÚQFLOAT8E4M3FNÚFLOAT8E4M3FNÚQUInt4ÚUINT4ÚQInt4ÚINT4r3   r-   s    r#   Útensor_typezQuantType.tensor_typek   s»   € à•9”?Ò"Ð"ÝÔ#Ð#Ø•9Ô#Ò#Ð#ÝÔ$Ð$Ø•9Ô$Ò$Ð$ÝÔ%Ð%Ø•9Ô#Ò#Ð#ÝÔ$Ð$Ø•9Ô*Ò*Ð*ÝÔ+Ð+Ø•9Ô#Ò#Ð#ÝÔ$Ð$Ø•9”?Ò"Ð"ÝÔ#Ð#ÝÐ<°4Ð<Ð<Ð<Ñ=Ô=Ð=r%   N)r7   r8   r9   rP   rR   rX   rV   rT   r\   rZ   r/   r<   r5   Úpropertyr^   r   r%   r#   rE   rE   X   s|   € € € € € Ø€EØ€FØ€MØ€FØ€GØ€EØ€Fðð ð ð ðð ñ „\ðð ð>ð >ñ „Xð>ð >ð >r%   rE   c                  ó2   — e Zd ZdZdZd„ Zed„ ¦   «         ZdS )ÚQuantFormatr   r(   c                ó   — | j         S r*   r+   r-   s    r#   r/   zQuantFormat.__str__‚   r0   r%   c                óV   — 	 t           |          S # t          $ r t          ¦   «         ‚w xY wr*   )ra   r2   r3   )Úformats    r#   r5   zQuantFormat.from_string…   s7   € ð	Ý˜vÔ&Ð&øÝð 	ð 	ð 	Ý‘,”,Ðð	øøør6   N)r7   r8   r9   Ú	QOperatorÚQDQr/   r<   r5   r   r%   r#   ra   ra   ~   sH   € € € € € Ø€IØ
€Cðð ð ð ðð ñ „\ðð ð r%   ra   Úint8Úuint8Úint16Úuint16©Údtypeéÿ   i€ÿÿÿé   iÿÿ  i €ÿÿiÿ  é   iøÿÿÿé   i�ÿÿÿi€ÿÿiÀÿÿÿé@   i Àÿÿi @  éüÿÿÿrG   éÿÿÿÿ©Úzero_point_indexc                óT  — g }t          |¦  «        D ]í\  }}t          j        t          |¦  «        t          j        ¦  «        r(|                     t          j        |¦  «        ¦  «         nEt          |t          j        ¦  «        r|                     |¦  «         nt          d|› d|› �¦  «        ‚|| k    rI|d         }|j
        t          j        k    s|j
        t          j        k    rt          d|j
        › �¦  «        ‚Œît          |¦  «        dk    rt          |¦  «        n|d         S )Nzarg z is not an array: rs   zzero_point cannot be r(   r   )Ú	enumerateÚnumpyÚ
issubdtypeÚtypeÚnumberÚappendÚarrayr   ÚndarrayÚ	TypeErrorrl   Úfloat32Úfloat16ÚlenÚtuple)ru   ÚargsÚnew_argsÚiÚarA   s         r#   Ú_check_typerˆ   ¯   s  € Ø€HÝ˜$‘”ð 
Cð 
C‰ˆˆ1ÝÔ�D ™GœG¥U¤\Ñ2Ô2ð 	=Ø�OŠO�EœK¨™NœNÑ+Ô+Ð+Ð+Ý˜�5œ=Ñ)Ô)ð 	=Ø�OŠO˜AÑÔÐÐåÐ; 1Ð;Ð;¸Ð;Ð;Ñ<Ô<Ð<ØÐ Ò Ð Ø˜”ˆAØŒw�%œ-Ò'Ð'¨1¬7µe´mÒ+CÐ+CÝÐ A¸¼Ð AÐ AÑBÔBÐBøÝ! (™mœ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 �rF|dk    rt          d|›d�¦  «        ‚|j        t          j
        k    rt          j        }n:|j        t          j        k    rt          j        }nt          d|j        › d�¦  «        ‚t          t!          t#          dg dgt$          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/          |                     d ||dœ¦  «        d         ¦  «        S t           |          }	t3          | dd¬¦  «        \  }
}|�t5          |
|¦  «        n|
}|�t7          ||¦  «        n|}t          j        |                     t          j
        ¦  «        |z                       ¦   «         |z   ¦  «        }t          j        ||||¬¦  «         t/          |                     |	¦  «        ¦  «        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 rO   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
   rY   ÚFLOAT8E4M3FNUZÚ
FLOAT8E5M2ÚFLOAT8E5M2FNUZÚNotImplementedErrorrl   rx   r€   ÚFLOATr�   ÚFLOAT16r3   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Úrefrl   ÚqminÚqmaxÚcliplowÚcliphighÚarr_fp32s                  r#   Úquantize_nparrayr¶   ¿   sv  € ØÕ(Ð(Ð(Ð(Øe ÐeÐeÐeñ )Ô(Ð(ð ÝÔÔ+ÝÔÔ-ÝÔÔ)ÝÔÔ-ð	ð ñ ð ˜Š?ˆ?Ý%Ð&jÐ[eÐ&jÐ&jÐ&jÑkÔkÐkØŒ9�œÒ%Ð%Ý#Ô)ˆIˆIØŒY�%œ-Ò'Ð'Ý#Ô+ˆIˆIåÐ=°´Ð=Ð=Ð=Ñ>Ô>Ð>ÝÝåØ" B¨¨½d¼k×>UÒ>UÐVbÐdiÐkmÐpqÐorÑ>sÔ>sðñ ô õ Ð.Ð0LÐ0LÐ0LÈsÈeÑTÔTð	ð å*¨3°	¸4Ñ@Ô@Ý*¨7°I¸tÑDÔDðõ (¨¨U°DÑ9Ô9Ð:ñô ñ
ô 
ˆ
õ  ! Ñ,Ô,ˆÝ˜3Ÿ7š7 4¨s¸UÐ)CÐ)CÑDÔDÀQÔGÑHÔHÐHõ % UÔ+ˆÝ,¨UÀÐRWÐXÑXÔX‰
ˆˆdà$' O•#�d˜C‘.”.�.¸ˆØ&*Ð&6•3�t˜T‘?”?�?¸DˆÝ”= #§*¢*­U¬]Ñ";Ô";¸eÑ"C×!JÒ!JÑ!LÔ!LÈzÑ!YÑZÔZˆÝŒ
�8˜W h°HÐ=Ñ=Ô=Ð=Ý˜8Ÿ?š?¨5Ñ1Ô1Ñ2Ô2Ð2r%   Fc           	     ó  — |dk    s|dk     rt          d|› d|› �¦  «        ‚t          j        | t          j        d| j        ¬¦  «        ¦  «        } t          j        |t          j        d|j        ¬¦  «        ¦  «        }|�,t          || t          j        || j        ¬¦  «        z   ¦  «        }|r?t          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     r7t          j        d	|j        ¬¦  «        }	t          j        d|j        ¬¦  «        }
n¡|rRt          j        t          j        ||z   t          j        d
t          j	        ¬¦  «        z  ¦  «        |j        ¬¦  «        }
n3t          j        t          j        || |	z  z
  ¦  «        |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:rk   Nzqmin=z > qmax=zscale issueç      ð?ç       @)r3   rx   Úminimumr}   rl   Úmaximumr¤   r¦   ÚabsÚfloat64ÚfinfoÚtinyr¨   r§   )ÚrminÚrmaxr±   r²   r•   Úmin_real_rangeÚabsmaxÚdrÚdqr�   r�   s              r#   Úcompute_scale_zprÈ   ó   sQ  € ð( ˆa‚x€x�4˜!’8�8ÝÐrÐ^bÐrÐrÐlpÐrÐrÑsÔsÐsõ
 Œ=˜�uœ{¨1°D´JÐ?Ñ?Ô?Ñ@Ô@€DÝŒ=˜�uœ{¨1°D´JÐ?Ñ?Ô?Ñ@Ô@€Dð Ð!Ý�4˜¥¤¨nÀDÄJÐ OÑ OÔ OÑOÑPÔPˆàð Ý”�uœy¨™œµ´	¸$±´Ñ@Ô@ˆØˆwˆØˆwˆà�4Š<ˆ<ˆ<Ð5 Ð5Ð5¨tÐ5Ð5‰<Œ<ˆ<Ý	Œ�T˜D‘[­¬Ð	6Ñ	6Ô	6€BÝ	Œ�T¥¤Ð	/Ñ	/Ô	/µ%´+¸dÍ%Ì-Ð2XÑ2XÔ2XÑ	X€BÝŒK˜˜R™Ñ Ô €EØ�AŠ:ˆ:ˆ:�}‰:Œ:ˆ:Ø�uŒ{˜4œ:Ñ&Ô&Ô+Ò+Ð+Ý”˜C t¤zÐ2Ñ2Ô2ˆÝ”[ ¨$¬*Ð5Ñ5Ô5ˆ
ˆ
àð 
	Yõ œÝ”˜T D™[­E¬K¸Å5Ä=Ð,QÑ,QÔ,QÑQÑRÔRÐZ^ÔZdðñ ô ˆJˆJõ œ¥U¤[°¸¸u¹Ñ1DÑ%EÔ%EÈTÌZÐXÑXÔXˆJØ—’˜TœZÑ(Ô(ˆà˜ÐÐr%   r±   r    r²   rÄ   úfloat | Nonec                óâ  — t          |¦  «        }t          |¦  «        }||z   dz   dz  }t          t          j        | ¦  «        ¦  «        } t          t          j        |¦  «        ¦  «        }t	          | d¦  «        } t          |d¦  «        }|�&|dk    r t          || t          |¦  «        z   ¦  «        }|| k    rÆ| dk    r|n|}t          t          | ¦  «        t          |¦  «        ¦  «        }	||k    r||z
  nt          d||z
  dz  ¦  «        }
|	dk    r|	ndt          d|
¦  «        z  }|�||||z
  z  k     r|||z
  z  }t          j        |t          j        ¬¦  «        t          j        |t          j	        ¬¦  «        fS | dk    rGt          j        |t          j        ¬¦  «        }t          j        |||z
  z  t          j	        ¬¦  «        }n_t          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(   rF   ç        Nr   rº   rk   )
r    Úfloatrx   Úsqueezer¥   r¤   r¾   r}   rh   r€   )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×   2  si  € õ �4‰yŒy€HÝ�4‰yŒy€HØ�hÑ Ñ" qÑ
(€Cå•”˜tÑ$Ô$Ñ%Ô%€DÝ•”˜tÑ$Ô$Ñ%Ô%€Dõ ˆt�S‰>Œ>€DÝˆt�S‰>Œ>€Dð Ð! n°qÒ&8Ð&8Ý�4˜¥ nÑ 5Ô 5Ñ5Ñ6Ô6ˆàˆt‚|€|ð %)¨C¢K K˜˜°SˆÝ•c˜$‘i”i¥ T¡¤Ñ+Ô+ˆà)6¸(Ò)BÐ)B�˜HÑ$Ð$ÍÈAÐPXÐ[cÑPcÐhiÑOiÑHjÔHjˆØ '¨!¢ �W�W°½¸A¸u¹¼ÑEˆ	ØÐ%¨)°nÈÐS[ÑH[Ñ6\Ò*\Ð*\Ø&¨(°XÑ*=Ñ>ˆIÝŒ{˜=µ´Ð<Ñ<Ô<½e¼kÈ)Õ[`Ô[hÐ>iÑ>iÔ>iÐiÐiàˆs‚{€{Ý”[ µ´Ð=Ñ=Ô=ˆ
Ý”˜D H¨xÑ$7Ñ8ÅÄÐNÑNÔNˆˆõ ”[ ­E¬KÐ8Ñ8Ô8ˆ
à�E˜S 8™^Ñ,ˆ	Ø˜H s™NÑ+ˆ	Ý”�C 	¨9Ñ5Ô5½U¼]ÐKÑKÔKˆð Ð!¥e¨E¡l¤l°^ÀxÐRZÑGZÑ5[Ò&[Ð&[Ý”˜N¨h¸Ñ.AÑBÍ%Ì-ÐXÑXÔXˆà�uÐÐr%   c                ó‚  — d}| t           vr±| t          j        k    rƒddlm} |}t          j        dt
          j        ¬¦  «                             |¦  «         	                    t
          j
        ¦  «        }t          j        d„ |D ¦   «         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 )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   é   rk   c                ób   — g | ],}t          j        |¦  «        °t          j        |¦  «        °*|‘Œ-S r   )rx   ÚisnanÚisinf)r!   Úfs     r#   ú
<listcomp>z+compute_scale_zp_float8.<locals>.<listcomp>  s3   € ÐTÐTÐT�q­e¬k¸!©n¬nÐTÅUÄ[ÐQRÁ^Ä^ÐT�ÐTÐTÐTr%   zQuantization to element_type=z not implemented.zUnexpected element_type rO   )ÚFLOAT8_DISTRIBUTIONSr
   rY   Ú	ml_dtypesr   rx   Úarangerh   Úviewr§   r€   r}   r3   r   Ústdrl   )	Úelement_typerã   Úzp_dtyper   Ú
all_valuesÚvaluesÚstd_f8Úzeror�   s	            r#   Úcompute_scale_zp_float8rê   m  s[  € ð €HØÕ/Ð/Ð/Ø�;Ô3Ò3Ð3Ø/Ð/Ð/Ð/Ð/Ð/à$ˆHÝœ cµ´Ð=Ñ=Ô=×BÒBÀ=ÑQÔQ×XÒXÕY^ÔYfÑgÔgˆJÝ”[ØTÐT˜JÐTÑTÔTÕ\aÔ\iðñ ô ˆFˆFõ Ð\¸\Ð\Ð\Ð\Ñ]Ô]Ð]Ø-3Õ˜\Ñ*Ð*Ø	�Ô1Ò	1Ð	1Ø+Ð+Ð+Ð+Ð+Ð+à ˆàÐÝÐB°<ÐBÐBÐBÑCÔCÐCÝŒYÕ+¨LÔ9Ñ:Ô:€FÝŒ;�q Ð)Ñ)Ô)€DÝŒK˜˜f™¨C¬IÐ6Ñ6Ô6€EØ�%ˆ=Ðr%   Úweightúnumpy.ndarrayÚ
quant_typeÚaxisÚ
block_sizer•   ÚboolÚreturnú#tuple[numpy.ndarray, numpy.ndarray]c                óF  ‡— | j         dk    r t          d| j         › d| j        › d�¦  «        ‚| j        ‰         }||z   dz
  |z  }t          t	          j        ˆfd„t          | j        ¦  «        D ¦   «         ¦  «        ¦  «        }t	          j        | ‰d¦  «        }|                     ||¦  «        }t          |d|¬	¦  «        \  }	}
t          |         d         j        }||z  |z
  }|dk    r6t	          j        ||f|j        ¬
¦  «        }t	          j        ||gd¬¦  «        }n|}|                     |||¦  «        }|                     d¬¦  «        }|                     d¬¦  «        }t	          j        |t	          j        |¦  «        ¦  «        }t	          j        |t	          j        |¦  «        ¦  «        }|r>t	          j        t	          j        |¦  «        t	          j        |¦  «        ¦  «        }| }|}t	          j        |	¦  «        }t	          j        |
¦  «        }||z
                       t          j        ¦  «        }||z
  }||z                       | j        ¦  «        }t	          j        | j        ¦  «        j        }||k     }t	          j        |t	          j        |¦  «        |¦  «        }|rAt          t	          j        ||z   dz  ¦  «        ¦  «        }t	          j        ||f||¬
¦  «        }n„t	          j        ||                     t          j        ¦  «        |                     t          j        ¦  «        z  z
  ¦  «        }t	          j        |||¦  «        }|                     |¦  «        }d||<   t	          j        |d‰¦  «        }t	          j        |d‰¦  «        }||fS )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).
    rF   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(   c                ó&   •— g | ]\  }}|‰k    ¯|‘ŒS r   r   ©r!   r†   Údrî   s      €r#   rÞ   z,compute_scale_zp_blocked.<locals>.<listcomp>·  s"   ø€ ÐOÐOÐO¡$ ! QÀQÈ$ÂYÀY˜AÀYÀYÀYr%   r   Fr“   rk   )rî   r»   )Úndimrœ   Úshaper    rx   Úprodrw   ÚmoveaxisÚreshaper£   ÚONNX_INT_TYPE_RANGErl   ÚzerosÚconcatenater¥   r¤   r¼   Ú
zeros_liker½   r¾   r¿   r§   rÀ   rÁ   ÚwhereÚ	ones_liker¨   Úfullr©   )rë   rí   rî   rï   r•   r"   Ún_blocksÚ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  ‘  st  ø€ ð6 „{�aÒÐÝ!ðfØœðfð fØ8>¼ðfð fð fñ
ô 
ð 	
ð 	Œ�TÔ€AØ�J‘ Ñ" zÑ1€Hõ •”
ÐOÐOÐOÐO­)°F´LÑ*AÔ*AÐOÑOÔOÑPÔPÑQÔQ€EåŒN˜6 4¨Ñ+Ô+€EØ�MŠM˜!˜UÑ#Ô#€Eå(¨À%ÐS\Ð]Ñ]Ô]�J€Dˆ$Ý" :Ô.¨qÔ1Ô7€Hð ˜Ñ# aÑ'€GØ�‚{€{ÝŒk˜7 EÐ*°%´+Ð>Ñ>Ô>ˆÝÔ(¨%°¨¸AÐ>Ñ>Ô>ˆˆàˆð ×!Ò! (¨J¸Ñ>Ô>€Fð �:Š:˜1ˆ:ÑÔ€DØ�:Š:˜1ˆ:ÑÔ€Dõ Œ=˜�uÔ/°Ñ5Ô5Ñ6Ô6€DÝŒ=˜�uÔ/°Ñ5Ô5Ñ6Ô6€Dàð Ý”�uœy¨™œµ´	¸$±´Ñ@Ô@ˆØˆwˆØˆåŒ}˜TÑ"Ô"€HÝŒ}˜TÑ"Ô"€HØ
�‰+×	Ò	�eœmÑ	,Ô	,€BØ	�HÑ	€BØ�b‘× Ò  ¤Ñ.Ô.€IåŒ;�v”|Ñ$Ô$Ô)€DØ˜TÒ!€JåŒ[˜¥U¤_°YÑ%?Ô%?ÀÑKÔK€Fàð $Ý•U”[ (¨XÑ"5¸Ñ!<Ñ=Ô=Ñ>Ô>ˆÝ”j (¨EÐ!2°FÀ(ÐKÑKÔKˆˆå”˜X¨¯ªµE´MÑ(BÔ(BÀVÇ]Â]ÕSXÔS`ÑEaÔEaÑ(aÑaÑbÔbˆÝ”˜F H¨hÑ7Ô7ˆØ—m’m HÑ-Ô-ˆØ"#ˆ�JÑõ
 Œ^˜F A tÑ,Ô,€FÝ”. ¨a°Ñ6Ô6€Kà˜ÐÐr%   Údataúonnx.TensorProto.DataTyper”   Úrmin_overrideÚrmax_overridec                óø  — t          | t          j        ¦  «        s t          dt	          | ¦  «        › d�¦  «        ‚|�|}n%t          | ¦  «        r|                      ¦   «         nd}|�|}n%t          | ¦  «        r|                      ¦   «         nd}t          j        || j	        ¬¦  «        }t          j        || j	        ¬¦  «        }t          j        d| j	        ¬¦  «        }	|t          j        k    rJ|rt          d¦  «        ‚t          j        | ¦  «        }
t          ||
¦  «        \  }}	t          ||	d¬	¦  «        S |t          j        t          j        t          j        t          j        t          j        t          j        fv rit-          |||¬
¦  «        \  }}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 rO   NrË   rk   rº   z1Unsupported option reduce_range=True for float 8.r   rt   ©r•   z Unexpected value for quant_type=)r   rx   r~   r   rz   r‚   r¥   r¤   r}   rl   r
   rY   ÚRuntimeErrorrã   rê   rˆ   rQ   rS   rW   rU   r]   r[   r£   rÈ   r3   )r  rí   r•   r”   rÄ   r  r  rÂ   rÃ   r�   rã   r�   r±   r²   s                 r#   Úcompute_data_quant_paramsr  ô  sì  € õ* �d�EœMÑ*Ô*ð OÝÐMÅÀTÁ
Ä
ÐMÐMÐMÑNÔNÐNØÐ Øˆˆå  ™YœYÐ/ˆt�xŠx‰zŒzˆz¨CˆàÐ Øˆˆå  ™YœYÐ/ˆt�xŠx‰zŒzˆz¨CˆåŒ;�t 4¤:Ð.Ñ.Ô.€DÝŒ;�t 4¤:Ð.Ñ.Ô.€DÝŒK˜ 4¤:Ð.Ñ.Ô.€Eà•[Ô-Ò-Ð-Øð 	TÝÐRÑSÔSÐSÝŒi˜‰oŒoˆÝ3°JÀÑDÔDÑˆ
�EÝ˜: u¸qÐAÑAÔAÐAàÝÔÝÔÝÔÝÔÝÔÝÔðð ð õ -¨Z¸ÐQZÐ[Ñ[Ô[‰
ˆˆdÝˆt‰9Œ9ð 	:Ý 0°°t¸TÀ4ÈÐTbÑ cÔ cÑˆJ˜˜åœ Q¨d¬jÐ9Ñ9Ô9ˆJÝ˜: u¸qÐAÑAÔAÐAå
ÐE¸
ÐEÐEÐEÑ
FÔ
FÐFr%   ú2tuple[numpy.ndarray, numpy.ndarray, numpy.ndarray]c                óÚ  — t          | ||||||¦  «        \  }}|t          j        k    rÔt          || ||¦  «        }	t	          |	                     t          j        ¦  «                             ¦   «         dz  dk    ¦  «        rxt          j	        | ¦  «        }
t          d|
                     ¦   «         › d|
                     ¦   «         › d|	                     ¦   «         › d|	                     ¦   «         › 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
    rn   z+One of the quantized value is NaN data in [z, z], quantized_data in [z].zUnexpected value for qType=rO   )r  r
   rY   r¶   Úanyrâ   rx   rh   Úravelr¦   r  r¥   r¤   rQ   rS   rW   rU   r]   r[   r3   )r  rª   r•   r”   rÄ   r  r  r�   r�   Úquantized_dataÚnp_datas              r#   Úquantize_datar  2  s–  € õ8 2ØØØØØØØñô Ñ€J�ð •Ô(Ò(Ð(Ý)¨%°°u¸jÑIÔIˆÝ�×#Ò#¥E¤KÑ0Ô0×6Ò6Ñ8Ô8¸3Ñ>À3ÒFÑGÔGð 	Ý”m DÑ)Ô)ˆGÝðW¸g¿kºk¹m¼mð Wð WÈwÏ{Ê{É}Ì}ð Wð WØ&4×&8Ò&8Ñ&:Ô&:ðWð WØ>L×>PÒ>PÑ>RÔ>RðWð Wð Wñô ð ð ˜5 .Ð0Ð0àÝÔÝÔÝÔÝÔÝÔÝÔðð ð õ *¨%°°u¸jÑIÔIˆØ˜5 .Ð0Ð0å
Ð;°5Ð;Ð;Ð;Ñ
<Ô
<Ð<r%   úonnx.TensorProtor�   r�   ú
int | NoneÚquant_weight_nameú
str | Nonec                óŒ
  ‡— t          | ¦  «        }d}‰��¸|dk    �r±|j        ‰         }	t          t          j        ˆfd„t          |j        ¦  «        D ¦   «         ¦  «        ¦  «        }
t          j        |‰d¦  «                             |	|
¦  «        }t          j        |‰d¦  «        }t          j        |‰d¦  «        }|j        d         }t          j	         
                    |¦  «        }t          j        ||¬¦  «        }t          |¦  «        D ]q}||z  }t          ||z   |	¦  «        }t          |
¦  «        D ]G}t          ||||…|f                              ¦   «         |||f         |||f         ¦  «        |||…|f<   ŒHŒrt          j        |                     |	gˆfd„t          |j        ¦  «        D ¦   «         z   ¦  «        d‰¦  «        }nú‰€%t          ||                     ¦   «         ||¦  «        }nÓ|j        ‰         }t!          |j        ¦  «        }d|‰<   g }t          |¦  «        D ]†}|                     |‰¦  «        }||         }||         }t          ||                     ¦   «         ||¦  «        }|                     t          j        |¦  «                             |¦  «        ¦  «         Œ‡t          j        |‰¦  «        }|r|n| j        › t,          › �}|t          j        j        k    �rAt          j        ¦   «         }||_        |j                             | j        ¦  «         ||_        |                     ¦   «                              ¦   «                              ¦   «         |_        t@          �»tA          |¦  «        }|j        |j        k    s*|                     ¦   «         |                     ¦   «         k    rrtC          d|j        › d|                     ¦   «         dd	…         › d
|                     ¦   «         dd	…         › d| j        › dtE          |¦  «        dd…         › d�¦  «        ‚�n|t          j        j#        t          j        j$        fv r€|j%        tL          tN          fvrtC          d|› d�¦  «        ‚tQ          tS          |                     ¦   «         ¦  «        ¦  «        } t          j	         *                    ||| j        | d¬¦  «        }nmt          j	         
                    |¦  «        }t          j        ||¬¦  «                             | j        ¦  «        }t          j+         ,                    ||¦  «        }|S )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   c                ó&   •— g | ]\  }}|‰k    ¯|‘ŒS r   r   rõ   s      €r#   rÞ   z-quantize_onnx_initializer.<locals>.<listcomp>Š  s#   ø€ ÐXÐXÐX¡d a¨ÈaÐSWÊiÈi ÈiÈiÈir%   rk   c                ó&   •— g | ]\  }}|‰k    ¯|‘ŒS r   r   rõ   s      €r#   rÞ   z-quantize_onnx_initializer.<locals>.<listcomp>›  s)   ø€ Ð"[Ð"[Ð"[©¨¨AÐQRÐVZÒQZÐQZ 1ÐQZÐQZÐQZr%   r(   zThe initializer of shape z! could not be created, expecting é
   z, got z and shape=z
raw=éÈ   rO   zQuantized weights for z. must be 8-bit before packing as 4-bit values.T)Úraw)-Útensor_proto_to_arrayrø   r    rx   rù   rw   rú   rû   rŸ   r    Útensor_dtype_to_np_dtypeÚ
empty_likeÚranger¥   r¶   r  ÚlistÚtaker|   r¦   rþ   r,   ÚTENSOR_NAME_QUANT_SUFFIXr
   rY   Ú	data_typeÚdimsÚextendÚflattenÚcopyÚtobytesÚraw_datar   r  Ústrr]   r[   rl   r   r   ÚbytesÚpack_bytes_to_4bitr¡   Únumpy_helperÚ
from_array)!rë   rí   r�   r�   rî   r"  rï   Úweight_dataÚq_weight_datar"   r  r  Úscale_movedÚzp_movedr  Úquant_np_dtypeÚq_movedÚblkÚstartÚendÚcolÚ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_datas!       `                            r#   Úquantize_onnx_initializerrR  o  sY  ø€ õ, (¨Ñ/Ô/€KØ*.€MàÑ˜J¨šN™NØÔ˜dÔ#ˆÝ•E”JÐXÐXÐXÐX­i¸Ô8IÑ.JÔ.JÐXÑXÔXÑYÔYÑZÔZˆÝ”˜{¨D°!Ñ4Ô4×<Ò<¸QÀÑFÔFˆõ ”n U¨D°!Ñ4Ô4ˆÝ”> *¨d°AÑ6Ô6ˆØÔ$ QÔ'ˆÝœ×=Ò=¸jÑIÔ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Ñ1MÔ1MÐ"[Ñ"[Ô"[Ñ[Ñ\Ô\Ð^_Ðaeñ
ô 
ˆˆð 
ˆÝ(¨°[×5FÒ5FÑ5HÔ5HÈ%ÐQ[Ñ\Ô\ˆˆà#Ô)¨$Ô/ˆÝ˜KÔ-Ñ.Ô.ˆØˆ�TÑØ&(Ð#å�}Ñ%Ô%ð 	lð 	lˆAØ&×+Ò+¨A¨tÑ4Ô4ˆLØ! !œHˆMØ!+¨A¤ÐÝ%5Ø˜L×.Ò.Ñ0Ô0°-ÐASñ&ô &Ð"ð (×.Ò.­u¬}Ð=SÑ/TÔ/T×/\Ò/\Ð]iÑ/jÔ/jÑkÔkÐkÐkåÔ)Ð*EÀtÑLÔLˆà):ÐjÐ%Ð%À6Ä;Ð@jÕPhÐ@jÐ@j€Mà•TÔ%Ô2Ò2Ñ2Ý#Ô/Ñ1Ô1ÐØ)3ÐÔ&ØÔ!×(Ò(¨¬Ñ5Ô5Ð5Ø$1ÐÔ!à(5×(=Ò(=Ñ(?Ô(?×(DÒ(DÑ(FÔ(F×(NÒ(NÑ(PÔ(PÐÔ%ÝÐ(õ &Ð&:Ñ;Ô;ˆEØŒ{˜kÔ/Ò/Ð/°5·=²=±?´?Àm×F[ÒF[ÑF]ÔF]Ò3]Ð3]Ý"ð@°Ô0Að @ð @Ø$×,Ò,Ñ.Ô.¨s°¨sÔ3ð@ð @Ø;@¿=º=¹?¼?È3ÈBÈ3Ô;Oð@ð @Ø\bÔ\hð@ð @å Ð!5Ñ6Ô6°t¸°tÔ<ð@ð @ð @ñô ð ùð
 
�Ô(Ô-­tÔ/?Ô/EÐFÐ	FÐ	FØÔ¥t­U mÐ3Ð3ÝÐu¸ÐuÐuÐuÑvÔvÐvõ Õ.¨}×/DÒ/DÑ/FÔ/FÑGÔGÑHÔHˆõ  $œ{×6Ò6°}ÀjÐRXÔR]Ð_jÐptÐ6ÑuÔuÐÐåœ×=Ò=¸jÑIÔIˆÝœ m¸>ÐJÑJÔJ×RÒRÐSYÔS^Ñ_Ô_ˆÝ#Ô0×;Ò;¸MÈ=ÑYÔYÐàÐr%   c                óŠ  — | t           j        j        k    rt          d¦  «        ‚d}|rt                               | ¦  «        }n3|r| t          v rt          |          }nt                               | ¦  «        }|st          d| › d�¦  «        ‚|\  }}|dk    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
   rY   rœ   ÚONNX_INT_TYPE_REDUCED_RANGEÚgetÚONNX_INT_TYPE_SYMMETRIC_RANGErü   r3   rl   )rª   r”   r•   Úqranger±   r²   s         r#   r£   r£   Õ  s#  € ð •
Ô&Ô3Ò3Ð3Ý!Ð"_Ñ`Ô`Ð`à€Fàð 0Ý,×0Ò0°Ñ7Ô7ˆˆØ	ð 0�uÕ =Ð=Ð=Ý.¨uÔ5ˆˆå$×(Ò(¨Ñ/Ô/ˆàð xÝÐv°ÐvÐvÐvÑwÔwÐwà�J€Dˆ$Øˆa‚x€x�4˜!’8�8Ýð4Øð4ð 4Ø"&ð4ð 4Ø04´
ð4ð 4ØKWð4ð 4à"ð4ð 4à,1ð4ð 4ñ
ô 
ð 	
ð €Mr%   c                ó6   — 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_qTyperY  õ  s&   € õ )¨°È	ÐRÑRÔR�J€Dˆ$Ø�$‰;Ðr%   Úrankútuple[bool, int]c                ó<   — | dk     r| |z   n| }|dk    o||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   r   )rî   rZ  Ú	axis_normÚis_valids       r#   Únormalize_axisr_  ÿ  s7   € ð  $ ašx˜x��t‘�¨T€IØ˜AŠ~Ð2 )¨dÒ"2€HØ�YÐÐr%   Úsrc_8bitr9  Ú	bytearrayc                ó"  — t          | ¦  «        }|dk    rt          ¦   «         S |dz   dz  }t          |¦  «        }d}d}||dz
  k     r3| |dz            dz  dz  | |         dz  z  ||<   |dz  }|dz  }||dz
  k     °3||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(   rF   ro   rH   )r‚   ra  )r`  Ú	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dS )ÚQuantizedInitializerzJ
    Represents a linearly quantized weight input from ONNX operators
    Nc
                ó„   — || _         || _        || _        || _        || _        || _        || _        || _        |	| _        d S r*   )	r,   ÚinitializerÚrminsÚrmaxsr  r  r  r  rî   )
r.   r,   rk  rl  rm  r  r  r  r  rî   s
             r#   Ú__init__zQuantizedInitializer.__init__.  sJ   € ð ˆŒ	Ø&ˆÔØˆŒ
ØˆŒ
à&ˆÔØˆŒØˆŒ	Ø,ˆÔàˆŒ	ˆ	ˆ	r%   ©r7   r8   r9   Ú__doc__rn  r   r%   r#   ri  ri  )  s=   € € € € € ðð ð ØØðð ð ð ð ð r%   ri  c                  ó"   — e Zd ZdZ	 	 	 	 dd„ZdS )ÚQuantizedValuezI
    Represents a linearly quantized value (input\output\intializer)
    Nc
                ó„   — || _         || _        || _        || _        || _        || _        || _        || _        |	| _        d S r*   )	Úoriginal_nameÚq_nameÚ
scale_nameÚzp_nameÚ
value_typerî   Ú	node_typeÚ
node_qtypeÚ
scale_type)
r.   r,   Únew_quantized_namerv  Úzero_point_nameÚquantized_value_typerî   ry  rz  r{  s
             r#   rn  zQuantizedValue.__init__M  sH   € ð "ˆÔØ(ˆŒØ$ˆŒØ&ˆŒØ.ˆŒØˆŒ	Ø"ˆŒØ$ˆŒØ$ˆŒˆˆr%   )NNNNro  r   r%   r#   rr  rr  H  s@   € € € € € ðð ð ØØØð%ð %ð %ð %ð %ð %r%   rr  c                  ó   — e Zd ZdZd„ ZdS )ÚBiasToQuantizez+
    Represents a bias to be quantized
    c                ó0   — || _         || _        || _        d S r*   )Ú	bias_nameÚ
input_nameÚweight_name)r.   r‚  rƒ  r„  s       r#   rn  zBiasToQuantize.__init__i  s   € Ø"ˆŒØ$ˆŒØ&ˆÔÐÐr%   Nro  r   r%   r#   r€  r€  d  s-   € € € € € ðð ð'ð 'ð 'ð 'ð 'r%   r€  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        }nl| j         d
k    r| j	        }nY| j         dk    r| j
        }nF| j         dk    r| j        }n3| 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(   rF   rG   rH   rI   rJ   rp   é   é	   r'  z has unsupported type rO   )rz   r3   r,   rÝ   r†   ÚsrM   ÚgÚfloatsÚintsÚstringsÚtensorsÚgraphs)Ú	attributerŽ   s     r#   Úattribute_to_kwargr�  o  sB  € ð „~˜ÒÐÝÐT i¤nÐTÐTÐTÑUÔUÐUð „~˜ÒÐØ”ˆˆØ	Œ˜1Ò	Ð	Ø”ˆˆØ	Œ˜1Ò	Ð	Ø”ˆˆØ	Œ˜1Ò	Ð	Ø”ˆˆØ	Œ˜1Ò	Ð	Ø”ˆˆØ	Œ˜1Ò	Ð	ØÔ ˆˆØ	Œ˜1Ò	Ð	Ø”ˆˆØ	Œ˜1Ò	Ð	ØÔ!ˆˆØ	Œ˜1Ò	Ð	ØÔ!ˆˆØ	Œ˜2Ò	Ð	ØÔ ˆˆåÐ] i¤nÐ]Ð]ÈIÌNÐ]Ð]Ð]Ñ^Ô^Ð^àŒN˜EÐ"Ð"r%   c                óZ   ‡ — ˆ fd„|D ¦   «         }t          |¦  «        dk    r|d         ndS )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.
    c                ó*   •— g | ]}|j         ‰k    ¯|‘ŒS r   r+   )r!   ÚitemÚ	item_names     €r#   rÞ   z find_by_name.<locals>.<listcomp>›  s%   ø€ ÐBÐBÐB�d¨4¬9¸	Ò+AÐ+AˆTÐ+AÐ+AÐ+Ar%   r   N)r‚   )r”  Ú	item_listÚitemss   `  r#   Úfind_by_namer—  ”  s;   ø€ ð CÐBÐBÐB˜iÐBÑBÔB€EÝ˜5‘z”z A’~�~ˆ5�Œ8ˆ8¨4Ð/r%   c                ód   — d}t          t          |¦  «        ¦  «        D ]}||         | k    r|}Œ|S )zC
    Helper function to return index of an item in a node list
    rs   )r-  r‚   )Ú	elem_nameÚ	elem_listÚelem_idxr†   s       r#   Úget_elem_indexrœ  Ÿ  s@   € ð €HÝ•3�y‘>”>Ñ"Ô"ð ð ˆØ�QŒ<˜9Ò$Ð$ØˆHøØ€Or%   c                óH   — t           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%   Úfilenamer   Ú
identifierr8  c                óV   — | 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)r¢  r£  s     r#   Úgenerate_identified_filenamer©  µ  s(   € ð Œ?×#Ò# H¤M°JÑ$>ÀÄÑ$PÑQÔQÐQr%   c                óœ  — dd l }dd lm} dd l} |j        |j        ¬¦  «         t          d¦  «         t          | ¦  «         t          d¦  «         t          |¦  «         |                     | |d¬¦  «         |                     d¦  «         | 	                    d¦  «         | 
                    d	¦  «         |                     ¦   «          d S )
Nr   )Ú	thresholdz
Histogram:zHistogram Edges:T)ÚfillzTensor valueÚCountszTensor value V.S. Counts)ÚsysÚmatplotlib.pyplotÚpyplotrx   Úset_printoptionsÚmaxsizeÚprintÚstairsÚxlabelÚylabelÚtitleÚshow)ÚhistÚ
hist_edgesr®  Úpltrx   s        r#   Ú
apply_plotr¼  ¼  sÔ   € Ø€J€J€Jà#Ð#Ð#Ð#Ð#Ð#Ø€L€L€Là€EÔ S¤[Ð1Ñ1Ô1Ð1Ý	ˆ,ÑÔÐÝ	ˆ$�K„K€KÝ	Ð
ÑÔÐÝ	ˆ*ÑÔÐØ‡J‚Jˆt�Z d€JÑ+Ô+Ð+Ø‡J‚Jˆ~ÑÔÐØ‡J‚JˆxÑÔÐØ‡I‚IÐ(Ñ)Ô)Ð)Ø‡H‚H�J„J€J€J€Jr%   rO   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| › �¦  «         |                     | |¬¦  «        }t          t          j                             |d¦  «        d¦  «        5 }	|	                     |¦  «         ddd¦  «         n# 1 swxY w Y   |                     d¦  «        }
|                     d¦  «        }g }t+          |                      ¦   «         ¦  «        D �]:}| |         }|                     ¦   «         }t1          |                     d	|
¦  «                             ¦   «         ¦  «        t1          |                     d
|
¦  «                             ¦   «         ¦  «        g}t7          t9          |¦  «        ¦  «        }|                     |¦  «        }|                     |¦  «        }|                     |¦  «         |                     ||¦  «         |                      ||¦  «         | !                    |¦  «        }| "                    |¦  «         �Œ<| #                    |tI          |¦  «        ¦  «         |D ]}| %                    |¦  «         Œ| &                    ¦   «         }| '                    |¦  «         | (                    ||¦  «         | )                    |¦  «        }| *                    |¦  «         | +                    ¦   «         }t          t          j                             |d¦  «        d¦  «        5 }	|	                     |¦  «         ddd¦  «         n# 1 swxY w Y   t          j,                             dd¦  «        dv r¢|j         -                    |d¦  «        }| .                    ¦   «         }t_          |¦  «        D ]c}| 0                    |¦  «        }t          j        | 1                    ¦   «         ¦  «         t          j        | 2                    ¦   «         ¦  «         Œdt          t          j                             |d¦  «        d¦  «        5 }	t+          |                      ¦   «         ¦  «        D ]Ô}| |         }|                     ¦   «         }t1          |                     d	|
¦  «                             ¦   «         ¦  «        t1          |                     d
|
¦  «                             ¦   «         ¦  «        g}|dz   t7          t9          |¦  «        ¦  «        z   }|	                     |¦  «         |	                     d¦  «         ŒÕ	 ddd¦  «         dS # 1 swxY w Y   dS )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Úflatbuffersrx   Ú5onnxruntime.quantization.CalTableFlatBuffers.KeyValueÚquantizationÚCalTableFlatBuffersÚKeyValueÚ5onnxruntime.quantization.CalTableFlatBuffers.TrtTableÚTrtTableÚ"onnxruntime.quantization.calibrater¾  ÚloggingÚinfoÚdumpsÚopenÚosÚpathÚjoinÚwriter}   ÚBuilderÚsortedÚkeysÚto_dictrÌ   rU  r“  r8  r¤   ÚCreateStringÚKeyValueStartÚKeyValueAddKeyÚKeyValueAddValueÚKeyValueEndr|   Ú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_valuesrŠ  rŽ   Úflat_keyÚ
flat_valueÚ	key_valueÚ	main_dictÚ	cal_tableÚbufÚdict_lenr†   s                             r#   Úwrite_calibration_tabler  Î  sÇ  € ð
 €K€K€KàÐÐÐØÐÐÐàLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLØLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLð KÐJÐJÐJÐJÐJå„LÐ:Ð'8Ð:Ð:Ñ;Ô;Ð;à—
’
Ð,Ð2I�
ÑJÔJ€Iå	�bŒg�lŠl˜3Ð 2Ñ3Ô3°SÑ	9Ô	9ð ¸TØ�
Š
�9ÑÔÐðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð �8Š8�A‰;Œ;€DØ×!Ò! $Ñ'Ô'€GØ€NÝÐ'×,Ò,Ñ.Ô.Ñ/Ô/ð )ñ )ˆØ" 3Ô'ˆØ—>’>Ñ#Ô#ˆå�(—,’,˜y¨$Ñ/Ô/×4Ò4Ñ6Ô6Ñ7Ô7Ý�(—,’,˜x¨Ñ.Ô.×3Ò3Ñ5Ô5Ñ6Ô6ð
ˆõ •C˜‘K”KÑ Ô ˆà×'Ò'¨Ñ,Ô,ˆØ×)Ò)¨%Ñ0Ô0ˆ
à×Ò˜wÑ'Ô'Ð'Ø×Ò ¨Ñ2Ô2Ð2Ø×!Ò! '¨:Ñ6Ô6Ð6Ø×(Ò(¨Ñ1Ô1ˆ	à×Ò˜iÑ(Ô(Ð(Ñ(à×$Ò$ W­c°.Ñ.AÔ.AÑBÔBÐBØ#ð 3ð 3ˆ	Ø×'Ò'¨	Ñ2Ô2Ð2Ð2Ø×!Ò!Ñ#Ô#€Ià×Ò˜7Ñ#Ô#Ð#Ø×Ò˜W iÑ0Ô0Ð0Ø×$Ò$ WÑ-Ô-€Ià‡N‚N�9ÑÔÐØ
�.Š.Ñ
Ô
€Cå	�bŒg�lŠl˜3Ð 9Ñ:Ô:¸DÑ	AÔ	Að ÀTØ�
Š
�3‰Œˆðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð õ 
„z‡~‚~Ð*¨CÑ0Ô0°HÐ<Ð<ØÔ%×7Ò7¸¸QÑ?Ô?ˆ	Ø×'Ò'Ñ)Ô)ˆÝ�x‘”ð 	,ð 	,ˆAØ!Ÿš qÑ)Ô)ˆIÝŒL˜Ÿš™œÑ)Ô)Ð)ÝŒL˜ŸšÑ*Ô*Ñ+Ô+Ð+Ð+õ 
�bŒg�lŠl˜3Ð 3Ñ4Ô4°cÑ	:Ô	:ð 
¸dÝÐ+×0Ò0Ñ2Ô2Ñ3Ô3ð 		ð 		ˆCØ& sÔ+ˆFØ—~’~Ñ'Ô'ˆHå�h—l’l 9¨dÑ3Ô3×8Ò8Ñ:Ô:Ñ;Ô;Ý�h—l’l 8¨TÑ2Ô2×7Ò7Ñ9Ô9Ñ:Ô:ðˆFð ˜#‘I¥¥C¨¡K¤KÑ 0Ô 0Ñ0ˆEØ�JŠJ�uÑÔÐØ�JŠJ�tÑÔÐÐð		ð
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
ð 
ð 
s7   ÂB)Â)B-Â0B-Ì%MÍMÍMÑC7U	Õ	UÕUç-Cëâ6?c                óä  — | dk                          t          j        ¦  «        }| dk                          t          j        ¦  «        }|                     ¦   «         }| j        |z
  }|sdS |t          |¦  «        z  t          |¦  «        z  }|dk     sJ d|› d|› d|› �¦   «         ‚|                       t          j        ¦  «        }|||z  | |z  z   z  }|dk                         ¦   «         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§   rx   r€   ÚsumÚsizerÌ   )ÚpÚepsÚis_zerosÚis_nonzerosÚn_zerosÚ
n_nonzerosÚeps1r¹  s           r#   Úsmooth_distributionr  #  sò   € ð �Q’�Š�uœ}Ñ-Ô-€HØ˜’6—/’/¥%¤-Ñ0Ô0€KØ�lŠl‰nŒn€GØ”˜'Ñ!€Jàð àˆtØ•�w‘”Ñ¥%¨
Ñ"3Ô"3Ñ3€DØ�#Š:ˆ:ˆ:ÐQ 'ÐQÐQ¸
ÐQÐQÈ4ÐQÐQ‰:Œ:ˆ:à�8Š8•E”MÑ"Ô"€DØˆC�(‰N˜t˜e {Ñ2Ñ2Ñ2€DØ�AŠI�?Š?ÑÔ Ò!Ð!Ð!Ð!à€Kr%   Ú
model_pathc                ó˜   — t          j        |                      ¦   «         d¬¦  «        }t          d„ |j        j        D ¦   «         ¦  «        S )NF)Úload_external_datac              3  ó>   K  — | ]}t          j        |¦  «        V — Œd S r*   )r   Úuses_external_data)r!   Ú
intializers     r#   ú	<genexpr>z*model_has_external_data.<locals>.<genexpr>>  s.   è è € ÐmÐmÀzÕ#Ô6°zÑBÔBÐmÐmÐmÐmÐmÐmr%   )rŸ   ÚloadÚas_posixr  Úgraphrk  )r  Úmodels     r#   Úmodel_has_external_datar  <  sF   € ÝŒI�j×)Ò)Ñ+Ô+ÀÐFÑFÔF€EÝÐmÐmÐUZÔU`ÔUlÐmÑmÔmÑmÔmÐmr%   Úopt_model_pathc                óÌ   — t          ¦   «         }|                     ¦   «         |_        t          j        |_        i }dg|d<   t          |                      ¦   «         |fddgi|¤Ž}dS )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&  A  sr   € õ !Ñ"Ô"€KØ+9×+BÒ+BÑ+DÔ+D€KÔ(Ý+AÔ+R€KÔ(Ø€Fà%6Ð$7€FÐ Ñ!Ý˜×,Ò,Ñ.Ô.°ÐjÐjÐH^ÐG_ÐjÐciÐjÐj€A€A€Ar%   r  r	   c                ó²   — ddi}| j         r+| j         D ]#}|                     |j        |j        i¦  «         Œ$t          j                             | |¦  «         dS )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/  Q  sh   € à.Ð0CÐD€NØÔð :ØÔ(ð 	:ð 	:ˆDØ×!Ò! 4¤8¨T¬ZÐ"8Ñ9Ô9Ð9Ð9Ý„K×Ò  ~Ñ6Ô6Ð6Ð6Ð6r%   c                óZ   — | j         r#| j         D ]}|j        dk    r|j        dk    r dS ŒdS )zCCheck the model whether it went through quantization pre-processingr(  r)  TF©r+  rø  rŽ   )r  r.  s     r#   Úmodel_has_pre_process_metadatar2  Z  sG   € àÔð ØÔ(ð 	ð 	ˆDØŒxÐ3Ò3Ð3¸¼
ÐFYÒ8YÐ8YØ�t�tøØˆ5r%   c                ó²   — ddi}| j         r+| j         D ]#}|                     |j        |j        i¦  «         Œ$t          j                             | |¦  «         d S )Nú
onnx.inferr)  r*  )r  r+  r  s      r#   Úadd_infer_metadatar5  c  sh   € Ø"Ð$7Ð8€NØÔð 4ØÔ%ð 	4ð 	4ˆAØ×!Ò! 1¤5¨!¬'Ð"2Ñ3Ô3Ð3Ð3Ý„K×Ò  ~Ñ6Ô6Ð6Ð6Ð6r%   c                óZ   — | j         r#| j         D ]}|j        dk    r|j        dk    r dS ŒdS )Nr4  r)  TFr1  )r  r  s     r#   Úmodel_has_infer_metadatar7  k  sF   € ØÔð ØÔ%ð 	ð 	ˆAØŒu˜Ò$Ð$¨¬Ð4GÒ)GÐ)GØ�t�tøØˆ5r%   c                ó†   — d„ | j         D ¦   «         }t          |¦  «        dk    rt          d¦  «        ‚|d         j        }|S )Nc                ó6   — g | ]}|j         r|j         d k    ¯|‘ŒS )r   )Údomain)r!   Úopsets     r#   rÞ   z%get_opset_version.<locals>.<listcomp>t  s.   € ÐmÐmÐm À5Ä<ÐmÐSXÔS_ÐclÒSlÐSl�eÐSlÐSlÐSlr%   r(   z$Failed to find proper ai.onnx domainr   )Úopset_importr‚   r3   Úversion)r  Úai_onnx_domainÚopset_versions      r#   Úget_opset_versionr@  s  sM   € ØmÐm¨Ô);ÐmÑmÔm€NÝ
ˆ>ÑÔ˜aÒÐÝÐ?Ñ@Ô@Ð@Ø" 1Ô%Ô-€MàÐr%   Úweight_typeÚactivation_typeúQuantType | NoneÚtensor_quant_overridesúdict | Nonec                ó$  — t          | ¦  «        }|}t          |d|¦  «        }|�t          |d|¦  «        nd }t          j        j        t          j        j        f}	||	v p||	v }
|
s¸|r¶t          j        t          j        h}	 | 	                    ¦   «         D ]\}|D ]S}| 
                    d¦  «        }||v rd}
 n5| 
                    d¦  «        }|�| 
                    d¦  «        }||v rd}
 nŒT|
r nŒ]n+# t          t          f$ r t          j        d¦  «         Y nw xY w|dk     r!|dk    rt          j        d|› d	�¦  «         d}n˜|d
k     r0|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}||k    r/t          j                             | |¦  «        } t'          | ¦  «        } | S )Nr^   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@  r   rŸ   r
   rU   rW   rE   rV   rT   rç   rU  ÚAttributeErrorr   rÒ  ÚdebugÚwarningrY   Úversion_converterÚconvert_versionÚ&save_and_reload_model_with_shape_infer)r  rA  rB  rD  rï   r?  Útarget_opset_versionÚweight_quant_typeÚactivation_quant_typeÚ_int16_typesÚneeds_opset21_for_16bitÚ_int16_quant_typesÚoverrides_listÚoverrideÚqtrG  Ú
convert_qts                    r#   Úupdate_opset_versionr[  |  s  € õ & eÑ,Ô,€MØ(ÐÝ ¨]¸KÑHÔHÐàDSÐD_�� °Ñ@Ô@Ð@Ðeið õ Ô$Ô+­TÔ-=Ô-CÐD€LØ/°<Ð?ÐhÐCXÐ\hÐChÐð #ð wÐ'=ð wÝ'Ô.µ	Ô0AÐBÐð	wØ"8×"?Ò"?Ñ"AÔ"Að ð �Ø .ð 
"ð 
"�HØ!Ÿš lÑ3Ô3�BØÐ/Ð/Ð/Ø26Ð/Ø˜Ø&Ÿlšl¨9Ñ5Ô5�GØÐ*Ø%,§[¢[°Ñ%>Ô%>˜
Ø%Ð);Ð;Ð;Ø6:Ð3Ø!˜EøØ*ð Ø�Eðøøå¥	Ð*ð 	wð 	wð 	wõ ŒMÐuÑvÔvÐvÐvÐvð	wøøøð
 �rÒÐ˜j¨1šn˜nÝŒð1°=ð 1ð 1ð 1ñ	
ô 	
ð 	
ð  "ÐÐà	˜Ò	Ð	Ð 1µTÔ5EÔ5RÒ RÐ RÝŒð1°=ð 1ð 1ð 1ñ	
ô 	
ð 	
ð
  "ÐÐà	˜Ò	Ð	Ð 7Ð	ÝŒð1°=ð 1ð 1ð 1ñ	
ô 	
ð 	
ð  "ÐÐà	˜"Ò	Ð	ÝŒðM°=ð Mð Mð Mñ	
ô 	
ð 	
ð 	
ð
 
˜Ò	Ð	ÝŒð1°=ð 1ð 1ð 1ñ	
ô 	
ð 	
ð
  "Ðà˜}Ò,Ð,ÝÔ&×6Ò6°uÐ>RÑSÔSˆõ 7°uÑ=Ô=ˆà€Ls   Á?A1C1 Ã1%DÄDc                ó,  — t          | d¦  «        }t          j                             t	          | ¦  «        t	          |¦  «        ¦  «         t          j        |                     ¦   «         ¦  «        }t          |¦  «         |                     ¦   «          |S )Nz	-inferred)	r©  rŸ   Úshape_inferenceÚinfer_shapes_pathr8  r  r  r5  Úunlink)r  Úinferred_model_pathr  s      r#   Úload_model_with_shape_inferra  Ö  s{   € Ý6°zÀ;ÑOÔOÐÝÔ×*Ò*­3¨z©?¬?½CÐ@SÑ<TÔ<TÑUÔUÐUÝŒIÐ)×2Ò2Ñ4Ô4Ñ5Ô5€EÝ�uÑÔÐØ×ÒÑ Ô Ð Ø€Lr%   c                ó<  — t          j        d¬¦  «        5 }t          j        | ¦  «        }t	          |¦  «                             d¦  «        }t          j        ||                     ¦   «         d¬¦  «         t          |¦  «        cd d d ¦  «         S # 1 swxY w Y   d S )Nz
ort.quant.)Úprefixz
model.onnxT)Úsave_as_external_data)
ÚtempfileÚTemporaryDirectoryr5  Údeepcopyr   r¦  rŸ   Ú
save_modelr  ra  )r  Úquant_tmp_dirÚ
model_copyr  s       r#   rP  rP  ß  sÐ   € Ý	Ô	$¨LÐ	9Ñ	9Ô	9ð 7¸]Ý”] 5Ñ)Ô)ˆ
Ý˜-Ñ(Ô(×1Ò1°,Ñ?Ô?ˆ
ÝŒ˜
 J×$7Ò$7Ñ$9Ô$9ÐQUÐVÑVÔVÐVÝ*¨:Ñ6Ô6ð	7ð 7ð 7ð 7ñ 7ô 7ð 7ð 7ð 7ð 7ð 7ð 7øøøð 7ð 7ð 7ð 7ð 7ð 7s   –A.BÂBÂBrk  r
   c                óæ   — | j         t          j        j        t          j        j        fv rt
          j                             | ¦  «        S t          d| j	        › dt          | j                  › �¦  «        ‚)Nz&Only float type is supported. Weights z is )r1  r˜   r
   r�   rž   rŸ   r;  Úto_arrayr3   r,   Útype_to_name)rk  s    r#   r*  r*  ç  si   € ØÔ¥Ô!7Ô!=½zÔ?UÔ?]Ð ^Ð^Ð^ÝÔ ×)Ò)¨+Ñ6Ô6Ð6å
Øl°Ô1AÐlÐlÅ|ÐT_ÔTiÔGjÐlÐlñô ð r%   Útensor_namec                ó   — | dz   S )NÚ_QuantizeLinearr   ©rn  s    r#   Úadd_quant_suffixrr  ð  s   € ØÐ*Ñ*Ð*r%   c                ó   — | t           z   S r*   )ÚQUANT_INPUT_SUFFIXrq  s    r#   Úadd_quant_input_suffixru  ô  s   € ØÕ+Ñ+Ð+r%   c                ó   — | dz   S )NÚ_QuantizeLinear_Outputr   rq  s    r#   Úadd_quant_output_suffixrx  ø  s   € ØÐ1Ñ1Ð1r%   c                ó   — | dz   S )NÚ_DequantizeLinearr   rq  s    r#   Úadd_dequant_suffixr{  ü  s   € ØÐ,Ñ,Ð,r%   c                ó   — | dz   S )NÚ_DequantizeLinear_Inputr   rq  s    r#   Úadd_dequant_input_suffixr~     s   € ØÐ2Ñ2Ð2r%   c                ó   — | t           z   S r*   )ÚDEQUANT_OUTPUT_SUFFIXrq  s    r#   Úadd_dequant_output_suffixr�    s   € ØÕ.Ñ.Ð.r%   )NN)FN)r   rm   N)r±   r    r²   r    rÄ   rÉ   )rë   rì   rí   r    rî   r    rï   r    r•   rð   rñ   rò   )FNNN)r  rì   rí   r  r•   rð   r”   rð   rÄ   rÉ   r  rÉ   r  rÉ   rñ   rò   )rñ   r  )NNr   )rë   r   rí   r  r�   rì   r�   rì   rî   r!  r"  r#  rï   r    rñ   r   )FF)rî   r    rZ  r    rñ   r[  )r`  r9  rñ   ra  )r¢  r   r£  r8  rñ   r   )rO   )r  )r  r   )r  r   r  r   )r  r	   )r  r	   rñ   rð   )r  r	   rñ   r    )r  r	   rA  rE   rB  rC  rD  rE  rï   r    rñ   r	   )r  r   rñ   r	   )r  r	   rñ   r	   )rk  r
   rñ   rì   )rn  r8  rñ   r8  )rñ   r8  )rÚ
__future__r   r5  rÒ  rÖ  re  Úenumr   Úpathlibr   rx   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_NAMErt  ÚDEQUANT_OP_NAMEr€  r0  ÚMODEL_SIZE_THRESHOLDrß   rY   r™   rš   r›   ÚFLOAT8_TYPESrò  rm  r'   r>   rE   ra   rQ   rl   rS   rW   rU   r]   r[   r—   r}   rh   rg   rj   ri   rü   rV  rT  rˆ   r¶   rÈ   r×   rê   r  r  r  rR  r£   rY  r_  r:  ri  rr  r€  r�  r—  rœ  r¡  r©  r¼  r  r  r  r&  r/  r2  r5  r7  r@  r[  ra  rP  r*  rr  ru  rx  r{  r~  r�  r   r%   r#   ú<module>r’     s
  ðð #Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à €€€Ø €€€Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ø &Ð &Ð &Ð &Ð &Ð &Ø QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QØ -Ð -Ð -Ð -Ð -Ð -à PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PðØ7Ð7Ð7Ð7Ð7Ð7Ð7øØð ð ð àÐÐÐðøøøð
 €Ø€Ø€Ø€	Ø €Ø,Ð Ø$€Ø2Ð Ø'Ð Ø!Ð àÐ àÔÔ'ØÔÔ)ØÔÔ%ØÔÔ)ð	€ð rÐq°C°C¸Ñ4DÔ4DÐqÑqÔq€ðð ð ð ð �tñ ô ð ðð ð ð ð ˜ñ ô ð ð#>ð #>ð #>ð #>ð #>�ñ #>ô #>ð #>ðLð ð ð ð �$ñ ô ð ð  ÔÔ  ¤¨VÑ!4Ô!4ØÔÔ  + %¤+¨gÑ"6Ô"6ØÔÔ  + %¤+¨gÑ"6Ô"6ØÔÔ! ; 5¤;¨xÑ#8Ô#8ØÔÔ'¨ØÔÔ ØÔÔ  %ðÐ ð ÔÔ  ; 5¤;¨q¸¼Ð#DÑ#DÔ#DÀkÀeÄkÐRUÐ]bÔ]hÐFiÑFiÔFiÐ"jØÔÔ + %¤+¨d¸%¼*Ð"EÑ"EÔ"EÀ{ÀuÄ{ÐSVÐ^cÔ^hÐGiÑGiÔGiÐ!jØÔÔ! K E¤K°¸¼Ð$FÑ$FÔ$FÈÈÌÐTYÐafÔamÐHnÑHnÔHnÐ#oØÔÔ  ; 5¤;¨v¸U¼[Ð#IÑ#IÔ#IÈ;È5Ì;ÐW\ÐdiÔdoÐKpÑKpÔKpÐ"qØÔÔ  ; 5¤;¨q¸Ð#>Ñ#>Ô#>ÀÀÄÈBÐV[Ð@\Ñ@\Ô@\Ð"]ØÔÔ + %¤+¨b¸Ð"=Ñ"=Ô"=¸{¸u¼{È1ÐTXÐ?YÑ?YÔ?YÐ!ZðÐ ð ÔÔ + %¤+¨d¸%¼*Ð"EÑ"EÔ"EÀ{ÀuÄ{ÐSVÐ^cÔ^hÐGiÑGiÔGiÐ!jØÔÔ  ; 5¤;¨v¸U¼[Ð#IÑ#IÔ#IÈ;È5Ì;ÐW\ÐdiÔdoÐKpÑKpÔKpÐ"qð!Ð ð ÔÔ  ; 5¤;¨q¸¼Ð#DÑ#DÔ#DÀkÀeÄkÐRUÐ]bÔ]hÐFiÑFiÔFiÐ"jØÔÔ + %¤+¨c¸¼Ð"DÑ"DÔ"DÀkÀeÄkÐRTÐ\aÔ\fÐFgÑFgÔFgÐ!hØÔÔ! K E¤K°¸¼Ð$FÑ$FÔ$FÈÈÌÐTYÐafÔamÐHnÑHnÔHnÐ#oØÔÔ  ; 5¤;¨v¸U¼[Ð#IÑ#IÔ#IÈ;È5Ì;ÐW\ÐdiÔdoÐKpÑKpÔKpÐ"qØÔÔ  ; 5¤;¨q¸Ð#>Ñ#>Ô#>ÀÀÄÈAÐUZÐ@[Ñ@[Ô@[Ð"\ØÔÔ + %¤+¨b¸Ð"=Ñ"=Ô"=¸{¸u¼{È1ÐTXÐ?YÑ?YÔ?YÐ!ZðÐ ð )+ð Að Að Að Að Að 13ð 13ð 13ð 13ðh<ð <ð <ð <ð~8ð 8ð 8ð 8ð 8ðv!ð !ð !ðH`ð `ð `ð `ðN Ø#'Ø"&Ø"&ð;Gð ;Gð ;Gð ;Gð ;Gð~ hlð:=ð :=ð :=ð :=ð :=ðD Ø$(Øðc ð c ð c ð c ð c ðLð ð ð ð@ð ð ð ð	ð 	ð 	ð 	ðð ð ð ð<ð ð ð ð ñ ô ð ð>%ð %ð %ð %ð %ñ %ô %ð %ð8'ð 'ð 'ð 'ð 'ñ 'ô 'ð 'ð"#ð "#ð "#ðJ0ð 0ð 0ðð ð ð@ð @ð @ðRð Rð Rð Rðð ð ð$Rð Rð Rð Rðjð ð ð ð2nð nð nð nð
kð kð kð kð 7ð 7ð 7ð 7ðð ð ð ð7ð 7ð 7ð 7ðð ð ð ðð ð ð ð )-Ø*.ØðWð Wð Wð Wð Wðtð ð ð ð7ð 7ð 7ð 7ðð ð ð ð+ð +ð +ð +ð,ð ,ð ,ð ,ð2ð 2ð 2ð 2ð-ð -ð -ð -ð3ð 3ð 3ð 3ð/ð /ð /ð /ð /ð /s   Á"A) Á)A3Á2A3