
    9j'                         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)    N)_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j                  dz  dedz  d	edz  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        c/media/conek/DATA/Code/OCR/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biasNr   r   returnc                     ||t        d| d|       t        j                  j                  j	                  ||||      | _        y 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   z"LinearPackedParams.set_weight_bias   s]     !^%; ""0!11B>BRT  $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_bias0   sE    &+ii&6&6&E&E'
#{ k!nk!n==r   c                     |S Nr    r   xs     r   forwardzLinearPackedParams.forward7   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   r7   z&LinearPackedParams._save_to_state_dict:   s@    #KC(,

FW$%151B1B1DF--.r   c           	      8   |j                  dd       }|*|| j                  kD  rt        d| d| j                         |j                  |dz         | _        |j                  |dz         \  }	}
}}| j                  |	|
||       t        |   |||d|||       y )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_msgsr=   r#   r$   r   r   r   s                r   rC   z(LinearPackedParams._load_from_state_dict?   s     !$$Y57T]]#: 8G94Edmm_!UVV^^FW$45
7A~~%%8
4nn 	VT>>J%	
r   c                 H    | j                   | j                  | j                  fS r2   r,   trainingr   r!   s    r   __getstate__zLinearPackedParams.__getstate__]   s    ""DMM4::==r   c                 .    |\  | _         | _        | _        y r2   rK   )r   states     r   __setstate__zLinearPackedParams.__setstate__a   s    ;@8	dmTZr   c                 >    | j                         j                         S r2   )r0   __repr__r!   s    r   rR   zLinearPackedParams.__repr__e   s      "++--r   )__name__
__module____qualname__rA   r   r   r   r"   jitexportTensorintr   r0   r5   r7   rC   rM   rP   rR   __classcell__r   s   @r   r   r      s    H&' 	G3 YY

 llT!
 d
	

 d

 

 
  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j                  dz  dedz  dedz  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__r   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 r2   )r   r   r!   s    r   rR   zLinear.__repr__   s    '.@AAr   r4   r%   c                     t         j                  j                  j                  || j                  j                  | j
                  | j                        S r2   )r   r)   r*   qlinearr,   r   r   r3   s     r   r5   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   r7   r   tensorr   r   r8   s       r   r7   zLinear._save_to_state_dict   sL    #KC(-TZZ(@FW$%-2\\$//-JF\)*r   c           	      |   t        ||dz            | _        |j                  |dz          t        ||dz            | _        |j                  |dz          |j                  |dz          |j                  dd       }|*|| j                  kD  rt        d| d| j                         t        	| %  |||d|||       y )Nr   r   op_typer=   r>   r?   F)
rb   r   rB   rY   r   r@   rA   r(   r   rC   )
r   rD   r:   rE   rF   rG   rH   rI   r=   r   s
            r   rC   zLinear._load_from_state_dict   s     :fw&678
v'(j,)>?@v,-v	)* $$Y57T]]#: 8G94Edmm_!UVV%	
r   c                 6    | j                   j                         S r2   )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   rs   r!   s    r   r$   zLinear.bias   rt   r   wbNr   r   c                 j    ||t        d| d|       | j                  j                  ||||       y r'   )r(   r,   r   )r   rv   rw   r   r   s        r   r   zLinear.set_weight_bias   sQ     !^%; &&4%55F~FVX  	++Aq..Qr   c                    t        |      | j                  ur3t        | j                         dz   | j                  j                  z         t        |d      st        d      |j                  j                  dd      }t        |t        t        f      st        dt        |             t        |      dk7  rt        dt        |             t        |d	      st        d
      |j                  }|j                  j                         }|j                  } ||       |j                  }|j!                         \  }}	|t"        j$                  k7  rt        d|       |j!                         \  }
}t        |t"        j&                        r.t#        j(                  |j+                               rt        d      |dk7  rt        d|       t-        |j/                         |      }|j                  d   d   }|j                  d   d   } | |j0                  |j2                  |||      }|j5                  ||j6                  ||       t/        |      |_        t;        |	      |_        |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_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   r^   )type_FLOAT_MODULEr(   r"   rS   hasattrrz   r@   
isinstancetuplelistlenactivation_post_processr}   r#   r   calculate_qparamsr   r   rX   anyboolr   rb   r_   r`   r   r$   r   rY   r   )rf   moduse_precomputed_fake_quantr{   r   weight_post_processr#   r   	act_scaleact_zpw_scw_zprc   r   r   rl   s                   r   
from_floatzLinear.from_float   sd    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	6EKK CE7K  )::<
ddELL)yy%$%KLLqy$'LTF%STT"6<<>3FG**+?@C**+?@COO
 	HH		
 i( [r   )F)rS   rT   rU   __doc__rA   r   nnr   r   r   r   classmethodr"   ri   rR   rX   r5   r7   rC   r0   r#   r$   rY   r   r   rZ   r[   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   