o
    i%                     @   s   d dl Z d dlm  mZ d dlm  mZ G dd de jj	Z
G dd de jj	Zdd Zddd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 )    Nc                       s*   e Zd ZdZd fdd	Zdd Z  ZS )BasicResBlock   c              	      s   t t|   tjj||d|dfddd| _tj|| _tjj||ddddd| _	tj|| _
tj | _|dksB|| j| kratjtjj|| j| d|dfddtj| j| | _d S d S )N   r   Fkernel_sizestridepaddingbias)r   r   r	   )superr   __init__torchnnConv2dconv1BatchNorm2dbn1conv2bn2
Sequentialshortcut	expansion)self	in_planesplanesr   	__class__ U/home/ubuntu/.local/lib/python3.10/site-packages/funasr/models/campplus/components.pyr      s(   
zBasicResBlock.__init__c                 C   sB   t | | |}| | |}|| |7 }t |}|S N)Frelur   r   r   r   r   )r   xoutr   r   r   forward%   s
   
zBasicResBlock.forward)r   )__name__
__module____qualname__r   r   r#   __classcell__r   r   r   r   r      s    r   c                       s:   e Zd Zeddgddf fdd	Zdd Zdd	 Z  ZS )
FCM       P   c                    s   t t|   || _tjjd|ddddd| _tj|| _	| j
|||d dd| _| j
|||d dd| _tjj||ddddd| _tj|| _||d	  | _d S )
Nr   r   Fr   r   r)   )r   )r)   r      )r
   r(   r   r   r   r   r   r   r   r   _make_layerlayer1layer2r   r   out_channels)r   block
num_blocks
m_channelsfeat_dimr   r   r   r   .   s   zFCM.__init__c                 C   sN   |gdg|d   }g }|D ]}| || j|| ||j | _qtjj| S )Nr   )appendr   r   r   r   r   )r   r1   r   r2   r   strideslayersr   r   r   r-   =   s   zFCM._make_layerc                 C   sv   | d}t| | |}| |}| |}t| | |}|j	}|
|d |d |d  |d }|S )Nr   r   r)   r   )	unsqueezer   r    r   r   r.   r/   r   r   shapereshape)r   r!   r"   r9   r   r   r   r#   E   s   


"zFCM.forward)r$   r%   r&   r   r   r-   r#   r'   r   r   r   r   r(   -   s    r(   c                 C   s   t j }| dD ]G}|dkr|dt jjdd q
|dkr+|dt j| q
|dkr:|dt j| q
|dkrK|dt jj|dd	 q
td
	||S )N-r    Tinplaceprelu	batchnorm
batchnorm_F)affinezUnexpected module ({}).)
r   r   r   split
add_moduleReLUPReLUBatchNorm1d
ValueErrorformat)
config_strchannels	nonlinearnamer   r   r   get_nonlinearQ   s   
rM   FT{Gz?c                 C   s@   | j |d}| j||d}tj||gdd}|r|j|d}|S )Ndim)rQ   unbiasedrN   )meanstdr   catr8   )r!   rQ   keepdimrR   epsrS   rT   statsr   r   r   statistics_poolinga   s   rY   c                   @   s   e Zd Zdd ZdS )	StatsPoolc                 C   s   t |S r   )rY   r   r!   r   r   r   r#   k   s   zStatsPool.forwardN)r$   r%   r&   r#   r   r   r   r   rZ   j   s    rZ   c                       s0   e Zd Z					d	 fdd	Zdd Z  ZS )
	TDNNLayerr   r   Fbatchnorm-reluc	           	   	      sl   t t|   |dk r |d dksJ d||d d | }tjj|||||||d| _t||| _	d S )Nr   r)   r   4Expect equal paddings, but got even kernel size ({})r   r   dilationr	   )
