
    oi<                    b    S SK Jr  S SKrS SKrS SKJrJr  S SKJr  SSK	J
r
Jr   " S S\5      rg)	    )annotationsN)	BaseTunerBaseTunerLayer)3TRANSFORMERS_MODELS_TO_SHIRA_TARGET_MODULES_MAPPING   )Linear
ShiraLayerc                  F    \ rS rSr% SrSrS\S'   \r\	r
S r\S 5       rSrg	)

ShiraModel   a:  
Creates a Sparse High Rank Adapter (SHiRA) Model from a pretrained model.

Args:
    model ([`~transformers.PreTrainedModel`]): The model to be adapted.
    config ([`ShiraConfig`]): The configuration of the SHiRA model.
    adapter_name (`str`): The name of the adapter, defaults to `"default"`.

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

Example:

    ```py
    >>> from transformers import AutoModelForCausalLM
    >>> from peft import ShiraConfig, get_peft_model

    >>> base_model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m")
    >>> config = ShiraConfig(r=32)
    >>> model = get_peft_model(base_model, config)
    ```

**Attributes**:
    - **model** ([`~transformers.PreTrainedModel`]) -- The model to be adapted.
    - **peft_config** ([`ShiraConfig`]): The configuration of the SHiRA model.
shira_strprefixc                X   Uc  [        S5      e[        US5      =(       a    UR                  S Ln0 n	XS'   UR                  S:X  a  UR                  U	S'   UR                  5        H	  u  pXU
'   M     [        U[        5      (       a^  UR                  b(  UR                  " UR                  UR                  40 U	D6OS nUR                  UUUR                  UR                  S9  g U R                  " XU40 U	D6nX R                  ;  a  UR                  S5        U R!                  XTX5        g )NzCurrent Key shouldn't be `None`biasrandomrandom_seed)init_weightsF)
ValueErrorhasattrr   	mask_typer   items
isinstancer   mask_fn
base_layerrupdate_layerr   _create_new_moduleactive_adapterrequires_grad__replace_module)selfshira_configadapter_nametargettarget_nameparentcurrent_keyoptional_kwargsr   kwargskvmask
new_modules                 Q/home/james-whalen/.local/lib/python3.13/site-packages/peft/tuners/shira/model.py_create_and_replaceShiraModel._create_and_replace=   s+    >??vv&B6;;d+Bv!!X-$0$<$<F=!#))+DA1I , ff%%  ''3 $$V%6%6Q&Q 
 )66	    00V^W]^J#6#66))%0  jI    c                   U R                   nUR                  SS5      n[        U[        5      (       a  UR	                  5       nOUn[        U[
        R                  R                  5      (       a&  U(       a  [        R                  " S5        S=o@l         O[        SU S35      eU R                  b  U R                  " X`R                  40 UD6OS n[        UUUU R                  U4SU R                  0UD6nU$ )Nr   Fzjfan_in_fan_out is set to True but the target module is `torch.nn.Linear`. Setting fan_in_fan_out to False.zTarget module zZ is not supported. Currently, only the following modules are supported: `torch.nn.Linear`.r   )fan_in_fan_outpopr   r   get_base_layertorchnnr   warningswarnr   r   r   r   )	r#   r$   r%   r*   r4   _target_base_layerr-   r.   s	            r/   r   ShiraModel._create_new_modulef   s   %44JJvu%fn-- & 5 5 7 &'997 @ED!<  )% %  ##/   !2NNMfM 	 NN
 &22
 

 r2    N)__name__
__module____qualname____firstlineno____doc__r   __annotations__r	   tuner_layer_clsr   target_module_mappingr0   staticmethodr   __static_attributes__r>   r2   r/   r   r      s9    6 FC OO'JR ' 'r2   r   )
__future__r   r9   r7   peft.tuners.tuners_utilsr   r   
peft.utilsr   layerr   r	   r   r>   r2   r/   <module>rM      s+    #   > &q qr2   