
    oiC                        S SK Jr  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)	    )annotationsN)AnyOptionalUnion)BaseTunerLayercheck_adapters_to_mergec                      \ rS rSrSrSrSS jr S           SS jjrSS jrSS jr	SS jr
SS	 jrSS
 jrSSS jjrSrg)	MissLayer   )
miss_block)miss_rmiss_dropoutmiss_mini_rc                   Xl         0 U l        [        R                  " 0 5      U 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 )
base_layerr   nn
ModuleDictr   r   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/miss/layer.py__init__MissLayer.__init__!   s    $MM"-**2.!&!(,%((*
j")),,2<2H2H*JaJa/Dd/6tJ7G6HIJJ    c                   US::  a  [        SU 35      eX R                  U'   X0R                  U'   US:  a  [        R                  " US9nO[        R
                  " 5       nXR                  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        OaUS
:X  a1  U R                  U-  S:w  a  [        S5      eU R)                  XU5        O*U(       a  U R+                  X5        OU R-                  U5        U R/                  U5        U R1                  U R2                  US9  g)zInternal function to create miss 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         )pTrequires_gradz0MiSS is not implemented for base layers of type batz=The weight matrix must be fully divisible into [r, r] blocks.minizmini_r is divided along the out_features dimension. For optimal performance and implementation simplicity,it is recommended that out_features be divisible by mini_r.Error: {self.out_features} % mini_r != 0)inference_modeN)r   r   r   r   DropoutIdentityr   r   r   r   	Parametertorchzerosr   r   	TypeErrorr   __name__r   reset_bat_parametersreset_mini_parametersreset_miss_parametersreset_miss_parameters_random%_move_adapter_to_device_of_base_layerset_adapteractive_adapters)
r    adapter_namermini_rr   init_weightsr,   r   miss_dropout_layerr   s
             r!   update_layerMissLayer.update_layer4   s   " 6^_`^abcc$%L!)/&#!#l!;!#*<,' ((*
