
    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  SSKJr  SS	KJr  SS
KJrJrJrJrJr  SSKJrJrJrJrJrJrJr   " S S\5      r " S S\5      r  " S S\ 5      r! " S S\5      r" " S S\"5      r# " S S\"5      r$ " S S\"5      r% " S S\5      r& " S S\5      r' S"         S#S jjr(S"S$S jjr) S%     S&S  jjr*S'S! jr+g)(    )annotationsN)AnyOptional)is_xpu_available)nn)	transpose   )ArrowLoraLinearLayer)
PeftConfig)DoraConv1dLayerDoraConv2dLayerDoraConv3dLayerDoraEmbeddingLayerDoraLinearLayer)Conv1dConv2dConv3d	EmbeddingLinearLoraVariant_ConvNdc                      \ 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)ArrowLinearVariant    c                "   UR                  S5      nUc  [        S5      e[        U R                  US9R	                  U R
                  R                  5      n[        U S5      (       d  [        R                  " 5       U l
        X@R                  U'   g)a  
Initialise the ArrowLoraLinearLayer() inside lora_arrow. lora_arrow is nn.ModuleDict(), serving as a container
for ArrowLoraLinearLayer(). A layer of the base model with LoRA adapter loaded on it will be like:
----------------------------------------------------
     (qkv_proj): lora.Linear4bit or lora.Linear(
        (base_layer): Linear4bit or Linear (lora_dropout): ModuleDict( ... ) (lora_A): ModuleDict( ... )
        (lora_B): ModuleDict( ... ) (lora_embedding_A): ParameterDict( ... ) (lora_embedding_B): ParameterDict(
        ... ) (lora_magnitude_vector): ModuleDict( ... ) (lora_arrow): ModuleDict(
            (arrow_router): ArrowLoraLinearLayer() )
    )
----------------------------------------------------

Args:
    module (Linear): LoRA Layer of the model, containing base_layer, lora_A, lora_B, etc.
    adapter_name (str): name of the adapter that will be put in lora_arrow.
    The adapter_name is "arrow_router" by default, set in create_arrow_model() in ./arrow.py
arrow_configNz9ArrowLinearVariant.init() did not receive an arrow_config)in_featuresr   
lora_arrow)get
ValueErrorr
   r   toweightdevicehasattrr   
ModuleDictr   )moduleadapter_namekwargsr   arrow_layers        S/home/james-whalen/.local/lib/python3.13/site-packages/peft/tuners/lora/variants.pyinitArrowLinearVariant.init!   s    ( zz.1XYY +**%
 "V]]!!
" 	 v|,, "F*5,'    c               *   U R                   U   nUR                  U R                  U R                  5        UR	                  U R                  U R                  5        U" UU R                  U R                  U R
                  U   U R                  S9nX6-   $ )u  
Parameters mirror those in PEFT’s `LoraVariant.forward`. Called every time the host Linear does a fwd pass.

build_prototypes() and gen_know_sub() should run only once before routing. Both are implemented in
ArrowLoraLinearLayer (see ./arrow.py). They are lazily invoked in the forward pass below. Attributes of
ArrowLoraLinearLayer() class ensure they execute only a single time.

Args:
    module (Linear): LoRA Layer of the model
    active_adapter (str): name of the arrow route, which should be active to perform arrow.
    x (torch.Tensor): input to the layer
    result (torch.Tensor): output of the base layer.

