o
    piu                     @   s   d dl Z d dlmZ d dlmZ 					ddejdede	d	e	d
e	de
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        @F      ?	timestepsembedding_dim
freq_shiftmin_timescalemax_timescaleflip_sin_to_cosscalereturnc                 C   s   | j dks	J d|d dksJ d| dt|d }t|| ||  }|ttj|tjd|   }	t| dt|	d }
||
 }|rZtj	t
|t|gdd}ntj	t|t
|gdd}t|t| d |g}|S )	a  Returns the positional encoding (same as Tensor2Tensor).

    Args:
        timesteps: a 1-D Tensor of N indices, one per batch element.
        These may be fractional.
        embedding_dim: The number of output channels.
        min_timescale: The smallest time unit (should probably be 0.0).
        max_timescale: The largest time unit.
    Returns:
        a Tensor of timing signals [N, num_channels]
    r   zTimesteps should be a 1d-array   r   zEmbedding dimension z should be even)dtype)axis)ndimfloatmathlogjnpexparangefloat32expand_dimsconcatenatecossinreshapeshape)r   r   r   r   r	   r
   r   num_timescaleslog_timescale_incrementinv_timescalesembscaled_timesignal r$   ^/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/diffusers/models/embeddings_flax.pyget_sinusoidal_embeddings   s     r&   c                   @   s<   e Zd ZU dZdZeed< ejZ	ej	ed< e
jdd ZdS )FlaxTimestepEmbeddinga.  
    Time step Embedding Module. Learns embeddings for input time steps.

    Args:
        time_embed_dim (`int`, *optional*, defaults to `32`):
                Time step embedding dimension
        dtype (:obj:`jnp.dtype`, *optional*, defaults to jnp.float32):
                Parameters `dtype`
        time_embed_dimr   c                 C   s>   t j| j| jdd|}t |}t j| j| jdd|}|S )Nlinear_1)r   namelinear_2)nnDenser)   r   silu)selftembr$   r$   r%   __call__H   s   
zFlaxTimestepEmbedding.__call__N)__name__
__module____qualname____doc__r)   int__annotations__r   r   r   r-   compactr2   r$   r$   r$   r%   r'   :   s   
 
r'   c                   @   sD   e Zd ZU dZdZeed< dZeed< dZ	e
ed< ejdd	 Zd
S )FlaxTimestepsz
    Wrapper Module for sinusoidal Time step Embeddings as described in https://arxiv.org/abs/2006.11239

    Args:
        dim (`int`, *optional*, defaults to `32`):
                Time step embedding dimension
    r(   dimFr
   r   r   c                 C   s   t || j| j| jdS )N)r   r
   r   )r&   r;   r
   r   )r0   r   r$   r$   r%   r2   ]   s   zFlaxTimesteps.__call__N)r3   r4   r5   r6   r;   r7   r8   r
   boolr   r   r-   r9   r2   r$   r$   r$   r%   r:   P   s   
 r:   )r   r   r   Fr   )r   
flax.linenlinenr-   	jax.numpynumpyr   ndarrayr7   r   r<   r&   Moduler'   r:   r$   r$   r$   r%   <module>   s6   
&