o
    Gi<h                     @   st  d dl Z d dlZd dlm  mZ d dlmZ ddlmZ ddlm	Z	m
Z
mZm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G dd dejZg dg dg dd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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G d*d+ d+ejZeeB eB eB Z eeB eB Z!eeB Z"eeB eB eB Z#d,e$d-e%d.e%d/e%d0e%d1e&d2e fd3d4Z'd5e$d-e%d.e%d/e%d0e%d6e&d2e#fd7d8Z(d9e$d-e%d.e%d:e%d/e%d;e%d1e&d2e!fd<d=Z)d>e$d?e%d;e%d/e%d@e$dAe%d2e"dB fdBdCZ*dS )D    N)nn   )get_activation)Downsample1DResidualTemporalBlock1D
Upsample1Drearrange_dimsc                       s   e Zd Z										dded	edB d
edededededB dedB dededef fddZddej	dej	dB dej	fddZ
  ZS )DownResnetBlock1DN   F    default      ?Tin_channelsout_channels
num_layersconv_shortcuttemb_channelsgroups
groups_outnon_linearitytime_embedding_normoutput_scale_factoradd_downsamplec                    s   t    || _|d u r|n|}|| _|| _|	| _|| _|
| _|d u r%|}t|||dg}t	|D ]}|
t|||d q1t|| _|d u rLd | _nt|| _d | _|r`t|ddd| _d S d S )N	embed_dimTr
   )use_convpadding)super__init__r   r   use_conv_shortcutr   r   r   r   rangeappendr   
ModuleListresnetsnonlinearityr   
downsampler   )selfr   r   r   r   r   r   r   r   r   r   r   r#   _	__class__ Y/home/ubuntu/.local/lib/python3.10/site-packages/diffusers/models/unets/unet_1d_blocks.pyr      s*   

zDownResnetBlock1D.__init__hidden_statestembreturnc                 C   sl   d}| j d ||}| j dd  D ]}|||}q||f7 }| jd ur(| |}| jd ur2| |}||fS )Nr*   r   r
   )r#   r$   r%   )r&   r,   r-   output_statesresnetr*   r*   r+   forwardD   s   




zDownResnetBlock1D.forward)
Nr
   Fr   r   NNr   r   TN)__name__
__module____qualname__intboolstrfloatr   torchTensorr1   __classcell__r*   r*   r(   r+   r	      sF    	
*+r	   c                       s   e Zd Z									ddededB d	ed
edededB dedB dededef fddZ		ddej	de
ej	df dB dej	dB dej	fddZ  ZS )UpResnetBlock1DNr
   r   r   r   Tr   r   r   r   r   r   r   r   r   add_upsamplec                    s   t    || _|d u r|n|}|| _|| _|
| _|	| _|d u r"|}td| ||dg}t|D ]}|	t|||d q0t
|| _|d u rKd | _nt|| _d | _|
r^t|dd| _d S d S )Nr   r   T)use_conv_transpose)r   r   r   r   r   r>   r   r   r    r!   r   r"   r#   r$   r   upsampler   )r&   r   r   r   r   r   r   r   r   r   r>   r#   r'   r(   r*   r+   r   W   s(   

zUpResnetBlock1D.__init__r,   res_hidden_states_tuple.r-   r.   c                 C   s|   |d ur|d }t j||fdd}| jd ||}| jdd  D ]}|||}q | jd ur2| |}| jd ur<| |}|S )Nr
   dimr   )r:   catr#   r$   r@   r&   r,   rA   r-   res_hidden_statesr0   r*   r*   r+   r1      s   



zUpResnetBlock1D.forward)	Nr
   r   r   NNr   r   T)NN)r3   r4   r5   r6   r8   r9   r7   r   r:   r;   tupler1   r<   r*   r*   r(   r+   r=   V   sT    	
,r=   c                       sL   e Zd Zdededef fddZddejdejdB d	ejfd
dZ  ZS )ValueFunctionMidBlock1Dr   r   r   c                    sp   t    || _|| _|| _t||d |d| _t|d dd| _t|d |d |d| _	t|d dd| _
d S )Nr   r   Tr      )r   r   r   r   r   r   res1r   down1res2down2)r&   r   r   r   r(   r*   r+   r      s   
z ValueFunctionMidBlock1D.__init__Nxr-   r.   c                 C   s0   |  ||}| |}| ||}| |}|S r2   )rL   rM   rN   rO   )r&   rP   r-   r*   r*   r+   r1      s
   

zValueFunctionMidBlock1D.forwardr2   	r3   r4   r5   r6   r   r:   r;   r1   r<   r*   r*   r(   r+   rI      s    *rI   c                       sd   e Zd Z				ddededededed	ed
edB f fddZdejdejdejfddZ	  Z
S )MidResTemporalBlock1Dr
   FNr   r   r   r   r   r>   r   c           
         s   t    || _|| _|| _t|||dg}t|D ]}	|t|||d qt	|| _
|d u r5d | _nt|| _d | _|rFt|dd| _d | _|rRt|dd| _| jr\| jr^tdd S d S )Nr   TrJ   z$Block cannot downsample and upsample)r   r   r   r   r   r   r    r!   r   r"   r#   r$   r   r@   r   r%   r   
ValueError)
r&   r   r   r   r   r   r>   r   r#   r'   r(   r*   r+   r      s(   


zMidResTemporalBlock1D.__init__r,   r-   r.   c                 C   sR   | j d ||}| j dd  D ]}|||}q| jr| |}| jr'| |}|S )Nr   r
   )r#   r@   r%   r&   r,   r-   r0   r*   r*   r+   r1      s   

zMidResTemporalBlock1D.forward)r
   FFN)r3   r4   r5   r6   r7   r8   r   r:   r;   r1   r<   r*   r*   r(   r+   rR      s*    $'rR   c                       sP   e Zd Zdedededef fddZddejd	ejdB d
ejfddZ  Z	S )OutConv1DBlocknum_groups_outr   r   act_fnc                    sJ   t    tj||ddd| _t||| _t|| _t||d| _	d S )N   r   r   r
   )
r   r   r   Conv1dfinal_conv1d_1	GroupNormfinal_conv1d_gnr   final_conv1d_actfinal_conv1d_2)r&   rV   r   r   rW   r(   r*   r+   r      s
   

zOutConv1DBlock.__init__Nr,   r-   r.   c                 C   s<   |  |}t|}| |}t|}| |}| |}|S r2   )r[   r   r]   r^   r_   )r&   r,   r-   r*   r*   r+   r1      s   



zOutConv1DBlock.forwardr2   
r3   r4   r5   r6   r8   r   r:   r;   r1   r<   r*   r*   r(   r+   rU      s    *rU   c                       sH   e Zd Zddededef fddZdejdejd	ejfd
dZ  Z	S )OutValueFunctionBlockmishfc_dimr   rW   c                    s@   t    tt|| |d t|t|d dg| _d S )Nr   r
   )r   r   r   r"   Linearr   final_block)r&   rc   r   rW   r(   r*   r+   r      s   

zOutValueFunctionBlock.__init__r,   r-   r.   c                 C   s<   | |jd d}tj||fdd}| jD ]}||}q|S )Nr   rB   rC   )viewshaper:   rE   re   )r&   r,   r-   layerr*   r*   r+   r1      s
   

zOutValueFunctionBlock.forward)rb   r`   r*   r*   r(   r+   ra      s    $
ra   )      ?      ?rj   ri   )                  ?     ?rn   rm   rl   rk   )    8n?   Վ?   @Dh   $   <X?   ?rt   rs   rr   rq   rp   ro   )linearcubiclanczos3c                       s>   e Zd Zddedef fddZdejdejfd	d
Z  ZS )Downsample1dru   reflectkernelpad_modec                    sB   t    || _tt| }|jd d d | _| d| d S )Nr   r   r
   rz   	r   r   r{   r:   tensor_kernelsrg   padregister_bufferr&   rz   r{   	kernel_1dr(   r*   r+   r     s
   
zDownsample1d.__init__r,   r.   c                 C   s   t || jfd | j}||jd |jd | jjd g}tj|jd |jd}| j	|d d d f 
|jd d}||||f< t j||ddS )Nr   r
   r   devicerB   )stride)Fr   r{   	new_zerosrg   rz   r:   aranger   toexpandconv1d)r&   r,   weightindicesrz   r*   r*   r+   r1   "  s   $&zDownsample1d.forwardru   ry   	r3   r4   r5   r8   r   r:   r;   r1   r<   r*   r*   r(   r+   rx     s    rx   c                       sJ   e Zd Zddedef fddZddejd	ejdB d
