o
    mi)                     @   s  d Z ddlZddlZddlZddlZddlmZ ddlmZ	 ddl
mZmZ ddlmZ eg dZd0d
ejdedejfddZd1d
ejdededejfddZ	d2dejdedededef
ddZd2dejdededefddZd3dejdejeef dedefd d!Zdejdejeef f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#dS )4z,Convolutional layers wrappers and utilities.    N)nn)
functional)spectral_normweight_norm   )ConvLayerNorm)noner   r   time_layer_norm
layer_normtime_group_normr   modulenormreturnc                 C   s0   |t v sJ |dkrt| S |dkrt| S | S )Nr   r   )CONV_NORMALIZATIONSr   r   )r   r    r   </home/ubuntu/SpeechTokenizer/speechtokenizer/modules/conv.pyapply_parametrization_norm   s   r   Fcausalc                 K   s   |t v sJ |dkrt| tjjjsJ t| jfi |S |dkr<|r'tdt| tjjjs1J tj	d| jfi |S t
 S )zReturn the proper normalization module. If causal is True, this will ensure the returned
    module is causal, or return an error if the normalization doesn't support causal evaluation.
    r
   r   z,GroupNorm doesn't support causal evaluation.r   )r   
isinstancer   modulesconv_ConvNdr   out_channels
ValueError	GroupNormIdentity)r   r   r   norm_kwargsr   r   r   get_norm_module%   s   r   xkernel_sizestridepadding_totalc                 C   s@   | j d }|| | | d }t|d | ||  }|| S )zSee `pad_for_conv1d`.
    r   )shapemathceil)r   r   r    r!   lengthn_framesideal_lengthr   r   r   get_extra_padding_for_conv1d6   s   
r)   c                 C   s   t | |||}t| d|fS )a  Pad for a convolution to make sure that the last window is full.
    Extra padding is added at the end. This is required to ensure that we can rebuild
    an output of the same length, as otherwise, even with padding, some time steps
    might get removed.
    For instance, with total padding = 4, kernel size = 4, stride = 2:
        0 0 1 2 3 4 5 0 0   # (0s are padding)
        1   2   3           # (output frames of a convolution, last 0 is never used)
        0 0 1 2 3 4 5 0     # (output of tr. conv., but pos. 5 is going to get removed as padding)
            1 2 3 4         # once you removed padding, we are missing one time step !
    r   )r)   Fpad)r   r   r    r!   extra_paddingr   r   r   pad_for_conv1d@   s   r-   zero        paddingsmodevaluec                 C   s   | j d }|\}}|dkr|dksJ ||f|dkrKt||}d}||kr4|| d }t| d|f} t| |||}	|	j d | }
|	dd|
f S t| |||S )zTiny wrapper around F.pad, just to allow for reflect padding on small input.
    If this is the case, we insert extra 0 padding to the right before the reflection happen.
    r"   r   reflectr   .N)r#   maxr*   r+   )r   r0   r1   r2   r&   padding_leftpadding_rightmax_pad	extra_padpaddedendr   r   r   pad1dO   s   

r;   c                 C   sX   |\}}|dkr|dksJ ||f|| | j d ksJ | j d | }| d||f S )zCRemove padding from x, handling properly zero padding. Only for 1d!r   r"   .)r#   )r   r0   r5   r6   r:   r   r   r   unpad1dc   s
   r<   c                	       L   e Zd ZdZddi ddededejeejf f fdd	Z	d
d Z
  ZS )
NormConv1dzWrapper around Conv1d and normalization applied to this conv
    to provide a uniform interface across normalization approaches.
    Fr   r   r   r   r   r   r   c                   D   t    ttj|i ||| _t| j||fi || _|| _d S N)	super__init__r   r   Conv1dr   r   r   	norm_typeselfr   r   r   argskwargs	__class__r   r   rC   p      

zNormConv1d.__init__c                 C      |  |}| |}|S rA   r   r   rG   r   r   r   r   forwardw      

zNormConv1d.forward__name__
__module____qualname____doc__boolstrtpDictAnyrC   rP   __classcell__r   r   rJ   r   r>   l       r>   c                       F   e Zd ZdZdi ddedejeejf f fddZdd	 Z	  Z
S )

NormConv2dzWrapper around Conv2d and normalization applied to this conv
    to provide a uniform interface across normalization approaches.
    r   r   r   r   r   c                   sF   t    ttj|i ||| _t| jfd|d|| _|| _d S NF)r   r   )	rB   rC   r   r   Conv2dr   r   r   rE   rG   r   r   rH   rI   rJ   r   r   rC      s   

