
    oi/                         S SK r S SK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Jr  S SKJr  SSKJr   " S S	\5      r " S
 S\R&                  \5      rg)    N)Optional)Conv1D)BaseTunerLayercheck_adapters_to_merge)	transpose   )
BufferDictc            	           \ rS rSrSrSrS\R                  4S jr\	S\
4S j5       r  SS\S	\S
\S\
4S jjrSS
\4S jjrSrg)	VeraLayer   )vera_lambda_bvera_lambda_d)vera_Avera_B
base_layerc                 j   Xl         0 U l        [        R                  " 0 5      U l        [        R
                  " 0 5      U l        [        R
                  " 0 5      U l        S U l        S U l	        SU l
        / U l        U R                  5       n[        U[        R                  5      (       a  UR                  UR                   pCO^[        U["        5      (       aI  [%        UR&                  S5      (       a  UR&                  R(                  OUR&                  R*                  u  p4WU l        WU l        X l        g )NFds_shape)r   rnn
ModuleDictvera_dropoutParameterDictr   r   r   r   _disable_adaptersmerged_adaptersget_base_layer
isinstanceLinearin_featuresout_featuresr   hasattrweightr   shapekwargs)selfr   r#   r   r   s        P/home/james-whalen/.local/lib/python3.13/site-packages/peft/tuners/vera/layer.py__init__VeraLayer.__init__"   s    $MM"-  --b1--b1 -1,0 "'!((*
j")),,(2(>(>
@W@W
F++.5j6G6G.T.T
!!**ZdZkZkZqZq &K '(    returnc                 ,    [        U R                  5      $ N)boolr   )r$   s    r%   mergedVeraLayer.merged@   s    D(())r(   r   r   	d_initialinference_modec	                 R   US::  a  [        SU 35      eX@R                  U'   US:  a  [        R                  " US9n
O[        R                  " 5       n
U R
                  R                  [        R                  " X05      5        [        R                  " [        R                  " U R                  5      SS9U R                  U'   [        R                  " [        R                  " U5      SS9U R                  U'   X l        X0l        X;  Ga  [#        U R                  5      S:  a  [        S5      e[%        U R                  R'                  5       5      S   n[%        U R                   R'                  5       5      S   nS	nUR(                  S   U R*                  :  a3  [        UR-                  S
UR(                  S   U R*                  5      5      eUR(                  S   U R                  :  a3  [        UR-                  SUR(                  S   U R                  5      5      eSnUR(                  S   U R                  U   :  a6  [        UR-                  S
UR(                  S   U R                  U   5      5      eUR(                  S   U R                  U   :  a6  [        UR-                  SUR(                  S   U R                  U   5      5      eXR                  U'   XR                   U'   U(       a  U R/                  XS9  U R1                  U5        U R3                  U R4                  US9  g )Nr   z?`r` should be a positive integer value but the value passed is         )pT)requires_grad   z^The `vera_A` and `vera_B` buffers are empty. This should not happen. Please report this issue.z{} has a size of {} but {} or greater is required; this probably happened because an additional VeRA adapter was added after the first one with incompatible shapes.r   r   z{} has a size of {} but {} or greater is required; this probably happened because an additional VeRA adapter with a lower rank was added after the first one; loading the adapters in reverse order may solve this.r/   )r0   )
ValueErrorr   r   DropoutIdentityr   updater   	Parametertorchonesr   r   randnr   r   r   lenlistvaluesr"   r   formatreset_vera_parameters%_move_adapter_to_device_of_base_layerset_adapteractive_adapters)r$   adapter_namer   r   r   r   init_weightsr/   r0   r#   vera_dropout_layervera_A_paramvera_B_param
error_tmpls                 r%   update_layerVeraLayer.update_layerD   s    6^_`^abcc |#!#l!;!#  /Q!RS+-<<

4CTCT8Uei+j<(+-<<AVZ+[<( %4;;!# t    2 2 45a8L 2 2 45a8LR 
 !!!$t'7'77 !2!28\=O=OPQ=RTXTdTd!eff!!!$t'8'88 !2!28\=O=OPQ=RTXTeTe!fgg3 
 !!!$tvvl';; !2!28\=O=OPQ=RTXTZTZ[gTh!ijj!!!$tvvl';; !2!28\=O=OPQ=RTXTZTZ[gTh!ijj(4KK%(4KK%&&|&I22<@--nMr(   c                 l   XR                   R                  5       ;   a  [        R                  " 5          [        R
                  R                  U R                   U   5      R                  U5        [        R
                  R                  U R                  U   5        S S S 5        g g ! , (       d  f       g = fr+   )	r   keysr<   no_gradr   initzeros_fill_r   )r$   rG   r/   s      r%   rC   VeraLayer.reset_vera_parameters   ss    --2244t11,?@FFyQt11,?@ ! 5 s   A(B%%
B3)r   r   r   r#   r   r   r   r   r   r   r   r   N)皙?F)rV   )__name__
__module____qualname____firstlineno__adapter_layer_namesother_param_namesr   Moduler&   propertyr,   r-   r	   floatrM   rC   __static_attributes__ r(   r%   r   r      s    <,299 < * * * $BN BN 	BN BN BNHAU A Ar(   r   c                     ^  \ rS rSr      SS\S\S\S\S\S\S\S	\S
\SS4U 4S jjjr	SS\S\
\\      SS4S jjrSS jrS\R                  4S jrS\R                  S\R                  4S jrS\4U 4S jjrSrU =r$ )r      r   r   rG   r   r   fan_in_fan_outis_target_conv_1d_layerrH   r/   r)   Nc           
         > [         [        R                  U ]  5         [        R                  " X40 UD6  Xpl        X@l        U R                  XBX5XiU
S9  Xl        g )Nr6   )	superr   r   r&   r   rd   _active_adapterrM   re   )r$   r   r   r   rG   r   r   rd   re   rH   r/   r#   	__class__s               r%   r&   Linear.__init__   sS     	bii')46v6,+,<ajk'>$r(   
safe_mergeadapter_namesc                 >   [        X5      nU(       d  gU GH  nX0R                  R                  5       ;   d  M#  U R                  5       nU(       a  UR                  R
                  R                  5       nXPR                  U5      -  n[        R                  " U5      R                  5       (       d  [        SU S35      eXTR                  l        O.UR                  =R
                  U R                  U5      -  sl        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`.
Nz1NaNs detected in the merged weights. The adapter z seems to be broken)r   r   rP   r   r!   datacloneget_delta_weightr<   isfiniteallr7   r   append)r$   rk   rl   active_adapterr   orig_weightss         r%   mergeLinear.merge   s     0D+N!3!3!8!8!::!002
 $.#4#4#9#9#?#?#AL $9$9.$IIL >>,7;;==(OP^O__rs  .:%%*%%**d.C.CN.SS*$$++N;% ,r(   c                    U R                   (       d  [        R                  " S5        g [        U R                  5      S:  a  U R                  R                  5       nXR                  R                  5       ;   a<  U R                  5       R                  =R                  U R                  U5      -  sl
        [        U R                  5      S:  a  M  g g )Nz Already unmerged. Nothing to do.r   )r-   warningswarnr?   r   popr   rP   r   r!   rn   rp   )r$   rt   s     r%   unmergeLinear.unmerge   s    {{MM<=$&&'!+!11557N!3!3!8!8!::##%,,11T5J5J>5ZZ1 $&&'!+r(   c                 $   U R                   U   nU R                  U   nUR                  n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UR                  5       nUR                  5       nUSS2SU R                  24   R                  UR                  5      n	USU R                  2SS24   R                  UR                  5      n
UR                  S5      nUR                  S5      n[        X-  Xy-  -  U R                   5      nU(       a  UR                  US9nU$ )z
Compute the delta weight for the given adapter.

Args:
    adapter (str):
        The name of the adapter for which the delta weight should be computed.
cpuN)dtype)r   r   devicer   typer<   float16bfloat16r   r   r_   r   tor   	unsqueezer   rd   )r$   adapterr   r   r   r   cast_to_fp32lambda_dlambda_bsliced_Asliced_Boutput_tensors               r%   rp   Linear.get_delta_weight   s`    W%W%
 {{e+c%--1G1b5TYTbTbKb%%g.%%g.\\^F\\^F~~'H~~'H!/t////033HOOD-D---q0144X__E%%b)%%b)!8#68;N"OQUQdQde),,5,9Mr(   xc                    UR                   nU R                  (       a9  U R                  (       a  U R                  5         U R                  " U/UQ70 UD6nGOoU R                  (       a  U R                  " U/UQ70 UD6nGOFU R                  " U/UQ70 UD6nU R
                   GH  nX`R                  R                  5       ;  a  M#  U R                  U   nU R                  U   nU R                  U   n	U R                  U   n
U	S S 2S U R                  24   R                  UR                  5      nU
S U R                  2S S 24   R                  UR                  5      nU R                  U   nUR                  UR                   5      nXX[         R"                  " U[         R"                  " U" U5      U5      -  U5      -  -   nGM"     UR                  U5      nU$ r+   )r   disable_adaptersr-   r|   r   rF   r   rP   r   r   r   r   r   r   r   r   Flinear)r$   r   argsr#   previous_dtyperesultrt   r   r   r   r   r   r   dropouts                 r%   forwardLinear.forward   s     {{__Q888F[[__Q888F__Q888F"&"6"6!););)@)@)BB--n=--n=^4^4
 "!%7t'7'7%7"78;;AHHE!"5D$5$5"5q"89<<QXXF++N;DD(QXXh'RS*V^A_6_ai-j"jj% #7( >*r(   c                 *   > [         TU ]  5       nSU-   $ )Nzvera.)rg   __repr__)r$   repri   s     r%   r   Linear.__repr__!  s    g }r(   )rh   rd   re   )r   r2   FFTrV   )FN)r)   N)rW   rX   rY   rZ   r	   strintr_   r,   r&   r   r@   rv   r|   r<   Tensorrp   r   r   r`   __classcell__)ri   s   @r%   r   r      s     !$(-!? ? 	?
 ? ? ? ? "&? ? ? 
? ?.$< $<Xd3i=P $<\` $<L[%5<< %N   5<<  D#  r(   r   )ry   typingr   r<   torch.nnr   torch.nn.functional
functionalr   transformers.pytorch_utilsr   peft.tuners.tuners_utilsr   r   peft.utils.otherr   _buffer_dictr	   r   r   ra   r(   r%   <module>r      sJ          - L & %oA oAdTRYY	 Tr(   