ó
    æ“,j  ã                   ó  • S r SSKJr  SSKrSSKJr  SSKJrJr  \R                  " S5      4S\R                  S	\R                  4S
 jjr\R                  " S5      4S\R                  S\\\4   S	\R                  4S jjr " S S\5      rg)z+
Classic uniform quantization over n bits.
é    )ÚTupleNé   )ÚBaseQuantizer)Úcapture_initÚsimple_reprç       @ÚpÚbitsc                 óâ  • US:¬  R                  5       (       a  US:*  R                  5       (       d   eSUR                  5       -  R                  5       nU R                  5       R	                  5       nU R                  5       R	                  5       nX-
  XC-
  -  n SUS-
  -  nX-  R                  5       nUS:*  R                  5       (       a  UR                  5       nOUR                  5       nXcU44$ )zh
Quantize the given weights over `bits` bits.

Returns:
    - quantized levels
    - (min, max) range.

r   é   é   é   )	ÚallÚfloatÚlongÚminÚitemÚmaxÚroundÚbyteÚshort)r	   r
   Ú
num_levelsÚmnÚmxÚunitÚlevelss          Ú›C:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\diffq/uniform.pyÚuniform_quantizer      sÈ   € ð �A‰I�?‰?×Ñ $¨"¡*×!1Ñ!1×!3Ñ!3Ð3Ð3Ø�t—z‘z“|Ñ#×)Ñ)Ó+€JØ	
�‰‹�‰‹€BØ	
�‰‹�‰‹€BØ	
‰�B‘GÑ€AØ�
˜Q‘Ñ€DØ‰h×ÑÓ€FØ�‰	‡�×ÑØ—‘“‰à—‘“ˆØ˜�8ÐÐó    r   Úscalesc                 ó|   • Uu  p4SUR                  5       -  nSUS-
  -  nU R                  5       n X-  nXtU-
  -  U-   $ )zL
Unquantize the weights from the levels and scale. Return a float32 tensor.
r   r   )r   )r   r    r
   r   r   r   r   r	   s           r   Úuniform_unquantizer"   (   sL   € ð
 �F€BØ�d—j‘j“lÑ"€JØ�
