
    oi(                        S SK Jr  S SKrS SKrS SKJrJr  S SKrS SKJ	r	  S SK
Jr  S SKJrJr   " S S\5      r " S S	\	R                   \5      rg)
    )annotationsN)AnyOptional)
BufferDict)BaseTunerLayercheck_adapters_to_mergec                      \ rS rSrSrSrSS jr\            SS j5       rSS jr	  S               SS jjr
  S       SS jjrS	rg
)DeloraLayer   )delora_Adelora_Bdelora_lambda)rdelora_dropoutdelora_w_normc                   Xl         0 U l        [        R                  " 0 5      U l        [        R
                  " 0 5      U l        [        R
                  " 0 5      U l        [        R
                  " 0 5      U l        [        0 SS9U l
        SU l        / U l        X l        U R                  5       n[        U[        R                   5      (       a$  UR"                  UR$                  sU l        U l        g ['        S[)        U5       35      e)NT)
persistentFzUnsupported layer type )
base_layerr   nn
ModuleDictr   ParameterDictr   r   r   r   r   _disable_adaptersmerged_adapterskwargsget_base_layer
isinstanceLinearin_featuresout_features
ValueErrortype)selfr   r   base_layer_mods       R/home/james-whalen/.local/lib/python3.13/site-packages/peft/tuners/delora/layer.py__init__DeloraLayer.__init__)   s    $ mmB/((,((,--b1't<!&!,,.nbii002@2L2LnNiNi/Dd/6tN7K6LMNN    c                    [         R                  " U R                  SS9SS9n[         R                  " UR                  SS9SS9n[         R                  " X#-  XV-  -  5      nX-  U -  nXR	                  S5      -  nU$ )zpCompute delta = B @ diag(delora_lambda/r / (||A_i||*||B^j||)) @ A, scaled by provided w_norm (per-input channel)   dim-C6?minr   )torchclampnorm
diag_embed	unsqueeze)	ABr   r   w_normAnBndiagdeltas	            r$   _compute_deltaDeloraLayer._compute_delta=   su    
 [[AD1[[AD1 1RW =>1((++r'   c                   XR                   ;  d  XR                  ;  a  [        SU S35      eU R                  U R                   U   U R                  U   U R                  U   U R
                  U   U R                  U   5      nU$ )NzAdapter z not found.)r   r   r    r;   r   r   r   )r"   adapterr:   s      r$   get_delta_weightDeloraLayer.get_delta_weightI   s    --'7--+Gxy<==##MM'"MM'"w'FF7Ow'
 r'   c                   US::  a  [        SU 35      eX R                  U'   [        R                  " [        R
                  " X R                  5      5      U R                  U'   [        R                  " [        R
                  " U R                  U5      5      U R                  U'   [        R                  " [        R
                  " S5      5      U R                  U'   US:  a  [        R                  " US9nO[        R                  " 5       nU R                  R                  [        R                  " X05      5        U R!                  XU5        U R#                  U5        U R%                  U R&                  US9  g)ai  Internal function to create delora adapter

Args:
    adapter_name (`str`): Name for the adapter to add.
    r (`int`): Rank for the added adapter.
    delora_lambda (`float`): Boundary for the adapter's norm.
    module_dropout (`float`): The dropout probability for disabling adapter during training.
    init_weights (`bool`): Whether to initialize weights.
r   z?`r` should be a positive integer value but the value passed is r)   g        )p)inference_modeN)r    r   r   	Parameterr/   emptyr   r   r   r   r   DropoutIdentityr   updater   reset_delora_parameters%_move_adapter_to_device_of_base_layerset_adapteractive_adapters)	r"   adapter_namer   r   module_dropoutinit_weightsrC   r   module_dropout_layers	            r$   update_layerDeloraLayer.update_layerV   s   & 6^_`^abcc |&(ll5;;qBRBR3S&Tl#&(ll5;;t?P?PRS3T&Ul#+-<<A+G<(C#%::#? #%;;= ""2==,1U#VW 	$$\O 	22<@--nMr'   c                   XR                   R                  5       ;  a  g USL al  [        R                  R	                  U R                   U   [
        R                  " S5      S9  [        R                  R                  U R                  U   5        O~[        R                  R	                  U R                   U   [
        R                  " S5      S9  [        R                  R	                  U R                  U   [
        R                  " S5      S9  U R                  U   R                  R                  [        U5      5        [        R                  " 5          U R                  5       R                   nUR"                  R$                  S:w  a.  [        R&                  " UR                  SS9R)                  5       nO,[        R*                  " UR,                  S   UR"                  S9nXPR.                  U'   S S S 5        g ! , (       d  f       g = f)	NT   )ametar   r*   r)   )device)r   keysr   initkaiming_uniform_mathsqrtzeros_r   r   datafill_floatr/   no_gradr   weightrW   r!   r1   detachonesshaper   )r"   rM   rO   r   wr6   s         r$   rI   #DeloraLayer.reset_delora_parameters}   sY    }}11334GG$$T]]<%@DIIaL$QGGNN4==67GG$$T]]<%@DIIaL$QGG$$T]]<%@DIIaL$Q<(--33E-4HI ]]_##%,,Axx}}&AFF299; AGGAJqxx@/5|, __s   BG::
H)r   r   r   r   r   r   r   r   r   r   r   r   N)r   z	nn.ModulereturnNone)r4   torch.Tensorr5   rj   r   rj   r   intr6   rj   rh   rj   )r>   strrh   rj   )TF)rM   rl   r   rk   r   r`   rN   r`   rO   boolrC   rm   r   r   rh   ri   )Tg      .@)rM   rl   rO   rm   r   r`   rh   ri   )__name__
__module____qualname____firstlineno__adapter_layer_namesother_param_namesr%   staticmethodr;   r?   rQ   rI   __static_attributes__ r'   r$   r
   r
      s    O( 		(	9E	JM	Wc			 	& "$%N%N %N 	%N
 %N %N %N %N 
%NT "#	66 6 	6
 
6 6r'   r
   c                  z   ^  \ rS rSr S           S	U 4S jjjrS
SS jjrSS jrSS jrSU 4S jjrSr	U =r
$ )DeloraLinear   c                   > [         TU ]  5         [        R                  " X40 UD6  X l        U R	                  X#XEU5        g )N)superr%   r
   _active_adapterrQ   )	r"   r   rM   r   r   rN   rO   r   	__class__s	           r$   r%   DeloraLinear.__init__   s;     	T88+,=,Wr'   c                   [        X5      nU(       d  gU GH^  nX0R                  R                  5       ;   d  M#  U R                  5       nU R	                  U5      R                  5       R                  UR                  R                  UR                  R                  S9n[        R                  " 5          U(       aq  UR                  R                  R                  5       nXe-   n[        R                  " U5      R                  5       (       d  [!        SU S35      eXdR                  l        O%UR                  R                  R#                  U5        SSS5        U R$                  R'                  U5        GMa     g! , (       d  f       N/= f)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`.