ejfddZ  ZS )
Upsample1dru   ry   rz   r{   c                    sF   t    || _tt| d }|jd d d | _| d| d S )Nr   r   r
   rz   r|   r   r(   r*   r+   r   ,  s
   
zUpsample1d.__init__Nr,   r-   r.   c                 C   s   t || jd d fd | j}||jd |jd | jjd g}tj|jd |jd}| j	|d d d f 
|jd d}||||f< t j||d| jd d dS )Nr
   r   r   r   rB   )r   r   )r   r   r{   r   rg   rz   r:   r   r   r   r   conv_transpose1d)r&   r,   r-   r   r   rz   r*   r*   r+   r1   3  s    $&zUpsample1d.forwardr   r2   r   r*   r*   r(   r+   r   +  s    *r   c                       sX   e Zd Zddededef fddZdejd	ejfd
dZdejd	ejfddZ	  Z
S )SelfAttention1dr
           r   n_headdropout_ratec                    s   t    || _tjd|d| _|| _t| j| j| _t| j| j| _	t| j| j| _
tj| j| jdd| _tj|dd| _d S )Nr
   )num_channelsTbias)inplace)r   r   channelsr   r\   
group_norm	num_headsrd   querykeyvalue	proj_attnDropoutdropout)r&   r   r   r   r(   r*   r+   r   =  s   
zSelfAttention1d.__init__
projectionr.   c                 C   s4   |  d d | jdf }||dddd}|S )NrB   r   r   r
      )sizer   rf   permute)r&   r   new_projection_shapenew_projectionr*   r*   r+   transpose_for_scoresK  s   z$SelfAttention1d.transpose_for_scoresr,   c                 C   s  |}|j \}}}| |}|dd}| |}| |}| |}| |}	| |}
