
    sgP#                         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
y)    )OptionalN)_hide_packed_params_repr_quantize_weightLinearPackedParamsLinearc                       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                  k7  rt	        d      || _        t        j                  ddgddt        j                        }| j                  |d ||       y )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        V/var/www/html/venv/lib/python3.12/site-packages/torch/ao/nn/sparse/quantized/linear.pyr   zLinearPackedParams.__init__   sd    EKK%&MNN
**F#!5;;
 	R~~F    c                      y)N!SparseQuantizedLinearPackedParams r   s    r   	_get_namezLinearPackedParams._get_name   s    2r   weightbiasr   r   returnNc                 r    ||J t         j                  j                  j                  ||||      | _        y N)r   opssparseqlinear_prepack_packed_params)r   r$   r%   r   r   s        r   r   z"LinearPackedParams.set_weight_bias!   s;     )n.HHH#ii..>>D..
r   c                     t         j                  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.   sE    &+ii&6&6&E&E'
#{ k!nk!n==r   c                     |S r(   r!   r   xs     r   forwardzLinearPackedParams.forward5   s    r   c                 x    t         |   |||       | j                  ||dz   <   | j                         ||dz   <   y )Nr   r,   )r   _save_to_state_dictr   r0   r   destinationprefix	keep_varsr   s       r   r6   z&LinearPackedParams._save_to_state_dict8   s@    #KC(,

FW$%151B1B1DF--.r   c           	         |j                  dd       }|| j                  k  sJ |j                  |dz         | _        |j                  |dz         \  }	}
}}| j	                  |	|
||       t
        |   |||d|||       y )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$--'''^^FW$45
7A~~%%8
4nn 	VT>>J%	
r   c                 H    | j                   | j                  | j                  fS r(   r,   trainingr   r"   s    r   __getstate__zLinearPackedParams.__getstate__Z   s    ""DMM4::==r   c                 .    |\  | _         | _        | _        y r(   rH   )r   states     r   __setstate__zLinearPackedParams.__setstate__^   s    ;@8	dmTZr   c                 >    | j                         j                         S r(   )r0   __repr__r"   s    r   rO   zLinearPackedParams.__repr__b   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3 YY



 u||$

 !	


 !

 


 

 YY> >E

: YY> > YYA A.r   c            
       N    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                  k7  rt	        d      || _        || _        |r0t        j                  | j                  t        j                        }nd }t        j                  ||gddt        j                        }t        |||      | _        | j                  j                  ||||       d| _        d| _        y )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     	EKK%E  '(;;t00DDD//;'qQekk
 1).PU
 	++T>>	
 
r   c                      y)NSparseQuantizedLinearr!   )clss    r   r#   zLinear._get_name   s    &r   c                     d| j                    d| j                   d| j                   d| j                   d| j	                         j                          
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   s\    4++,OD<M<M;NhW[WaWaVb c//**T[[]5J5J5L4MO	
r   c                 "    t        | t              S r(   )r   r   r"   s    r   rO   zLinear.__repr__   s    '.@AAr   r3   r&   c                     t         j                  j                  j                  || j                  j                  | j
                  | j                        S r(   )r   r)   r*   qlinearr,   r   r   r2   s     r   r4   zLinear.forward   s<    yy''t""114::t
 	
r   c                     t         |   |||       t        j                  | j                        ||dz   <   t        j                  | j
                        ||dz   <   y )Nr   r   )r   r6   r   tensorr   r   r7   s       r   r6   zLinear._save_to_state_dict   sL    #KC(-TZZ(@FW$%-2\\$//-JF\)*r   c           	      h   t        ||dz            | _        |j                  |dz          t        ||dz            | _        |j                  |dz          t        ||dz            }|j                  |dz          |j                  dd       }	|	| j                  k  sJ t        
| !  |||d|||       y )Nr   r   op_typer<   F)	r_   r   r?   rV   r   r=   r>   r   r@   )r   rA   r9   rB   rC   rD   rE   rF   rm   r<   r   s             r   r@   zLinear._load_from_state_dict   s     :fw&678
v'(j,)>?@v,-j)!345v	)* $$Y5$--'''%	
r   c                 6    | j                   j                         S r(   )r,   r0   r"   s    r   r0   zLinear._weight_bias   s    ""//11r   c                 (    | j                         d   S )Nr   r0   r"   s    r   r$   zLinear.weight         "1%%r   c                 (    | j                         d   S )Nr	   rp   r"   s    r   r%   zLinear.bias   rq   r   wbr   r   Nc                 L    ||J | j                   j                  ||||       y r(   )r,   r   )r   rs   rt   r   r   s        r   r   zLinear.set_weight_bias   s/     )n.HHH++Aq..Qr   c                 N   t        |      | j                  k(  s/J | j                         dz   | j                  j                  z          t	        |d      sJ d       |j
                  j                  dd      }t        |t        t        f      sJ t        |      dk(  sJ t	        |d      sJ d       |j                  }|j                  j                         }|j                  } ||       |j                  }|j                         \  }}	|t         j"                  k(  sJ d	       |j                         \  }
}t        |t         j$                        r*t!        j&                  |j)                               rJ d
       |dk(  sJ d       t+        |j-                         |      }|j
                  d   d   }|j
                  d   d   } | |j.                  |j0                  |||      }|j3                  ||j4                  ||       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   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	6#R%RR#(::<
ddELL)yy-U/UU-19???9"6<<>3FG**+?@C**+?@COO
 	SXX~~	
 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   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jUXX__ jr   