o
    
j                     @   s   d dl Z d dlZd dlmZ d dlmZ G dd dejZdd Zdd	 Z	d
d Z
G dd dejZG dd dejZG dd dejZdS )    N)nn)
functionalc                       s   e Zd Z fddZ  ZS )GroupNorm32c                    s   t  | |jS N)superforwardfloattypedtype)selfx	__class__ U/home/kuhnn/.local/lib/python3.10/site-packages/TTS/tts/layers/xtts/latent_encoder.pyr      s   zGroupNorm32.forward)__name__
__module____qualname__r   __classcell__r   r   r   r   r   
   s    r   c                 O   sV   | dkrt j|i |S | dkrt j|i |S | dkr$t j|i |S td|  )N         zunsupported dimensions: )r   Conv1dConv2dConv3d
ValueError)dimsargskwargsr   r   r   conv_nd   s   r   c                 C   sX   d}| dkr	d}n| dkrd}| | dkr!t |d }| | dks|dks'J t|| S )N          @   r   r   )intr   )channelsgroupsr   r   r   normalization   s   
r'   c                 C   s   |   D ]}|   q| S r   )
parametersdetachzero_)modulepr   r   r   zero_module%   s   r-   c                       s&   e Zd Z fddZdddZ  ZS )QKVAttentionc                    s   t    || _d S r   )r   __init__n_heads)r   r0   r   r   r   r/   ,   s   

zQKVAttention.__init__Nr   c                 C   s   |j \}}}|d| j  dksJ |d| j  }||| j |d |j|dd\}}	}
dtt| }td|| |	| }|| }|durY|| jdd}tj	 ||
 < tj| dd|j}td||
}||d|S )	z
        Apply QKV attention.

        :param qkv: an [N x (H * 3 * C) x T] tensor of Qs, Ks, and Vs.
        :return: an [N x (H * C) x T] tensor after attention.
        r   r   r   )dimzbct,bcs->btsNzbts,bcs->bct)shaper0   reshapesplitmathsqrttorcheinsumrepeatinflogical_notsoftmaxr   r	   r
   )r   qkvmaskqk_biasbswidthlengthchqkvscaleweightar   r   r   r   0   s   (zQKVAttention.forwardNr   r   r   r   r/   r   r   r   r   r   r   r.   +   s    r.   c                       s4   e Zd ZdZ				d fdd	Zdd	d
Z  ZS )AttentionBlockzIAn attention block that allows spatial positions to attend to each other.r   r2   NFc                    s   t    || _|d u r|n|}|| _|dkr|| _n|| dks+J d| d| || | _t|| _td||d d| _t	| j| _
||krMt ntd||d| _ttd||d| _d S )Nr2   r   zq,k,v channels z' is not divisible by num_head_channels r   r   )r   r/   r%   do_activation	num_headsr'   normr   r>   r.   	attentionr   Identityx_projr-   proj_out)r   r%   rO   num_head_channelsout_channelsrN   r   r   r   r/   J   s   


 zAttentionBlock.__init__r   c           
      C   s   |j ^}}}|d ur;t|j dkr|d|j d dd}|j d |j d kr;|d d d |j d d |j d f }|||d}| |}| jrQtj|dd}| 	|}| j
|||d}| |}| |}	|	| j||	j d g|R  S )Nr   r   r   r2   T)inplace)r?   r@   )r3   len	unsqueezer:   r4   rP   rN   Fsilur>   rQ   rT   rS   )
r   r   r?   r@   bcspatialr>   hxpr   r   r   r   d   s   &



zAttentionBlock.forward)r   r2   NFrK   )r   r   r   __doc__r/   r   r   r   r   r   r   rM   G   s    rM   c                       s*   e Zd Z		d fdd	Zdd Z  ZS )ConditioningEncoder      c                    sT   t    g }tj||dd| _t|D ]
}|t|| qtj| | _	|| _
d S )Nr   )kernel_size)r   r/   r   r   initrangeappendrM   
Sequentialattnr1   )r   spec_dimembedding_dimattn_blocksnum_attn_headsrj   rJ   r   r   r   r/   x   s   

zConditioningEncoder.__init__c                 C   s   |  |}| |}|S )z
        x: (b, 80, s)
        )rf   rj   )r   r   r_   r   r   r   r      s   

zConditioningEncoder.forward)rc   rd   rL   r   r   r   r   rb   w   s
    rb   )r6   r8   r   torch.nnr   rZ   	GroupNormr   r   r'   r-   Moduler.   rM   rb   r   r   r   r   <module>   s   
0