o
    }oi3                     @   s"  d dl Z d dlmZ d dl mZ d dlm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 G dd	 d	ejjZG d
d dejjZG dd dejjZG dd dejjZG dd dejjZG dd dejjZG dd dejjZG dd dejjZG dd dejjZdS )    N)partial)log2)List)	rearrange)filter2d)mask_sequence_tensorc                       s$   e Zd Z fddZdd Z  ZS )Blurc                    s(   t    tg d}| d| d S )N)      r	   f)super__init__torchTensorregister_buffer)selfr   	__class__ e/home/ubuntu/.local/lib/python3.10/site-packages/nemo/collections/tts/modules/spectrogram_enhancer.pyr   5   s   
zBlur.__init__c                 C   s8   | j }|d d d d f |d d d d f  }t||ddS )NT)
normalized)r   r   )r   xr   r   r   r   forward:   s   $zBlur.forward__name__
__module____qualname__r   r   __classcell__r   r   r   r   r   4   s    r   c                       s&   e Zd Zd fdd	Zdd Z  ZS )EqualLinearr	   Tc                    sB   t    tjt||| _|rtjt|| _|| _	d S N)
r   r   r   nn	Parameterrandnweightzerosbiaslr_mul)r   in_dimout_dimr&   r%   r   r   r   r   A   s
   

zEqualLinear.__init__c                 C   s    t j|| j| j | j| j dS )N)r%   )Flinearr#   r&   r%   )r   inputr   r   r   r   I       zEqualLinear.forward)r	   Tr   r   r   r   r   r   @   s    r   c                       &   e Zd Zd fdd	Zdd Z  ZS )StyleMapping皙?c                    sP   t    g }t|D ]}|t|||tjjdddg qtjj| | _	d S )N皙?Tinplace)
r   r   rangeextendr   r   r    	LeakyReLU
Sequentialnet)r   embdepthr&   layers_r   r   r   r   N   s
   
$zStyleMapping.__init__c                 C   s   t j|dd}| |S )Nr	   )dim)r)   	normalizer7   )r   r   r   r   r   r   W   s   
zStyleMapping.forward)r/   r   r   r   r   r   r.   M   s    	r.   c                       r-   )RGBBlock   c                    sh   t    || _tj||| _|}t||ddd| _|r/tj	tjj
ddddt | _d S d | _d S )Nr	   F)demodr
   bilinearscale_factormodealign_corners)r   r   input_channelr   r    Linearto_styleConv2DModulatedconvr6   Upsampler   upsample)r   
latent_dimrF   rL   channelsout_filtersr   r   r   r   ]   s   
zRGBBlock.__init__c                 C   s>   |  |}| ||}|d ur|| }| jd ur| |}|S r   )rH   rJ   rL   )r   r   prev_rgbistylestyler   r   r   r   n   s   


zRGBBlock.forward)r?   r   r   r   r   r   r>   \       r>   c                       s:   e Zd ZdZ				d fdd	Zdd Zd	d
 Z  ZS )rI   z
    Modulated convolution.
    For details refer to [1]
    [1] Karras et. al. - Analyzing and Improving the Image Quality of StyleGAN (https://arxiv.org/abs/1912.04958)
    Tr	   :0yE>c           	         sf   t    || _|| _|| _|| _|| _tj	t
||||f| _|| _tjjj| jdddd d S )Nr   fan_in
leaky_reluarD   nonlinearity)r   r   filtersr@   kernelstridedilationr   r    r!   r"   r#   epsinitkaiming_normal_)	r   in_chanout_chanr[   r@   r\   r]   r^   kwargsr   r   r   r      s   
zConv2DModulated.__init__c                 C   s    |d |d  ||d   d S Nr	   r
   r   )r   sizer[   r]   r\   r   r   r   _get_same_padding   r,   z!Conv2DModulated._get_same_paddingc                 C   s   |j \}}}}|d d d d d d d f }| jd d d d d d d d d f }||d  }	| jrBt|	d jddd| j }
|	|
 }	|dd||}|	j ^}}}|	j|| j g|R  }	| 	|| j
| j| j}tj||	||d}|d| j||}|S )Nr	   r
   )r
   r?      T)r<   keepdim)paddinggroups)shaper#   r@   r   rsqrtsumr^   reshaperZ   rf   r[   r]   r\   r)   conv2d)r   r   ybchww1w2weightsdr;   wsrj   r   r   r   r      s   $zConv2DModulated.forward)Tr	   r	   rT   )r   r   r   __doc__r   rf   r   r   r   r   r   r   rI   {   s    rI   c                       s,   e Zd Z			d fdd	Zdd Z  ZS )GeneratorBlockTr	   c                    s   t    |rtjjddddnd | _tj||| _tjd|| _t	||d| _
tj||| _tjd|| _t	||d| _tjjddd	| _t||||| _d S )
Nr
   rA   FrB   r	   r?   r0   Tr1   )r   r   r   r    rK   rL   rG   	to_style1	to_noise1rI   conv1	to_style2	to_noise2conv2r5   
activationr>   to_rgb)r   rM   input_channelsrZ   rL   upsample_rgbrN   r   r   r   r      s   
	zGeneratorBlock.__init__c           
      C   s   | j d ur
|  |}|d d d |jd d |jd d d f }| |d}| |d}| |}| ||}| || }| |}| 	||}| || }| 
|||}	||	fS )Nr
   r?   )r   r?   r	   r
   )rL   rl   r~   permuter   r}   r   r   r   r   r   )
