ó
    >:j)  ã                  ó¢   • S SK Jr  S SKrS SKrS SKJrJr  S SKrS SKJ	r	  S SK
Jr  S SKJrJr   " S S\5      r " S S	\	R                   \5      rg)
é    )ÚannotationsN)ÚAnyÚOptional)Ú
BufferDict)ÚBaseTunerLayerÚcheck_adapters_to_mergec                  ó¬   • \ rS rSrSrSrSS jr\            SS j5       rSS jr	  S               SS jjr
  S       SS jjrS	rg
)ÚDeloraLayeré   )Údelora_AÚdelora_BÚdelora_lambda)ÚrÚdelora_dropoutÚdelora_w_normc                ó  • Xl         0 U l        [        R                  " 0 5      U l        [        R
                  " 0 5      U l        [        R
                  " 0 5      U l        [        R
                  " 0 5      U l        [        0 SS9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 ['        S[)        U5       35      e)NT)Ú
persistentFzUnsupported layer type )Ú
base_layerr   ÚnnÚ
ModuleDictr   ÚParameterDictr   r   r   r   r   Ú_disable_adaptersÚmerged_adaptersÚkwargsÚget_base_layerÚ
isinstanceÚLinearÚin_featuresÚout_featuresÚ
ValueErrorÚtype)Úselfr   r   Úbase_layer_mods       ÚU/home/mande/repo/quber/.venv/lib/python3.13/site-packages/peft/tuners/delora/layer.pyÚ__init__ÚDeloraLayer.__init__)   sÐ   € Ø$ŒØˆŒÜ Ÿmšm¨BÓ/ˆÔÜ×(Ò(¨Ó,ˆŒÜ×(Ò(¨Ó,ˆŒÜ×-Ò-¨bÓ1ˆÔä'¨°tÑ<ˆÔà!&ˆÔØ!ˆÔØŒà×,Ñ,Ó.ˆÜ�n¤b§i¡i×0Ñ0Ø2@×2LÑ2LÈn×NiÑNiÐ/ˆDÔ˜dÕ/äÐ6´t¸NÓ7KÐ6LÐMÓNÐNó    c                óü   • [         R                  " U R                  SS9SS9n[         R                  " UR                  SS9SS9n[         R                  " X#-  XV-  -  5      nX-  U -  nX„R	                  S5      -  nU$ )zpCompute delta = B @ diag(delora_lambda/r / (||A_i||*||B^j||)) @ A, scaled by provided w_norm (per-input channel)é   ©Údimç-Cëâ6?©Úminr   )ÚtorchÚclampÚnormÚ
diag_embedÚ	unsqueeze)	ÚAÚBr   r   Úw_normÚAnÚBnÚdiagÚdeltas	            r$   Ú_compute_deltaÚDeloraLayer._compute_delta=   su   € ô
 �[Š[˜Ÿ™ A˜˜¨DÑ1ˆÜ�[Š[˜Ÿ™ A˜˜¨DÑ1ˆÜ×Ò Ñ 1°R±WÑ =Ó>ˆØ‘˜1‘ˆØ×(Ñ(¨Ó+Ñ+ˆØˆr'   c                ó  • XR                   ;  d  XR                  ;  a  [        SU S35      eU R                  U R                   U   U R                  U   U R                  U   U R
                  U   U R                  U   5      nU$ )NzAdapter z not found.)r   r   r    r;   r   r   r   )r"   Úadapterr:   s      r$   Úget_delta_weightÚDeloraLayer.get_delta_weightI   s   € ØŸ-™-Ó'¨7¿-¹-Ó+GÜ˜x¨ y°Ð<Ó=Ð=à×#Ñ#Ø�M‰M˜'Ñ"Ø�M‰M˜'Ñ"Ø×Ñ˜wÑ'Ø�F‰F�7‰OØ×Ñ˜wÑ'ó
ˆð ˆr'   c                óö  • US::  a  [        SU 35      eX R                  U'   [        R                  " [        R
                  " X R                  5      5      U R                  U'   [        R                  " [        R
                  " U R                  U5      5      U R                  U'   [        R                  " [        R
                  " S5      5      U R                  U'   US:”  a  [        R                  " US9nO[        R                  " 5       nU R                  R                  [        R                  " X05      5        U R!                  XU5        U R#                  U5        U R%                  U R&                  US9  g)ai  Internal function to create delora adapter

Args:
    adapter_name (`str`): Name for the adapter to add.
    r (`int`): Rank for the added adapter.
    delora_lambda (`float`): Boundary for the adapter's norm.
    module_dropout (`float`): The dropout probability for disabling adapter during training.
    init_weights (`bool`): Whether to initialize weights.
r   z?`r` should be a positive integer value but the value passed is r)   g        )Úp)Úinference_modeN)r    r   r   Ú	Parameterr/   Úemptyr   r   r   r   r   ÚDropoutÚIdentityr   Úupdater   Úreset_delora_parametersÚ%_move_adapter_to_device_of_base_layerÚset_adapterÚactive_adapters)	r"   Úadapter_namer   r   Úmodule_dropoutÚinit_weightsrC   r   Úmodule_dropout_layers	            r$   Úupdate_layerÚDeloraLayer.update_layerV   s  € ð& �‹6ÜÐ^Ð_`Ð^aÐbÓcÐcà �‰ˆ|ÑÜ&(§l¢l´5·;²;¸q×BRÑBRÓ3SÓ&Tˆ�‰�lÑ#Ü&(§l¢l´5·;²;¸t×?PÑ?PÐRSÓ3TÓ&Uˆ�‰�lÑ#Ü+-¯<ª<¼¿ºÀA»Ó+Gˆ×Ñ˜<Ñ(Ø˜CÓÜ#%§:¢:°Ñ#?Ñ ä#%§;¢;£=Ð Ø×Ñ×"Ñ"¤2§=¢=°,Ð1UÓ#VÔWð 	×$Ñ$ \ÀÔOð 	×2Ñ2°<Ô@Ø×Ñ˜×-Ñ-¸nÐÒMr'   c                ó  • XR                   R                  5       ;  a  g USL al  [        R                  R	                  U R                   U   [
        R                  " S5      S9  [        R                  R                  U R                  U   5        O~[        R                  R	                  U R                   U   [
        R                  " S5      S9  [        R                  R	                  U R                  U   [
        R                  " S5      S9  U R                  U   R                  R                  [        U5      5        [        R                  " 5          U R                  5       R                   nUR"                  R$                  S:w  a.  [        R&                  " UR                  SS9R)                  5       nO,[        R*                  " UR,                  S   UR"                  S9nXPR.                  U'   S S S 5        g ! , (       d  f       g = f)	NTé   )ÚaÚmetar   r*   r)   )Údevice)r   Úkeysr   ÚinitÚkaiming_uniform_ÚmathÚsqrtÚzeros_r   r   ÚdataÚfill_Úfloatr/   Úno_gradr   ÚweightrW   r!   r1   ÚdetachÚonesÚshaper   )r"   rM   rO   r   Úwr6   s         r$   rI   Ú#DeloraLayer.reset_delora_parameters}   sY  € ð Ÿ}™}×1Ñ1Ó3Ó3Øà˜4ÒÜ�G‰G×$Ñ$ T§]¡]°<Ñ%@ÄDÇIÂIÈaÃLÐ$ÑQÜ�G‰G�N‰N˜4Ÿ=™=¨Ñ6Õ7ä�G‰G×$Ñ$ T§]¡]°<Ñ%@ÄDÇIÂIÈaÃLÐ$ÑQÜ�G‰G×$Ñ$ T§]¡]°<Ñ%@ÄDÇIÂIÈaÃLÐ$ÑQà×Ñ˜<Ñ(×-Ñ-×3Ñ3´E¸-Ó4HÔIô �]Š]�_Ø×#Ñ#Ó%×,Ñ,ˆAØ�x‰x�}‰} Ó&ÜŸš A§F¡F°Ñ2×9Ñ9Ó;‘ô Ÿš A§G¡G¨A¡J°q·x±xÑ@�Ø/5×Ñ˜|Ñ,÷ �_Ž_ús   ÅBG:Ç:
H)r   r   r   r   r   r   r   r   r   r   r   r   N)r   z	nn.ModuleÚreturnÚNone)r4   útorch.Tensorr5   rj   r   rj   r   Úintr6   rj   rh   rj   )r>   Ústrrh   rj   )TF)rM   rl   r   rk   r   r`   rN   r`   rO   ÚboolrC   rm   r   r   rh   ri   )Tg      .@)rM   rl   rO   rm   r   r`   rh   ri   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Úadapter_layer_namesÚother_param_namesr%   Ústaticmethodr;   r?   rQ   rI   Ú__static_attributes__© r'   r$   r
   r
      sþ   † ðÐðÐôOð( ð	Øð	Ø(ð	Ø9Eð	ØJMð	ØWcð	à	ó	ó ð	ôð& "Ø$ð%Nàð%Nð ð%Nð ð	%Nð
 ð%Nð ð%Nð ð%Nð ð%Nð 
õ%NðT "Ø#ð	6àð6ð ð6ð ð	6ð
 
÷6ð 6r'   r
   c                  óˆ   ^ • \ rS rSr S	           S
U 4S jjjrSSS jjrSS jrSS jrSSS jjrSU 4S jjr	Sr
U =r$ )ÚDeloraLinearéš   c                ó‚   >• [         TU ]  5         [        R                  " X40 UD6  X l        U R	                  X#XEU5        g )N)Úsuperr%   r
   Ú_active_adapterrQ   )	r"   r   rM   r   r   rN   rO   r   Ú	__class__s	           €r$   r%   ÚDeloraLinear.__init__œ   s;   ø€ ô 	‰ÑÔÜ×Ò˜TÑ8°Ò8Ø+ÔØ×Ñ˜,¨=È,ÕWr'   c                ó  • [        X5      nU(       d  gU GH^  nX0R                  R                  5       ;   d  M#  U R                  5       nU R	                  U5      R                  5       R                  UR                  R                  UR                  R                  S9n[        R                  " 5          U(       aq  UR                  R                  R                  5       nXe-   n[        R                  " U5      R                  5       (       d  [!        SU S35      eXdR                  l        O%UR                  R                  R#                  U5        SSS5        U R$                  R'                  U5        GMa     g! , (       d  f       N/= f)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`.
