
    sh#                         S SK Jr  S SKrS SKJrJr  SS/r " S S\R                  R                  5      r	 " S S\R                  R                  5      r
g)    )OptionalN)_hide_packed_params_repr_quantize_weightLinearPackedParamsLinearc                     ^  \ rS rSrSrSS\R                  4U 4S jjrS r\R                  R                  S\R                  S\\R                     S\\   S	\\   S
S4
S j5       r\R                  R                  S 5       rS rU 4S jrU 4S jr\R                  R                  S 5       r\R                  R                  S 5       rS rSrU =r$ )r            c                    > [         TU ]  5         U[        R                  :w  a  [	        S5      eX0l        [        R                  " SS/SS[        R                  S9nU R                  US X5        g )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        w/Users/tiagomarins/Projetos/claudeai/copy_bank/venv/lib/python3.13/site-packages/torch/ao/nn/sparse/quantized/linear.pyr   LinearPackedParams.__init__   s`    EKK%&MNN
**F#!5;;
 	R~F    c                     g)N!SparseQuantizedLinearPackedParams r   s    r   	_get_nameLinearPackedParams._get_name   s    2r    weightbiasr   r   returnNc                 r    Ub  Uc   e[         R                  R                  R                  XX45      U l        g N)r   opssparseqlinear_prepack_packed_params)r   r'   r(   r   r   s        r   r   "LinearPackedParams.set_weight_bias!   s7     )n.HHH#ii..>>.
r    c                     [         R                  R                  R                  U R                  5      u  pnXUS   US   4$ )Nr   r
   )r   r,   r-   qlinear_unpackr/   )r   r'   r(   block_sizess       r   _weight_biasLinearPackedParams._weight_bias.   sA    &+ii&6&6&E&E'
#{ k!nk!n==r    c                     U$ r+   r#   r   xs     r   forwardLinearPackedParams.forward5   s    r    c                 r   > [         TU ]  XU5        U R                  XS-   '   U R                  5       XS-   '   g )Nr   r/   )r   _save_to_state_dictr   r4   r   destinationprefix	keep_varsr   s       r   r<   &LinearPackedParams._save_to_state_dict8   s:    #KC(,

W$%151B1B1D--.r    c           	         > UR                  SS 5      nXR                  ::  d   eUR                  US-   5      U l        UR                  US-   5      u  ppU R	                  XX5        [
        TU ]  UUUSUUU5        g )Nversionr   r/   F)get_versionpopr   r   r   _load_from_state_dict)r   
state_dictr?   local_metadatastrictmissing_keysunexpected_keys
error_msgsrC   r'   r(   r   r   r   s                r   rG   (LinearPackedParams._load_from_state_dict=   s     !$$Y5--'''^^FW$45
7A~~%%8
4n 	V>J%	
r    c                 H    U R                   U R                  U R                  4$ r+   r/   trainingr   r$   s    r   __getstate__LinearPackedParams.__getstate__Z   s    ""DMM4::==r    c                 .    Uu  U l         U l        U l        g r+   rP   )r   states     r   __setstate__LinearPackedParams.__setstate__^   s    ;@8	dmTZr    c                 >    U R                  5       R                  5       $ r+   )r4   __repr__r$   s    r   rY   LinearPackedParams.__repr__b   s      "++--r    )r/   r   rQ   )__name__
__module____qualname____firstlineno__rE   r   r   r   r%   jitexportTensorr   intr   r4   r9   r<   rG   rR   rV   rY   __static_attributes____classcell__r   s   @r   r   r      s    H&' 	G3 YY



 u||$

 !	


 !

 


 

 YY> >E

: YY> > YYA A. .r    c            
       d  ^  \ rS rSrSrSr\R                  R                  r	S\R                  4U 4S jjr\S 5       rS rS rS	\R                   S