˜Q‘Ñ€DØ�\‰\‹^€FØ‰€AØ�R‘‰=˜2ÑÐr   c                   ó¾   ^ • \ rS rSr\SSSS/ S4S\R                  R                  S\S\S	\	S
\	4
U 4S jjj5       r
S rS rS rS rS rS rS rU 4S jrS rSrU =r$ )ÚUniformQuantizeré5   r   g{®Gáz„?FTÚmodelr
   Úmin_sizeÚfloat16Úqatc                 óT   >• [        U5      U l        XPl        [        TU ]  XXFU5        g)a8  
Args:
    model (torch.nn.Module): model to quantize
    bits (float): number of bits to quantize over.
    min_size (float): minimum size in MB of a parameter to be quantized.
    float16 (bool): if a layer is smaller than min_size, should we still do float16?
    qat (bool): perform quantized aware training.
    exclude (list[str]): list of patterns used to match parameters to exclude.
        For instance `['bias']` to exclude all bias terms.
    detect_bound (bool): if True, will detect bound parameters and reuse
        the same quantized tensor for both.
N)r   r
   r)   ÚsuperÚ__init__)	Úselfr&   r
   r'   r(   r)   ÚexcludeÚdetect_boundÚ	__class__s	           €r   r,   ÚUniformQuantizer.__init__6   s&   ø€ ô ˜$“KˆŒ	ØŒä‰Ñ˜¨'¸LÕIr   c                 ó   • [        U 5      $ ©N)r   ©r-   s    r   Ú__repr__ÚUniformQuantizer.__repr__J   s   € Ü˜4Ó"Ð"r   c                 ó²  • U R                   (       aÆ  U R                   Hµ  nUR                  b8  UR                  R                  R                  UR                  R
                     nOKU R                  U5      nU R                  X5      nUR                  XAR                  -
  R                  5       -   nX!R                  R                  UR
                  '   M·     gg©NTF)
r)   Ú_qparamsÚotherÚmoduleÚ_parametersÚnameÚ_quantize_paramÚ_unquantize_paramÚparamÚdetach)r-   ÚqparamÚ	new_paramÚ	quantizedÚqvalues        r   Ú_pre_forward_trainÚ#UniformQuantizer._pre_forward_trainM   s¡   € Ø�8�8ØŸ-œ-�Ø—<‘<Ñ+Ø &§¡× 3Ñ 3× ?Ñ ?ÀÇÁ×@QÑ@QÑ R‘Ià $× 4Ñ 4°VÓ <�IØ!×3Ñ3°FÓF�FØ &§¡°¿¹Ñ0E×/MÑ/MÓ/OÑ O�IØ9B—‘×)Ñ)¨&¯+©+Ó6ñ (ð Ør   c                 ó¨   • U R                   (       aA  U R                   H0  nUR                  UR                  R                  UR
                  '   M2     ggr8   )r)   r9   r@   r;   r<   r=   )r-   rB   s     r   Ú_post_forward_trainÚ$UniformQuantizer._post_forward_trainZ   s9   € Ø�8�8ØŸ-œ-�Ø9?¿¹�—‘×)Ñ)¨&¯+©+Ó6ñ (àØr   c                 óˆ   • [        UR                  R                  [        R                  " U R
                  5      5      u  p#X#4$ r3   )r   r@   ÚdataÚtorchÚtensorr
   )r-   rB   r   r    s       r   r>   Ú UniformQuantizer._quantize_parama   s0   € Ü)¨&¯,©,×*;Ñ*;¼U¿\º\È$Ï)É)Ó=TÓU‰ˆØÐÐr   c                 ó^   • Uu  p4[        X4[        R                  " U R                  5      5      $ r3   )r"   rM   rN   r
   )r-   rB   rD   r   r    s        r   r?   Ú"UniformQuantizer._unquantize_parame   s#   € Ø"‰ˆÜ! &´%·,²,¸t¿y¹yÓ2IÓJÐJr   c                 ó4   • Uu  pEU" X@R                   5      nXe4$ r3   )r
   )r-   rB   rD   Úpack_fnr   r    Úpackeds          r   Ú_bit_pack_paramÚ UniformQuantizer._bit_pack_parami   s    € Ø"‰ˆÙ˜§¡Ó+ˆØÐÐr   c                 óÈ   • Uu  pEU" XAR                   R                  5       5      R                  UR                   R                  5      R	                  UR                   5      nXe4$ )z=Unpack bitpacked representation. Should be overriden
        )r@   ÚnumelÚtoÚdeviceÚview_as)r-   rB   rT   Ú	unpack_fnÚpacked_levelsr    r   s          r   Ú_bit_unpack_paramÚ"UniformQuantizer._bit_unpack_paramn   sV   € ð !'ÑˆÙØŸ<™<×-Ñ-Ó/ó1ß13±°F·L±L×4GÑ4GÓ1HÏÉÐQW×Q]ÑQ]ÓI^ð 	àÐÐr   c                 óÒ   >• [         TU ]  5       nSnU R                   H>  nUR                  b  M  X R                  UR
                  R                  5       -  S-   -  nM@     US-  nX-   $ )z&
Non differentiable model size in MB.
r   é@   i  € )r+   Ú
model_sizer9   r:   r
   r@   rX   )r-   ÚtotalÚsubtotalrB   r0   s       €r   rb   ÚUniformQuantizer.model_sizev   sg   ø€ ô ‘Ñ"Ó$ˆØˆØ—m”mˆFØ�|‰|Ó#ØŸI™I¨¯©×(:Ñ(:Ó(<Ñ<¸rÑAÑA’ñ $ð 	�IÑˆØÑÐr   c                 ó>   • U R                  5       R                  5       $ )zI
Return the true quantized model size, in MB, without extra
compression.
)rb   r   r4   s    r   Útrue_model_sizeÚ UniformQuantizer.true_model_size‚   s   € ð
 �‰Ó ×%Ñ%Ó'Ð'r   )r
   r)   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r   rM   ÚnnÚModuler   Úboolr,   r5   rF   rI   r>   r?   rU   r^   rb   rg   Ú__static_attributes__Ú__classcell__)r0   s   @r   r$   r$   5   sŒ   ø† ØØ=?ÐSWØ!&°EÀ2ÐTXñJ˜eŸh™hŸo™oð J°Uð JÈ5ð JØðJØ-1÷Jó ðJò&#òòò òKò ò
 õ
 ÷(ð (r   r$   )Ú__doc__Útypingr   rM   Úbaser   Úutilsr   r   rN   ÚTensorr   r   r"   r$   © r   r   Ú<module>rx      sŠ   ðñõ Û å ß ,ð <A¿<º<ÈÓ;Kñ ˜Ÿ™ð ¨E¯L©Lõ ð0 -2¯LªL¸Ó,<ñ
˜uŸ|™|ð 
°U¸5À%¸<Ñ5Hð 
Ø"Ÿ\™\õ
ôR(�}õ R(r   