ó
    >:jì"  ã                   ó°   • S SK r S SKJrJrJr  S SKrS SKJr  S SKJs  J	r
  S SKJr  S SKJrJr  S SKJr   " S S\5      r " S S	\R&                  \5      rg)
é    N)ÚAnyÚOptionalÚUnion)ÚConv1D)ÚBaseTunerLayerÚcheck_adapters_to_merge)Ú	transposec                   ó¦   • \ rS rSrSrSrS\R                  SS4S jr SS\	4S	 jjr
\R                  " 5       S
 5       rS\R                  4S jrSrg)ÚFourierFTLayeré   )Úfourierft_spectrum)Úfourierft_n_frequencyÚfourierft_scalingÚfourierft_random_loc_seedÚ
base_layerÚreturnNc                 óL  • Xl         0 U l        0 U l        [        R                  " 0 5      U l        0 U l        0 U l        SU l        / U l	        X l
        U R                  5       n[        U[        R                  5      (       a$  UR                  UR                  sU l        U l        g [        U[         5      (       aU  [#        UR$                  S5      (       a  UR$                  R&                  OUR$                  R(                  u  U l        U l        g [+        S[-        U5       35      e)NFÚds_shapezUnsupported layer type )r   r   r   ÚnnÚParameterDictr   Úindicesr   Ú_disable_adaptersÚmerged_adaptersÚkwargsÚget_base_layerÚ
isinstanceÚLinearÚin_featuresÚout_featuresr   ÚhasattrÚweightr   ÚshapeÚ
ValueErrorÚtype)Úselfr   r   s      ÚX/home/mande/repo/quber/.venv/lib/python3.13/site-packages/peft/tuners/fourierft/layer.pyÚ__init__ÚFourierFTLayer.__init__!   sò   € Ø$ŒØ%'ˆÔ"Ø!#ˆÔÜ"$×"2Ò"2°2Ó"6ˆÔØˆŒØ)+ˆÔ&à!&ˆÔØ!ˆÔØŒà×(Ñ(Ó*ˆ
Ü�j¤"§)¡)×,Ñ,Ø2<×2HÑ2HÈ*×JaÑJaÐ/ˆDÔ˜dÕ/Ü˜
¤F×+Ñ+ä.5°j×6GÑ6GÈ×.TÑ.T�
×!Ñ!×*Ò*ÐZd×ZkÑZk×ZqÑZqñ 0ˆDÔ˜dÕ/ô Ð6´t¸JÓ7GÐ6HÐIÓJÐJó    Úinference_modec                 ó€  • US::  a  [        SU 35      eX R                  U R                  -  :”  a(  [        SU SU R                  U R                  -   35      eX R                  U'   XPR                  U'   [
        R                  " U R                  U R                  -  [
        R                  " 5       R                  U R                  U   5      S9S U U R                  U'   [
        R                  " U R                  U   U R                  -  U R                  U   U R                  -  /SS9U R                  U'   X0R                  U'   [        R                  " [
        R                  " U5      SS9U R                  U'   U(       a  U R!                  U5        U R#                  U5        U R%                  U R&                  US	9  g )
Nr   zI`n_frequency` should be a positive integer value but the value passed is zu`n_frequency` should be less than or equal to the product of the input and output dimensions but the value passed is z and the product is )Ú	generator)ÚdimT)Úrequires_grad)r*   )r#   r   r   r   r   ÚtorchÚrandpermÚ	GeneratorÚmanual_seedr   Ústackr   r   Ú	ParameterÚrandnr   Úreset_fourier_parametersÚ%_move_adapter_to_device_of_base_layerÚset_adapterÚactive_adapters)r%   Úadapter_nameÚn_frequencyÚscalingÚinit_weightsÚrandom_loc_seedr*   r   s           r&   Úupdate_layerÚFourierFTLayer.update_layer7   sŸ  € ð ˜!ÓÜÐhÐitÐhuÐvÓwÐwØ×)Ñ)¨D×,=Ñ,=Ñ=Ó=Üð+Ø+6¨-Ð7KÈD×L\ÑL\Ð_c×_pÑ_pÑLpÐKqðsóð ð 4?×"Ñ" <Ñ0Ø7F×&Ñ& |Ñ4Ü%*§^¢^Ø×Ñ × 0Ñ 0Ñ0Ü—o’oÓ'×3Ñ3°D×4RÑ4RÐS_Ñ4`Óañ&
ð ˆ;ð&ˆ�‰�\Ñ"ô &+§[¢[Ø�\‰\˜,Ñ'¨4×+;Ñ+;Ñ;¸T¿\¹\È,Ñ=WÐZ^×ZjÑZjÑ=jÐkÐqrñ&
ˆ�‰�\Ñ"ð 07×Ñ˜|Ñ,ä02·²¼U¿[º[ÈÓ=UÐeiÑ0jˆ×Ñ Ñ-æØ×)Ñ)¨,Ô7à×2Ñ2°<Ô@Ø×Ñ˜×-Ñ-¸nÐÒMr)   c                 ó˜   • XR                   R                  5       ;   a-  [        R                  R	                  U R                   U   5        g g ©N)r   Úkeysr   ÚinitÚzeros_©r%   r:   s     r&   r6   Ú'FourierFTLayer.reset_fourier_parametersT   s7   € à×2Ñ2×7Ñ7Ó9Ó9Ü�G‰G�N‰N˜4×2Ñ2°<Ñ@ÕAð :r)   c                 óÄ  • U R                   U   nU R                  U   R                  UR                  5      n[        R
                  " U R                  U R                  UR                  S9nUR                  5       XCSS S 24   USS S 24   4'   [        R                  R                  U5      R                  U R                  U   -  nUR                  UR                  5      $ )N)Údevicer   é   )r   r   ÚtorI   r/   Úzerosr   r   ÚfloatÚfftÚifft2Úrealr   Údtype)r%   ÚadapterÚspectrumr   Údense_spectrumÚdelta_weights         r&   Úget_delta_weightÚFourierFTLayer.get_delta_weightY   s´   € à×*Ñ*¨7Ñ3ˆØ—,‘,˜wÑ'×*Ñ*¨8¯?©?Ó;ˆÜŸš T×%6Ñ%6¸×8HÑ8HÐQY×Q`ÑQ`ÑaˆØ7?·~±~Ó7Gˆ˜q¢!˜t‘} g¨a²¨d¡mÐ3Ñ4Ü—y‘y—‘ ~Ó6×;Ñ;¸d×>TÑ>TÐU\Ñ>]Ñ]ˆØ�‰˜xŸ~™~Ó.Ð.r)   )r   r   r   r   r   r   r   r   r   r   r   )F)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Úadapter_layer_namesÚother_param_namesr   ÚModuler'   Úboolr?   r/   Úno_gradr6   ÚTensorrV   Ú__static_attributes__© r)   r&   r   r      sj   † à1ÐàcÐðK 2§9¡9ð K¸4ô Kð. inñNØaeõNð: ‡]‚]ƒ_ñBó ðBð/¨5¯<©<÷ /r)   r   c                   óü   ^ • \ rS rSr     SS\S\S\S\S\\\4   S\SS	4U 4S
 jjjr	SS\S\
\\      SS	4S jjrSS jrS\R                  S\S\S\R                  4S jrSS\S\4S jjrS\4U 4S jjrSrU =r$ )ÚFourierFTLinearéc   r:   r;   r<   Úfan_in_fan_outr=   r>   r   Nc                 óŽ   >• [         T	U ]  5         [        R                  " X40 UD6  XPl        X l        U R                  X#XFU5        g rB   )Úsuperr'   r   rg   Ú_active_adapterr?   )
r%   r   r:   r;   r<   rg   r=   r>   r   Ú	__class__s
            €r&   r'   ÚFourierFTLinear.__init__e   sA   ø€ ô 	‰ÑÔÜ×Ò Ñ;°FÒ;Ø,ÔØ+ÔØ×Ñ˜,°WÈOÕ\r)   Ú
safe_mergeÚadapter_namesc                 ó�  • [        X5      nU(       d  gU GH,  nX0R                  R                  5       ;   d  M#  U R                  5       nU(       a•  UR                  R
                  R                  5       nU[        U R                  U5      U R                  5      -  n[        R                  " U5      R                  5       (       d  [        SU S35      eXTR                  l        OBUR                  =R
                  [        U R                  U5      U R                  5      -  sl        U R                  R                  U5        GM/     g)a  
Merge the active adapter weights into the base weights

Args:
    safe_merge (`bool`, *optional*):
        If True, the merge operation will be performed in a copy of the original weights and check for NaNs
        before merging the weights. This is useful if you want to check if the merge operation will produce
        NaNs. Defaults to `False`.
    adapter_names (`List[str]`, *optional*):
        The list of adapter names that should be merged. If None, all active adapters will be merged. Defaults
        to `None`.
Nz1NaNs detected in the merged weights. The adapter z seems to be broken)r   r   rC   r   r!   ÚdataÚcloner	   rV   rg   r/   ÚisfiniteÚallr#   r   Úappend)r%   rm   rn   Úactive_adapterr   Úorig_weightss         r&   ÚmergeÚFourierFTLinear.mergev   s	  € ô 0°ÓDˆÞàä+ˆNØ×!8Ñ!8×!=Ñ!=Ó!?Õ?Ø!×0Ñ0Ó2�
Þð $.×#4Ñ#4×#9Ñ#9×#?Ñ#?Ó#A�LØ ¤I¨d×.CÑ.CÀNÓ.SÐUY×UhÑUhÓ$iÑi�Lä Ÿ>š>¨,Ó7×;Ñ;×=Ñ=Ü(ØOÐP^ÐO_Ð_rÐsóð ð .:×%Ñ%Õ*à×%Ñ%×*Ò*¬i¸×8MÑ8MÈnÓ8]Ð_c×_rÑ_rÓ.sÑsÕ*Ø×$Ñ$×+Ñ+¨N×;ò# ,r)   c                 óÌ  • U R                   (       d  [        R                  " S5        g[        U R                  5      S:”  a£  U R                  R                  5       nXR                  R                  5       ;   aP  U R                  5       R                  =R                  [        U R                  U5      U R                  5      -  sl
        [        U R                  5      S:”  a  M¢  gg)zG
This method unmerges all merged adapter layers from the base weights.
z Already unmerged. Nothing to do.Nr   )ÚmergedÚwarningsÚwarnÚlenr   Úpopr   rC   r   r!   rp   r	   rV   rg   )r%   ru   s     r&   ÚunmergeÚFourierFTLinear.unmerge›   s©   € ð �{�{Ü�MŠMÐ<Ô=ØÜ�$×&Ñ&Ó'¨!Ó+Ø!×1Ñ1×5Ñ5Ó7ˆNØ×!8Ñ!8×!=Ñ!=Ó!?Ó?Ø×#Ñ#Ó%×,Ñ,×1Ò1´YØ×)Ñ)¨.Ó9¸4×;NÑ;Nó6ñ Õ1ô �$×&Ñ&Ó'¨!×+r)   ÚxÚargsr   c                 ó<  • UR                   nU R                  (       a8  U R                  (       a  U R                  5         U R                  " U/UQ70 UD6nOµU R                  (       a  U R                  " U/UQ70 UD6nO�U R                  " U/UQ70 UD6nU R
                   Hg  nX`R                  R                  5       ;  a  M"  U R                  U5      nUR                  UR                   5      nU[        R                  " X5      -   nMi     UR                  U5      nU$ rB   )rQ   Údisable_adaptersrz   r   r   r9   r   rC   rV   rK   ÚFÚlinear)r%   r�   r‚   r   Úprevious_dtypeÚresultru   Údelta_ws           r&   ÚforwardÚFourierFTLinear.forward©   så   € ØŸ™ˆà× × Ø�{�{Ø—‘”Ø—_’_ QÐ8¨Ò8°Ñ8‰FØ�[�[Ø—_’_ QÐ8¨Ò8°Ñ8‰Fà—_’_ QÐ8¨Ò8°Ñ8ˆFØ"&×"6Ô"6�Ø!×)@Ñ)@×)EÑ)EÓ)GÓGÙà×/Ñ/°Ó?�Ø—D‘D˜Ÿ™Ó'�Ø¤!§(¢(¨1Ó"6Ñ6’ñ #7ð —‘˜>Ó*ˆØˆr)   c                 óL   • [        U R                  5       [        5      (       a  gg)NFT)r   r   r   rF   s     r&   Úsupports_lora_conversionÚ(FourierFTLinear.supports_lora_conversion¿   s    € Ü�d×)Ñ)Ó+¬V×4Ñ4ð Ør)   c                 ó*   >• [         TU ]  5       nSU-   $ )Nz
fourierft.)ri   Ú__repr__)r%   Úreprk   s     €r&   r�   ÚFourierFTLinear.__repr__Æ   s   ø€ Ü‰gÑÓ ˆØ˜cÑ!Ð!r)   )rj   rg   )iè  g     Àb@FFi	  )FN)r   N)Údefault)rX   rY   rZ   r[   ÚstrÚintrM   r_   r   r'   r   Úlistrw   r   r/   ra   r   rŠ   r�   r�   rb   Ú__classcell__)rk   s   @r&   re   re   c   sí   ø† ð  ØØ$Ø).Ø"ñ]ð ð]ð ð	]ð
 ð]ð ð]ð ˜D #˜IÑ&ð]ð ð]ð 
÷]ð ]ñ"#< ð #<¸XÀdÈ3ÁiÑ=Pð #<Ð\`õ #<ôJð˜Ÿ™ð ¨cð ¸Sð ÀUÇ\Á\ô ñ,°Sð Èõ ð"˜#÷ "õ "r)   re   )r{   Útypingr   r   r   r/   Útorch.nnr   Útorch.nn.functionalÚ
functionalr…   Útransformers.pytorch_utilsr   Úpeft.tuners.tuners_utilsr   r   Úpeft.utils.otherr	   r   r^   re   rc   r)   r&   Ú<module>rŸ      sH   ðó ß 'Ñ 'ã Ý ß Ð Ý -ç LÝ &ôE/�^ô E/ôPe"�b—i‘i õ e"r)   