§
    ¹¯Å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! 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-d„  e.e¦  «        D ¦   «         Z/ G d„ de¦  «        Z0 G d„ de¦  «        Z1 G d„ de¦  «        Z2 G d„ de¦  «        Z3ej        j4         e
j5        d¦  «        ej        j6         e
j5        d ¦  «        ej        j7         e
j5        d!¦  «        ej        j8         e
j5        d"¦  «        ej        j9        eej        j:        eej        j;        eiZ<ej        j6         e
j=        d e
j>        ¬#¦  «         e
j=        d$e
j>        ¬#¦  «        fej        j4         e
j=        d%e
j?        ¬#¦  «         e
j=        d&e
j?        ¬#¦  «        fej        j8         e
j=        d e
j@        ¬#¦  «         e
j=        d'e
j@        ¬#¦  «        fej        j7         e
j=        d(e
jA        ¬#¦  «         e
j=        d)e
jA        ¬#¦  «        fej        j;         e
j=        d e¬#¦  «         e
j=        d*e¬#¦  «        fej        j:         e
j=        d+e¬#¦  «         e
j=        d,e¬#¦  «        fiZBej        j4         e
j=        d-e
j?        ¬#¦  «         e
j=        d&e
j?        ¬#¦  «        fej        j7         e
j=        d.e
jA        ¬#¦  «         e
j=        d)e
jA        ¬#¦  «        fiZCej        j6         e
j=        d e
j>        ¬#¦  «         e
j=        d&e
j>        ¬#¦  «        fej        j4         e
j=        d/e
j?        ¬#¦  «         e
j=        d0e
j?        ¬#¦  «        fej        j8         e
j=        d e
j@        ¬#¦  «         e
j=        d)e
j@        ¬#¦  «        fej        j7         e
j=        d1e
jA        ¬#¦  «         e
j=        d2e
jA        ¬#¦  «        fej        j;         e
j=        d e¬#¦  «         e
j=        d,e¬#¦  «        fej        j:         e
j=        d3e¬#¦  «         e
j=        d4e¬#¦  «        fiZDd5d6œd7„ZEdŒd8„ZFd�d:„ZGd;„ ZH	 	 	 	 dŽd�dI„ZI	 dŽd�dK„ZJ	 	 dŒd‘dT„ZKd’dU„ZLd’dV„ZMd“dZ„ZNd”d^„ZO G d_„ d`¦  «        ZP G da„ db¦  «        ZQ G dc„ dd¦  «        ZRde„ ZSdf„ ZTdg„ ZUdh„ ZVd•dm„ZWdn„ ZXd–dp„ZYd—dr„ZZd˜dt„Z[d™dv„Z\dšdy„Z]d›dz„Z^dšd{„Z_d›d|„Z`dœd}„Zad�d„Zbdžd€„ZcdŸd�„Zdd d„„Zed¡d†„Zfd¡d‡„Zgd¢dˆ„Zhd¢d‰„Zid¢dŠ„Zjd¢d‹„Zkd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     úUC:\Projects\Historical\venv\Lib\site-packages\onnxruntime/quantization/quant_utils.pyú
<dictcomp>r$   -   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__8   ó
   € ØŒyÐr%   c                óV   — 	 t           |          S # t          $ r t          ¦   «         ‚w xY wr*   )r'   ÚKeyErrorÚ
