o
    @TiH                     @   s<   d dl Z d dl mZ G dd dejZG dd dejZdS )    N)nnc                       sD   e Zd ZdZdededef fddZdejdejfd	d
Z	  Z
S )ConvNeXtBlockam  ConvNeXt Block adapted from https://github.com/facebookresearch/ConvNeXt to 1D audio signal.

    Args:
        dim (int): Number of input channels.
        intermediate_dim (int): Dimensionality of the intermediate layer.
        layer_scale_init_value (float, optional): Initial value for the layer scale. None means no scaling.
            Defaults to None.
    dimintermediate_dimlayer_scale_init_valuec                    s   t    tj||dd|d| _tj|dd| _t||| _t	 | _
t||| _|dkr>tj|t| dd| _d S d | _d S )	N      )kernel_sizepaddinggroupsư>epsr   T)requires_grad)super__init__r   Conv1ddwconv	LayerNormnormLinearpwconv1GELUactpwconv2	Parametertorchonesgamma)selfr   r   r   	__class__ M/home/ubuntu/.local/lib/python3.10/site-packages/linacodec/module/convnext.pyr      s   

zConvNeXtBlock.__init__xreturnc                 C   sn   |}|  |}|dd}| |}| |}| |}| |}| jd ur+| j| }|dd}|| }|S )N      )r   	transposer   r   r   r   r   )r   r$   residualr"   r"   r#   forward$   s   






zConvNeXtBlock.forward)__name__
__module____qualname____doc__intfloatr   r   Tensorr*   __classcell__r"   r"   r    r#   r      s    	r   c                       s   e Zd ZdZ			ddedededededB d	edB d
ef fddZedefddZ	edefddZ
dd ZdejdejfddZ  ZS )ConvNextBackbonea  
    Backbone module built with ConvNeXt blocks.

    Args:
        input_channels (int): Number of input features channels.
        dim (int): Hidden dimension of the model.
        intermediate_dim (int): Intermediate dimension used in ConvNeXtBlock.
        num_layers (int): Number of ConvNeXtBlock layers.
        layer_scale_init_value (float, optional): Initial value for layer scaling. Defaults to `1 / num_layers`.
    NFinput_channelsr   r   
num_layersoutput_channelsr   
skip_embedc                    s   t    || _|| _ | _|stj| dddnt | _tj	 dd| _
p+d| t fddt|D | _|rEt |nt | _tj	 dd| _| | j d S )	Nr   r   )r	   r
   r   r   r&   c                    s   g | ]	}t  d qS )r   r   r   )r   ).0_r8   r"   r#   
<listcomp>R   s    z-ConvNextBackbone.__init__.<locals>.<listcomp>)r   r   r4   r6   r   r   r   Identityembedr   r   
ModuleListrangeconvnextr   proj_outfinal_layer_normapply_init_weights)r   r4   r   r   r5   r6   r   r7   r    r8   r#   r   @   s   

 
zConvNextBackbone.__init__r%   c                 C   s   | j S N)r4   r   r"   r"   r#   	input_dim_   s   zConvNextBackbone.input_dimc                 C   s   | j r| j S | jS rE   )r6   r   rF   r"   r"   r#   
output_dimc   s   zConvNextBackbone.output_dimc                 C   s<   t |tjtjfrtjj|jdd tj|jd d S d S )Ng{Gz?)stdr   )	
isinstancer   r   r   inittrunc_normal_weight	constant_bias)r   mr"   r"   r#   rD   g   s   zConvNextBackbone._init_weightsr$   c                 K   sh   | dd}| |}| | dd}| dd}| jD ]}||}q| | dd}| |}|S )ah  
        Args:
            x (Tensor): Input tensor of shape (B, L, C), where B is the batch size,
                        C denotes output features, and L is the sequence length.
        Returns:
            Tensor: Output of shape (B, L, H), where B is the batch size, L is the sequence length,
                    and H denotes the model dimension.
        r&   r'   )r(   r=   r   r@   rB   rA   )r   r$   kwargs
conv_blockr"   r"   r#   r*   l   s   	



zConvNextBackbone.forward)NNF)r+   r,   r-   r.   r/   r0   boolr   propertyrG   rH   rD   r   r1   r*   r2   r"   r"   r    r#   r3   4   s4    r3   )r   r   Moduler   r3   r"   r"   r"   r#   <module>   s   ,