ó
    >:j"+  ã                  ó®   • S SK Jr  S SKrS SKrS SKJr  S SKJr  S SKJ	r	J
r
  S SKJrJr  S SKJr  SSKJr  SS	KJr  S
SKJr  S
SKJrJr   " S S\5      rg)é    )ÚannotationsN)ÚConv1D)Úis_bnb_4bit_availableÚis_bnb_available)Ú	BaseTunerÚBaseTunerLayer)Ú3TRANSFORMERS_MODELS_TO_PVERA_TARGET_MODULES_MAPPINGé   )Ú
BufferDict)Ú _maybe_include_all_linear_layersé   )ÚPveraConfig)ÚLinearÚ
PveraLayerc                  ó|   ^ • \ rS rSr% SrSrS\S'   \r\	r
SS jrSS jrSS jrSU 4S	 jjrS
 r\S 5       rSrU =r$ )Ú
PveraModelé#   a  
Creates Probabilistic Vector-based Random Matrix Adaptation (PVeRA) model from a pretrained transformers model.

Args:
    model ([`~transformers.PreTrainedModel`]): The model to be adapted.
    config ([`PveraConfig`]): The configuration of the PVeRA 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.

Returns:
    `torch.nn.Module`: The PVeRA model.

Example:

    ```py
    >>> from transformers import AutoModel
    >>> from peft import PveraConfig, get_peft_model

    >>> base_model = AutoModel.from_pretrained("facebook/dinov2-base")
    >>> config = PveraConfig(r=128, sample_at_inference=False)
    >>> model = get_peft_model(base_model, config)
    ```

**Attributes**:
    - **model** ([`~transformers.PreTrainedModel`]) -- The model to be adapted.
    - **peft_config** ([`PveraConfig`]): The configuration of the PVeRA model.
