
    ȅi#                         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)    N)_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
\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        ]/home/james-whalen/.local/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biasNr   r   returnc                 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.forward3   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   r3   r   destinationprefix	keep_varsr   s       r   r;   &LinearPackedParams._save_to_state_dict6   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_msgsrB   r&   r'   r   r   r   s                r   rF   (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__X   s    ""DMM4::==r   c                 .    Uu  U l         U l        U l        g r*   rO   )r   states     r   __setstate__LinearPackedParams.__setstate__\   s    ;@8	dmTZr   c                 >    U R                  5       R                  5       $ r*   )r3   __repr__r#   s    r   rX   LinearPackedParams.__repr__`   s      "++--r   )r.   r   rP   )__name__
__module____qualname____firstlineno__rD   r   r   r   r$   jitexportTensorintr   r3   r8   r;   rF   rQ   rU   rX   __static_attributes____classcell__r   s   @r   r   r      s    H&' 	G3 YY



 llT!

 d
	


 d


 


 

 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\S-  S
S4
S jr\SS j5       rSrU =r$ )r   e   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   ri   rj   r   r   r'   r   qweightr   s	           r   r   Linear.__init__m   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=)ri   rj   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   rX   Linear.__repr__   s    '.@AAr   r7   r(   c                     [         R                  R                  R                  XR                  R                  U R
                  U R                  5      $ r*   )r   r+   r,   qlinearr.   r   r   r6   s     r   r8   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_typerB   F)	rl   r   rE   ra   r   rC   rD   r   rF   )
r   rG   r>   rH   rI   rJ   rK   rL   rB   r   s
            r   rF   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.   r3   r#   s    r   r3   Linear._weight_bias   s    ""//11r   c                 (    U R                  5       S   $ )Nr   r3   r#   s    r   r&   Linear.weight         "1%%r   c                 (    U R                  5       S   $ )Nr	   r   r#   s    r   r'   Linear.bias   r   r   wbNr   r   c                 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                  L 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                  UUR4                  UU5        [-        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	   rh   )type_FLOAT_MODULEr$   rZ   hasattrr   rC   
isinstancetuplelistlenactivation_post_processr   r&   r   calculate_qparamsr   r   r`   anyboolr   rl   ri   rj   r   r'   r   ra   r   )rq   moduse_precomputed_fake_quantr   r   weight_post_processr&   r   	act_scaleact_zpw_scw_zprm   r   r   rz   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
 	HH		
 i( [r   )r.   ri   rj   r   r   )F)rZ   r[   r\   r]   __doc__rD   r   nnr   r   r   r   classmethodr$   ru   rX   r`   r8   r;   rF   r3   r&   r'   ra   r   r   rb   rc   rd   s   @r   r   r   e   s     HHHOOM kk"H ' '
B
 
%,, 

K

>2&&R<<R <<$R d
	R
 d
R 
R 7 7r   )	r   #torch.ao.nn.quantized.modules.utilsr   r   __all__r   Moduler   r   r"   r   r   <module>r      sH      
*S. S.nmUXX__ mr   