§
    ‚ŠtjÍ  ã                  óÞ   — d dl mZ d dlmZ d dlmZmZ ddlmZ ddl	m
Z
mZ  ej        e¦  «        Z e¦   «         r
d dlZd dlmZ 	 	 	 	 	 ddd„Z G d„ de¦  «        Z G d„ de¦  «        ZdS )é    )Úannotations)ÚAny)Úis_torch_availableÚloggingé   )ÚConversionOps)Úget_module_from_nameÚshould_convert_moduleNúcuda:0FÚmodelútorch.nn.ModuleÚmodules_to_not_convertúlist[str] | NoneÚquant_configúdict | NoneÚcompute_dtypeútorch.dtypeÚdeviceÚstrÚpre_quantizedÚboolÚreturnc           
     ó¤  — ddl m} |€g }t          |                      ¦   «         ¦  «        D ]£\  }}t	          |t
          j        ¦  «        sŒ t          ||¦  «        sŒ1|                     d¦  «        \  }	}
}|	r|  	                    |	¦  «        n| } ||s|j
        nd|s|j        nd|s	|j        dund|||d¬¦  «        }t          |||¦  «         Œ¤| S )aý  
    Replace nn.Linear modules with empty SINQLinear modules.

    Args:
        model: The model to modify
        modules_to_not_convert: List of module names to skip
        quant_config: SINQ quantization config dict (None for pre-quantized models)
        compute_dtype: Computation dtype for the quantized layers
        device: Device string for the quantized layers
        pre_quantized: Whether loading a pre-quantized checkpoint

    Returns:
        The modified model with SINQLinear modules
    r   )Ú
SINQLinearNú.FT)Úin_featuresÚout_featuresÚbiasr   r   r   Úuse_unpack_kernel)Úsinq.sinqlinear_hfr   ÚlistÚnamed_modulesÚ
isinstanceÚnnÚLinearr
   Ú
rpartitionÚget_submoduler   r   r   Úsetattr)r   r   r   r   r   r   r   Ú	full_nameÚmoduleÚparent_pathÚ_Ú
child_nameÚparentÚ
sinq_layers                 ú\/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/transformers/integrations/sinq.pyÚreplace_with_sinq_linearr1       s   € ð, .Ð-Ð-Ð-Ð-Ð-àÐ%Ø!#Ðå! %×"5Ò"5Ñ"7Ô"7Ñ8Ô8ð 0ð 0Ñˆ	�6Ý˜&¥"¤)Ñ,Ô,ð 	ØÝ$ YÐ0FÑGÔGð 	Øà%.×%9Ò%9¸#Ñ%>Ô%>Ñ"ˆ�Q˜
Ø5@ÐK�×$Ò$ [Ñ1Ô1Ð1Àeˆà�ZØ2?ÐI˜Ô*Ð*ÀTØ4AÐK˜Ô,Ð,ÀtØ2?ÐJ�&”+ TÐ)Ð)ÀUØ%Ø'ØØ"ð
ñ 
ô 
ˆ
õ 	�˜
 JÑ/Ô/Ð/Ð/à€Ló    c                  ó(   — e Zd ZdZd„ Z	 	 	 ddd„ZdS )ÚSinqQuantizea'  
    Param-level ConversionOp for SINQ (from FP weights).

    At load time, for each `Linear.weight` that should be quantized:
      - The SINQLinear module already exists (created in _process_model_before_weight_loading)
      - We just call quantize() on it with the loaded weight tensor
    c                ó   — || _         d S ©N©Úhf_quantizer©Úselfr8   s     r0   Ú__init__zSinqQuantize.__init__\   ó   € Ø(ˆÔÐÐr2   NÚ
input_dictúdict[str, Any]r   útorch.nn.Module | NoneÚfull_layer_nameú
str | Noner   údict[str, torch.Tensor]c                ó2  — t          t          |                     ¦   «         ¦  «        ¦  «        \  }}t          |t          ¦  «        r|d         n|}t          ||¦  «        \  }	}
|	                     |¦  «         |�|                     |¦  «         d|	_        i S )Nr   T)	ÚnextÚiterÚitemsr#   r!   r	   ÚquantizeÚdiscardÚ_is_hf_initialized)r:   r=   r   r@   Úmissing_keysÚkwargsr,   ÚvaluesÚweight_tensorr*   Útensor_names              r0   ÚconvertzSinqQuantize.convert_   s’   € õ �˜j×.Ò.Ñ0Ô0Ñ1Ô1Ñ2Ô2‰	ˆˆ6Ý%/°½Ñ%=Ô%=ÐI˜˜qœ	˜	À6ˆå2°5¸/ÑJÔJÑˆ�à�Š˜Ñ&Ô&Ð&àÐ#Ø× Ò  Ñ1Ô1Ð1à$(ˆÔ!àˆ	r2   )NNN©r=   r>   r   r?   r@   rA   r   rB   ©Ú__name__Ú
__module__Ú__qualname__Ú__doc__r;   rO   © r2   r0   r4   r4   S   sQ   € € € € € ðð ð)ð )ð )ð )-Ø&*Øðð ð ð ð ð ð r2   r4   c                  ó&   — e Zd ZdZd„ Z	 	 ddd„ZdS )ÚSinqDeserializea0  
    ConversionOp for loading *pre-quantized* SINQ checkpoints.

    Checkpoint layout (what `SINQLinear.state_dict` produces) is, per module:
        <prefix>.W_q
        <prefix>.bias
        <prefix>.meta

    WeightConverter in the quantizer is configured so that:
      - we group ".W_q", ".meta", ".bias" as input_dict
      - conceptually treat them as belonging to "<prefix>.weight"
      - and call this SinqDeserialize.convert to load the state into the existing SINQLinear.

    The returned dict is {} because we load directly into the module.
    c                ó   — || _         d S r6   r7   r9   s     r0   r;   zSinqDeserialize.__init__‡   r<   r2   Nr=   r>   r   r?   r@   rA   r   rB   c                ó.  — t          |                     ¦   «         ¦  «        D ]%\  }}t          |t           ¦  «        r|d         ||<   Œ&|                     d¦  «        }|                     d¦  «        }|                     d¦  «        }	|�|€Ot	          t          |                     ¦   «         ¦  «        ¦  «        }t          |t           ¦  «        r|d         }||iS t          ||¦  «        \  }
}||dœ}|	�|	|d<   |
                     |¦  «         d|