Úpvera_lambda_ÚstrÚprefixc                ó²  • U R                  U R                  5      nU R                  X5      n[        X0R                  5      nSnU R                  R	                  5        Hå  u  pVU R                  X55      (       d  M  [        U[        R                  5      (       a  UR                  UR                  4nOg[        U[        5      (       aP  [        UR                  S5      (       a  UR                  R                  OUR                  R                  nUSSS2   nOM¼  Uc  UnMÃ  Xt:w  d  MÊ  [!        S [#        XG5       5       5      nMç     Uc  Sn[%        U5      eU$ )z¿
Finds the largest input and output dimensions across linear layers that have been wrapped with PVeRA.

This will be used for determining the size of the shared pvera_A and pvera_B matrices.
NÚds_shapeéÿÿÿÿc              3  ó<   #   • U  H  u  p[        X5      v •  M     g 7f©N)Úmax)Ú.0ÚaÚbs      ÚT/home/mande/repo/quber/.venv/lib/python3.13/site-packages/peft/tuners/pvera/model.pyÚ	<genexpr>Ú'PveraModel._find_dim.<locals>.<genexpr>b   s   é € Ð%]Ò<\±D°A¤c¨!§i iÒ<\ùs   ‚z\No layers types compatible with PVeRA were found. Please check `peft_config.target_modules`.)Úget_model_configÚmodelÚ_prepare_adapter_configr   Únamed_modulesÚ_check_target_module_existsÚ
isinstanceÚnnr   Úout_featuresÚin_featuresr   ÚhasattrÚweightr   ÚshapeÚtupleÚzipÚ
ValueError)	ÚselfÚconfigÚmodel_configÚpeft_configÚlargest_shapeÚkeyÚmoduleÚmodule_shapeÚmsgs	            r    Ú	_find_dimÚPveraModel._find_dimE   s"  € ð ×,Ñ,¨T¯Z©ZÓ8ˆà×2Ñ2°6ÓHˆÜ6°{ÇJÁJÓOˆàˆØŸ:™:×3Ñ3Ö5‰KˆCØ×3Ñ3°K×EÑEÙä˜&¤"§)¡)×,Ñ,Ø%×2Ñ2°F×4FÑ4FÐF‘Ü˜F¤F×+Ñ+Ü9@ÀÇÁÐPZ×9[Ñ9[˜vŸ}™}×5Ò5Ðag×anÑan×atÑat�Ø+©D¨b¨DÑ1‘áàÑ$Ø ,�ÙàÕ,Ü %Ñ%]¼CÀÔ<\Ó%]Ó ]’ñ# 6ð& Ñ ØpˆCÜ˜S“/Ð!àÐó    c                ó@  • U R                  U5      u  p4[        0 UR                  S9U l        [        0 UR                  S9U l        [
        R                  " SS9R                  UR                  5      n[
        R                  R                  R                  [
        R                  " UR                  S-  U5      US9n[
        R                  R                  R                  [
        R                  " X1R                  5      US9nX`R                  U'   XpR                  U'   g )N)Ú
persistentÚcpu)Údevicer
   )Ú	generator)r;   r   Úsave_projectionÚpvera_AÚpvera_BÚtorchÚ	GeneratorÚmanual_seedÚprojection_prng_keyr)   ÚinitÚkaiming_uniform_ÚemptyÚr)r2   r3   Úadapter_nameÚlinear_out_dimÚlinear_in_dimrB   rD   rE   s           r    Ú_init_pvera_A_pvera_BÚ PveraModel._init_pvera_A_pvera_Bj   sÒ   € Ø(,¯©°vÓ(>Ñ%ˆô " "°×1GÑ1GÑHˆŒÜ! "°×1GÑ1GÑHˆŒô —O’O¨5Ñ1×=Ñ=¸f×>XÑ>XÓYˆ	Ü—(‘(—-‘-×0Ñ0´·²¸V¿X¹XÈ¹\È=Ó1YÐenÐ0ÐoˆÜ—(‘(—-‘-×0Ñ0´·²¸^ÏXÉXÓ1VÐbkÐ0Ðlˆà%,�‰�\Ñ"Ø%,�‰�\Ò"r=   c                ó&   • U R                  X#5        g r   )rQ   )r2   r$   r3   rN   s       r    Ú_pre_injection_hookÚPveraModel._pre_injection_hooky   s   € Ø×"Ñ" 6Õ8r=   c                óž  >• [         TU ]  U5        U R                  R                  5        HJ  nX!L a  M	  UR                  UR                  :w  d  M%  [        SUR                  < SUR                   S35      e   U R                  R                  5        Vs1 s H  oR                  iM     nn[        U5      S:”  a  [        SU 35      egs  snf )z´
A helper method to check the config when a new adapter is being added.

Raise a ValueError if there is something wrong with the config or if it conflicts with existing adapters.

z`PVeRA PRNG initialisation key must be the same for all adapters. Got config.projection_prng_key=z but previous config had Ú.r   zdPVeRA projection weights must be saved for all adapters or none, but got multiple different values: N)ÚsuperÚ_check_new_adapter_configr5   ÚvaluesrI   r1   rC   Úlen)r2   r3   Úexisting_configÚsave_project_unique_valuesÚ	__class__s       €r    rY   Ú$PveraModel._check_new_adapter_config|   sà   ø€ ô 	‰Ñ)¨&Ô1à#×/Ñ/×6Ñ6Ö8ˆOØÒ(áà×2Ñ2°f×6PÑ6PÕPÜ ØwÐ\b×\vÑ\vÑ[xð y+Ø+:×+NÑ+NÐ*OÈqðRóð ñ  9ð LP×K[ÑK[×KbÑKbÔKdÓ%eÒKdÀ×&<Ô&<ÑKdÐ"Ð%eÜÐ)Ó*¨QÓ.ÜØvØ-Ð.ð0óð ð /ùò &fs   ÂC
c           
     ó–  • Uc  [        S5      eUR                  n[        US5      =(       a    UR                  S Ln	UUR                  UR
                  UR                  [        U R                  SS5      [        U R                  SS5      S.n
XšS'   [        U[        5      (       aH  UR                  UU R                  U R                  UUR                  UR                  UR                  S9  g U R                  " XR                  U R                  X#U40 U
D6nX R                   ;  a  UR#                  S5        U R%                  XTX³5        g )NzCurrent Key shouldn't be `None`ÚbiasÚis_loaded_in_8bitFÚis_loaded_in_4bit)rM   Úpvera_dropoutÚfan_in_fan_outÚinit_weightsÚloaded_in_8bitÚloaded_in_4bit)Ú	d_initial)r1   rM   r,   ra   rd   re   rf   Úgetattrr$   r(   r   Úupdate_layerrD   rE   ri   Ú_create_new_moduleÚactive_adapterÚrequires_grad_Ú_replace_module)r2   Úpvera_configrN   ÚtargetÚtarget_nameÚparentÚcurrent_keyÚoptional_kwargsrM   ra   ÚkwargsÚ
new_modules               r    Ú_create_and_replaceÚPveraModel._create_and_replace—   s0  € ð ÑÜÐ>Ó?Ð?à�N‰NˆÜ�v˜vÓ&×B¨6¯;©;¸dÐ+BˆàØ)×7Ñ7Ø*×9Ñ9Ø(×5Ñ5Ü% d§j¡jÐ2EÀuÓMÜ% d§j¡jÐ2EÀuÓMñ
ˆð ˆv‰ä�fœf×%Ñ%Ø×ÑØØ—‘Ø—‘ØØ×*Ñ*Ø×)Ñ)Ø&×0Ñ0ð  ò ð ×0Ò0ØŸl™l¨D¯L©L¸,ÐP[ñØ_eñˆJð ×#6Ñ#6Ó6à×)Ñ)¨%Ô0Ø× Ñ  °jÕIr=   c                ót  • [        5       (       a
  SS KnSSKJn  [	        5       (       a  SSKJn	  UR                  SS5      n
UR                  SS5      nUR                  SS5      n[        U[        5      (       a  UR                  5       nOUnU(       a†  [        UWR                  R                  5      (       aa  UR                  5       nUR                  UR                  R                  UR                  R                   UR"                  S	.5        W" XCX40 UD6$ U(       a†  [        UWR                  R
                  5      (       aa  UR                  5       nUR                  UR$                  UR&                  R(                  UR&                  R*                  S
.5        W	" XCX40 UD6$ [        U[,        R                  R.                  5      (       a-  US   (       a"  [0        R2                  " S5        S=US'   U l        OV[        U[6        5      (       a2  SUS'   US   (       d"  [0        R2                  " S5        S=US'   U l        O[9        SU S35      e[        U R:                  [<        5      (       a  U R:                  nOU R:                  R                  US5      n[/        UUUU4U
U R>                  US.UD6nU$ )Nr   r   )ÚLinear8bitLt)Ú
Linear4bitra   Frg   rh   )Úhas_fp16_weightsÚ	thresholdÚindex)Úcompute_dtypeÚcompress_statisticsÚ
quant_typere   zjfan_in_fan_out is set to True but the target module is `torch.nn.Linear`. Setting fan_in_fan_out to False.TÚis_target_conv_1d_layerzafan_in_fan_out is set to False but the target module is `Conv1D`. Setting fan_in_fan_out to True.zTarget module z is not supported. Currently, only the following modules are supported: `torch.nn.Linear`, `transformers.pytorch_utils.Conv1D`.)ra   ri   Úsample_at_inference) r   ÚbitsandbytesÚbnbr{   r   r|   ÚpopÚgetr(   r   Úget_base_layerr)   ÚcopyÚupdateÚstater}   r~   r   r€   r-   r�   r‚   rF   r   ÚwarningsÚwarnre   r   r1   r„   Úboolri   )rp   rD   rE   rN   rq   rt   rv   r†   r{   r|   ra   rg   rh   Útarget_base_layerÚeightbit_kwargsÚfourbit_kwargsÚmodule_sample_at_inferencerw   s                     r    rl   ÚPveraModel._create_new_moduleÃ   sƒ  € ô ×ÑÛ&å)ä ×"Ñ"Ý'à�z‰z˜& %Ó(ˆØŸ™Ð$4°eÓ<ˆØŸ™Ð$4°eÓ<ˆä�fœn×-Ñ-Ø &× 5Ñ 5Ó 7Ñà &ÐæœjÐ):¸C¿F¹F×<OÑ<O×PÑPØ$Ÿk™k›mˆOØ×"Ñ"à(9×(?Ñ(?×(PÑ(PØ!2×!8Ñ!8×!BÑ!BØ.×4Ñ4ñôñ   °gÑZÈ/ÑZÐZÞ¤
Ð+<¸c¿f¹f×>OÑ>O× PÑ PØ#Ÿ[™[›]ˆNØ×!Ñ!à%6×%DÑ%DØ+<×+CÑ+C×+WÑ+WØ"3×":Ñ":×"EÑ"Eñôñ ˜f°GÑWÈÑWÐWÜÐ)¬5¯8©8¯?©?×;Ñ;ØÐ&×'Ü—’ð7ôð JOÐN�Ð'Ñ(¨<Ô+FøÜÐ)¬6×2Ñ2Ø04ˆFÐ,Ñ-ØÐ*×+Ü—’Øwôð JNÐM�Ð'Ñ(¨<Ô+FøäØ   ð )Jð Jóð ô
 �l×6Ñ6¼×=Ñ=Ø)5×)IÑ)IÑ&à)5×)IÑ)I×)MÑ)MÈkÐ[`Ó)aÐ&äØØØØð		
ð
 Ø"×,Ñ,Ø :ñ	
ð ñ	
ˆ
ð Ðr=   )rD   rE   )Úreturnztuple[int, int])r3   r   rN   r   r•   ÚNone)r$   z	nn.Moduler3   r   rN   r   r•   r–   )r3   r   r•   r–   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   Ú__annotations__r   Útuner_layer_clsr	   Útarget_module_mappingr;   rQ   rT   rY   rx   Ústaticmethodrl   Ú__static_attributes__Ú__classcell__)r^   s   @r    r   r   #   sQ   ø‡ ñð: "€FˆCÓ!Ø €OØOÐô#ôJ-ô9÷ò6*JðX ñKó öKr=   r   )Ú
__future__r   r�   rF   Útorch.nnr)   Útransformers.pytorch_utilsr   Úpeft.import_utilsr   r   Úpeft.tuners.tuners_utilsr   r   Ú
peft.utilsr	   Ú_buffer_dictr   Útuners_utilsr   r3   r   Úlayerr   r   r   © r=   r    Ú<module>r¬      s=   ðõ #ã ã Ý Ý -ç Eß >õõ &Ý ;Ý ß %ôl�õ lr=   