
    GJjt                     R    d dl Z d dlmZ d dlmZ d dlmZ d dlm	Z	  G d de      Z
y)    N)Optional)Module)QuantizedEmbeddingc            	       l     e Zd ZdZdedef fdZd Zd Zd Z	 	 	 	 dde	e   d	e	e   d
e
defdZ xZS )	Embeddingav  Implements a simple lookup table that maps each input integer to a
    high-dimensional vector.

    Typically used to embed discrete tokens for processing by neural networks.

    Args:
        num_embeddings (int): How many possible discrete tokens can we embed.
           Usually called the vocabulary size.
        dims (int): The dimensionality of the embeddings.
    num_embeddingsdimsc                     t         |           t        j                  d|z        }t        j
                  j                  ||f|      | _        y )N   )shapescale)super__init__mathsqrtmxrandomnormalweight)selfr   r	   r   	__class__s       a/Users/ahmed/devFolder/claude-voice/.venv/lib/python3.12/site-packages/mlx/nn/layers/embedding.pyr   zEmbedding.__init__   s@    		!d(#ii&&nd-C5&Q    c                 l    | j                   j                  d    d| j                   j                  d    S )Nr   z, r   )r   r   )r   s    r   _extra_reprzEmbedding._extra_repr   s3    ++##A&'r$++*;*;A*>)?@@r   c                      | j                   |   S )N)r   r   xs     r   __call__zEmbedding.__call__   s    {{1~r   c                 4    || j                   j                  z  S )z
        Call the embedding layer as a linear layer.

        Use this for example when input embedding and output projection
        weights are tied.
        )r   Tr   s     r   	as_linearzEmbedding.as_linear"   s     4;;==  r   
group_sizebitsmodequantize_inputc                 L    |rt        d      t        j                  | |||      S )zPReturn a :obj:`QuantizedEmbedding` layer that approximates this embedding layer.z!Quantized input is not supported.)
ValueErrorr   from_embedding)r   r#   r$   r%   r&   s        r   to_quantizedzEmbedding.to_quantized+   s*     @AA!00z4NNr   )NNaffineF)__name__
__module____qualname____doc__intr   r   r   r"   r   strboolr*   __classcell__)r   s   @r   r   r      st    	Rs R# R
A! %)"$
OSM
O sm
O 	
O
 
Or   r   )r   typingr   mlx.corecorer   mlx.nn.layers.baser   mlx.nn.layers.quantizedr   r    r   r   <module>r:      s$       % 6*O *Or   