
    N j'                         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        t/root/GenerationalWealth/GenerationalWealth/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biasNr   r   returnc                     Ub  Uc  [        SU SU 35      e[        R                  R                  R	                  XX45      U l        g NzGrow_block_size and col_block_size must not be None, got row_block_size=z, col_block_size=)AssertionErrorr   opssparseqlinear_prepack_packed_params)r   r&   r'   r   r   s        r   r   "LinearPackedParams.set_weight_bias   sY     !^%; ""0!11B>BRT  $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_bias0   sA    &+ii&6&6&E&E'
#{ k!nk!n==r   c                     U$ Nr"   r   xs     r   forwardLinearPackedParams.forward7   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_dict:   s:    #KC(,

W$%151B1B1D--.r   c           	      2  > UR                  SS 5      nUb*  XR                  :  a  [        SU SU R                   35      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versionversion  > self._version r   r/   F)get_versionr+   popr   r   r   _load_from_state_dict)r   
state_dictr@   local_metadatastrictmissing_keysunexpected_keys
error_msgsrD   r&   r'   r   r   r   s                r   rJ   (LinearPackedParams._load_from_state_dict?   s     !$$Y57]]#: 8G94Edmm_!UVV^^FW$45
7A~~%%8
4n 	V>J%	
r   c                 H    U R                   U R                  U R                  4$ r7   r/   trainingr   r#   s    r   __getstate__LinearPackedParams.__getstate__]   s    ""DMM4::==r   c                 .    Uu  U l         U l        U l        g r7   rS   )r   states     r   __setstate__LinearPackedParams.__setstate__a   s    ;@8	dmTZr   c                 >    U R                  5       R                  5       $ r7   )r4   __repr__r#   s    r   r\   LinearPackedParams.__repr__e   s      "++--r   )r/   r   rT   )__name__
__module____qualname____firstlineno__rH   r   r   r   r$   jitexportTensorintr   r4   r:   r=   rJ   rU   rY   r\   __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   j   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   rm   rn   r   r   r'   r   qweightr   s	           r   r   Linear.__init__r   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=)rm   rn   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      $ r7   )r   r   r#   s    r   r\   Linear.__repr__   s    '.@AAr   r9   r(   c                     [         R                  R                  R                  XR                  R                  U R
                  U R                  5      $ r7   )r   r,   r-   qlinearr/   r   r   r8   s     r   r:   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           	      z  > [        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Ub*  XR                  :  a  [        SU SU R                   35      e[        T	U ]%  UUUSUUU5        g )Nr   r   op_typerD   rE   rF   F)
rp   r   rI   re   r   rG   rH   r+   r   rJ   )
r   rK   r@   rL   rM   rN   rO   rP   rD   r   s
            r   rJ   Linear._load_from_state_dict   s     :w&678
v'(j,)>?@v,-v	)* $$Y57]]#: 8G94Edmm_!UVV%	
r   c                 6    U R                   R                  5       $ r7   )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bNr   r   c                 j    Ub  Uc  [        SU SU 35      eU R                  R                  XX45        g r*   )r+   r/   r   )r   r   r   r   r   s        r   r   Linear.set_weight_bias   sM     !^%; &&4%55F~FVX  	++A.Qr   c                    [        U5      U R                  La3  [        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  [        S[        U5       35      e[        U5      S:w  a  [        S[        U5       35      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$                  :w  a  [        SU 35      eUR!                  5       u  p[        U["        R&                  5      (       a5  ["        R(                  " UR+                  5       5      (       a  [        S5      eOUS:w  a  [        SU 35      e[-        UR/                  5       U5      nUR                  S   S   nUR                  S   S   nU " UR0                  UR2                  UUUS9nUR5                  UUR6                  UU5        [/        U5      Ul        [;        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_shapeNz.sparse_block_shape must be tuple or list, got    z+sparse_block_shape must have length 2, got qconfigz,Input float module must have qconfig definedz1Weight observer must have dtype torch.qint8, got z$All weight zero points must map to 0r   z%Weight zero point must map to 0, got r	   rl   )type_FLOAT_MODULEr+   r$   r^   hasattrr   rG   
isinstancetuplelistlenactivation_post_processr   r&   r   calculate_qparamsr   r   rd   anyboolr   rp   rm   rn   r   r'   r   re   r   )ru   moduse_precomputed_fake_quantr   r   weight_post_processr&   r   	act_scaleact_zpw_scw_zprq   r   r   r~   s                   r   
from_floatLinear.from_float   sv    9C--- /0##,,- 
 sO,, b  !..223GN,udm<< @FXAY@Z[  !"a' =cBT>U=VW 
 sI&& !OPP"%"="=!kk002 F##))3EEG	EKK CE7K  )::<
dELL))yy%%$%KLL & qy$'LTF%STT"6<<>3FG**+?@C**+?@COO
 	HH		
 i( [r   )r/   rm   rn   r   r   )F)r^   r_   r`   ra   __doc__rH   r   nnr   r   r   r   classmethodr$   ry   r\   rd   r:   r=   rJ   r4   r&   r'   re   r   r   rf   rg   rh   s   @r   r   r   j   s     HHHOOM kk"H ' '
B
 
%,, 

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