
    Pi!                     `    d dl mZ d dlZd dlmZ d dlmZ dgZ G d de          Zd Z	d Z
dS )	    )OptionalN)	Parameter)FakeQuantizeBaseLearnableFakeQuantizec                       e Zd ZdZ	 	 	 d fd	Zej        j        dd            Zej        j        dd	            Z	ej        j        dde
ddfd            Zej        j        d             Zej        j        dde
ddfd            Zej        j        d             Zej        j        d             Zej        j        d             Zej        j        d             Zdej        dej        ddfdZd Z xZS )r   a  Generalized extension of the FakeQuantize module.

    This is an extension of the FakeQuantize module, which
    supports more generalized lower-bit quantization and supports learning of the scale
    and zero point parameters through backpropagation.

    In addition to the attributes in the original FakeQuantize module, the LearnableFakeQuantize
    module also includes the following attributes to support quantization parameter learning.

    * :attr:`use_grad_scaling` defines the flag for whether the gradients for scale and zero point are
      normalized by the constant, which is proportional to the square root of the number of
      elements in the tensor. The related literature justifying the use of this particular constant
      can be found here: https://openreview.net/pdf?id=rkgO66VKDS.

    * :attr:`learning_enabled` defines the flag for enabling backpropagation for scale and zero point.
    r      Fc                 @   t                                                       ||k     s
J d            || _        || _        ||d<   ||d<   || _        d | _        d | _         |di || _        t          j	        | j        j
                  j        |k    s
J d            |t          j	        | j        j
                  j        k    s
J d            | j        j
        | _
        | j        j        | _        t          | j        d          r| j        j        nd| _        |                     dt          j        d	gt          j        
                     |                     dt          j        t          j        t          j                  j        g                     d| _        d S )Nz/quant_min must be strictly less than quant_max.	quant_min	quant_maxzquant_min out of boundzquant_max out of boundch_axislearning_enabledr   )dtypeepsF )super__init__r
   r   use_grad_scalingscale
zero_pointactivation_post_processtorchiinfor   minmaxqschemehasattrr   register_buffertensoruint8finfofloat32r   _initialized)selfobserverr
   r   r   observer_kwargs	__class__s         /home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/torchao/quantization/pt2e/learnable_fake_quantize.pyr   zLearnableFakeQuantize.__init__    s    	9$$$&W$$$""'0$'0$ 0 48
8<'/x'B'B/'B'B${47=>>BiOOO$ POO EK(D(JKKOOOO$ POO 17
3; t3Y??D(00 	
 	/qc1U1U1UVVVUEL%+em2L2L2P1Q$R$RSSS!    returnNc                     d| j         d<   |                                  | j        d| j        _        | j        d| j        _        dS dS )zEnable quantization parameter learning.

        Enables learning of quantization parameters and
        disables observer estimates.
           r   NT)r   disable_observerr   requires_gradr   r$   s    r(   enable_range_learningz+LearnableFakeQuantize.enable_range_learningH   sU     $%a :!'+DJ$?&,0DO))) '&r)   c                 j    d| j         d<   | j        d| j        _        | j        d| j        _        dS dS )zgDisable quantization parameter learning.

        Disables learning of quantization parameters
        r   NF)r   r   r.   r   r/   s    r(   disable_range_learningz,LearnableFakeQuantize.disable_range_learningV   sC     $%a :!',DJ$?&,1DO))) '&r)   Tenabledc                 R    |rdnd| j         d<   |r|                                  dS dS )zwEnable observer.

        Enables observer estimates and disables learning of
        quantization parameters.
        r,   r   N)observer_enabledr2   r$   r3   s     r(   enable_observerz%LearnableFakeQuantize.enable_observerb   sD     )0#611Qa  	*'')))))	* 	*r)   c                 0    |                      d           d S NF)r7   r/   s    r(   r-   z&LearnableFakeQuantize.disable_observerm   s    U#####r)   c                 "    |rdnd| j         d<   d S )Nr,   r   )fake_quant_enabledr6   s     r(   enable_fake_quantz'LearnableFakeQuantize.enable_fake_quantq   s    *1%8QQq"""r)   c                 0    |                      d           d S r9   )r<   r/   s    r(   disable_fake_quantz(LearnableFakeQuantize.disable_fake_quantu   s    u%%%%%r)   c                     t          d| j                                                    t          d| j                                                    d S )NzLearnableFakeQuantize Scale: z"LearnableFakeQuantize Zero Point: )printr   detachr   r/   s    r(   observe_quant_paramsz*LearnableFakeQuantize.observe_quant_paramsy   sR    Cdj.?.?.A.ACCDDDM4?3I3I3K3KMMNNNNNr)   c                 `   | j         j                            | j                                                   | j                                         }| j                                                                                            | j	        | j
                                                  }||fS )N)r   )r   dataclamp_r   itemrA   r   roundclampr
   r   longr$   r   r   s      r(   calculate_qparamsz'LearnableFakeQuantize.calculate_qparams~   s    
48==??333
!!##O""$$UWWU4>4>22TVV	 	 j  r)   c                     d| j          d| j         d| j         d| j         d| j         d| j         d| j         d| j         d	| j         d
| j	         d| j
         S )Nzfake_quant_enabled=z, observer_enabled=z, learning_enabled=z, quant_min=z, quant_max=z, dtype=z
