
    
3jII                        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\R0                  5      r " S S\R4                  5      rg)    N)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/wildlama/miniconda3/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#   5   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_encoderr1   C   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(   Q   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.lorar6   regular_linear_layerweightr8   r9   in_featuresout_featureslora_linear_layerr$   )
selfr>   r$   r7   r:   r9   deprecation_messager6   r8   r   s
            r   r<   PatchedLoraProjection.__init__R   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$ )NrG   )rB   r>   
state_dictr;   )rC   rH   rI   rJ   argsr   s        r   rL    PatchedLoraProjection.state_dictm   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.r8   r9   )rB   r>   r?   datar9   r8   floatupdownr7   r:   torchbmmisnananyitemr   tocpuw_upw_downr$   	rC   r$   safe_fusingr9   r8   w_origr_   r`   fused_weights	            r   
_fuse_lora PatchedLoraProjection._fuse_lorau   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 Nr_   r`   r8   r   rS   )getattrr>   r?   rT   r9   r8   r_   r]   rU   r`   r$   rX   rY   rC   rd   r9   r8   r_   r`   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$   rB   r>   )rC   inputs     r   forwardPatchedLoraProjection.forward   s[    ??"!DO!!),,U33((/4??TE[E[\aEb3bccr   )rB   r$   r>   r`   r_   )   N   Nrp   F)r   
__module____qualname____firstlineno__r<   rL   re   rm   rr   __static_attributes____classcell__r   s   @r   r(   r(   Q   s4    %6 -1u f f%@ d dr   r(   c                      ^  \ rS rSrSr    SS\S\S\S\S-  S\R                  \	-  S-  S	\R                  S-  4U 4S
 jjjrS\R                  S\R                  4S jrSrU =r$ )r6      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.
Nr@   rA   r:   r7   r8   r9   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`.r6   r5   F)biasr8   r9   rt   std)r;   r<   r   r   LinearrW   rV   r7   r:   rA   r@   initnormal_r?   zeros_)	rC   r@   rA   r:   r7   r8   r9   rD   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&   r9   rW   r?   r]   rV   r7   r:   rC   r   
orig_dtyper9   down_hidden_statesup_hidden_statess         r   rr   LoRALinearLayer.forward       "((
		  &&!YY}'7'7'>?77#56) 2 2TYY >>"":..r   )rW   r@   r7   rA   r:   rV   )ru   NNN)r   rw   rx   ry   __doc__intrU   rX   r8   strr9   r<   Tensorrr   rz   r{   r|   s   @r   r6   r6      s    0 &*,0$('' ' 	'
 t|' s"T)' {{T!' '4
/U\\ 
/ell 
/ 
/r   r6   c                      ^  \ rS rSrSr     SS\S\S\S\\\\4   -  S\\\\4   -  S	\\\\4   -  \-  S
\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
Nr@   rA   r:   kernel_sizestridepaddingr7   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   r5   F)r   r   r   r   rt   rt   )r   r   r   rt   r   )r;   r<   r   r   Conv2drW   rV   r7   r:   r   r   r?   r   )
rC   r@   rA   r:   r   r   r   r7   rD   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   rr   LoRAConv2dLayer.forward  r   r   )rW   r7   r:   rV   )ru   r   r   r   N)r   rw   rx   ry   r   r   tupler   rU   r<   rX   r   rr   rz   r{   r|   s   @r   r   r      s    4 -3(./0&*'' ' 	'
 5c?*' eCHo%' uS#X&,' t|' '8
/U\\ 
/ell 
/ 
/r   r   c                      ^  \ rS rSrSrSS.S\S-  4U 4S jjjrS\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   r5   r   r;   r<   r   rC   r   rM   kwargsrD   r   s        r   r<   LoRACompatibleConv.__init__.  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_layerr5   r   r   rC   r   rD   s      r   r   !LoRACompatibleConv.set_lora_layer5  s     O"G-@A$r   r$   rb   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 )Nrt   	start_dimrQ   rR   rS   )r   r?   rT   r9   r8   rU   rV   rW   r7   r:   rX   mmflattenreshapeshaperZ   r[   r\   r   r]   r^   r_   r`   _lora_scale)
rC   r$   rb   r9   r8   rc   r_   r`   fusionrd   s
             r   re   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 )Nr_   r`   ri   rt   r   rS   )rj   r?   rT   r9   r8   r_   r]   rU   r`   rX   r   r   r   r   r   )rC   rd   r9   r8   r   rl   s         r   rm   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   conv2dr?   r   r   dilationgroupsr   )rC   r   r   r   original_outputss        r   rr   LoRACompatibleConv.forwardo  s    'EE-1V1V]a]n]noMGllG88;;		4;;X\XcXc
 ??"###t}/M'MNNr   r   r   r`   r_   rv   rp   )r   rw   rx   ry   r   r   r<   r   rU   boolre   rm   rX   r   rr   rz   r{   r|   s   @r   r   r   )  s{     DH %/D*@ % %%4)? % &U  &t  &D$OU\\ O% O%,, O Or   r   c                      ^  \ rS rSrSrSS.S\S-  4U 4S jjjrS\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   r5   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$   rb   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 rP   )r   r?   rT   r9   r8   rU   rV   rW   r7   r:   rX   rY   rZ   r[   r\   r   r]   r^   r_   r`   r   ra   s	            r   re   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 rh   )rj   r?   rT   r9   r8   r_   r]   rU   r`   r   rX   rY   rk   s          r   rm   !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;   rr   )rC   r   r   outr   s       r   rr   LoRACompatibleLinear.forward  sD    ??"'/-0CJ'/-0EOOM<Z4Z[CJr   r   rv   r   )r   rw   rx   ry   r   r6   r<   r   rU   r   re   rm   rX   r   rr   rz   r{   r|   s   @r   r   r     sv     DH %/D*@ % %%4)? %
&U &t &@ U\\ % %,,  r   r   r   )rX   torch.nn.functionalr   
functionalr   utilsr   r   utils.import_utilsr   transformersr   r	   
get_loggerr   loggerModuler   r#   rU   r1   r(   r6   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   