o
    }oi                  
   @   sF  d dl Z d dlZd dlZd dlmZmZ e eZd dl	Z	d dl
Z
d dlmZ g dZejejejejejejejdZdedee fddZd	d
 ZdedefddZdedefddZdd Zd*ddZde
jde
jfddZG dd dejZe
j j!d+d!e
jd"e
jd#e"de
jfd$d%Z#G d&d' d'ejZ$G d(d) d)ejZ%dS ),    N)IterableList)if_exist_compute_softmaxflatten)identityhardtanhreluseluswishsilugeluoutfoldfilesc                 C   s:   t j| sdS |D ]}t j|  d| s dS q
dS )z
    Returns true if all given files exist in the given folder
    Args:
        outfold: folder path
        files: list of file names relative to outfold
    F/T)ospathexists)r   r   file r   W/home/ubuntu/.local/lib/python3.10/site-packages/nemo/collections/common/parts/utils.pyr   (   s   r   c                 C   s|   | sg S d}| D ]}|du s||kr|}qg }d}| D ]}t || }|| ||7 }qg }|D ]	}|||  q2|S )z,Compute softmax probability over raw logits.Ng        )mathexpappend)scores	max_scorescore
exp_scores	total_sumxprobsr   r   r   r   7   s"   

r   iterreturnc                 c   s:    | D ]}t |tst |ts|V  qt|E dH  qdS )zFlatten an iterable which contains values or
    iterables with values.

    Args:
        iter: iterable containing values at the deepest level.

    Returns:
        A flat iterable containing values.
    N)
isinstancestrr   flatten_iterable)r!   itr   r   r   r%   N   s   
r%   list_inc                 C   s   t t| S )zFlatten a list of (nested lists of) values into a flat list.

    Args:
        list_in: list of values, possibly nested

    Returns:
        A flat list of values.
    )listr%   )r'   r   r   r   r   _   s   	r   c                 C   s$   | j }| j j}t|||fi | _ dS )z/Apply mixins to a class instance after creationN)	__class____name__type)objmixinbase_clsbase_cls_namer   r   r   extend_instancek   s
   

r0                c                 C   s   t d || }|| }g }| D ]>}dtj | }	|	|k r$|| q|	|kr0|||  q||ks6J ||	 | ||  }
|d|
 | | |
|   qtj|| j| jdS )Nzapply rope scaling ...   r2   dtypedevice)	loggerinfor   pir   torchtensorr7   r8   )freqsscale_factorlow_freq_factorhigh_freq_factorold_context_lenlow_freq_wavelenhigh_freq_wavelen	new_freqsfreqwavelensmoothr   r   r   apply_rope_scalingt   s   
 rI   r=   lengthsc                 C   s   | j ^}}}t| j dkr)tj|||j|jdjdd}|t|dk}| | S t| j dkrLtj|d||j|jdjdd}|t|dk}| | S t| j d	krptj|dd||j|jdjdd}|t|d
k}| | S t	d)z
    For tensors containing sequences, zero out out-of-bound elements given lengths of every element in the batch.

    tensor: tensor of shape (B, L), (B, D, L) or (B, D1, D2, L),
    lengths: LongTensor of shape (B,)
    r5   r6   dimzB -> B 1   r2   z
B -> B 1 1r3   zB -> B 1 1 1zCCan only mask tensors of shape B x L, B x D x L and B x D1 x D2 x L)
shapelenr<   onesr7   r8   cumsumeinops	rearrange
ValueError)r=   rJ   
batch_size_max_lengthsmaskr   r   r   mask_sequence_tensor   s   
 "rZ   c                       s>   e Zd Zddedef fddZdejdejfd	d
Z  ZS )ClampActivation            ?	min_value	max_valuec                    s   t    || _|| _d S N)super__init__r^   r_   )selfr^   r_   r)   r   r   rb      s   

zClampActivation.__init__inputr"   c                 C   s   t j|| j| jdS )N)minmax)r<   clampr^   r_   )rc   re   r   r   r   forward   s   zClampActivation.forward)r\   r]   )	r*   
__module____qualname__floatrb   r<   Tensorri   __classcell__r   r   rd   r   r[      s    r[   &.>r   alphaepsc                 C   sN   | j }| |d |d d} | ||  t||  d  } | |} | S )zY
    equation for snake activation function: x + (alpha + eps)^-1 * sin(alpha * x)^2
    r   r2   rK   r5   )rO   reshape
reciprocalr<   sinpow)r   rp   rq   rO   r   r   r   snake   s
   $
rv   c                       <   e Zd ZdZdef fddZdejdejfddZ  Z	S )	SnakezT
    Snake activation function introduced in 'https://arxiv.org/abs/2006.08195'
    channelsc                    s$   t    ttd|d| _d S )Nr2   )ra   rb   nn	Parameterr<   rQ   rp   rc   ry   rd   r   r   rb      s   
zSnake.__init__r   r"   c                 C   s   t || jS r`   )rv   rp   )rc   r   r   r   r   ri      s   zSnake.forward
r*   rj   rk   __doc__intrb   r<   rm   ri   rn   r   r   rd   r   rx      s    rx   c                       rw   )		HalfSnakezo
    Activation which applies snake to the first half of input elements and leaky relu to the second half.
    ry   c                    s0   t    |d | _t| j| _tj | _d S )Nr5   )	ra   rb   snake_channelsrx   	snake_actr<   rz   	LeakyReLUlrelur|   rd   r   r   rb      s   

zHalfSnake.__init__r   r"   c                 C   sZ   |  |d d d | jd d f }| |d d | jd d d f }tj||gdd}|S )Nr2   rL   )r   r   r   r<   cat)rc   r   	snake_out	lrelu_outoutr   r   r   ri      s   ""zHalfSnake.forwardr}   r   r   rd   r   r      s    r   )r1   r2   r3   r4   )ro   )&loggingr   r   typingr   r   	getLoggerr*   r9   rS   r<   torch.nnrz   __all__IdentityHardtanhReLUSELUSiLUGELUactivation_registryr$   r   r   r%   r   r0   rI   rm   rZ   Moduler[   jitscriptrl   rv   rx   r   r   r   r   r   <module>   s:   

	$