N)ÚdtyperW   z1NaNs detected in the merged weights. The adapter z seems to be broken)r   r   rX   r   r?   rc   Útorb   r€   rW   r/   ra   r^   ÚcloneÚisfiniteÚallr    Úadd_r   Úappend)r"   Ú
safe_mergeÚadapter_namesÚactive_adapterr   Údelta_weightÚorig_weightss          r$   ÚmergeÚDeloraLinear.merge«   s.  € ô 0°ÓDˆÞØä+ˆNØ§¡×!3Ñ!3Ó!5Õ5Ø!×0Ñ0Ó2�
à×)Ñ)¨.Ó9ß‘V“Xß‘R˜j×/Ñ/×5Ñ5¸j×>OÑ>O×>VÑ>V�RÐWð ô
 —]’]•_Þ!Ø'1×'8Ñ'8×'=Ñ'=×'CÑ'CÓ'E˜Ø'3Ñ'B˜ä$Ÿ~š~¨lÓ;×?Ñ?×AÑAÜ",Ø"SÐTbÐScÐcvÐ wó#ð ð 2>×)Ñ)Õ.à"×)Ñ)×.Ñ.×3Ñ3°LÔA÷ %ð ×$Ñ$×+Ñ+¨N×;ò- ,÷ %•_ús   Â3BE:Å:
