o
    GivA                     @   s   d dl mZ d dlmZ ddlmZ ddlm	Z	 ddl
mZmZmZ eeZG dd dejZG d	d
 d
ejZG dd dejZG dd dejZG dd dejZdS )    N   )logging   )FlaxTransformer2DModel)FlaxDownsample2DFlaxResnetBlock2DFlaxUpsample2Dc                   @   s   e Zd ZU dZeed< eed< dZeed< dZeed< dZ	eed< d	Z
eed
< dZeed< dZeed< dZeed< dZeed< ejZejed< dZeed< dd ZdddZdS )FlaxCrossAttnDownBlock2Da&  
    Cross Attention 2D Downsizing block - original architecture from Unet transformers:
    https://huggingface.co/papers/2103.06104

    Parameters:
        in_channels (:obj:`int`):
            Input channels
        out_channels (:obj:`int`):
            Output channels
        dropout (:obj:`float`, *optional*, defaults to 0.0):
            Dropout rate
        num_layers (:obj:`int`, *optional*, defaults to 1):
            Number of attention blocks layers
        num_attention_heads (:obj:`int`, *optional*, defaults to 1):
            Number of attention heads of each spatial transformer block
        add_downsample (:obj:`bool`, *optional*, defaults to `True`):
            Whether to add downsampling layer before each final output
        use_memory_efficient_attention (`bool`, *optional*, defaults to `False`):
            enable memory efficient attention https://huggingface.co/papers/2112.05682
        split_head_dim (`bool`, *optional*, defaults to `False`):
            Whether to split the head dimension into a new axis for the self-attention computation. In most cases,
            enabling this flag should speed up the computation for Stable Diffusion 2.x and Stable Diffusion XL.
        dtype (:obj:`jnp.dtype`, *optional*, defaults to jnp.float32):
            Parameters `dtype`
    in_channelsout_channels        dropout   
num_layersnum_attention_headsTadd_downsampleFuse_linear_projectiononly_cross_attentionuse_memory_efficient_attentionsplit_head_dimdtypetransformer_layers_per_blockc                 C   s   t d g }g }t| jD ]:}|dkr| jn| j}t|| j| j| jd}|	| t
| j| j| j| j | j| j| j| j| j| jd	}|	| q|| _|| _| jr]t| j| jd| _d S d S )NFlax classes are deprecated and will be removed in Diffusers v1.0.0. We recommend migrating to PyTorch classes or pinning your version of Diffusers.r   r
   r   dropout_probr   	r
   n_headsd_headdepthr   r   r   r   r   r   )loggerwarningranger   r
   r   r   r   r   appendr   r   r   r   r   r   r   resnets
attentionsr   r   downsamplers_0)selfr$   r%   ir
   	res_block
attn_block r+   ^/home/ubuntu/.local/lib/python3.10/site-packages/diffusers/models/unets/unet_2d_blocks_flax.pysetupB   s>   

zFlaxCrossAttnDownBlock2D.setupc                 C   sd   d}t | j| jD ]\}}||||d}||||d}||f7 }q	| jr.| |}||f7 }||fS Nr+   deterministic)zipr$   r%   r   r&   )r'   hidden_statestembencoder_hidden_statesr0   output_statesresnetattnr+   r+   r,   __call__i   s   

z!FlaxCrossAttnDownBlock2D.__call__NT)__name__
__module____qualname____doc__int__annotations__r   floatr   r   r   boolr   r   r   r   jnpfloat32r   r   r-   r8   r+   r+   r+   r,   r	      s    
 'r	   c                   @   sh   e Zd ZU dZeed< eed< dZeed< dZeed< dZ	e
ed	< ejZejed
< dd ZdddZdS )FlaxDownBlock2Dab  
    Flax 2D downsizing block

    Parameters:
        in_channels (:obj:`int`):
            Input channels
        out_channels (:obj:`int`):
            Output channels
        dropout (:obj:`float`, *optional*, defaults to 0.0):
            Dropout rate
        num_layers (:obj:`int`, *optional*, defaults to 1):
            Number of attention blocks layers
        add_downsample (:obj:`bool`, *optional*, defaults to `True`):
            Whether to add downsampling layer before each final output
        dtype (:obj:`jnp.dtype`, *optional*, defaults to jnp.float32):
            Parameters `dtype`
    r
   r   r   r   r   r   Tr   r   c                 C   sx   t d g }t| jD ]}|dkr| jn| j}t|| j| j| jd}|	| q|| _
