
    oiG                    n    S SK Jr  S SKrS SKJ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)chain)	BaseTunerBaseTunerLayer)1TRANSFORMERS_MODELS_TO_C3A_TARGET_MODULES_MAPPING   )C3ALayer	C3ALinearc                  F    \ rS rSr% SrSrS\S'   \r\	r
S r\S 5       rSrg	)
C3AModel   a2  
Creates C3A model from a pretrained transformers model.

The method is described in detail in https://huggingface.co/papers/2407.19342.

Args:
    model ([`torch.nn.Module`]): The model to be adapted.
    config ([`C3AConfig`]): The configuration of the C3A model.
    adapter_name (`str`): The name of the adapter, defaults to `"default"`.

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

**Attributes**:
    - **model** ([`~transformers.PreTrainedModel`]) -- The model to be adapted.
    - **peft_config** ([`C3AConfig`]): The configuration of the C3A model.
c3a_strprefixc                  ^ Tc  [        S5      e[        [        UR                  R	                  5       5      5      n[        [        U4S jU5      T5      n	UR                  R                  XR                  5      n
U
UR                  S.n[        U[        5      (       a  UR                  UU
UR                  5        g U R                  " XU40 UD6nX R                  :w  a  UR                  S5        U R!                  XTX5        g )NzCurrent Key shouldn't be `None`c                :   > [         R                  " SU  S3T5      $ )Nz.*\.$)rematch)keycurrent_keys    O/home/james-whalen/.local/lib/python3.13/site-packages/peft/tuners/c3a/model.py<lambda>.C3AModel._create_and_replace.<locals>.<lambda>B   s    "((d3%q>;2W    )
block_sizeinit_weightsF)
ValueErrorlistr   block_size_patternkeysnextfiltergetr   r   
isinstancer
   update_layer_create_new_moduleactive_adapterrequires_grad__replace_module)self
c3a_configadapter_nametargettarget_nameparentr   optional_kwargspattern_keystarget_name_keyr   kwargs
new_modules         `      r   _create_and_replaceC3AModel._create_and_replace4   s     >??E*"?"?"D"D"FGHv&WYefhst2266H]H]^
$&33

 fi(('' 006\U[\J222))%0  jIr   c                    [        U[        5      (       a  UR                  5       nOUn[        U[        R                  R
                  5      (       a  [        X!40 UD6nW$ )N)r%   r   get_base_layertorchnnLinearr
   )r,   r-   r.   r4   target_base_layerr5   s         r   r'   C3AModel._create_new_moduleW   sO    fn-- & 5 5 7 &'99"6B6BJr    N)__name__
__module____qualname____firstlineno____doc__r   __annotations__r	   tuner_layer_clsr   target_module_mappingr6   staticmethodr'   __static_attributes__r?   r   r   r   r      s9    $ FCOM!JF 	 	r   r   )
__future__r   r   	itertoolsr   r:   peft.tuners.tuners_utilsr   r   
peft.utilsr   layerr	   r
   r   r?   r   r   <module>rO      s.    # 	   > 'Dy Dr   