o
    
j                     @   s   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 G dd dej	Z	G dd dej
ZG d	d
 d
ej
Ze jjdd ZG dd dej
ZG dd dej
ZdS )    N)nn)weight_norm)remove_parametrizationsc                       s   e Zd Z fddZ  ZS )Conv1dc                    s2   t  j|i | tj| j tj| j d S N)super__init__r   initorthogonal_weightzeros_bias)selfargskwargs	__class__ N/home/kuhnn/.local/lib/python3.10/site-packages/TTS/vocoder/layers/wavegrad.pyr   	   s   zConv1d.__init__)__name__
__module____qualname__r   __classcell__r   r   r   r   r      s    r   c                       s2   e Zd ZdZd	 fdd	Zdd Zdd Z  ZS )
PositionalEncodingz1Positional encoding with noise level conditioning'  c                    s.   t    || _|| _d| _tdd| _d S )Ni  r   )r   r   
n_channelsmax_lenCtorchzerospe)r   r   r   r   r   r   r      s
   
zPositionalEncoding.__init__c                 C   sn   |j d | jj d kr| |j d |j d | ||d  | jd d d |df |j d dd| j  S )N      ).NNr   )shaper    init_pe_matrixsizerepeatr   )r   xnoise_levelr   r   r   forward   s   >zPositionalEncoding.forwardc                 C   s   t ||}t jd|t jdd}t dt d|d | }t || |d d dd df< t || |d d dd df< |dd	|| _
d S )Nr   )dtyper"   r   r!   )r   r   arangefloat	unsqueezepowsincos	transposetor    )r   r   r   r'   r    positiondiv_termr   r   r   r$      s     z!PositionalEncoding.init_pe_matrix)r   )r   r   r   __doc__r   r)   r$   r   r   r   r   r   r      s
    r   c                       4   e Zd Z fddZdd Zdd Zdd Z  ZS )	FiLMc                    s   t    t|| _tj||ddd| _tj||d ddd| _tj	| jj
 tj	| jj
 tj| jj tj| jj d S )N   r"   )paddingr!   )r   r   r   encodingr   r   
input_convoutput_convr	   xavier_uniform_r   r   r   )r   
input_sizeoutput_sizer   r   r   r   )   s   

zFiLM.__init__c                 C   sD   |  |}t|d}| ||}tj| |ddd\}}||fS )N皙?r!   r"   )dim)r;   F
leaky_relur:   r   chunkr<   )r   r'   noise_scaleoshiftscaler   r   r   r)   4   s
   
zFiLM.forwardc                 C   s   t | jd t | jd d S )Nr   )r   r;   r<   r   r   r   r   remove_weight_norm;      zFiLM.remove_weight_normc                 C   s   t | j| _t | j| _d S r   )r   r;   r<   rI   r   r   r   apply_weight_norm?   rK   zFiLM.apply_weight_normr   r   r   r   r)   rJ   rL   r   r   r   r   r   r7   (   s
    r7   c                 C   s   |||   }|S r   r   )r'   rH   rG   rF   r   r   r   shif_and_scaleD   s   rN   c                       r6   )	UBlockc              
      s   t    t|ttfsJ t|dksJ || _t||d| _t	
t||d|d |d dt||d|d |d dg| _t	
t||d|d |d dt||d|d |d dg| _d S )N   r"   r8   r   dilationr9   r!   )r   r   
isinstancelisttuplelenfactorr   	res_blockr   
ModuleList
main_block	out_block)r   r>   hidden_sizerW   rR   r   r   r   r   K   s   

zUBlock.__init__c                 C   s   t j||jd | j d}| |}t |d}t j||jd | j d}| jd |}t|||}t |d}| jd |}|| }t|||}t |d}| jd |}t|||}t |d}| jd |}|| }|S )Nr%   r@   r   r"   )	rB   interpolater#   rW   rX   rC   rZ   rN   r[   )r   r'   rG   rH   x_interresrF   res2r   r   r   r)   _   s"   
zUBlock.forwardc                 C   sl   t | jd t| jD ]\}}t| dkrt |d qt| jD ]\}}t| dkr3t |d q"d S Nr   r   )r   rX   	enumeraterZ   rV   
state_dictr[   r   _layerr   r   r   rJ   r   s   

zUBlock.remove_weight_normc                 C   st   t | j| _t| jD ]\}}t| dkrt || j|< qt| jD ]\}}t| dkr7t || j|< q$d S Nr   )r   rX   rd   rZ   rV   re   r[   r   idxrh   r   r   r   rL   {   s   zUBlock.apply_weight_normrM   r   r   r   r   rO   J   s
    	rO   c                       r6   )	DBlockc                    s^   t    || _t||d| _tt||ddddt||ddddt||ddddg| _d S )Nr"   r8   rQ   r!   rP   )r   r   rW   r   rX   r   rY   rZ   )r   r>   r\   rW   r   r   r   r      s   

zDBlock.__init__c                 C   s^   |j d | j }| |}tj||d}tj||d}| jD ]}t|d}||}q|| S )Nr]   r^   r@   )r#   rW   rX   rB   r_   rZ   rC   )r   r'   r%   ra   rF   rh   r   r   r   r)      s   


zDBlock.forwardc                 C   s>   t | jd t| jD ]\}}t| dkrt |d qd S rc   )r   rX   rd   rZ   rV   re   rf   r   r   r   rJ      s   
zDBlock.remove_weight_normc                 C   sB   t | j| _t| jD ]\}}t| dkrt || j|< qd S ri   )r   rX   rd   rZ   rV   re   rj   r   r   r   rL      s   zDBlock.apply_weight_normrM   r   r   r   r   rl      s
    
rl   )r   torch.nn.functionalr   
functionalrB   torch.nn.utils.parametrizationsr   torch.nn.utils.parametrizer   r   Moduler   r7   jitscriptrN   rO   rl   r   r   r   r   <module>   s    
;