| jr:t| j| jd| _d S d S )Nr   r   r   r   )r    r!   r"   r   r
   r   r   r   r   r#   r$   r   r   r&   )r'   r$   r(   r
   r)   r+   r+   r,   r-      s"   zFlaxDownBlock2D.setupc                 C   sJ   d}| j D ]}||||d}||f7 }q| jr!| |}||f7 }||fS r.   )r$   r   r&   )r'   r2   r3   r0   r5   r6   r+   r+   r,   r8      s   


zFlaxDownBlock2D.__call__Nr9   )r:   r;   r<   r=   r>   r?   r   r@   r   r   rA   rB   rC   r   r-   r8   r+   r+   r+   r,   rD   x   s   
 rD   c                   @   s   e Zd ZU dZeed< eed< eed< dZeed< dZeed< dZ	eed	< d
Z
eed< dZeed< dZeed< dZeed< dZeed< ejZejed< dZeed< dd ZdddZdS )FlaxCrossAttnUpBlock2Da"  
    Cross Attention 2D Upsampling block - original architecture from Unet transformers:
    https://huggingface.co/papers/2103.06104

    Parameters:
        in_channels (:obj:`int`):
            Input channels
        out_channels (:obj:`int`):
            Output channels
        dropout (:obj:`float`, *optional*, defaults to 0.0):
            Dropout rate
        num_layers (:obj:`int`, *optional*, defaults to 1):
            Number of attention blocks layers
        num_attention_heads (:obj:`int`, *optional*, defaults to 1):
            Number of attention heads of each spatial transformer block
        add_upsample (:obj:`bool`, *optional*, defaults to `True`):
            Whether to add upsampling layer before each final output
        use_memory_efficient_attention (`bool`, *optional*, defaults to `False`):
            enable memory efficient attention https://huggingface.co/papers/2112.05682
        split_head_dim (`bool`, *optional*, defaults to `False`):
            Whether to split the head dimension into a new axis for the self-attention computation. In most cases,
            enabling this flag should speed up the computation for Stable Diffusion 2.x and Stable Diffusion XL.
        dtype (:obj:`jnp.dtype`, *optional*, defaults to jnp.float32):
            Parameters `dtype`
    r
   r   prev_output_channelr   r   r   r   r   Tadd_upsampleFr   r   r   r   r   r   c                 C   s   t d g }g }t| jD ]I}|| jd kr| jn| j}|dkr$| jn| j}t|| | j| j| j	d}|
| t| j| j| j| j | j| j| j| j| j| j	d	}|
| q|| _|| _| jrlt| j| j	d| _d S d S )Nr   r   r   r   r   r   )r    r!   r"   r   r
   r   rF   r   r   r   r#   r   r   r   r   r   r   r   r$   r%   rG   r   upsamplers_0)r'   r$   r%   r(   res_skip_channelsresnet_in_channelsr)   r*   r+   r+   r,   r-      s@   

zFlaxCrossAttnUpBlock2D.setupc           	      C   sn   t | j| jD ]%\}}|d }|d d }tj||fdd}||||d}||||d}q| jr5| |}|S N)axisr/   )r1   r$   r%   rB   concatenaterG   rH   )	r'   r2   res_hidden_states_tupler3   r4   r0   r6   r7   res_hidden_statesr+   r+   r,   r8     s   
zFlaxCrossAttnUpBlock2D.__call__Nr9   )r:   r;   r<   r=   r>   r?   r   r@   r   r   rG   rA   r   r   r   r   rB   rC   r   r   r-   r8   r+   r+   r+   r,   rE      s"   
 (rE   c                   @   sp   e Zd ZU dZeed< eed< eed< dZeed< dZeed< d	Z	e
ed
< ejZejed< dd ZdddZdS )FlaxUpBlock2Da  
    Flax 2D upsampling block

    Parameters:
        in_channels (:obj:`int`):
            Input channels
        out_channels (:obj:`int`):
            Output channels
        prev_output_channel (:obj:`int`):
            Output channels from the previous block
        dropout (:obj:`float`, *optional*, defaults to 0.0):
            Dropout rate
        num_layers (:obj:`int`, *optional*, defaults to 1):
            Number of attention blocks layers
        add_downsample (:obj:`bool`, *optional*, defaults to `True`):
            Whether to add downsampling layer before each final output
        dtype (:obj:`jnp.dtype`, *optional*, defaults to jnp.float32):
            Parameters `dtype`
    r
   r   rF   r   r   r   r   TrG   r   c                 C   s   t d g }t| jD ]+}|| jd kr| jn| j}|dkr"| jn| j}t|| | j| j| j	d}|