, qscheme=z
, ch_axis=z, use_grad_scaling=z, scale=z, zero_point=)r;   r5   r   r
   r   r   r   r   r   r   r   r/   s    r(   
extra_reprz LearnableFakeQuantize.extra_repr   s    j$"9 j jdNc j j $ 5j jCG>j j_c_mj jZj j+/<j jCG<j j !% 5j j @Dzj j Y]Xgj j	
r)   r   r   c                    | j         st          |          | _        t          |                                          | _        | j        d         dk    rd| j        _        d| j        _        nd| j        _        d| j        _        d| _         dS | j        j                            |           | j        j                            |                                           dS )z
        Initialize scale and zero_point parameters if they are not initialized yet.
        Update them if they are already initialized.
        r   r,   TFN)	r#   r   r   floatr   r   r.   rD   copy_rJ   s      r(   _initialize_or_update_qparamsz3LearnableFakeQuantize._initialize_or_update_qparams   s       	;"5))DJ'
(8(8(:(:;;DO$Q'1,,+/
(04--+0
(05- $DJO!!%(((O &&z'7'7'9'9:::::r)   c           	         | j         d         dk    s| j        sY|                     |                                           | j                                        \  }}|                     ||           | j        d         dk    r| j        t          j	        t          j
        fv r| j        j                                         | j        r#d|                                | j        z  dz  z  }nd}| j        t          j	        t          j        fv r4t          j        || j        | j        | j        | j        | j        |          }n-t          j        || j        | j        | j        | j        |          }|S )Nr   r,   g      ?g      ?)r5   r#   r   rA   rK   rQ   r;   r   r   per_channel_symmetricper_tensor_symmetricr   rD   zero_r   numelr   per_channel_affine+_fake_quantize_learnable_per_channel_affiner   r   r
   *_fake_quantize_learnable_per_tensor_affine)r$   X_scale_zero_pointgrad_factors        r(   forwardzLearnableFakeQuantize.forward   sd    #q((0A(((444"&">"P"P"R"RFK..v{CCC"1%**|+*    $**,,,$ "!QWWYY%?C$GG!| ;U=UVVVEJOLNN  DJONN  r)   )r   r   F)r*   N)T)__name__
__module____qualname____doc__r   r   jitexportr0   r2   boolr7   r-   r<   r>   rB   rK   rM   TensorrQ   r^   __classcell__)r'   s   @r(   r   r      s        ( &" &" &" &" &" &"P Y1 1 1 1 Y	2 	2 	2 	2 Y* *t *t * * * * Y$ $ $ Y9 9 9 9 9 9 9 Y& & & YO O O Y	! 	! 	! Y
 
 
;\;/4|;	; ; ; ;.% % % % % % %r)   c                 \    t          | t                    r|                                  dS dS )zEnable quantization parameter learning.

    Enable fake quantization for this module, if applicable. Example usage::

      # model is any PyTorch model
      model.apply(torchao.quantization.pt2e.enable_range_learning)

    N)
isinstancer   r0   mods    r(   r0   r0      s9     #,-- $!!#####$ $r)   c                 \    t          | t                    r|                                  dS dS )zEnable quantization parameter learning.

    Enable fake quantization for this module, if applicable. Example usage::

      # model is any PyTorch model
      model.apply(torchao.quantization.pt2e.disable_range_learning)

    N)ri   r   r2   rj   s    r(   r2   r2      s9     #,-- %""$$$$$% %r)   )typingr   r   torch.nn.parameterr   'torchao.quantization.pt2e.fake_quantizer   __all__r   r0   r2   r   r)   r(   <module>rq      s           ( ( ( ( ( ( D D D D D D"
#A A A A A, A A AH
$ 
$ 
$
% 
% 
% 
% 
%r)   