
    %Vji9#                         d dl mZ d dlZd dlmZmZ ddgZ G d dej        j                  Z	 G d dej        j                  Z
dS )    )OptionalN)_hide_packed_params_repr_quantize_weightLinearPackedParamsLinearc                   P    e Zd ZdZddej        f fd	Zd Zej        j	        dej
        deej
                 dee         dee         d	d
f
d            Zej        j	        d             Zd Z fdZ fdZej        j	        d             Zej        j	        d             Zd Z xZS )r         c                    t                                                       |t          j        k    rt	          d          || _        t          j        ddgddt          j                  }|                     |d ||           d S )Nz%Linear prepacking only supports QINT8r	         ?r   scale
zero_pointdtype)super__init__torchqint8NotImplementedErrorr   _empty_affine_quantizedset_weight_bias)selfrow_block_sizecol_block_sizer   wq	__class__s        ]/root/voice-cloning/.venv/lib/python3.11/site-packages/torch/ao/nn/sparse/quantized/linear.pyr   zLinearPackedParams.__init__   s    EK%&MNNN
*F#!5;
 
 
 	R~~FFFFF    c                     dS )N!SparseQuantizedLinearPackedParams r   s    r   	_get_namezLinearPackedParams._get_name   s    22r   weightbiasr   r   returnNc                 j    ||J t           j        j                            ||||          | _        d S N)r   opssparseqlinear_prepack_packed_params)r   r$   r%   r   r   s        r   r   z"LinearPackedParams.set_weight_bias    sA     )n.H.HH#i.>>D..
 
r   c                     t           j        j                            | j                  \  }}}|||d         |d         fS )Nr   r	   )r   r)   r*   qlinear_unpackr,   )r   r$   r%   block_sizess       r   _weight_biaszLinearPackedParams._weight_bias-   sB    &+i&6&E&E'
 '
#{ k!nk!n==r   c                     |S r(   r!   r   xs     r   forwardzLinearPackedParams.forward4   s    r   c                     t                                          |||           | j        ||dz   <   |                                 ||dz   <   d S )Nr   r,   )r   _save_to_state_dictr   r0   r   destinationprefix	keep_varsr   s       r   r6   z&LinearPackedParams._save_to_state_dict7   sR    ##KCCC(,
FW$%151B1B1D1DF--...r   c           	      @   |                     dd           }|| j        k    sJ |                    |dz             | _        |                    |dz             \  }	}
}}|                     |	|
||           t                                          |||d|||           d S )Nversionr   r,   F)get_versionpopr   r   r   _load_from_state_dict)r   
state_dictr9   local_metadatastrictmissing_keysunexpected_keys
error_msgsr<   r$   r%   r   r   r   s                r   r@   z(LinearPackedParams._load_from_state_dict<   s     !$$Y55$-''''^^FW$455
7A~~%%8
 8
4nn 	VT>>JJJ%%	
 	
 	
 	
 	
r   c                 *    | j         | j        | j        fS r(   r,   trainingr   r"   s    r   __getstate__zLinearPackedParams.__getstate__Y   s    "DM4:==r   c                 0    |\  | _         | _        | _        d S r(   rH   )r   states     r   __setstate__zLinearPackedParams.__setstate__]   s    ;@8	dmTZZZr   c                 N    |                                                                  S r(   )r0   __repr__r"   s    r   rO   zLinearPackedParams.__repr__a   s       ""++---r   )__name__
__module____qualname__r>   r   r   r   r#   jitexportTensorr   intr   r0   r4   r6   r@   rJ   rM   rO   __classcell__r   s   @r   r   r      s       H&' 	G 	G 	G 	G 	G 	G3 3 3 Y



 u|$

 !	


 !

 


 

 

 

 Y> > >  E E E E E

 
 
 
 
: Y> > > YA A A. . . . . . .r   c            
       &    e Zd ZdZdZej        j        Zdej	        f fd	Z
ed             Zd Zd Zdej        d	ej        fd
Z fdZ fdZd Zd Zd Zdej        deej                 dee         dee         d	df
dZedd            Z xZS )r   zW
    A quantized sparse linear module with quantized tensor as inputs and outputs.
    r	   Tc                    t                                                       |t          j        k    rt	          d          || _        || _        |r&t          j        | j        t          j                  }nd }t          j	        ||gddt          j                  }t          |||          | _        | j                            ||||           d| _        d| _        d S )Nz3Only QINT8 is supported for Sparse Quantized Linearr   r	   r   r   )r   r   r   r   )r   r   r   r   r   in_featuresout_featureszerosfloatr   r   r,   r   r   r   )	r   r\   r]   r   r   r%   r   qweightr   s	           r   r   zLinear.__init__n   s     	EK%E   '( 	;t0DDDDDD/;'qQek
 
 
 1).PU
 
 
 	++T>>	
 	
 	
 
r   c                     dS )NSparseQuantizedLinearr!   )clss    r   r#   zLinear._get_name   s    &&r   c                     d| j          d| j         d| j         d| j         d|                                                                  
S )Nzin_features=z, out_features=z, scale=z, zero_point=z
, qscheme=)r\   r]   r   r   r$   qschemer"   s    r   
extra_reprzLinear.extra_repr   su    O4+ O OD<M O OW[Wa O O/O O59[[]]5J5J5L5LO O	
r   c                 ,    t          | t                    S r(   )r   r   r"   s    r   rO   zLinear.__repr__   s    '.@AAAr   r3   r&   c                 x    t           j        j                            || j        j        | j        | j                  S r(   )r   r)   r*   qlinearr,   r   r   r2   s     r   r4   zLinear.forward   s2    y''t"14:t
 
 	
r   c                     t                                          |||           t          j        | j                  ||dz   <   t          j        | j                  ||dz   <   d S )Nr   r   )r   r6   r   tensorr   r   r7   s       r   r6   zLinear._save_to_state_dict   s[    ##KCCC(-TZ(@(@FW$%-2\$/-J-JF\)***r   c           	         t          ||dz                      | _        |                    |dz              t          ||dz                      | _        |                    |dz              |                    |dz              |                    dd           }|| j        k    sJ t                                          |||d|||           d S )Nr   r   op_typer<   F)	r_   r   r?   rV   r   r=   r>   r   r@   )
r   rA   r9   rB   rC   rD   rE   rF   r<   r   s
            r   r@   zLinear._load_from_state_dict   s     :fw&6788
v'(((j,)>?@@v,---v	)*** $$Y55$-''''%%	
 	
 	
 	
 	
r   c                 4    | j                                         S r(   )r,   r0   r"   s    r   r0   zLinear._weight_bias   s    "//111r   c                 6    |                                  d         S )Nr   r0   r"   s    r   r$   zLinear.weight         ""1%%r   c                 6    |                                  d         S )Nr	   rp   r"   s    r   r%   zLinear.bias   rq   r   wbr   r   Nc                 L    ||J | j                             ||||           d S r(   )r,   r   )r   rs   rt   r   r   s        r   r   zLinear.set_weight_bias   s8     )n.H.HH++Aq..QQQQQr   Fc                    t          |          | j        k    s,J |                                 dz   | j        j        z               t	          |d          s
J d            |j                            dd          }t          |t          t          f          sJ t          |          dk    sJ t	          |d          s
J d            |j        }|j                                        }|j        } ||           |j        }|                                \  }}	|t           j        k    s
J d	            |                                \  }
}t          |t           j                  r1t!          j        |                                          r
J d
            n|dk    s
