ó
    >:j'5  ã                  óª   • S SK Jr  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
Jr  S SKJrJr  S SKJrJrJrJrJr  SS	KJrJrJrJr   " S
 S\5      rg)é    )ÚannotationsN)Úreplace)ÚConv1D)Úis_bnb_4bit_availableÚis_bnb_available)Ú	BaseTunerÚBaseTunerLayer)Ú6TRANSFORMERS_MODELS_TO_IA3_FEEDFORWARD_MODULES_MAPPINGÚ1TRANSFORMERS_MODELS_TO_IA3_TARGET_MODULES_MAPPINGÚModulesToSaveWrapperÚ_freeze_adapterÚ_get_submodulesé   )ÚConv2dÚConv3dÚIA3LayerÚLinearc                  óž   ^ • \ rS rSr% SrSrS\S'   \r\	S 5       r
S r\	SS j5       r\	S	 5       rU 4S
 jrSS jr        SS jrSrU =r$ )ÚIA3Modelé$   aä  
Creates a Infused Adapter by Inhibiting and Amplifying Inner Activations ((IA)^3) model from a pretrained
transformers model. The method is described in detail in https://huggingface.co/papers/2205.05638

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

Example:

    ```py
    >>> from transformers import AutoModelForSeq2SeqLM, ia3Config
    >>> from peft import IA3Model, IA3Config

    >>> config = IA3Config(
    ...     peft_type="IA3",
    ...     task_type="SEQ_2_SEQ_LM",
    ...     target_modules=["k", "v", "w0"],
    ...     feedforward_modules=["w0"],
    ... )

    >>> model = AutoModelForSeq2SeqLM.from_pretrained("t5-base")
    >>> ia3_model = IA3Model(config, model)
    ```

**Attributes**:
    - **model** ([`~transformers.PreTrainedModel`]) -- The model to be adapted.
    - **peft_config** ([`ia3Config`]): The configuration of the (IA)^3 model.
