
    oi:                         S SK r S SK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Jr   " S S\5      r " S S\R                   \5      rg)    N)AnyOptionalUnion)BaseTunerLayercheck_adapters_to_mergec                       \ rS rSrSrSrS\R                  SS4S jr SS\	S	\
S
\S\SS4
S jjrS\	4S jrS\	4S jrS\	4S jrS\SS4S jrSSS jjrSrg)	BoneLayer   )
bone_block)bone_r
base_layerreturnNc                 \   Xl         0 U l        [        R                  " 0 5      U l        SU l        / U l        S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)NFTzUnsupported layer type )r   r   nnParameterDictr   _disable_adaptersmerged_adapterscast_input_dtype_enabledkwargsget_base_layer
isinstanceLinearin_featuresout_features
ValueErrortype)selfr   r   s      P/home/james-whalen/.local/lib/python3.13/site-packages/peft/tuners/bone/layer.py__init__BoneLayer.__init__   s    $**2.!&!(,%((*
j")),,2<2H2H*JaJa/Dd/6tJ7G6HIJJ    adapter_namerinit_weightsinference_modec                    US::  a  [        SU 35      eX R                  U'   U R                  5       n[        U[        R
                  5      (       aA  [        R                  " [        R                  " X R                  5      SS9U R                  U'   O![        S[        U5      R                   35      eUS:X  aC  U R                  U-  S:w  d  U R                  U-  S:w  a  [        S5      eU R                  X5        O*U(       a  U R!                  X5        OU R#                  U5        U R%                  U5        U R'                  U R(                  US9  g	)
zInternal function to create bone adapter

Args:
    adapter_name (`str`): Name for the adapter to add.
    r (`int`): Rank for the added adapter.
    init_weights (`bool`): Whether to initialize weights.
r   z?`r` should be a positive integer value but the value passed is Trequires_gradz0Bone is not implemented for base layers of type batz=The weight matrix must be fully divisible into [r, r] blocks.)r%   N)r   r   r   r   r   r   	Parametertorchzerosr   r   	TypeErrorr   __name__r   reset_bat_parametersreset_bone_parametersreset_bone_parameters_random%_move_adapter_to_device_of_base_layerset_adapteractive_adapters)r   r"   r#   r$   r%   r   r   s          r   update_layerBoneLayer.update_layer0   s'    6^_`^abcc$%L! ((*
j")),,,.LLQHYHY9Zjn,oDOOL) NtT^O_OhOhNijkk 5 !#q(D,=,=,AQ,F !`aa%%l6&&|7--l;22<@--nMr!   c                     [         R                  " [        R                  " X R                  5      SS9U R
                  U'   g NTr'   r   r*   r+   r,   r   r   r   r"   r#   s      r   r0   BoneLayer.reset_bone_parametersY   s+    (*U[[DUDU5Vfj(k%r!   c                     [         R                  " [        R                  " U R                  U-  X"5      SS9U R
                  U'   g r8   r9   r:   s      r   r/   BoneLayer.reset_bat_parameters\   s4    (*U[[ARARVWAWYZ5^nr(s%r!   c                     [         R                  R                  U R                  U   [        R
                  " S5      S9  g )N   )a)r   initkaiming_uniform_r   mathsqrt)r   r"   s     r   r1   &BoneLayer.reset_bone_parameters_random_   s*    
  !>$))A, Or!   scalec                     US:X  a  g U R                    H8  nX R                  R                  5       ;  a  M"  [        R                  " S5        M:     g )N   zGScaling operation for Bone not supported! Automatically set scale to 1.r4   r   keyswarningswarnr   rF   active_adapters      r   scale_layerBoneLayer.scale_layerb   s?    A:"22N__%9%9%;;MMcd	 3r!   c                     U R                    H8  nX R                  R                  5       ;  a  M"  [        R                  " S5        M:     g )Nz?Unscaling operation for Bone not supported! Keeping scale at 1.rI   rM   s      r   unscale_layerBoneLayer.unscale_layerl   s5    "22N__%9%9%;;MM[\	 3r!   )	r   r   r   r   r   r   r   r   r   FNr   N)r.   
__module____qualname____firstlineno__adapter_layer_namesother_param_namesr   Moduler   strintboolr5   r0   r/   r1   floatrO   rR   __static_attributes__ r!   r   r	   r	      s    )#K299 K4 K,  %'N'N 'N 	'N
 'N 
