
    Vh                         d dl mZ d dlZd dlmc mc mZ d dlm	Z	m
Z
 d dlmZ d dlmZ dgZ G d dej
                  j                         Zy)    )OptionalN)_hide_packed_params_repr_quantize_weight)linear)LinearBlockSparsePatternLinearc            
       H    e Zd ZdZdZdZej                  j                  Z	dej                  f fd	Z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   z_
    A dynamically quantized sparse linear module with float tensor as inputs and outputs.
       sparse_dynamicTc                    t         |           |t        j                  k7  rt	        d      || _        || _        |r0t        j                  | j                  t        j                        }nd }t        j                  ||gddt        j                        }t        j                  |||      | _        | j                  j                  ||||       y )Nz;Only QINT8 is supported for Sparse Quantized Linear Dynamicdtyper
   r   )scale
zero_pointr   )row_block_sizecol_block_sizer   )super__init__torchqint8NotImplementedErrorin_featuresout_featureszerosfloat_empty_affine_quantizedr   LinearPackedParams_packed_paramsset_weight_bias)	selfr   r   r   r   biasr   qweight	__class__s	           [/home/dcms/DCMS/lib/python3.12/site-packages/torch/ao/nn/sparse/quantized/dynamic/linear.pyr   zLinear.__init__   s     	EKK%M  '(;;t00DDD//;'qQekk
 %77).PU
 	++T>>	
    c                      y)NSparseQuantizedDynamicLinear r    s    r$   	_get_namezLinear._get_name;   s    -r%   c                 x    d| j                    d| j                   d| j                         j                          S )Nzin_features=z, out_features=z
, qscheme=)r   r   weightqschemer)   s    r$   
extra_reprzLinear.extra_repr>   s>    d../t?P?P>QQ[\`\g\g\i\q\q\s[tuur%   c                 6    t        | t        j                        S N)r   r   r   r)   s    r$   __repr__zLinear.__repr__A   s    'f.G.GHHr%   xreturnc                 ~    t         j                  j                  j                  || j                  j                        S r0   )r   opssparseqlinear_dynamicr   )r    r2   s     r$   forwardzLinear.forwardD   s+    yy//43F3F3U3UVVr%   c                 L    t         |   |||       | j                  ||dz   <   y )Nop_type)r   _save_to_state_dict_op_type)r    destinationprefix	keep_varsr#   s       r$   r;   zLinear._save_to_state_dictG   s'    #KC*.--FY&'r%   c           	         t        ||dz            }|dk(  sJ d| d| j                   d       |j                  |dz          |j                  dd       }	|	| j                  k  sJ |j                  |dz         }
|j                  |dz         }|j                  |d	z   |
|d
z   |i       t        |   |||d|||       y )Nr:   r6   zCannot load from op_type [z], expecting []versionr,   r!   z_packed_params.weightz_packed_params.biasF)intr<   popget_versionupdater   _load_from_state_dict)r    
state_dictr>   local_metadatastrictmissing_keysunexpected_keys
error_msgsr:   rB   r,   r!   r#   s               r$   rH   zLinear._load_from_state_dictK   s     j)!345x	P'yt}}oQO	Pv	)* $$Y5$--'''  12~~fvo.00&..	
 	%	
r%   c                 6    | j                   j                         S r0   )r   _weight_biasr)   s    r$   rP   zLinear._weight_biass   s    ""//11r%   c                 (    | j                         d   S )Nr   rP   r)   s    r$   r,   zLinear.weightv         "1%%r%   c                 (    | j                         d   S )Nr
   rR   r)   s    r$   r!   zLinear.biasy   rS   r%   wbr   r   Nc                     ||J |j                   d   | _        |j                   d   | _        | j                  j	                  ||||       y )Nr   r
   )shaper   r   r   r   )r    rU   rV   r   r   s        r$   r   zLinear.set_weight_bias|   sO     )n.HHHGGAJ771:++Aq..Qr%   c                 .   t        |      | j                  k(  s.J d| j                  z   dz   | j                  j                  z          t        |d      sJ d       t        |      t        j
                  k(  r|d   }|j                  1|j                  j                  |j                  j                         }nddlm	} |j                         }|j                  }t        |j                  dd      r#|j                  j                  |j                  z  } ||       |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+                         |      }	t-        j.                         \  }
} | |j0                  |j2                  |
||      }|j5                  |	|j6                  |
|       |S )zCreate a quantized sparse dynamic module from a float module.

        We only care about the convert at this stage, no need for observers just yet.
        z nnq.z.from_float only works for qconfigz,Input float module must have qconfig definedr   )default_dynamic_qconfigmaskFz+Weight observer must have dtype torch.qint8z$All weight zero points must map to 0zWeight zero point must map to 0r   )type_FLOAT_MODULE__name__hasattrnni
LinearReLUrZ   r,   torch.ao.quantization.qconfigr[   getattrr\   r   r   r   calculate_qparams
isinstanceTensoranyboolr   r   r   
block_sizer   r   r   r!   )clsmoduse_precomputed_fake_quantweight_observerr[   r,   r   _w_scw_zpr"   r   r   qlinears                r$   
from_floatzLinear.from_float   s    CyC--- 	
ll+, (()	
- sI&V(VV&9&a&C;;"s{{'9'9'E!kk002O
 N5<<>O 3;;.[[%%

2F%%#R%RR#%779tdELL)yy-U/UU-19???9"6<<>?C)A)L)L)N&OO
 	>>Rr%   )F)r_   
__module____qualname____doc__rF   r<   r   nnr   r^   r   r   r*   r.   r1   rg   r8   r;   rH   rP   r,   r!   r   rC   r   classmethodrr   __classcell__)r#   s   @r$   r   r      s     HHHHOOM kk 
D.vIW W%,, W8&
P2&&
R<<
R ELL!
R !	
R
 !
R 

R 3 3r%   )typingr   r   torch.ao.nn.intrinsicaorv   	intrinsicra   #torch.ao.nn.quantized.modules.utilsr   r   torch.ao.nn.sparse.quantizedr   "torch.ao.nn.sparse.quantized.utilsr   __all__Moduler   r(   r%   r$   <module>r      s=      # # 0 G *kUXX__ kr%   