
    bi-                        d dl mZ d dlZd dlZd dlmZ d dlmZ d dlm	Z	 d dl
mZ d dlZd dlmZ d dlmZmZmZ d d	lmZmZmZ d
dlmZ d
dlmZmZ  G d de      Zy)    )annotationsN)asdict)Enum)chain)Optional)tqdm)	BaseTunerBaseTunerLayercheck_target_module_exists)1TRANSFORMERS_MODELS_TO_C3A_TARGET_MODULES_MAPPINGModulesToSaveWrapper_get_submodules   )	C3AConfig)C3ALayer	C3ALinearc                       e Zd ZU dZdZded<   ddZed        Zd Z	d Z
dd	Zed
        Zd fdZdddZdddZddZddZddZed        Z	 	 	 	 d	 	 	 	 	 ddZ	 d 	 	 	 	 	 	 	 d!dZd"dZ xZS )#C3AModela@  
    Creates C3A model from a pretrained transformers model.

    The method is described in detail in [TODO].

    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        | j                        dkD  r2|j                  dk7  r"t        | j                  j
                   d      yy)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.

        r   nonezf supports only 1 adapter with bias. When using multiple adapters, set bias to 'none' for all adapters.N)lenpeft_configbias
ValueError	__class____name__)selfconfigs     P/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/peft/tuners/c3a/model.py_check_new_adapter_configz"C3AModel._check_new_adapter_config:   sR       !A%FKK6,A>>**+ ,7 7  -B%    c                    t        | |      S N)r   )
c3a_configkeys     r"   _check_target_module_existsz$C3AModel._check_target_module_existsI   s    )*c::r$   c                   t        d      t        t        |j                  j	                                     }t        t        fd|            }	|j                  j                  |	|j                        }
|
|j                  d}t        |t              r|j                  ||
|j                         y  | j                  |||fi |}|| j                  k7  r|j                  d       | j!                  ||||       y )NzCurrent Key shouldn't be `None`c                8    t        j                  d|  d      S )Nz.*\.$)rematch)r(   current_keys    r"   <lambda>z.C3AModel._create_and_replace.<locals>.<lambda>[   s    "((d3%q>;2W r$   )
block_sizeinit_weightsF)r   listr   block_size_patternkeysnextfiltergetr1   r2   
isinstancer   update_layer_create_new_moduleactive_adapterrequires_grad__replace_module)r    r'   adapter_nametargettarget_nameparentr/   optional_kwargspattern_keystarget_name_keyr1   kwargs
new_modules         `      r"   _create_and_replacezC3AModel._create_and_replaceM   s     >??E*"?"?"D"D"FGHv&WYefhst2266
H]H]^
$&33

 fi('' 100\6\U[\Jt222))%0  j&Ir$   c                   t        |||       t        |d      r|j                  }t        |d      s.|j                  |_        t        |d      r|j                  |_        t        |dd       ^t        |d      r|j                  |j                  _        n|j                  |_        |j                  |j                  j                         t        j                  d      |j                         D ]\  \  }}| j                  |v st        fd|j                         D              r8|j                  |j                  j                         ^ y )N
base_layerr   statemetac              3  <   K   | ]  }|j                   k(    y wr&   )device).0prL   s     r"   	<genexpr>z+C3AModel._replace_module.<locals>.<genexpr>   s     I188t+Is   )setattrhasattrrJ   weightr   getattrrK   torN   torchnamed_modulesr   any
parameters)r    rB   
child_namerG   childnamemodulerL   s          @r"   r>   zC3AModel._replace_modulep   s   
J/
 5,'$$Ez<0 %Juf%"'**
5'4(4z<0.3kk
%%+#(;;
 MM%,,--.||F#&446 	3LD&{{d"IV5F5F5HIIIIell112	3r$   c                   |j                         D ]  \  }}| j                  |vsd|_         | j                  D ]  }| j                  |   j
                  }|dk(  r"|dk(  r%|j                         D ]  \  }}d|v sd|_         L|dk(  rR|j                         D ]>  }t        |t              st        |d      s!|j
                  .d|j
                  _        @ t        d| d       y )	NFr   allr   Tc3a_onlyzRequested bias: z, is not implemented.)named_parametersr   requires_gradactive_adaptersr   r   modulesr9   r   rS   NotImplementedError)r    modelnrP   r<   r   ms          r"    _mark_only_adapters_as_trainablez)C3AModel._mark_only_adapters_as_trainable   s    **, 	(DAq{{!#"'	( #22 	ZN##N388Dv~u}!224 /DAq{*./ # 4A!!X.71f3E!&&J\/3,4 *,<TFBW*XYY	Zr$   c                    t        |t              r|j                         }n|}t        |t        j                  j
                        rt        ||fi |}S r&   )r9   r
   get_base_layerrW   nnLinearr   )r'   r?   r@   rF   target_base_layerrG   s         r"   r;   zC3AModel._create_new_module   sK    fn- & 5 5 7 &'9"6<B6BJr$   c                n    	 t         |   |      S # t        $ r t        | j                  |      cY S w xY w)z1Forward missing attributes to the wrapped module.)super__getattr__AttributeErrorrU   rg   )r    r]   r   s     r"   rr   zC3AModel.__getattr__   s8    	-7&t,, 	-4::t,,	-s    44c           
        i }| j                   j                         D ]U  \  }}t        |      j                         D ci c]$  \  }}|t        |t              r|j
                  n|& }}}|sQd|d<   W |<   |S c c}}w )NTinference_mode)r   itemsr   r9   r   value)r    	inferenceconfig_dictr(   rw   kvr!   s           r"   get_peft_config_as_dictz C3AModel.get_peft_config_as_dict   s    **002 	0JCKQRW=K^K^K`a41aaJq$$7Q>aFa+/'(	0 "C	 bs   )A<c                    | j                   j                         D ]*  }t        |t        t        f      s|j                  |       , y r&   )rg   re   r9   r
   r   enable_adapters)r    enabledr^   s      r"   _set_adapter_layerszC3AModel._set_adapter_layers   s<    jj((* 	0F&>3G"HI&&w/	0r$   c                (    | j                  d       y)zyEnable all adapters.

        Call this if you have previously disabled all adapters and want to re-enable them.
        Tr   N)r   r    s    r"   enable_adapter_layerszC3AModel.enable_adapter_layers   s    
 	   .r$   c                    | j                   D ]<  }| j                  |   j                  }|dk7  s"d| d}t        j                  |       > | j                  d       y)zDisable all adapters.

        When disabling all adapters, the model output corresponds to the output of the base model.
        r   z>Careful, disabling adapter layers with bias configured to be 'zP' does not produce the same output as the the base model would without adaption.Fr   N)rd   r   r   warningswarnr   )r    r<   valmsgs       r"   disable_adapter_layerszC3AModel.disable_adapter_layers   sr    
 #22 	#N"">277Cf}TUXTY ZK K  c"	# 	   /r$   c                    | j                   j                         D ]U  }t        |t              s|j                  r%t        j                  d       |j                          |j                  |       W || _	        y)zSet the active adapter(s).

        Args:
            adapter_name (`str` or `list[str]`): Name of the adapter(s) to be activated.
        zJAdapter cannot be set when the model is merged. Unmerging the model first.N)
