
    oiGi                    X   S SK Jr  S SKrS SKJrJr  S SKrS SKrS SK	J
r
Jr  S SKJrJr  S SKJr  S SKJr  SS	KJr  SS
KJrJr  S/r\" 5       (       a%   " S S\R2                  R4                  \5      rSS jr\
" 5       (       a&   " S S\R2                  R4                  \5      rSS jrgg)    )annotationsN)AnyOptional)is_bnb_4bit_availableis_bnb_available)BaseTunerLayercheck_adapters_to_merge)dequantize_bnb_weight)	transpose   )ArrowConfig)	LoraLayerLoraVariantalora_offsetsc                     ^  \ 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 r          SS jr	SS jr
SU 4S	 jjrS
rU =r$ )Linear8bitLt#   c                   > [         TU ]  5         [        R                  " X5        SU l        X l        U R                  UUUUUUU	UUU
S9
  g )NF)
lora_alphalora_dropoutinit_lora_weights
use_rslorause_dora	use_alora	lora_biasarrow_configsuper__init__r   fan_in_fan_out_active_adapterupdate_layer)self
base_layeradapter_namerr   r   r   r   r   r   r   r   kwargs	__class__s                N/home/james-whalen/.local/lib/python3.13/site-packages/peft/tuners/lora/bnb.pyr   Linear8bitLt.__init__%   s]     Gt0"'D#/ %)"3%!##)      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variantsr.   r/   r0   r#   r   r   r   r'   r.   r/   r0   s           r)   resolve_lora_variant!Linear8bitLt.resolve_lora_variantF   6     '8)++IG)++(**r+   c                ,   [        X5      nU(       d  gU GHz  nX0R                  R                  5       ;  a  M#  [        R                  " S5        U R                  5       R                  nU R                  5       R                  nUR                  c  UR                  Ul        [        XES9nX0R                  ;  aI  U R                  U5      nUR                  UR                  5      R                  UR                  5      U-   nOU R                  U   R                  XU5      nU(       a8  [         R"                  " U5      R%                  5       (       d  ['        SU S35      e[(        R*                  R-                  UR                  S5      SUR.                  S9R                  UR                  5      U R                  5       l        U R0                  U   (       a  U R                  5       R2                  R4                  U R6                  U   R2                  -   n	U(       a*  [         R"                  " U	5      (       d  ['        SU S35      eXR                  5       R2                  l        UR9                  5         U R:                  R=                  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`.
NzWMerge lora module to 8-bit linear may get different generations due to rounding errors.state1NaNs detected in the merged weights. The adapter  seems to be brokencpuFrequires_gradhas_fp16_weights)r	   lora_Akeyswarningswarnget_base_layerweightr:   SCBr
   lora_variantget_delta_weighttodtypedevice
merge_safetorchisfiniteall
ValueErrorbnbnn
Int8Paramsr@   r   biasdatalora_Breset_gradsmerged_adaptersappend)
r#   
safe_mergeadapter_namesactive_adapterrF   r:   output	lora_dataw_data	bias_datas
             r)   mergeLinear8bitLt.mergeX   s    4DHM "/!)9)9);;m ,,.55++-3399$ &