| |}dtt|
j d  }t	
|	| |
dd| }t	j|dd}t	
||}|dddd }| d d | jf }||}| |}|dd}| |}|| }|S )Nr
   r   rB   rC   r   r   )rg   r   	transposer   r   r   r   mathsqrtr:   matmulsoftmaxr   
contiguousr   r   rf   r   r   )r&   r,   residualbatchchannel_dimseq
query_projkey_proj
value_projquery_states
key_statesvalue_statesscaleattention_scoresattention_probsnew_hidden_states_shapeoutputr*   r*   r+   r1   Q  s,   









zSelfAttention1d.forward)r
   r   )r3   r4   r5   r6   r9   r   r:   r;   r   r1   r<   r*   r*   r(   r+   r   <  s    r   c                	       sF   e Zd Zddedededef fddZdejd	ejfd
dZ  Z	S )ResConvBlockFr   mid_channelsr   is_lastc                    s   t    || _||k| _| jrtj||ddd| _tj||ddd| _td|| _	t
 | _tj||ddd| _| jsKtd|| _t
 | _d S d S )Nr
   Fr   rX   r   rY   )r   r   r   has_conv_skipr   rZ   	conv_skipconv_1r\   group_norm_1GELUgelu_1conv_2group_norm_2gelu_2)r&   r   r   r   r   r(   r*   r+   r   w  s   


zResConvBlock.__init__r,   r.   c                 C   sb   | j r| |n|}| |}| |}| |}| |}| js+| |}| |}|| }|S r2   )	r   r   r   r   r   r   r   r   r   )r&   r,   r   r   r*   r*   r+   r1     s   





zResConvBlock.forward)F)
r3   r4   r5   r6   r7   r   r:   r;   r1   r<   r*   r*   r(   r+   r   v  s     r   c                       R   e Zd ZddedededB f fddZddejdejdB d	ejfd
dZ  ZS )UNetMidBlock1DNr   r   r   c              	      s   t    |d u r|n|}td| _t|||t|||t|||t|||t|||t|||g}t||d t||d t||d t||d t||d t||d g}tdd| _t	|| _
t	|| _d S )Nrv   r   rz   )r   r   rx   downr   r   r   upr   r"   
attentionsr#   )r&   r   r   r   r#   r   r(   r*   r+   r     s(   







	zUNetMidBlock1D.__init__r,   r-   r.   c                 C   s@   |  |}t| j| jD ]\}}||}||}q| |}|S r2   )r   zipr   r#   r   )r&   r,   r-   attnr0   r*   r*   r+   r1     s   


zUNetMidBlock1D.forwardr2   rQ   r*   r*   r(   r+   r     s     *r   c                       r   )AttnDownBlock1DNr   r   r   c                    s   t    |d u r|n|}td| _t|||t|||t|||g}t||d t||d t||d g}t|| _t|| _	d S )Nrv   r   )
r   r   rx   r   r   r   r   r"   r   r#   )r&   r   r   r   r#   r   r(   r*   r+   r     s   




zAttnDownBlock1D.__init__r,   r-   r.   c                 C   s<   |  |}t| j| jD ]\}}||}||}q||ffS r2   )r   r   r#   r   )r&   r,   r-   r0   r   r*   r*   r+   r1     s
   


zAttnDownBlock1D.forwardr2   rQ   r*   r*   r(   r+   r     s     *r   c                       r   )DownBlock1DNr   r   r   c                    sV   t    |d u r|n|}td| _t|||t|||t|||g}t|| _d S )Nrv   )r   r   rx   r   r   r   r"   r#   r&   r   r   r   r#   r(   r*   r+   r     s   