rg   re   r9   r   mergedr   r   unmergeset_adapterr<   )r    r?   r^   s      r"   r   zC3AModel.set_adapter   s`     jj((* 	1F&(+==MM"noNN$""<0	1 +r$   c                ~    | j                   0|d   t        vrt        d      t        t        |d            | _         | S )N
model_typez0Please specify `target_modules` in `peft_config`)target_modulesr   r   set)r   model_configs     r"   _prepare_adapter_configz C3AModel._prepare_adapter_config   sJ    %%-L)1bb !STT),A,|B\]*K& r$   c                "   | j                   j                         D cg c]  \  }}| j                  |vs| }}}d|rdndz   dz   }t        || |      D ]  }	 t	        | j                   |      \  }	}
}t        |
d      r8|r|
j                  ||       | j                  |	||
j                         |
       bt        |
t              sst        |	||
j                  |
j                             | j                   S c c}}w # t
        $ r Y w xY w)Nz
Unloading zand merging  rg   )disabledescrJ   )
safe_mergeadapter_names)rg   rX   r   r   r   rs   rS   merger>   rl   r9   r   rR   modules_to_saver<   )r    r   progressbarr   r   r(   _key_listr   rB   r@   rA   s               r"   _unload_and_optionally_mergez%C3AModel._unload_and_optionally_merge   s
    '+jj&>&>&@[FCDKKWZDZC[[~B?'Ik/E 	\C.=djj#.N+ v|,LLJmLT$$V[&:O:O:QSYZF$89V-C-CFDYDY-Z[	\ zz! \
 " s   C<C<D	DDc                *    | j                  |||      S )a  
        This method merges the C3A layers into the base model. This is needed if someone wants to use the base model as
        a standalone model.

        Args:
            progressbar (`bool`):
                whether to show a progressbar indicating the unload and merge process
            safe_merge (`bool`):
                whether to activate the safe merging check to check if there is any potential Nan in the adapter
                weights
            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`.
        )r   r   r   r   )r    r   r   r   s       r"   merge_and_unloadzC3AModel.merge_and_unload	  s#    " 00#
- 1 
 	
r$   c                &    | j                  d      S )z
        Gets back the base model by removing all the C3A modules without merging. This gives back the original base
        model.
        F)r   r   r   s    r"   unloadzC3AModel.unload  s    
 00u0==r$   )r!   r   returnNone)rg   torch.nn.Moduler   r   )r]   r   )F)rx   bool)T)r   r   r   r   )r   r   )r?   zstr | list[str]r   r   )TFFN)r   r   r   r   r   Optional[list[str]])FFN)r   r   r   r   r   r   r   r   )r   r   )r   
__module____qualname____doc__r   __annotations__r#   staticmethodr)   rH   r>   rj   r;   rr   r|   r   r   r   r   r   r   r   r   __classcell__)r   s   @r"   r   r   %   s    $ FC ; ;!JF38Z* 	 	-0
/0+   ! -1  	
 +4 im

59
Re
	
*>r$   r   )
__future__r   r-   r   dataclassesr   enumr   	itertoolsr   typingr   rW   r   peft.tuners.tuners_utilsr	   r
   r   
peft.utilsr   r   r   r!   r   layerr   r   r    r$   r"   <module>r      sH    # 	        Z Z   &~>y ~>r$   