zNormConv2d.__init__c                 C   rM   rA   rN   rO   r   r   r   rP      rQ   zNormConv2d.forwardrS   rT   rU   rV   rX   rY   rZ   r[   rC   rP   r\   r   r   rJ   r   r_   }   s    
r_   c                	       r=   )NormConvTranspose1dzWrapper around ConvTranspose1d and normalization applied to this conv
    to provide a uniform interface across normalization approaches.
    Fr   r?   r   r   r   c                   r@   rA   )	rB   rC   r   r   ConvTranspose1dconvtrr   r   rE   rF   rJ   r   r   rC      rL   zNormConvTranspose1d.__init__c                 C   rM   rA   rg   r   rO   r   r   r   rP      rQ   zNormConvTranspose1d.forwardrR   r   r   rJ   r   re      r]   re   c                       r^   )
NormConvTranspose2dzWrapper around ConvTranspose2d and normalization applied to this conv
    to provide a uniform interface across normalization approaches.
    r   r`   r   r   c                   s@   t    ttj|i ||| _t| jfd|d|| _d S ra   )rB   rC   r   r   ConvTranspose2drg   r   r   rc   rJ   r   r   rC      s   
zNormConvTranspose2d.__init__c                 C   rM   rA   rh   rO   r   r   r   rP      rQ   zNormConvTranspose2d.forwardrd   r   r   rJ   r   ri      s    
ri   c                       st   e Zd ZdZddddddi dfdeded	ed
ededededededejeej	f def fddZ
dd Z  ZS )SConv1dz]Conv1d with some builtin handling of asymmetric or causal padding
    and normalization.
    r   TFr   r3   in_channelsr   r   r    dilationgroupsbiasr   r   r   pad_modec                    sf   t    |dkr|dkrtd| d| d| d t|||||||||	|
d
| _|| _|| _d S )Nr   zKSConv1d has been initialized with stride > 1 and dilation > 1 (kernel_size=z stride=z, dilation=z).)rm   rn   ro   r   r   r   )rB   rC   warningswarnr>   r   r   rp   )rG   rl   r   r   r    rm   rn   ro   r   r   r   rp   rJ   r   r   rC      s   



zSConv1d.__init__c                 C   s   |j \}}}| jjjd }| jjjd }| jjjd }|d | |d  }t||||}	| jr:t|||	f| jd}n|d }
||
 }t|||
|	 f| jd}| |S )Nr   r   )r1      )	r#   r   r   r    rm   r)   r   r;   rp   )rG   r   BCTr   r    rm   r!   r,   r6   r5   r   r   r   rP      s   
zSConv1d.forward)rS   rT   rU   rV   intrW   rX   rY   rZ   r[   rC   rP   r\   r   r   rJ   r   rk      s4    rk   c                       sb   e Zd ZdZddddi fdededed	ed
edededej	eej
f f fddZdd Z  ZS )SConvTranspose1dzfConvTranspose1d with some builtin handling of asymmetric or causal padding
    and normalization.
    r   Fr         ?rl   r   r   r    r   r   trim_right_ratior   c	           	   	      sb   t    t|||||||d| _|| _|| _| js#| jdks#J d| jdkr-| jdks/J d S )Nr?   ry   zB`trim_right_ratio` != 1.0 only makes sense for causal convolutionsr/   )rB   rC   re   rg   r   rz   )	rG   rl   r   r   r    r   r   rz   r   rJ   r   r   rC      s   

zSConvTranspose1d.__init__c                 C   s   | j j jd }| j j jd }|| }|  |}| jr/t|| j }|| }t|||f}|S |d }|| }t|||f}|S )Nr   rs   )rg   r   r    r   r$   r%   rz   r<   )rG   r   r   r    r!   yr6   r5   r   r   r   rP      s   
zSConvTranspose1d.forward)rS   rT   rU   rV   rw   rW   rX   floatrY   rZ   r[   rC   rP   r\   r   r   rJ   r   rx      s&    rx   )r   )Fr   )r   )r.   r/   )$rV   r$   typingrY   rq   torchr   torch.nnr   r*   torch.nn.utilsr   r   r   r   	frozensetr   ModulerX   r   rW   r   Tensorrw   r)   r-   Tupler|   r;   r<   r>   r_   re   ri   rk   rx   r   r   r   r   <module>   s6    

(	&