ó
    ˆŽ¡j,u  ã                   óà  • S SK r S SKrS SKrS SKJr  S SKJr  SSKJr  \R                  " \
5      r " S S\R                  5      r " S S	\R                  5      r " S
 S\R                  5      r " S S\R                  5      r " S S\R                  5      r " S S\R                  5      rSS jrSS jrSS jr " S S\5      r " S S\5      r " S S\5      rSS jr " S S\5      rg) é    N)Únn)ÚFunctioné   )Úloggingc                   óL   ^ • \ rS rSrSr         SU 4S jjrSS jrSrU =r$ )ÚQuantEmbeddingé   aº  
Quantized version of `torch.nn.Embedding`. Adds quantization-specific arguments on top of `torch.nn.Embedding`.

Args:
    weight_bit (`int`, *optional*, defaults to `8`):
        Bitwidth for the quantized weight.
    momentum (`float`, *optional*, defaults to `0.95`):
        Momentum for updating the activation quantization range.
    quant_mode (`bool`, *optional*, defaults to `False`):
        Whether or not the layer is quantized.
c                 ó  >• [         TU ]  5         Xl        X l        X0l        X@l        XPl        X`l        Xpl        [        R                  " [        R                  " X/5      5      U l        [        R                  " [        R                  " S5      5      U l        [        R                  " [        R                   " U R                  5      5      U l        X�l        X l        X°l        SU l        [,        R.                  U l        g ©Né   F)ÚsuperÚ__init__Únum_ÚdimÚpadding_idxÚmax_normÚ	norm_typeÚscale_grad_by_freqÚsparser   Ú	ParameterÚtorchÚzerosÚweightÚBufferÚweight_scaling_factorÚ
zeros_likeÚweight_integerÚ
weight_bitÚmomentumÚ
quant_modeÚpercentile_modeÚSymmetricQuantFunctionÚapplyÚweight_function)ÚselfÚnum_embeddingsÚembedding_dimr   r   r   r   r   Ú_weightr   r   r    Ú	__class__s               €ÚµC:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\transformers/models/ibert/quant_modules.pyr   ÚQuantEmbedding.__init__+   s¯   ø€ ô 	‰ÑÔØ"Œ	Ø ŒØ&ÔØ ŒØ"ŒØ"4ÔØŒä—l’l¤5§;¢;°Ð/NÓ#OÓPˆŒÜ%'§Y¢Y¬u¯{ª{¸1«~Ó%>ˆÔ"Ü Ÿiši¬×(8Ò(8¸¿¹Ó(EÓFˆÔà$ŒØ ŒØ$ŒØ$ˆÔÜ5×;Ñ;ˆÕó    c           	      ób  • U R                   (       dc  [        R                  R                  UU R                  U R
                  U R                  U R                  U R                  U R                  5      S 4$ U R                  nUR                  R                  5       nUR                  5       R                  S5      nUR                  5       R                  S5      n[        U R                   XgS5      U l        U R%                  U R                  U R                   U R&                  U R"                  5      U l        [        R                  R                  UU R(                  U R
                  U R                  U R                  U R                  U R                  5      nX€R"                  -  U R"                  4$ r   )r    r   Ú
functionalÚ	embeddingr   r   r   r   r   r   ÚdataÚdetachÚminÚexpandÚmaxÚ$symmetric_linear_quantization_paramsr   r   r$   r!   r   )	r%   ÚxÚ	positionsÚincremental_stateÚwÚw_transformÚw_minÚw_maxÚemb_ints	            r*   ÚforwardÚQuantEmbedding.forwardL   sO  € Ø��ä—‘×'Ñ'ØØ—K‘KØ×$Ñ$Ø—M‘MØ—N‘NØ×+Ñ+Ø—K‘Kóð ðð ð �K‰KˆØ—f‘f—m‘m“oˆØ—‘Ó!×(Ñ(¨Ó+ˆØ—‘Ó!×(Ñ(¨Ó+ˆä%IÈ$Ï/É/Ð[`ÐinÓ%oˆÔ"Ø"×2Ñ2Ø�K‰K˜Ÿ™¨$×*>Ñ*>À×@ZÑ@Zó
ˆÔô —-‘-×)Ñ)ØØ×ÑØ×ÑØ�M‰MØ�N‰NØ×#Ñ#Ø�K‰Kó
ˆð ×3Ñ3Ñ3°T×5OÑ5OÐOÐOr,   )r   r   r   r   r   r   r!   r    r   r   r   r   r$   r   r   )	NNç       @FFNé   çffffffî?F©NN)	Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r>   Ú__static_attributes__Ú__classcell__©r)   s   @r*   r   r      s7   ø† ñ
ð  ØØØ ØØØØØ÷<÷B"Pò "Pr,   r   c                   óJ   ^ • \ rS rSrSrSU 4S jjrS r     SS jrSrU =r	$ )	ÚQuantActéq   a<  
Quantizes the given activation.

Args:
    activation_bit (`int`):
        Bitwidth for the quantized activation.
    act_range_momentum (`float`, *optional*, defaults to `0.95`):
        Momentum for updating the activation quantization range.
    per_channel (`bool`, *optional*, defaults to `False`):
        Whether to or not use channel-wise quantization.
    channel_len (`int`, *optional*):
        Specify the channel length when set the *per_channel* True.
    quant_mode (`bool`, *optional*, defaults to `False`):
        Whether or not the layer is quantized.