r   r   rP   rQ   inoisenoise1noise2style1style2rgbr   r   r   r      s   

,

zGeneratorBlock.forward)TTr	   r   r   r   r   r   r|      s    r|   c                       r-   )DiscriminatorBlockTc              
      s   t    tjj||d|rdndd| _tjtjj||dddtjjdddtjj||dddtjjddd| _|rPtjt	 tjj||dddd	| _
d S d | _
d S )
Nr	   r
   )r\   r?   rj   r0   Tr1   )rj   r\   )r   r   r   r    Conv2dconv_resr6   r5   r7   r   
downsample)r   r   rZ   r   r   r   r   r      s   
	"zDiscriminatorBlock.__init__c                 C   sB   |  |}| |}| jd ur| |}|| dtd  }|S rd   )r   r7   r   mathsqrt)r   r   resr   r   r   r      s   



zDiscriminatorBlock.forward)Tr   r   r   r   r   r      rS   r   c                       sn   e Zd Z	d fdd	Zdejdejd	ejfd
dZedd Zdejdejde	ej dejfddZ
  ZS )	Generator   r	      Tc              	      s  t    || _|| _tt|d | _|| _t| j| jdd| _	 fddt
| jD d d d }tt|}	tt|	|}|d }
|
g|}t|d d |dd  }tjj|d |d ddd	| _tjg | _t|D ]!\}\}}|dk}|| jd k}t||||||d
}| j| qn|  D ]}t|tjjtjjfrtjjj|jdddd q| jD ]&}tjj|j j tjj|j j! tjj|j"j tjj|j"j! q|| j# df}tjj$t%d|
g|R dd| _&|r| j&j'(  d S d S )Nr	   r/   )r&   c                    s   g | ]
} d |d   qS )r
   r	   r   .0inetwork_capacityr   r   
<listcomp>      z&Generator.__init__.<locals>.<listcomp>ri   r   r?   r   )rL   r   rN   rU   rV   rW   F)requires_grad))r   r   
image_sizerM   intr   
num_layersstyle_depthr.   style_mappingr3   r   minlistmapzipr   r    r   initial_conv
ModuleListblocks	enumerater|   appendmodules
isinstancerG   r_   r`   r#   zeros_r~   r%   r   upsample_factorr!   r"   initial_blockdatazero_)r   n_bandsrM   r   r   rN   fmap_maxstart_from_zerorZ   set_fmap_maxinit_channelsin_out_pairsindra   rb   	not_firstnot_lastblockminitial_block_sizer   r   r   r      sT   
"


zGenerator.__init__target	conditioncondition_lengthsc           	      C   sd   |j ^ }}}|j ^ }}}|| }tj||j dd  dd}|| d }t|||   }|S )NrA   )re   rD   r
   )rl   r)   interpolater   ceillong)	r   r   r   r   r;   target_heightheightscaleresultr   r   r   add_scaled_condition.  s   zGenerator.add_scaled_conditionc                 C   s   dt dd | jD  S )Nr
   c                 s   s    | ]}|j rd V  qdS )r	   N)rL   )r   r   r   r   r   	<genexpr>?  s    z,Generator.upsample_factor.<locals>.<genexpr>)rn   r   )r   r   r   r   r   =  s   zGenerator.upsample_factorlengthsrz   noisec                 C   s|   |j \}}}}| j|dd|| j }d }	| |}t|| jD ]\}
}|||	|
|\}}	| |||}| |	||}	q |	S )Nri   )rl   r   expandr   r   r   r   r   )r   r   r   rz   r   
batch_sizer;   
max_lengthr   r   rR   r   r   r   r   r   A  s   
zGenerator.forward)r   r	   r   T)r   r   r   r   r   r   r   propertyr   r   r   r   r   r   r   r   r      s    5
.r   c                       s:   e Zd Z			d
 fdd	Zdejdejfdd	Z  ZS )Discriminatorr   r	   r   c                    s:  t    tt|d }|}g }|g fddt|d D  }tt|}	tt|	|}tt	|d d |dd  }
g }t
|
D ]\}\}}|t|
d k}t|||d}|| qBtj|| _|d }|}tjj||ddd| _tj|d| _|  D ]}t|tjjtjjfrtjjj|jdd	d
d qd S )Nr	   c                    s   g | ]
} d  d|  qS )rg   r
   r   r   r   r   r   r   _  r   z*Discriminator.__init__.<locals>.<listcomp>ri   )r   r?   r   r   rU   rV   rW   )r   r   r   r   r3   r   r   r   r   r   r   lenr   r   r   r    r   r   r   
final_convrG   to_logitr   r   r_   r`   r#   )r   r   r   rN   r   r   num_init_filtersr   rZ   r   chan_in_outr   ra   rb   is_not_lastr   channel_lastrM   r   r   r   r   r   S  s.   
 
zDiscriminator.__init__r   r   c                 C   s   | j D ]}||}|jd |jd  }t|||   }q| |}|jd |jd  }t|||   }|jdd}|t|| d jdd}| 	|}|
 S )Nri   r   )axisz
b -> b 1 1)r   rl   r   r   r   r   meanr   rn   r   squeeze)r   r   r   r   r   r   r   r   r   r   y  s   


zDiscriminator.forward)r   r	   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   R  s    &r   )r   	functoolsr   r   typingr   r   torch.nn.functionalr    
functionalr)   einopsr   kornia.filtersr   #nemo.collections.common.parts.utilsr   Moduler   r   r.   r>   rI   r|   r   r   r   r   r   r   r   <module>   s$   &6,Z