zDownBlock1D.__init__r,   r-   r.   c                 C   s(   |  |}| jD ]}||}q||ffS r2   )r   r#   rT   r*   r*   r+   r1     s   



zDownBlock1D.forwardr2   rQ   r*   r*   r(   r+   r     s     *r   c                       r   )DownBlock1DNoSkipNr   r   r   c                    sL   t    |d u r|n|}t|||t|||t|||g}t|| _d S r2   r   r   r   r   r"   r#   r   r(   r*   r+   r     s   



zDownBlock1DNoSkip.__init__r,   r-   r.   c                 C   s0   t j||gdd}| jD ]}||}q||ffS )Nr
   rC   r:   rE   r#   rT   r*   r*   r+   r1     s   


zDownBlock1DNoSkip.forwardr2   rQ   r*   r*   r(   r+   r     s     *r   c                	       b   e Zd ZddedededB f fddZ	ddejdeejd	f d
ejdB dejfddZ  Z	S )AttnUpBlock1DNr   r   r   c                    s   t    |d u r|n|}td| ||t|||t|||g}t||d t||d t||d g}t|| _t|| _tdd| _	d S )Nr   r   rv   r   )
r   r   r   r   r   r"   r   r#   r   r   )r&   r   r   r   r#   r   r(   r*   r+   r     s   


zAttnUpBlock1D.__init__r,   rA   .r-   r.   c                 C   sP   |d }t j||gdd}t| j| jD ]\}}||}||}q| |}|S NrB   r
   rC   )r:   rE   r   r#   r   r   )r&   r,   rA   r-   rG   r0   r   r*   r*   r+   r1     s   

zAttnUpBlock1D.forwardr2   
r3   r4   r5   r6   r   r:   r;   rH   r1   r<   r*   r*   r(   r+   r   
  s     r   c                	       r   )	UpBlock1DNr   r   r   c                    s\   t    |d u r|n|}td| ||t|||t|||g}t|| _tdd| _d S )Nr   rv   r   )r   r   r   r   r"   r#   r   r   r&   r   r   r   r#   r(   r*   r+   r   1  s   


zUpBlock1D.__init__r,   rA   .r-   r.   c                 C   s<   |d }t j||gdd}| jD ]}||}q| |}|S r   )r:   rE   r#   r   rF   r*   r*   r+   r1   >  s   


zUpBlock1D.forwardr2   r   r*   r*   r(   r+   r   0  s     r   c                	       r   )UpBlock1DNoSkipNr   r   r   c                    sT   t    |d u r|n|}td| ||t|||t|||ddg}t|| _d S )Nr   T)r   r   r   r(   r*   r+   r   P  s   

zUpBlock1DNoSkip.__init__r,   rA   .r-   r.   c                 C   s2   |d }t j||gdd}| jD ]}||}q|S r   r   rF   r*   r*   r+   r1   \  s
   

zUpBlock1DNoSkip.forwardr2   r   r*   r*   r(   r+   r   O  s     r   down_block_typer   r   r   r   r   r.   c                 C   sd   | dkrt |||||dS | dkrt||dS | dkr!t||dS | dkr+t||dS t|  d)Nr	   )r   r   r   r   r   r   )r   r   r   r    does not exist.)r	   r   r   r   rS   )r   r   r   r   r   r   r*   r*   r+   get_down_blockq  s   r   up_block_typer>   c                 C   sd   | dkrt |||||dS | dkrt||dS | dkr!t||dS | dkr+t||dS t|  d)Nr=   )r   r   r   r   r>   r   )r   r   r   r   r   )r=   r   r   r   rS   )r   r   r   r   r   r>   r*   r*   r+   get_up_block  s   r   mid_block_typer   r   c                 C   sT   | dkrt |||||dS | dkrt|||dS | dkr#t|||dS t|  d)NrR   )r   r   r   r   r   rI   )r   r   r   r   )r   r   r   r   )rR   rI   r   rS   )r   r   r   r   r   r   r   r*   r*   r+   get_mid_block  s   	r   out_block_typerV   rW   rc   c                 C   s.   | dkrt ||||S | dkrt|||S d S )NrU   ValueFunction)rU   ra   )r   rV   r   r   rW   rc   r*   r*   r+   get_out_block  s
   r   )+r   r:   torch.nn.functionalr   
functionalr   activationsr   r0   r   r   r   r   Moduler	   r=   rI   rR   rU   ra   r~   rx   r   r   r   r   r   r   r   r   r   r   DownBlockTypeMidBlockTypeOutBlockTypeUpBlockTyper8   r6   r7   r   r   r   r   r*   r*   r*   r+   <module>   s   >A5:"(&