ValueError)Úmodes    r#   Úfrom_stringzQuantizationMode.from_string;   s7   € ð	Ý# DÔ)Ð)øÝð 	ð 	ð 	Ý‘,”,Ðð	øøøó   ‚ �(N)Ú__name__Ú
__module__Ú__qualname__Ú
IntegerOpsÚ
QLinearOpsr/   Ústaticmethodr5   r   r%   r#   r'   r'   4   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__G   r0   r%   c                óV   — 	 t           |          S # t          $ r t          ¦   «         ‚w xY wr*   )r>   r2   r3   )Úvs    r#   r5   zQuantizedValueType.from_stringJ   s7   € ð	Ý% aÔ(Ð(øÝð 	ð 	ð 	Ý‘,”,Ðð	øøør6   N)r7   r8   r9   ÚInputÚInitializerr/   r<   r5   r   r%   r#   r>   r>   C   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__[   r0   r%   c                óV   — 	 t           |          S # t          $ r t          ¦   «         ‚w xY wr*   )rE   r2   r3   )Úts    r#   r5   zQuantType.from_string^   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_typee   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   R   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   x   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ç      ð?g       @)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%   c                ó  — d}| t           vrz| t          j        k    rLddlm} |}d„ t          d¦  «        D ¦   «         }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   c                ó,   — g | ]}t          |¦  «        ‘ŒS r   )Úfloat)r!   r†   s     r#   ú
<listcomp>z+compute_scale_zp_float8.<locals>.<listcomp><  s   € Ð7Ð7Ð7 q�% ™(œ(Ð7Ð7Ð7r%   é   c                ób   — g | ],}t          j        |¦  «        °t          j        |¦  «        °*|‘Œ-S r   )rx   ÚisnanÚisinf)r!   Úfs     r#   rÊ   z+compute_scale_zp_float8.<locals>.<listcomp>>  s3   € ÐTÐTÐT�q­e¬k¸!©n¬nÐTÅUÄ[ÐQRÁ^Ä^ÐT�ÐTÐTÐTr%   rk   zQuantization to element_type=z not implemented.zUnexpected element_type rO   )ÚFLOAT8_DISTRIBUTIONSr
   rY   Ú	ml_dtypesr   Úrangerx   r}   r€   r3   r   Ústdrl   )	Úelement_typerÓ   Úzp_dtyper   Ú
all_valuesÚvaluesÚstd_f8Úzeror�   s	            r#   Úcompute_scale_zp_float8rÚ   ,  s>  € ð €HØÕ/Ð/Ð/Ø�;Ô3Ò3Ð3Ø/Ð/Ð/Ð/Ð/Ð/à$ˆHØ7Ð7­E°#©J¬JÐ7Ñ7Ô7ˆ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%   Údataúnumpy.ndarrayÚ
quant_typeúonnx.TensorProto.DataTyper”   Úboolr“   rÂ   úfloat | NoneÚrmin_overrideÚrmax_overrideÚreturnú#tuple[numpy.ndarray, numpy.ndarray]c                óø  — 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   Ng        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è   P  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µ   ÚanyÚviewrx   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ð   Ž  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%   Úweightúonnx.TensorProtor�   r�   Úaxisú
int | NoneÚquant_weight_nameú
str | Nonec                ó  — t          | ¦  «        }d}|€%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        ¦  «         ||_        |                     ¦   «                              ¦   «                              ¦   «         |_        t0          �»t1          |¦  «        }|j        |j        k    s*|                     ¦   «         |                     ¦   «         k    rrt3          d|j        › d|                     ¦   «         dd…         › d|                     ¦   «         dd…         › d| j        › dt5          |¦  «        dd	…         › d
�¦  «        ‚�n|t          j        j        t          j        j        fv r€|j        t<          t>          fvrt3          d|› d�¦  «        ‚tA          tC          |                     ¦   «         ¦  «        ¦  «        }t          j"         #                    ||| j        |d¬¦  «        }nmt          j"         $                    |¦  «        }t          j	        ||¬¦  «         
                    | j        ¦  «        }t          j%         &                    ||¦  «        }|S )aG  
    Returns a quantized version of the given ONNX initializer.

    :param weight: The ONNX initializer to quantize.
    :param quant_type: The final quantized data type.
    :param zero_point: The zero-point value to use for quantization.
    :param scale: The scale value to use for quantization.
    :param axis: The quantization axis if quantizing per-channel. Defaults to None.
    :param quant_weight_name: The name of the quantized initializer.
                              If not specified, the quantized name is generated.
    :return: The quantized ONNX initializer.
    Nr(   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)Úrawrk   )'Útensor_proto_to_arrayrµ   rí   ÚshapeÚlistrÒ   Útaker|   rx   r¥   ÚreshapeÚconcatenater,   ÚTENSOR_NAME_QUANT_SUFFIXrž   r
   rY   Ú	data_typeÚdimsÚextendÚflattenÚcopyÚtobytesÚraw_datar   rç   Ústrr]   r[   rl   r   r   ÚbytesÚpack_bytes_to_4bitrŸ   r    Útensor_dtype_to_np_dtypeÚnumpy_helperÚ
from_array)rñ   rÝ   r�   r�   ró   rõ   Úweight_dataÚq_weight_dataÚchannel_countÚchannel_dimsÚquantized_channel_data_listr†   Úchannel_dataÚchannel_scaleÚchannel_zero_pointÚquantized_channel_dataÚq_weight_nameÚq_weight_initializerÚcheckÚpacked_dataÚquant_np_dtypes                        r#   Úquantize_onnx_initializerr  Ë  sŒ  € õ( (¨Ñ/Ô/€KØ*.€Mà€|Ý(¨°[×5FÒ5FÑ5HÔ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_RANGEÚONNX_INT_TYPE_RANGEr3   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_qTyper%  :  s&   € õ )¨°È	ÐRÑRÔR�J€Dˆ$Ø�$‰;Ðr%   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ó   r&  Ú	axis_normÚis_valids       r#   Únormalize_axisr+  D  s7   € ð  $ ašx˜x��t‘�¨T€IØ˜AŠ~Ð2 )¨dÒ"2€HØ�YÐÐr%   Úsrc_8bitr
  Ú	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‚   r-  )r,  Ú	num_elemsÚdst_sizeÚdstÚsrc_iÚdst_is         r#   r  r  P  sÉ   € õ �H‘”€IØ�A‚~€~Ý‰{Œ{Ðà˜A‘ !Ñ#€HÝ
