
    
3jK                     .   S SK Jr  S SKJr  S SKrS SKJr  SSKJrJ	r	  SSK
Jr  SSKJrJrJr  SS	KJr  SS
KJrJr  SSKJrJrJr  SSKJr  SSKJr  SSKJrJr  \R@                  " \!5      r"\ " S S\5      5       r# " S S\\\\5      r$ " S S\5      r%g)    )	dataclass)AnyN   )ConfigMixinregister_to_config)PeftAdapterMixin)
BaseOutputapply_lora_scalelogging   )AttentionMixin)ControlNetConditioningEmbeddingzero_module)*CombinedTimestepGuidanceTextProjEmbeddings"CombinedTimestepTextProjEmbeddingsFluxPosEmbed)Transformer2DModelOutput)
ModelMixin)FluxSingleTransformerBlockFluxTransformerBlockc                   ^    \ rS rSr% \\R                     \S'   \\R                     \S'   Srg)FluxControlNetOutput'   controlnet_block_samplescontrolnet_single_block_samples N)	__name__
__module____qualname____firstlineno__tupletorchTensor__annotations____static_attributes__r       f/home/wildlama/miniconda3/lib/python3.13/site-packages/diffusers/models/controlnets/controlnet_flux.pyr   r   '   s     #ELL11%*5<<%88r&   r   c                     ^  \ rS rSrSr\SSSSSSS	S
S/ SQSS4S\S\S\S\S\S\S\S\S\S\\   S\S\4U 4S jjj5       r	\
     S+S\S\S\S\4S jj5       r\" S5                S,S\R                  S\R                  S\R                  S \S!\R                  S"\R                  S#\R                   S$\R                  S%\R                  S&\R                  S\\\4   S-  S'\S(\R(                  \-  4S) jj5       rS*rU =r$ )-FluxControlNetModel-   T   @      &         i   i   F)   8   r2   N