J d            t+          |                                |          }|j        d         d         }|j        d         d         } | |j        |j        |||          }|                    ||j        ||           t-          |          |_        t9          |	          |_        |S )zCreate a quantized sparse module from a float module.

        We only care about the convert at this stage, no need for observers just yet.

        TODO(zaf): Need to add the sparse params to the qconfig
        z.from_float only works for sparse_paramszExpecting the Linear to have `sparse_params`. Make sure you have provided arguments in the `sparsifier.squash_mask(params_to_save=("sparse_block_shape",))` method.sparse_block_shapeN   qconfigz,Input float module must have qconfig definedz+Weight observer must have dtype torch.qint8z$All weight zero points must map to 0r   zWeight zero point must map to 0r	   r[   )type_FLOAT_MODULEr#   rP   hasattrrw   r=   
isinstancetuplelistlenactivation_post_processrz   r$   r   calculate_qparamsr   r   rU   anyboolr   r_   r\   r]   r   r%   r   rV   r   )rc   moduse_precomputed_fake_quantrx   r   weight_post_processr$   r   	act_scaleact_zpw_scw_zpr`   r   r   ri   s                   r   
from_floatzLinear.from_float   sm    CyyC----MMOO;;c>O>XX .-- sO,, 	
 	
^	
 	
, !.223GNN,udm<<<<<%&&!++++ sI&&VV(VVV&"%"=!k0022 F####)3EEGG	6###%R###(::<<
ddEL)) 	@y--UU/UUU-U1999?999"6<<>>3FGG*+?@C*+?@C#O
 
 
 	H		
 	
 	
 i(( [[r   )F)rP   rQ   rR   __doc__r>   r   nnr   r|   r   r   classmethodr#   rf   rO   rU   r4   r6   r@   r0   r$   r%   r   rV   r   r   rW   rX   s   @r   r   r   f   s         HHOM k" " " " " "H ' ' ['
 
 
B B B
 
%, 
 
 
 

K K K K K

 
 
 
 
>2 2 2& & && & &R<R EL!R !	R
 !R 
R R R R 7 7 7 [7 7 7 7 7r   )typingr   r   #torch.ao.nn.quantized.modules.utilsr   r   __all__r   Moduler   r   r!   r   r   <module>r      s                   
*S. S. S. S. S. S. S. S.nm m m m mUX_ m m m m mr   