EI /vC!):):: $ 5 5n EI#YYy7::9;K;KLyXF!..~>II$`fgFennV&<&@&@&B&B$KNK[[no  03vv/@/@IIe$EFLcLc 0A 0"V]]# ##%, >>.1 $ 3 3 5 : : ? ?$++nB]BbBb bI!%..*C*C(OP^O__rs  7@'')..3!!#$$++N;Q #0r+   c                   U R                   (       d  [        R                  " S5        g[        U R                  5      S:  Ga
  U R                  R                  5       nXR                  R                  5       ;  a  MS  [        R                  " S5        U R                  5       R                  nU R                  5       R                  nUR                  c  UR                  Ul        [        X#S9nXR                  ;  aI  U R                  U5      nUR                  UR                   5      R                  UR"                  5      U-
  nOU R                  U   R%                  XU5      n[&        R(                  R+                  UR                  S5      SUR,                  S9R                  UR"                  5      U R                  5       l	        U R.                  U   (       aD  U R                  5       R0                  =R2                  U R4                  U   R0                  -  sl        UR7                  5         [        U R                  5      S:  a  GM	  gg)	G
This method unmerges all merged adapter layers from the base weights.
 Already unmerged. Nothing to do.Nr   zYUnmerge lora module to 8-bit linear may get different generations due to rounding errors.r9   r=   Fr>   )mergedrC   rD   lenrY   poprA   rB   rE   rF   r:   rG   r
   rH   rI   rJ   rK   rL   unmergerR   rS   rT   r@   r   rU   rV   rW   rX   )r#   r]   rF   r:   r^   r_   r`   s          r)   rj   Linear8bitLt.unmerge   s    ;;@Ad**+a/!%!5!5!9!9!;!)9)9);;o ,,.55++-3399$ &

EI.vC!):):: $ 5 5n EI#YYy7::9;K;KLyXF!..~>FFt]cdF/2vv/@/@IIe$EFLcLc 0A 0"V]]# ##%, >>.1'')..33t{{>7R7W7WW3!!#5 d**+a//r+   c                    [        U R                  U   R                  U R                  U   R                  -  S5      U R                  U   -  $ NFr   rW   rF   rA   scalingr#   adapters     r)   rI   Linear8bitLt.get_delta_weight   K    KK(//$++g2F2M2MM ,,w'	(r+   c          	     n   [          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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       GH  u  pUS:X  a  M  XR                  R                  5       ;  a  M-  U R                  U   nU R                  U   nU R                  U   nU R                  U   n[        R                  " 5       (       + nU(       a1  UR                  nU R                  XR                  R                  5      nXU      nXR                   ;  aA  U" U" U" U5      5      5      U-  nU(       a  UR#                  W5      nXyU   ==   U-  ss'   GM  UR%                  SS 5      nUb  X    Vs/ s H  nUU   PM
     snUS'   U R                   U   R&                  " U 4UUXyU      S.UDUD6nU(       a  UR#                  W5      nUXyU   '   GM     U$ s  snf s  snnf s  snf N__base__r   r]   xresultVARIANT_KWARG_KEYSri   r$   setrZ   	enumeraterA   rB   rW   r   ro   rN   is_autocast_enabledrK   _cast_input_dtyperF   rH   rJ   getforwardr#   rx   r\   argsr'   kvariant_kwargsry   unique_adapterssub_batch_indices_listrq   indexitemir]   rA   rW   dropoutro   requires_conversionexpected_dtype	sub_batchr^   r   js                            r)   _mixed_batch_forward!Linear8bitLt._mixed_batch_forward   H   
 ?QQ>PAt!44>PNQ__Q888F!-0O%'"*&--	R_H`.tH`dhdsuH`.tu + &/%?!!Z/!)9)9);;^4^4++N;,,~6*/*C*C*E&E#&%+\\N..q--2E2EFA Q78	!):)::#F79+=$>?'IF*!'>!:!45?5$2$6$6$MM$0UkUn:oUnPQ=;KUn:o7!..~>FF'5#%Q&?@	
 ) !F +!'>!:8>F!45M &@P Ma R /u: ;p   H'(H,7H,H2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                   GH6  nXR                  R                  5       ;  a  M#  U R                  U   n	U R                  U   n
U R                  U   nU R                  U   n[        R                  " 5       (       + nU(       a1  UR                   nU R#                  XR$                  R                   5      nXR&                  ;  a5  U
" U	" U" U5      5      5      U-  nU(       a  UR)                  W5      nX-   nM  U R&                  U   R*                  " U 4UUUS.UDUD6nU(       d  GM%  UR)                  W5      nGM9     U$ s  snf Nr\   rw   )_check_forward_argsri   r{   disable_adaptersrg   rj   r$   r   active_adaptersrA   rB   rW   r   ro   rN   r~   rK   r   rF   rH   rJ   r   r#   rx   r   r'   r\   r   r   ry   r]   rA   rW   r   ro   r   r   r^   s                   r)   r   Linear8bitLt.forward   s:   $$Q888"JJ=M>PQ>PAt!44>PNQ$$;;LLN<T<V<J MI *221utu=u\juntuF ME <T<V<B M? <T<V<&*&:&:N%[[-=-=-?? ![[8F![[8F"//?G"ll>:G.3.G.G.I*I'*)/ 221mm6I6IJ%->->>!'wqz(:!;g!E.%+YY~%>F!'!%!2!2>!B!J!J "+9#)	"
 -" %" /.%+YY~%>F9 ';< MU Rs   I c                *   > [         TU ]  5       nSU-   $ Nzlora.r   __repr__r#   repr(   s     r)   r   Linear8bitLt.__repr__'      '"$CS= r+   r!   r    )	r   r           TFFFNF)r$   torch.nn.Moduler%   strr&   intr   r   r   floatr   boolr   r   r   r   r   r   r   r   r   r   returnNoner   r   r   r   r   r   r   zOptional[LoraVariant]FNr[   r   r\   zOptional[list[str]]r   r   r   r   
rx   torch.Tensorr   r   r\   z	list[str]r'   r   r   r   rx   r   r   r   r   r   __name__
__module____qualname____firstlineno__r   r4   rb   rj   rI   r   r   r   __static_attributes____classcell__r(   s   @r)   r   r   #   s    "%&*$#"(,#	'	 	 		
 	  	  $	 	 	 	 &	 	 	 	B	+#.	+:>	+KO	+"	+$:	<x"	$H	5	!5	*-5	>G5	SV5	5	n-	^	! 	!r+   r   c                   S n[        U [        5      (       a  U R                  5       nOU nUR                  SS5      nU(       a  [        U[        R
                  R                  5      (       ac  UR                  5       nUR                  U R                  R                  U R                  R                  U R                  S.5        [        X40 UD6nU$ )Nloaded_in_8bitF)r@   	thresholdr   )
isinstancer   rE   r   rR   rS   r   copyupdater:   r@   r   r   )targetr%   r'   
new_moduletarget_base_layerr   eightbit_kwargss          r)   dispatch_bnb_8bitr   +  s    
fn-- & 5 5 7 &$4e<j):CFF<O<OPP$kkmO""(.(E(E!'!7!7#\\ &fNoNJ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 jrS r          SS jr	SS jr
SU 4S	 jjrS
rU =r$ )
Linear4bitiD  c                   > [         TU ]  5         [        R                  " X5        SU l        X l        U R                  UUUUUUUU
U	S9	  g )NF)r   r   r   r   r   r   r   r   )r#   r$   r%   r&   r   r   r   r   r   r   r   r'   r(   s               r)   r   Linear4bit.__init__F  sZ     Gt0"'D#/ %)"3%!#)  
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       $ r-   r1   r3   s           r)   r4   Linear4bit.resolve_lora_variante  r6   r+   c                   [        X5      nU(       d  gU GHk  nX0R                  R                  5       ;  a  M#  [        R                  " S5        U R                  5       R                  nUR                  n[        XDR                  S9nX0R                  ;  a  U R                  U5      nXg-   nOU R                  U   R                  XU5      nU(       a8  [        R                  " U5      R                  5       (       d  [!        SU S35      eSU;   a  SUS'   SUS'   UR#                  S	S5        UR%                  5        V	V
s0 s H  u  pU	R'                  S
5      (       a  M  X_M!     nn	n
[(        R*                  R,                  " UR/                  S5      40 UD6R/                  UR0                  5      U R                  5       l        U R2                  U   (       a  U R                  5       R4                  R6                  U R8                  U   R4                  -   nU(       a*  [        R                  " U5      (       d  [!        SU S35      eXR                  5       R4                  l        U R:                  R=                  U5        GMn     gs  sn
n	f )r8   NzWMerge lora module to 4-bit linear may get different generations due to rounding errors.r9   r;   r<   bnb_quantizedFr?   rV   _r=   )r	   rA   rB   rC   rD   rE   rF   __dict__r
   quant_staterH   rI   rM   rN   rO   rP   rQ   ri   items
startswithrR   rS   
Params4bitrJ   rL   r   rU   rV   rW   rY   rZ   )r#   r[   r\   r]   rF   r'   r^   r_   r`   r   vra   s               r)   rb   Linear4bit.mergew  s    4DHM "/!)9)9);;m ,,.55.v=O=OP!):):: $ 5 5n EI#/F!..~>II$`fgFennV&<&@&@&B&B$KNK[[no  #f,.3F?+*/'

64(+1<<>S>41cAR$!$>S/2vv/@/@5AQ/\U[/\/_/_`f`m`m/n##%,>>.1 $ 3 3 5 : : ? ?$++nB]BbBb bI!%..*C*C(OP^O__rs  7@'')..3$$++N;O #08 Ts    J Jc                   U R                   (       d  [        R                  " S5        g[        U R                  5      S:  Ga  U R                  R                  5       nXR                  R                  5       ;  a  MS  [        R                  " S5        U R                  5       R                  nUR                  n[        X"R                  S9nXR                  ;  a  U R                  U5      nXE-
  nOU R                  U   R                  XU5      nSU;   a  SUS'   SUS'   UR                  S	S5        [         R"                  R$                  " UR'                  S
5      40 UD6R'                  UR(                  5      U R                  5       l	        U R*                  U   (       aD  U R                  5       R,                  =R.                  U R0                  U   R,                  -  sl        [        U R                  5      S:  a  GM  gg)re   rf   Nr   zYUnmerge lora module to 4-bit linear may get different generations due to rounding errors.r9   r   Fr?   rV   r=   )rg   rC   rD   rh   rY   ri   rA   rB   rE   rF   r   r
   r   rH   rI   rj   rR   rS   r   rJ   rL   r   rU   rV   rW   )r#   r]   rF   r'   r^   r_   r`   s          r)   rj   Linear4bit.unmerge  s    ;;@Ad**+a/!%!5!5!9!9!;!)9)9);;o ,,.55.v=O=OP!):):: $ 5 5n EI#/F!..~>FFt]cdF"f,.3F?+*/'

