ó
    >:je>  ã                   óš   • 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  S SK	J
r
  S SKJr   " S S\
5      r " S S	\R                  \5      rg)
é    N)ÚOptional)ÚConv1D)ÚBaseTunerLayer)Ú	transposec                   ó^   • \ rS rSrSrSrS\R                  4S jr   SS\	S\	S\
4S	 jjrS
rg)ÚGraloraLayeré   )Ú	gralora_AÚ	gralora_BÚgralora_A_generalÚgralora_B_general)ÚrÚhybrid_rÚalphaÚscalingÚgralora_dropoutÚ
base_layerc                 ó  • Xl         0 U l        0 U l        0 U l        0 U l        0 U l        [        R                  " 0 5      U l        [        R                  " 0 5      U l
        [        R                  " 0 5      U l        [        R                  " 0 5      U l        [        R                  " 0 5      U l        SU l        / U l        U R!                  5       n[#        U[        R$                  5      (       a  UR&                  UR(                  pCOv[#        U[*        5      (       aJ  [-        UR.                  S5      (       a  UR.                  R0                  OUR.                  R2                  u  p4O[5        S[7        U5       35      eX0l        X@l        X l        g )NFÚds_shapezUnsupported layer type )r   r   r   Ú	gralora_kr   r   ÚnnÚ
ModuleDictr   ÚParameterDictr
   r   r   r   Ú_disable_adaptersÚmerged_adaptersÚget_base_layerÚ
isinstanceÚLinearÚin_featuresÚout_featuresr   ÚhasattrÚweightr   ÚshapeÚNotImplementedErrorÚtypeÚkwargs)Úselfr   r&   r   r    s        ÚV/home/mande/repo/quber/.venv/lib/python3.13/site-packages/peft/tuners/gralora/layer.pyÚ__init__ÚGraloraLayer.__init__    s7  € Ø$ŒØˆŒØˆŒ
ØˆŒØˆŒØˆŒÜ!Ÿ}š}¨RÓ0ˆÔä×)Ò)¨"Ó-ˆŒÜ×)Ò)¨"Ó-ˆŒÜ!#§¢¨rÓ!2ˆÔÜ!#§¢¨rÓ!2ˆÔð "'ˆÔØ!ˆÔà×(Ñ(Ó*ˆ
Ü�j¤"§)¡)×,Ñ,Ø(2×(>Ñ(>À
×@WÑ@W™Ü˜
¤F×+Ñ+ä.5°j×6GÑ6GÈ×.TÑ.T�
×!Ñ!×*Ò*ÐZd×ZkÑZk×ZqÑZqñ &ˆK˜ô &Ð(?ÄÀZÓ@PÐ?QÐ&RÓSÐSà&ÔØ(ÔØ�ó    r   r   Úinit_weightsc	                 ó¶	  • US::  a  [        SU 35      eUS:  a  [        SU 35      eX0R                  U'   X@R                  U'   X`R                  U'   XpR                  U'   US:”  a  [
        R                  " US9n	O[
        R                  " 5       n	U R                  R                  [
        R                  " X05      5        U R                  U-  S:w  a  [        SU R                   SU 35      eU R                  U-  S:w  a  [        SU R                   SU 35      eU R                  U-  n
U R                  U-  nUn/ n/ n[        U5       GH7  n[
        R                  " [        R                   " XÊ5      5      n[
        R                  " [        R                   " X¼5      5      nU(       aR  [
        R"                  R%                  U[&        R(                  " S	5      S
9  [
        R"                  R+                  U5        Od[
        R"                  R%                  U[&        R(                  " S	5      S
9  [
        R"                  R%                  U[&        R(                  " S	5      S
9  UR-                  U5        UR-                  U5        GM:     [        R.                  " [1        U5      SS9nUR3                  SS5      R5                  5       n[        R.                  " [1        U5      SS9nUR3                  SS5      R5                  5       nUS:”  Ga%  [
        R6                  " U R                  USS9n[
        R6                  " XpR                  SS9nU(       af  [
        R"                  R%                  UR8                  [&        R(                  " S	5      S
9  [
        R"                  R+                  UR8                  5        O£[
        R"                  R%                  UR8                  [&        R(                  " S	5      S
9  [
        R"                  R%                  UR8                  [&        R(                  " S	5      S
9  O*[
        R                  " 5       n[
        R                  " 5       nXÐR:                  U'   XàR<                  U'   UU R>                  U'   UU R@                  U'   X l!        XLU-   -  U RD                  U'   U RG                  U5        U RI                  U RJ                  5        g )Nr   z?`r` should be a positive integer value but the value passed is zJ`hybrid_r` should be a non-negative integer value but the value passed is ç        )Úpz6in_features should be divisible by gralora_k, but got z and z7out_features should be divisible by gralora_k, but got é   )Úa)Údimé   é   F)Úbias)&Ú
ValueErrorr   r   r   r   r   ÚDropoutÚIdentityr   Úupdater   r   r    ÚrangeÚ	ParameterÚtorchÚemptyÚinitÚkaiming_uniform_ÚmathÚsqrtÚzeros_ÚappendÚstackÚtupler   Ú
contiguousr   r"   r
   r   r   r   Úmodule_namer   Ú%_move_adapter_to_device_of_base_layerÚset_adapterÚactive_adapters)r'   Úadapter_namerG   r   r   r   r   r   r,   Úgralora_dropout_layerÚsubblock_in_featuresÚsubblock_out_featuresÚ	gralora_rr
   r   Ú_Únew_AÚnew_BÚgeneral_gralora_AÚgeneral_gralora_Bs                       r(   Úupdate_layerÚGraloraLayer.update_layer@   sÝ  € ð �‹6ÜÐ^Ð_`Ð^aÐbÓcÐcØ˜‹\ÜÐiÐjrÐisÐtÓuÐuà �‰ˆ|ÑØ#(�
‰
�<Ñ Ø'0�‰�|Ñ$Ø&.�‰�lÑ#à˜SÓ Ü$&§J¢J°Ñ$AÑ!ä$&§K¢K£MÐ!à×Ñ×#Ñ#¤B§M¢M°<Ð2WÓ$XÔYð ×Ñ˜iÑ'¨1Ó,ÜØHÈ×IYÑIYÐHZÐZ_Ð`iÐ_jÐkóð ð ×Ñ˜yÑ(¨AÓ-ÜØIÈ$×J[ÑJ[ÐI\Ð\aÐbkÐalÐmóð ð  $×/Ñ/°9Ñ<ÐØ $× 1Ñ 1°YÑ >Ðð ˆ	àˆ	Øˆ	Ü�y×!ˆAÜ—L’L¤§¢¨YÓ!MÓNˆEÜ—L’L¤§¢Ð-BÓ!NÓOˆEÞä—‘×(Ñ(¨´$·)²)¸A³,Ð(Ñ?Ü—‘—‘˜uÕ%ô —‘×(Ñ(¨´$·)²)¸A³,Ð(Ñ?Ü—‘×(Ñ(¨´$·)²)¸A³,Ð(Ñ?Ø×Ñ˜UÔ#Ø×Ñ˜U×#ñ "ô —K’K¤ iÓ 0°aÑ8ˆ	Ø×'Ñ'¨¨1Ó-×8Ñ8Ó:ˆ	ä—K’K¤ iÓ 0°aÑ8ˆ	Ø×'Ñ'¨¨1Ó-×8Ñ8Ó:ˆ	à�aŒ<Ü "§	¢	¨$×*:Ñ*:¸HÈ5Ñ QÐÜ "§	¢	¨(×4EÑ4EÈEÑ RÐÞä—‘×(Ñ(Ð):×)AÑ)AÄTÇYÂYÈqÃ\Ð(ÑRÜ—‘—‘Ð0×7Ñ7Õ8ô —‘×(Ñ(Ð):×)AÑ)AÄTÇYÂYÈqÃ\Ð(ÑRÜ—‘×(Ñ(Ð):×)AÑ)AÄTÇYÂYÈqÃ\Ð(ÒRä "§¢£ÐÜ "§¢£Ðà'0�‰�|Ñ$Ø'0�‰�|Ñ$Ø/@ˆ×Ñ˜|Ñ,Ø/@ˆ×Ñ˜|Ñ,à&Ôà%*¸(Ñ.BÑ%Cˆ�‰�\Ñ"Ø×2Ñ2°<Ô@Ø×Ñ˜×-Ñ-Õ.r+   )r   r   r   r
   r   r   r   r   r   r   r   r&   r   rG   r    r   r   N)r4   r   T)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Úadapter_layer_namesÚother_param_namesr   ÚModuler)   ÚintÚboolrU   Ú__static_attributes__© r+   r(   r   r      sW   † à^ÐØPÐð 2§9¡9ô ðN ØØ!ñY/ð ðY/ð ðY/ð ÷Y/ð Y/r+   r   c                   ó  ^ • \ rS rSr       SS\S\S\S\S\S\S\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                  4S jrS\R                  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$ )r   éœ   rK   r   r   r   r   r   Úfan_in_fan_outr,   ÚreturnNc           
      ó¬   >• [         [        R                  U ]  5         [        R                  " X40 UD6  X�l        X l        U R                  X#XEXgXŠ5        g )N)Úsuperr   r   r)   r   rd   Ú_active_adapterrU   )r'   r   rK   rG   r   r   r   r   r   rd   r,   r&   Ú	__class__s               €r(   r)   ÚLinear.__init__ž   sJ   ø€ ô 	Œb�i‰i˜Ñ'Ô)Ü×Ò˜dÑ9°&Ò9Ø,Ôà+ÔØ×Ñ˜,°Q¸Ð[cÕrr+   Ú
safe_mergeÚadapter_namesc                 óL  • SSK Jn  U" X5      nU(       d  gU GH  nX@R                  R                  5       ;   d  M#  U R	                  5       nU(       a‚  UR
                  R                  R                  5       nU R                  U5      nXg-  n[        R                  " U5      R                  5       (       d  [        SU S35      eXeR
                  l        O0U R                  U5      nUR
                  =R                  U-  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`.
r   )Úcheck_adapters_to_mergeNz1NaNs detected in the merged weights. The adapter z seems to be broken)Úpeft.tuners.tuners_utilsrn   r
   Úkeysr   r"   ÚdataÚcloneÚget_delta_weightr<   ÚisfiniteÚallr6   r   rC   )r'   rk   rl   rn   Úactive_adapterr   Úorig_weightsÚdelta_weights           r(   ÚmergeÚLinear.merge´   s÷   € õ 	Eá/°ÓDˆÞàä+ˆNØ§¡×!4Ñ!4Ó!6Õ6Ø!×0Ñ0Ó2�
Þð $.×#4Ñ#4×#9Ñ#9×#?Ñ#?Ó#A�LØ#'×#8Ñ#8¸Ó#H�LØ Ñ0�Lä Ÿ>š>¨,Ó7×;Ñ;×=Ñ=Ü(ØOÐP^ÐO_Ð_rÐsóð ð .:×%Ñ%Õ*à#'×#8Ñ#8¸Ó#H�LØ×%Ñ%×*Ò*¨lÑ:Õ*à×$Ñ$×+Ñ+¨N×;ò) ,r+   c                 ó¨  • U R                   (       d  [        R                  " S5        g[        U R                  5      S:”  a‘  U R                  R                  5       nXR                  R                  5       ;   a>  U R                  U5      nU R                  5       R                  =R                  U-  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
   rp   rs   r   r"   rq   )r'   rv   rx   s      r(   ÚunmergeÚLinear.unmergeÞ   sš   € ð �{�{Ü�MŠMÐ<Ô=Øä�$×&Ñ&Ó'¨!Ó+Ø!×1Ñ1×5Ñ5Ó7ˆNØ§¡×!4Ñ!4Ó!6Ó6Ø#×4Ñ4°^ÓD�Ø×#Ñ#Ó%×,Ñ,×1Ò1°\ÑAÕ1ô	 �$×&Ñ&Ó'¨!×+r+   c           	      ó@  • U R                   U   nU R                  U   nU R                  U   nU R                  U   nUR                  nUR
                  nU R                  U   nU R                  U   n	U R                  U   n
UR                  S:H  =(       a-    U[        R                  :H  =(       d    U[        R                  :H  nU(       a   UR                  5       nUR                  5       nU R                  nU R                  nU
nXè-  n[        R                   " XÆS9nUXÈ-  -  nUXÈ-  -  n[        R"                  " XÈXæU(       a  [        R$                  OUS9nUR'                  SUR)                  S5      R)                  S5      R+                  SSU5      UUUSS24   R)                  S5      5        [        R,                  " SUR/                  XÈX�5      R1                  S	SSS
5      R3                  XÈU5      U5      R3                  XÍ5      R4                  nU	S	:”  aG  UR6                  nUR6                  nU(       a   UR                  5       nUR                  5       nUUU-  -  n[9        UU R:                  5      U R<                  U   -  nU(       a  UR?                  US9nU$ )an  
Compute the delta weight for GraLoRA adapter.

GraLoRA applies block-wise low-rank adaptation with information exchange. This method computes the equivalent
weight matrix that would be added to the base weight during merge.

Args:
    adapter (str): The name of the adapter

Returns:
    torch.Tensor: The delta weight matrix with shape [out_features, in_features]
Úcpu)Údevice)r…   Údtyper3   r4   éÿÿÿÿNzikr, kro -> ikor   é   )r†   ) r
   r   r   r   r…   r†   r   r   r   r%   r<   Úfloat16Úbfloat16Úfloatr   r    ÚarangeÚzerosÚfloat32Úscatter_Ú	unsqueezeÚexpandÚeinsumÚviewÚpermuteÚreshapeÚTr"   r   rd   r   Úto)r'   Úadapterr
   r   r   r   r…   r†   r   r   r   Úcast_to_fp32r   r    Úgralora_rankÚsubblock_gralora_rankÚ	l_indicesÚ	n_indicesÚ	i_indicesÚgralora_A_scatteredrx   Úweight_A_generalÚweight_B_generals                          r(   rs   ÚLinear.get_delta_weightì   sw  € ð —N‘N 7Ñ+ˆ	Ø—N‘N 7Ñ+ˆ	Ø ×2Ñ2°7Ñ;ÐØ ×2Ñ2°7Ñ;Ðà×!Ñ!ˆØ—‘ˆà—N‘N 7Ñ+ˆ	Ø—=‘= Ñ)ˆØ�F‰F�7‰Oˆð —{‘{ eÑ+×c°¼%¿-¹-Ñ1G×1bÈ5ÔTY×TbÑTbÑKbˆæØ!Ÿ™Ó)ˆIØ!Ÿ™Ó)ˆIð ×&Ñ&ˆØ×(Ñ(ˆØˆØ ,Ñ 9Ðô —L’L Ñ<ˆ	Ø +Ñ":Ñ;ˆ	Ø Ñ!9Ñ:ˆ	Ü#ŸkškØ LÖXdÄuÇ}Â}Ðjoñ
Ðð 	×$Ñ$ØØ×Ñ Ó"×,Ñ,¨QÓ/×6Ñ6°r¸1¸lÓKØ�i ªAÐ-Ñ.×8Ñ8¸Ó;ô	
ô �LŠLØ!Ø#×(Ñ(¨ÀÓbß‘˜˜A˜q !Ó$ß‘˜°Ó>Øó÷ ‰W�[Ó/ß‰Qð 	ð �a‹<Ø0×7Ñ7ÐØ0×7Ñ7ÐæØ#3×#9Ñ#9Ó#;Ð Ø#3×#9Ñ#9Ó#;Ð ð Ð,Ð/?Ñ?Ñ?ˆLô ! ¨t×/BÑ/BÓCÀdÇlÁlÐSZÑF[Ñ[ˆö Ø'Ÿ?™?°˜?Ð7ˆLàÐr+   Úxc                 óÔ  • UR                   nU R                  (       a9  U R                  (       a  U R                  5         U R                  " U/UQ70 UD6nGO€U R                  (       a  U R                  " U/UQ70 UD6nGOWU R                  " U/UQ70 UD6nUR                   nUR
                  S:H  nU(       a  UR                  S5      nU R                   GHý  nX€R                  R                  5       ;  a  M#  U R                  U   n	U R                  U   n
U R                  U   nU R                  U   nU R                  U   nUnU R                  U   nU R                  U   nU R                   U   nU R"                  U   nU	R                   nUR$                  u  nnnUnUU-  n[&        R(                  " S[&        R(                  " SU" UR+                  U5      5      R-                  UUUUU-  5      U	5      R-                  UUUUU5      R/                  SSSSS5      R1                  UUUUU-  5      U
5      R1                  UUS5      nU(       a  UR3                  S5      nUUUR+                  U5      -  -  nUS:”  d  GM«  U" U" U" UR+                  U5      5      5      5      nU(       a  UR3                  S5      nUUUR+                  U5      -  -  nGM      UR+                  U5      nU$ )	Nr4   r3   zbljr, jro -> bljozblni, nir -> blnrr   rˆ   é   r‡   )r†   Údisable_adaptersr|   r�   r   Úndimr�   rJ   r
   rp   r   r   r   r   r   r   r   r   r#   r<   r’   r—   r“   r”   r•   Úsqueeze)r'   r£   Úargsr&   Úprevious_dtypeÚresultÚtorch_result_dtypeÚx_is_2drv   r
   r   r   r   r   rš   r   r   Údropoutr   Úgralora_dtypeÚBÚLr   ÚNr›   ÚoutputÚhybrid_outputs                              r(   ÚforwardÚLinear.forwardA  s®  € ØŸ™ˆà× × Ø�{�{Ø—‘”Ø—_’_ QÐ8¨Ò8°Ñ8ŠFØ�[�[Ø—_’_ QÐ8¨Ò8°Ñ8ŠFà—_’_ QÐ8¨Ò8°Ñ8ˆFØ!'§¡Ðð —f‘f ‘kˆGÞØ—K‘K “N�à"&×"6Õ"6�Ø!¯©×)<Ñ)<Ó)>Ó>ÙØ ŸN™N¨>Ñ:�	Ø ŸN™N¨>Ñ:�	à$(×$:Ñ$:¸>Ñ$JÐ!Ø$(×$:Ñ$:¸>Ñ$JÐ!à—F‘F˜>Ñ*�Ø �Ø ŸN™N¨>Ñ:�	ØŸ=™=¨Ñ8�à×.Ñ.¨~Ñ>�ØŸ,™, ~Ñ6�à )§¡�à$%§G¡GÑ!��1�kØ�Ø(4¸Ñ(9Ð%äŸšØ'Ü—L’LØ+Ù §¡ ]Ó 3Ó4×9Ñ9¸!¸QÀÀ;ÐRSÑCSÓTØ!ó÷
 ‘T˜!˜Q  1Ð&;Ó<ß‘W˜Q  1 a¨Ó+ß‘W˜Q  1 aÐ*?Ñ&?Ó@Øó÷ ‘'˜!˜Q Ó#ð ö Ø#Ÿ^™^¨AÓ.�Fà˜' F§I¡IÐ.@Ó$AÑAÑA�Ø˜a–<Ù$5Ñ6GÉÐPQ×PTÑPTÐUbÓPcÓHdÓ6eÓ$f�MÞØ(5×(=Ñ(=¸aÓ(@˜Ø˜g¨×(8Ñ(8Ð9KÓ(LÑLÑL“Fñ[ #7ð^ —‘˜>Ó*ˆØˆr+   c                 ó   • g)NTra   )r'   rK   s     r(   Úsupports_lora_conversionÚLinear.supports_lora_conversion†  s   € Ør+   c                 ó*   >• [         TU ]  5       nSU-   $ )Nzgralora.)rg   Ú__repr__)r'   Úrepri   s     €r(   r»   ÚLinear.__repr__‰  s   ø€ Ü‰gÑÓ ˆØ˜CÑÐr+   )rh   rd   )r   r3   r.   r4   r   FT)FN)re   N)Údefault)rW   rX   rY   rZ   Ústrr^   r‹   r_   r)   r   Úlistry   r�   r<   ÚTensorrs   rµ   r¸   r»   r`   Ú__classcell__)ri   s   @r(   r   r   œ   s
  ø† ð ØØ!$ØØØ$Ø!ñsð ðsð
 ðsð ðsð ðsð ðsð ðsð ðsð ðsð 
÷sð sñ,(< ð (<¸XÀdÈ3ÁiÑ=Pð (<Ð\`õ (<ôTBðS¨5¯<©<ô SðjC˜Ÿ™ð C¸5¿<¹<ô CñJ°Sð Èõ ð ˜#÷  õ  r+   r   )r@   r}   Útypingr   r<   Útorch.nnr   Útransformers.pytorch_utilsr   ro   r   Úpeft.utils.otherr   r   r   ra   r+   r(   Ú<module>rÇ      sB   ðó Û Ý ã Ý Ý -å 3Ý &ô~/�>ô ~/ôBo ˆR�Y‰Y˜õ o r+   