\R                   4S jrU 4S jrU 4S jrS rS rS rS\R                   S\\R                      S\\   S\\   S
S4
S jr\SS j5       rSrU =r$ )r   g   zO
A quantized sparse linear module with quantized tensor as inputs and outputs.
r
   Tc                   > [         TU ]  5         U[        R                  :w  a  [	        S5      eXl        X l        U(       a.  [        R                  " U R                  [        R                  S9nOS n[        R                  " X!/SS[        R                  S9n[        X4US9U l        U R                  R                  XuX45        SU l        SU l        g )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   rj   rk   r   r   r(   r   qweightr   s	           r   r   Linear.__init__n   s     	EKK%E  '(;;t00DDD//'qQekk
 1)PU
 	++>	
 
r    c                     g)NSparseQuantizedLinearr#   )clss    r   r%   Linear._get_name   s    &r    c                     SU R                    SU R                   SU R                   SU R                   SU R	                  5       R                  5        3
$ )Nzin_features=z, out_features=z, scale=z, zero_point=z
, qscheme=)rj   rk   r   r   r'   qschemer$   s    r   
extra_reprLinear.extra_repr   s\    4++,OD<M<M;NhW[WaWaVb c//**T[[]5J5J5L4MO	
r    c                 "    [        U [        5      $ r+   )r   r   r$   s    r   rY   Linear.__repr__   s    '.@AAr    r8   r)   c                     [         R                  R                  R                  XR                  R                  U R
                  U R                  5      $ r+   )r   r,   r-   qlinearr/   r   r   r7   s     r   r9   Linear.forward   s:    yy''""114::t
 	
r    c                    > [         TU ]  XU5        [        R                  " U R                  5      XS-   '   [        R                  " U R
                  5      XS-   '   g )Nr   r   )r   r<   r   tensorr   r   r=   s       r   r<   Linear._save_to_state_dict   sF    #KC(-TZZ(@W$%-2\\$//-J\)*r    c           	      B  > [        XS-      5      U l        UR                  US-   5        [        XS-      5      U l        UR                  US-   5        UR                  US-   5        UR                  SS 5      nXR                  ::  d   e[        T	U ]!  UUUSUUU5        g )Nr   r   op_typerC   F)	rm   r   rF   rb   r   rD   rE   r   rG   )
r   rH   r?   rI   rJ   rK   rL   rM   rC   r   s
            r   rG   Linear._load_from_state_dict   s     :w&678
v'(j,)>?@v,-v	)* $$Y5--'''%	
r    c                 6    U R                   R                  5       $ r+   )r/   r4   r$   s    r   r4   Linear._weight_bias   s    ""//11r    c                 (    U R                  5       S   $ )Nr   r4   r$   s    r   r'   Linear.weight         "1%%r    c                 (    U R                  5       S   $ )Nr
   r   r$   s    r   r(   Linear.bias   r   r    wbr   r   Nc                 L    Ub  Uc   eU R                   R                  XX45        g r+   )r/   r   )r   r   r   r   r   s        r   r   Linear.set_weight_bias   s+     )n.HHH++A.Qr    c                 ~   [        U5      U R                  :X  d/   U R                  5       S-   U R                  R                  -   5       e[	        US5      (       d   S5       eUR
                  R                  SS5      n[        U[        [        45      (       d   e[        U5      S:X  d   e[	        US5      (       d   S5       eUR                  nUR                  R                  5       nUR                  nU" U5        UR                  nUR                  5       u  pU[         R"                  :X  d   S	5       eUR                  5       u  p[        U[         R$                  5      (       a1  [         R&                  " UR)                  5       5      (       a   S
5       eOUS:X  d   S5       e[+        UR-                  5       U5      nUR
                  S   S   nUR
                  S   S   nU " UR.                  UR0                  UUUS9nUR3                  XR4                  X5        [-        U5      Ul        [9        U	5      Ul        U$ )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
   ri   )type_FLOAT_MODULEr%   r[   hasattrr   rD   
isinstancetuplelistlenactivation_post_processr   r'   r   calculate_qparamsr   r   ra   anyboolr   rm   rj   rk   r   r(   r   rb   r   )rr   moduse_precomputed_fake_quantr   r   weight_post_processr'   r   	act_scaleact_zpw_scw_zprn   r   r   r{   s                   r   
from_floatLinear.from_float   s    CyC--- 	
MMO;;c>O>O>X>XX	
- sO,, 	
^	
, !..223GN,udm<<<<%&!+++ sI&&V(VV&"%"="=!kk002 F##))3EEG	#R%RR#(::<
dELL))yy--U/UU--19???9"6<<>3FG**+?@C**+?@COO
 	XX~	
 i( [r    )r/   rj   rk   r   r   )F)r[   r\   r]   r^   __doc__rE   r   nnr   r   r   r   classmethodr%   rv   rY   ra   r9   r<   rG   r4   r'   r(   r   rb   r   r   rc   rd   re   s   @r   r   r   g   s     HHHOOM kk"H ' '
B
 
%,, 

K

>2&&R<<R ELL!R !	R
 !R 
R 4 4r    )typingr   r   #torch.ao.nn.quantized.modules.utilsr   r   __all__r   Moduler   r   r#   r    r   <module>r      sK       
*S. S.niUXX__ ir    