�HÑ
Ô
€Cà€EØ€Eð �)˜a‘-Ò
Ð
Ø ¨¡	Ô*¨SÑ0°QÑ6¸8À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ÚrmaxsÚzero_pointsÚscalesrÛ   rî   ró   )
r.   r,   r7  r8  r9  r:  r;  rÛ   rî   ró   s
             r#   Ú__init__zQuantizedInitializer.__init__s  sJ   € ð ˆŒ	Ø&ˆÔØˆŒ
ØˆŒ
à&ˆÔØˆŒØˆŒ	Ø,ˆÔàˆŒ	ˆ	ˆ	r%   ©r7   r8   r9   Ú__doc__r<  r   r%   r#   r5  r5  n  s=   € € € € € ðð ð ØØðð ð ð ð ð r%   r5  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_namerD  Úzero_point_nameÚquantized_value_typeró   rG  rH  rI  s
             r#   r<  zQuantizedValue.__init__’  sH   € ð "ˆÔØ(ˆŒØ$ˆŒØ&ˆŒØ.ˆŒØˆŒ	Ø"ˆŒØ$ˆŒØ$ˆŒˆˆr%   )NNNNr=  r   r%   r#   r@  r@  �  s@   € € € € € ðð ð ØØØð%ð %ð %ð %ð %ð %r%   r@  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.   rP  rQ  rR  s       r#   r<  zBiasToQuantize.__init__®  s   € Ø"ˆŒØ$ˆŒØ&ˆÔÐÐr%   Nr=  r   r%   r#   rN  rN  ©  s-   € € € € € ðð ð'ð 'ð 'ð 'ð 'r%   rN  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^  ´  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‚   )rb  Ú	item_listÚitemss   `  r#   Úfind_by_namere  Ù  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_indexrj  ä  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_nodero  ï  s"   € õ Œ;× Ò  ¨°°¸$Ñ?Ô?Ð?r%   Úfilenamer   Ú