Úia3_ÚstrÚprefixc                óÊ  • [        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      (       ad  UR                  5       nUR                  U
R                  R                  U
R                  R                  U
R                   S	.5        W" X!4SU	0UD6nU$ U(       a‰  [        U
WR                  R
                  5      (       ad  UR                  5       nUR                  U
R"                  U
R$                  R&                  U
R$                  R(                  S
.5        W" X!4SU	0UD6nU$ [        U[*        R                  R,                  5      (       a  [-        X!4SU	0UD6nU$ [        U[*        R                  R.                  5      (       a  [/        X!4SU	0UD6nU$ [        U
[*        R                  R0                  5      (       a<  US   (       a"  [2        R4                  " S5        S=US'   U l        [1        X!4SU	0UD6nU$ [        U
[8        5      (       a=  US   (       d"  [2        R4                  " S5        S=US'   U l        [1        X!4U	SS.UD6nU$ [;        SU S35      e)Nr   r   )ÚLinear8bitLt)Ú
Linear4bitÚloaded_in_8bitFÚloaded_in_4bitÚis_feedforward)Úhas_fp16_weightsÚ	thresholdÚindex)Úcompute_dtypeÚcompress_statisticsÚ
quant_typeÚfan_in_fan_outzjfan_in_fan_out is set to True but the target module is `torch.nn.Linear`. Setting fan_in_fan_out to False.zafan_in_fan_out is set to False but the target module is `Conv1D`. Setting fan_in_fan_out to True.T)r   Úis_target_conv_1d_layerzTarget module zd is not supported. Currently, only `torch.nn.Linear`, `torch.nn.Conv2d`, and `Conv1D` are supported.)r   ÚbitsandbytesÚbnbr   r   r   ÚpopÚ
isinstancer	   Úget_base_layerÚnnÚcopyÚupdateÚstater    r!   r"   r#   Úweightr$   r%   Útorchr   r   r   ÚwarningsÚwarnr&   r   Ú
ValueError)Ú
ia3_configÚadapter_nameÚtargetÚkwargsr)   r   r   r   r   r   Útarget_base_layerÚeightbit_kwargsÚ
new_moduleÚfourbit_kwargss                 ÚR/home/mande/repo/quber/.venv/lib/python3.13/site-packages/peft/tuners/ia3/model.pyÚ_create_new_moduleÚIA3Model._create_new_moduleL   sË  € ô ×ÑÛ&å)ä ×"Ñ"Ý'àŸ™Ð$4°eÓ<ˆØŸ™Ð$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ñôñ & fÑmÈ>ÐmÐ]lÑmˆJðJ ÐöI ¤
Ð+<¸c¿f¹f×>OÑ>O× PÑ PØ#Ÿ[™[›]ˆNØ×!Ñ!à%6×%DÑ%DØ+<×+CÑ+C×+WÑ+WØ"3×":Ñ":×"EÑ"Eñôñ $ FÑjÈÐjÐ[iÑjˆJð6 Ðô5 ˜¤§¡§¡×0Ñ0Ü Ñ^À^Ð^ÐW]Ñ^ˆJð2 Ðô1 ˜¤§¡§¡×0Ñ0Ü Ñ^À^Ð^ÐW]Ñ^ˆJð. Ðô- Ð)¬5¯8©8¯?©?×;Ñ;ØÐ&×'Ü—’ð7ôð HMÐL�Ð'Ñ(¨:Ô+DÜ Ñ^À^Ð^ÐW]Ñ^ˆJð Ðô Ð)¬6×2Ñ2ØÐ*×+Ü—’Øwôð HLÐK�Ð'Ñ(¨:Ô+DÜØðØ5CÐ]añØekñˆJð Ðô	 Ø   ð )dð eóð ó    c           	     ó¢  • U R                  X5      nUR                  UR                  U[        U R                  SS5      [        U R                  SS5      S.n[        U[        5      (       a  UR                  UUR                  5        g U R                  " XU40 UD6n	X R                  ;  a  U	R                  S5        U R                  XTX“5        g )NÚis_loaded_in_8bitFÚis_loaded_in_4bit)r&   Úinit_ia3_weightsr   r   r   )Ú _check_target_module_feedforwardr&   rE   ÚgetattrÚmodelr+   r   Úupdate_layerr?   Úactive_adaptersÚrequires_grad_Ú_replace_module)
Úselfr6   r7   r8   Útarget_nameÚparentÚcurrent_keyr   r9   r<   s
             r>   Ú_create_and_replaceÚIA3Model._create_and_replace�   sÁ   € ð ×>Ñ>¸zÓWˆð )×7Ñ7Ø *× ;Ñ ;Ø,Ü% d§j¡jÐ2EÀuÓMÜ% d§j¡jÐ2EÀuÓMñ
ˆô �fœh×'Ñ'Ø×ÑØØ×+Ñ+õð
 ×0Ò0°È6Ñ\ÐU[Ñ\ˆJØ×#7Ñ#7Ó7à×)Ñ)¨%Ô0Ø× Ñ  °jÕIrA   c                óÜ   ^• [        U R                  [        5      (       a,  [        [        R
                  " U R                  T5      5      nU$ [        U4S jU R                   5       5      nU$ )z|
A helper private method that checks if the target module `key` matches with a feedforward module specified in
`ia3_config`
c              3  óF   >#   • U  H  nTR                  U5      v •  M     g 7f©N)Úendswith)Ú.0Ú
target_keyÚkeys     €r>   Ú	<genexpr>Ú<IA3Model._check_target_module_feedforward.<locals>.<genexpr>¹   s   øé € Ð kÒLj¸j §¡¨j×!9Ð!9ÒLjùs   ƒ!)r+   Úfeedforward_modulesr   ÚboolÚreÚ	fullmatchÚany)r6   rY   r   s    ` r>   rF   Ú)IA3Model._check_target_module_feedforward°   sY   ø€ ô �j×4Ñ4´c×:Ñ:Ü!¤"§,¢,¨z×/MÑ/MÈsÓ"SÓTˆNð Ðô !Ô kÈJ×LjÒLjÓ kÓkˆNØÐrA   c                ó  • U R                   c2  US   [        ;  a  [        S5      e[        [        US      5      U l         U R                  c2  US   [
        ;  a  [        S5      e[        [
        US      5      U l        U $ )NÚ
model_typez0Please specify `target_modules` in `peft_config`z5Please specify `feedforward_modules` in `peft_config`)Útarget_modulesr   r5   Úsetr\   r
   )Úpeft_configÚmodel_configs     r>   Ú_prepare_adapter_configÚ IA3Model._prepare_adapter_config¼   s�   € à×%Ñ%Ñ-Ø˜LÑ)Ô1bÓbÜ Ð!SÓTÐTÜ),ÜAÀ,È|ÑB\Ñ]ó*ˆKÔ&ð ×*Ñ*Ñ2Ø˜LÑ)Ô1gÓgÜ Ð!XÓYÐYÜ.1ÜFÀ|ÐT`ÑGaÑbó/ˆKÔ+ð ÐrA   c                óÀ   >• [        U R                  SS5      (       a  [        S5      e[        U R                  SS5      (       a  [        S5      e[        TU ]  " U0 UD6$ )as  
This method merges the (IA)^3 layers into the base model. This is needed if someone wants to use the base model
as a standalone model.

Args:
    safe_merge (`bool`, `optional`, defaults to `False`):
        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`.
rC   Fz>Cannot merge ia3 layers when the model is loaded in 8-bit moderD   z>Cannot merge ia3 layers when the model is loaded in 4-bit mode)rG   rH   r5   ÚsuperÚ_unload_and_optionally_merge)rM   Úargsr9   Ú	__class__s      €r>   rl   Ú%IA3Model._unload_and_optionally_mergeÌ   sZ   ø€ ô �4—:‘:Ð2°E×:Ñ:ÜÐ]Ó^Ð^ä�4—:‘:Ð2°E×:Ñ:ÜÐ]Ó^Ð^ä‰wÒ3°TÐD¸VÑDÐDrA   c                ó\  ^ ^• T H"  nUT R                   ;  d  M  [        SU S35      e   T R                  5        Vs/ s H  n[        U[        5      (       d  M  UPM     nn[        U4S jU 5       5      (       a  [        S5      eT Vs1 s H%  n[        T R                   U   R                  5      iM'     nnT Vs1 s H%  n[        T R                   U   R                  5      iM'     nn[        U5      S:”  d  [        U5      S:”  a  [        S5      e[        U;   a  SR                  U 4S jT 5       5      nO[        R                  " U 4S	 jT 5       6 n[        U;   a  SR                  U 4S
 jT 5       5      nXx4$ [        R                  " U 4S jT 5       6 nXx4$ s  snf s  snf s  snf )zw
Helper function to check if the arguments to add_weighted_adapter are valid and compatible with the underlying
model.
zAdapter z does not existc              3  óV   >^#   • U  H  m[        U4S  jT 5       5      S:„  v •  M     g7f)c              3  ó@   >#   • U  H  oTR                   ;   v •  M     g 7frU   )Úmodules_to_save)rW   ÚadapterÚwrappers     €r>   rZ   ÚAIA3Model._check_add_weighted_adapter.<locals>.<genexpr>.<genexpr>ï   s   øé € ÐKÂ(°w˜7×2Ñ2Ö2Â(ùs   ƒr   N)Úsum)rW   ru   Úadapterss    @€r>   rZ   Ú7IA3Model._check_add_weighted_adapter.<locals>.<genexpr>î   s&   ùé € ð 
Ú_wÐT[ŒCÔKÁ(ÓKÓKÈaÖOÒ_wùs   „%)zLCannot add weighted adapters targeting the same module with modules_to_save.r   zQAll adapter configs should have the same type for target and feedforward modules.Ú|c              3  ó^   >#   • U  H"  nS TR                   U   R                   S3v •  M$     g7f©Ú(Ú)N©rf   rd   ©rW   rt   rM   s     €r>   rZ   ry   û   s0   øé € Ð)rÒiqÐ^e¨A¨d×.>Ñ.>¸wÑ.G×.VÑ.VÐ-WÐWXÕ*YÒiqùó   ƒ*-c              3  óV   >#   • U  H  nTR                   U   R                  v •  M      g 7frU   r   r€   s     €r>   rZ   ry   ý   s%   øé € Ð,nÒemÐZa¨T×-=Ñ-=¸gÑ-F×-UÖ-UÒemùó   ƒ&)c              3  ó^   >#   • U  H"  nS TR                   U   R                   S3v •  M$     g7fr|   ©rf   r\   r€   s     €r>   rZ   ry      s0   øé € ð /ÚT\È�!�D×$Ñ$ WÑ-×AÑAÐBÀ!ÕDÒT\ùr�   c              3  óV   >#   • U  H  nTR                   U   R                  v •  M      g 7frU   r…   r€   s     €r>   rZ   ry     s"   øé € ÐXÊxÀG�$×"Ñ" 7Ñ+×?Ö?Êxùrƒ   )rf   r5   Úmodulesr+   r   r`   Útyperd   r\   Úlenr   Újoinre   Úunion)	rM   rx   rt   ÚmoduleÚmodules_to_save_wrappersÚtarget_module_typesÚfeedforward_module_typesÚnew_target_modulesÚnew_feedforward_moduless	   ``       r>   Ú_check_add_weighted_adapterÚ$IA3Model._check_add_weighted_adapterâ   s¢  ù€ ó  ˆGØ˜d×.Ñ.Õ.Ü  8¨G¨9°OÐ!DÓEÐEñ  ð
 :>¿¹¼Ó#tº¨vÌ:ÐV\Ô^r×Ks§F¹Ð Ð#tÜô 
Ù_wó
÷ 
ñ 
ô ÐkÓlÐlñ ^fÓfÒ]eÐRYœt D×$4Ñ$4°WÑ$=×$LÑ$LÖMÑ]eÐÐfÙgoÓ#pÒgoÐ\c¤D¨×)9Ñ)9¸'Ñ)B×)VÑ)VÖ$WÑgoÐ Ð#pÜÐ"Ó# aÓ'¬3Ð/GÓ+HÈ1Ó+LÜÐpÓqÐqô Ð%Ó%Ø!$§¡Ô)rÑiqÓ)rÓ!rÑä!$§¢Ô,nÑemÓ,nÐ!oÐäÐ*Ó*Ø&)§h¡hô /ÙT\ó/ó 'Ð#ð "Ð:Ð:ô	 '*§i¢iÜXÉxÓXð'Ð#ð "Ð:Ð:ùò7 $uùò gùÚ#ps   ½FÁFÂ,F$Â=,F)c                óV  • U[        U R                  R                  5       5      ;   a  gU R                  US9u  pE[	        U R                  US      UUS9U R                  U'   U R                  U R                  U5        [        U R                  U5        U R                  R                  5        VVs/ s H  u  pgU R                  U;  d  M  UPM     nnnU HÊ  n[        U R                  U5      u  pyn[        U	[        5      (       d  M3  X9R                  ;   a  U	R                  U   n
OMT  U
R                  R                  5       U
l        [!        X5       HH  u  p¼X¹R                  ;   a  U	R                  U   nOM&  U
=R                  UR                  U-  -  sl        MJ     MÌ     gs  snnf )a  
This method adds a new adapter by merging the given adapters with the given weights.

Args:
    adapters (`list`):
        List of adapter names to be merged.
    weights (`list`):
        List of weights for each adapter.
    adapter_name (`str`):
        Name of the new adapter.
N)rx   r   )rd   r\   )Úlistrf   Úkeysr’   r   Úinject_adapterrH   r   Únamed_modulesr   r   r+   r   Úia3_lÚdataÚzero_Úzip)rM   rx   Úweightsr7   r�   r‘   rY   Ú_Úkey_listr8   Útarget_ia3_lrt   r1   Úcurrent_adapter_ia3_ls                 r>   Úadd_weighted_adapterÚIA3Model.add_weighted_adapter
  ss  € ð" œ4 × 0Ñ 0× 5Ñ 5Ó 7Ó8Ó8Øà6:×6VÑ6VØð 7Wð 7
