
    +hI                        S SK JrJrJr  S SKrS SKJs  Jr  S SKJr  SSK	J
r
Jr  SSKJr  \" 5       (       a  S SKJrJr  \R"                  " \5      rS\R(                  4S	 jrS\R(                  4S
 jrSS\4S jjr " S S\R                  R(                  5      r " S S\R(                  5      r " S S\R(                  5      r " S S\R8                  5      r " S S\R<                  5      rg)    )OptionalTupleUnionN)nn   )	deprecatelogging)is_transformers_available)CLIPTextModelCLIPTextModelWithProjectiontext_encoderc                 0   / n[        U [        [        45      (       aX  [        U R                  R
                  R                  5       H)  u  p#SU S3nUR                  nUR                  XE45        M+     U$ [        SU R                  R                   35      e)Ntext_model.encoder.layers.z
.self_attnz.do not know how to get attention modules for: )
isinstancer   r   	enumerate
text_modelencoderlayers	self_attnappend
ValueError	__class____name__)r   attn_modulesilayernamemods         O/home/james-whalen/.local/lib/python3.13/site-packages/diffusers/models/lora.pytext_encoder_attn_modulesr    )   s    L,0K LMM!,"9"9"A"A"H"HIHA/s*=D//C, J  I,J`J`JiJiIjkll    c                 0   / n[        U [        [        45      (       aX  [        U R                  R
                  R                  5       H)  u  p#UR                  nSU S3nUR                  XT45        M+     U$ [        SU R                  R                   35      e)Nr   z.mlpz(do not know how to get mlp modules for: )r   r   r   r   r   r   r   mlpr   r   r   r   )r   mlp_modulesr   r   mlp_modr   s         r   text_encoder_mlp_modulesr&   7   s    K,0K LMM!,"9"9"A"A"H"HIHAiiG/s$7D/ J  CLDZDZDcDcCdeffr!   
lora_scalec                    [        U 5       Hf  u  p#[        UR                  [        5      (       d  M&  XR                  l        XR
                  l        XR                  l        XR                  l        Mh     [        U 5       HF  u  p$[        UR                  [        5      (       d  M&  XR                  l        XR                  l        MH     g N)r    r   q_projPatchedLoraProjectionr'   k_projv_projout_projr&   fc1fc2)r   r'   _attn_module
mlp_modules        r   adjust_lora_scale_text_encoderr4   E   s    3LAk((*?@@,6),6),6).8  + B 2,?jnn&;<<(2NN%(2NN% @r!   c                   Z   ^  \ rS rSrSU 4S jjrSSSS.U 4S jjrSS jrS	 rS
 rSr	U =r
$ )r+   S   Nc           	      Z  > Sn[        SSU5        [        T	U ]	  5         SSKJn  Xl        U R
                  R                  R                  nUc   U R
                  R                  R                  nU" U R
                  R                  U R
                  R                  UUUUS9U l        X l        g )NzsUse of `PatchedLoraProjection` is deprecated. Please switch to PEFT backend by installing PEFT: `pip install peft`.r+   1.0.0r   )LoRALinearLayer)network_alphadevicedtyperank)r   super__init__models.lorar9   regular_linear_layerweightr;   r<   in_featuresout_featureslora_linear_layerr'   )
selfrA   r'   r:   r=   r<   deprecation_messager9   r;   r   s
            r   r?   PatchedLoraProjection.__init__T   s     T)74GH1$8!**1188=--44::E!0%%11%%22'"
 %r!    Fdestinationprefix	keep_varsc                v   > U R                   c  U R                  R                  " XAX#S.6$ [        TU ]  " XAX#S.6$ )NrJ   )rE   rA   