| q|| _| jrIt| j| j	d| _d S d S )Nr   r   r   r   r   )r    r!   r"   r   r
   r   rF   r   r   r   r#   r$   rG   r   rH   )r'   r$   r(   rI   rJ   r)   r+   r+   r,   r-   5  s$   zFlaxUpBlock2D.setupc                 C   sT   | j D ]}|d }|d d }tj||fdd}||||d}q| jr(| |}|S rK   )r$   rB   rN   rG   rH   )r'   r2   rO   r3   r0   r6   rP   r+   r+   r,   r8   N  s   

zFlaxUpBlock2D.__call__Nr9   )r:   r;   r<   r=   r>   r?   r   r@   r   rG   rA   rB   rC   r   r-   r8   r+   r+   r+   r,   rQ     s   
 rQ   c                   @   s   e Zd ZU dZeed< dZeed< dZeed< dZ	eed< dZ
eed	< dZeed
< dZeed< ejZejed< dZeed< dd ZdddZdS )FlaxUNetMidBlock2DCrossAttnaY  
    Cross Attention 2D Mid-level block - original architecture from Unet transformers:
    https://huggingface.co/papers/2103.06104

    Parameters:
        in_channels (:obj:`int`):
            Input channels
        dropout (:obj:`float`, *optional*, defaults to 0.0):
            Dropout rate
        num_layers (:obj:`int`, *optional*, defaults to 1):
            Number of attention blocks layers
        num_attention_heads (:obj:`int`, *optional*, defaults to 1):
            Number of attention heads of each spatial transformer block
        use_memory_efficient_attention (`bool`, *optional*, defaults to `False`):
            enable memory efficient attention https://huggingface.co/papers/2112.05682
        split_head_dim (`bool`, *optional*, defaults to `False`):
            Whether to split the head dimension into a new axis for the self-attention computation. In most cases,
            enabling this flag should speed up the computation for Stable Diffusion 2.x and Stable Diffusion XL.
        dtype (:obj:`jnp.dtype`, *optional*, defaults to jnp.float32):
            Parameters `dtype`
    r
   r   r   r   r   r   Fr   r   r   r   r   c                 C   s   t d t| j| j| j| jdg}g }t| jD ]/}t| j| j	| j| j	 | j
| j| j| j| jd}|| t| j| j| j| jd}|| q|| _|| _d S )Nr   r   )r
   r   r   r   r   r   r   r   )r    r!   r   r
   r   r   r"   r   r   r   r   r   r   r   r#   r$   r%   )r'   r$   r%   _r*   r)   r+   r+   r,   r-   ~  s@   	



z!FlaxUNetMidBlock2DCrossAttn.setupTc                 C   sP   | j d ||}t| j| j dd  D ]\}}||||d}||||d}q|S )Nr   r   r/   )r$   r1   r%   )r'   r2   r3   r4   r0   r7   r6   r+   r+   r,   r8     s
   z$FlaxUNetMidBlock2DCrossAttn.__call__Nr9   )r:   r;   r<   r=   r>   r?   r   r@   r   r   r   rA   r   r   rB   rC   r   r   r-   r8   r+   r+   r+   r,   rR   ]  s   
 *rR   )
flax.linenlinennn	jax.numpynumpyrB   utilsr   attention_flaxr   resnet_flaxr   r   r   
get_loggerr:   r    Moduler	   rD   rE   rQ   rR   r+   r+   r+   r,   <module>   s   
^?aE