Ñ3Ðô *1Ø×Ñ˜X a™[Ñ)Ø-Ø 7ñ*
ˆ×Ñ˜Ñ&ð
 	×Ñ˜DŸJ™J¨Ô5ô 	˜Ÿ
™
 LÔ1à&*§j¡j×&>Ñ&>Ô&@Ô[Ò&@™F˜CÀDÇKÁKÐWZÑDZ—CÑ&@ˆÑ[ÛˆCÜ*¨4¯:©:°sÓ;‰LˆA�qÜ˜&¤(×+Ó+Ø§<¡<Ó/Ø#)§<¡<°Ñ#=‘Láà$0×$5Ñ$5×$;Ñ$;Ó$=�Ô!Ü'*¨8Ö'=‘O�GØ§,¡,Ó.Ø06·±¸WÑ0EÑ-á Ø ×%Ò%Ð)>×)CÑ)CÀfÑ)LÑL×%ó (>ò ùó \s   Â1F%ÃF%© )Úreturnr]   )rx   ú	list[str]r¥   ztuple[str, str])rx   r¦   r�   zlist[float]r7   r   r¥   ÚNone)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   Ú__annotations__r   Útuner_layer_clsÚstaticmethodr?   rQ   rF   rh   rl   r’   r¢   Ú__static_attributes__Ú__classcell__)rn   s   @r>   r   r   $   s    ø‡ ñ"ðH €FˆCÓØ€OàñAó ðAòFJð@ ó	ó ð	ð ñó ðõEô,&;ðP1Màð1Mð ð1Mð ð	1Mð
 
÷1Mò 1MrA   r   )Ú
__future__r   r^   r3   Údataclassesr   r2   Útransformers.pytorch_utilsr   Úpeft.import_utilsr   r   Úpeft.tuners.tuners_utilsr   r	   Ú
peft.utilsr
   r   r   r   r   Úlayerr   r   r   r   r   r¤   rA   r>   Ú<module>r¹      sA   ðõ #ã 	Û Ý ã Ý -ç Eß >÷õ ÷ 4Ó 3ôWMˆyõ WMrA   