
    oi                   ~   S SK Jr  S SKrS SKrS SKJr  S SKJrJrJ	r	  S SK
r
S SKJr  S SKJs  Jr  S SK
Jr  S SKJr  S SKJr  S SKJrJrJr  S S	KJrJrJrJr  S S
KJr  S SK J!r!  SSK"J#r#J$r$  S/r% " S S5      r& " S S\5      r' " S S\RP                  \'5      r) " S S\RP                  \'5      r* " S S\RP                  \'5      r+ " S S\+5      r, " S S\+5      r- " S S\+5      r. " S S \RP                  \'5      r/ " S! S"\RP                  5      r0S# r1 " S$ S%\RP                  \'5      r2 S'         S(S& jjr3g))    )annotationsN)contextmanager)AnyOptionalUnion)svd_lowrank)Conv1D)
BufferDict)BaseTunerLayer_get_in_out_featurescheck_adapters_to_merge)dequantize_module_weightgather_params_ctxget_bnb_param_typeskip_init_on_device)	transpose)PeftWarning   )ArrowConfig
LoraConfigalora_offsetsc                      \ rS rSrSr\S
S j5       r\SS j5       r\SS j5       r\SS j5       r	\          SS j5       r
Srg	)LoraVariant,   ac  
Base class for LoRA variants, e.g. DoRA.

This class should be subclassed and the methods below should be implemented accordingly. The methods should be
implemented as static methods, this makes it easier to combine variants.

Note for developers: These methods are prone to change and should thus considered to be "private". Use at your own
discretion.
c                    [         e)zKInitialization code for the LoRA variant, it's called within `update_layer`NotImplementedError)moduleadapter_names     P/home/james-whalen/.local/lib/python3.13/site-packages/peft/tuners/lora/layer.pyinitLoraVariant.init7   
     "!    c                    [         e)zZSafe merging of the weights from `merge(..., safe_merge=True)`, should return a new tensorr   r   active_adapterorig_weights      r    
merge_safeLoraVariant.merge_safe<   r#   r$   c                    g)zdUnsafe merging of the weights from `merge(..., safe_merge=False)`, should modify the weight in-placeN r&   s      r    merge_unsafeLoraVariant.merge_unsafeA       r$   c                    g)zFRemove the adapter weights from the original weights, then return themNr,   r&   s      r    unmergeLoraVariant.unmergeE   r/   r$   c                    [         e)a  
The forward pass of the LoRA variant, should return the overall result (not just the diff)

Args:
    module (LoraLayer): The module on which the forward pass is called
    active_adapter (str): The name of the active adapter
    x (torch.Tensor): The input to the forward call
    result (torch.Tensor): The result from the base model
    **kwargs: Additional arguments passed from [`LoraLayer.forward`].
r   )r   r'   xresultkwargss        r    forwardLoraVariant.forwardI   s
    $ "!r$   r,   N)r   	LoraLayerr   strreturnNone)r   r9   r'   r:   r(   torch.Tensorr;   r=   )r   r9   r'   r:   r(   r=   r;   r<   )
