
    qi#                         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        i/home/ubuntu/crypto_trading_bot/.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                 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.forward3   s    r   c                 x    t         |   |||       | j                  ||dz   <   | j                         ||dz   <   y )Nr   r+   )r   _save_to_state_dictr   r/   r   destinationprefix	keep_varsr   s       r   r5   z&LinearPackedParams._save_to_state_dict6   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_dictr8   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__X   s    ""DMM4::==r   c                 .    |\  | _         | _        | _        y r'   rG   )r   states     r   __setstate__zLinearPackedParams.__setstate__\   s    ;@8	dmTZr   c                 >    | j                         j                         S r'   )r/   __repr__r!   s    r   rN   zLinearPackedParams.__repr__`   s      "++--r   )__name__
__module____qualname__r=   r   r   r   r"   jitexportTensorintr   r/   r3   r5   r?   rI   rL   rN   __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__m   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   rN   zLinear.__repr__   s    '.@AAr   r2   r%   c                     t         j                  j                  j                  || j                  j                  | j
                  | j                        S r'   )r   r(   r)   qlinearr+   r   r   r1   s     r   r3   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   r5   r   tensorr   r   r6   s       r   r5   zLinear._save_to_state_dict   sL    #KC(-TZZ(@FW$%-2\\$//-JF\)*r   c           	      F   t        ||dz            | _        |j                  |dz          t        ||dz            | _        |j                  |dz          |j                  |dz          |j                  dd       }|| j                  k  sJ t        	| !  |||d|||       y )Nr   r   op_typer;   F)	r^   r   r>   rU   r   r<   r=   r   r?   )
r   r@   r8   rA   rB   rC   rD   rE   r;   r   s
            r   r?   zLinear._load_from_state_dict   s     :fw&678
v'(j,)>?@v,-v	)* $$Y5$--'''%	
r   c                 6    | j                   j                         S r'   )r+   r/   r!   s    r   r/   zLinear._weight_bias   s    ""//11r   c                 (    | j                         d   S )Nr   r/   r!   s    r   r#   zLinear.weight         "1%%r   c                 (    | j                         d   S )Nr   ro   r!   s    r   r$   zLinear.bias   rp   r   wbNr   r   c                 L    ||J | j                   j                  ||||       y r'   )r+   r   )r   rr   rs   r   r   s        r   r   zLinear.set_weight_bias   s/     )n.HHH++Aq..Qr   c                 L   t        |      | j                  u 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   rZ   )type_FLOAT_MODULEr"   rO   hasattrrv   r<   
isinstancetuplelistlenactivation_post_processry   r#   r   calculate_qparamsr   r   rT   anyboolr   r^   r[   r\   r   r$   r   rU   r   )rb   moduse_precomputed_fake_quantrw   r   weight_post_processr#   r   	act_scaleact_zpw_scw_zpr_   r   r   rh   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
 	HH		
 i( [r   )F)rO   rP   rQ   __doc__r=   r   nnr   r{   r   r   classmethodr"   re   rN   rT   r3   r5   r?   r/   r#   r$   rU   r   r   rV   rW   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   