ó
    >:jp'  ã                  óÌ   • 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	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JrJr  \ " S	 S
\5      5       r " S S\5      r " S S\5      rg)é    )ÚannotationsN)Úabstractmethod)Ú	dataclassÚfield)ÚAnyÚOptionalÚUnion)Ú
PeftConfigé   )Ú	BaseTunerÚBaseTunerLayerÚ_get_in_out_featuresÚcheck_adapters_to_mergec                  óR   • \ rS rSr% Sr\" \SS0S9rS\S'   \" \SS0S9r	S\S	'   S
r
g)ÚLycorisConfigé"   z)
A base config for LyCORIS like adapters
ÚhelpzºThe mapping from layer names or regexp expression to ranks which are different from the default rank specified by `r`. For example, `{'^model.decoder.layers.0.encoder_attn.k_proj': 16}`.)Údefault_factoryÚmetadatazOptional[dict]Úrank_patternzÀThe mapping from layer names or regexp expression to alphas which are different from the default alpha specified by `alpha`. For example, `{'^model.decoder.layers.0.encoder_attn.k_proj': 16}`.Úalpha_pattern© N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   Údictr   Ú__annotations__r   Ú__static_attributes__r   ó    ÚV/home/mande/repo/quber/.venv/lib/python3.13/site-packages/peft/tuners/lycoris_utils.pyr   r   "   sO   ‡ ññ $)ØàðVð
ñ$€L�.ó ñ %*ØàðVð
ñ%€M�>ö r!   r   c                  óè   • \ rS rSrSrSrSS jr\\SS j5       5       r	SS jr
\SS j5       r\SS j5       r\SS	 j5       rSSS jjr\SS j5       rS rSS jrSS jrSSS jjr\SS j5       rSrg
)ÚLycorisLayeré<   z(
A base layer for LyCORIS like adapters
)ÚrÚalphaÚscalingÚrank_dropoutÚmodule_dropoutc                óÜ   • Xl         0 U l        0 U l        0 U l        0 U l        0 U l        0 U l        SU l        / U l        SU l	        [        U R                  5       5      u  p#X l        X0l        g )NFT)Ú
base_layerr&   r'   r(   r)   Úrank_dropout_scaler*   Ú_disable_adaptersÚmerged_adaptersÚcast_input_dtype_enabledr   Úget_base_layerÚin_featuresÚout_features)Úselfr,   r2   r3   s       r"   Ú__init__ÚLycorisLayer.__init__D   sp   € Ø$ŒØˆŒØˆŒ
ØˆŒØˆÔØ"$ˆÔØ ˆÔð "'ˆÔØ!ˆÔà(,ˆÔ%ä$8¸×9LÑ9LÓ9NÓ$OÑ!ˆØ&ÔØ(Õr!   c                ó   • g ©Nr   )r4   s    r"   Ú_available_adaptersÚ LycorisLayer._available_adaptersW   s   € à/2r!   c                ó–   • UR                  5       nUR                  SS5      nUR                  " U /UQ7SS0UD6  U R                  US9  g )NÚdeviceÚcpuÚmeta)r<   )ÚcopyÚpopr5   Úto_empty)r4   ÚclsÚargsÚkwargsÚfinal_devices        r"   Ú_init_empty_weightsÚ LycorisLayer._init_empty_weights[   sH   € ð —‘“ˆØ—z‘z (¨EÓ2ˆØ�Š�TÐ:˜DÒ:¨Ð:°6Ò:Ø�‰˜\ˆÒ*r!   c                ó   • g r8   r   )r4   Úadapter_namer&   rD   s       r"   Úcreate_adapter_parametersÚ&LycorisLayer.create_adapter_parametersg   s   € ØNQr!   c                ó   • g)zZActivations added on top of the base layer output (i.e. after the base layer forward pass)Nr   )r4   rI   ÚxrC   rD   s        r"   Ú_get_delta_activationsÚ#LycorisLayer._get_delta_activationsk   s   � r!   c                ó   • g r8   r   ©r4   rI   s     r"   Úget_delta_weightÚLycorisLayer.get_delta_weighto   s   € ØCFr!   Nc                ó  • [        X5      nU(       d  gU Hô  nX0R                  ;   d  M  U R                  5       nU(       a€  UR                  R                  R                  5       nXPR                  U5      -  n[        R                  " U5      R                  5       (       d  [        SU S35      eXTR                  l        O.UR                  =R                  U R                  U5      -  sl        U R                  R                  U5        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   r9   r1   ÚweightÚdataÚclonerR   ÚtorchÚisfiniteÚallÚ
ValueErrorr/   Úappend)r4   Ú
safe_mergeÚadapter_namesÚactive_adapterr,   Úorig_weightss         r"   ÚmergeÚLycorisLayer.merger   sà   € ô 0°ÓDˆÞàã+ˆNØ×!9Ñ!9Õ9Ø!×0Ñ0Ó2�
ÞØ#-×#4Ñ#4×#9Ñ#9×#?Ñ#?Ó#A�LØ ×$9Ñ$9¸.Ó$IÑI�Lä Ÿ>š>¨,Ó7×;Ñ;×=Ñ=Ü(ØOÐP^ÐO_Ð_rÐsóð ð .:×%Ñ%Õ*à×%Ñ%×*Ò*¨d×.CÑ.CÀNÓ.SÑSÕ*Ø×$Ñ$×+Ñ+¨NÖ;ò ,r!   c                ó   • g r8   r   rQ   s     r"   Úreset_adapter_parametersÚ%LycorisLayer.reset_adapter_parameters•   s   € Ø;>r!   c                ó€   • XR                   ;  a  g X R                  U   -  U R                  U   -  U R                  U'   g r8   )r9   r'   r&   r(   )r4   ÚadapterÚscales      r"   Ú	set_scaleÚLycorisLayer.set_scale˜   s8   € Ø×2Ñ2Ó2àØ %¯
©
°7Ñ(;Ñ ;¸d¿f¹fÀW¹oÑ Mˆ�‰�WÒr!   c                óˆ   • US:X  a  g U R                    H+  nX R                  ;  a  M  U R                  U==   U-  ss'   M-     g )Nr   )Úactive_adaptersr9   r(   ©r4   rh   r_   s      r"   Úscale_layerÚLycorisLayer.scale_layerž   s?   € Ø�A‹:Øà"×2Ô2ˆNØ×%=Ñ%=Ó=Ùà�L‰L˜Ó(¨EÑ1Õ(ò	 3r!   c                óˆ  • U R                   (       d  [        R                  " S5        g[        U R                  5      S:”  a�  U R                  R                  5       nXR                  ;   a<  U R                  5       R                  =R                  U R                  U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/   r@   r9   r1   rU   rV   rR   )r4   r_   s     r"   ÚunmergeÚLycorisLayer.unmerge¨   sŽ   € ð �{�{Ü�MŠMÐ<Ô=ØÜ�$×&Ñ&Ó'¨!Ó+Ø!×1Ñ1×5Ñ5Ó7ˆNØ×!9Ñ!9Ó9Ø×#Ñ#Ó%×,Ñ,×1Ò1°T×5JÑ5JÈ>Ó5ZÑZÕ1ô �$×&Ñ&Ó'¨!×+r!   c                óÜ   • U R                    H\  nX R                  ;  a  M  Uc.  U R                  U   U R                  U   -  U R                  U'   ME  U R                  U==   U-  ss'   M^     g r8   )rl   r9   r'   r&   r(   rm   s      r"   Úunscale_layerÚLycorisLayer.unscale_layer´   s`   € Ø"×2Ô2ˆNØ×%=Ñ%=Ó=Ùà‰}Ø/3¯z©z¸.Ñ/IÈDÏFÉFÐSaÑLbÑ/b�—‘˜^Ó,à—‘˜^Ó,°Ñ5Õ,ò 3r!   c                ó   • g r8   r   )r4   rI   r&   r'   rD   s        r"   Úupdate_layerÚLycorisLayer.update_layer¾   s   € ØORr!   )r.   r'   r,   r0   r2   r/   r*   r3   r&   r)   r-   r(   )r,   ú	nn.ModuleÚreturnÚNone)r~   zset[str])r~   r   )rI   Ústrr&   Úint)
rI   r€   rM   útorch.TensorrC   r   rD   r   r~   r‚   )rI   r€   r~   r‚   )FN)r]   Úboolr^   zOptional[list[str]]r~   r   )rI   r€   )rh   Úfloatr~   r   r8   )rI   r€   r&   r�   r'   r„   )r   r   r   r   r   Úother_param_namesr5   Úpropertyr   r9   rF   rJ   rN   rR   ra   rd   ri   rn   ru   rx   r{   r    r   r!   r"   r$   r$   <   s¤   † ñð
 TÐô)ð& ØÛ2ó ó à2ô