c                 ó0  >• [         TU ]  5         Xl        X l        XPl        X0l        SU l        [        R                  U l	        U R
                  (       d¸  [        R                  " [        R                  " S5      5      U l        [        R                  " [        R                  " S5      5      U l        [        R                  " [        R                  " S5      5      U l        U =R                  S-  sl        U =R                  S-  sl        g [#        S5      e)NFr   gñhãˆµøä>ú;per-channel mode is not currently supported for activation.)r   r   Úactivation_bitÚact_range_momentumr    Úper_channelÚ
percentiler"   r#   Úact_functionr   r   r   r   Úx_minÚx_maxÚact_scaling_factorÚNotImplementedError)r%   rQ   rR   rS   Úchannel_lenr    r)   s         €r*   r   ÚQuantAct.__init__‚   s´   ø€ Ü‰ÑÔà,ÔØ"4ÔØ$ŒØ&ÔØˆŒÜ2×8Ñ8ˆÔà××ÜŸš¤5§;¢;¨q£>Ó2ˆDŒJÜŸš¤5§;¢;¨q£>Ó2ˆDŒJÜ&(§i¢i´·²¸A³Ó&?ˆDÔ#Ø�JŠJ˜$Ñ�JØ�JŠJ˜$ÑŽJä%Ð&cÓdÐdr,   c           
      óØ   • U R                   R                   SU R                   SU R                   SU R                  R                  5       S SU R                  R                  5       S S3
$ )Nz(activation_bit=z, quant_mode: z, Act_min: z.2fz, Act_max: Ú))r)   rD   rQ   r    rV   ÚitemrW   )r%   s    r*   Ú__repr__ÚQuantAct.__repr__•   si   € à�~‰~×&Ñ&Ð'Ð'7¸×8KÑ8KÐ7Lð MØŸ?™?Ð+¨;°t·z±z·±Ó7HÈÐ6Mð NØŸ
™
Ÿ™Ó)¨#Ð.¨að1ð	
r,   c                 ó°  • Uc  UOX1-   nU R                   (       GaÓ  U R                  (       a   S5       eU R                  (       a   S5       eUR                  R	                  5       nUR                  R                  5       n	U	R                  5       R                  5       S:X  a"  UR                  5       R                  5       S:X  d   S5       eU R                  R	                  5       S:”  aG  U R                  R                  5       S:  a)  U R                  U-   U l        U R                  U	-   U l	        O¿U R                  S:X  aM  [        R                  " U R                  U5      U l        [        R
                  " U R                  U	5      U l	        ObU R                  U R                  -  USU R                  -
  -  -   U l        U R                  U R                  -  U	SU R                  -
  -  -   U l	        U R                  (       d  US 4$ Uc  U R                  OUnUc  U R                  OUn	[        U R                  X‰U R                  S	9U l        Uc2  U R!                  XR                  U R                  U R                  5      n
O.["        R%                  UUU R                  U R                  UU5      n
U R                  R'                  S5      nX«-  U R                  4$ )
Nz:percentile mode is not currently supported for activation.rP   r   z5NaN detected when computing min/max of the activationg¢&ú|”ç¾g¢&ú|”ç>éÿÿÿÿr   )rS   )ÚtrainingrT   rS   r0   r2   r4   ÚisnanÚsumrV   rW   rR   r   r    r5   rQ   rX   rU   ÚFixedPointMulr#   Úview)r%   r6   Úpre_act_scaling_factorÚidentityÚidentity_scaling_factorÚspecified_minÚspecified_maxÚx_actrV   rW   Úquant_act_intÚcorrect_output_scales               r*   r>   ÚQuantAct.forwardœ   sT  € ð Ñ%‘¨8©<ˆà�=�=ˆ=Ø——ÐdÐ(dÓdÐ&Ø×'×'ÐfÐ)fÓfÐ'Ø—J‘J—N‘NÓ$ˆEØ—J‘J—N‘NÓ$ˆEà—;‘;“=×$Ñ$Ó&¨!Ó+°·±³×0AÑ0AÓ0CÀqÓ0Hð ØGóÐHð
 �z‰z�~‰~Ó 'Ó)¨d¯j©j¯n©nÓ.>ÀÓ.GØ!ŸZ™Z¨%Ñ/�”
Ø!ŸZ™Z¨%Ñ/�•
ð ×(Ñ(¨BÓ.Ü"ŸYšY t§z¡z°5Ó9�”
Ü"ŸYšY t§z¡z°5Ó9�•
à!ŸZ™Z¨$×*AÑ*AÑAÀEÈQÐQU×QhÑQhÑMhÑDiÑi�”
Ø!ŸZ™Z¨$×*AÑ*AÑAÀEÈQÐQU×QhÑQhÑMhÑDiÑi�”
à��Ø˜$�;Ðà+Ñ3�—
’
¸ˆØ+Ñ3�—
’
¸ˆä"FØ×Ñ ¸4×;KÑ;Kñ#
ˆÔð "Ñ)à ×-Ñ-¨a×1DÑ1DÀdÇoÁoÐW[×WnÑWnÓo‰Mä)×/Ñ/ØØ&Ø×#Ñ#Ø×'Ñ'ØØ'óˆMð  $×6Ñ6×;Ñ;¸BÓ?ÐàÑ3°T×5LÑ5LÐLÐLr,   )	rU   rR   rX   rQ   rS   rT   r    rW   rV   )rB   FNF)NNNNN©
rD   rE   rF   rG   rH   r   r_   r>   rI   rJ   rK   s   @r*   rM   rM   q   s0   ø† ñ÷ eò&
ð  $ØØ $ØØ÷<Mò <Mr,   rM   c                   óH   ^ • \ rS rSrSr SU 4S jjrU 4S jrSS jrSrU =r	$ )	ÚQuantLinearéÛ   a  
Quantized version of `torch.nn.Linear`. Adds quantization-specific arguments on top of `torch.nn.Linear`.

Args:
    weight_bit (`int`, *optional*, defaults to `8`):
        Bitwidth for the quantized weight.
    bias_bit (`int`, *optional*, defaults to `32`):
        Bitwidth for the quantized bias.
    per_channel (`bool`, *optional*, defaults to `False`):
        Whether or not to use channel-wise quantization.
    quant_mode (`bool`, *optional*, defaults to `False`):
        Whether or not the layer is quantized.
c                 óÐ  >• [         TU ]  5         Xl        X l        [        R
                  " [        R                  " X!/5      5      U l        [        R                  " [        R                  " U R                  5      5      U l        [        R                  " [        R                  " U R                  5      5      U l        U(       ah  [        R
                  " [        R                  " U5      5      U l        [        R                  " [        R                  " U R                  5      5      U l        X@l        Xpl        X`l        XPl        Xpl        SU l        [(        R*                  U l        g )NF)r   r   Úin_featuresÚout_featuresr   r   r   r   r   r   r   r   Úfc_scaling_factorÚbiasÚbias_integerr   r    rS   Úbias_bitr!   r"   r#   r$   )	r%   rv   rw   ry   r   r{   rS   r    r)   s	           €r*   r   ÚQuantLinear.__init__ê   sä   ø€ ô 	‰ÑÔØ&ÔØ(Ôä—l’l¤5§;¢;°Ð/JÓ#KÓLˆŒÜ Ÿiši¬×(8Ò(8¸¿¹Ó(EÓFˆÔÜ!#§¢¬5¯;ª;°t×7HÑ7HÓ+IÓ!JˆÔÞÜŸš¤U§[¢[°Ó%>Ó?ˆDŒIÜ "§	¢	¬%×*:Ò*:¸4¿9¹9Ó*EÓ FˆDÔà$ŒØ$ŒØ&ÔØ ŒØ$ŒØ$ˆÔÜ5×;Ñ;ˆÕr,   c                 ód   >• [         TU ]  5       nSU SU R                   SU R                   S3nU$ )NÚ(z weight_bit=z, quant_mode=r]   )r   r_   r   r    )r%   Úsr)   s     €r*   r_   ÚQuantLinear.__repr__   s9   ø€ Ü‰GÑÓˆØ�ˆs�,˜tŸ™Ð/¨}¸T¿_¹_Ð<MÈQÐOˆØˆr,   c                 ó  • U R                   (       d4  [        R                  R                  XR                  U R
                  S9S 4$ Ub  UR                  S:X  d   S5       eU R                  nUR                  R                  5       nU R                  (       a1  [        R                  " USS S9u  pV[        R                  " USS S9u  pvO>UR                  5       R                  S5      nUR                  5       R                  S5      n[        U R                  XWU R                  5      U l        U R#                  U R                  U R                  U R$                  U R                   5      U l        U R                   U-  nU R
                  b-  U R#                  U R
                  U R(                  SU5      U l        UR-                  SS5      nX-  n	[        R                  R                  X�R&                  U R*                  S9U-  U4$ )N)r   ry   )r   z«Input activation to the QuantLinear layer should be globally (non-channel-wise) quantized. Please add a QuantAct layer with `per_channel = True` before this QuantAct layerr   )r   ÚoutFrb   )r    r   r.   Úlinearr   ry   Úshaper0   r1   rS   r   r2   r4   r3   r5   r   rx   r$   r!   r   r{   rz   rg   )
r%   r6   Úprev_act_scaling_factorr9   r:   r;   Ú_r<   Úbias_scaling_factorÚx_ints
             r*   r>   ÚQuantLinear.forward  s¶  € Ø��Ü—=‘=×'Ñ'¨·+±+ÀDÇIÁIÐ'ÐNÐPTÐTÐTð 'Ñ2Ð7N×7TÑ7TÐX\Ó7\ð 	
ð_ó	
Ð\ð
 �K‰KˆØ—f‘f—m‘m“oˆØ××Ü—y’y °!¸Ñ>‰HˆEÜ—y’y °!¸Ñ>‰HˆE�1à—O‘OÓ%×,Ñ,¨QÓ/ˆEØ—O‘OÓ%×,Ñ,¨QÓ/ˆEä!EÀdÇoÁoÐW\Ðei×euÑeuÓ!vˆÔØ"×2Ñ2Ø�K‰K˜Ÿ™¨$×*>Ñ*>À×@VÑ@Vó
ˆÔð #×4Ñ4Ð7NÑNÐà�9‰9Ñ Ø $× 4Ñ 4°T·Y±YÀÇÁÈuÐViÓ jˆDÔà"9×">Ñ">¸qÀ"Ó"EÐØÑ+ˆô �M‰M× Ñ  ×/BÑ/BÈ×IZÑIZÐ Ð[Ð^qÑqØð
ð 	
r,   )ry   r{   rz   rx   rv   rw   rS   r!   r    r   r   r$   r   )TrA   é    FF©Nrq   rK   s   @r*   rs   rs   Û   s#   ø† ñð ns÷<õ,÷
#
ò #
r,   rs   c                   ó@   ^ • \ rS rSrSrSU 4S jjrS rSS jrSrU =r	$ )	ÚIntGELUi+  aa  
Quantized version of `torch.nn.GELU`. Adds quantization-specific arguments on top of `torch.nn.GELU`.

Args:
    quant_mode (`bool`, *optional*, defaults to `False`):
        Whether or not the layer is quantized.
    force_dequant (`str`, *optional*, defaults to `"none"`):
        Force dequantize the layer if either "gelu" or "nonlinear" is given.
c                 ó>  >• [         TU ]  5         Xl        US;   a  [        R	                  S5        SU l        U R                  (       d  [
        R                  " 5       U l        SU l        SU l	        / SQU l
        U R                  S==   U R                  S   -  ss'   g )	N)Ú	nonlinearÚgeluzForce dequantize geluFgà-� ö?é   )g]mÅþ²{Ò¿gçû©ñÒMü¿r   é   r   )r   r   r    ÚloggerÚinfor   ÚGELUÚactivation_fnÚkÚconstÚcoeff)r%   r    Úforce_dequantr)   s      €r*   r   ÚIntGELU.__init__6  st   ø€ Ü‰ÑÔØ$ŒàÐ1Ó1Ü�K‰KÐ/Ô0Ø#ˆDŒOà��Ü!#§¢£ˆDÔàˆŒØˆŒ
Ú)ˆŒ
Ø�
‰
�1‹˜Ÿ™ A™Ñ&Œr,   c                 óÜ  • [         R                  " U R                  S   U-  5      n[         R                  " U R                  S   US-  -  5      n[         R                  " U5      n[         R                  " [         R
                  " U5      U* 5      nXVU-   S-  U-   -  nUS-  U R                  S   -  n[        R                  USU R                  -  -  5      nUSU R                  -  -  nXr4$ ©Nr   r’   r   )	r   Úfloorr™   Úsignr2   ÚabsÚ	floor_ster#   r˜   )r%   rˆ   Úscaling_factorÚb_intÚc_intrŸ   Úabs_intÚy_ints           r*   Úint_erfÚIntGELU.int_erfF  sË   € Ü—’˜DŸJ™J q™M¨NÑ:Ó;ˆÜ—’˜DŸJ™J q™M¨N¸AÑ,=Ñ=Ó>ˆÜ�zŠz˜%Ó ˆä—)’)œEŸIšI eÓ,¨u¨fÓ5ˆØ 5™¨QÑ.°Ñ6Ñ7ˆØ'¨Ñ*¨T¯Z©Z¸©]Ñ:ˆô —‘ ¨¨4¯:©:©Ñ 5Ó6ˆØ'¨!¨T¯Z©Z©-Ñ7ˆàÐ$Ð$r,   c                 óÄ   • U R                   (       d  U R                  U5      S 4$ X-  nU R                  X2U R                  -  5      u  pESU-  nX4U-   -  nX%-  S-  nX2-  U4$ )Nç      ð?r’   )r    r–   r§   r—   )r%   r6   r¢   rˆ   Úsigmoid_intÚsigmoid_scaling_factorÚ	shift_ints          r*   r>   ÚIntGELU.forwardU  sw   € Ø��Ø×%Ñ% aÓ(¨$Ð.Ð.àÑ"ˆØ.2¯l©l¸5ÐSW×SYÑSYÑBYÓ.ZÑ+ˆàÐ1Ñ1ˆ	à yÑ0Ñ1ˆØ'Ñ@À1ÑDˆàÑ% ~Ð5Ð5r,   )r–   r™   r˜   r—   r    )TÚnoner‹   )
rD   rE   rF   rG   rH   r   r§   r>   rI   rJ   rK   s   @r*   r�   r�   +  s   ø† ñ÷'ò %÷6ò 6r,   r�   c                   óB   ^ • \ rS rSrSrSU 4S jjrS rS rS rSr	U =r
$ )	Ú
IntSoftmaxid  a´  
Quantized version of `torch.nn.Softmax`. Adds quantization-specific arguments on top of `torch.nn.Softmax`.

Args:
    output_bit (`int`):
        Bitwidth for the layer output activation.
    quant_mode (`bool`, *optional*, defaults to `False`):
        Whether or not the layer is quantized.
    force_dequant (`str`, *optional*, defaults to `"none"`):
        Force dequantize the layer if either "softmax" or "nonlinear" is given.
c                 ó|  >• [         TU ]  5         Xl        SU l        X l        US;   a  [
        R                  S5        SU l        [        SU R                  S9U l        SU l	        SU l
        / S	QU l        U R                  S
==   U R                  S   -  ss'   U R                  S==   U R                  S   -  ss'   g )NrŠ   )r�   ÚsoftmaxzForce dequantize softmaxFé   ©r    gvqà-æ¿r	   )gN„ª$ôëÖ?g¾Ã'|:ï?rª   r   r   r’   )r   r   Ú
output_bitÚmax_bitr    r“   r”   rM   ÚactÚx0r˜   Úcoef)r%   r¶   r    rš   r)   s       €r*   r   ÚIntSoftmax.__init__q  s—   ø€ Ü‰ÑÔØ$ŒØˆŒØ$ŒàÐ4Ó4Ü�K‰KÐ2Ô3Ø#ˆDŒOä˜B¨4¯?©?Ñ;ˆŒØˆŒØˆŒ
Ú1ˆŒ	Ø�	‰	�!‹˜Ÿ	™	 !™Ñ$‹Ø�	‰	�!‹˜Ÿ	™	 !™Ñ$Œr,   c                 óD  • [         R                  " 5          [         R                  " U R                  S   U-  5      n[         R                  " U R                  S   US-  -  5      nS S S 5        UW-   U-  W-   nU R                  S   US-  -  nXR4$ ! , (       d  f       N1= fr�   )r   Úno_gradrž   rº   )r%   rˆ   r¢   r£   r¤   Úzs         r*   Úint_polynomialÚIntSoftmax.int_polynomial‚  sˆ   € Ü�]Š]�_Ü—K’K §	¡	¨!¡¨~Ñ =Ó>ˆEÜ—K’K §	¡	¨!¡¨~¸qÑ/@Ñ @ÓAˆE÷ ð �U‰]˜eÑ# eÑ+ˆØŸ™ 1™¨¸Ñ(9Ñ9ˆØÐ Ð ÷ �_ús   –ABÂ
Bc                 óî  • [         R                  " 5          [         R                  " U R                  U-  5      nS S S 5        [         R                  " XR
                  W-  5      n[        R                  X-  5      nXU-  -
  nU R                  XR5      u  pg[         R                  " [        R                  USU R
                  U-
  -  -  5      SS9nUSU R
                  -  -  nXb4$ ! , (       d  f       N²= f)Nr’   r   ©r2   )
r   r½   rž   r¹   r4   r˜   r¡   r#   r¿   Úclamp)r%   rˆ   r¢   Úx0_intÚqÚrÚexp_intÚexp_scaling_factors           r*   Úint_expÚIntSoftmax.int_expŠ  s¼   € Ü�]Š]�_Ü—[’[ §¡¨>Ñ!9Ó:ˆF÷ ä—	’	˜%§¡¨fÑ!4Ó5ˆä�O‰O˜E™NÓ+ˆØ˜Q‘JÑˆØ&*×&9Ñ&9¸!Ó&LÑ#ˆÜ—+’+œiŸo™o¨g¸¸d¿j¹jÈ1¹nÑ8MÑ.MÓNÐTUÑVˆØ+¨a°·±©mÑ;ˆØÐ&Ð&÷ �_ús   –$C&Ã&
C4c                 óî  • U R                   (       d   [        R                  R                  USS9S 4$ X-  nUR	                  SSS9u  pEX4-
  nU R                  X25      u  pgU R                  Xg5      u  p‡X‡-  nUR                  SSS9n	[        R                  SU R                  -  U	-  5      n
[        R                  Xj-  SU R                  U R                  -
  -  -  5      nSSU R                  -  -  nXb-  U4$ )Nrb   ©r   T)r   Úkeepdimr’   r   )r    r   r.   r³   r4   rÉ   r¸   re   r¡   r#   r·   r¶   )r%   r6   r¢   rˆ   Ú	x_int_maxr†   rÇ   rÈ   ÚexpÚexp_int_sumÚfactors              r*   r>   ÚIntSoftmax.forward–  sî   € Ø��Ü—=‘=×(Ñ(¨°Ð(Ð3°TÐ9Ð9àÑ"ˆà—y‘y R°�yÐ6‰ˆ	ØÑ!ˆØ&*§l¡l°5Ó&IÑ#ˆð #'§(¡(¨7Ó"GÑˆØÑ*ˆà—k‘k b°$�kÐ7ˆÜ—‘  D§L¡L¡°;Ñ!>Ó?ˆÜ—/‘/ 'Ñ"2°Q¸4¿<¹<È$Ï/É/Ñ;YÑ5ZÑ"ZÓ[ˆØ˜Q §¡Ñ/Ñ/ˆØÑ'¨Ð7Ð7r,   )r¸   rº   r˜   r·   r¶   r    r¹   )Fr¯   )rD   rE   rF   rG   rH   r   r¿   rÉ   r>   rI   rJ   rK   s   @r*   r±   r±   d  s!   ø† ñ
÷%ò"!ò
'÷8ð 8r,   r±   c                   óF   ^ • \ rS rSrSrSU 4S jjrS rS rS	S jrSr	U =r
$ )
ÚIntLayerNormi«  a×  
Quantized version of `torch.nn.LayerNorm`. Adds quantization-specific arguments on top of `torch.nn.LayerNorm`.

Args:
    output_bit (`int`, *optional*, defaults to `8`):
        Bitwidth for the layer output activation.
    quant_mode (`bool`, *optional*, defaults to `False`):
        Whether or not the layer is quantized.
    force_dequant (`str`, *optional*, defaults to `"none"`):
        Force dequantize the layer if either "layernorm" or "nonlinear" is given.
c                 ó  >• [         TU ]  5         Xl        X l        [        R
                  " [        R                  " U5      5      U l        [        R
                  " [        R                  " U5      5      U l	        X@l
        US;   a  [        R                  S5        SU l
        [        R                  " [        R                  " S5      5      U l        X0l        SU l        S U l        [%        U R                  U R                  S9U l        g )N)r�   Ú	layernormzForce dequantize layernormFr   rŠ   rµ   )r   r   Únormalized_shapeÚepsr   r   r   r   r   ry   r    r“   r”   r   Úshiftr¶   r·   Údim_sqrtrM   Ú
activation)r%   r×   rØ   r¶   r    rš   r)   s         €r*   r   ÚIntLayerNorm.__init__¸  s°   ø€ Ü‰ÑÔØ 0ÔØŒä—l’l¤5§;¢;Ð/?Ó#@ÓAˆŒÜ—L’L¤§¢Ð-=Ó!>Ó?ˆŒ	à$ŒØÐ6Ó6Ü�K‰KÐ4Ô5Ø#ˆDŒOä—Y’YœuŸ{š{¨1›~Ó.ˆŒ
Ø$ŒØˆŒØˆŒÜ" 4§?¡?¸t¿¹ÑOˆ�r,   c           	      ó  • [         R                  " 5          US-  n[         R                  " USSS9n[         R                  " [         R                  " USU R
                  -  -  5      5      R                  5       R                  5       nU R                  n[         R                  " U R                  U5      U l        [        R                  S[        U5       S[        U R                  5       35        S S S 5        g ! , (       d  f       g = f)Nr’   T©ÚaxisrÍ   zDynamic shift adjustment: z -> )r   r½   re   Úlog2Úsqrtr·   Úceilr4   rÙ   r“   r”   Úint)r%   r¦   Úy_sq_intÚvar_intrÙ   Ú	shift_olds         r*   Ú	set_shiftÚIntLayerNorm.set_shiftË  s­   € Ü�]Š]�_Ø˜a‘xˆHÜ—i’i ¨q¸$Ñ?ˆGÜ—Z’Z¤§
¢
¨7°Q¸¿¹±_Ñ+DÓ EÓF×KÑKÓM×RÑRÓTˆEØŸ
™
ˆIÜŸš 4§:¡:¨uÓ5ˆDŒJÜ�K‰KÐ4´S¸³^Ð4DÀDÌÈTÏZÉZËÐHYÐZÔ[÷ �_Ž_ús   –CC:Ã:
Dc                 ó¨   • U R                  U5        [        R                  USU R                  -  -  5      nUS-  n[        R
                  " USSS9nU$ )z™
This fallback function is called when overflow is detected during training time, and adjusts the `self.shift`
to avoid overflow in the subsequent runs.
r’   TrÞ   )rç   r¡   r#   rÙ   r   re   )r%   r¦   Úy_int_shiftedrä   rå   s        r*   Úoverflow_fallbackÚIntLayerNorm.overflow_fallbackÔ  sL   € ð
 	�‰�uÔÜ!Ÿ™¨°°4·:±:±Ñ(=Ó>ˆØ  !Ñ#ˆÜ—)’)˜H¨1°dÑ;ˆØˆr,   c                 ó„  • U R                   (       dr  UR                  SSS9nX-
  n[        R                  " US-  SSS9nU[        R                  " U R                  U-   5      -  nXR
                  -  U R                  -   nUS 4$ U R                  cd  [        R                  " UR                  S   [        R                  S9n[        R                  " U5      R                  UR                  5      U l        X-  n[        R                  UR                  SSS95      nXx-
  n	[        R                  U	SU R                   -  -  5      n
U
S-  n[        R"                  " USSS9nU R$                  (       a]  UR'                  5       SU R(                  -  :¼  a<  U R+                  U	5      nUR'                  5       SU R(                  -  S-   :  d   S5       e[        R                  [        R                  " U5      5      SU R                   -  -  n[        R                  SU-  5      n[        R                  Xž-  S-  5      n	U R                  S-  nU R                  R,                  R/                  5       U R
                  R,                  R/                  5       -  n[        R                  Xò-  5      nU	U-   n	X R
                  -  nX’-  nX4$ )	Nr’   TrÞ   )Údtypegš™™™™™¹?zfError detected in overflow handling: `var_int` exceeds `self.max_bit` (the maximum possible bit width)l        i   @)r    Úmeanr   rá   rØ   r   ry   rÚ   Útensorr„   ÚfloatÚtoÚdeviceÚ	round_ster#   r¡   rÙ   re   rc   r4   r·   rë   r0   r1   )r%   r6   r¢   rï   ÚyÚvarÚnrˆ   Úmean_intr¦   rê   rä   rå   Ústd_intrÑ   ry   Úbias_ints                    r*   r>   ÚIntLayerNorm.forwardß  s:  € Ø��Ø—6‘6˜q¨$�6Ð/ˆDØ‘ˆAÜ—*’*˜Q ™T¨°4Ñ8ˆCØ”E—J’J˜tŸx™x¨#™~Ó.Ñ.ˆAØ—K‘K‘ $§)¡)Ñ+ˆAØ�d�7ˆNð �=‰=Ñ Ü—’˜QŸW™W Q™Z¬u¯{©{Ñ;ˆAÜ!ŸJšJ q›M×,Ñ,¨Q¯X©XÓ6ˆDŒMð Ñ"ˆÜ—?‘? 5§:¡:°1¸d :Ð#CÓDˆØÑ ˆÜ!Ÿ™¨°°4·:±:±Ñ(=Ó>ˆØ  !Ñ#ˆÜ—)’)˜H¨1°dÑ;ˆð �=�=à�{‰{‹}  4§<¡<¡Ó/Ø×0Ñ0°Ó7�Ø—{‘{“} q¨$¯,©,¡¸Ñ'<Ó<ð ðXóÐ<ô —/‘/¤%§*¢*¨WÓ"5Ó6¸¸D¿J¹J¹ÑFˆÜ—‘ ¨¡Ó1ˆÜ—‘ ¡°Ñ 2Ó3ˆØŸ™¨Ñ.ˆð �y‰y�~‰~×$Ñ$Ó&¨$¯+©+×*:Ñ*:×*AÑ*AÓ*CÑDˆÜ—?‘? 4Ñ#8Ó9ˆà˜Ñ ˆØ'¯+©+Ñ5ˆØÑ"ˆàÐ Ð r,   )
rÛ   ry   rÚ   rØ   r·   r×   r¶   r    rÙ   r   )rA   Fr¯   r‹   )rD   rE   rF   rG   rH   r   rç   rë   r>   rI   rJ   rK   s   @r*   rÔ   rÔ   «  s#   ø† ñ
÷Pò&\ò	÷.!ò .!r,   rÔ   c                 óR  • U R                   S   n[        USUS-  -
  -  5      n[        XB-  S-  5      n[        R                  " XS9R                  nUS:X  a  US-  nO![        R                  " U * US9R                  * nU(       d   UR                  5       nUR                  5       nX‡4$ )a’  
Calculate the percentile max and min values in a given tensor

Args:
    input (`torch.Tensor`):
        The target tensor to calculate percentile max and min.
    lower_percentile (`float`):
        If 0.1, means we return the value of the smallest 0.1% value in the tensor as percentile min.
    upper_percentile (`float`):
        If 99.9, means we return the value of the largest 0.1% value in the tensor as percentile max.
    output_tensor (`bool`, *optional*, defaults to `False`):
        If True, this function returns tensors, otherwise it returns values.

Returns:
    `Tuple(torch.Tensor, torch.Tensor)`: Percentile min and max value of *input*
r   r   g{®Gáz„?)r—   )r„   Úroundr   ÚkthvalueÚvaluesr^   )	ÚinputÚlower_percentileÚupper_percentileÚoutput_tensorÚinput_lengthÚlower_indexÚupper_indexÚupper_boundÚlower_bounds	            r*   Úget_percentile_min_maxr	    s§   € ð" —;‘;˜q‘>€Lä˜¨Ð,<¸tÑ,CÑ(CÑDÓE€KÜ˜Ñ7¸$Ñ>Ó?€Kä—.’. Ñ6×=Ñ=€Kà˜1ÓØ! A‘o‰ô —~’~ u f°Ñ<×CÑCÐCˆæØ!×&Ñ&Ó(ˆØ!×&Ñ&Ó(ˆØÐ#Ð#r,   c                 óø  • [        U R                  5      S:X  a)  UR                  SSSS5      nUR                  SSSS5      nO`[        U R                  5      S:X  a%  UR                  SS5      nUR                  SS5      nO"UR                  S5      nUR                  S5      nU(       a3  U R                  SU-  5      R	                  U5      R                  5         U $ [        R                  " SU-  U -  U-   5      $ )a  
Quantize single-precision input tensor to integers with the given scaling factor and zeropoint.

Args:
    input (`torch.Tensor`):
        Single-precision input tensor to be quantized.
    scale (`torch.Tensor`):
        Scaling factor for quantization.
    zero_point (`torch.Tensor`):
        Shift for quantization.
    inplace (`bool`, *optional*, defaults to `False`):
        Whether to compute inplace or not.

Returns:
    `torch.Tensor`: Linearly quantized value of *input* according to *scale* and *zero_point*.
é   rb   r   r’   rª   )Úlenr„   rg   Úmul_Úadd_Úround_r   rý   )r   ÚscaleÚ
zero_pointÚinplaces       r*   Úlinear_quantizer  4  sÒ   € ô$ ˆ5�;‰;Ó˜1ÓØ—
‘
˜2˜q ! QÓ'ˆØ—_‘_ R¨¨A¨qÓ1‰
ä	ˆU�[‰[Ó	˜QÓ	Ø—
‘
˜2˜qÓ!ˆØ—_‘_ R¨Ó+‰
à—
‘
˜2“ˆØ—_‘_ RÓ(ˆ
æØ�
‰
�3˜‘;Ó×$Ñ$ ZÓ0×7Ñ7Ô9ØˆÜ�;Š;�s˜U‘{ UÑ*¨ZÑ7Ó8Ð8r,   c                 óÌ  • [         R                  " 5          SU S-
  -  S-
  nU(       aa  [         R                  " [         R                  " UR	                  5       UR	                  5       /SS9SS9u  pV[         R
                  " USS9U-  nO@[        UR	                  5       UR	                  5       5      n[         R
                  " USS9U-  nSSS5        U$ ! , (       d  f       W$ = f)aÿ  
Compute the scaling factor with the given quantization range for symmetric quantization.

Args:
    saturation_min (`torch.Tensor`):
        Lower bound for quantization range.
    saturation_max (`torch.Tensor`):
        Upper bound for quantization range.
    per_channel (`bool`, *optional*, defaults to `False`):
        Whether to or not use channel-wise quantization.

Returns:
    `torch.Tensor`: Scaling factor that linearly quantizes the given range between *saturation_min* and
    *saturation_max*.
r’   r   rÌ   g:Œ0âŽyE>rÂ   N)r   r½   r4   Ústackr    rÃ   )Únum_bitsÚsaturation_minÚsaturation_maxrS   r÷   r  r†   s          r*   r5   r5   W  s¾   € ô$ 
�Š�Ø�(˜Q‘,Ñ !Ñ#ˆæÜ—y’y¤§¢¨n×.@Ñ.@Ó.BÀN×DVÑDVÓDXÐ-YÐ_`Ñ!aÐghÑi‰HˆEÜ—K’K ¨4Ñ0°1Ñ4‰Eô ˜×*Ñ*Ó,¨n×.@Ñ.@Ó.BÓCˆEÜ—K’K ¨4Ñ0°1Ñ4ˆE÷ 
ð €L÷ 
Œð €Lús   –B4CÃ
C#c                   ó8   • \ rS rSrSr\S 5       r\S 5       rSrg)r"   iw  zo
Class to quantize the given floating-point values using symmetric quantization with given range and bitwidth.
c                 ó²   • [         R                  " SUR                  S9nSUS-
  -  S-
  n[        XUSS9n[         R                  " Xv* US-
  5      nX@l        U$ )aÎ  
Args:
    x (`torch.Tensor`):
        Floating point tensor to be quantized.
    k (`int`):
        Quantization bitwidth.
    percentile_mode (`bool`):
        Whether or not to use percentile calibration.
    scale (`torch.Tensor`):
        Pre-calculated scaling factor for *x*. Note that the current implementation of SymmetricQuantFunction
        requires pre-calculated scaling factor.

Returns:
    `torch.Tensor`: Symmetric-quantized value of *input*.
g        )ró   r’   r   F)r  )r   rð   ró   r  rÃ   r  )Úctxr6   r—   r!   r  r  r÷   Únew_quant_xs           r*   r>   ÚSymmetricQuantFunction.forward|  sY   € ô" —\’\ #¨e¯l©lÑ;ˆ
à�!�a‘%‰L˜1ÑˆÜ% a°
ÀEÑJˆÜ—k’k +¨r°1°q±5Ó9ˆàŒ	ØÐr,   c                 ó   • U R                   n[        UR                  5      S:X  a  UR                  SSSS5      nO=[        UR                  5      S:X  a  UR                  SS5      nOUR                  S5      nUR	                  5       U-  S S S S 4$ )Nr  rb   r   r’   )r  r  r„   rg   Úclone)r  Úgrad_outputr  s      r*   ÚbackwardÚSymmetricQuantFunction.backward–  s�   € à—	‘	ˆÜˆ{× Ñ Ó! QÓ&Ø—J‘J˜r 1 a¨Ó+‰Eä�×"Ñ"Ó# qÓ(Ø—J‘J˜r 1Ó%‰Eà—J‘J˜r“NˆEà× Ñ Ó" UÑ*¨D°$¸¸dÐBÐBr,   © N©	rD   rE   rF   rG   rH   Ústaticmethodr>   r!  rI   r#  r,   r*   r"   r"   w  s1   † ñð ñó ðð2 ñ
Có ó
Cr,   r"   c                   ó8   • \ rS rSrSr\S 5       r\S 5       rSrg)r¡   i¤  z3
Straight-through Estimator(STE) for torch.floor()
c                 ó.   • [         R                  " U5      $ r‹   )r   rž   ©r  r6   s     r*   r>   Úfloor_ste.forward©  ó   € ä�{Š{˜1‹~Ðr,   c                 ó"   • UR                  5       $ r‹   ©r  ©r  r   s     r*   r!  Úfloor_ste.backward­  ó   € à× Ñ Ó"Ð"r,   r#  Nr$  r#  r,   r*   r¡   r¡   ¤  ó/   † ñð ñó ðð ñ#ó ó#r,   r¡   c                   ó8   • \ rS rSrSr\S 5       r\S 5       rSrg)rô   i²  z3
Straight-through Estimator(STE) for torch.round()
c                 ó.   • [         R                  " U5      $ r‹   )r   rý   r(  s     r*   r>   Úround_ste.forward·  r*  r,   c                 ó"   • UR                  5       $ r‹   r,  r-  s     r*   r!  Úround_ste.backward»  r/  r,   r#  Nr$  r#  r,   r*   rô   rô   ²  r0  r,   rô   c                 óÎ  • U R                  5       nU R                  S5      n [        R                  " U R	                  5       R                  5       5      u  p4/ nU Hi  n[        [        R                  " USU-  -  5      R                  [        R                  " S5      [        R                  S95      nUR                  U5        Mk     [        R                  " U5      n[        U5      U-
  n[        R                  " U5      R!                  U R"                  5      R                  U5      [        R                  " U5      R!                  U R"                  5      R                  U5      4$ )zà
Decompose the scaling factor into mantissa and twos exponent.

Args:
    scaling_factor (`torch.Tensor`):
        Target scaling factor to decompose.

Returns:
    ``Tuple(torch.Tensor, torch.Tensor)`: mantisa and exponent
rb   r’   r   )Úrounding)Úsizerg   ÚnpÚfrexpÚcpuÚnumpyrã   ÚdecimalÚDecimalÚquantizeÚROUND_HALF_UPÚappendÚarrayrñ   r   Ú
from_numpyrò   ró   )Úinputsr·   Úshape_of_inputÚoutput_mÚoutput_eÚtmp_mÚmÚint_m_shifteds           r*   Úbatch_frexprK  À  s  € ð —[‘[“]€Nð �[‰[˜‹_€FäŸš &§*¡*£,×"4Ñ"4Ó"6Ó7Ñ€HØ€EÛˆÜÜ�OŠO˜A  G¡Ñ,Ó-×6Ñ6´w·²ÀqÓ7IÔT[×TiÑTiÐ6Ðjó
ˆð 	�‰�]Ö#ñ	 ô
 �xŠx˜‹€Hä�W‹~ Ñ(€Hô 	×Ò˜Ó"×%Ñ% f§m¡mÓ4×9Ñ9¸.ÓIÜ×Ò˜Ó"×%Ñ% f§m¡mÓ4×9Ñ9¸.ÓIðð r,   c                   ó@   • \ rS rSrSr\  SS j5       r\S 5       rSrg)rf   iâ  a	  
Function to perform fixed-point arithmetic that can match integer arithmetic on hardware.

Args:
    pre_act (`torch.Tensor`):
        Input tensor.
    pre_act_scaling_factor (`torch.Tensor`):
        Scaling factor of the input tensor *pre_act*.
    bit_num (`int`):
        Quantization bitwidth.
    z_scaling_factor (`torch.Tensor`):
        Scaling factor of the output tensor.
    identity (`torch.Tensor`, *optional*):
        Identity tensor, if exists.
    identity_scaling_factor (`torch.Tensor`, *optional*):
        Scaling factor of the identity tensor *identity*, if exists.

Returns:
    `torch.Tensor`: Output tensor(*pre_act* if *identity* is not given, otherwise the addition of *pre_act* and
    *identity*), whose scale is rescaled to *z_scaling_factor*.
Nc                 ó  • [        UR                  5      S:X  a  S nOS nXPl        SUS-
  -  S-
  n[        R                  " 5          U" U5      nUb  U" U5      nX@l        [        R                  " X-  5      n	UR                  [        R                  5      n
UR                  [        R                  5      R                  [        R                  5      nX«-  nU" U5      n[        U5      u  pÞU	R                  [        R                  5      UR                  [        R                  5      -  n[        R                  " USU-  -  5      nUbí  [        R                  " XV-  5      nUR                  [        R                  5      n
UR                  [        R                  5      R                  [        R                  5      nX«-  nU" U5      n[        U5      u  nnUR                  [        R                  5      UR                  [        R                  5      -  n[        R                  " USU-  -  5      nUU-   n[        R                  " UR                  [        R                  5      U* S-
  U5      sS S S 5        $ ! , (       d  f       g = f)Nr   c                 ó   • U $ r‹   r#  ©r6   s    r*   Ú<lambda>Ú'FixedPointMul.forward.<locals>.<lambda>  s   € ¡r,   c                 ó(   • U R                  SSS5      $ )Nr   rb   )rg   rO  s    r*   rP  rQ    s   €  §¡ q¨!¨RÔ 0r,   r’   r   r@   )r  r„   ri   r   r½   Úz_scaling_factorrý   ÚtypeÚdoublerñ   rK  rÃ   )r  Úpre_actrh   Úbit_numrS  ri   rj   Úreshaper÷   Úz_intÚ_AÚ_BÚ	new_scalerI  ÚeÚoutputÚwx_intÚm1Úe1Úoutput1s                       r*   r>   ÚFixedPointMul.forwardù  sç  € ô Ð%×+Ñ+Ó,°Ó1Ù!‰Gá0ˆGØŒà�'˜A‘+Ñ Ñ"ˆä�]Š]�_Ù%,Ð-CÓ%DÐ"ØÑ#Ù*1Ð2IÓ*JÐ'à#3Ô ä—K’K Ñ @ÓAˆEØ'×,Ñ,¬U¯\©\Ó:ˆBØ"×'Ñ'¬¯©Ó4×:Ñ:¼5¿<¹<ÓHˆBØ™ˆIÙ 	Ó*ˆIä˜yÓ)‰DˆAà—Z‘Z¤§¡Ó-°·±´u·|±|Ó0DÑDˆFÜ—[’[ ¨3°©6Ñ!2Ó3ˆFàÑ#äŸš XÑ%GÓH�à,×1Ñ1´%·,±,Ó?�Ø&×+Ñ+¬E¯K©KÓ8×>Ñ>¼u¿|¹|ÓL�Ø™G�	Ù# IÓ.�	ä$ YÓ/‘��BØ Ÿ+™+¤e§l¡lÓ3°b·g±g¼e¿l¹lÓ6KÑK�ÜŸ+š+ g°°b±Ñ&9Ó:�à  6Ñ)�ä—;’;˜vŸ{™{¬5¯;©;Ó7¸!¸¸a¹ÀÓC÷C �_�_ús   ÁH)I:É:
Jc                 ó¢   • S nU R                   b  UR                  5       U R                  -  nUR                  5       U R                  -  S S S S US 4$ r‹   )ri   r  rS  )r  r   Úidentity_grads      r*   r!  ÚFixedPointMul.backward.  sU   € àˆØ�<‰<Ñ#Ø'×-Ñ-Ó/°#×2FÑ2FÑFˆMØ× Ñ Ó" S×%9Ñ%9Ñ9¸4ÀÀtÈTÐS`ÐbfÐfÐfr,   r#  rC   r$  r#  r,   r*   rf   rf   â  s<   † ñð, ð Ø $ó2Dó ð2Dðh ñgó ógr,   rf   )F)é   )r=  r<  r9  r   r   Útorch.autogradr   Úutilsr   Ú
get_loggerrD   r“   ÚModuler   rM   rs   r�   r±   rÔ   r	  r  r5   r"   r¡   rô   rK  rf   r#  r,   r*   Ú<module>rl     sî   ðó" ã Û Ý Ý #å ð 
×	Ò	˜HÓ	%€ôPP�R—Y‘Yô PPôfgMˆr�y‰yô gMôTM
�"—)‘)ô M
ô`66ˆb�i‰iô 66ôrD8�—‘ô D8ôNb!�2—9‘9ô b!ôJ!$ôH 9ôFô@*C˜Xô *CôZ#�ô #ô#�ô #ôôDQg�Hõ Qgr,   