'NRl# lt tP Pe e4 e] ]r!   r	   c            	       ,  ^  \ rS rSrSr  SS\S\S\\\4   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S\S\R                  4S jjrSS\S\R                  4S jjrS\R                  S\S\S\R                  4S jrS\4U 4S jjrSrU =r$ )
BoneLineart   z$
Bone implemented in a dense layer.
r"   r#   r$   r   Nc                    > [         TU ]  5         [        R                  " X40 UD6  X l        U R                  " X#U40 UD6  X@l        g rU   )superr   r	   _active_adapterr5   bone_fn)r   r   r"   r#   r$   r   	__class__s         r   r   BoneLinear.__init__y   sC     	46v6+,<B6B#r!   
safe_mergeadapter_namesc                 0   [        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U R                  S:X  a  U R                  X65      nXg-  nO1U R                  X0R                  R                  R                  5      nUn[        R                  " U5      R                  5       (       d  [        SU S35      eUR!                  U5      UR                  l        OU R                  S:X  a^  U R                  X0R                  R                  R                  5      nUR                  =R                  UR!                  U5      -  sl        OOU R                  X0R                  R                  R                  5      nUR!                  U5      UR                  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`.
Nr)   z1NaNs detected in the merged weights. The adapter z seems to be broken)r   r   rJ   r   weightdtypedatacloneri   get_delta_weightget_delta_weight_boner   r+   isfiniteallr   tor   append)r   rl   rm   rN   r   
orig_dtypeorig_weightdelta_weights           r   mergeBoneLinear.merge   s    0D+N!5!5!77!002
'..44
 #-"3"3"8"8">">"@K||u,'+'<'<^'Y#3'+'A'A.RaRaRhRhRmRm'n&2 >>+6::<<(OP^O__rs  .9^^J-GJ%%*||u,'+'<'<^__McMcMhMh'i"))..,//*2MM.'+'A'A.RaRaRhRhRmRm'n1=1L
)).$$++N;9 ,r!   c                 ~   U R                   (       d  [        R                  " S5        g[        U R                  5      S:  a  U R                  R                  5       nU R                  5       nUR                  R                  nXR                  R                  5       ;   a  U R                  5       R                  R                  R                  5       nU R                  S:X  a  U R                  XSS9nOU R                  XSS9nUR!                  U5      UR                  l        [        U R                  5      S:  a  M  gg)zG
This method unmerges all merged adapter layers from the base weights.
z Already unmerged. Nothing to do.Nr   r)   T)re)mergedrK   rL   lenr   popr   ro   rp   r   rJ   rq   rr   ri   rs   rt   rw   )r   rN   r   ry   rz   r{   s         r   unmergeBoneLinear.unmerge   s     {{MM<=$&&'!+!11557N,,.J#**00J!5!5!77"113::??EEG<<5(#'#8#8Y]#8#^L#'#=#=n^b#=#cL)5)D
!!& $&&'!+r!   r   c                    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(       a  UR                  5       nUR                  UR                  5      nUR                  S5      nU(       a  UR                  UR                  S5      U-  XR                  S5      U-  U5      R                  SSSS5      n	[        R                  " UR                  S5      5      R                  UR                  5      n
[        R                  " X-   5      nUR                  UR                  5      nX-
  U-  nUR                  SSSS5      R                  " UR                  6 nOzUR                  UR                  S5      U-  XR                  S5      U-  U5      R                  SSSS5      U-  U-   nUR                  SSSS5      R                  " UR                  6 nU(       a2  UR                  US9nUR                  U5      U R                   U   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.
cpur   rH         rp   )r   devicerp   r   r+   float16bfloat16r`   rw   sizereshapepermuteeyeinverseshaperq   )r   adapterrz   r   r   rp   cast_to_fp32weight_boner#   ooneinv_I_plus_bwoutput_tensors                 r   rs   BoneLinear.get_delta_weight   s-    )00(.. {{e+c%--1G1b5TYTbTbKboog.%++-K!nn[%6%67R ##K$4$4Q$71$<aAQAQRSATXYAY[\]eefgijlmopqA))K,,R0144[5G5GHC ==):;L'??;+<+<=LL0AIIaAq199;;L;LMM ##K$4$4Q$71$<aAQAQRSATXYAY[\]eefgijlmopq 
 IIaAq199;;L;LMM),,5,9M -8NN5,ADOOG$)r!   c                 2   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(       a  UR                  5       nUR                  S5      nUR                  S5      n	X-  S:w  GaI  X-  n
X-  nX-  nU(       a  USS2SU24   R                  SX5      R                  SSS5      U-
  R                  SSS5      R                  " USS2SU24   R                  6 USS2SU24'   USS2US24   UR                  SS5      SS2SU
24   -
  USS2US24'   OUSS2SU24   R                  SX5      R                  SSS5      U-   R                  SSS5      R                  " USS2SU24   R                  6 USS2SU24'   USS2US24   UR                  SS5      SS2SU
24   -   USS2US24'   UnOU(       ad  UR                  SUR                  S5      U	-  U	5      R                  SSS5      U-
  nUR                  SSS5      R                  " UR                  6 nOcUR                  SUR                  S5      U	-  U	5      R                  SSS5      U-   nUR                  SSS5      R                  " UR                  6 nU(       a2  UR                  US9nUR                  U5      U R                   U   l        U$ )r   r   r   r   NrH   r   r   )r   r   rp   r   r+   r   r   r`   r   r   r   r   	transposerw   rq   )r   r   rz   r   r   rp   r   r   r   r#   	last_sizen_blockn_block_sizer   r   s                  r   rt    BoneLinear.get_delta_weight_bone   sI    )00(.. {{e+c%--1G1b5TYTbTbKboog.%++-K!&&r*Q?a#I!&G";L M\M!12::2wJRRSTVWYZ[^iiWQ1%W)!]l]*:;AAC A}},-  <= 01[5J5J1a5PRSU_V_U_R_4`` A|},-
 !M\M!12::2wJRRSTVWYZ[^iiWQ1%W)!]l]*:;AAC A}},-  <= 01[5J5J1a5PRSU_V_U_R_4`` A|},- (M ''K,<,<Q,?1,DaHPPQRTUWXY\gg !		!Q 2 : :K<M<M N''K,<,<Q,?1,DaHPPQRTUWXY\gg !		!Q 2 : :K<M<M N),,5,9M -8NN5,ADOOG$)r!   xargsr   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O+U R                  (       a  U R                  " U/UQ70 UD6nGOU R
                  S:X  a  U R                  R                  R                  R                  5       nU R                   H7  nXpR                  R                  5       ;  a  M"  U R                  Xv5      nXh-   nM9     U R                  XR                   5      nU R                  U R                  R                  UR                   5      n	[        R                   " XU	S9nGOU R                  " U/UQ70 UD6nU R                   H  nXpR                  R                  5       ;  a  M"  U R                  U   n
U
R#                  S5      nUR#                  S5      U-  S:w  a2  XR#                  S5      U-  -
  U-  n[        R$                  " USU45      nU R                  XR                   5      nU[&        R(                  " UR*                  " / UR,                  S S QUR#                  S5      U-  PUP76 SS9U
-  -   nM     UR/                  U5      nU$ )Nr)   )inputro   biasr   r   )dim)rp   disable_adaptersr   r   r   ri   ro   rq   rr   r4   r   rJ   rs   _cast_input_dtyper   Flinearr   padr+   sumr   r   rw   )r   r   r   r   previous_dtyperesultrz   rN   r{   r   boner#   padding_sizes                r   forwardBoneLinear.forward9  s     {{__Q888F[[__Q888F||u$"oo4499??A&*&:&:N%__-A-A-CC #'#8#8#UL"-"<K	 '; **1.?.?@--doo.B.BKDUDUVDI<T<V<&*&:&:N%__-A-A-CC ??>:D		!AvvbzA~*()FF2JN(:a'?EE!a%67..q**=A#eii		0\1773B<0\PRWX0\Z[0\bd&ehl&llF '; >*r!   c                 *   > [         TU ]  5       nSU-   $ )Nzbone.)rg   __repr__)r   reprj   s     r   r   BoneLinear.__repr__^  s    g }r!   )rh   ri   )r   T)FNrV   rT   )r.   rW   rX   rY   __doc__r]   r^   r   r_   r   r   listr|   r   r+   Tensorrs   rt   r   r   r   ra   __classcell__)rj   s   @r   rd   rd   t   s     )-$ $ 	$
 D#I&$ 
$ $.< .<Xd3i=P .<\` .<`E*, ,%,, ,\=d =u|| =~# #c #S #U\\ #J#  r!   rd   )rC   rK   typingr   r   r   r+   torch.nnr   torch.nn.functional
functionalr   peft.tuners.tuners_utilsr   r   r	   r\   rd   rb   r!   r   <module>r      sG      ' '     LX] X]vlI lr!   