o
    @Ti                     @   s   d dl Z d dlmZmZmZmZ d dlZd dlmZmZ d dlmZmZ d dlmZmZmZmZ d dl	m
Z
 ejjdd ZG dd dejZd	d
 ZdddZG dd dejZG dd dejZdd ZdS )    N)AnyListOptionalTuple)Tensornn)weight_normc                 C   sN   | j }| |d |d d} | |d  t||  d  } | |} | S )Nr      g&.>   )shapereshape
reciprocaltorchsinpow)xalphar    r   U/home/ubuntu/.local/lib/python3.10/site-packages/linacodec/vocoder/upsampler_block.pysnake   s
   $
r   c                       s$   e Zd Z fddZdd Z  ZS )Snake1dc                    s$   t    ttd|d| _d S )Nr	   )super__init__r   	Parameterr   onesr   )selfchannels	__class__r   r   r      s   
zSnake1d.__init__c                 C   s   t || jS N)r   r   )r   r   r   r   r   forward   s   zSnake1d.forward__name__
__module____qualname__r   r!   __classcell__r   r   r   r   r      s    r   c                 C   s   | t |  S r    )r   sigmoid)r   r   r   r   nonlinearity   s   r(       c                 C   s   t jj|| dddS )Ngư>T)
num_groupsnum_channelsepsaffine)r   r   	GroupNorm)in_channelsr*   r   r   r   	Normalize!   s   r0   c                       s0   e Zd Zdddd fdd
Zd	ddZ  ZS )
ResnetBlockNFi   )out_channelsconv_shortcuttemb_channelsc                   s   t    || _|d u r|n|}|| _|| _t|| _t|| _t	j
j||dddd| _|dkr8t	j
||| _t|| _t	j
|| _t	j
j||dddd| _t|| _| j| jkrz| jrlt	j
j||dddd| _d S t	j
j||dddd| _d S d S )N   r	   kernel_sizestridepaddingr   )r   r   r/   r2   use_conv_shortcutr   snake1r0   norm1r   r   Conv1dconv1Linear	temb_projnorm2Dropoutdropoutconv2snake2r3   nin_shortcut)r   r/   r2   r3   rC   r4   r   r   r   r   %   sR   




zResnetBlock.__init__c                 C   s   |}|  |}| |}| |}|d ur'|| t|d d d d d f  }| |}| |}| |}| |}| j	| j
krR| jrM| |}|| S | |}|| S r    )r<   r;   r>   r@   r(   rA   rE   rC   rD   r/   r2   r:   r3   rF   )r   r   tembhr   r   r   r!   L   s    


$





zResnetBlock.forwardr    r"   r   r   r   r   r1   $   s
    'r1   c                	       sR   e Zd ZdZddedee deee  f fddZdej	d	ej	fd
dZ
  ZS )UpSamplerBlockz@Transpose Conv plus Resnet Blocks to upsample feature embedding.Nr/   upsample_factorskernel_sizesc           	         s  t    || _t|pg | _t|pdgt| j | _t| jt| jks*J dt | _	t | _
tj| jdt| j  | jdd| _tt| j| jD ]6\}\}}| jd|  }| jd|d   }| j	ttj|||||| d d | j
t||dd	d
 qOt| j| _d S )N   z;kernel_sizes and upsample_factors must have the same lengthr   T)biasr	   r6   g        r   )r/   r2   rC   r4   )r   r   r/   listrJ   lenrK   r   
ModuleListupsample_layersresnet_blocksr?   out_proj	enumeratezipappendr   ConvTranspose1dr1   r   final_snake)	r   r/   rJ   rK   ikuc_inc_outr   r   r   r   c   s$   


$zUpSamplerBlock.__init__r   returnc                 C   sL   t | j| jD ]
\}}|||}q| |dd}|dd}| |S )Nr	   r   )rU   rQ   rR   rS   	transposerX   )r   r   uprsblkr   r   r   r!   z   s
   
zUpSamplerBlock.forwardr    )r#   r$   r%   __doc__intr   r   r   r   r   r!   r&   r   r   r   r   rI   a   s    (rI   c                 C   s   t | tjst | tjr$tj| j | jd ur"tj| jd d S d S t | tj	rDtjj
| jdd | jd urBtj| jd d S d S t | trStj| jd d S d S )Nr   g{Gz?)stdg      ?)
isinstancer   r=   rW   initxavier_uniform_weightrM   	constant_r?   trunc_normal_r   r   )mr   r   r   init_weights   s   


rl   )r)   )warningstypingr   r   r   r   r   r   r   torch.nn.utils.parametrizationsr   jitscriptr   Moduler   r(   r0   r1   rI   rl   r   r   r   r   <module>   s   

=#