ó
    >:j—  ã                   ó¢   • S SK Jr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  SS
KJr  SSKJrJr   " S S\5      rg)é    )Úis_bnb_4bit_availableÚis_bnb_available)Ú	BaseTunerÚget_device_map)Ú1TRANSFORMERS_MODELS_TO_OFT_TARGET_MODULES_MAPPINGÚget_quantization_configé   )Údispatch_aqlm)Údispatch_awq)Údispatch_eetq)Údispatch_gptq)Údispatch_hqq)Údispatch_inc)ÚOFTLayerÚdispatch_defaultc                   óZ   ^ • \ rS rSr% SrSr\\S'   \r	\
rS r\S 5       rU 4S jrSrU =r$ )	ÚOFTModelé#   a™  
Creates Orthogonal Finetuning model from a pretrained model. The method is described in
https://huggingface.co/papers/2306.07280

Args:
    model (`torch.nn.Module`): The model to which the adapter tuner layers will be attached.
    config ([`OFTConfig`]): The configuration of the OFT 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 OFT model.

Example:
    ```py
    >>> from diffusers import StableDiffusionPipeline
    >>> from peft import OFTModel, OFTConfig

    >>> config_te = OFTConfig(
    ...     r=8,
    ...     target_modules=["k_proj", "q_proj", "v_proj", "out_proj", "fc1", "fc2"],
    ...     module_dropout=0.0,
    ...     init_weights=True,
    ... )
    >>> config_unet = OFTConfig(
    ...     r=8,
    ...     target_modules=[
    ...         "proj_in",
    ...         "proj_out",
    ...         "to_k",
    ...         "to_q",
    ...         "to_v",
    ...         "to_out.0",
    ...         "ff.net.0.proj",
    ...         "ff.net.2",
    ...     ],
    ...     module_dropout=0.0,
    ...     init_weights=True,
    ... )

    >>> model = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")
    >>> model.text_encoder = OFTModel(model.text_encoder, config_te, "default")
    >>> model.unet = OFTModel(model.unet, config_unet, "default")
    ```

**Attributes**:
    - **model** ([`~torch.nn.Module`]) -- The model to be adapted.
    - **peft_config** ([`OFTConfig`]): The configuration of the OFT model.
