o
    }oi                     @   sx   d dl mZmZmZmZ d dlZd dlmZ eeeee	gej
f eej
 df ZG dd dej
ZG dd dej
ZdS )    )CallableListTypeUnionNc                       s   e Zd ZdZ		ddededededed	ef fd
dZdej	dej	fddZ
e	ddededededeej f
ddZ  ZS )MLPa  
    A Multi-Layer Perceptron (MLP) module.

    Args:
        num_input_dims (int): Number of input dimensions.
        num_output_dims (int): Number of output dimensions.
        num_hidden_dims (int): Number of hidden dimensions.
        num_layers (int): Number of layers in the MLP.
        bias (bool): If True, enables the bias in Linear layers. Default is True.
        block (BlockBuilder): A callable or class for constructing a block. Default is None.
    TNnum_input_dimsnum_output_dimsnum_hidden_dims
num_layersbiasblockc           	   	      s   t    g }|tj|||d |tjdd td|d D ]}|| |||| q"|tj|||d t	|| _
d S )Nr   Tinplace   )super__init__appendnnLinearReLUrangeextendbuild_layer
ModuleListnet)	selfr   r   r	   r
   r   r   network_	__class__ l/home/ubuntu/.local/lib/python3.10/site-packages/nemo/collections/multimodal/modules/nerf/geometry/layers.pyr   #   s   
	zMLP.__init__xreturnc                 C   s   | j D ]}||}q|S )z
        Forward pass through the MLP.

        Args:
            x (torch.Tensor): Input tensor.

        Returns:
            torch.Tensor: Output tensor.
        )r   )r   r#   moduler!   r!   r"   forward?   s   


zMLP.forwardblock_builderc                 C   s4   |du rt j| ||dt jddgS || ||dgS )a  
        Build a single layer for the MLP.

        Args:
            num_input_dims (int): Number of input dimensions.
            num_output_dims (int): Number of output dimensions.
            bias (bool): If True, enables the bias in Linear layers. Default is True.
            block_builder (BlockBuilder): A callable or class for constructing a block. Default is None.

        Returns:
            List[nn.Module]: A list containing the layer's modules.
        Nr   Tr   )r   r   r   )r   r   r   r'   r!   r!   r"   r   M   s   zMLP.build_layer)TN)__name__
__module____qualname____doc__intboolBlockBuilderr   torchTensorr&   staticmethodr   r   Moduler   __classcell__r!   r!   r   r"   r      s>    r   c                       sF   e Zd ZdZddededef fddZdejd	ejfd
dZ	  Z
S )ResBlockz
    A residual block module.

    Args:
        num_input_dims (int): Number of input dimensions.
        num_output_dims (int): Number of output dimensions.
        bias (bool): If True, enables the bias in Linear layers. Default is True.
    Tr   r   r   c                    s^   t    tj|||d| _t|| _tjdd| _||kr*tj||dd| _	d S d | _	d S )Nr   Tr   F)
r   r   r   r   dense	LayerNormnormSiLU
activationskip)r   r   r   r   r   r!   r"   r   m   s   

zResBlock.__init__r#   r$   c                 C   sB   |}|  |}| |}| jdur| |}||7 }| |}|S )z
        Forward pass through the residual block.

        Args:
            x (torch.Tensor): Input tensor.

        Returns:
            torch.Tensor: Output tensor.
        N)r5   r7   r:   r9   )r   r#   identityoutr!   r!   r"   r&   y   s   





zResBlock.forward)T)r(   r)   r*   r+   r,   r-   r   r/   r0   r&   r3   r!   r!   r   r"   r4   c   s    	r4   )typingr   r   r   r   r/   torch.nnr   r,   r-   r2   r.   r   r4   r!   r!   r!   r"   <module>   s   $M