+ð ÛQó ØQð óió ðið ÛFó ØFö!<ðF Û>ó Ø>òNô2ô
[ö6ð ÛRó ÛRr!   r$   c                  óf   • \ rS rSr% SrS\S'   \rS\S'   \      SS j5       r	\
SS j5       rS	rg
)ÚLycorisTuneréÂ   a–  
A base tuner for LyCORIS like adapters

Args:
    model ([`torch.nn.Module`]): The model to be adapted.
    config ([`LoraConfig`]): The configuration of the Lora 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.

r€   Úprefixz/dict[type[torch.nn.Module], type[LycorisLayer]]Úlayers_mappingc                ó   • g r8   r   )r4   ÚconfigrI   ÚtargetÚtarget_nameÚparentÚcurrent_keys          r"   Ú_create_and_replaceÚ LycorisTuner._create_and_replaceÓ   s   € ð r!   c                ó”  • S nU R                   R                  5        Hb  u  pg[        US5      (       a8  [        UR	                  5       U5      (       a  [        U[
        5      (       a  Un  O[        X65      (       d  M`  Un  O   UcK  SR                  S U R                   R                  5        5       5      n[        S[        U5       SU S35      e[        U[
        5      (       a  UR	                  5       n	OUn	[        U	[        R                  R                  [        R                  R                  45      (       a  U" U4SU0UD6n
U
$ [        U	[        R                  R                  5      (       a  U" U4SU0UD6n
U
$ SR                  S U R                   R                  5        5       5      n[        S[        U5       SU S35      e)	Nr,   z, c              3  ó8   #   • U  H  oR                   v •  M     g 7fr8   ©r   ©Ú.0Úlayers     r"   Ú	<genexpr>Ú2LycorisTuner._create_new_module.<locals>.<genexpr>ñ   ó   é € Ð)`ÒF_¸U¯.®.ÒF_ùó   ‚zTarget module of type z, not supported, currently only adapters for z are supportedrI   c              3  ó8   #   • U  H  oR                   v •  M     g 7fr8   r–   r—   s     r"   rš   r›     rœ   r�   )r‹   ÚitemsÚhasattrÚ
isinstancer1   r   ÚjoinÚkeysr[   ÚtyperX   ÚnnÚConv2dÚConv1dÚLinear)rB   r�   rI   rŽ   rD   Únew_module_clsÚsubtypeÚ
target_clsÚsupported_modulesÚtarget_base_layerÚ
new_modules              r"   Ú_create_new_moduleÚLycorisTuner._create_new_moduleÞ   s±  € ð ˆØ#&×#5Ñ#5×#;Ñ#;Ö#=ÑˆGä˜ ×-Ñ-Ü˜v×4Ñ4Ó6¸×@Ñ@Ü˜v¤~×6Ñ6ð ",�ÙÜ˜F×,Ó,Ø!+�Ùñ $>ð Ñ!Ø $§	¡	Ñ)`Àc×FXÑFX×F]ÑF]ÔF_Ó)`Ó `ÐÜØ(¬¨f«¨ð 7/Ø/@Ð.AÀðQóð ô
 �fœn×-Ñ-Ø &× 5Ñ 5Ó 7Ñà &ÐäÐ'¬%¯(©(¯/©/¼5¿8¹8¿?¹?Ð)K×LÑLÙ'¨ÑT¸\ÐTÈVÑTˆJð Ðô Ð)¬5¯8©8¯?©?×;Ñ;Ù'¨ÑT¸\ÐTÈVÑTˆJð Ðð !%§	¡	Ñ)`Àc×FXÑFX×F]ÑF]ÔF_Ó)`Ó `ÐÜØ(¬¨f«¨ð 7/Ø/@Ð.AÀðQóð r!   r   N)r�   r   rI   r€   rŽ   zUnion[LycorisLayer, nn.Module])r�   r   rI   r€   rŽ   r}   r~   r$   )r   r   r   r   r   r   r$   Útuner_layer_clsr   r’   Úclassmethodr¯   r    r   r!   r"   rˆ   rˆ   Â   s[   ‡ ñ
ð ƒKØ"€OØCÓCàðàðð ðð /ó	ó ðð ó(ó ó(r!   rˆ   )Ú
__future__r   rr   Úabcr   Údataclassesr   r   Útypingr   r   r	   rX   Útorch.nnr¥   Úpeft.configr
   Útuners_utilsr   r   r   r   r   r$   rˆ   r   r!   r"   Ú<module>rº      sf   ðõ #ã Ý ß (ß 'Ñ 'ã Ý å "÷ó ð ô�Jó ó ðô2CS�>ô CSôLE�9õ Er!   