r   r9   r'   r:   r4   r=   r5   r=   r;   r=   )__name__
__module____qualname____firstlineno____doc__staticmethodr!   r)   r-   r1   r7   __static_attributes__r,   r$   r    r   r   ,   s     " " " " s s U U """ " 	" 
" "r$   r   c                  &   \ rS rSr% SrS\S'   SrS\S'   SSS jjrSS jr       S             SS
 jjr	S r
S rS rS rS r\R                   " 5       S 5       rSS jrSS jrS S jrS!S jrS"S#S jjrS r          S$S jrSrg	)%r9   ^   )lora_Alora_Blora_embedding_Alora_embedding_Bztuple[str, ...]adapter_layer_names)r
lora_alphascalinglora_dropoutother_param_namesc                h   Xl         0 U l        0 U l        0 U l        [        R
                  " 0 5      U l        [        R
                  " 0 5      U l        [        R
                  " 0 5      U l        [        R                  " 0 5      U l
        [        R                  " 0 5      U l        SU l        / U l        0 U l        0 U l        0 U l        ["        R                  R                  5       U l        0 U l        X l        SU l        0 U l        X0l        U R1                  5       n[3        U5      u  pEX@l        XPl        g )NFT)
base_layerrL   rM   rN   nn
ModuleDictrO   rG   rH   ParameterDictrI   rJ   _disable_adaptersmerged_adaptersuse_dora
use_rslora	lora_biastorchlora_magnitude_vector_cachesephemeral_gpu_offloadcast_input_dtype_enabledlora_variantr6   get_base_layerr   in_featuresout_features)selfrR   r^   r6   rb   rc   s         r    __init__LoraLayer.__init__d   s    $MM"-mmB'mmB' " 0 0 4 " 0 0 4!&!)++-*,%*XX%8%8%:"')+@".2%46((*
$8$D!&(r$   c                   g)a  Return a matching LoRA variant for this layer type.

Given the init arguments of this layer, return the correct LoRA variant, if any. E.g., if `use_dora=True`, this
method should return the DoRA variant for the given layer. If `use_alora=True`, same for aLoRA.

If there is no fitting variant, return None.

Note: If this layer type does not support the LoRA variant at all, please raise an error during __init__ as is
convention, and not here.

Nr,   )rd   rX   r6   s      r    resolve_lora_variantLoraLayer.resolve_lora_variant   s     r$   Nc                T
   [        5       R                  5       nUS	 US::  a  [        SU 35      eU
(       a\  [        U R	                  5       SS 5      c@  [
        R                  " S[        U R	                  5       5      R                   S3[        5        U R                  UUU	UUS9nUb  XR                  U'   X R                  U'   X0R                  U'   US:  a  [        R                  " US	9nO[        R                   " 5       nU R"                  R%                  [        R&                  " UU05      5        [        R(                  " U R*                  US
S9U R,                  U'   [        R(                  " X R.                  U
S9U R0                  U'   XR2                  U'   U(       a'  U[4        R6                  " U5      -  U R8                  U'   OX2-  U R8                  U'   X`R:                  U'   XpR<                  U'   [?        U[@        5      (       aU  URC                  S5      (       a?  [E        U R	                  5       RF                  5         U RI                  X5        S S S 5        GO[?        U[@        5      (       aU  URC                  S5      (       a?  [E        U R	                  5       RF                  5         U RK                  X5        S S S 5        GOD[?        U[@        5      (       aR  URM                  5       S:X  a>  [E        U R	                  5       RF                  5         U RO                  U5        S S S 5        OUS:X  a>  [E        U R	                  5       RF                  5         U RQ                  U5        S S S 5        OUS:X  a7  [        RR                  RU                  U R0                  U   RF                  5        O\US:X  a>  [E        U R	                  5       RF                  5         U RW                  U5        S S S 5        OU(       a  U RY                  X5        U R[                  U5        XR                  ;   a   U R                  U   RR                  " U 40 UD6  U R]                  U R^                  US9  [a        U S5      (       aY  U R                   HH  nUU Rb                  ;   d  M  U Rb                  U   Re                  U R,                  U R0                  5        MJ     g g ! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       GN= f! , (       d  f       GN= f)Nrd   r   ?`r` should be a positive integer value but the value passed is bias;`lora_bias=True` was passed but the targeted layer of type E has no bias. This means that merging LoRA weights won't be possible.)rX   	use_alora
use_qaloraqalora_group_sizearrow_config        pFrl   pissacordaoloraloftqeva
orthogonalinference_mode
lora_arrow)3localscopy
ValueErrorgetattrra   warningswarntyper>   r   rh   r`   rL   rM   rS   DropoutIdentityrO   updaterT   Linearrb   rG   rc   rH   rZ   mathsqrtrN   rY   rX   
isinstancer:   
startswithr   weight
pissa_init
corda_initlower
olora_init
loftq_initr!   zeros_orthogonal_initreset_lora_parameters%_move_adapter_to_device_of_base_layerset_adapteractive_adaptershasattrr   on_adapter_change)rd   r   rL   rM   rO   init_lora_weightsrY   rX   ro   rp   rZ   rr   rq   r~   r6   r`   lora_dropout_layeradapters                     r    update_layerLoraLayer.update_layer   s   $ 6N 6^_`^abcc'$"5"5"7FNMMMdSWSfSfShNiNrNrMs tW W 00!/% 1 
 #.:l+ |(2%#!#l!;!#  >P/Q!RS %'IId.>.>$NL!$&IIa1B1B$SL!'0|$)3diil)BDLL&)3DLL&(2%&.l# '--2C2N2Nw2W2W"4#6#6#8#?#?@@ A@)3//4E4P4PQX4Y4Y"4#6#6#8#?#?@@ A@)3//4E4K4K4MQX4X"4#6#6#8#?#?@- A@')"4#6#6#8#?#?@- A@%'GGNN4;;|4;;<,."4#6#6#8#?#?@$$\2 A@&&|G22<@,,,l+00@@--nM 4&&,,doo-OOG,>>t{{DKKX - 'A A@ A@ A@ A@
 A@s<   S.S$S5TT
S!$
S25
T
T
T'c                >   USL a  g XR                   R                  5       ;   Ga8  USL aJ  [        R                  R	                  U R                   U   R
                  [        R                  " S5      S9  OiUR                  5       S:X  aF  [        R                  R                  U R                   U   R
                  SU R                  U   -  S9  O[        SU< 35      e[        R                  R                  U R                  U   R
                  5        U R                  U   (       a6  [        R                  R                  U R                  U   R                  5        XR                   R                  5       ;   a  [        R                  R                  U R                   U   5        [        R                  R                  U R"                  U   5        U R                  U   (       a7  [        R                  R                  U R"                  U   R                  5        g g g )	NFT   )agaussianr   )stdz)Unknown initialization init_lora_weights=)rG   keysrS   r!   kaiming_uniform_r   r   r   r   normal_rL   r   r   rH   rZ   rl   rI   rJ   )rd   r   r   s      r    r   LoraLayer.reset_lora_parameters   s   %;;++-- D( ((\)B)I)ITYYWX\(Z"((*j8L 9 @ @a$&&Q]J^F^_ #M;L:N!OPPGGNN4;;|4;;<~~l+t{{<8==>005577 GGNN400>?GGOOD11,?@~~l+t44\BGGH , 8r$   c                   U R                  5       nUR                  n[        U5      nUR                  nU(       a  [	        U5      nOEU[
        R                  [
        R                  [
        R                  4;   a  UnO[        SU S35      eU R                  U   nU R                  U   nUR                  [
        R                  5      n[
        R                  R                  UR                  5      u  pU	S S 2S U24   U
S U pUR!                  5       U R"                  U   R                  l        UR!                  5       U R$                  U   R                  l        U=R                  XpR$                  U   R                  -  U R"                  U   R                  -  -  sl        US:X  a[  UR'                  UUR(                  UR*                  UR,                  UR.                  S9R                  UR0                  5      nXbl        g US:X  aE  UR'                  UUR2                  UR4                  S9R                  UR0                  5      nXbl        g UR                  U5      nXbR                  l        g )Nz.Unsupported data type for the base layer. Got .4bit)
quant_typequant_storagecompress_statisticsr   8bit)requires_gradhas_fp16_weights)ra   r   r   dtyper   r[   float32float16bfloat16	TypeErrorrN   rL   tolinalgqrdata
contiguousrG   rH   	__class__r   r   r   r   devicer   r   )rd   r   rR   r(   bnb_param_typer   weight_tensorscale_factorrL   QRQrRrs                r    r   LoraLayer.olora_init  s   ((*
 ''+K8!!4Z@Mu}}emmU^^DD'MLUGSTUVV||L1FF< %((7||}1121bqb51Ra5B02L!((-02L!((-l[[-F-M-MMPTP[P[\hPiPpPpppV#'11&11)77$/$C$C")) 2  b##$  !.v%'11)77!,!=!= 2  b##$	 
 !.),,U3M%2"r$   c           	     @   U R                  5       R                  nUR                  nU[        R                  [        R
                  [        R                  4;  a  [        S5      e[        UR                  [        R                  5      U R                  5      nUS:X  ay  [        R                  R                  UR                  SS9u  pVnUS S 2S U R                  U   24   nUS U R                  U    n	XR                  U   -  n	US U R                  U    n
O[!        UR#                  S5      5      S:X  ab  [%        UR                  U R                  U   ['        UR#                  S5      S   5      S9u  pnXR                  U   -  n	UR)                  5       n
O[+        S	U S
35      e[        R,                  " [        R.                  " U	5      5      U
-  nU[        R,                  " [        R.                  " U	5      5      -  nXR0                  U   R                  l        XR2                  U   R                  l        UR                  U R                  U   U-  U-  -
  n[        UR                  U5      U R                  5      nX0R                  5       R                  l        g )NzPlease initialize PiSSA under float32, float16, or bfloat16. Subsequently, re-quantize the residual model to help minimize quantization errors.rw   F)full_matrices_niter_   )niterzLinit_lora_weights should be 'pissa' or 'pissa_niter_[number of iters]', got 	 instead.)ra   r   r   r[   r   r   r   r   r   r   fan_in_fan_outr   svdr   rL   rN   lensplitr   inttr   diagr   rG   rH   )rd   r   r   r   r   VSUhVrSrUhrUrrG   rH   s                 r    r   LoraLayer.pissa_init>  s2   $$&--u~~FFe  699U]]3T5H5HI'||''5'IHA"1,|,,,-B)TVVL)*B,,|,,B+tvvl+,C"((349$TVVL1=N=T=TU^=_`b=c9dJBB ,,|,,B$$&C^_p^qqz{  EJJrN+c1ejjB0006L!((-06L!((-t||L9FBVKK699U+T-@-@A,2$$)r$   c           	     (   U R                  5       nUR                  nUR                  nU[        R                  [        R
                  [        R                  4;  a  [        S5      eUR                  [        R                  5      nUR                  R                  S5      nUR                  R                  S5      n[        US5      (       d  [        S5      eUR                  nUR                  n	UR                  n
UR                   nU R"                  U   n[        R$                  " U
5      R'                  5       (       d)  [        R(                  " U
5      R'                  5       (       a  [        S5      e[        R$                  " U	5      R'                  5       (       d)  [        R(                  " U	5      R'                  5       (       a  [        S5      e[        R$                  " U5      R'                  5       (       d)  [        R(                  " U5      R'                  5       (       a  [        S5      eU	R                  S5      U:w  d  U	R                  S5      U:w  a#  [        S	U	R                  5        S
U SU S35      eU
R                  S5      U:w  a   [        SU
R                  5        S
U S35      eUR                  S5      U:w  d  UR                  S5      U:w  a#  [        SUR                  5        S
U SU S35      eXR*                  U   -  n
UR-                  5       R/                  U
R1                  5       R3                  SS5      5      R5                  5       nU	R/                  U
R1                  5       5      R5                  5       nXR6                  U   R                  l	        XR8                  U   R                  l	        UR                  U R*                  U   U-  U-  -
  nUR                  U5      nX@R                  5       R                  l	        U?g )NzPlease initialize CorDA under float32, float16, or bfloat16. Subsequently, re-quantize the residual model to help minimize quantization errors.r   r   eigensz`eigens` attribute not found for layer, please run `preprocess_corda` first. More information can be found at examples/corda_finetuning/README.md.zdInvalid value found in matrix S. Please file an issue at https://github.com/huggingface/peft/issues.zdInvalid value found in matrix U. Please file an issue at https://github.com/huggingface/peft/issues.zdInvalid value found in matrix V. Please file an issue at https://github.com/huggingface/peft/issues.zMatrix U size mismatch: z vs. (z, z). Please make sure the `lora_config` and `model` argument of `preprocess_corda` is consistent with `get_peft_model`. If you're using cache in `preprocess_corda`, please make sure the cache is built with the same model and LoRA rank.zMatrix S size mismatch: z,). Please make sure the `lora_config` and `model` argument of `preprocess_corda` is consistent with `get_peft_model`. If you're using cache in `preprocess_corda`, please make sure the cache is built with the same model and LoRA rank.zMatrix V size mismatch: r   )ra   r   r   r[   r   r   r   r   r   r   sizer   r   r   U_WCS_WCV_WCrL   isnananyisinfrN   r   mulr   viewr   rG   rH   )rd   r   r   linearr   r   out_dimin_dimr   Ur   r   rL   rG   rH   s                  r    r   LoraLayer.corda_inita  sV   $$&u~~FFe  5==)++""1%!!!$ vx((X  KKKKKKFF<  ;;q>5;;q>#5#5#7#7v  ;;q>5;;q>#5#5#7#7v  ;;q>5;;q>#5#5#7#7v 
 66!9166!9>*1668*F7)2aS Ip p 
 66!9>*1668*F1# >Y Y 
 66!9!&&)q.*1668*F6("QC Hp p  	
\\,'' 1668==Q/0;;=qvvx++-06L!((-06L!((-t||L9FBVKK5!,2$$) Mr$   c                   SSK Jn  U R                  5       R                  nU R                  R                  SS5      U R                  U   U R                  R                  SS5      S.nU" U40 UD6u  pVnXR                  R                  5       ;   a:  X`R                  U   R                  l	        XpR                  U   R                  l	        XR                  R                  5       ;   a:  X`R                  U   R                  l	        XpR                  U   R                  l	        XPR                  5       R                  l	        g )Nr   )r   
loftq_bits   
loftq_iterr   )num_bitsreduced_ranknum_iter)peft.utils.loftq_utilsr   ra   r   r6   getrL   rG   r   r   rH   rI   rJ   )rd   r   r   r   r6   qweightrG   rH   s           r    r   LoraLayer.loftq_init  s    5$$&--a8 FF<0a8
 #-V">v">;;++--4:KK%,,14:KK%,,1005577>D!!,/66;>D!!,/66;,3$$)r$   c                L   U R                   U   nUS-  S:w  a  [        SU S35      e[        R                  " X"5      n[        R                  R                  U5      u  pEUSS S2S S 24   nUSS S2S S 24   nU R                  5       R                  R                  n[        R                  " U R                  US-  5      R                  U5      R                  S-  n	[        R                  " US-  U R                  5      R                  R                  U5      S-  n
[        R                  " U	R                  5       R!                  U5      5      U R"                  U   l        [        R                  " U
R                  5       R!                  U5      5      U R$                  U   l        g )Nr   r   zAOrthogonal initialization requires the LoRA rank to be even, got r   r   g      $@)rL   r   r[   randnr   r   ra   r   r   rb   mmTrc   rS   	Parameterr   r   rG   rH   )rd   r   rankXr   _q_oddq_evenr   rG   rH   s              r    r   LoraLayer.orthogonal_init  sS    vvl#!8q=`ae`ffopqqKK#||q!!$Q$'
14a47##%,,22T--tqy9<<UCEELTQY(9(9:<<??G$N+-<<8I8I8K8N8Nu8U+VL!(+-<<8I8I8K8N8Nu8U+VL!(r$   c                     X R                   U'   g N)r]   rd   keyvalues      r    _cache_storeLoraLayer._cache_store  s    !Sr$   c                <    U R                   R                  U5      nU$ r  )r]   popr  s      r    
_cache_popLoraLayer._cache_pop  s      %r$   c                H   XR                   ;  a  gU R                  R                  US5      (       aC  X R                  U   -  [        R
                  " U R                  U   5      -  U R                   U'   gX R                  U   -  U R                  U   -  U R                   U'   g)zSet the scale of the given adapter to the initial scale multiplied by the provided factor

The initial scale is determined by the configured `r` (rank) and `lora_alpha`.
NF)rN   rY   r   rM   r   r   rL   )rd   r   scales      r    	set_scaleLoraLayer.set_scale  s    
 ,,&??w..$)OOG,D$DtyyQUQWQWX_Q`Ga$aDLL!$)OOG,D$Dtvvg$VDLL!r$   c                    US:X  a  gU R                    H9  nX R                  R                  5       ;  a  M"  U R                  U==   U-  ss'   M;     g)zHMultiply the current scale of all active adapters by the provided factorr   N)r   rG   r   rN   rd   r  r'   s      r    scale_layerLoraLayer.scale_layer  sF    A:"22N[[%5%5%77LL(E1(	 3r$   c                   U R                    H  nX R                  R                  5       ;  a  M"  Uc  U R                  R	                  US5      (       aB  U R
                  U   [        R                  " U R                  U   5      -  U R                  U'   M  U R
                  U   U R                  U   -  U R                  U'   M  U R                  U   U-  U R                  U'   M     g)zDivide the current scale of all active adapters by the provided factor. If `scale=None` is passed, reset to
initial scale

The initial scale is determined by the configured `r` (rank) and `lora_alpha`.

NF)
r   rG   r   rY   r   rM   r   r   rL   rN   r  s      r    unscale_layerLoraLayer.unscale_layer  s     #22N[[%5%5%77}??&&~u==37??>3RUYU^U^_c_e_eft_uUv3vDLL037??>3RUYU[U[\jUk3kDLL0/3||N/Ke/S^, 3r$   c                   UR                  SS5      nUc  g[        U5      [        U5      :w  a&  S[        U5       S[        U5       S3n[        U5      eU R                  (       a  Sn[        U5      eU Vs1 s H  ofS:w  d  M
  UiM     nnU H1  nU R                  R                  US5      (       d  M&  S	n[        U5      e   gs  snf )
MCheck if the arguments are compatible with the configs and state of the modeladapter_namesNzNLength of `adapter_names` should be the same as the number of inputs, but got z and z respectively.z`Cannot pass `adapter_names` when there are merged adapters, please call `unmerge_adapter` first.__base__Fz1Cannot pass `adapter_names` when DoRA is enabled.)r   r   r   mergedrX   )	rd   r4   argsr6   r  msgnameunique_adaptersr   s	            r    _check_forward_argsLoraLayer._check_forward_args  s    

?D9 q6S''`}%&eCF8>C  S/!;; uCS/! -:PMDZ=O4MP+L}}  u55I o% , Qs   7	CCc          	        [          Vs0 s H  oUUR                  US 5      _M     nnU R                  " U/UQ70 UD6nUR                  n[	        U5      n	/ n
U	 H9  nU
R                  [        U5       VVs/ s H  u  pX:X  d  M  UPM     snn5        M;     UR                  SS 5      n[        U	5       GH;  u  nnUS:X  a  M  UU R                  R                  5       ;  a  M/  U R                  U   nU R                  U   nU R                  U   nU R                  U   nXU      R                  UR                  R                  5      nUU R                  ;  a7  U" U" U" U5      5      5      U-  nXzU   ==   UR                  U5      -  ss'   M  Ub  X    Vs/ s H  nUU   PM
     snUS'   U R                  U   R                   " U 4UUXzU      S.UDUD6nUR                  U5      XzU   '   GM>     U$ s  snf s  snnf s  snf )Nr   r  r'   r4   r5   )VARIANT_KWARG_KEYSr  rR   r   setappend	enumerater   rG   r   rH   rO   rN   r   r   r`   r7   )rd   r4   r  r  r6   kvariant_kwargsr5   torch_result_dtyper"  sub_batch_indices_listr   indexitemr   ir'   rG   rH   dropoutrN   	sub_batchlora_outputjs                           r    _mixed_batch_forwardLoraLayer._mixed_batch_forward  s!   
 ;MM:LQVZZ400:LM4T4V4#\\m,!#&G"))ImD\*pD\[U`d`o5D\*pq '&**?DA!*?!;A~+T[[%5%5%77[[0F[[0F''7Gll>2G 34778K8KLIT%6%66$VGI,>%?@7Ja01[^^DV5WW1 ,QgQj6kQjA}Q7GQj6kN?3"//?GG#1!";<	
 %  5@NNCU4Va019 "<< O N +q* 7ls   G44G9G9G?)r]   rV   rR   r_   r^   rb   r6   rG   rH   rM   rZ   rO   rI   rJ   r\   r`   rW   rc   rL   rN   rX   rY   )F)rR   	nn.Moduler^   boolr;   r<   rX   r9  r;   Optional[LoraVariant])FFFFN    F)rX   r9  ro   r9  rp   r9  rZ   r9  rr   r   rq   r   r~   r9  )r  r:   r  r   r;   r<   )r  r:   r;   r   )r   r:   r  float | intr;   r<   )r  r=  r;   r<   r  )r  zOptional[float | int]r;   r<   
r4   r=   r  r   r  	list[str]r6   r   r;   r=   )r>   r?   r@   rA   rK   __annotations__rP   re   rh   r   r   r   r   r   r   r[   no_gradr   r	  r  r  r  r  r#  r6  rD   r,   r$   r    r9   r9   ^   s   +gg)WW)<,  $(!#$fY fY fY fY fY "fY fY fYPI2+3Z!3FHT4* ]]_W W "W	2T&&6,,&),:C,OR,	,r$   r9   c                     ^  \ rS rSr           S
                         SU 4S jjjr        SS jrSSS jjrSS jrSS jrSS jr	SU 4S jjr
S	rU =r$ )r   iW  c                   > [         TU ]  5         [        R                  " X40 UD6  X`l        X l        U R                  UUUUUU	U
UUUS9
  Xpl        g )N)rM   rO   r   rY   rX   ro   rZ   rr   )superre   r9   r   _active_adapterr   is_target_conv_1d_layer)rd   rR   r   rL   rM   rO   r   rF  r   rY   rX   ro   rr   rZ   r6   r   s                  r    re   Linear.__init__Y  sh    " 	46v6,+!%/!% 	 	
 (?$r$   c               z    Ub  SSK Jn  U" 5       $ U(       d  U(       d  g SSK JnJn  U(       a  U" 5       $ U" 5       $ )Nr   )ArrowLinearVariant)ALoraLinearVariantDoraLinearVariant)variantsrI  rJ  rK  )rd   rr   rX   ro   r6   rI  rJ  rK  s           r    rh   Linear.resolve_lora_variant}  s6     #4%''	C%''$&&r$   c                   [        X5      nU(       d  gU GH  nX0R                  R                  5       ;   d  M#  U R                  5       nU(       Ga  UR                  R
                  R                  5       nUR                  nX0R                  ;  a%  U R                  U5      nXWR                  U5      -  nOU R                  U   R                  XU5      n[        R                  " U5      R                  5       (       d  [        SU S35      eXTR                  l        U R                   U   (       a  [#        USS5      c  [%        S5      eUR&                  U R(                  U   R&                  U R*                  U   -  -   n[        R                  " U5      R                  5       (       d  [        SU S35      eUR                  U5      UR&                  l        OX0R                  ;  a1  U R                  U5      nUR                  =R
                  U-  sl        O)U R                  U   R-                  XUR                  5        U R                   U   (       a_  [#        USS5      c  [%        S5      eUR&                  =R
                  U R(                  U   R&                  U R*                  U   -  -  sl        U R.                  R1                  U5        GM     g)  
Merge the active adapter weights into the base weights

Args:
    safe_merge (`bool`, *optional*):
        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`.
N1NaNs detected in the merged weights. The adapter  seems to be brokenrl   RImpossible to merge LoRA with `lora_bias=True` because the base layer has no bias.)r   rG   r   ra   r   r   cloner   r`   get_delta_weightr   r)   r[   isfiniteallr   rZ   r   RuntimeErrorrl   rH   rN   r-   rW   r)  )	rd   
safe_merger  r'   rR   r(   
orig_dtypedelta_weightnew_biass	            r    mergeLinear.merge  sn    0D+N!1!1!33!002
 #-"3"3"8"8">">"@K!,!2!2J%->->>'+'<'<^'L#z'BB&*&7&7&G&R&RSWit&u >>+6::<<(OP^O__rs  .9%%*~~n5":vt<D". t#  $.??T[[5P5U5UX\XdXdesXt5t#t$~~h7;;==","STbSccv w#  08{{:/F
, &->->>'+'<'<^'L"))..,>.)).9FFt]g]n]no~~n5":vt<D". t#  #,,N0K0P0PSWS_S_`nSo0oo,$$++N;_ ,r$   c                    U R                   (       d  [        R                  " S5        g[        U R                  5      S:  GaL  U R                  R                  5       nXR                  R                  5       ;   a  U R                  5       R                  nXR                  ;  aB  UR                  nU R                  U5      nU=R                  UR                  U5      -  sl        O%U R                  U   R                  XU5      nXRl        U R                   U   (       aT  U R                  5       R"                  =R                  U R$                  U   R"                  U R&                  U   -  -  sl        [        U R                  5      S:  a  GMK  ggG
This method unmerges all merged adapter layers from the base weights.
 Already unmerged. Nothing to do.Nr   r  r   r   r   rW   r  rG   r   ra   r   r`   r   rT  r   r   r1   rZ   rl   rH   rN   rd   r'   r   rY  rZ  unmergeds         r    r1   Linear.unmerge  s-   
 {{MM<=$&&'!+!11557N!1!1!33,,.55!):)::!'J#'#8#8#HLKK<??:#>>K#00@HH_efH"*K>>.1'')..33t{{>7R7W7WZ^ZfZfguZv7vv3 $&&'!++r$   c                   U R                   U   R                  R                  nU R                   U   R                  R                  nUR                  S:H  =(       a-    U[
        R                  :H  =(       d    U[
        R                  :H  nU R                  U   R                  nU R                   U   R                  nU(       a   UR                  5       nUR                  5       n[        Xe-  U R                  5      U R                  U   -  nU(       ai  UR                  US9nUR                  U5      U R                  U   R                  l        UR                  U5      U R                   U   R                  l        U$ 
Compute the delta weight for the given adapter.

Args:
    adapter (str):
        The name of the adapter for which the delta weight should be computed.
cpur   )rH   r   r   r   r   r[   r   r   rG   floatr   r   rN   r   r   rd   r   r   r   cast_to_fp32weight_Aweight_Boutput_tensors           r    rT  Linear.get_delta_weight  s,    W%,,33G$++11
 {{e+c%--1G1b5TYTbTbKb;;w'..;;w'..~~'H~~'H!("5t7J7JKdll[bNcc),,5,9M 08{{5/ADKK '',/7{{5/ADKK '',r$   c           	         U R                   " U/UQ70 UD6  UR                  SS 5      n[         Vs0 s H  oUUR                  US 5      _M     nnU R                  (       a9  U R                  (       a  U R                  5         U R                  " U/UQ70 UD6nU$ Ub  U R                  " U/UQ7SU0UDUD6nU$ U R                  (       a  U R                  " U/UQ70 UD6nU$ U R                  " U/UQ70 UD6nUR                  nU R                  R                  5       n	U R                   H  n
X;  a  M
  U R                  U
   nU R                  U
   nU R                  U
   nU R                  U
   nU R                  XR                   R                  5      nXR"                  ;  a  X|" U" U" U5      5      5      U-  -   nM  U R"                  U
   R$                  " U 4U
UUS.UDUD6nM     UR'                  U5      nU$ s  snf Nr  r&  )r#  r  r'  disable_adaptersr  r1   rR   r6  r   rG   r   r   rH   rO   rN   _cast_input_dtyper   r`   r7   r   )rd   r4   r  r6   r  r+  r,  r5   r-  lora_A_keysr'   rG   rH   r2  rN   s                  r    r7   Linear.forward  s     4T4V4

?D9:LM:LQVZZ400:LM  {{__Q888FB A &..qq4q}qXfqjpqF> = [[__Q888F: 7 __Q888F!'++**,K"&"6"6!4^4^4++N;,,~6**1mm.A.AB!):)::#fVGAJ-?&@7&JJF!..~>FF'5%	
 ) !F #7* YY12FM Ns   G;c                *   > [         TU ]  5       nSU-   $ Nlora.rD  __repr__rd   repr   s     r    r|  Linear.__repr__6      g }r$   )rE  r   rF  )r   r   rs   FFTFFFNF)r   r:   rL   r   rM   r   rO   rk  r   r9  rF  r9  r   Union[bool, str]rY   r9  rX   r9  ro   r9  rr   r   rZ   r9  r;   r<   )rr   r   rX   r9  ro   r9  r;   r;  FNrX  r9  r  Optional[list[str]]r;   r<   r;   r<   r;   r=   r4   r=   r  r   r6   r   r;   r=   r;   r:   )r>   r?   r@   rA   re   rh   r\  r1   rT  r7   r|  rD   __classcell__r   s   @r    r   r   W  s     !$(-.2 $("? "? 	"?
 "? "? "? "&"? ,"? "? "? "? ""? "?  
!"? "?H'*'6:'GK'	'$A<Fw. D)V r$   r   c                     ^  \ rS rSr         S                       SU 4S jjjrSS jr  S   SS jjrSSS jjrSS jrSS jr	          SS jr
SS	 jrSS
 jrSU 4S jjrSrU =r$ )	Embeddingi;  c                   > U(       a&  [        SU SU R                  R                   S35      e[        TU ]  5         [
        R	                  X5        X`l        X l        U R                  UUUUUUU	UU
S9	  g )Nz
lora_bias=z is not supported for r   rM   rO   r   rY   rX   rZ   rr   )	r   r   r>   rD  re   r9   r   rE  r   )rd   rR   r   rL   rM   rO   r   r   rY   rX   rr   rZ   r6   r   s                r    re   Embedding.__init__=  s     z)4J4>>KbKbJccdeff4,,+!%/!% 	 
	
r$   c               ,    U(       d  g SSK Jn  U" 5       $ )Nr   )DoraEmbeddingVariant)rL  r  )rd   rX   r6   r  s       r    rh   Embedding.resolve_lora_varianta  s    2#%%r$   c                N   [        5       R                  5       nUS	 US::  a  [        SU 35      eU R                  XyS9nUb  XR                  U'   X R
                  U'   X0R                  U'   US:  a  [        R                  " US9nO[        R                  " 5       nXR                  U'   [        R                  " X R                  45      n[        R                  " U R                  U45      n[        R                  " U5      U R                   U'   [        R                  " U5      U R"                  U'   XR$                  U'   U(       a'  U[&        R(                  " U5      -  U R*                  U'   OX2-  U R*                  U'   X`R,                  U'   XpR.                  U'   US:X  a  U R1                  U5        OU(       a  U R3                  X5        U R5                  U5        XR                  ;   a   U R                  U   R6                  " U 40 UD6  U R9                  U R:                  U
S9  g )	Nrd   r   rk   rX   rr   rs   rt   rz   r}   )r   r   r   rh   r`   rL   rM   rS   r   r   rO   r[   r   rb   rc   r   rI   rJ   rZ   r   r   rN   rY   rX   r   r   r   r!   r   r   )rd   r   rL   rM   rO   r   rY   rX   rZ   rr   r~   r6   r`   r   rn  ro  s                   r    r   Embedding.update_layeri  s    6N6^_`^abcc00(0^#.:l+ |(2%#!#l!;!#*<,';;#3#345;; 1 1156.0ll8.Dl+.0ll8.Dl+'0|$)3diil)BDLL&)3DLL&(2%&.l#'OOL)&&|G 	22<@,,,l+00@@--nMr$   c                v   [        X5      nU(       d  gU GH  nX0R                  R                  5       ;   d  M#  U R                  5       nUR                  R
                  nU(       a  UR                  R                  R                  5       nX0R                  ;  a#  X`R                  U5      R                  U5      -  nOU R                  U   R                  XU5      n[        R                  " U5      R                  5       (       d  [        SU S35      eXdR                  l        OvX0R                  ;  a>  UR                  =R                  U R                  U5      R                  U5      -  sl        O)U R                  U   R!                  XUR                  5        U R"                  R%                  U5        GM     g)rO  NrP  rQ  )r   rI   r   ra   r   r   r   rS  r`   rT  r   r)   r[   rU  rV  r   r-   rW   r)  )rd   rX  r  r'   rR   rY  r(   s          r    r\  Embedding.merge  sm    0D+N!6!6!;!;!==!002
'..44
 #-"3"3"8"8">">"@K%->->>#'<'<^'L'O'OPZ'[[&*&7&7&G&R&RSWit&u >>+6::<<(OP^O__rs  .9%%*%->->>"))..$2G2G2W2Z2Z[e2ff.)).9FFt]g]n]no$$++N;1 ,r$   c                x   U R                   (       d  [        R                  " S5        g[        U R                  5      S:  a  U R                  R                  5       nU R                  5       R                  R                  nXR                  R                  5       ;   a  U R                  5       R                  nXR                  ;  a4  U=R                  U R                  U5      R                  U5      -  sl        O%U R                  U   R                  XU5      nXCl        [        U R                  5      S:  a  M  ggr_  )r  r   r   r   rW   r  ra   r   r   rI   r   r`   r   rT  r   r1   )rd   r'   rY  r   rd  s        r    r1   Embedding.unmerge  s     {{MM<=$&&'!+!11557N,,.55;;J!6!6!;!;!==,,.55!):)::KK4#8#8#H#K#KJ#WWK#00@HH_efH"*K $&&'!+r$   c                Z   U R                   U   R                  nU R                  U   R                  nUR                  S:H  =(       a-    U[
        R                  :H  =(       d    U[
        R                  :H  nU R                  U   nU R                   U   nU(       a   UR                  5       nUR                  5       n[        Xe-  S5      U R                  U   -  nU(       aK  UR                  US9nUR                  U5      U R                  U'   UR                  U5      U R                   U'   U$ )rh  ri  Trj  )rJ   r   rI   r   r   r[   r   r   rk  r   rN   r   rl  s           r    rT  Embedding.get_delta_weight  s    &&w/66%%g.44
 {{e+c%--1G1b5TYTbTbKb((1((1~~'H~~'H!("5t<t||G?TT),,5,9M .6[[-?D!!'*-5[[-?D!!'*r$   c          	        U R                   " U/UQ70 UD6nU R                  5       n[        U5      n/ nU H9  n	UR                  [	        U5       V
Vs/ s H  u  pX:X  d  M  U
PM     snn
5        M;     [	        U5       H  u  pUS:X  a  M  XR
                  R                  5       ;  a  M,  U R
                  U   R                  nU R                  U   R                  nU R                  U   nXU      nU R                  UU5      nUU-  U-  nUb  UUR                  UR                  5      -  nXXU   ==   U-  ss'   M     U$ s  snn
f )Nr  )rR   _get_embed_scaler(  r)  r*  rI   r   r   rJ   rN   _embedr   r   )rd   r4   r  r  r6   r5   embed_scaler"  r.  r   r/  r0  r1  r'   embedding_Aembedding_BrN   r3  after_Aadapter_outputs                       r    r6  Embedding._mixed_batch_forward  sR   
 4T4V4 ++-m,!#&G"))ImD\*pD\[U`d`o5D\*pq ' "+?!;A+%:%:%?%?%AA//?AAK//?AAKll>2G 34Ikk)[9G%3w>N &!/+..AUAU2V!V!,-?-) "<, 1 +qs   E!Ec           
         U R                  5       n[        R                  " UUUR                  UR                  UR
                  UR                  UR                  S9$ )N)padding_idxmax_norm	norm_typescale_grad_by_freqsparse)ra   F	embeddingr  r  r  r  r  )rd   inputr   rR   s       r    r  Embedding._embed/  sT    ((*
{{"..(( **)<<$$
 	
r$   c                   U R                   " U/UQ70 UD6  UR                  SS 5      n[         Vs0 s H  oUUR                  US 5      _M     nnU R                  (       a9  U R                  (       a  U R                  5         U R                  " U/UQ70 UD6nU$ Ub  U R                  " U/UQ7SU0UD6nU$ U R                  (       a  U R                  " U/UQ70 UD6nU$ U R                  " U/UQ70 UD6nUR                  nU R                  5       n	U R                   H  n
XR                  ;  a  M  XR                  ;  a  U R                  U
   R                  nU R                  U
   R                  nU R                  U
   nU R!                  X5      nX-  U-  nU	b  XR#                  UR                  5      -  nX-   nM  U R                  U
   R$                  " U 4U
UUS.UDUD6nM     UR#                  U5      nU$ s  snf rs  )r#  r  r'  rt  r  r1   rR   r6  r   r  r   rI   r`   r   rJ   rN   r  r   r7   )rd   r4   r  r6   r  r+  r,  r5   r-  r  r'   r  r  rN   r  r  s                   r    r7   Embedding.forward;  s     4T4V4

?D9:LM:LQVZZ400:LM  {{__Q888FP O &..q_4_}_X^_FL K [[__Q888FH E __Q888F!' //1K"&"6"6!)>)>>!):)::"&"7"7"G"I"IK"&"7"7"G"I"IK"ll>:G"kk!9G&-&;w%FN #.)7..I]I]:^)^#4F!..~>FF'5%	
 ) !F# #72 YY12FY Ns   G<c                *   > [         TU ]  5       nSU-   $ ry  r{  r}  s     r    r|  Embedding.__repr__m  r  r$   )rE  r   )	r   r   rs   FTFFNF)rR   r8  r   r:   rL   r   rM   r   rO   rk  r   r9  r   r  rY   r9  rX   r9  rr   r   rZ   r9  r;   r<   r:  NFrr   r   r~   r9  r  r  r  r  r>  )r  r=   r   r=   r;   r=   r  r  )r>   r?   r@   rA   re   rh   r   r\  r1   rT  r6  r  r7   r|  rD   r  r  s   @r    r  r  ;  s    !$.2 $("
"
 "
 	"

 "
 "
 "
 ,"
 "
 "
 ""
 "
 
"
 "
H&$ %)$<N "<N <N|*<X+$ D&&&)&:C&OR&	&P

0d r$   r  c                     ^  \ rS rSr        S                     SU 4S jjjr  S   SS jjrS rSSS jjrSS jrSS jr	SS jr
SU 4S	 jjrS
rU =r$ )_ConvNdir  c                  > [         TU ]  5         [        R                  X5        UR                  SS5      (       a  [	        S5      eUR
                  S:  a  [        R                  " S5        X1R
                  -  S:w  a3  [	        SUR                  R                   SUR
                   S	U S
35      eX l
        UR                  R                  5       U l        U R                  UUUUUUUU
U	S9	  g )Nro   Fz,aLoRA does not support adapting conv layers.r   zMLoRA adapter added to ConvNd layer with groups > 1. Merging is not supported.r   zTargeting a z with groups=z
 and rank z. Currently, support is limited to conv layers where the rank is divisible by groups. Either choose a different rank or do not target this specific layer.r  )rD  re   r9   r   r   groupsr   r   r   r>   rE  r   dim_kernel_dimr   )rd   rR   r   rL   rM   rO   r   rY   rX   rr   rZ   r6   r   s               r    re   _ConvNd.__init__t  s     	4,::k5))KLLq MMij   A%z33<<=]:K\K\J]]ghigj kW W   ,%,,002!%/!% 	 
	
r$   c           	     @   [        5       R                  5       nUS	 US::  a  [        SU 35      eU(       a\  [        U R	                  5       SS 5      c@  [
        R                  " S[        U R	                  5       5      R                   S3[        5        U R                  XyS9nUb  XR                  U'   X R                  U'   X0R                  U'   US:  a  [        R                  " US	9nO[        R                   " 5       nXR"                  U'   U R	                  5       nUR$                  nUR&                  nUR(                  n[        U5      nS
U R*                  S-
  -  =nnU" U R,                  X/UUSS9U R.                  U'   U" X R0                  UUUR2                  US9U R4                  U'   XR6                  U'   U(       a'  U[8        R:                  " U5      -  U R<                  U'   OX2-  U R<                  U'   X`R>                  U'   XpR@                  U'   US:X  a  U RC                  U5        OU(       a  U RE                  X5        U RG                  U5        XR                  ;   a   U R                  U   RH                  " U 40 UD6  U RK                  U RL                  U
S9  g )Nrd   r   rk   rl   rm   rn   r  rs   rt   r   r   Frv   )r  rl   rz   r}   )'r   r   r   r   ra   r   r   r   r>   r   rh   r`   rL   rM   rS   r   r   rO   kernel_sizestridepaddingr  rb   rG   rc   r  rH   rZ   r   r   rN   rY   rX   r   r   r   r!   r   r   )rd   r   rL   rM   rO   r   rY   rX   rZ   rr   r~   r6   r`   r   rR   r  r  r  
conv_layer
out_kernel
out_strides                        r    r   _ConvNd.update_layer  sg    6N6^_`^abcc'$"5"5"7FNMMMdSWSfSfShNiNrNrMs tW W 00(0^#.:l+ |(2%#!#l!;!#*<,'((*
 ,,""$$*%
"&$*:*:Q*>"??
Z$.t/?/?QWY`gl$mL!$.  *jARARYb%
L! (1|$)3diil)BDLL&)3DLL&(2%&.l#'OOL)&&|G 	22<@,,,l+00@@--nMr$   c                ,    SSU R                   S-
  -  -   $ )N)r   r  r   )r  rd   s    r    _get_dora_factor_view_ConvNd._get_dora_factor_view  s    tt//!3444r$   c                   [        X5      nU(       d  gU GH  nX0R                  R                  5       ;   d  M#  U R                  5       nUR                  R
                  nUR                  S:  a  [        S5      eU(       Ga{  UR                  R                  R                  5       nX0R                  ;  a%  U R                  U5      nXgR                  U5      -  nOU R                  U   R                  XU5      n[        R                  " U5      R!                  5       (       d  [#        SU S35      eXdR                  l        U R$                  U   (       a  ['        USS5      c  [)        S5      eUR*                  U R,                  U   R*                  U R.                  U   -  -   n[        R                  " U5      R!                  5       (       d  [#        SU S35      eUR                  U5      UR*                  l        OX0R                  ;  a@  U R                  U5      nUR                  =R                  UR                  U5      -  sl        O)U R                  U   R1                  XUR                  5        U R$                  U   (       a_  ['        USS5      c  [)        S5      eUR*                  =R                  U R,                  U   R*                  U R.                  U   -  -  sl        U R2                  R5                  U5        GM     g)a  
Merge the active adapter weights inside the base weights

Args:
    safe_merge (`bool`, *optional*):
        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`.
Nr   z<Merging is not supported for _ConvNd layers with groups > 1!rP  rQ  rl   rR  )r   rG   r   ra   r   r   r  r   r   rS  r`   rT  r   r)   r[   rU  rV  r   rZ   r   rW  rl   rH   rN   r-   rW   r)  )	rd   rX  r  r'   rR   rY  r(   rZ  r[  s	            r    r\  _ConvNd.merge  s    0D+N!1!1!33!002
'..44
$$q(-.lmm #-"3"3"8"8">">"@K%->->>'+'<'<^'L#z'BB&*&7&7&G&R&RSWit&u >>+6::<<(OP^O__rs  .9%%*~~n5":vt<D". t#  $.??T[[5P5U5UX\XdXdesXt5t#t$~~h7;;==","STbSccv w#  08{{:/F
, &->->>'+'<'<^'L"))..,//*2MM.)).9FFt]g]n]no~~n5":vt<D". t#  #,,N0K0P0PSWS_S_`nSo0oo,$$++N;i ,r$   c                    U R                   (       d  [        R                  " S5        g[        U R                  5      S:  GaL  U R                  R                  5       nXR                  R                  5       ;   a  U R                  5       R                  nXR                  ;  aB  UR                  nU R                  U5      nU=R                  UR                  U5      -  sl        O%U R                  U   R                  XU5      nXRl        U R                   U   (       aT  U R                  5       R"                  =R                  U R$                  U   R"                  U R&                  U   -  -  sl        [        U R                  5      S:  a  GMK  ggr_  rb  rc  s         r    r1   _ConvNd.unmerge5  s-    {{MM<=$&&'!+!11557N!1!1!33,,.55!):)::!'J#'#8#8#HLKK<??:#>>K#00@HH_efH"*K>>.1'')..33t{{>7R7W7WZ^ZfZfguZv7vv3 $&&'!++r$   c                   U R                   U   R                  R                  nU R                  U   R                  R                  nUR
                  S:H  =(       a-    U[        R                  :H  =(       d    U[        R                  :H  nU R                  U   R                  nU R                   U   R                  nU(       a   UR                  5       nUR                  5       nU R                  5       R                  R                  5       SS S:X  ap  UR                  S5      R                  S5      UR                  S5      R                  S5      -  R                  S5      R                  S5      U R                  U   -  nOtU R                  UR!                  SS5      U5      nU R                  5       R"                  S:  a  XpR                  U   -  nO"UR!                  SS5      U R                  U   -  nU(       ai  UR%                  US9nUR%                  U5      U R                  U   R                  l        UR%                  U5      U R                   U   R                  l        U$ )	rh  ri  r   r   )r   r      r   r   rj  )rH   r   r   rG   r   r   r[   r   r   rk  ra   r   squeeze	unsqueezerN   conv_fnr   r  r   r   rl  s           r    rT  _ConvNd.get_delta_weightK  s    W%,,33G$++11
 {{e+c%--1G1b5TYTbTbKb;;w'..;;w'..~~'H~~'H  '',,.q3v=%--a088;h>N>Nq>Q>Y>YZ[>\\gghijttW%&M !LL););Aq)A8LM""$++a/ -W0E E - 7 71 =W@U U),,5,9M 08{{5/ADKK '',/7{{5/ADKK '',r$   c           	        U R                   " U/UQ70 UD6  UR                  SS 5      n[         Vs0 s H  oUUR                  US 5      _M     nnU R                  (       a9  U R                  (       a  U R                  5         U R                  " U/UQ70 UD6nU$ Ub  U R                  " U/UQ7SU0UD6nU$ U R                  (       a  U R                  " U/UQ70 UD6nU$ U R                  " U/UQ70 UD6nUR                  nU R                   H  n	XR                  R                  5       ;  a  M"  U R                  U	   n
U R                  U	   nU R                  U	   nU R                  U	   nU R                  XR                   R                  5      nXR"                  ;  a  X{" U
" U" U5      5      5      U-  -   nM  U R"                  U	   R$                  " U 4U	UUS.UDUD6nM     UR'                  U5      nU$ s  snf rs  )r#  r  r'  rt  r  r1   rR   r6  r   r   rG   r   rH   rO   rN   ru  r   r`   r7   r   )rd   r4   r  r6   r  r+  r,  r5   r-  r'   rG   rH   r2  rN   s                 r    r7   _ConvNd.forwardy  s     4T4V4

?D9:LM:LQVZZ400:LM  {{__Q888F@ ? &..q_4_}_X^_F< ; [[__Q888F8 3 __Q888F!'"&"6"6!)9)9);;^4^4++N;,,~6**1mm.A.AB!):)::#fVGAJ-?&@7&JJF!..~>FF'5%	
 ) !F #7* YY12FI Ns   G7c                *   > [         TU ]  5       nSU-   $ ry  r{  r}  s     r    r|  _ConvNd.__repr__  r  r$   )rE  r  )r   r   rs   TFFNF)rR   r8  r   r:   rL   r   rM   r   rO   rk  r   r  rY   r9  rX   r9  rr   r   rZ   r9  r;   r<   r  r  r  r  r  r  )r4   r=   r;   r=   r  )r>   r?   r@   rA   re   r   r  r\  r1   rT  r7   r|  rD   r  r  s   @r    r  r  r  s     !.2 $()
)
 )
 	)

 )
 )
 ,)
 )
 )
 ")
 )
 
)
 )
j %)$IN "IN INV5F<Pw,,\'R r$   r  c                  2   ^  \ rS rSrU 4S jrSS jrSrU =r$ )Conv2di  c                   > [         TU ]  " U0 UD6  U R                  S:X  d  [        SU R                   35      e[        R
                  U l        g )Nr   z0Conv2d layer kernel must have 4 dimensions, not )rD  re   r  r   r  conv2dr  rd   r  r6   r   s      r    re   Conv2d.__init__  I    $)&)1$OPTP`P`Oabccxxr$   c               ,    U(       d  g SSK Jn  U" 5       $ )Nr   )DoraConv2dVariant)rL  r  )rd   rX   r6   r  s       r    rh   Conv2d.resolve_lora_variant      / ""r$   r  r:  r>   r?   r@   rA   re   rh   rD   r  r  s   @r    r  r         # #r$   r  c                  2   ^  \ rS rSrU 4S jrSS jrSrU =r$ )Conv1di  c                   > [         TU ]  " U0 UD6  U R                  S:X  d  [        SU R                   35      e[        R
                  U l        g )Nr  z0Conv1d layer kernel must have 3 dimensions, not )rD  re   r  r   r  conv1dr  r  s      r    re   Conv1d.__init__  r  r$   c               ,    U(       d  g SSK Jn  U" 5       $ )Nr   )DoraConv1dVariant)rL  r  )rd   rX   r6   r  s       r    rh   Conv1d.resolve_lora_variant  r  r$   r  r:  r  r  s   @r    r  r    r  r$   r  c                  2   ^  \ rS rSrU 4S jrSS jrSrU =r$ )Conv3di  c                   > [         TU ]  " U0 UD6  U R                  S:X  d  [        SU R                   35      e[        R
                  U l        g )Nr   z0Conv3d layer kernel must have 5 dimensions, not )rD  re   r  r   r  conv3dr  r  s      r    re   Conv3d.__init__  r  r$   c               ,    U(       d  g SSK Jn  U" 5       $ )Nr   )DoraConv3dVariant)rL  r  )rd   rX   r6   r  s       r    rh   Conv3d.resolve_lora_variant  r  r$   r  r:  r  r  s   @r    r  r    r  r$   r  c                    ^  \ rS rSrSr      S               S U 4S jjjr\S!S j5       r\S"S j5       r\S"S j5       r	\S#S j5       r
\S!S j5       r\S$S	 j5       r\S#S
 j5       r\S!S j5       r\S%S j5       r\S%S j5       r\S&S j5       r\S'S j5       r\S'S j5       rS(S jr\S#S j5       rS)U 4S jjrS*S+S jjrS)S jr        S,S jrS-S jrU 4S jrS.S jr\S 5       rU 4S jrU 4S jr S/U 4S jjr!Sr"U =r#$ )0MultiheadAttentioni  a^  LoRA implemented in a multihead attention layer

This is currently only implemented for the case of `_qkv_same_embed_dim = True`, i.e. query, key, and value having
the same dimension.

Note: LoRA is applied to both the in_proj (query/key/value) and out_proj. There is currently no way to specify only
one of them. Don't try to apply LoRA to the out_proj of MultiheadAttention by targeting that layer specifically,
since the forward method of that layer is not being used, hence the LoRA adapter would be ignored.

This is a little bit hacky because of the way that MultiheadAttention is implemented in PyTorch: There are no
`nn.Linear` layers which we can hook onto or, in case of output projection, `.forward` is not used. This
implementation works around these problems by merging the weights before the forward call and unmerging them after
the forward call.
c	           
       > [        USS5      (       d#  [        SU R                  R                   S35      eU(       a"  [        U R                  R                   S35      eU	R	                  SS5      (       a"  [        U R                  R                   S35      e[
        T
U ]  5         [        R                  " X40 U	D6  [        UR                  [        R                  5      (       a.  [        UR                  U4UUUUUUS	.U	D6U R                  l	        O#[        S
U R                  R                   S35      eX l        U R                  X#XEXg5        g )N_qkv_same_embed_dimTz?Only same embed for query/key/value is supported as of now for r   z: does not support DoRA (yet), please set use_dora to Falsero   Fz< does not support aLoRA (yet), please set use_alora to False)rL   rM   rO   r   rY   rX   z.out_proj must be an instance of nn.Linear for )r   r   r   r>   r   rD  re   r9   r   out_projrS   r   rR   rE  r   )rd   rR   r   rL   rM   rO   r   rY   rX   r6   r   s             r    re   MultiheadAttention.__init__  sD    z#8$?? QRVR`R`RiRiQjjkl   7 788rstt::k5)) 7 788tuvv46v6 j))29955'-##
( %)"3%!
( 
(DOO$ MdnnNeNeMffghii+,:EVcr$   c                6    U R                  5       R                  $ r  )ra   	embed_dimr  s    r    r  MultiheadAttention.embed_dim      ""$...r$   c                6    U R                  5       R                  $ r  )ra   kdimr  s    r    r   MultiheadAttention.kdim      ""$)))r$   c                6    U R                  5       R                  $ r  )ra   vdimr  s    r    r  MultiheadAttention.vdim   r  r$   c                6    U R                  5       R                  $ r  )ra   r  r  s    r    r  &MultiheadAttention._qkv_same_embed_dim$  s    ""$888r$   c                6    U R                  5       R                  $ r  )ra   	num_headsr  s    r    r	  MultiheadAttention.num_heads(  r  r$   c                6    U R                  5       R                  $ r  )ra   r2  r  s    r    r2  MultiheadAttention.dropout,  s    ""$,,,r$   c                6    U R                  5       R                  $ r  )ra   batch_firstr  s    r    r  MultiheadAttention.batch_first0  s    ""$000r$   c                6    U R                  5       R                  $ r  )ra   head_dimr  s    r    r  MultiheadAttention.head_dim4  s    ""$---r$   c                6    U R                  5       R                  $ r  )ra   in_proj_weightr  s    r    r  !MultiheadAttention.in_proj_weight8  s    ""$333r$   c                6    U R                  5       R                  $ r  )ra   in_proj_biasr  s    r    r  MultiheadAttention.in_proj_bias<  s    ""$111r$   c                R    U R                  5       R                  R                  5       $ r  )ra   r  r  s    r    r  MultiheadAttention.out_proj@  s     ""$--<<>>r$   c                6    U R                  5       R                  $ r  )ra   bias_kr  s    r    r  MultiheadAttention.bias_kD      ""$+++r$   c                6    U R                  5       R                  $ r  )ra   bias_vr  s    r    r   MultiheadAttention.bias_vH  r  r$   c                B    U R                  5       R                  " U0 UD6$ r  )ra   merge_masks)rd   r  r6   s      r    r#  MultiheadAttention.merge_masksL  s!    ""$00$A&AAr$   c                6    U R                  5       R                  $ r  )ra   add_zero_attnr  s    r    r&   MultiheadAttention.add_zero_attnO  s    ""$222r$   c                r   > [         TU ]  " U0 UD6  U R                  R                  R                  " U0 UD6  g r  )rD  r   rR   r  r  s      r    r   MultiheadAttention.update_layerS  s2    d-f-  --t>v>r$   c                *   [        X5      nU(       d  gU GH  nX0R                  R                  5       ;   d  M#  U R                  5       nUR                  R
                  R                  nU(       Ga  UR                  R                  R                  5       R                  5       nX`R                  U5      R                  U5      -  n[        R                  " U5      R                  5       (       d  [!        SU S35      eUR                  R
                  R                  R                  5       R                  5       nXtR                  R                  U5      R                  U5      -  n[        R                  " U5      R                  5       (       d  [!        SU S35      eU?Xdl        UR                  R                  5       ?XtR                  R                  5       l        UR                  R#                  U/S9  OU R                  U5      R                  U5      nUR                  R                  R                  5       U-   n	U?Xl        UR                  R                  U5      R                  U5      nUR                  R
                  R                  R                  5       U-   n	UR                  R                  5       ?XR                  R                  5       l        UR                  R#                  U/S9  U R$                  R'                  U5        GM     g)a  
Merge the active adapter weights into the base weights

Args:
    safe_merge (`bool`, *optional*):
        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`.
NrP  rQ  r  )r   rG   r   ra   r  r   r   r  r   detachrS  rT  r   r[   rU  rV  r   r\  rW   r)  )
rd   rX  r  r'   rR   rY  orig_weight_inorig_weight_outrZ  weight_mergeds
             r    r\  MultiheadAttention.mergeX  s    0D ,N!1!1!33!002
'0077==
 &0%>%>%C%C%J%J%L%R%R%TN"&;&;N&K&N&Nz&ZZN >>.9==??(OP^O__rs 
 '1&9&9&@&@&E&E&L&L&N&T&T&VO#':':'K'KN'['^'^_i'jjO >>/:>>@@(OP^O__rs  #10>-"++::<CBQ''668?''--^<L-M $(#8#8#H#K#KJ#WL$.$=$=$B$B$I$I$Kl$ZM #10=- $.#6#6#G#G#W#Z#Z[e#fL$.$7$7$>$>$C$C$J$J$L|$[M"++::<CBO''668?''--^<L-M$$++N;_ ,r$   c                    U R                   (       d  [        R                  " S5        gU R                  5       nUR                  R
                  R                  R                  n[        U R                  5      S:  GaZ  U R                  R                  5       nX0R                  R                  5       ;   Ga  U R                  U5      R                  U5      nUR                  R                   U-
  nU?UR#                  S[$        R&                  " USS95        UR                  R                  U5      R                  U5      nUR                  R
                  R                  R                   U-
  nUR                  R
                  ?UR                  R
                  R#                  S[$        R&                  " USS95        [        U R                  5      S:  a  GMZ  U R                  5       R                  R)                  5         g)r`  ra  Nr   r  Fr   r   )r  r   r   ra   r  rR   r   r   r   rW   r  rG   r   rT  r   r  r   register_parameterrS   r   r1   )rd   rR   rY  r'   rZ  
old_weights         r    r1   MultiheadAttention.unmerge  s    {{MM<= ((*
((33::@@
$&&'!+!11557N!1!1!33
  $44^DGG
S'66;;lJ
---.>Zgl@mn  *22CCNSVVWab'00;;BBGG,V
''229##..AAbll:UK! $&&'!+( 	&&..0r$   c                   U(       a  U R                  X#S9  U R                  5       nUR                  nU?UR                  S[        R
                  " UR                  UR                  S95        UR                  R                  5       nUR                  nU?	UR                  S[        R
                  " UR                  UR                  S95        Xdl        U$ )z
Merging and unloading of the MultiheadAttention module

This requires an extra step for MultiheadAttention, which is why there is this special method instead of
relying on the normal merge_and_unload code path.
rX  r  r  r2  r   )
r\  ra   r  r3  rS   r   r   r   r  r   )rd   r\  rX  r  rR   r   out_proj_layers          r    "unload_and_optionally_merge_module5MultiheadAttention.unload_and_optionally_merge_module  s     JJ*JJ((*
 **%%%&6V[[`f`t`t8uv $,,;;=&&!))(BLL\b\p\p4qr,r$   c                   U R                   U   R                  R                  nU R                   U   R                  R                  nUR                  S:H  =(       a    U[
        R                  :H  nU R                  U   R                  nU R                   U   R                  nU(       a   UR                  5       nUR                  5       nXe-  U R                  U   -  nU(       ai  UR                  US9nUR                  U5      U R                  U   R                  l        UR                  U5      U R                   U   R                  l        U$ rg  )rH   r   r   r   r   r[   r   rG   rk  rN   r   r   rl  s           r    rT  #MultiheadAttention.get_delta_weight  s    W%,,33G$++11
 {{e+F0F;;w'..;;w'..~~'H~~'H!,W0EE),,5,9M 08{{5/ADKK '',/7{{5/ADKK '',r$   c                   > SU;   a#  [        SU R                  R                   S35      e[        TU ]  " U/UQ70 UD6  g )Nr  rz  z( does not support mixed adapter batches.)r   r   r>   rD  r#  rd   r4   r  r6   r   s       r    r#  &MultiheadAttention._check_forward_args  sB    f$eDNN$;$;#<<deff#A777r$   c                f   UR                   nU R                  " U/UQ70 UD6  U R                  (       a8  U R                  (       a  U R	                  5         U R
                  " U/UQ70 UD6nOU R                  (       a  U R
                  " U/UQ70 UD6nOU R                  5       R                  nUR                  U R                  :w  a6  U R                  5       R                  R                  n[        SU SU S35      eU R                   Vs/ s H  oU R                  ;   d  M  UPM     n	n U R                  U	S9  U R
                  " U/UQ70 UD6nU R	                  5         US   R                  U5      US   b  US   R                  U5      4nU$ US   4nU$ s  snf ! U R	                  5         f = f)NzThe out_proj layer of z has merged layers but zJ itself doesn't; please ensure that either both or none have merged layersr+  r   r   )r   r#  rt  r  r1   rR   ra   r  r   r   r>   r   rG   r\  r   )
rd   queryr  r6   previous_dtyper5   r  cls_namer   r   s
             r    r7   MultiheadAttention.forward  s     888  {{__U<T<V<F[[__U<T<V<F**,55H''4+?+??  ..0::CC ,XJ6MhZ XB B  +/*>*>S*>Qt{{BRq*>OS


9@@@ ),,~.PVWXPYPeq	^0Lu lrrsktu T s   F#F,%F F0c                t   U R                  5       nUR                  nU?UR                  S[        R                  " UR
                  UR                  S95        UR                  R                  5       nUR                  nU?UR                  S[        R                  " UR
                  UR                  S95        g )Nr  r2  r   )	ra   r  r3  rS   r   r   r   r  r   )rd   rR   r   s      r    _restore_weights#MultiheadAttention._restore_weights/  s     ((*
**%%%&6V[[`f`t`t8uv  ((779
""%%hV[[X^XlXl0mnr$   c                D   > U R                  5         [        TU ]  " U0 UD6$ r  )rF  rD  
state_dictr  s      r    rI  MultiheadAttention.state_dictD  s$    w!42622r$   c                D   > U R                  5         [        TU ]  " U0 UD6$ r  )rF  rD  named_modulesr  s      r    rL   MultiheadAttention.named_modulesH  s$    w$d5f55r$   c                *   > [         TU ]  5       nSU-   $ ry  r{  r}  s     r    r|  MultiheadAttention.__repr__M  r  r$   )rE  )r   r   rs   TFF)r   r:   rL   r   rM   r   rO   rk  r   r  rY   r9  rX   r9  r;   r<   )r;   r   )r;   zOptional[int])r;   r9  )r;   rk  )r;   znn.Parameter)r;   r8  )r;   zOptional[nn.Parameter])r;   z,tuple[Optional[torch.Tensor], Optional[int]]r  r  r  )r\  r9  rX  r9  r  r  r;   znn.MultiheadAttentionr  )rA  r=   r  r   r6   r   r;   r=   r  )$r>   r?   r@   rA   rB   re   propertyr  r   r  r  r	  r2  r  r  r  r  r  r  r   r#  r&  r   r\  r1   r9  rT  r#  r7   r   rF  rI  rL  r|  rD   r  r  s   @r    r  r    s   & !.2 ,d ,d 	,d
 ,d ,d ,,d ,d ,d 
,d ,d\ / / * * * * 9 9 / / - - 1 1 . . 4 4 2 2 ? ? , , , ,B 3 3?
E<N1B'+<O	8 D8
'X o o(36
 r$   r  c                  2   ^  \ rS rSrSrU 4S jrS rSrU =r$ )_LoraParameterProxyiR  zThis proxies an `nn.Parameter` that is targeted with LoRA.
Intended to be used in conjunction with `nn.utils.parametrize`, see `ParamWrapper`.
c                .   > [         TU ]  5         Xl        g r  )rD  re   rZ  )rd   rZ  r   s     r    re   _LoraParameterProxy.__init__W  s    (r$   c                    [         R                  R                  R                  5          XR                  -   sS S S 5        $ ! , (       d  f       g = fr  )rS   utilsparametrizecachedrZ  )rd   Ws     r    r7   _LoraParameterProxy.forward[  s0    XX!!((*((( +**s   A
A)rZ  )	r>   r?   r@   rA   rB   re   r7   rD   r  r  s   @r    rR  rR  R  s    )) )r$   rR  c                    [        U[        R                  5      (       a  U R                  X5        g U R	                  X5        g r  )r   rS   r   r3  register_buffer)r   r!  r   s      r    _register_parameter_or_bufferr]  b  s/    !R\\""!!$*t'r$   c                    ^  \ rS rSrSr         S                       SU 4S jjjr     S         SS jjrSSS jjrS rS r	\
SS j5       rS	 rSSS
 jjrSS jrU 4S jrSS jrSS jrSU 4S jjrSrU =r$ )ParamWrapperii  a  A LoRA wrapper for `nn.Parameter`. This layer is dispatched if users target a parameter directly with
`lora_config.target_parameters`
    Note:
    - When accessing the wrapped nn.Parameter directly, e.g. via `module.weight`, the LoRA weights are *not*
      applied.
    - It is currently not implemented to target multiple parameters on the same module. To achieve this, it is
      currently required to create a separate LoRA adapter (with another adapter name) and activate both at the
      same time.
c                  > [         TU ]  5         [        R                  " X40 UD6  X0l        U R	                  5       nUR
                  S:X  a   UR                  u  U l        U l        U l	        O0SUR                  S   UR                  S   sU l        U l        U l	        UR
                  S;  a0  [        SU R                  R                   SUR
                   S35      eU(       a#  [        SU R                  R                   S35      eU(       a#  [        SU R                  R                   S	35      eU(       a#  [        SU R                  R                   S
35      eU(       a#  [        SU R                  R                   S35      eU(       a#  [        SU R                  R                   S35      eXpl        X l        U R                  UUUUU	U
UUS9  g )Nr  r   r   )r   r  rz  z was initialized with z9 dimensional Parameter, but only 2d and 3d are supported.& does not work with lora_dropout != 0.z# does not work with fan_in_fan_out.z# does not work with lora_bias=True.z" does not work with use_dora=True.z1 does not work with is_target_conv_1d_layer=True.)rM   rO   r   rY   rX   rZ   )rD  re   r9   parameter_name	get_paramndimshapenum_expertsrb   rc   r   r   r>   r   rE  r   )rd   rR   r   rb  rL   rM   rO   r   rF  r   rY   rX   rZ   r6   paramr   s                  r    re   ParamWrapper.__init__t  s     	46v6, ::?DIKKADd.0ADEu{{ST~W\WbWbcdWeADd.0A::V#//00Fuzzl S( (   uT^^%<%<$==cdeeuT^^%<%<$==`abbuT^^%<%<$==`abbuT^^%<%<$==_`aa"uT^^%<%<$==nopp,+!%/! 	 		
r$   c                &	   [        5       R                  5       nUS	 US::  a  [        SU 35      eU R                  XxU
S9nUb#  [        SU R                  R
                   S35      eX R                  U'   X0R                  U'   US:  a#  [        SU R                  R
                   S35      e[        R                  " 5       nU R                  R                  [        R                  " X05      5        [        R                  " U R                  X R                  -  S	S
9U R                   U'   [        R                  " X R                  -  U R"                  U	S
9U R$                  U'   XR&                  U'   U(       a'  U[(        R*                  " U5      -  U R,                  U'   OX2-  U R,                  U'   X`R.                  U'   XpR0                  U'   [3        U[4        5      (       aU  UR7                  S5      (       a?  [9        U R;                  5       R<                  5         U R?                  X5        S S S 5        GO[3        U[4        5      (       aU  UR7                  S5      (       a?  [9        U R;                  5       R<                  5         U RA                  X5        S S S 5        GOD[3        U[4        5      (       aR  URC                  5       S:X  a>  [9        U R;                  5       R<                  5         U RE                  U5        S S S 5        OUS:X  a>  [9        U R;                  5       R<                  5         U RG                  U5        S S S 5        OUS:X  a7  [        RH                  RK                  U R$                  U   R<                  5        O\US:X  a>  [9        U R;                  5       R<                  5         U RM                  U5        S S S 5        OU(       a  U RO                  X5        U RQ                  U5        XRR                  ;   a   U RR                  U   RH                  " U 40 UD6  U RU                  U RV                  US9  g ! , (       d  f       Ni= f! , (       d  f       Nz= f! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       N= f)Nrd   r   rk   )rX   rp   rq   rz  z, does not work with LoRA variants like DoRA.rs   ra  Frv   rw   rx   ry   rz   r{   r|   r}   ),r   r   r   rh   r   r>   rL   rM   rS   r   rO   r   rT   r   rb   rf  rG   rc   rH   rZ   r   r   rN   rY   rX   r   r:   r   r   ra   r   r   r   r   r   r   r!   r   r   r   r   r`   r   r   )rd   r   rL   rM   rO   r   rY   rX   rp   rZ   rq   r~   r6   r`   r   s                  r    r   ParamWrapper.update_layer  s   " 6N 6^_`^abcc00HY 1 
 #uT^^%<%<$==ijkk |(2%# uT^^%<%<$==cdee!#  /Q!RS %'IId.>.>DTDT@T[`$aL!$&IIa2B2B.BDDUDU\e$fL!'0|$)3diil)BDLL&)3DLL&(2%&.l# '--2C2N2Nw2W2W"4#6#6#8#?#?@@ A@)3//4E4P4PQX4Y4Y"4#6#6#8#?#?@@ A@)3//4E4K4K4MQX4X"4#6#6#8#?#?@- A@')"4#6#6#8#?#?@- A@%'GGNN4;;|4;;<,."4#6#6#8#?#?@$$\2 A@&&|G22<@,,,l+00@@--nM1 A@ A@ A@ A@
 A@s<   P>Q+Q /Q10R>
Q
Q 
Q.1
Q?
Rc                  ^ U R                  5       R                  n[        R                  " S5      mU R                  5       nU R                  U R                  -    H  n[        XS5      n[        U[        R                  [        R                  [        45      (       d  ME  X;  a  ML  [        U4S jUR                  5        5       5      (       a  Mv  UR                  R                  (       d  UR                  R                  (       a  XQ   R!                  X#R                  S9XQ'   M  XQ   R!                  U5      XQ'   M     g)zm
Move the adapter of the given name to the device of the base layer. Needs special handling for nn.Parameter
metaNc              3  @   >#    U  H  oR                   T:H  v   M     g 7fr  )r   ).0ru   rl  s     r    	<genexpr>EParamWrapper._move_adapter_to_device_of_base_layer.<locals>.<genexpr>  s     H-G88t#-G   rj  )rc  r   r[   rK   rP   r   r   rS   rT   rU   r
   r   
parametersr   is_floating_point
is_complexr   )rd   r   r   rg  adapter_layer_nameadapter_layerrl  s         @r    r   2ParamWrapper._move_adapter_to_device_of_base_layer   s     !((||F# "&":":T=S=S"S#DdCMmbmmR=M=Mz-Z[[0H]-E-E-GHHH{{,,0F0F.;.I.L.LV[f[f.L.g+.;.I.L.LV.T+ #Tr$   c                N    [        U R                  5       U R                  5      nU$ r  )r   ra   rb  )rd   rg  s     r    rc  ParamWrapper.get_param  s"    ++-t/B/BCr$   c                B   U R                   S:X  a  [        R                  " X/UQ70 UD6nOU R                  U   R                  nU R
                  U   R                  nUR                  U R                   SUR                  S   5      nUR                  UR                  S   SU R                   5      n[        R                  " SXe5      U R                  U   -  nU R                  5       nU R                  5       nUR                  UR                  UR                  5      nU$ )Nr   r   r   zo r e, e r i -> e i o)rf  r   rT  rG   r   rH   reshapere  r[   einsumrN   ra   rc  r   r   r   )	rd   r   r  r6   rZ  rn  ro  rR   rg  s	            r    rT  ParamWrapper.get_delta_weight  s    q !224WWPVWL{{<077H{{<077H''(8(8"hnnR>PQH''q(92t?O?OPH <<(?TW[WcWcdpWqqL((*
 #u||U[[Ar$   c              #  p  ^ #    U(       a  [        U 4S jU 5       5      (       d  S v   g S nU H?  nUT R                  ;  a  M  Uc  T R                  U5      nM+  UT R                  U5      -   nMA     T R                  5       nT R	                  5       R
                  n[        R                  R                  R                  UT R                  [        U5      5        UR                  T R                     R                  R                  U5         S v   T R                  5         g ! T R                  5         f = f7f)Nc              3  @   >#    U  H  oTR                   ;   v   M     g 7fr  )rG   )rn  r   rd   s     r    ro  .ParamWrapper._activate_lora.<locals>.<genexpr>.  s     )`P_WT[[*@P_rq  )r   rG   rT  ra   rc  r   rS   rV  rW  register_parametrizationrb  rR  parametrizationsoriginalrequires_grad__remove_parametrizations)rd   r   rZ  r'   rR   requires_grad_befores   `     r    _activate_loraParamWrapper._activate_lora,  s     c)`P_)`&`&`-NT[[0##44^D+d.C.CN.SS . ((*
#~~/==
55++-@-N	
 	##D$7$78AAPPQef	,))+D))+s   DD6D! D6!D33D6c                   U R                  5       nU R                  nX!R                  ;  a  [        S5      eUR                  U   n[	        U5      S:X  a)  [
        R                  R                  R                  XSS9  g [        [        [	        U5      5      5      nU H   nX5   n[        U[        5      (       d  M  X5	   g    [        R                  " SU  S35        g )NzbSomething went wrong, please report this issue on PEFT: https://github.com/huggingface/peft/issuesr   F)leave_parametrizedz+Could not find any LoRA parametrization on z], please open an issue on https://github.com/huggingface/peft/issues and report this warning.)ra   rb  r  r   r   rS   rV  rW  remove_parametrizationsreversedranger   rR  r   r   )rd   rR   rb  
param_listreversed_indicesr1  r   s          r    r  %ParamWrapper._remove_parametrizationsH  s    ((*
,,!<!<<t   00@
z?aHH  88hm8n $E#j/$:;!A]F&"566M	 " MM=dV DV Vr$   c                j   [        X5      nU(       d  g U GH  nX0R                  R                  5       ;   d  M#  U R                  5       n[	        X@R
                  5      nU(       a  UR                  R                  5       nUR                  nU R                  U5      nXhR                  U5      -  n[        R                  " U5      R                  5       (       d  [        SU S35      eXel        O&U R                  U5      nU=R                  U-  sl        U R                  R!                  U5        GM     g )NrP  rQ  )r   rG   r   ra   r   rb  r   rS  r   rT  r   r[   rU  rV  r   rW   r)  )	rd   rX  r  r'   rR   rg  r(   rY  rZ  s	            r    r\  ParamWrapper.mergeh  s    /D+N!1!1!33!002

,?,?@ #(**"2"2"4K!,!2!2J#'#8#8#HL??:#>>K >>+6::<<(OP^O__rs  "-J $(#8#8#HLJJ,.J$$++N;/ ,r$   c                   U R                   (       d  [        R                  " S5        g [        U R                  5      S:  a  U R                  R                  5       nXR                  R                  5       ;   ae  [        U R                  5       U R                  5      nUR                  nU R                  U5      nU=R                  UR                  U5      -  sl        [        U R                  5      S:  a  M  g g )Nra  r   )r  r   r   r   rW   r  rG   r   r   ra   rb  r   rT  r   r   )rd   r'   rg  rY  rZ  s        r    r1   ParamWrapper.unmerge  s    {{MM<=$&&'!+!11557N!1!1!33 3 3 5t7J7JK"[[
#44^D

looj99
 $&&'!+r$   c                   > UR                  SS5      (       a#  [        SU R                  R                   S35      e[        TU ]  " U/UQ70 UD6  g)r  r  Nrz  z, does not support mixed adapter batches yet.)r   r   r   r>   rD  r#  r>  s       r    r#   ParamWrapper._check_forward_args  sK    ::ot,,uT^^%<%<$==ijkk#A777r$   c                    U R                   nU(       aX  U R                  X#S9  [        U[        5      (       a2  UR                  X#S9  UR                   n[        U[        5      (       a  M2  U$ U R	                  5       nU$ )Nr7  )rR   r\  r   r_  ra   )rd   r\  rX  r  rR   s        r    r9  /ParamWrapper.unload_and_optionally_merge_module  sr    __
JJ*JJZ66  J T'22
 Z66
  ,,.Jr$   c                    U R                   " U/UQ70 UD6  UR                  SS 5      nU R                  (       a9  U R                  (       a  U R	                  5         U R
                  " U/UQ70 UD6nU$ Ub#  [        SU R                  R                   S35      eU R                  (       a  U R
                  " U/UQ70 UD6nU$ U R                  U R                  5         U R
                  " U/UQ70 UD6nS S S 5        U$ ! , (       d  f       W$ = f)Nr  rz  z' does not support mixed batch inference)r#  r  rt  r  r1   rR   r   r   r>   r  r   )rd   r4   r  r6   r  r5   s         r    r7   ParamWrapper.forward  s      4T4V4

?D9  {{__Q888F  &uT^^%<%<$==deff[[__Q888F  $$T%9%9:<T<V< ; ;:s   C>>
Dc                   > [         TU ]  5       nUR                  S5      S-   nUS U  SU R                   SXS   3nSU-   $ )N(r   z
  parameter_name='z',rz  )rD  r|  findrb  )rd   r~  idxr   s      r    r|  ParamWrapper.__repr__  sV    g hhsma Tc/0C0C/DBs4ykR}r$   )rE  r   rb   rf  rc   rb  )	r   r   rs   FFTFFF)r   r:   rb  r:   rL   r   rM   r   rO   rk  r   r9  rF  r9  r   r  rY   r9  rX   r9  rZ   r9  r;   r<   )FFFr<  F)
rX   r9  rp   r9  rZ   r9  rq   r   r~   r9  r  )r   r:   r   zOptional[torch.device]r;   r<   )r   r?  r  r  r  )r\  r9  rX  r9  r  r  r  r  )r>   r?   r@   rA   rB   re   r   r   rc  rT  r   r  r  r\  r1   r#  r9  r7   r|  rD   r  r  s   @r    r_  r_  i  sK    !$(-.2 6
 6
 	6

 6
 6
 6
 6
 "&6
 ,6
 6
 6
 6
 
6
 6
@  !#$RN RN RN RN RN RNhU,$ , ,6@<@:8
" r$   r_  c                   S n[        U [        5      (       a  U R                  5       nOU nUb  [        X4SU0UD6nU$ [        U[        R
                  R                  5      (       aK  UR                  5       nUR                  SS 5        UR                  UR                  5        [        X40 UD6nU$ [        U[        R
                  R                  5      (       a)  UR                  UR                  5        [        X40 UD6nU$ [        U[        R
                  R                  5      (       a)  UR                  UR                  5        [        X40 UD6nU$ [        U[
        R                  5      (       a)  UR                  UR                  5        [        X40 UD6nU$ [        U[        R
                  R                  5      (       a)  UR                  UR                  5        [        X40 UD6nU$ [        U[        R
                  R                  5      (       aU  US   (       a"  [         R"                  " S5        S=US'   Ul        UR                  UR                  5        [        X40 UD6nU$ [        U[&        5      (       aU  US   (       d"  [         R"                  " S5        S=US'   Ul        UR                  UR                  5        [        X4SS0UD6nU$ )Nrb  r   zjfan_in_fan_out is set to True but the target module is `torch.nn.Linear`. Setting fan_in_fan_out to False.Fzafan_in_fan_out is set to False but the target module is `Conv1D`. Setting fan_in_fan_out to True.TrF  )r   r   ra   r_  r[   rS   r  r   r  r   loftq_configr  r  r  r  r   r   r   r   r	   )targetr   lora_configrb  r6   
new_moduletarget_base_layerembedding_kwargss           r    dispatch_defaultr    s    J&.))"113"!!&`~`Y_`
H G 
%uxx'9'9	:	:!;;=-t4 8 89vH7GH
> = 
%uxx	7	7k../F;F;
8 7 
%uxx	7	7k../F;F;
2 1 
%ryy	1	1k../F;F;
, + 
%uxx'B'B	C	Ck../'GG
& % 
%uxx	7	7"#MM3 EJIF#${'Ak../F;F;
  
%v	.	.&'MMs EIHF#${'Ak../FY$YRXY
r$   r  )
r  ztorch.nn.Moduler   r:   r  r   rb  zOptional[str]r;   zOptional[torch.nn.Module])4
__future__r   r   r   
contextlibr   typingr   r   r   r[   torch.nnrS   torch.nn.functional
functionalr  r   transformers.pytorch_utilsr	   peft.tuners._buffer_dictr
   peft.tuners.tuners_utilsr   r   r   peft.utils.integrationsr   r   r   r   peft.utils.otherr   peft.utils.warningr   configr   r   r'  r   r9   Moduler   r  r  r  r  r  r  rR  r]  r_  r  r,   r$   r    <module>r     sH   #   % ' '      - / b b  ' * + && /" /"dl lraRYY	 aHt		9 tn	rbii rj	#W #"#W #"#W #"uI up)")) ) (U299i Ux
 %)	333 3 "	3 3r$   