identifierr	  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)rp  rq  s     r#   Úgenerate_identified_filenamerw  ú  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
ŠmŠmŠ t          j        d| › �¦  «          G ˆˆˆˆˆfd„d‰j        ¦  «        }‰                     | |¬¦  «        }t#          t$          j                             |d¦  «        d	¦  «        5 }|                     |¦  «         ddd¦  «         n# 1 swxY w Y   ‰                     d¦  «        }|                     d
¦  «        }	g }
t1          |                      ¦   «         ¦  «        D �]:}| |         }|                     ¦   «         }t7          |                     d|¦  «                             ¦   «         ¦  «        t7          |                     d|¦  «                             ¦   «         ¦  «        g}t=          t?          |¦  «        ¦  «        }|	                      |¦  «        }|	                      |¦  «        }| !                    |	¦  «         | "                    |	|¦  «         | #                    |	|¦  «         | $                    |	¦  «        }|
 %                    |¦  «         �Œ<| &                    |	tO          |
¦  «        ¦  «         |
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         0                    |d¦  «        }| 1                    ¦   «         }te          |¦  «        D ]c}| 3                    |¦  «        }t          j        | 4                    ¦   «         ¦  «         t          j        | 5                    ¦   «         ¦  «         Œdt#          t$          j                             |d¦  «        d	¦  «        5 }t1          |                      ¦   «         ¦  «        D ]Ô}| |         }|                     ¦   «         }t7          |                     d|¦  «                             ¦   «         ¦  «        t7          |                     d|¦  «                             ¦   «         ¦  «        g}|dz   t=          t?          |¦  «        ¦  «        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)ÚCalibrationMethodÚ
TensorDataÚTensorsDatazcalibration cache: c                  ó"   •— e Zd Zˆ ˆˆˆˆfd„ZdS )ú*write_calibration_table.<locals>.MyEncoderc                ó\  •— t          |‰‰f¦  «        r|                     ¦   «         S t          |‰j        ¦  «        r*|                     ¦   «         t	          |j        ¦  «        ddœS t          |‰¦  «        r|j        j        t	          |¦  «        dœS ‰j         	                    | |¦  «        S )Nznumpy.array)rÛ   rl   ÚCLS)r’  rŽ   )
r   Úto_dictr~   Útolistr	  rl   Ú	__class__r7   ÚJSONEncoderÚdefault)r.   ÚobjrŒ  r�  rŽ  ÚjsonÚnps     €€€€€r#   r—  z2write_calibration_table.<locals>.MyEncoder.default$  s£   ø€ Ý˜# 
¨KÐ8Ñ9Ô9ð %Ø—{’{‘}”}Ð$Ý˜#˜rœzÑ*Ô*ð ]Ø #§
¢
¡¤µs¸3¼9±~´~ÈmÐ\Ð\Ð\Ý˜#Ð0Ñ1Ô1ð JØ"œ}Ô5ÅÀCÁÄÐIÐIÐIØÔ#×+Ò+¨D°#Ñ6Ô6Ð6r%   N)r7   r8   r9   r—  )rŒ  r�  rŽ  r™  rš  s   €€€€€r#   Ú	MyEncoderr�  #  sB   ø€ € € € € ð	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7r%   r›  )Úclszcalibration.jsonÚwi   ÚhighestÚlowestzcalibration.flatbuffersÚwbÚQUANTIZATION_DEBUGÚ0)r(   Ú1zcalibration.cacheú ú
)6r™  Úflatbuffersrx   Ú5onnxruntime.quantization.CalTableFlatBuffers.KeyValueÚquantizationÚCalTableFlatBuffersÚKeyValueÚ5onnxruntime.quantization.CalTableFlatBuffers.TrtTableÚTrtTableÚ"onnxruntime.quantization.calibraterŒ  r�  rŽ  ÚloggingÚinfor–  ÚdumpsÚopenÚosÚpathÚjoinÚwriter}   ÚBuilderÚsortedÚkeysr“  rÉ   r   ra  r	  r£   ÚCreateStringÚKeyValueStartÚKeyValueAddKeyÚKeyValueAddValueÚKeyValueEndr|   ÚTrtTableStartDictVectorr‚   ÚPrependUOffsetTRelativeÚ	EndVectorÚTrtTableStartÚTrtTableAddDictÚTrtTableEndÚFinishÚOutputÚenvironÚGetRootAsTrtTableÚ
DictLengthrÒ   ÚDictÚKeyÚValue)Úcalibration_cacheÚdirr¦  rª  r¬  r›  Ú	json_dataÚfilerÙ   ÚbuilderÚkey_value_listÚkeyr×   Úd_valuesrX  rŽ   Úflat_keyÚ
flat_valueÚ	key_valueÚ	main_dictÚ	cal_tableÚbufÚdict_lenr†   rŒ  r�  rŽ  r™  rš  s                           @@@@@r#   Úwrite_calibration_tablerÛ    s!  øøøøø€ ð
 €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Ø]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]å„LÐ:Ð'8Ð:Ð:Ñ;Ô;Ð;ð7ð 7ð 7ð 7ð 7ð 7ð 7ð 7ð 7ð 7ð 7�DÔ$ñ 7ô 7ð 7ð —
