o
    Ei_$                     @   s   d dl Z d dlZd dlZd dlmZ d dlmZ d dl	m
Z
mZmZ e jdZdd ZG dd dZdd	d
ZG dd dejZG dd dejZG dd dejZdS )    N)partial)OptionalCallableAnyjaxc                 C   sR   |t | jv rt | j| d urt | j| }|S || j|| }t | j|< |S N)varsmodulerng)concretenameshapedtypeinittensor r   L/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/einx/nn/equinox.pycreate_or_retrieve   s
    r   c                   @   sL   e Zd ZG dd dejjjZG dd dejjjZG dd dejj	Z
dS )ParamFactoryc                   @      e Zd Zdd Zdd ZdS )zParamFactory.Concretec                 C   s@   || _ || _|| _|d u rt|dr|j}nd}|| _|| _d S )Nr   float32)r	   r   r   hasattrr   r
   )selfr	   r   r   r   r
   r   r   r   __init__   s   

zParamFactory.Concrete.__init__c                 C   s   | t | j| j| jfS r   )r   CacheKeyr   r   r   r   r   r   r   to_value_and_key%   s   z&ParamFactory.Concrete.to_value_and_keyN)__name__
__module____qualname__r   r   r   r   r   r   Concrete   s    r    c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
zParamFactory.CacheKeyc                 C      || _ || _|| _d S r   r   r   r   r   r   r   r   r   r   r   r   )      
zParamFactory.CacheKey.__init__c                 C   s   t | j| j| jfS r   )hashr   r   r   r   r   r   r   __hash__.   s   zParamFactory.CacheKey.__hash__c                 C   s0   t |tjo| j|jko| j|jko| j|jkS r   )
isinstancer   r   r   r   r   )r   otherr   r   r   __eq__1   s   


zParamFactory.CacheKey.__eq__c                 C   s   t | j| j| j}||fS r   )r   Tracerr   r   r   )r   backendvirtual_argxr   r   r   	to_tracer9   s   zParamFactory.CacheKey.to_tracerN)r   r   r   r   r&   r)   r.   r   r   r   r   r   (   s
    r   c                   @   r   )zParamFactory.Tracerc                 C   r!   r   r"   r#   r   r   r   r   >   r$   zParamFactory.Tracer.__init__c                 C   sT  | j d ur| j n|dd }| jd ur| jn|dd }| jd ur$| jn|dd }|d u r2td|d u r:tdt|tr|dksG|dkrPtjj	j
dd	}nH|d
kr^tjj	jd|d}n:|dkrltjj	jd|d}n,|dkrtjj	|d |d |d }ntd| dt|ttfrtjj	j||d}tjjt| ||||gtj|dS )Nr   r   r   z/Must specify name for tensor factory eqx.Modulez/Must specify init for tensor factory eqx.Moduleget_at	rearrangeg{Gz?)stddevaddg        )r   multiplyg      ?dotin_axisout_axis
batch_axisz3Don't know which initializer to use for operation '')argsoutput)r   getr   r   
ValueErrorr'   strtjaxnninitializersnormalconstantlecun_normalintfloateinxtracerapplyr   Tensor)r   r   kwargsr   r   r   r   r   r   __call__C   s4   

zParamFactory.Tracer.__call__N)r   r   r   r   rK   r   r   r   r   r*   =   s    r*   N)r   r   r   rF   rG   inputInputr    r   TensorFactoryr*   r   r   r   r   r      s    r   c                 C   s   t | ||||S )a  Create a tensor factory for Equinox parameters.

    Args:
        module: The module to create the parameter in. Must be an instance of ``eqx.Module``.
        name: Name of the parameter. If ``None``, uses a default name determined from the calling
            operation. Defaults to ``None``.
        init: Initializer for the parameter. If ``None``, uses a default init method determined
            from the calling operation. Defaults to ``None``.
        dtype: Data type of the parameter. If ``None``, uses the ``dtype`` member of the calling
            module or ``float32`` if it does not exist. Defaults to ``None``.

    Returns:
        A tensor factory with the given default parameters.
    )r   r    )r	   r   r   r   r
   r   r   r   paramd   s   rO   c                   @   s   e Zd ZU dZeed< eed< eed< eed< eed< eed< eej	 ed< eej	 ed	< ee
 ed
< e
ed< eed< eed< eed< 									ddededededed	ed
ee
 de