N)dtyperW   z1NaNs detected in the merged weights. The adapter z seems to be broken)r   r   rX   r   r?   rc   torb   r   rW   r/   ra   r^   cloneisfiniteallr    add_r   append)r"   
safe_mergeadapter_namesactive_adapterr   delta_weightorig_weightss          r$   mergeDeloraLinear.merge   s.    0D+N!3!3!55!002
)).9VXRj//55j>O>O>V>VRW 
 ]]_!'1'8'8'='='C'C'E'3'B$~~l;??AA","STbSccv w#  2>))."))..33LA % $$++N;- , %_s   3BE::
F	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)z:
Unmerge all merged adapter layers from the base weights.
z Already unmerged. Nothing to do.Nr   )mergedwarningswarnlenr   popr   rX   r   rb   r^   r?   )r"   r   s     r$   unmergeDeloraLinear.unmerge   s     {{MM<=$&&'!+!11557N!3!3!55##%,,11T5J5J>5ZZ1 $&&'!+r'   c                ~   UR                   nU R                  (       a9  U R                  (       a  U R                  5         U R                  " U/UQ70 UD6nGOU R                  (       a  U R                  " U/UQ70 UD6nGOU R
                  (       d%  U R                  " U/UQ70 UD6R                  U5      $ U R                  " U/UQ70 UD6n[        R                  " U5      nU R
                   GH  nXR                  ;  a  M  U R                  U   " U5      n	[        R                  R                  XR                  U   -  U R                  U   5      n
[        R                  " U R                  U   R!                  SS9SS9n[        R                  " U R"                  U   R!                  SS9SS9nU R$                  U   U R&                  U   -  X-  -  nX-  n
[        R                  R                  XR"                  U   5      n
Xz-  nGM     XgR                  UR                   5      -   nUR                  U5      nU$ )Nr)   r*   r,   r-   r   )r   disable_adaptersr   r   r   rL   r   r/   
zeros_liker   r   r   
functionallinearr   r0   r1   r   r   r   )r"   xargsr   previous_dtyperesultbase_outadd_outr>   x_dhr7   r8   scalings                 r$   forwardDeloraLinear.forward   s     {{__Q888F[[__Q888F''q:4:6:==nMMq:4:6:H&&x0G//--/))'215 MM((/A/A'/J)JDMMZaLbc [[w!7!<!<!<!CN[[w!7!<!<!<!CN--g6HRWUK MM((MM',BC) 0, 

8>> ::F>*r'   c                *   > [         TU ]  5       nSU-   $ )Nzdelora.)r{   __repr__)r"   repr}   s     r$   r   DeloraLinear.__repr__  s    g 3r'   )r|   )T)rM   rl   r   rk   r   r`   rN   r`   rO   rm   rh   ri   )FN)r   rm   r   zOptional[list[str]]rh   ri   )rh   ri   )r   rj   r   r   r   r   rh   rj   )rh   rl   )rn   ro   rp   rq   r%   r   r   r   r   ru   __classcell__)r}   s   @r$   rx   rx      sr     "X X 	X
 X X X 
X X'<R
[)V r'   rx   )
__future__r   r[   r   typingr   r   r/   torch.nnr   peft.tuners._buffer_dictr   peft.tuners.tuners_utilsr   r   r
   Modulerx   rv   r'   r$   <module>r      sB    #       / L|6. |6~s299k sr'   