o
    }oi{                     @   s,   d dl mZ d dlZG dd dejjZdS )    )OptionalNc                       sp   e Zd ZdZ				ddededed	ed
edee f fddZe	dd Z
ddeej dejfddZ  ZS )MultiLayerPerceptrona  
    A simple MLP that can either be used independently or put on top
    of pretrained models (such as BERT) and act as a classifier.
    Args:
        hidden_size (int): the size of each layer
        num_classes (int): number of output classes
        num_layers (int): number of layers
        activation (str): type of activations for layers in between
        log_softmax (bool): whether to add a log_softmax layer before output
       reluTNhidden_sizenum_classes
num_layers
activationlog_softmaxchannel_idxc           	         s   t    d| _t|d D ])}tj||}t| d| j | t| d| jd  tt| |  jd7  _qtj||}t| d| j | |  jd7  _|| _	|| _
d S )Nr      layerr   )super__init__layersrangetorchnnLinearsetattrgetattrr
   r   )	selfr   r   r   r	   r
   r   _r   	__class__ h/home/ubuntu/.local/lib/python3.10/site-packages/nemo/collections/common/parts/multi_layer_perceptron.pyr      s   
	
zMultiLayerPerceptron.__init__c                 C   s   t | d| jd  S )Nr   r   )r   r   )r   r   r   r   last_linear_layer5   s   z&MultiLayerPerceptron.last_linear_layerhidden_statesreturnc                 K   s   |du rd|v r|d }nd|v r|d }nt d| jdur'|d| j}n|}t| jD ]}t| d| |}q.| jrEtj|dd}| jdurQ|d| j}|S )zs
        Multi-layer perceptron forward function compatible with multiple types of input keyword arguments
        Naudio_signalencoder_outputzNo input tensor foundr   )dim)
ValueErrorr   	transposer   r   r   r
   r   )r   r   kwargsoutput_statesir   r   r   forward9   s    



zMultiLayerPerceptron.forward)r   r   TN)N)__name__
__module____qualname____doc__intstrboolr   r   propertyr   r   Tensorr)   __classcell__r   r   r   r   r      s,    
$r   )typingr   r   r   Moduler   r   r   r   r   <module>   s   