ó
    >:j�-  ã                  óÚ   • S SK Jr  S SKrS SKJr  S SK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  SSKJrJr   " S	 S
\5      r " S S\
R,                  \5      r      SS jrg)é    )ÚannotationsN)Úpartial)ÚAnyÚOptional)Ú
BufferDict)ÚBaseTunerLayeré   )Údecompose_weight_matrixÚreconstruct_weight_matrixc                  ó~   • \ rS rSr% SrS\S'   SrS\S'   SS jrSS jrSS	 jr	S
 r
SS jrSSS jjrSS jrS rSrg)ÚOSFLayeré!   )Úosf_svd_paramsztuple[str, ...]Úadapter_layer_names)Ú_osf_U_highÚ_osf_S_highÚ_osf_V_highÚother_param_namesc                ó  • Xl         0 U l        [        R                  " 0 5      U l        [        0 5      U l        [        0 5      U l        [        0 5      U l        / U l	        SU l
        / U l        U R                  5       n[        US5      (       a]  [        UR                  [         R"                  5      (       a4  UR                  R$                  S:X  a  UR                  R&                  u  p4GO[        U[        R(                  5      (       a  UR*                  UR,                  p4OÚ[        US5      (       a)  [        US5      (       a  UR.                  UR0                  p4O [        US5      (       a)  [        US5      (       a  UR2                  UR4                  p4Of[        US5      (       a)  [        US	5      (       a  UR*                  UR,                  p4O,S
u  pC[6        R8                  " S[;        U5       S3[<        5        X@l        X0l        g )NFÚweighté   Ú
infeaturesÚoutfeaturesÚ
input_sizeÚoutput_sizeÚin_featuresÚout_features)NNzUnsupported layer type 'z/' encountered; could not infer in/out features.)Ú
base_layerÚeffective_rankÚnnÚ
ModuleDictr   r   r   r   r   Úhook_handlesÚ_disable_adaptersÚmerged_adaptersÚget_base_layerÚhasattrÚ
isinstancer   ÚtorchÚTensorÚndimÚshapeÚLinearr   r   r   r   r   r   ÚwarningsÚwarnÚtypeÚUserWarning)Úselfr   Úkwargsr   r   s        ÚR/home/mande/repo/quber/.venv/lib/python3.13/site-packages/peft/tuners/osf/layer.pyÚ__init__ÚOSFLayer.__init__'   sž  € Ø$ŒØ ˆÔä Ÿmšm¨BÓ/ˆÔä% b›>ˆÔÜ% b›>ˆÔÜ% b›>ˆÔàˆÔà!&ˆÔØ!ˆÔð ×(Ñ(Ó*ˆ
ô �J ×)Ñ)Ü˜:×,Ñ,¬e¯l©l×;Ñ;Ø×!Ñ!×&Ñ&¨!Ó+ð )3×(9Ñ(9×(?Ñ(?Ñ%ˆL™+Ü˜
¤B§I¡I×.Ñ.Ø(2×(>Ñ(>À
×@WÑ@W™Ü�Z ×.Ñ.´7¸:À}×3UÑ3Uà(2×(=Ñ(=¸z×?UÑ?U™Ü�Z ×.Ñ.´7¸:À}×3UÑ3Uà(2×(=Ñ(=¸z×?UÑ?U™Ü�Z ×/Ñ/´G¸JÈ×4WÑ4WØ(2×(>Ñ(>À
×@WÑ@W™à(2Ñ%ˆKÜ�MŠMØ*¬4°
Ó+;Ð*<Ð<kÐlÜôð
 'ÔØ(Õó    c                óÌ  • US::  a  [        SU 35      eX R                  U'   U R                  5       nUR                  R                  n[        XRS9nUS   U R                  U'   US   U R                  U'   US   U R                  U'   [        R                  " US   US   US	   S
.5      nXpR                  U'   U R                  U5        U R                  U R                  5        g)z&Update layer to add a new OSF adapter.r   zL`effective_rank` should be a positive integer value but the value passed is )Útop_kÚU_highÚS_highÚV_highÚU_lowÚS_lowÚV_low)r<   r=   r>   N)Ú
ValueErrorr   r%   r   Údatar
   r   r   r   r    ÚParameterDictr   Ú_attach_hooksÚset_adapterÚactive_adapters)r1   Úadapter_namer   r2   r   r   Úsvd_dictÚ
svd_paramss           r3   Úupdate_layerÚOSFLayer.update_layerT   s  € à˜QÓÜØ^Ð_mÐ^nÐoóð ð
 -;×Ñ˜LÑ)ð ×(Ñ(Ó*ˆ
Ø×"Ñ"×'Ñ'ˆÜ*¨6ÑHˆð *2°(Ñ);ˆ×Ñ˜Ñ&Ø)1°(Ñ);ˆ×Ñ˜Ñ&Ø)1°(Ñ);ˆ×Ñ˜Ñ&ô ×%Ò%à! 'Ñ*Ø! 'Ñ*Ø! 'Ñ*ñó
ˆ
ð -7×Ñ˜LÑ)ð 	×Ñ˜<Ô(ð 	×Ñ˜×-Ñ-Õ.r6   c           	     óø   • XR                   ;  a  gU R                   U   nSS jnUS   R                  [        USXS95      nUS   R                  [        USXS95      nU R                  R	                  XE/5        g)z,Attach gradient hooks for the given adapter.Nc                óÆ   • US:X  a*  UR                   U   nXDR                  SS5      U -  -  nX-
  $ US:X  a*  UR                  U   nXR                  SS5      -  U-  nX-
  $ U $ )Nr<   r   r	   r>   )r   Ú	transposer   )ÚgradÚnameÚadapterÚlayerr9   Úprojr;   s          r3   ÚhookÚ$OSFLayer._attach_hooks.<locals>.hook   s{   € ð �w‹Ø×*Ñ*¨7Ñ3�Ø×!1Ñ!1°!°QÓ!7¸$Ñ!>Ñ?�Ø‘{Ð"Ø˜“Ø×*Ñ*¨7Ñ3�Ø×/Ñ/°°1Ó5Ñ5¸Ñ?�Ø‘{Ð"ØˆKr6   r<   )rN   rO   rP   r>   )rN   ÚstrrO   rT   rP   r   )r   Úregister_hookr   r"   Úextend)r1   rE   Ú
svd_modulerR   Úhandle_uÚhandle_vs         r3   rB   ÚOSFLayer._attach_hooksx   s}   € à×2Ñ2Ó2Øà×(Ñ(¨Ñ6ˆ
ô	ð ˜gÑ&×4Ñ4´W¸TÈÐYeÑ5rÓsˆØ˜gÑ&×4Ñ4´W¸TÈÐYeÑ5rÓsˆà×Ñ× Ñ  (Ð!5Õ6r6   c                ó~   • U R                    H  nUR                  5         M     U R                   R                  5         g)zRemove all gradient hooks.N)r"   ÚremoveÚclear)r1   Úhandles     r3   Ú_detach_hooksÚOSFLayer._detach_hooks’   s-   € à×'Ô'ˆFØ�M‰MŽOñ (à×Ñ×ÑÕ!r6   c                óú   • XR                   ;  a  U R                  5       R                  $ U R                   U   nU R                  U   U R                  U   U R
                  U   US   US   US   S.n[        U5      $ )z@Reconstruct weight matrix from SVD components for given adapter.r<   r=   r>   )r9   r:   r;   r<   r=   r>   )r   r%   r   r   r   r   r   )r1   rE   rW   rF   s       r3   Ú_reconstruct_weightÚOSFLayer._reconstruct_weight˜   s‰   € à×2Ñ2Ó2Ø×&Ñ&Ó(×/Ñ/Ð/à×(Ñ(¨Ñ6ˆ
à×&Ñ& |Ñ4Ø×&Ñ& |Ñ4Ø×&Ñ& |Ñ4Ø Ñ(Ø Ñ(Ø Ñ(ñ
ˆô )¨Ó2Ð2r6   Nc                óL  • Uc  U R                   nU GH  nX0R                  R                  5       ;   d  M#  U R                  5       nU(       a˜  UR                  R
                  R                  5       nU R                  U5      n[        R                  " U5      R                  5       (       d  [        SU S35      eUR                  UR                  5      UR                  l        O!U R                  U5      nXdR                  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)rD   r   Úkeysr%   r   r@   Úclonerb   r(   ÚisfiniteÚallr?   ÚtoÚdtyper$   Úappend)r1   Ú
safe_mergeÚadapter_namesÚactive_adapterr   Úorig_weightÚ
new_weights          r3   ÚmergeÚOSFLayer.merge¨   sô   € ð Ñ Ø ×0Ñ0ˆMä+ˆNØ×!4Ñ!4×!9Ñ!9Ó!;Õ;Ø!×0Ñ0Ó2�
Þð #-×"3Ñ"3×"8Ñ"8×">Ñ">Ó"@�KØ!%×!9Ñ!9¸.Ó!I�Jä Ÿ>š>¨*Ó5×9Ñ9×;Ñ;Ü(ØOÐP^ÐO_Ð_rÐsóð ð .8¯]©]¸;×;LÑ;LÓ-M�J×%Ñ%Õ*à!%×!9Ñ!9¸.Ó!I�JØ-7×%Ñ%Ô*à×$Ñ$×+Ñ+¨N×;ò' ,r6   c                ó€   • U R                   (       d  [        R                  " S5        g[        R                  " S5        g)zG
This method unmerges all merged adapter layers from the base weights.
z Already unmerged. Nothing to do.NzJOSF does not support unmerging. Original weights are permanently modified.)Úmergedr-   r.   ©r1   s    r3   ÚunmergeÚOSFLayer.unmergeÍ   s*   € ð �{�{Ü�MŠMÐ<Ô=Øô
 	�ŠÐbÕcr6   c                ó$   • U R                  5         g)zCleanup hooks on deletion.N)r_   ru   s    r3   Ú__del__ÚOSFLayer.__del__Ú   s   € à×ÑÕr6   )r#   r   r   r   r   r   r"   r   r$   r   r   )r   z	nn.ModuleÚreturnÚNone)rE   rT   r   Úint)rE   rT   )rE   rT   r{   útorch.Tensor)FN)rl   Úboolrm   zOptional[list[str]]r{   r|   )r{   r|   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r   Ú__annotations__r   r4   rH   rB   r_   rb   rq   rv   ry   Ú__static_attributes__© r6   r3   r   r   !   sD   ‡ à+>Ð˜Ó>à)VÐ�ÓVô+)ôZ"/ôH7ò4"ô3ö #<ôJdõr6   r   c                  óV   ^ • \ rS rSr S     SU 4S jjjrSS jrS	U 4S jjrSrU =r$ )
r,   éß   c                óÎ   >• [         TU ]  5         [        R                  " X40 UD6  Uc#  [        U R                  U R
                  5      S-  nX l        U R                  " X#40 UD6  g )Nr   )Úsuperr4   r   Úminr   r   Ú_active_adapterrH   )r1   r   rE   r   r2   Ú	__class__s        €r3   r4   ÚLinear.__init__á   sa   ø€ ô 	‰ÑÔÜ×Ò˜$Ñ5¨fÒ5ð Ñ!ä  ×!1Ñ!1°4×3DÑ3DÓEÈÑJˆNà+ÔØ×Ò˜,ÑA¸&ÓAr6   c                ó~  • U R                   (       a  U R                  " U/UQ70 UD6nU$ U R                  (       a  U R                  " U/UQ70 UD6nU$ U R                  5       nUR                  nU R
                  (       a  U R
                  S   OS nU(       a�  XpR                  ;   a€  U R                  U5      nUR                  n	U R                  XR                  5      nUb  UR                  UR                  5      n[        R                  " XU5      nUR                  U	5      nU$ U R                  " U/UQ70 UD6nU$ )Nr   )Údisable_adaptersr   rt   r%   ÚbiasrD   r   rb   rj   Ú_cast_input_dtyperi   ÚFÚlinear)
r1   ÚxÚargsr2   Úresultr   r‘   rn   r   Ú
orig_dtypes
             r3   ÚforwardÚLinear.forwardó   s  € Ø× × Ø—_’_ QÐ8¨Ò8°Ñ8ˆFð* ˆð) �[�[Ø—_’_ QÐ8¨Ò8°Ñ8ˆFð& ˆð! ×,Ñ,Ó.ˆJØ—?‘?ˆDð 9=×8L×8L˜T×1Ñ1°!Ò4ÐRVˆNÞ .×4GÑ4GÓ"GØ×1Ñ1°.ÓA�ØŸW™W�
Ø×*Ñ*¨1¯l©lÓ;�ØÑ#ØŸ7™7 6§<¡<Ó0�DÜŸš !¨TÓ2�ØŸ™ :Ó.�ð ˆð Ÿš¨Ð<¨TÒ<°VÑ<�àˆr6   c                ó*   >• [         TU ]  5       nSU-   $ )Nzosf.)rŠ   Ú__repr__)r1   Úrepr�   s     €r3   rœ   ÚLinear.__repr__  s   ø€ Ü‰gÑÓ ˆØ˜‰|Ðr6   )rŒ   ©N)rE   rT   r   r}   r{   r|   )r•   r~   r–   r   r2   r   r{   r~   )r{   rT   )	r€   r�   r‚   rƒ   r4   r™   rœ   r…   Ú__classcell__)r�   s   @r3   r,   r,   ß   sD   ø† ð #ð	Bð ðBð ð	Bð 
÷Bð Bô$÷2õ r6   r,   c                óÄ   • S n[        U [        5      (       a  U R                  5       nOU n[        U[        R                  R
                  5      (       a  [        X40 UD6nU$ rŸ   )r'   r   r%   r(   r    r,   )ÚtargetrE   Ú
osf_configr2   Ú
new_moduleÚtarget_base_layers         r3   Údispatch_defaultr¦     sV   € ð €Jä�&œ.×)Ñ)Ø"×1Ñ1Ó3Ñà"ÐäÐ#¤U§X¡X§_¡_×5Ñ5Ü˜FÑ;°FÑ;ˆ
àÐr6   )r¢   ztorch.nn.ModulerE   rT   r{   zOptional[torch.nn.Module])Ú
__future__r   r-   Ú	functoolsr   Útypingr   r   r(   Útorch.nnr    Útorch.nn.functionalÚ
functionalr“   Úpeft.tuners._buffer_dictr   Úpeft.tuners.tuners_utilsr   Úutilsr
   r   r   ÚModuler,   r¦   r†   r6   r3   Ú<module>r±      sk   ðõ #ã Ý ß  ã Ý ß Ð å /Ý 3÷ô{ˆ~ô {ô|/ˆR�Y‰Y˜ô /ðdØðàðð
 õr6   