o
    Tӵi                     @   s   d dl Z d dlZd dlmZ d dlmZ ddl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dd Zdd Zejjdd ZG dd dejZdS )    N)weight_norm   )LocalMHAc                       s2   e Zd Zdg dddf fdd	Zdd Z  ZS )	Encoder@   )   r      r   F    c                    s   t    td|dddg}|D ]}|d9 }|r|d nd}|t|||dg7 }q|d ur6|t||dg7 }|r:|nd}|t||dd|dg7 }tj| | _d S )	Nr   r   r   kernel_sizepadding   )
output_dimstridegroupsdimwindow_sizer   r   r   )super__init__WNConv1dEncoderBlockr   nn
Sequentialblock)selfd_modelstrides	depthwiseattn_window_sizelayersr   r   	__class__ ?/home/ubuntu/.local/lib/python3.10/site-packages/snac/layers.pyr      s   
zEncoder.__init__c                 C   
   |  |S Nr   r   xr$   r$   r%   forward       
zEncoder.forward__name__
__module____qualname__r   r+   __classcell__r$   r$   r"   r%   r   
   s    r   c                       s.   e Zd Z				d fdd	Zdd Z  ZS )	DecoderFr	   r   c              
      s   t    |rt||dd|dt||ddg}n	t||dddg}|d ur.|t||dg7 }t|D ]$\}	}
|d|	  }|d|	d   }|rH|nd}|t|||
||d	 q2|t|t||dddt	 g7 }tj
| | _d S )
Nr   r   r   r   r   r
   r   r   )r   )r   r   r   r   	enumerateappendDecoderBlockSnake1dr   Tanhr   model)r   input_channelchannelsratesnoiser   r    d_outr!   ir   	input_dimr   r   r"   r$   r%   r   %   s&   

zDecoder.__init__c                 C   s   |  |}|S r'   )r9   r)   r$   r$   r%   r+   H   s   
zDecoder.forward)FFr	   r   r-   r$   r$   r"   r%   r2   $   s    #r2   c                       &   e Zd Zd fdd	Zdd Z  ZS )	ResidualUnit   r   r   c                    sR   t    |d | d }tt|t||||||dt|t||dd| _d S )Nr   r   )r   dilationr   r   r3   )r   r   r   r   r7   r   r   )r   r   rD   kernelr   padr"   r$   r%   r   N   s   

zResidualUnit.__init__c                 C   sD   |  |}|jd |jd  d }|dkr|d|| f }|| S )Nr   r   .)r   shape)r   r*   yrF   r$   r$   r%   r+   X   s
   
zResidualUnit.forward)rC   r   r   r   r-   r$   r$   r"   r%   rB   M   s    
rB   c                       rA   )	r   rC   Nr   c                    sl   t    |p
|d }tt|d|dt|d|dt|d|dt|t||d| |t|d d| _	d S )Nr   r   rD   r   r   	   )r   r   r   )
r   r   r   r   rB   r7   r   mathceilr   )r   r   r@   r   r   r"   r$   r%   r   a   s   

zEncoderBlock.__init__c                 C   r&   r'   r(   r)   r$   r$   r%   r+   r   r,   zEncoderBlock.forward)rC   Nr   r   r-   r$   r$   r"   r%   r   `   s    r   c                       $   e Zd Z fddZdd Z  ZS )
NoiseBlockc                    s    t    t||ddd| _d S )Nr   F)r   bias)r   r   r   linear)r   r   r"   r$   r%   r   w   s   
zNoiseBlock.__init__c                 C   sD   |j \}}}tj|d|f|j|jd}| |}|| }|| }|S )Nr   )devicedtype)rH   torchrandnrR   rS   rQ   )r   r*   BCTr=   hnr$   r$   r%   r+   {   s   
zNoiseBlock.forwardr-   r$   r$   r"   r%   rO   v       rO   c                       s&   e Zd Zd	 fdd	Zdd Z  ZS )
r6   rC      r   Fc              
      s   t    t|t||d| |t|d |d dg}|r%|t| |t	|d|dt	|d|dt	|d|dg t
j| | _d S )Nr   )r   r   r   output_paddingr   rJ   r   rK   )r   r   r7   WNConvTranspose1drL   rM   r5   rO   extendrB   r   r   r   )r   r@   r   r   r=   r   r!   r"   r$   r%   r      s(   
zDecoderBlock.__init__c                 C   r&   r'   r(   r)   r$   r$   r%   r+      r,   zDecoderBlock.forward)rC   r\   r   Fr   r-   r$   r$   r"   r%   r6      s    r6   c                  O      t tj| i |S r'   )r   r   Conv1dargskwargsr$   r$   r%   r         r   c                  O   r`   r'   )r   r   ConvTranspose1drb   r$   r$   r%   r^      re   r^   c                 C   sN   | j }| |d |d d} | |d  t||  d  } | |} | S )Nr   r   rG   g&.>r   )rH   reshape
reciprocalrT   sinpow)r*   alpharH   r$   r$   r%   snake   s
   $
rl   c                       rN   )r7   c                    s$   t    ttd|d| _d S )Nr   )r   r   r   	ParameterrT   onesrk   )r   r;   r"   r$   r%   r      s   
zSnake1d.__init__c                 C   s   t || jS r'   )rl   rk   r)   r$   r$   r%   r+      s   zSnake1d.forwardr-   r$   r$   r"   r%   r7      r[   r7   )rL   rT   torch.nnr   torch.nn.utils.parametrizationsr   	attentionr   Moduler   r2   rB   r   rO   r6   r   r^   jitscriptrl   r7   r$   r$   r$   r%   <module>   s     )