j")),,,.LLQHYHY9Zjn,oDOOL)NtT^O_OhOhNijkk 5 !#q(D,=,=,AQ,F !`aa%%l6V#  6)Q. ? 
 &&|?&&|7--l;22<@--nMr$   c                    [         R                  " [        R                  " X R                  5      SS9U R
                  U'   g NTr(   r   r/   r0   r1   r   r   r    r;   r<   s      r!   r6   MissLayer.reset_miss_parametersm   s+    (*U[[DUDU5Vfj(k%r$   c                    [         R                  " [        R                  " U R                  U-  X"5      SS9U R
                  U'   g rC   rD   rE   s      r!   r4   MissLayer.reset_bat_parametersp   s4    (*U[[ARARVWAWYZ5^nr(s%r$   c                p    [         R                  " [        R                  " X#5      SS9U R                  U'   g rC   )r   r/   r0   r1   r   )r    r;   r<   r=   s       r!   r5   MissLayer.reset_mini_parameterss   s%    (*U[[5K[_(`%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!   r7   &MissLayer.reset_miss_parameters_randomv   s*    
  !>$))A, Or$   c                    US:X  a  g U R                    H8  nX R                  R                  5       ;  a  M"  [        R                  " S5        M:     g )N   zGScaling operation for MiSS not supported! Automatically set scale to 1.r:   r   keyswarningswarnr    scaleactive_adapters      r!   scale_layerMissLayer.scale_layery   s?    A:"22N__%9%9%;;MMcd	 3r$   Nc                    U R                    H8  nX R                  R                  5       ;  a  M"  [        R                  " S5        M:     g )Nz?Unscaling operation for MiSS not supported! Keeping scale at 1.rU   rY   s      r!   unscale_layerMissLayer.unscale_layer   s5    "22N__%9%9%;;MM[\	 3r$   )r   r   r   r   r   r   r   r   r   r   r   )r   z	nn.ModulereturnNoneF)r;   strr<   intr=   re   r>   z
bool | strr,   boolra   rb   )r;   rd   )rZ   floatra   rb   Nra   rb   )r3   
__module____qualname____firstlineno__adapter_layer_namesother_param_namesr"   r@   r6   r4   r5   r7   r\   r_   __static_attributes__ r$   r!   r
   r
      s    )AK4  %7N7N 7N 	7N !7N 7N 
7NrltaPe] ]r$   r
   c                     ^  \ rS 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S jjrSSS jjr	SS jr
SU 4S	 jjrS
rU =r$ )
MissLinear   z$
MiSS implemented in a dense layer.
c                   > [         TU ]  5         [        R                  " X40 UD6  X l        U R                  " X#XEU40 UD6  X`l        g rh   )superr"   r
   _active_adapterr@   miss_fn)	r    r   r;   r<   r=   r   r>   r   	__class__s	           r!   r"   MissLinear.__init__   sF     	46v6+,6XQWX#r$   c                x   [        X5      nU(       d  gU GH  nX0R                  R                  5       ;   d  M#  U R                  5       nUR                  R
                  nU(       Ga  UR                  R                  R                  5       nU R                  S:X  a  U R                  X65      nXg-  nOsU R                  S:X  a2  U R                  X0R                  R                  R                  5      nU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        GOU R                  S:X  a^  U R                  X0R                  R                  R                  5      nUR                  =R                  UR!                  U5      -  sl        OU R                  S:X  aP  U R                  X0R                  R                  R                  5      nUR!                  U5      UR                  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*   r+   z1NaNs detected in the merged weights. The adapter z seems to be broken)r   r   rV   r   weightdtypedataclonerw   get_delta_weightget_delta_weight_missr   r0   isfiniteallr   tor   append)r    
safe_mergeadapter_namesr[   r   
orig_dtypeorig_weightdelta_weights           r!   mergeMissLinear.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'+'A'A.RaRaRhRhRmRm'n&2 >>+6::<<(OP^O__rs  .9^^J-GJ%%*||u,'+'<'<^__McMcMhMh'i"))..,//*2MM./'+'A'A.RaRaRhRhRmRm'n1=1L
)).'+'A'A.RaRaRhRhRmRm'n1=1L
)).$$++N;E ,r$   c                   U R                   (       d  [        R                  " S5        g[        U R                  5      S:  G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O1U 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  GM  gg)zG
This method unmerges all merged adapter layers from the base weights.
z Already unmerged. Nothing to do.Nr   r*   T)rer+   )mergedrW   rX   lenr   popr   r{   r|   r   rV   r}   r~   rw   r   r   r   )r    r[   r   r   r   r   s         r!   unmergeMissLinear.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\\V+#'#=#=n^b#=#cL#'#=#=n^b#=#cL)5)D
!!& $&&'!++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   rT         r|   )r   devicer|   r   r0   float16bfloat16rg   r   sizereshapepermuteeyeinverseshaper}   )r    adapterr   r   r   r|   cast_to_fp32weight_missr<   ooneinv_I_plus_bwoutput_tensors                 r!   r   MissLinear.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                   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	UR                  S5      n
U R                  S:X  a!  UR                  SXR                  U   -  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   r+   rT   Nr   r   )r   r   r|   r   r0   r   r   rg   r   rw   repeatr   r   r   r   	transposer   r}   )r    r   r   r   r   r|   r   r   r   r   r<   	last_sizen_blockn_block_sizer   r   s                   r!   r    MissLinear.get_delta_weight_miss  s    )00(.. {{e+c%--1G1b5TYTbTbKboog.%++-K!&&r*"''*Q<<6!%,,Q@P@PQX@Y0YZK?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$   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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OxU R                  " U/UQ70 UD6nU R                   GHQ  nXpR                  R                  5       ;  a  M#  U R                  U   n
U R
                  S:X  a6  U
R#                  SU R                  R$                  U R&                  U   -  5      n
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[.        R0                  " U" U5      R2                  " / UR4                  S S QUR+                  S5      U-  PUP76 SS9U
-  -   nGMT     UR7                  U5      nU$ )	Nr*   )inputr{   biasr+   rT   r   r   )dim)r|   disable_adaptersr   r   r   rw   r{   r}   r~   r:   r   rV   r   _cast_input_dtyper   Flinearr   r   r   r   r   padr0   sumr   r   r   )r    xargsr   previous_dtyperesultr   r[   r   r   missdropoutr<   padding_sizes                 r!   forwardMissLinear.forward^  sn     {{__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||v-#{{1doo.J.JdN^N^_mNn.no"//?G		!AvvbzA~*()FF2JN(:a'?EE!a%67..q**=A#eii
0B0B0eAGGCRL0eRSRXRXY[R\`aRa0ecd0ekm&nqu&uuF '; >*r$   c                *   > [         TU ]  5       nSU-   $ )Nzmiss.)ru   __repr__)r    reprx   s     r!   r   MissLinear.__repr__  s    g }r$   )rv   rw   )r   r   r&   T)r;   rd   r<   re   r=   re   r   rg   r>   zUnion[bool, str]ra   rb   )FN)r   rf   r   zOptional[list[str]]ra   rb   ri   rc   )r   rf   ra   torch.Tensor)r   r   r   r   r   r   ra   r   )ra   rd   )r3   rj   rk   rl   __doc__r"   r   r   r   r   r   r   ro   __classcell__)rx   s   @r!   rr   rr      s     !)-$ $ 	$
 $ $ '$ 
$ $ 4<lE.,\AF'R r$   rr   )
__future__r   rP   rW   typingr   r   r   r0   torch.nnr   torch.nn.functional
functionalr   peft.tuners.tuners_utilsr   r   r
   Modulerr   rp   r$   r!   <module>r      sJ    #   ' '     Lm] m]`~I ~r$   