dededefddZdddZdS )Norma  Normalization layer.

    Args:
        stats: Einstein string determining the axes along which mean and variance are computed.
            Will be passed to ``einx.reduce``.
        params: Einstein string determining the axes along which learnable parameters are applied.
            Will be passed to ``einx.elementwise``. Defaults to ``"b... [c]"``.
        mean: Whether to apply mean normalization. Defaults to ``True``.
        var: Whether to apply variance normalization. Defaults to ``True``.
        scale: Whether to apply a learnable scale according to ``params``. Defaults to ``True``.
        bias: Whether to apply a learnable bias according to ``params``. Defaults to ``True``.
        epsilon: A small float added to the variance to avoid division by zero. Defaults
            to ``1e-5``.
        fastvar: Whether to use a fast variance computation. Defaults to ``True``.
        dtype: Data type of the weights. Defaults to ``"float32"``.
        decay_rate: Decay rate for exponential moving average of mean and variance. If ``None``,
            no moving average is applied. Defaults to ``None``.
        **kwargs: Additional parameters that specify values for single axes, e.g. ``a=4``.
    statsparamsmeanvar	use_scaleuse_biasscalebias
decay_rateepsilonfastvarr   rJ   b... [c]TNh㈵>r   c                 K   sb   |d urt d|| _|| _|| _|| _|| _|| _d | _d | _|| _	|| _
|	| _|
| _|| _d S )Nz6Stateful layers are currently not supported in Equinox)r<   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r   rJ   )r   rQ   rR   rS   rT   rW   rX   rY   rZ   r[   r   rJ   r   r   r   r      s   
zNorm.__init__c              
   C   sf   t jj|| j| jf| j| j| jrt| d|dnd | j	r"t| d|dnd | j
| jd| j\}}}|S )NrW   r   r
   rX   )rS   rT   rW   rX   rZ   r[   )rF   r?   normrQ   rR   rS   rT   rU   rO   rV   rZ   r[   rJ   )r   r-   r
   _mean_varr   r   r   rK      s   
zNorm.__call__)	r\   TTTTNr]   Tr   r   )r   r   r   __doc__r=   __annotations__boolr   r   ArrayrE   dictr   r   rK   r   r   r   r   rP   v   s`   
 	

rP   c                	   @   sh   e Zd ZU dZeed< ejed< eej ed< e	ed< e
ed< ddede	d	edefd
dZdddZdS )Lineara  Linear layer.

    Args:
        expr: Einstein string determining the axes along which the weight matrix is multiplied.
            Will be passed to ``einx.dot``.
        bias: Whether to apply a learnable bias. Defaults to ``True``.
        dtype: Data type of the weights. Defaults to ``"float32"``.
        **kwargs: Additional parameters that specify values for single axes, e.g. ``a=4``.
    exprweightrX   rV   rJ   Tr   r   c                 K   s"   || _ || _d | _d | _|| _d S r   )rh   rV   ri   rX   rJ   )r   rh   rX   r   rJ   r   r   r   r      s
   
zLinear.__init__Nc                 C   sB   t jj|| jf| jd urt| d|dnd t| d|dd| jS )NrX   r^   ri   )rX   ri   )rF   r?   linearrh   rV   rO   rJ   r   r-   r
   r   r   r   rK      s   zLinear.__call__)Tr   r   )r   r   r   rb   r=   rc   r   re   r   rd   rf   r   r   rK   r   r   r   r   rg      s   
 

rg   c                	   @   sV   e Zd ZU dZeed< eed< eed< eed< ddededede	fddZ
d	d
 ZdS )Dropouta  Dropout layer.

    Args:
        expr: Einstein string determining the axes along which dropout is applied. Will be
            passed to ``einx.elementwise``.
        drop_rate: Drop rate.
        inference: Whether the layer is used in inference mode (i.e. not apply dropout). Defaults
            to ``False``.
        **kwargs: Additional parameters that specify values for single axes, e.g. ``a=4``.
    rh   	drop_raterJ   	inferenceFc                 K   s   || _ || _|| _|| _d S r   )rh   rm   rJ   rn   )r   rh   rm   rn   rJ   r   r   r   r      s   
zDropout.__init__c                 C   s,   | j stjj|| jf| j|d| jS |S )N)rm   r
   )rn   rF   r?   dropoutrh   rm   rJ   rk   r   r   r   rK      s   zDropout.__call__N)F)r   r   r   rb   r=   rc   rE   rf   rd   r   r   rK   r   r   r   r   rl      s   
 rl   )NNNN)rF   r   equinoxeqx	functoolsr   	jax.numpynumpyjnptypingr   r   r   rG   import_r>   r   r   rO   ModulerP   rg   rl   r   r   r   r   <module>   s    
OQ"