ó
    >:jý  ã                  ó‚   • S SK Jr  S SKrS SKrS SKJr  S SKrS SKJr  S SK	J
r
Jr  S SKJr  SSKJrJr   " S	 S
\
5      rg)é    )ÚannotationsN)Úchain)ÚConv1D)Ú	BaseTunerÚBaseTunerLayer)Ú7TRANSFORMERS_MODELS_TO_FOURIERFT_TARGET_MODULES_MAPPINGé   )ÚFourierFTLayerÚFourierFTLinearc                  óF   • \ rS rSr% SrSrS\S'   \r\	r
S r\S 5       rSrg	)
ÚFourierFTModelé   aò  
Creates FourierFT model from a pretrained transformers model.

The method is described in detail in https://huggingface.co/papers/2405.03003.

Args:
    model ([`torch.nn.Module`]): The model to be adapted.
    config ([`FourierFTConfig`]): The configuration of the FourierFT model.
    adapter_name (`str`): The name of the adapter, defaults to `"default"`.
    low_cpu_mem_usage (`bool`, `optional`, defaults to `False`):
        Create empty adapter weights on meta device. Useful to speed up the loading process.

Returns:
    `torch.nn.Module`: The FourierFT model.

**Attributes**:
    - **model** ([`~transformers.PreTrainedModel`]) -- The model to be adapted.
    - **peft_config** ([`FourierFTConfig`]): The configuration of the Fourier model.
Ú
fourierft_ÚstrÚprefixc                ó´  ^• Tc  [        S5      e[        [        UR                  R	                  5       5      5      n[        [        U4S jU5      T5      n	UR                  R                  X‘R                  5      n
UR                  nUR                  n[        US5      =(       a    UR                  S LnU
UUR                  UR                  UR                  S.nXÞS'   [        U[         5      (       a   UR#                  UU
UUR                  U5        g U R$                  " XU40 UD6nX R&                  :w  a  UR)                  S5        U R+                  XTXó5        g )NzCurrent Key shouldn't be `None`c                ó:   >• [         R                  " SU  S3T5      $ )Nz.*\.Ú$)ÚreÚmatch)ÚkeyÚcurrent_keys    €ÚX/home/mande/repo/quber/.venv/lib/python3.13/site-packages/peft/tuners/fourierft/model.pyÚ<lambda>Ú4FourierFTModel._create_and_replace.<locals>.<lambda>F   s   ø€ ´"·(²(¸dÀ3À%Àq¸>È;Ô2Wó    Úbias)Ún_frequencyÚscalingÚfan_in_fan_outÚinit_weightsÚrandom_loc_seedF)Ú
ValueErrorÚlistr   Ún_frequency_patternÚkeysÚnextÚfilterÚgetr   r   r"   Úhasattrr   r    r!   Ú
isinstancer
   Úupdate_layerÚ_create_new_moduleÚactive_adapterÚrequires_grad_Ú_replace_module)ÚselfÚfourierft_configÚadapter_nameÚtargetÚtarget_nameÚparentr   Úoptional_kwargsÚpattern_keysÚtarget_name_keyr   r   r"   r   ÚkwargsÚ
new_modules         `         r   Ú_create_and_replaceÚ"FourierFTModel._create_and_replace8   s?  ø€ ð ÑÜÐ>Ó?Ð?äœEÐ"2×"FÑ"F×"KÑ"KÓ"MÓNÓOˆÜœvÔ&WÐYeÓfÐhsÓtˆà&×:Ñ:×>Ñ>¸×PlÑPlÓmˆØ"×*Ñ*ˆØ*×:Ñ:ˆÜ�v˜vÓ&×B¨6¯;©;¸dÐ+Bˆà&ØØ.×=Ñ=Ø,×9Ñ9Ø/×?Ñ?ñ
ˆð ˆv‰Ü�fœn×-Ñ-Ø×ÑØØØØ ×-Ñ-Øõð ×0Ò0Ð1AÐQWÑbÐ[aÑbˆJØ×2Ñ2Ó2à×)Ñ)¨%Ô0Ø× Ñ  °jÕIr   c                óÆ  • [        U[        5      (       a  UR                  5       nOUn[        U[        R                  R
                  5      (       a-  US   (       a"  [        R                  " S5        S=US'   U l        OV[        U[        5      (       a2  SUS'   US   (       d"  [        R                  " S5        S=US'   U l        O[        SU S35      e[        X!40 UD6nU$ )	Nr    zjfan_in_fan_out is set to True but the target module is `torch.nn.Linear`. Setting fan_in_fan_out to False.FTÚis_target_conv_1d_layerzafan_in_fan_out is set to False but the target module is `Conv1D`. Setting fan_in_fan_out to True.zTarget module zZ is not supported. Currently, only the following modules are supported: `torch.nn.Linear`.)r+   r   Úget_base_layerÚtorchÚnnÚLinearÚwarningsÚwarnr    r   r#   r   )r2   r3   r4   r:   Útarget_base_layerr;   s         r   r-   Ú!FourierFTModel._create_new_modulec   sì   € ä�fœn×-Ñ-Ø &× 5Ñ 5Ó 7Ñà &ÐäÐ'¬¯©¯©×9Ñ9ØÐ&×'Ü—’ð7ôð NSÐR�Ð'Ñ(Ð+;Ô+JøÜÐ)¬6×2Ñ2Ø04ˆFÐ,Ñ-ØÐ*×+Ü—’Øwôð NRÐQ�Ð'Ñ(Ð+;Ô+JøäØ   ð )%ð %óð ô
 % VÑD¸VÑDˆ
àÐr   © N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   Ú__annotations__r
   Útuner_layer_clsr   Útarget_module_mappingr<   Ústaticmethodr-   Ú__static_attributes__rH   r   r   r   r      s9   ‡ ñð( €FˆCÓØ$€OØSÐò)JðV ñó ór   r   )Ú
__future__r   r   rD   Ú	itertoolsr   rA   Útransformers.pytorch_utilsr   Úpeft.tuners.tuners_utilsr   r   Ú
peft.utilsr   Úlayerr
   r   r   rH   r   r   Ú<module>rY      s4   ðõ #ã 	Û Ý ã Ý -ç >õ÷ 3ôa�Yõ ar   