o
    “©iº$  ã                   @   s°   d dl Z d dlmZ d dlmZmZmZmZ d dlZd dl	m
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dS )é    N)ÚOrderedDict)ÚDictÚListÚOptionalÚTuple)Úinit)Ú	Parameteré   )Ú	get_layerc                       s6   e Zd Zdd„ Z				d‡ fdd„	Zd	d
„ Z‡  ZS )ÚGridNetV2Blockc                 C   s
   t | |ƒS )N)Úgetattr)ÚselfÚkey© r   úd/home/ubuntu/.local/lib/python3.10/site-packages/solospeech/vae_modules/stft_vae/models/TFgridnet.pyÚ__getitem__   s   
zGridNetV2Block.__getitem__é   é   Úpreluçñhãˆµøä>c
                    sæ  t ƒ  ¡  |dksJ ‚|| }
tj||	d| _tj|
|dddd| _||kr0t |d |
¡| _ntj	|d |||d| _tj||	d| _
tj|
|dddd| _||kr]t |d |
¡| _ntj	|d |||d| _t |d | ¡}|| d	kszJ ‚|  d
t ||| d¡¡ |  dt|||f|	d¡ |  dt ||| d¡¡ |  dt|||f|	d¡ |  dt ||| | d¡¡ |  dt||| |f|	d¡ |  dt t ||d¡t|ƒƒ t||f|	d¡¡ || _|| _|| _|| _d S )Nr   )Úepsr	   T)Úbatch_firstÚbidirectionalé   ©Ústrideg      ð?r   Úattn_conv_QÚattn_norm_QÚattn_conv_KÚattn_norm_KÚattn_conv_VÚattn_norm_VÚattn_concat_proj)ÚsuperÚ__init__ÚnnÚ	LayerNormÚ
intra_normÚLSTMÚ	intra_rnnÚLinearÚintra_linearÚConvTranspose1dÚ
inter_normÚ	inter_rnnÚinter_linearÚmathÚceilÚ
add_moduleÚConv2dÚ"AllHeadPReLULayerNormalization4DCFÚ
Sequentialr
   ÚLayerNormalization4DCFÚemb_dimÚemb_ksÚemb_hsÚn_head)r   r7   r8   r9   Ún_freqsÚhidden_channelsr:   Úapprox_qk_dimÚ
activationr   Úin_channelsÚE©Ú	__class__r   r   r$      sp   

ÿÿ
ÿÿ
ÿþþÿÿþýþ	
zGridNetV2Block.__init__c              
   C   sH  |j \}}}}| j| j }t |d|  | j | j ¡| j | j }t |d|  | j | j ¡| j | j }| dddd¡}t |dd||| | ||| | f¡}|}	|  |	¡}
| j| jkrƒ|
 	|| d| j| g¡}
|  
|
¡\}
}|  |
¡}
|
 	||||g¡}
nG|
 	|| ||g¡}
|
 dd¡}
tj|
d | jdf| jdfd}
|
 dd¡}
|  
|
¡\}
}|
 dd¡}
|  |
¡}
|
 	||||g¡}
|
 dd¡}
|
|	 }
|
 dd¡}
|
}	|  |	¡}| j| jkr| 	|| d| j| g¡}|  |¡\}}|  |¡}| 	||||g¡}nF| 	|| ||¡}| dd¡}tj|d | jdf| jdfd}| dd¡}|  |¡\}}| dd¡}|  |¡}| 	||||g¡}| dd¡}||	 }| dddd¡}|d	||| …||| …f }|}| d
 | d |ƒƒ}| d | d |ƒƒ}| d | d |ƒƒ}|j	dg|j dd… ¢R Ž }|j	dg|j dd… ¢R Ž }|j	dg|j dd… ¢R Ž }| dd¡}|jdd}| dd¡}| ¡  	|| j d|g¡}| dd¡}|j }|jdd}|j d }t ||¡|d  }tj|dd}t ||¡}| |¡}| dd¡}|j d }| ¡  	|| j| ||g¡}| d |ƒ}|| }|S )ziGridNetV2Block Forward.

        Args:
            x: [B, C, T, Q]
            out: [B, C, T, Q]
        r   r   é   r	   éÿÿÿÿ).Nr   éþÿÿÿ.r   r   r   r   r!   r    N)Ú	start_dimg      à?)Údimr"   )Úshaper8   r9   r0   r1   ÚpermuteÚFÚpadr'   Úviewr)   r+   Ú	transposeÚunfoldr-   r.   r/   ÚflattenÚ