state_dictr>   )rF   rK   rL   rM   argsr   s        r   rO    PatchedLoraProjection.state_dicto   sA    !!),,77v  w!4eer!   c           	      @   U R                   c  g U R                  R                  R                  R                  U R                  R                  R                  R
                  pCU R                  R                  R                  R                  5       nU R                   R                  R                  R                  R                  5       nU R                   R                  R                  R                  R                  5       nU R                   R                  b/  X`R                   R                  -  U R                   R                  -  nXQ[        R                  " US S S 24   US S S 24   5      S   -  -   nU(       aF  [        R                  " U5      R                  5       R                  5       (       a  [!        SU  S35      eUR#                  XCS9U R                  R                  l        S U l         UR%                  5       U l        UR%                  5       U l        Xl        g Nr   aThis LoRA weight seems to be broken. Encountered NaN values when trying to fuse LoRA weights for  .LoRA weights will not be fused.r;   r<   )rE   rA   rB   datar<   r;   floatupdownr:   r=   torchbmmisnananyitemr   tocpuw_upw_downr'   	rF   r'   safe_fusingr<   r;   w_origrb   rc   fused_weights	            r   
_fuse_lora PatchedLoraProjection._fuse_loraw   s   !!)1188==CCTE^E^EeEeEjEjEqEqv**1166<<>%%((//44::<'',,3388>>@!!//;00>>>AWAWA\A\\DeiiT1WvdTUg.WXY.Z!Z[5;;|488:??AAOOSf U22  1=v0[!!((- "& HHJ	jjl$r!   c           	      D   [        U SS 5      b  [        U SS 5      c  g U R                  R                  R                  nUR                  UR
                  p2U R                  R                  US9R                  5       nU R                  R                  U5      R                  5       nUR                  5       U R                  [        R                  " US S S 24   US S S 24   5      S   -  -
  nUR                  X2S9U R                  R                  l        S U l        S U l	        g Nrb   rc   r;   r   rV   )getattrrA   rB   rW   r<   r;   rb   r`   rX   rc   r'   r[   r\   rF   rg   r<   r;   rb   rc   unfused_weights          r   _unfuse_lora"PatchedLoraProjection._unfuse_lora   s    fd+7GD(TX<Y<e0077<<$**L,?,?vyy||6|*002'--/%++-599TRVXYRY]\bcgijcj\kClmnCo1op0>0A0A0A0]!!((-	r!   c                     U R                   c  SU l         U R                  c  U R                  U5      $ U R                  U5      U R                   U R                  U5      -  -   $ )N      ?)r'   rE   rA   )rF   inputs     r   forwardPatchedLoraProjection.forward   s[    ??"!DO!!),,U33((/4??TE[E[\aEb3bccr!   )rE   r'   rA   rc   rb   )   N   Nrs   F)r   
__module____qualname____firstlineno__r?   rO   rh   rp   ru   __static_attributes____classcell__r   s   @r   r+   r+   S   s4    %6 -1u f f%@ d dr!   r+   c                      ^  \ rS rSrSr    SS\S\S\S\\   S\\\	R                  \4      S\\	R                     4U 4S	 jjjrS
\	R                  S\	R                  4S jrSrU =r$ )r9      aM  
A linear layer that is used with LoRA.

Parameters:
    in_features (`int`):
        Number of input features.
    out_features (`int`):
        Number of output features.
    rank (`int`, `optional`, defaults to 4):
        The rank of the LoRA layer.
    network_alpha (`float`, `optional`, defaults to `None`):
        The value of the network alpha used for stable learning and preventing underflow. This value has the same
        meaning as the `--network_alpha` option in the kohya-ss trainer script. See
        https://github.com/darkstorm2150/sd-scripts/blob/main/docs/train_network_README-en.md#execute-learning
    device (`torch.device`, `optional`, defaults to `None`):
        The device to use for the layer's weights.
    dtype (`torch.dtype`, `optional`, defaults to `None`):
        The dtype to use for the layer's weights.