64(/2vv/@/@5AQ/\U[/\/_/_`f`m`m/n##%,>>.1'')..33t{{>7R7W7WW33 d**+a//r+   c                    [        U R                  U   R                  U R                  U   R                  -  S5      U R                  U   -  $ rm   rn   rp   s     r)   rI   Linear4bit.get_delta_weight  rs   r+   c          	     n   [          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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       GH  u  pUS:X  a  M  XR                  R                  5       ;  a  M-  U R                  U   nU R                  U   nU R                  U   nU R                  U   n[        R                  " 5       (       + nU(       a1  UR                  nU R                  XR                  R                  5      nXU      nXR                   ;  aA  U" U" U" U5      5      5      U-  nU(       a  UR#                  W5      nXyU   ==   U-  ss'   GM  UR%                  SS 5      nUb  X    Vs/ s H  nUU   PM
     snUS'   U R                   U   R&                  " U 4UUXyU      S.UDUD6nU(       a  UR#                  W5      nUXyU   '   GM     U$ s  snf s  snnf s  snf ru   rz   r   s                            r)   r   Linear4bit._mixed_batch_forward  r   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                  5       nU R                   GH6  nXR                  R                  5       ;  a  M#  U R                  U   n	U R                  U   n
U R                  U   nU R                  U   n[        R                   " 5       (       + nU(       a1  UR"                  nU R%                  XR&                  R"                  5      nXR(                  ;  a5  U
" U	" U" U5      5      5      U-  nU(       a  UR+                  W5      nX-   nM  U R(                  U   R,                  " U 4UUUS.UDUD6nU(       d  GM%  UR+                  W5      nGM9     U$ s  snf r   )r   ri   r{   r   rg   rj   r$   r   cloner   rA   rB   rW   r   ro   rN   r~   rK   r   rF   rH   rJ   r   r   s                   r)   r   Linear4bit.forward  sH   $$Q888"JJ=M>PQ>PAt!44>PNQ$$;;LLN<T<V<X MW *221utu=u\juntuT MS <T<V<P MM <T<V<  &*&:&:N%[[-=-=-?? ![[8F![[8F"//?G"ll>:G.3.G.G.I*I'*)/ 221mm6I6IJ%->->>!'wqz(:!;g!E.%+YY~%>F!'!%!2!2>!B!J!J "+9#)	"
 -" %" /.%+YY~%>F9 ';< Mc Rs   Ic                *   > [         TU ]  5       nSU-   $ r   r   r   s     r)   r   Linear4bit.__repr__K  r   r+   r   )r   r   r   TFFNF)r$   r   r%   r   r&   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s   @r)   r   r   D  s    "%&*$"(,#	'	 	 		
 	  	  $	 	 	 &	 	 	 	>	+#.	+:>	+KO	+"	+$9	<v!	XF	5	!5	*-5	>G5	SV5	5	n4	l	! 	!r+   r   c                   S n[        U [        5      (       a  U R                  5       nOU nUR                  SS5      nU(       a  [	        5       (       a  [        U[
        R                  R                  5      (       ac  UR                  5       nUR                  UR                  UR                  R                  UR                  R                  S.5        [        X40 UD6nU$ )Nloaded_in_4bitF)compute_dtypecompress_statistics
quant_type)r   r   rE   r   r   rR   rS   r   r   r   r   rF   r   r   )r   r%   r'   r   r   r   fourbit_kwargss          r)   dispatch_bnb_4bitr   O  s    
fn-- & 5 5 7 &$4e<355*EVX[X^X^XiXi:j:j#[[]N!!%6%D%D+<+C+C+W+W"3":":"E"E $FKNKJr+   )r   r   r%   r   )
__future__r   rC   typingr   r   bitsandbytesrR   rN   peft.import_utilsr   r   peft.tuners.tuners_utilsr   r	   peft.utils.integrationsr
   peft.utils.otherr   configr   layerr   r   r{   rS   Moduler   r   r   r    r+   r)   <module>r      s    #      E L 9 &  ) && F!uxx	 F!P. I!UXX__i I!V[ r+   