’
Ð,°)�
Ñ<Ô<€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   Â)CÃCÃCÍM)Í)M-Í0M-Ñ&C7U+Õ+U/Õ2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ç  o  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ë   Úgraphr7  )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   �  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	  �  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_metadatar  ¦  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_metadatar  ¯  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 )Nr  r  TFr  )rò  rà  s     r#   Úmodel_has_infer_metadatar  ·  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>À  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  ¿  sM   € ØmÐm¨Ô);ÐmÑmÔm€NÝ
ˆ>ÑÔ˜aÒÐÝÐ?Ñ@Ô@Ð@Ø" 1Ô%Ô-€MàÐr%   Úweight_typec                óž  — t          | ¦  «        }|}t          |d|¦  «        }|dk     r0|t          j        j        k    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^   é   z$The original model opset version is z¨, which does not support quantization to float 8. Please update the model to opset >= 19. Automatically update the model to opset 19. Please verify the quantized model.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
   rY   r®  ÚwarningÚversion_converterÚconvert_versionÚ&save_and_reload_model_with_shape_infer)rò  r  r  Útarget_opset_versionÚweight_quant_types        r#   Úupdate_opset_versionr%  È  s-  € Ý% eÑ,Ô,€MØ(ÐÝ ¨]¸KÑHÔHÐà�rÒÐÐ/µ4Ô3CÔ3PÒPÐPÝŒð1°=ð 1ð 1ð 1ñ	
ô 	
ð 	
ð
  "ÐÐà	˜"Ò	Ð	ÝŒðM°=ð Mð Mð Mñ	
ô 	
ð 	
ð 	
ð
 
˜Ò	Ð	ÝŒð1°=ð 1ð 1ð 1ñ	
ô 	
ð 	
ð
  "Ðà˜}Ò,Ð,ÝÔ&×6Ò6°uÐ>RÑSÔSˆõ 7°uÑ=Ô=ˆà€Lr%   c                ó,  — t          | d¦  «        }t          j                             t	          | ¦  «        t	          |¦  «        ¦  «         t          j        |                     ¦   «         ¦  «        }t          |¦  «         |                     ¦   «          |S )Nz	-inferred)	rw  rž   Úshape_inferenceÚinfer_shapes_pathr	  rï  rð  r  Úunlink)rè  Úinferred_model_pathrò  s      r#   Úload_model_with_shape_inferr+  ì  s{   € Ý6°zÀ;ÑOÔ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ÚTemporaryDirectoryr  Údeepcopyr   rt  rž   Ú