rC   rD   r=   r:   r;   r<   c                   > [         TU ]  5         Sn[        SSU5        [        R                  " XSXVS9U l        [        R                  " X2SXVS9U l        X@l        X0l        X l	        Xl
        [        R                  R                  U R
                  R                  SU-  S9  [        R                  R                  U R                  R                  5        g )NzmUse of `LoRALinearLayer` is deprecated. Please switch to PEFT backend by installing PEFT: `pip install peft`.r9   r8   F)biasr;   r<   rw   std)r>   r?   r   r   LinearrZ   rY   r:   r=   rD   rC   initnormal_rB   zeros_)	rF   rC   rD   r=   r:   r;   r<   rG   r   s	           r   r?   LoRALinearLayer.__init__   s     	 N#W.ABIIkeFX	))DU6W +	(&
		((a$h7
tww~~&r!   hidden_statesreturnc                 .   UR                   nU R                  R                  R                   nU R                  UR                  U5      5      nU R	                  U5      nU R
                  b  XPR
                  U R                  -  -  nUR                  U5      $ r)   r<   rZ   rB   r`   rY   r:   r=   rF   r   
orig_dtyper<   down_hidden_statesup_hidden_statess         r   ru   LoRALinearLayer.forward       "((
		  &&!YY}'7'7'>?77#56) 2 2TYY >>"":..r!   )rZ   rC   r:   rD   r=   rY   )rx   NNN)r   rz   r{   r|   __doc__intr   rX   r   r[   r;   strr<   r?   Tensorru   r}   r~   r   s   @r   r9   r9      s    0 )-59'+'' ' 	'
  ' u||S012' $' '4
/U\\ 
/ell 
/ 
/r!   r9   c                      ^  \ rS rSrSr     SS\S\S\S\\\\\4   4   S\\\\\4   4   S\\\\\4   \4   S	\	\
   4U 4S
 jjjrS\R                  S\R                  4S jrSrU =r$ )LoRAConv2dLayer   a  
A convolutional layer that is used with LoRA.

Parameters:
    in_features (`int`):
        Number of input features.
    out_features (`int`):
        Number of output features.
    rank (`int`, `optional`, defaults to 4):
        The rank of the LoRA layer.
    kernel_size (`int` or `tuple` of two `int`, `optional`, defaults to 1):
        The kernel size of the convolution.
    stride (`int` or `tuple` of two `int`, `optional`, defaults to 1):
        The stride of the convolution.
    padding (`int` or `tuple` of two `int` or `str`, `optional`, defaults to 0):
        The padding of the convolution.
    network_alpha (`float`, `optional`, defaults to `None`):
        The value of the network alpha used for stable learning and preventing underflow. This value has the same
        meaning as the `--network_alpha` option in the kohya-ss trainer script. See
        https://github.com/darkstorm2150/sd-scripts/blob/main/docs/train_network_README-en.md#execute-learning
rC   rD   r=   kernel_sizestridepaddingr:   c           	        > [         T	U ]  5         Sn[        SSU5        [        R                  " XXEUSS9U l        [        R                  " X2SSSS9U l        Xpl        X0l        [        R                  R                  U R
                  R                  SU-  S	9  [        R                  R                  U R                  R                  5        g )
NzmUse of `LoRAConv2dLayer` is deprecated. Please switch to PEFT backend by installing PEFT: `pip install peft`.r   r8   F)r   r   r   r   rw   rw   )r   r   r   rw   r   )r>   r?   r   r   Conv2drZ   rY   r:   r=   r   r   rB   r   )
rF   rC   rD   r=   r   r   r   r:   rG   r   s
            r   r?   LoRAConv2dLayer.__init__  s     	 N#W.ABIIk[ahotu	 ))DF6X]^ +	
		((a$h7
tww~~&r!   r   r   c                 .   UR                   nU R                  R                  R                   nU R                  UR                  U5      5      nU R	                  U5      nU R
                  b  XPR
                  U R                  -  -  nUR                  U5      $ r)   r   r   s         r   ru   LoRAConv2dLayer.forward  r   r!   )rZ   r:   r=   rY   )rx   r   r   r   N)r   rz   r{   r|   r   r   r   r   r   r   rX   r?   r[   r   ru   r}   r~   r   s   @r   r   r      s    4 39.445)-'' ' 	'
 3c3h/0' c5c?*+' sE#s(OS01'  ' '8
/U\\ 
/ell 
/ 
/r!   r   c                      ^  \ rS rSrSrSS.S\\   4U 4S jjjrS\\   4S jrSS\	S	\
4S
 jjrS rSS\R                  S\	S\R                  4S jjrSrU =r$ )LoRACompatibleConvi+  z3
A convolutional layer that can be used with LoRA.
N
lora_layerr   c                P   > Sn[        SSU5        [        TU ]  " U0 UD6  Xl        g )NzpUse of `LoRACompatibleConv` is deprecated. Please switch to PEFT backend by installing PEFT: `pip install peft`.r   r8   r   r>   r?   r   rF   r   rP   kwargsrG   r   s        r   r?   LoRACompatibleConv.__init__0  s1     Q&1DE$)&)$r!   c                 .    Sn[        SSU5        Xl        g NznUse of `set_lora_layer()` is deprecated. Please switch to PEFT backend by installing PEFT: `pip install peft`.set_lora_layerr8   r   r   rF   r   rG   s      r   r   !LoRACompatibleConv.set_lora_layer7  s     O"G-@A$r!   r'   re   c                 <   U R                   c  g U R                  R                  R                  U R                  R                  R                  pCU R                  R                  R                  5       nU R                   R                  R                  R                  R                  5       nU R                   R                  R                  R                  R                  5       nU R                   R                  b/  X`R                   R                  -  U R                   R                  -  n[        R                  " UR                  SS9UR                  SS95      nUR                  UR                  5      nXQU-  -   n	U(       aF  [        R                  " U	5      R!                  5       R#                  5       (       a  [%        SU  S35      eU	R'                  XCS9U R                  l        S U l         UR)                  5       U l        UR)                  5       U l        Xl        g )Nrw   	start_dimrT   rU   rV   )r   rB   rW   r<   r;   rX   rY   rZ   r:   r=   r[   mmflattenreshapeshaper]   r^   r_   r   r`   ra   rb   rc   _lora_scale)
rF   r'   re   r<   r;   rf   rb   rc   fusionrg   s
             r   rh   LoRACompatibleConv._fuse_lora=  s   ??"((..0@0@0G0Gv!!'')!!((--335%%,,11779??((4//777$//:N:NND$,,,3V^^a^5PQ/f!455;;|488:??AAOOSf U22  (??&?F  HHJ	jjl%r!   c                    [        U SS 5      b  [        U SS 5      c  g U R                  R                  nUR                  R                  UR                  R                  p2U R
                  R                  US9R                  5       U l        U R                  R                  U5      R                  5       U l        [        R                  " U R
                  R                  SS9U R                  R                  SS95      nUR                  UR                  5      nUR                  5       U R                  U-  -
  nUR                  X2S9U R                  l        S U l        S U l        g )Nrb   rc   rl   rw   r   rV   )rm   rB   rW   r<   r;   rb   r`   rX   rc   r[   r   r   r   r   r   )rF   rg   r<   r;   r   ro   s         r   rp   LoRACompatibleConv._unfuse_lora_  s   fd+7GD(TX<Y<e{{''$))//1B1B1I1IvIILLL/557	kknnV,224$))++a+8$++:M:MXY:M:Z[!3!35%++-1A1AF1JK),,F,H	r!   r   scaler   c           	      t   U R                   S:w  a,  [        R                  " XR                  U R                   S9nSnOU R                  n[        R
                  " XR                  U R                  U R                  X0R                  U R                  5      nU R                  c  U$ XBU R                  U5      -  -   $ )Nzeros)mode)r   r   )padding_modeFpad _reversed_padding_repeated_twicer   conv2drB   r   r   dilationgroupsr   )rF   r   r   r   original_outputss        r   ru   LoRACompatibleConv.forwardq  s    'EE-1V1V]a]n]noMGllG88;;		4;;X\XcXc
 ??"###t}/M'MNNr!   r   r   rc   rb   ry   rs   )r   rz   r{   r|   r   r   r   r?   r   rX   boolrh   rp   r[   r   ru   r}   r~   r   s   @r   r   r   +  s{     GK %(?*C % %%/)B % &U  &t  &D$OU\\ O% O%,, O Or!   r   c                      ^  \ rS rSrSrSS.S\\   4U 4S jjjrS\\   4S jrSS\	S	\
4S
 jjrS rSS\R                  S\	S\R                  4U 4S jjjrSrU =r$ )LoRACompatibleLineari  z,
A Linear layer that can be used with LoRA.
Nr   r   c                P   > Sn[        SSU5        [        TU ]  " U0 UD6  Xl        g )NzrUse of `LoRACompatibleLinear` is deprecated. Please switch to PEFT backend by installing PEFT: `pip install peft`.r   r8   r   r   s        r   r?   LoRACompatibleLinear.__init__  s1     S('3FG$)&)$r!   c                 .    Sn[        SSU5        Xl        g r   r   r   s      r   r   #LoRACompatibleLinear.set_lora_layer  s     O"G-@A$r!   r'   re   c           	         U R                   c  g U R                  R                  R                  U R                  R                  R                  pCU R                  R                  R                  5       nU R                   R                  R                  R                  R                  5       nU R                   R                  R                  R                  R                  5       nU R                   R                  b/  X`R                   R                  -  U R                   R                  -  nXQ[        R                  " US S S 24   US S S 24   5      S   -  -   nU(       aF  [        R                  " U5      R                  5       R                  5       (       a  [        SU  S35      eUR!                  XCS9U R                  l        S U l         UR#                  5       U l        UR#                  5       U l        Xl        g rS   )r   rB   rW   r<   r;   rX   rY   rZ   r:   r=   r[   r\   r]   r^   r_   r   r`   ra   rb   rc   r   rd   s	            r   rh   LoRACompatibleLinear._fuse_lora  s   ??"((..0@0@0G0Gv!!'')!!((--335%%,,11779??((4//777$//:N:NNDeiiT1WvdTUg.WXY.Z!Z[5;;|488:??AAOOSf U22  (??&?F  HHJ	jjl%r!   c           	         [        U SS 5      b  [        U SS 5      c  g U R                  R                  nUR                  UR                  p2U R
                  R                  US9R                  5       nU R                  R                  U5      R                  5       nUR                  5       U R                  [        R                  " US S S 24   US S S 24   5      S   -  -
  nUR                  X2S9U R                  l        S U l        S U l        g rk   )rm   rB   rW   r<   r;   rb   r`   rX   rc   r   r[   r\   rn   s          r   rp   !LoRACompatibleLinear._unfuse_lora  s    fd+7GD(TX<Y<e{{''$**L,?,?vyy||6|*002'--/%++-1A1AEIIdSWYZSZm]cdhjkdk]lDmnoDp1pq),,F,H	r!   r   r   r   c                    > U R                   c  [        TU ]	  U5      nU$ [        TU ]	  U5      X R                  U5      -  -   nU$ r)   )r   r>   ru   )rF   r   r   outr   s       r   ru   LoRACompatibleLinear.forward  sD    ??"'/-0CJ'/-0EOOM<Z4Z[CJr!   r   ry   r   )r   rz   r{   r|   r   r   r9   r?   r   rX   r   rh   rp   r[   r   ru   r}   r~   r   s   @r   r   r     sv     GK %(?*C % %%/)B %
&U &t &@ U\\ % %,,  r!   r   r   ) typingr   r   r   r[   torch.nn.functionalr   
functionalr   utilsr   r	   utils.import_utilsr
   transformersr   r   
get_loggerr   loggerModuler    r&   rX   r4   r+   r9   r   r   r   r   r    r!   r   <module>r      s   0 * )     & : G 
		H	%BII 299 3U 3YdEHHOO Ydx9/bii 9/x=/bii =/@TO TOnG299 Gr!   