o
    GiK                     @   s   d dl mZ d dlmZ d dlZd dlmZ ddlmZm	Z	 ddl
mZ ddlmZmZmZ dd	lmZ dd
lmZmZ ddlmZmZmZ ddlmZ ddlmZ ddlmZmZ e e!Z"eG dd deZ#G dd deeeeZ$G dd deZ%dS )    )	dataclass)AnyN   )ConfigMixinregister_to_config)PeftAdapterMixin)
BaseOutputapply_lora_scalelogging   )AttentionMixin)ControlNetConditioningEmbeddingzero_module)*CombinedTimestepGuidanceTextProjEmbeddings"CombinedTimestepTextProjEmbeddingsFluxPosEmbed)Transformer2DModelOutput)
ModelMixin)FluxSingleTransformerBlockFluxTransformerBlockc                   @   s*   e Zd ZU eej ed< eej ed< dS )FluxControlNetOutputcontrolnet_block_samplescontrolnet_single_block_samplesN)__name__
__module____qualname__tupletorchTensor__annotations__ r    r    `/home/ubuntu/.local/lib/python3.10/site-packages/diffusers/models/controlnets/controlnet_flux.pyr   '   s   
 r   c                       s"  e Zd ZdZedddddddd	d
g dddfdedededededededededee dedef fddZe						d/dedededefddZ
ed		 								d0d!ejd"ejd#ejd$ed%ejd&ejd'ejd(ejd)ejd*ejdeeef dB d+ed,ejeB fd-d.Z  ZS )1FluxControlNetModelT   @      &         i   i   F)   8   r*   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                    s  t    |_  _td|
d_|	rtnt}|j|d_t	
|j_tj	
|j_t	 fddt|D _t	 fddt|D _t	g _ttjD ]}jtt	
jj qbt	g _ttjD ]}jtt	
jj q|d u_jrt	|j_|d urt|dd_tj	
|j_nd _ttj	
|j_d	_d S )
Ni'  )thetaaxes_dim)embedding_dimr2   c                       g | ]
}t j d qS )dimr0   r/   )r   	inner_dim.0ir/   r0   selfr    r!   
<listcomp>P       z0FluxControlNetModel.__init__.<locals>.<listcomp>c                    r:   r;   )r   r=   r>   rA   r    r!   rC   [   rD   )r)   r)   r)   r)   )r6   block_out_channelsF)super__init__out_channelsr=   r   	pos_embedr   r   time_text_embednnLinearcontext_embedderr   
x_embedder
ModuleListrangetransformer_blockssingle_transformer_blockscontrolnet_blockslenappendr   controlnet_single_blocksunion	Embeddingcontrolnet_mode_embedderr   input_hint_blockcontrolnet_x_embeddergradient_checkpointing)rB   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   text_time_guidance_cls_	__class__rA   r!   rG   0   sL   




zFluxControlNetModel.__init__   
   c           	      C   s   t |j}||d< ||d< ||d< ||d< | |}|r\|j|j  |j|j  |j|j  |j|j  |j	j|j	 dd |j
j|j
 dd t|j|_|S )Nr-   r.   r/   r0   F)strict)dictconfigfrom_configrI   load_state_dict
state_dictrJ   rM   rN   rQ   rR   r   r[   )	clstransformerr-   r.   r/   r0   load_weights_from_transformerre   
controlnetr    r    r!   from_transformer}   s"   



z$FluxControlNetModel.from_transformer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                     s  |  |}| jdurC| |}|j\}}}}|| jj }|| jj }||||| jj|| jj}|dddddd}|||| d}|| | }||j	d	 }|
dur_|
|j	d	 }
nd}
|
du rk| 
||n| 
||
|}| |}|	jdkrtd
 |	d }	|jdkrtd |d }| jr|du rtd| |}tj||gdd}tj|	dd |	gdd}	tj|	|fdd}| |}d}t| jD ]&\}}t r| jr| |||||\}}n
|||||d\}}||f }qd}t| jD ](\}}t r| jr| |||||\}}n
|||||d\}}||f }qd}t|| jD ]\}}||}||f }q-d}t|| jD ]\}}||}||f }qD fdd|D } fdd|D }t|dkrndn|}t|dkrydn|}|s||fS t||dS )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   ra   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)r<   r    )rp   rt   tembimage_rotary_embc                       g | ]}|  qS r    r    r?   samplers   r    r!   rC   5      z/FluxControlNetModel.forward.<locals>.<listcomp>c                    r   r    r    r   r   r    r!   rC   6  r   )r   r   ) rN   rZ   shapere   r+   reshapepermuter[   todtyperJ   rM   ndimloggerwarningrW   
ValueErrorrY   r   catrI   	enumeraterQ   is_grad_enabledr\   _gradient_checkpointing_funcrR   ziprS   rV   rT   r   ) rB   rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   rn   rz   
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_sampler    r   r!   forward   s   
0







	

	
zFluxControlNetModel.forward)ra   rb   r'   r(   T)
Nro   NNNNNNNT)r   r   r    _supports_gradient_checkpointingr   intboollistrG   classmethodrm   r	   r   r   float
LongTensorrd   strr   FloatTensorr   r   __classcell__r    r    r_   r!   r"   -   s    	
L	
r"   c                       s   e Zd ZdZ fddZ								ddejdeej deej d	ee	 d
ej
dej
dejdej
dej
dej
deeef dB dedeeB fddZ  ZS )FluxMultiControlNetModela  
    `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                    s   t    t|| _d S )N)rF   rG   rK   rO   nets)rB   controlnetsr_   r    r!   rG   S  s   
z!FluxMultiControlNetModel.__init__NTrp   rq   rr   rs   rt   ru   rv   rw   rx   ry   rn   rz   r{   c                 C   s  t | jdkre| jd }tt|||D ]L\}\}}}||||d d d f |||
|||	|||d\}}|dkr<|}|}q|d urN|d urNdd t||D }|d ur`|d ur`dd t||D }q||fS tt|||| jD ]M\}\}}}}||||d d d f |||
|||	|||d\}}|dkr|}|}qo|d ur|d urdd t||D }|d ur|d urdd t||D }qo||fS )	Nr#   r   )rp   rq   rr   rs   rv   ry   ru   rt   rx   rw   rn   rz   c                 S      g | ]\}}|| qS r    r    r?   control_block_sampler   r    r    r!   rC         z4FluxMultiControlNetModel.forward.<locals>.<listcomp>c                 S   r   r    r    r?   control_single_block_sampler   r    r    r!   rC     r   c                 S   r   r    r    r   r    r    r!   rC     r   c                 S   r   r    r    r   r    r    r!   rC     r   )rT   r   r   r   )rB   rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   rn   rz   rl   r@   imagemodescaler   r   control_block_samplescontrol_single_block_samplesr    r    r!   r   W  s   

.
z FluxMultiControlNetModel.forward)NNNNNNNT)r   r   r   __doc__rG   r   r   r   tensorr   r   r   rd   r   r   r   r   r   r   r   r    r    r_   r!   r   F  sL    
	
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    r!   <module>   s(   
  