save_modelrð  r+  )rò  Úquant_tmp_dirÚ
model_copyrè  s       r#   r"  r"  õ  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r7  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 )r  r—   r
   rœ   r�   rž   r  Úto_arrayr3   r,   Útype_to_name)r7  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   ©r8  s    r#   Úadd_quant_suffixr<    s   € ØÐ*Ñ*Ð*r%   c                ó   — | t           z   S r*   )ÚQUANT_INPUT_SUFFIXr;  s    r#   Úadd_quant_input_suffixr?  
  s   € ØÕ+Ñ+Ð+r%   c                ó   — | dz   S )NÚ_QuantizeLinear_Outputr   r;  s    r#   Úadd_quant_output_suffixrB    s   € ØÐ1Ñ1Ð1r%   c                ó   — | dz   S )NÚ_DequantizeLinearr   r;  s    r#   Úadd_dequant_suffixrE    s   € ØÐ,Ñ,Ð,r%   c                ó   — | dz   S )NÚ_DequantizeLinear_Inputr   r;  s    r#   Úadd_dequant_input_suffixrH    s   € ØÐ2Ñ2Ð2r%   c                ó   — | t           z   S r*   )ÚDEQUANT_OUTPUT_SUFFIXr;  s    r#   Úadd_dequant_output_suffixrK    s   € ØÕ.Ñ.Ð.r%   )NN)FN)FNNN)rÛ   rÜ   rÝ   rÞ   r”   rß   r“   rß   rÂ   rà   rá   rà   râ   rà   rã   rä   )rã   ré   )rñ   rò   rÝ   rÞ   r�   rÜ   r�   rÜ   ró   rô   rõ   rö   rã   rò   )FF)ró   r    r&  r    rã   r'  )r,  r
  rã   r-  )rp  r   rq  r	  rã   r   )rO   )rÜ  )rè  r   )rè  r   rô  r   )rò  r	   )rò  r	   rã   rß   )rò  r	   rã   r    )rò  r	   r  rE   rã   r	   )rè  r   rã   r	   )rò  r	   rã   r	   )r7  r
   rã   rÜ   )r8  r	  rã   r	  )rã   r	  )lÚ
__future__r   r  r®  r²  r/  Ú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_NAMEr>  ÚDEQUANT_OP_NAMErJ  r  ÚMODEL_SIZE_THRESHOLDrÐ   rÍ  r7  r'   r>   rE   ra   rQ   rl   rS   rW   rU   rY   r]   r[   r–   r}   rh   rg   rj   ri   r"  r!  r  rˆ   rµ   rÆ   rÚ   rè   rð   r  r¢   r%  r+  r  r5  r@  rN  r^  re  rj  ro  rw  rŠ  rÛ  rç  ró  r   r	  r  r  r  r  r%  r+  r"  rû   r<  r?  rB  rE  rH  rK  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Ð Ø'Ð Ø!Ð àÐ àqÐ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<ð <ð <ð <ð~!ð !ð !ðP Ø#'Ø"&Ø"&ð;Gð ;Gð ;Gð ;Gð ;Gð~ hlð:=ð :=ð :=ð :=ð :=ðD Ø$(ðL ð L ð L ð L ð L ð^ð ð ð ð@ð ð ð ð	ð 	ð 	ð 	ðð ð ð ð<ð ð ð ð ñ ô ð ð>%ð %ð %ð %ð %ñ %ô %ð %ð8'ð 'ð 'ð 'ð 'ñ 'ô 'ð 'ð"#ð "#ð "#ðJ0ð 0ð 0ðð ð ð@ð @ð @ðRð Rð Rð Rðð ð ð$Yð Yð Yð Yðxð ð ð ð2nð nð nð nð
kð kð kð kð 7ð 7ð 7ð 7ðð ð ð ð7ð 7ð 7ð 7ðð ð ð ðð ð ð ð!ð !ð !ð !ðHð ð ð ð7ð 7ð 7ð 7ðð ð ð ð+ð +ð +ð +ð,ð ,ð ,ð ,ð2ð 2ð 2ð 2ð-ð -ð -ð -ð3ð 3ð 3ð 3ð/ð /ð /ð /ð /ð /s   Á"A) Á)A3Á2A3