Úoft_Úprefixc                 ó~  • Uc  [        S5      eUR                  UR                  UR                  UR                  UR
                  UR                  UR                  UR                  UR                  UR                  [        U R                  SS5      [        U R                  SS5      S.n/ SQn	U	 H#  n
[        U R                  U
S9nUc  M  X¸U
 S3'   M%     [        U[        5      (       d^  [!        U R                  5      nU R"                  " XU4S	U0UD6nX R$                  ;  a  UR'                  S5        U R)                  XTXÓ5        g UR+                  UUR                  UR                  UR                  UR                  UR
                  UR                  UR                  UR                  UR                  S
9
  g )NzCurrent Key shouldn't be `None`Úis_loaded_in_8bitFÚis_loaded_in_4bit)ÚrÚoft_block_sizeÚmodule_dropoutÚcoftÚepsÚblock_shareÚuse_cayley_neumannÚnum_cayley_neumann_termsÚfan_in_fan_outÚinit_weightsÚloaded_in_8bitÚloaded_in_4bit)ÚgptqÚaqlmÚawq)ÚmethodÚ_quantization_configÚ
device_map)	r   r   r   r   r   r   r    r!   r#   )Ú
ValueErrorr   r   r   r   r   r   r    r!   r"   r#   ÚgetattrÚmodelr   Ú
isinstancer   r   Ú_create_new_moduleÚactive_adaptersÚrequires_grad_Ú_replace_moduleÚupdate_layer)ÚselfÚ
oft_configÚadapter_nameÚtargetÚtarget_nameÚparentÚcurrent_keyÚoptional_kwargsÚkwargsÚquant_methodsÚquant_methodÚquantization_configr+   Ú
new_modules                 ÚR/home/mande/repo/quber/.venv/lib/python3.13/site-packages/peft/tuners/oft/model.pyÚ_create_and_replaceÚOFTModel._create_and_replace[   s“  € ð ÑÜÐ>Ó?Ð?ð —‘Ø(×7Ñ7Ø(×7Ñ7Ø—O‘OØ—>‘>Ø%×1Ñ1Ø",×"?Ñ"?Ø(2×(KÑ(KØ(×7Ñ7Ø&×3Ñ3Ü% d§j¡jÐ2EÀuÓMÜ% d§j¡jÐ2EÀuÓMñ
ˆò 0ˆÛ)ˆLÜ"9¸$¿*¹*È\Ñ"ZÐØ"Ó.Ø@S˜,˜Ð';Ð<Ó=ñ *ô ˜&¤(×+Ñ+Ü'¨¯
©
Ó3ˆJØ×0Ò0°È6ÑsÐ^hÐsÐlrÑsˆJØ×#7Ñ#7Ó7à×)Ñ)¨%Ô0Ø× Ñ  °jÕIà×ÑØØ—,‘,Ø)×8Ñ8Ø)×8Ñ8Ø—_‘_Ø—N‘NØ&×2Ñ2Ø#-×#@Ñ#@Ø)3×)LÑ)LØ'×4Ñ4ð  ò ó    c           	      ód  • / n[        5       (       a  SSKJn  UR                  U5        [	        5       (       a  SSKJn  UR                  U5        UR                  [        [        [        [        [        [        [        /5        S nU H  nU" X!4SU 0UD6nUc  M    O   Uc  [        SU S35      eU$ )Nr	   )Údispatch_bnb_8bit)Údispatch_bnb_4bitr6   zTarget module zm is not supported. Currently, only the following modules are supported: `torch.nn.Linear`, `torch.nn.Conv2d`.)r   ÚbnbrG   Úappendr   rH   Úextendr   r
   r   r   r   r   r   r,   )	r6   r7   r8   r=   ÚdispatchersrG   rH   rA   Ú
dispatchers	            rB   r0   ÚOFTModel._create_new_module“   sÆ   € ð ˆô ×ÑÝ.à×ÑÐ0Ô1ä ×"Ñ"Ý.à×ÑÐ0Ô1à×ÑäÜÜÜÜÜÜ ðô
	
ð ˆ
Û%ˆJÙ# FÑZÀZÐZÐSYÑZˆJØÓ%Ùñ &ð
 ÑäØ   ð )8ð 8óð ð
 ÐrE   c                 óÄ   >• [         TU ]  5         [        U R                  SS5      S:X  a  [	        S5      eU R
                  R                  S5      (       a  [	        S5      eg)z{Verify that the configuration supports merging.

Currently gptq quantization and replicated layers do not support merging.
Úquantization_methodNr&   z8Cannot merge OFT layers when the model is gptq quantizedÚlayer_replicationz=Cannot merge OFT layers when base model layers are replicated)ÚsuperÚ_check_merge_allowedr-   r.   r,   Úpeft_configÚget)r5   Ú	__class__s    €rB   rS   ÚOFTModel._check_merge_allowed¿   s[   ø€ ô
 	‰Ñ$Ô&Ü�4—:‘:Ð4°dÓ;¸vÓEÜÐWÓXÐXØ×Ñ×ÑÐ 3×4Ñ4ÜÐ\Ó]Ð]ð 5rE   © )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   ÚstrÚ__annotations__r   Útuner_layer_clsr   Útarget_module_mappingrC   Ústaticmethodr0   rS   Ú__static_attributes__Ú__classcell__)rV   s   @rB   r   r   #   sG   ø‡ ñ1ðf €FˆCÓØ€OØMÐò6ðp ñ)ó ð)÷V	^ó 	^rE   r   N)Úpeft.import_utilsr   r   Úpeft.tuners.tuners_utilsr   r   Ú
peft.utilsr   r   r'   r
   r(   r   Úeetqr   r&   r   Úhqqr   Úincr   Úlayerr   r   r   rX   rE   rB   Ú<module>rl      s<   ð÷  F÷÷õ
  Ý Ý Ý Ý Ý ß -ôe^ˆyõ e^rE   