_	        i S )Nr   z.W_qz.metaz.bias)ÚW_qÚmetar   T)
r!   rF   r#   ÚgetrD   rE   rL   r	   Úload_state_dictrI   )r:   r=   r   r@   rK   ÚkÚvr[   r\   r   r*   r,   Ústates                r0   rO   zSinqDeserialize.convertŠ   s)  € õ ˜×)Ò)Ñ+Ô+Ñ,Ô,ð 	%ð 	%‰DˆAˆqÝ˜!�TÑ"Ô"ð %Ø ! !¤�
˜1‘øà�nŠn˜VÑ$Ô$ˆØ�~Š~˜gÑ&Ô&ˆØ�~Š~˜gÑ&Ô&ˆð ˆ;˜$˜,Ý•T˜*×+Ò+Ñ-Ô-Ñ.Ô.Ñ/Ô/ˆAÝ˜!�TÑ"Ô"ð Ø�a”D�Ø# QÐ'Ð'å(¨°Ñ@Ô@‰	ˆ�ð Øð
ð 
ˆð ÐØ ˆE�&‰Mà×Ò˜uÑ%Ô%Ð%Ø$(ˆÔ!àˆ	r2   )NNrP   rQ   rV   r2   r0   rX   rX   v   sN   € € € € € ðð ð )ð )ð )ð )-Ø&*ð	#ð #ð #ð #ð #ð #ð #r2   rX   )NNNr   F)r   r   r   r   r   r   r   r   r   r   r   r   r   r   )Ú
__future__r   Útypingr   Útransformers.utilsr   r   Úcore_model_loadingr   Úquantizers.quantizers_utilsr	   r
   Ú
get_loggerrR   ÚloggerÚtorchÚtorch.nnr$   r1   r4   rX   rV   r2   r0   ú<module>rk      s7  ðð #Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ð Ð à :Ð :Ð :Ð :Ð :Ð :Ð :Ð :à .Ð .Ð .Ð .Ð .Ð .Ø UÐ UÐ UÐ UÐ UÐ UÐ UÐ Uð 
ˆÔ	˜HÑ	%Ô	%€àÐÑÔð Ø€L€L€LØÐÐÐÐÐð
 04Ø $Ø!%ØØð0ð 0ð 0ð 0ð 0ðf ð  ð  ð  ð  �=ñ  ô  ð  ðF7ð 7ð 7ð 7ð 7�mñ 7ô 7ð 7ð 7ð 7r2   