o
    
jE                     @   sZ   d dl Z d dl mZ d dlmZ d dlmZmZ dddZddd	ZG d
d dej	Z
dS )    N)nn)ActNorm)CouplingBlockInvConvNear   c                 C   s   |   \}}}|| | }| ddddd|f } | |||| |}|dddd ||| || }|durL|dddd|d d|f }nt|d|| j| j| jd}|| |fS )zGlowTTS squeeze operation
    Increase number of channels and reduce number of time steps
    by the same factor.

    Note:
        each 's' is a n-dimensional vector.
        ``[s1,s2,s3,s4,s5,s6] --> [[s1, s3, s5], [s2, s4, s6]]``
    Nr         r   devicedtype)	sizeviewpermute
contiguoustorchonestor
   r   )xx_masknum_sqzbctx_sqz r   R/home/kuhnn/.local/lib/python3.10/site-packages/TTS/tts/layers/glow_tts/decoder.pysqueeze   s   	&" r   c                 C   s   |   \}}}| |||| |}|dddd ||| || }|dur;|dddd||d|| }nt|d|| j| j	| j
d}|| |fS )zGlowTTS unsqueeze operation (revert the squeeze)

    Note:
        each 's' is a n-dimensional vector.
        ``[[s1, s3, s5], [s2, s4, s6]] --> [[s1, s3, s5, s2, s4, s6]]``
    r   r   r   r   Nr	   )r   r   r   r   	unsqueezerepeatr   r   r   r
   r   )r   r   r   r   r   r   x_unsqzr   r   r   r      s   && r   c                       s>   e Zd ZdZ					d fdd	Zdd
dZdd Z  ZS )Decodera  Stack of Glow Decoder Modules.

    ::

        Squeeze -> ActNorm -> InvertibleConv1x1 -> AffineCoupling -> Unsqueeze

    Args:
        in_channels (int): channels of input tensor.
        hidden_channels (int): hidden decoder channels.
        kernel_size (int): Coupling block kernel size. (Wavenet filter kernel size.)
        dilation_rate (int): rate to increase dilation by each layer in a decoder block.
        num_flow_blocks (int): number of decoder blocks.
        num_coupling_layers (int): number coupling layers. (number of wavenet layers.)
        dropout_p (float): wavenet dropout rate.
        sigmoid_scale (bool): enable/disable sigmoid scaling in coupling layer.
               r   Fr   c                    s   t    || _|| _|| _|| _|| _|| _|| _|| _	|	| _
|
| _|| _t | _t|D ]+}| jt||	 d | jt||	 |d | jt||	 |||||||
d q/d S )N)channels)r$   
num_splits)kernel_sizedilation_rate
num_layersc_in_channels	dropout_psigmoid_scale)super__init__in_channelshidden_channelsr&   r'   num_flow_blocksnum_coupling_layersr*   r%   num_squeezer+   r)   r   
ModuleListflowsrangeappendr   r   r   )selfr.   r/   r&   r'   r0   r1   r*   r%   r2   r+   r)   _	__class__r   r   r-   D   s:   

zDecoder.__init__Nc           	      C   s   |s| j }d}nt| j }d}| jdkrt||| j\}}|D ]}|s2|||||d\}}||7 }q|||||d\}}q| jdkrKt||| j\}}||fS )z
        Shapes:
            - x:  :math:`[B, C, T]`
            - x_mask: :math:`[B, 1 ,T]`
            - g: :math:`[B, C]`
        r   Nr   )greverse)r4   reversedr2   r   r   )	r7   r   r   r;   r<   r4   
logdet_totflogdetr   r   r   forwardq   s   



zDecoder.forwardc                 C   s   | j D ]}|  qd S )N)r4   store_inverse)r7   r?   r   r   r   rB      s   

zDecoder.store_inverse)r"   r#   r   Fr   )NF)__name__
__module____qualname____doc__r-   rA   rB   __classcell__r   r   r9   r   r!   2   s    
-r!   )Nr   )r   r   $TTS.tts.layers.generic.normalizationr   TTS.tts.layers.glow_tts.glowr   r   r   r   Moduler!   r   r   r   r   <module>   s    