Return value:
    output of the base model + delta weight computed by arrow layer.
)lora_Alora_Bdropoutscaling)r   gen_know_subr/   r0   build_prototypeslora_dropoutr2   )r&   active_adapterxresultr(   arrowdeltas          r*   forwardArrowLinearVariant.forwardE   s    2 !!.1 	6==&--8 	v}}fmm< ====''7NN
 ~r-   c                    [        S5      eNz=Cannot merge an active Arrow router adapter. Remove it first.RuntimeErrorr&   r6   orig_weights      r*   
merge_safeArrowLinearVariant.merge_safew       Z[[r-   c                    [        S5      er>   r?   rA   s      r*   merge_unsafeArrowLinearVariant.merge_unsafe{   rE   r-   c                    [        S5      e)Nz?Cannot unmerge an active Arrow router adapter. Remove it first.r?   rA   s      r*   unmergeArrowLinearVariant.unmerge   s    \]]r-    N)r&   r   r'   str
r&   r   r6   rM   r7   torch.Tensorr8   rO   returnrO   r&   r   r6   rM   rB   rO   rP   rO   r&   r   r6   rM   rB   rO   rP   None)__name__
__module____qualname____firstlineno__staticmethodr+   r;   rC   rG   rJ   __static_attributes__rL   r-   r*   r   r       s    !6 !6F )) ) 	)
 ) 
) )V \ \ \ \ ^ ^r-   r   c                      \ 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)DoraLinearVariant   c                P   U R                   (       d  U R                  S S  S-   U l        [        [        U SS5      S9nU R                  U   R
                  nU R                  U   R
                  nU R                  =(       a9    UR                  R                  S:H  =(       d    UR                  R                  S:H  nU R                  (       a  UR                  R                  S;   a  UR                  UR                  5      nOgUR                  R                  S;  a2  [        5       (       a  UR                  S5      nOUR                  S5      nUR                  UR                  5      nU R                  U   nUR                  U R                  5       UUUUS	9  X0R                   U'   g )
Nlora_magnitude_vectorfan_in_fan_outFr`   cpu)cudaxpurd   rc   )
base_layerr/   r0   r2   place_on_cpu)r_   adapter_layer_namesr   getattrr/   r"   r0   ephemeral_gpu_offloadr#   typer!   r   r2   update_layerget_base_layer)r&   r'   r(   
dora_layerr/   r0   rf   r2   s           r*   r+   DoraLinearVariant.init   sX   ++)/)C)CA)FIc)cF&$GFDTV[4\]
|,33|,3333t9K9Ku9T9sX^XeXeXjXjnsXs''}}!!_46==1==%%_<'))!'5!1!'6!26==1...,,.% 	  	
 6@$$\2r-   c                   UR                   nU R                  U5      nU R                  U   R                  U[	        X@R
                  5      SS9R                  5       nU R                  U S3U5        U R                  U   R                  U-  n[	        UR                  SS5      U R
                  5      nXbU-   -  nUR                  U5      nU$ Nr	   r2   -weight_norm)dtypeget_delta_weightr_   get_weight_normr   r`   detach_cache_storer"   viewr!   r&   r6   rB   
orig_dtypedelta_weightweight_normdora_factor
new_weights           r*   rC   DoraLinearVariant.merge_safe   s     &&
..~> ((8_[)LBWBW*Xbc_dVX 	 	~.l;[I22>BIIKW 0 0Q 79N9NO ,$>?
]]:.
r-   c                   UR                   nU R                  U5      nU R                  U   R                  U[	        X@R
                  5      SS9R                  5       nU R                  U S3U5        U R                  U   R                  U-  n[	        UR                  SS5      U R
                  5      nXbR                  U-   -  nUR                  U5      nXrl
        g rp   )rt   ru   r_   rv   r   r`   rw   rx   r"   ry   datar!   rz   s           r*   rG   DoraLinearVariant.merge_unsafe   s     &&
..~>((8_[)LBWBW*Xbc_dVX 	 	~.l;[I22>BIIKW 0 0Q 79N9NO $4$4|$CD
]]:.
%r-   c                   UR                   nU R                  U5      nU R                  U S35      nU R                  U   R                  U-  nUR
                  UR                  SS5      -  U-
  nUR                  U5      nU$ )Nrr   rs   r	   rt   ru   
_cache_popr_   r"   r   ry   r!   rz   s           r*   rJ   DoraLinearVariant.unmerge   s     &&
..~>''>*:,(GH22>BIIKW %%(8(8Q(??,N
]]:.
r-   c           
     H   U R                   U   nU R                  U   nU R                  U   nU R                  U   n[	        U[
        R                  5      (       d  U R                  (       d  Un	O
U" U5      nS n	X0R                  U   " UUUUU R                  5       U	S9-   nU$ N)r/   r0   r2   re   base_result
r/   r0   r5   r2   
isinstancer   Identitytrainingr_   rl   
r&   r6   r7   r8   r(   r/   r0   r1   r2   r   s
             r*   r;   DoraLinearVariant.forward        ~.~.%%n5..0gr{{++6?? K
AK66~F,,.#
 
 r-   rL   Nr&   r   r'   rM   r(   r   rP   rS   rQ   rR   rN   rT   rU   rV   rW   rX   r+   rC   rG   rJ   r;   rY   rL   r-   r*   r[   r[      s    @ @:  ( & &$     	 
 r-   r[   c                      \ 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)DoraEmbeddingVariant   c                   U R                   c  U R                  S S  S-   U l        [        SS9nU R                  U   nU R                  U   nU R
                  U   nUR                  U R                  5       XEUS9  X0R                   U'   g )Nr^   Tra   re   r/   r0   r2   )r_   rg   r   lora_embedding_Alora_embedding_Br2   rk   rl   )r&   r'   r(   rm   r   r   r2   s          r*   r+   DoraEmbeddingVariant.init   s    ''/)/)C)CA)FIc)cF&'t<
!22<@!22<@...,,.7Gjq 	  	
 6@$$\2r-   c                `   UR                   nU R                  U5      nU R                  U   R                  X$R                  SS9R                  5       nU R                  U S3U5        U R                  U   R                  U-  nUR                  SS5      nXbU-   -  nUR                  U5      nU$ rp   )
rt   ru   r_   rv   Trw   rx   r"   ry   r!   rz   s           r*   rC   DoraEmbeddingVariant.merge_safe  s     &&
..~> ((8_[..!_DVX 	 	~.l;[I22>BIIKW!&&q"- ,$>?
]]:.
r-   c                ~   UR                   nU R                  U5      nU R                  U   R                  X$R                  SS9R                  5       nU R                  U S3U5        U R                  U   R                  U-  nUR                  SS5      nXbR                  U-   -  nUR                  U5      nXrl	        g rp   )rt   ru   r_   rv   r   rw   rx   r"   ry   r   r!   rz   s           r*   rG   !DoraEmbeddingVariant.merge_unsafe  s     &&
..~>((8_[..!_DVX 	 	~.l;[I22>BIIKW!&&q"- $4$4|$CD
]]:.
%r-   c                   UR                   nU R                  U5      nU R                  U S35      nU R                  U   R                  U-  nUR
                  UR                  SS5      -  U-
  nUR                  U5      nU$ )Nrr   r	   rs   r   rz   s           r*   rJ   DoraEmbeddingVariant.unmerge+  s     &&
..~>''>*:,(GH22>BIIKW %%(8(8B(??,N
]]:.
r-   c           	     Z   U R                   U   R                  nU R                  U   R                  nU R                  U   nU R                  U   " UUUUU R                  5       U R                  S9u  pU R                  5       n
U
b  XR                  U	R                  5      -  n	X-  U	-   nU$ )N)r/   r0   r2   re   embed_fn)
r   r   r   r2   r_   rl   _embed_get_embed_scaler!   rt   )r&   r6   r7   r8   r(   embedding_Aembedding_Br2   mag_norm_scaledora_resultembed_scales              r*   r;   DoraEmbeddingVariant.forward5  s     --n=??--n=??..0&,&B&B>&R,,.]]'
# --/"%{7H7H(IIK(;6r-   rL   N)r&   r   r'   rM   r(   r   rP   rS   )r&   r   r6   rM   rB   rO   rP   rO   )r&   r   r6   rM   rB   rO   rP   rS   )
r&   r   r6   rM   r7   rO   r8   rO   rP   rO   r   rL   r-   r*   r   r      s    @ @  ( & &$     	 
 r-   r   c                      \ 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)_DoraConvNdVariantiU  c                (   U R                   c  U R                  S S  S-   U l        U R                  U   R                  nU R                  U   R                  nU R
                  U   nUR                  U R                  5       X4US9  X R                   U'   g )Nr^   r   )r_   rg   r/   r"   r0   r2   rk   rl   )r&   r'   rm   r/   r0   r2   s         r*   init_convd_variant%_DoraConvNdVariant.init_convd_variantV  s    ''/)/)C)CA)FIc)cF&|,33|,33...6+@+@+B6jqr5?$$\2r-   c                ^   UR                   nU R                  U5      nU R                  U   R                  X$SS9R	                  5       nU R                  U S3U5        U R                  U   R                  U-  nUR                  " U R                  5       6 X$-   -  nUR                  U5      nU$ Nr	   rq   rr   )
rt   ru   r_   rv   rw   rx   r"   ry   _get_dora_factor_viewr!   rz   s           r*   rC   _DoraConvNdVariant.merge_safeb  s     &&
..~> ((8HHlmHnuuw 	 	~.l;[I22>BIIKW %%v'C'C'EF+Jde
]]:.
r-   c                ~   UR                   nU R                  U5      nU R                  U   R                  X$SS9R	                  5       nU R                  U S3U5        U R                  U   R                  U-  nUR                  " U R                  5       6 UR                  U-   -  nUR                  U5      nXrl	        g r   )rt   ru   r_   rv   rw   rx   r"   ry   r   r   r!   rz   s           r*   rG   _DoraConvNdVariant.merge_unsafet  s     &&
..~> ((8HHlmHnuuw 	 	~.l;[I22>BIIKW %%v'C'C'EF+JZJZ]iJij
]]:.
%r-   c                   UR                   nU R                  U5      nU R                  U S35      nU R                  U   R                  U-  nUR
                  UR                  " U R                  5       6 -  U-
  nUR                  U5      nU$ )Nrr   )	rt   ru   r   r_   r"   r   ry   r   r!   rz   s           r*   rJ   _DoraConvNdVariant.unmerge  s     &&
..~>''>*:,(GH22>BIIKW %%(8(8&:V:V:X(YY\hh
]]:.
r-   c           
     H   U R                   U   nU R                  U   nU R                  U   nU R                  U   n[	        U[
        R                  5      (       d  U R                  (       d  Un	O
U" U5      nS n	X0R                  U   " UUUUU R                  5       U	S9-   nU$ r   r   r   s
             r*   r;   _DoraConvNdVariant.forward  r   r-   rL   N)r&   r   r'   rM   rm   	nn.ModulerP   rS   )r&   r   r6   rM   rB   rO   rP   rO   )r&   r   r6   rM   rB   rO   rP   rS   )
r&   r   r6   rM   r7   rO   r8   rO   rP   rO   )rT   rU   rV   rW   rX   r   rC   rG   rJ   r;   rY   rL   r-   r*   r   r   U  s    	@ 	@  " & &      	 
 r-   r   c                  (    \ rS rSr\SS j5       rSrg)DoraConv1dVarianti  c                >    [        SS9n[        R                  XUS9  g NFra   )rm   )r   r   r   r&   r'   r(   rm   s       r*   r+   DoraConv1dVariant.init      $E:
--fz-Zr-   rL   N)r&   r   r'   rM   r(   r   rP   rS   rT   rU   rV   rW   rX   r+   rY   rL   r-   r*   r   r         [ [r-   r   c                  (    \ rS rSr\SS j5       rSrg)DoraConv2dVarianti  c                >    [        SS9n[        R                  XUS9  g r   )r   r   r   r   s       r*   r+   DoraConv2dVariant.init  r   r-   rL   N)r&   r   r'   rM   r(   r   rP   rS   r   rL   r-   r*   r   r     r   r-   r   c                  (    \ rS rSr\SS j5       rSrg)DoraConv3dVarianti  c                >    [        SS9n[        R                  XUS9  g r   )r   r   r   r   s       r*   r+   DoraConv3dVariant.init  r   r-   rL   N)r&   r   r'   rM   r(   r   rP   rS   r   rL   r-   r*   r   r     r   r-   r   c                      \ 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S j5       r
Srg	)QALoraLinearVarianti  c                V   SU;  a  [        S5      eU R                  b5  U R                  US   -  S:w  a  [        SU R                   SUS    S35      eUS   nSU R                  ;  a  U R                  S-   U l        [        U S5      (       d  0 U l        X0R                  U'   U R
                  U   nUR                  nUR                  R                  nUR                  R                  n[        R                  " UR                  U R                  U   -  US	UUS
9nXR
                  U'   g)a7  
Initializes QALoRA specific parameters for a given adapter.

Args:
    module (Linear): The linear module to be adapted.
    adapter_name (str): The name of the adapter.
    **kwargs: Additional keyword arguments.
        qalora_group_size (int): The size of groups for pooling. This is expected to be passed.
qalora_group_sizezx`use_qalora=True` requires 'qalora_group_size' to be provided in kwargs. Please ensure it is passed from the LoraConfig.Nr   z1`use_qalora=True` requires `module.in_features` (z)) to bedivisible by 'qalora_group_size' ())r   F)biasr#   rt   )r    r   other_param_namesr$   r   r/   out_featuresr"   r#   rt   r   r   )	r&   r'   r(   r   old_lora_A_layerrr#   rt   new_lora_A_layers	            r*   r+   QALoraLinearVariant.init  sN    f,C 
 )f.@.@6J]C^.^bc.cCFDVDVCW X55;<O5P4QQRT  ##67f&>&>>'-'?'?BX'XF$v233')F$1B  .!==6))!((// ''--99((F,D,D\,RR
 '7l#r-   c                    [        S5      e)Nz;QALoRA for GPTQ layers does not support 'get_delta_weight'.NotImplementedError)r&   r6   s     r*   ru   $QALoraLinearVariant.get_delta_weight  s    !"_``r-   c                    [        S5      e)Nz5QALoRA for GPTQ layers does not support 'safe_merge'.r   rA   s      r*   rC   QALoraLinearVariant.merge_safe  s    !"YZZr-   c                    [        S5      e)Nz7QALoRA for GPTQ layers does not support 'merge_unsafe'.r   rA   s      r*   rG    QALoraLinearVariant.merge_unsafe  s    !"[\\r-   c                    [        S5      e)Nz2QALoRA for GPTQ layers does not support 'unmerge'.r   rA   s      r*   rJ   QALoraLinearVariant.unmerge  s    !"VWWr-   c                   U R                   U   R                  nU R                  U   R                  nU R                  U   nU R                  U   nU R
                  U   n	U R                  (       a'  [        U[        R                  5      (       d  U" U5      OUn
U
R                  n[        U5      S:  a  U
R                  SU R                  5      nOU
nUR                  u  pX-  nUR                  XU	5      R                  SS9nUU-  nUUR                  5       -  UR                  5       -  U-  n[        U5      S:  a'  UR                  US S UR!                  S5      4-   5      nUU-   $ )N   rs   )dim)r/   r"   r0   r5   r2   r   r   r   r   r   shapelenry   r   meantsize)r&   r6   r7   r8   r(   lora_A_weightlora_B_weightr1   r2   
group_size	x_dropped
orig_shapex_flat
batch_sizer   pooled_featuresx_pooledx_pooled_scaledr:   s                      r*   r;   QALoraLinearVariant.forward   sK    n5<<n5<<%%n5..0--n=
"(//*Wbkk:Z:ZGAJ`a	__
 z?Q^^B(:(:;FF"(,,
%3;;zJGLLQRLS"_4  -//"33moo6GG'Q z?QJJz#2%**R.1BBCE~r-   rL   Nr   )r&   r   r6   rM   rP   rO   rQ   rR   rN   )rT   rU   rV   rW   rX   r+   ru   rC   rG   rJ   r;   rY   rL   r-   r*   r   r     s    *7 *7X a a [ [ ] ] X X $$$ $ 	$ 
$ $r-   r   c                      \ 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)ALoraLinearVarianti(  c                    g NrL   )r&   r'   r(   s      r*   r+   ALoraLinearVariant.init)  s    r-   c                    [        S5      e)Nz$aLoRA does not support safe merging.r   rA   s      r*   rC   ALoraLinearVariant.merge_safe-  s    !"HIIr-   c                    [        S5      e)NzaLoRA does not support merging.r   rA   s      r*   rG   ALoraLinearVariant.merge_unsafe1  s    !"CDDr-   c                    [        S5      e)Nz!aLoRA does not support unmerging.r   rA   s      r*   rJ   ALoraLinearVariant.unmerge5  s    !"EFFr-   c                   UR                  SS 5      nU R                  U   nU R                  U   nU R                  U   nU R                  U   n	UR                  UR                  R                  5      nUR                  n
U
S   n[        U
5      S:X  a  U
S   nOSnU
S   nUR                  S   nUR                  nUc%  [        R                  " X4[        R                  S9nO[        R                  " U Vs/ s H  nUc  SO[        [!        U5      U5      PM     snU[        R"                  S9n[        R$                  " XS9R'                  S5      nUUU-
  R'                  S5      :  nUR)                  SU5      nUR)                  SU5      nUR)                  S5      nUU==   U" U" U" UU   5      5      5      U	-  -  ss'   U$ s  snf )	Nalora_offsetsr      r	   rs   )rt   )r#   rt   )r#   )r   r/   r0   r5   r2   r!   r"   rt   r   r   r#   torchzerosbooltensorminintlongarange	unsqueezery   )r&   r6   r7   r8   r(   r  r/   r0   r1   r2   result_shapeBr   DDxr#   maskooffsetsposr   res_flat	mask_flats                          r*   r;   ALoraLinearVariant.forward9  s    

?D9~.~.%%n5..0DD$$%||O|!QAAWWR[ ;;vUZZ8D
 ll=JK]aiSQ^3]KjjG ,,q0::1=C1w;11!44D B;;r1%IIbM	 	vfWVI5F-G&HIGSS Ls   8$GrL   Nr   rQ   rR   rN   r   rL   r-   r*   r   r   (  s      J J E E G G ,,, , 	, 
, ,r-   r   c           	        Uc  / $ UR                   S   nS/U-  n0 n[        R                  " [        5      n[	        U5       H  nU(       a  U[        U5      :  a  X8   OUn	U	S:X  a  SXX'   M+  X;  a#  [        R                  " SU	 SU S35        SXX'   MS  X	   n
[        U
SS5      nUc  SXX'   Mm  X;  a0  [        R                  " U[        R                  UR                  S9Xi'   Xy   R                  U5        M     UR                  5        H  u  pXl   n[        U5      nU H  nX(   n[        U5      nS	nUUS   :H  R                  S
S9S   nU HL  nUR!                  5       nUU-   U::  d  M  [        R"                  " UUUU-    U5      (       d  MB  UU:  d  MJ  UnMN     US	:w  a  UU-
  nUS:  a  UOSXX'   M  SXX'   M     M     U$ )a]  
This is a helper function for Activated LoRA (aLoRA) that searches each input token sequence for the last occurence
of the appropriate "alora_invocation_tokens" invocation sequence. The calculated alora_offset is the location of
the *start* of the invocation tokens, counting backward from the end (will therefore always be >=
len(alora_invocation_tokens). If adapter_names is passed, then each input uses the appropriate invocation sequence
for the specified adapter for that row. Logic is provided to handle mixed collections of adapters for which not all
are aLoRAs (e.g. some base model, some LoRA).
Nr   __base__z	Adapter 'z5' not found in peft_config. Using base model for row .alora_invocation_tokens)rt   r#   rs   T)as_tuple)r   collectionsdefaultdictlistranger   warningswarnrh   r  r  r  r#   appenditemsnonzeroitemequal)peft_configr6   	input_idsadapter_namesr   r  cached_invocation_tensorsadapters_to_process_indicesicurrent_adapter_namecurrent_peft_configinvocation_tokensadapter_name_to_processindicescurrent_invocation_ids_tensorinvocation_lensequenceseq_lenbest_match_start_idxpossible_startsstart_idx_tensoridx
offset_vals                          r*   calculate_alora_offsetsr=  i  s    	#JFZ'M ""-"9"9$"?:3@Q]I[E[}/ao:-#M2MMI&:%;;pqrpsstuv#M)?#$79RTXY$#M@>Cll!I<L<L?%; 	$9@@C1 4 -H,M,M,O((A(Z%:;A |H(mG#% '+H+KKTT^bTcdefO$3 &++-'72{{8C#2F#GIfgg!55360 %4 $r)$';;
1;a:T #' % 	 -P. r-   c                    Sn[        U R                  SS5      (       a  SnU$ U(       aL  U HF  nUS:X  a  M  U R                  R                  U5      nU(       d  M/  [        USS5      (       d  MC  Sn  U$    U$ )zK
Helper function to determine if the current batch has any aLoRA adapters.
Fr  NTr  )rh   active_peft_configr)  r   )modelr+  is_alora_relevantnameconfig_s        r*   is_alora_relevant_in_batchrD    s     u'')BDII   
!Dz!''++D1Gw77,EtLL$(! " r-   c                   UR                  SS5      n[        X5      (       d  U$ UR                  S5      nUcP  Uc   Ub  [        R                  " S5        SUS'   U$ Ub%  [	        U R
                  U R                  UUS9US'   U$ SUS'   U$ )z
Wrapper around calculate_alora_offsets, for the .forward of the model. It only calculates alora_offsets if the
batch contains aLoRA adapters.
r+  Nr  zkCannot calculate aLoRA offsets when only inputs_embeds are provided. Disabling aLoRA for this forward pass.r+  )r   rD  r"  r#  r=  r)  r6   )r@  r*  inputs_embedsr(   adapter_names_for_offset_calcr  s         r*   get_alora_offsets_for_forwardrI    s     %+JJ$E!%eKKJJ/M!:MM} '+F?# M "&=!!$$;	'F?# M '+F?#Mr-   c                   UR                  S5      n[        X5      (       d  U$ UR                  S5      nUc  UR                  S5      nUc1  U(       a(  [        US   [        R                  5      (       a  US   nOSnUbG  UR
                  S:X  a  UR                  S5      n[        U R                  U R                  UUS9nXbS'   U$ [        R                  " S5        SUS'   U$ )	z
Wrapper around calculate_alora_offsets, for the .generate of the model. It only calculates alora_offsets if the
batch contains aLoRA adapters.
r+  r  Nr*  r   r	   rF  z_Cannot calculate aLoRA offsets during generate as input_ids are not available. Disabling aLoRA.)r   rD  r   r  Tensorndimr  r=  r)  r6   r"  r#  )r@  argsr(   rH  alora_offsets_from_kwargscurrent_input_idscalculated_offsetss          r*   get_alora_offsets_for_generaterQ    s    
 %+JJ$?!%eKK &

? ; ("JJ{3$
47ELL99$(G!$(!( %%*$5$?$?$B!!8!!$$!;	" '9?# M MMq '+F?#Mr-   r   )
r)  r   r6   rM   r*  rO   r+  Optional[list[str]]rP   z	list[int])r@  r   r+  rR  )NN)r@  r   r*  rO   rG  rO   )r@  z	nn.module),
__future__r   r  r"  typingr   r   r  accelerate.utils.importsr   r   peft.utils.otherr   r9   r
   configr   dorar   r   r   r   r   layerr   r   r   r   r   r   r   r   r[   r   r   r   r   r   r   r   r=  rD  rI  rQ  rL   r-   r*   <module>rZ     s%   #      5  & '  h h R R Ra^ a^Hl l^_, _DU Up[* [[* [[* [c+ cL> >D quEE-0E=IEZmEEP( UY!-EQ<#r-   