contiguousr:   ÚtorchÚmatmulÚsoftmaxÚreshape)r   ÚxÚBÚCÚold_TÚold_QÚolpÚTÚQÚinput_r)   Ú_r.   ÚbatchÚKÚVÚ	old_shaper7   Úattn_matÚoutr   r   r   Úforwarda   s    "ÿÿ"ÿÿ(

ÿ


ÿ



ÿzGridNetV2Block.forward)r   r   r   r   )Ú__name__Ú
__module__Ú__qualname__r   r$   re   Ú__classcell__r   r   rA   r   r      s    
öPr   c                       ó&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )r6   r   c                    s€   t ƒ  ¡  t|ƒdksJ ‚d|d d|d g}ttj|Ž  tj¡ƒ| _ttj|Ž  tj¡ƒ| _	t
 | j¡ t
 | j	¡ || _d S )Nr   r	   r   )r#   r$   Úlenr   rQ   ÚTensorÚtoÚfloat32ÚgammaÚbetar   Úones_Úzeros_r   )r   Úinput_dimensionr   Ú
param_sizerA   r   r   r$   Ó   s   

zLayerNormalization4DCF.__init__c                 C   sf   |j dkrd}ntd |j ¡ƒ‚|j|dd}t |j|ddd| j ¡}|| | | j | j	 }|S )Nr   )r	   rC   z)Expect x to have 4 dimensions, but got {}T©rG   ÚkeepdimF©rG   Úunbiasedrv   )
ÚndimÚ
ValueErrorÚformatÚmeanrQ   ÚsqrtÚvarr   ro   rp   )r   rU   Ústat_dimÚmu_Ústd_Úx_hatr   r   r   re   Ý   s   
ÿzLayerNormalization4DCF.forward©r   ©rf   rg   rh   r$   re   ri   r   r   rA   r   r6   Ò   s    
r6   c                       rj   )r4   r   c                    s¦   t ƒ  ¡  t|ƒdksJ ‚|\}}}d||d|g}ttj|Ž  tj¡ƒ| _ttj|Ž  tj¡ƒ| _	t
 | j¡ t
 | j	¡ tj|dd| _|| _|| _|| _|| _d S )NrC   r	   g      Ð?)Únum_parametersr   )r#   r$   rk   r   rQ   rl   rm   rn   ro   rp   r   rq   rr   r%   ÚPReLUÚactr   ÚHr@   r;   )r   rs   r   rˆ   r@   r;   rt   rA   r   r   r$   ë   s   


z+AllHeadPReLULayerNormalization4DCF.__init__c                 C   sŠ   |j dksJ ‚|j\}}}}| || j| j|| jg¡}|  |¡}d}|j|dd}t 	|j
|ddd| j ¡}|| | | j | j }|S )Nr   )r   r   Tru   Frw   )ry   rH   rL   rˆ   r@   r;   r‡   r|   rQ   r}   r~   r   ro   rp   )r   rU   rV   r^   r[   r   r€   r   r   r   r   re   ú   s   
ÿz*AllHeadPReLULayerNormalization4DCF.forwardrƒ   r„   r   r   rA   r   r4   ê   s    r4   )r0   Úcollectionsr   Útypingr   r   r   r   rQ   Útorch.nnr%   Útorch.nn.functionalÚ
functionalrJ   r   Útorch.nn.parameterr   Úget_layer_from_stringr
   ÚModuler   r6   r4   r   r   r   r   Ú<module>   s     F