patch_sizein_channels
num_layersnum_single_layersattention_head_dimnum_attention_headsjoint_attention_dimpooled_projection_dimguidance_embedsaxes_dims_ropenum_modeconditioning_embedding_channelsc                 H  > [         TU ]  5         X l        Xe-  U l        [	        SU
S9U l        U	(       a  [        O[        nU" U R                  US9U l        [        R                  " XpR                  5      U l        [        R                  R                  X R                  5      U l        [        R                  " [        U5       Vs/ s H  n[!        U R                  UUS9PM     sn5      U l        [        R                  " [        U5       Vs/ s H  n[%        U R                  UUS9PM     sn5      U l        [        R                  " / 5      U l        [        [+        U R"                  5      5       HP  nU R(                  R-                  [/        [        R                  " U R                  U R                  5      5      5        MR     [        R                  " / 5      U l        [        [+        U R&                  5      5       HP  nU R0                  R-                  [/        [        R                  " U R                  U R                  5      5      5        MR     US LU l        U R2                  (       a%  [        R4                  " XR                  5      U l        Ub>  [9        USS9U l        [        R                  R                  X R                  5      U l        O>S U l        [/        [        R                  R                  X R                  5      5      U l        SU l        g s  snf s  snf )Ni'  )thetaaxes_dim)embedding_dimr:   )dimr8   r7   )r1   r1   r1   r1   )r>   block_out_channelsF) super__init__out_channels	inner_dimr   	pos_embedr   r   time_text_embednnLinearcontext_embedderr"   
x_embedder
ModuleListranger   transformer_blocksr   single_transformer_blockscontrolnet_blockslenappendr   controlnet_single_blocksunion	Embeddingcontrolnet_mode_embedderr   input_hint_blockcontrolnet_x_embeddergradient_checkpointing)selfr3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   text_time_guidance_clsi_	__class__s                   r'   rF   FluxControlNetModel.__init__0   sk     	',A%ENK:I6Oq 	  6..@U 
 !#		*=~~ N((//+~~F"$-- z* +A %(;'9
 +	#
 *, 01 2A +(;'9
 2	*
& "$r!2s42234A""))+biiPTP^P^6_*`a 5 )+b(9%s499:;A))00RYYt~~W[WeWe=f1gh < T)
::,.LL>>,RD)*6$C0Odt%D! */nn)UD&$(D!)4UXX__[R`R`5a)bD&&+#Ws   LLc                    [        UR                  5      nX'S'   X7S'   XGS'   XWS'   U R                  U5      nU(       GaJ  UR                  R	                  UR                  R                  5       5        UR                  R	                  UR                  R                  5       5        UR                  R	                  UR                  R                  5       5        UR                  R	                  UR                  R                  5       5        UR                  R	                  UR                  R                  5       SS9  UR                  R	                  UR                  R                  5       SS9  [        UR                  5      Ul        U$ )Nr5   r6   r7   r8   F)strict)dictconfigfrom_configrI   load_state_dict
state_dictrJ   rM   rN   rQ   rR   r   r[   )	clstransformerr5   r6   r7   r8   load_weights_from_transformerrf   
controlnets	            r'   from_transformer$FluxControlNetModel.from_transformer}   sF    k(())|&7"#'9#$(;$%__V,
(  001F1F1Q1Q1ST&&66{7R7R7]7]7_`''778T8T8_8_8ab!!11+2H2H2S2S2UV))99+:X:X:c:c:ens9t00@@55@@B5 A  0;:;[;[/\J,r&   joint_attention_kwargshidden_statescontrolnet_condcontrolnet_modeconditioning_scaleencoder_hidden_statespooled_projectionstimestepimg_idstxt_idsguidancereturn_dictreturnc                    U R                  U5      nU R                  b  U R                  U5      nUR                  u  pnnXR                  R                  -  nUU R                  R                  -  nUR                  XUU R                  R                  UU R                  R                  5      nUR                  SSSSSS5      nUR                  UUU-  S5      nXR                  U5      -   nUR                  UR                  5      S	-  nU
b  U
R                  UR                  5      S	-  n
OSn
U
c  U R                  Xv5      OU R                  XzU5      nU R                  U5      nU	R                  S:X  a  [        R                  S
5        U	S   n	UR                  S:X  a  [        R                  S5        US   nU R                  (       aP  Uc  [!        S5      eU R#                  U5      n[$        R&                  " UU/SS9n[$        R&                  " U	SS U	/SS9n	[$        R&                  " X4SS9nU R)                  U5      nSn[+        U R,                  5       HZ  u  nn[$        R.                  " 5       (       a)  U R0                  (       a  U R3                  UUUUU5      u  pQOU" UUUUS9u  pQUU4-   nM\     Sn[+        U R4                  5       HZ  u  nn[$        R.                  " 5       (       a)  U R0                  (       a  U R3                  UUUUU5      u  pQOU" UUUUS9u  pQUU4-   nM\     Sn[7        UU R8                  5       H  u  nnU" U5      nUU4-   nM     Sn[7        UU R:                  5       H  u  nnU" U5      nUU4-   nM     U V s/ s H  n U U-  PM
     nn U V s/ s H  n U U-  PM
     nn [=        U5      S:X  a  SOUn[=        U5      S:X  a  SOUnU(       d  UU4$ [?        UUS9$ s  sn f s  sn f )a  
The [`FluxTransformer2DModel`] forward method.

Args:
    hidden_states (`torch.FloatTensor` of shape `(batch size, channel, height, width)`):
        Input `hidden_states`.
    controlnet_cond (`torch.Tensor`):
        The conditional input tensor of shape `(batch_size, sequence_length, hidden_size)`.
    controlnet_mode (`torch.Tensor`):
        The mode tensor of shape `(batch_size, 1)`.
    conditioning_scale (`float`, defaults to `1.0`):
        The scale factor for ControlNet outputs.
    encoder_hidden_states (`torch.FloatTensor` of shape `(batch size, sequence_len, embed_dims)`):
        Conditional embeddings (embeddings computed from the input conditions such as prompts) to use.
    pooled_projections (`torch.FloatTensor` of shape `(batch_size, projection_dim)`): Embeddings projected
        from the embeddings of input conditions.
    timestep ( `torch.LongTensor`):
        Used to indicate denoising step.
    block_controlnet_hidden_states: (`list` of `torch.Tensor`):
        A list of tensors that if specified are added to the residuals of transformer blocks.
    joint_attention_kwargs (`dict`, *optional*):
        A kwargs dictionary that if specified is passed along to the `AttentionProcessor` as defined under
        `self.processor` in
        [diffusers.models.attention_processor](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/attention_processor.py).
    return_dict (`bool`, *optional*, defaults to `True`):
        Whether or not to return a [`~models.transformer_2d.Transformer2DModelOutput`] instead of a plain
        tuple.

Returns:
    If `return_dict` is True, an [`~models.transformer_2d.Transformer2DModelOutput`] is returned, otherwise a
    `tuple` where the first element is the sample tensor.
Nr   r      r+   r      i  zrPassing `txt_ids` 3d torch.Tensor is deprecated.Please remove the batch dimension and pass it as a 2d torch TensorzrPassing `img_ids` 3d torch.Tensor is deprecated.Please remove the batch dimension and pass it as a 2d torch TensorzA`controlnet_mode` cannot be `None` when applying ControlNet-Union)rC   r   )rq   ru   tembimage_rotary_emb)r   r   ) rN   rZ   shaperf   r3   reshapepermuter[   todtyperJ   rM   ndimloggerwarningrW   
ValueErrorrY   r"   catrI   	enumeraterQ   is_grad_enabledr\   _gradient_checkpointing_funcrR   ziprS   rV   rT   r   )!r]   rq   rr   rs   rt   ru   rv   rw   rx   ry   rz   rp   r{   
batch_sizechannels	height_pwwidth_pwheightwidthr   controlnet_mode_embidsr   block_samplesindex_blockblocksingle_block_samplesr   block_samplecontrolnet_blockr   single_block_samplesamples!                                    r'   forwardFluxControlNetModel.forward   sZ   ` 6  ,"33ODO8G8M8M5J)X++"8"88F 6 66E-55fdkk.D.DeT[[McMcO .55aAq!QGO-55j&5.RTUO%(B(B?(SS;;}223d:{{=#6#67$>HH    >%%h:LM 	
 !% 5 56K L<<1NNU ajG<<1NNU ajG::& !dee"&"?"?"P$)II/BDY.Z`a$b!ii!g 6A>Gii*2>>#."+D,C,C"DK$$&&4+F+F7;7X7X!)$84%} 8="/*?%5	84% *],<<M# #E&  ""+D,J,J"KK$$&&4+F+F7;7X7X!)$84%} 8="/*?%5	84% $8=:J#J # #L( $& .1-AWAW.X*L*+L9L'?</'Q$ /Y +-'589MtOlOl5m1!1"23F"G.MQdPf.f+ 6n
 Og#gNfFF-?$?Nf #gUt*uUt664F+FUt'*u+./G+HA+M4Sk 78A=DCb 	( ,.MNN#%=,K
 	
 $h*us   O1%O6)rM   rS   rY   rV   r[   r\   rH   rZ   rG   rI   rR   rJ   rQ   rW   rN   )r~   
   r/   r0   T)
Ng      ?NNNNNNNT)r   r   r   r     _supports_gradient_checkpointingr   intboollistrF   classmethodrn   r
   r"   r#   float
LongTensorre   strr   FloatTensorr   r   r%   __classcell__ra   s   @r'   r)   r)   -   s   '+$ !#"%#%#'%( %$0/3J,J, J, 	J,
 J,  J, !J, !J,  #J, J, S	J, J, *-J, J,X  !#"%#%&*  	
   ! > ./
 )-$'.2+/%) $ $!%8< e
||e
 e
 	e

 "e
  %||e
 "LLe
 ""e
 e
 e
 ,,e
 !%S#X 5e
 e
 
		5	5e
 0e
r&   r)   c                   Z  ^  \ rS rSrSrU 4S jr        SS\R                  S\\R                     S\\R                     S\\
   S	\R                  S
\R                  S\R                  S\R                  S\R                  S\R                  S\\\4   S-  S\S\\-  4S jjrSrU =r$ )FluxMultiControlNetModeliF  a  
`FluxMultiControlNetModel` wrapper class for Multi-FluxControlNetModel

This module is a wrapper for multiple instances of the `FluxControlNetModel`. The `forward()` API is designed to be
compatible with `FluxControlNetModel`.

Args:
    controlnets (`list[FluxControlNetModel]`):
        Provides additional conditioning to the unet during the denoising process. You must set multiple
        `FluxControlNetModel` as a list.
c                 X   > [         TU ]  5         [        R                  " U5      U l        g )N)rE   rF   rK   rO   nets)r]   controlnetsra   s     r'   rF   !FluxMultiControlNetModel.__init__S  s    MM+.	r&   Nrq   rr   rs   rt   ru   rv   rw   rx   ry   rz   rp   r{   r|   c                 0   [        U R                  5      S:X  a  U R                  S   n[        [        X#U5      5       H  u  nu  nnnU" UUUS S 2S 4   UUU
UUU	UUUS9u  nnUS:X  a  UnUnM1  Ub'  Wb$  [        UU5       VVs/ s H  u  nnUU-   PM     nnnUc  M`  Wc  Me  [        UU5       VVs/ s H  u  nnUU-   PM     nnnM     WW4$ [        [        X#X@R                  5      5       H  u  nu  nnnnU" UUUS S 2S 4   UUU
UUU	UUUS9u  nnUS:X  a  UnUnM2  Ub'  Wb$  [        UU5       VVs/ s H  u  nnUU-   PM     nnnUc  Ma  Wc  Mf  [        UU5       VVs/ s H  u  nnUU-   PM     nnnM     WW4$ s  snnf s  snnf s  snnf s  snnf )Nr+   r   )rq   rr   rs   rt   rw   rz   rv   ru   ry   rx   rp   r{   )rT   r   r   r   )r]   rq   rr   rs   rt   ru   rv   rw   rx   ry   rz   rp   r{   rm   r_   imagemodescaler   r   control_block_samplescontrol_single_block_samplescontrol_block_sampler   control_single_block_samples                            r'   r    FluxMultiControlNetModel.forwardW  sz   " tyy>Q1J+4S[m5n+o''E46@"/$)$(DM',%%'9*?##+A +733  6,9)3G0$05J5V GJJ_anFo1Fo B 4l 1<?Fo . 1 ,7<X<d NQ <>RN8N I ;\ 8,FN 5 847 ,pR %&BBBI 8AO6H))T833E4
 7A"/$)$(DM',%%'9*?##+A +733  6,9)3G0$05J5V GJJ_anFo1Fo B 4l 1<?Fo . 1 ,7<X<d NQ <>RN8N I ;\ 8,FN 5 84;8H %&BBBg1
8D1
8s   F 2F5F#F)r   )NNNNNNNT)r   r   r   r    __doc__rF   r"   r   r   tensorr   r#   r   re   r   r   r   r   r!   r   r%   r   r   s   @r'   r   r   F  s   
/ /3+/%) $ $!%8< ]C((]C ell+]C ell+	]C
 !K]C  %||]C "LL]C ""]C ]C ]C ,,]C !%S#X 5]C ]C 
	%]C ]Cr&   r   )&dataclassesr   typingr   r"   torch.nnrK   configuration_utilsr   r   loadersr   utilsr	   r
   r   	attentionr   controlnets.controlnetr   r   
embeddingsr   r   r   modeling_outputsr   modeling_utilsr   transformers.transformer_fluxr   r   
get_loggerr   r   r   r)   r   r   r&   r'   <module>r      s    "    B ' 
 ' Q u u 7 ' \ 
		H	% 9: 9 9
V
*nkCS V
rnCz nCr&   