F	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                  5       R                  =R                  U R                  U5      -  sl
        [        U R                  5      S:”  a  MŽ  gg)z:
Unmerge all merged adapter layers from the base weights.
z Already unmerged. Nothing to do.Nr   )ÚmergedÚwarningsÚwarnÚlenr   Úpopr   rX   r   rb   r^   r?   )r"   r‰   s     r$   ÚunmergeÚDeloraLinear.unmergeÔ   s•   € ð �{�{Ü�MŠMÐ<Ô=ØÜ�$×&Ñ&Ó'¨!Ó+Ø!×1Ñ1×5Ñ5Ó7ˆNØ§¡×!3Ñ!3Ó!5Ó5Ø×#Ñ#Ó%×,Ñ,×1Ò1°T×5JÑ5JÈ>Ó5ZÑZÕ1ô �$×&Ñ&Ó'¨!×+r'   c                ó~  • 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O¬U R
                  (       d%  U R                  " U/UQ70 UD6R                  U5      $ U R                  " U/UQ70 UD6n[        R                  " U5      nU R
                   GH  nX€R                  ;  a  M  U R                  U   " U5      n	[        R                  R                  X�R                  U   -  U R                  U   5      n
[        R                  " U R                  U   R!                  SS9SS9n[        R                  " U R"                  U   R!                  SS9SS9nU R$                  U   U R&                  U   -  X¼-  -  nX­-  n
[        R                  R                  X R"                  U   5      n
Xz-  nGM     XgR                  UR                   5      -   nUR                  U5      nU$ )Nr)   r*   r,   r-   r   )r€   Údisable_adaptersr�   r”   r   rL   r�   r/   Ú
zeros_liker   r   r   Ú
functionalÚlinearr   r0   r1   r   r   r   )r"   ÚxÚargsr   Úprevious_dtypeÚresultÚbase_outÚadd_outr>   Úx_dÚhr7   r8   Úscalings                 r$   ÚforwardÚDeloraLinear.forwardà   sÝ  € ØŸ™ˆà× × Ø�{�{Ø—‘”Ø—_’_ QÐ8¨Ò8°Ñ8ŠFØ�[�[Ø—_’_ QÐ8¨Ò8°Ñ8ŠFà×'×'Ø—’ qÐ:¨4Ò:°6Ñ:×=Ñ=¸nÓMÐMà—’ qÐ:¨4Ò:°6Ñ:ˆHÜ×&Ò& xÓ0ˆGà×/Õ/�Ø§-¡-Ó/Ùà×)Ñ)¨'Ò2°1Ó5�ô —M‘M×(Ñ(¨×/AÑ/AÀ'Ñ/JÑ)JÈDÏMÉMÐZaÑLbÓc�ô —[’[ §¡¨wÑ!7×!<Ñ!<ÀÐ!<Ð!CÈÑN�Ü—[’[ §¡¨wÑ!7×!<Ñ!<ÀÐ!<Ð!CÈÑN�Ø×-Ñ-¨gÑ6¸¿¹À¹ÑHÈRÉWÑU�à‘K�ô —M‘M×(Ñ(¨¯M©M¸'Ñ,BÓC�à‘“ñ) 0ð, §
¡
¨8¯>©>Ó :Ñ:ˆFà—‘˜>Ó*ˆØˆr'   c                ó   • g)NTrv   )r"   rM   s     r$   Úsupports_lora_conversionÚ%DeloraLinear.supports_lora_conversion  s   € Ør'   c                ó*   >• [         TU ]  5       nSU-   $ )Nzdelora.)r{   Ú__repr__)r"   Úrepr}   s     €r$   rª   ÚDeloraLinear.__repr__  s   ø€ Ü‰gÑÓ ˆØ˜3‰Ðr'   )r|   )T)rM   rl   r   rk   r   r`   rN   r`   rO   rm   rh   ri   )FN)r‡   rm   rˆ   zOptional[list[str]]rh   ri   )rh   ri   )r›   rj   rœ   r   r   r   rh   rj   )Údefault)rM   rl   rh   rm   )rh   rl   )rn   ro   rp   rq   r%   rŒ   r”   r¤   r§   rª   ru   Ú__classcell__)r}   s   @r$   rx   rx   š   sw   ø† ð "ðXð ðXð ð	Xð
 ðXð ðXð ðXð 
÷Xð Xö'<ôR
[ô)öV÷õ r'   rx   )Ú
__future__r   r[   r�   Útypingr   r   r/   Útorch.nnr   Úpeft.tuners._buffer_dictr   Úpeft.tuners.tuners_utilsr   r   r
   ÚModulerx   rv   r'   r$   Ú<module>rµ      sB   ðõ #ã Û ß  ã Ý å /ß Lô|6�.ô |6ô~v�2—9‘9˜kõ vr'   