r
   r\   r   rH   r   r   Conv1dlinearrM   rK   )	r   in_channelsr0   r   r   r   r`   r	   rI   r   r   r   r   p   s    	zTDNNLayer.__init__c                 C      |  |}| |}|S r   )rb   rK   r[   r   r   r   r#         

zTDNNLayer.forward)r   r   r   Fr]   r$   r%   r&   r   r#   r'   r   r   r   r   r\   o   s    r\   c                       s2   e Zd Z	d
 fdd	Zdd Zddd	Z  ZS )CAMLayerr)   c	           	   	      sv   t t|   tjj|||||||d| _tj||| d| _tjjdd| _	tj|| |d| _
tj | _d S )Nr_   r   Tr<   )r
   rg   r   r   r   ra   linear_locallinear1rD   r    linear2Sigmoidsigmoid)	r   bn_channelsr0   r   r   r   r`   r	   	reductionr   r   r   r      s   	zCAMLayer.__init__c                 C   sJ   |  |}|jddd| | }| | |}| | |}|| S )NrN   T)rV   )rh   rS   seg_poolingr    ri   rl   rj   )r   r!   ycontextmr   r   r   r#      s
   
zCAMLayer.forwardd   avgc                 C   s   |dkrt j|||dd}n|dkrt j|||dd}ntd|j}|djg ||R  jg |d d dR  }|dd |jd f }|S )Nrt   T)r   r   	ceil_modemaxzWrong segment pooling type.rN   .)r   
avg_pool1d
max_pool1drG   r9   r8   expandr:   )r   r!   seg_lenstypesegr9   r   r   r   ro      s   2zCAMLayer.seg_pooling)r)   )rs   rt   )r$   r%   r&   r   r#   ro   r'   r   r   r   r   rg      s
    rg   c                       s8   e Zd Z					d
 fdd	Zdd Zdd	 Z  ZS )CAMDenseTDNNLayerr   Fr]   c
              	      s   t t|   |d dksJ d||d d | }
|	| _t||| _tjj	||ddd| _
t||| _t|||||
||d| _d S )Nr)   r   r^   Fr	   r_   )r
   r}   r   rH   memory_efficientrM   
nonlinear1r   r   ra   ri   
nonlinear2rg   	cam_layer)r   rc   r0   rm   r   r   r`   r	   rI   r   r   r   r   r   r      s$   zCAMDenseTDNNLayer.__init__c                 C   s   |  | |S r   )ri   r   r[   r   r   r   bn_function   s   zCAMDenseTDNNLayer.bn_functionc                 C   s:   | j r| jrt| j|}n| |}| | |}|S r   )trainingr   cp
checkpointr   r   r   r[   r   r   r   r#      s
   
zCAMDenseTDNNLayer.forwardr   r   Fr]   F)r$   r%   r&   r   r   r#   r'   r   r   r   r   r}      s    r}   c                       s0   e Zd Z					d fdd	Zdd Z  ZS )	CAMDenseTDNNBlockr   Fr]   c                    sV   t t|   t|D ]}t|||  |||||||	|
d	}| d|d  | qd S )N)	rc   r0   rm   r   r   r`   r	   rI   r   ztdnnd%dr   )r
   r   r   ranger}   rC   )r   
num_layersrc   r0   rm   r   r   r`   r	   rI   r   ilayerr   r   r   r      s   
zCAMDenseTDNNBlock.__init__c                 C   s$   | D ]}t j|||gdd}q|S )Nr   rP   )r   rU   )r   r!   r   r   r   r   r#     s   zCAMDenseTDNNBlock.forwardr   rf   r   r   r   r   r      s    r   c                       &   e Zd Zd fdd	Zdd Z  ZS )TransitLayerTr]   c                    s4   t t|   t||| _tjj||d|d| _d S Nr   r~   )	r
   r   r   rM   rK   r   r   ra   rb   r   rc   r0   r	   rI   r   r   r   r   	  s   zTransitLayer.__init__c                 C   rd   r   )rK   rb   r[   r   r   r   r#     re   zTransitLayer.forward)Tr]   rf   r   r   r   r   r         r   c                       r   )
DenseLayerFr]   c                    s4   t t|   tjj||d|d| _t||| _d S r   )	r
   r   r   r   r   ra   rb   rM   rK   r   r   r   r   r     s   zDenseLayer.__init__c                 C   sB   t |jdkr| |jddjdd}n| |}| |}|S )Nr)   rN   rP   )lenr9   rb   r8   squeezerK   r[   r   r   r   r#     s
   

zDenseLayer.forward)Fr]   rf   r   r   r   r   r     r   r   )rN   FTrO   )r   torch.nn.functionalr   
functionalr   torch.utils.checkpointutilsr   r   Moduler   r(   rM   rY   rZ   r\   rg   r}   
ModuleListr   r   r   r   r   r   r   <module>   s   !$
	#',#