
    Z j0                         S SK Jr  SSKJr  SSKJr  SSKJr  \(       a  SSKJ	r	  SSK
Jr  SS	KJr  \" 5       (       a  S S
Kr " S S\5      rg
)    )TYPE_CHECKING   )is_fouroversix_available   )HfQuantizer)get_module_from_name)PreTrainedModel)FourOverSixConfig)is_torch_availableNc                      ^  \ rS rSr% SrSrS\S'   U 4S jrS rSS	S
\	SSS\
4U 4S jjrSS	S
\	S\4S jr  SS jrSS jrS r\S\4S j5       rS rS rSrU =r$ )FourOverSixHfQuantizer   z$
FP4 quantization with fouroversix.
Fr
   quantization_configc                 (   > [         TU ]  " U40 UD6  g N)super__init__)selfr   kwargs	__class__s      ~/root/GenerationalWealth/GenerationalWealth/venv/lib/python3.13/site-packages/transformers/quantizers/quantizer_fouroversix.pyr   FourOverSixHfQuantizer.__init__   s    ,77    c                 8    [        5       (       d  [        S5      eg )NzXUsing `fouroversix` requires fouroversix: `pip install fouroversix --no-build-isolation`)r   ImportError)r   argsr   s      r   validate_environment+FourOverSixHfQuantizer.validate_environment    s     '))j  *r   modelr	   
param_nameparamztorch.Tensorreturnc                    > SSK Jn  [        X5      u  pVUR                  [	        U5      5      (       a  UR                  U5      $ [        TU ]  XU5      $ Nr   )QuantizedModule)fouroversixr%   r   is_quantized_module_typetypeget_element_sizer   param_element_size)r   r   r    r!   r%   moduletensor_namer   s          r   r*   )FourOverSixHfQuantizer.param_element_size&   sM     	025E33DLAA**;77w)%UCCr   c                     SSK Jn  [        X5      u  pVUR                  [	        U5      5      =(       a    XeR
                  ;   $ r$   )r&   r%   r   r'   r(   parameters_to_quantize)r   r   r    r   r%   r+   r,   s          r   param_needs_quantization/FourOverSixHfQuantizer.param_needs_quantization5   s7     	025E77VEv+YvYvJvvr   c                 ^   SSK JnJn  SSKJn  U" UU" U R
                  5      5        U R                  (       au  U R
                  R                  (       dY  UR                  5        HD  u  pxUR                  [        U5      5      (       d  M&  UR                   H  n	[        X5        M     MF     g g g )Nr   )r%   quantize_modelr   )adapt_fouroversix_config)r&   r%   r3   integrations.fouroversixr4   r   pre_quantizedkeep_master_weightsnamed_modulesr'   r(   r/   delattr)
r   r   
device_mapr   r%   r3   r4   _r+   parameter_names
             r   $_process_model_before_weight_loading;FourOverSixHfQuantizer._process_model_before_weight_loadingA   s     	@G$T%=%=>	
 d&>&>&R&R"002	";;DLII*0*G*G7 +H 3 'Sr   c                     U$ r    )r   r   r   s      r   #_process_model_after_weight_loading:FourOverSixHfQuantizer._process_model_after_weight_loadingX   s    r   c                     g)NTr@   r   s    r   is_serializable&FourOverSixHfQuantizer.is_serializable[   s    r   c                 .    U R                   R                  $ r   )r   r7   rD   s    r   is_trainable#FourOverSixHfQuantizer.is_trainable^   s    '';;;r   c                     SSK Jn  U" U 5      $ )Nr   )FourOverSixQuantize)r5   rK   )r   rK   s     r   get_quantize_ops'FourOverSixHfQuantizer.get_quantize_opsb   s    B"4((r   c                     SSK Jn  [        U R                  S5      (       a)  U R                  R                  nUR                  U5      nU$ / $ )a  
Return weight conversions for loading pre-quantized checkpoints of
other pre-quantized models (not fouroversix models). After first use,
the pre_quantized_model_config_type attribute is set to None to ensure
subsequent calls (e.g., during save_pretrained) return an empty list
since, by then, the model will be saved with our framework's format
so weight conversions are no longer needed.
r   )WeightConversionspre_quantized_model_config_type)r&   rO   hasattrr   rP   get_weight_conversions)r   rO   model_config_typeweight_conversionss       r   rR   -FourOverSixHfQuantizer.get_weight_conversionsg   sP     	2 4++-NOO $ 8 8 X X!2!I!I!" &%	r   r@   )r   r	   )__name__
__module____qualname____firstlineno____doc__requires_calibration__annotations__r   r   strfloatr*   boolr0   r=   rA   rE   propertyrH   rL   rR   __static_attributes____classcell__)r   s   @r   r   r      s     !,,8D D D 	D
 
D
w 
w 
w
 

w8 8. <d < <)
 r   r   )typingr   utils.import_utilsr   baser   quantizers_utilsr   modeling_utilsr	   utils.quantization_configr
   utilsr   torchr   r@   r   r   <module>rk      s=      9  2 0=
 f[ fr   