o
    EiR2                     @   s  d dl m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mZ ejddZG dd dZ				d/deeejf d	ee d
ee deejj dee f
ddZejjjdd ZG dd dejZ										d0dededededededee dededejjd	ee d efd!d"ZG d#d$ d$ejZ			d1d%ededejjd	ee d ef
d&d'Z G d(d) d)ejZ!	*	d2d%ed+ed,ed	ee d ef
d-d.Z"dS )3    N)partial)CallableUnionOptionalAnyz
flax.linennnc                   @   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kr+|d ur*tdn|dkr8|d u r7tdntd| || _d S )Ndtypefloat32paramz/col is not accepted for flax.linen.Module.paramvariablez4col must be specified for flax.linen.Module.variablez)Unknown tensor factory flax.linen.Module.)modulenameinithasattrr
   col
ValueError
param_type)selfr   r   r   r
   r   r    r   I/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/einx/nn/flax.py__init__   s&   

zParamFactory.Concrete.__init__c                 C   s"   | j t| j| j| j| j| jfS N)r   r   CacheKeyr   r   r
   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   r   r   r   r   +   
   
zParamFactory.CacheKey.__init__c                 C   s   t | j| j| j| j| jfS r   )hashr   r   r
   r   r   r   r   r   r   __hash__2   s   zParamFactory.CacheKey.__hash__c                 C   sH   t |tjo#| j|jko#| j|jko#| j|jko#| j|jko#| j|jkS r   )
isinstancer   r   r   r   r
   r   r   )r   otherr   r   r   __eq__5   s   




zParamFactory.CacheKey.__eq__c                 C   s$   t | j| j| j| j| j}||fS r   )r   Tracerr   r   r
   r   r   )r   backendvirtual_argxr   r   r   	to_tracer?   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   D   r$   zParamFactory.Tracer.__init__c                 C   s  | j d ur| j n|dd }| jd ur| jn|dd }| jd ur$| jn|dd }| j}|d u r5td|d u r=tdt|tr|dksJ|dkrRtj	j
dd	}n>|d
kr\tj	 }n4|dkrftj	 }n*|dkrytj	|d |d |d }ntd| dt|ttfrtj	j||d}| jdkrtjj| j||||gtj|d}|S | jdksJ tjj| j|||d ||gd}tjjtj |dgtj|d}|S )Nr   r   r
   zGMust specify name for tensor factory flax.linen.Module.{param|variable}zGMust specify init for tensor factory flax.linen.Module.{param|variable}get_at	rearrangeg{Gz?)stddevaddmultiplydotin_axisout_axis
batch_axisz3Don't know which initializer to use for operation '')r
   r   )argsoutputr   )r9   value)r   getr   r
   r   r   r'   strtnninitializersnormal
zeros_init	ones_initlecun_normalintfloatconstantr   einxtracerapplyr   Tensorr   MemberAccess)r   shapekwargsr   r   r
   r   r-   r   r   r   __call__K   sP   

zParamFactory.Tracer.__call__N)r   r   r   r   rN   r   r   r   r   r*   C   s    r*   N)r   r   r   rG   rH   inputInputr    r   TensorFactoryr*   r   r   r   r   r      s    r   r-   r   r   r
   r   c                 C   sz   t | dr| jtjjkr| j}d}n!t | dr$| jtjjkr$| j}d}nt| tjr/| }d}ntdt	
||||||S )av  Create a tensor factory for Flax parameters.

    Args:
        x: The bound method of a Flax module, i.e. ``nn.Module.param`` or
            ``nn.Module.variable``, or a module instance in which case its ``param`` method
            is used.
        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``.
        col: The collection name to use when ``bound_method`` is ``nn.Module.variable``.

    Returns:
        A tensor factory with the given default parameters.
    __func__r   r   zCx must be a bound method of a Flax module or a Flax module instance)r   rR   r   Moduler   __self__r   r'   r   r   r    )r-   r   r   r
   r   r   r   r   r   r   r   {   s   r   c                 C   sB   t | tjst| dr| jtjjks| jtjjkrt|  S d S )NrR   )r'   r   rS   r   rR   r   r   r   )r-   r   r   r   tensor_factory   s   rU   c                   @   s   e Zd ZU eed< dZeed< dZeed< dZeed< dZ	eed< dZ
eed< d	Zeed
< dZeed< dZeed< dZejjed< d	Zeed< ejdddZd	S )_Normstatsb... [c]paramsTmeanvarscalebiasN
decay_rateh㈵>epsilonfastvarr   r
   rM   c           	   
   C   sf  | j d ur|d u rtd| j d uo| p|  }tjj|| j| jf|r1| jr1t	| j
dd| jdn| j|rB| jrBt	| j
dd| jdn| j| jrPt	| j	d| jdnd | jr]t	| j	d| jdnd | j| jd	| jd url| jni \}}}| j d uo~|o~|   }|r| jr| 
ddd }| j |j d
| j  |  |_| jr| 
ddd }| j |j d
| j  |  |_|S )Nz2training must be specified when decay_rate is usedrW   rZ   )r   r   r
   r[   r\   r   r
   r]   )rZ   r[   r\   r]   r`   ra      )r^   r   is_initializingrG   r   normrW   rY   rZ   r   r   r
   r[   r\   r]   r`   ra   rM   r;   )	r   r-   traininguse_emarZ   r[   
update_emamean_emavar_emar   r   r   rN      sD   z_Norm.__call__r   )r   r   r   r=   __annotations__rY   rZ   boolr[   r\   r]   r^   rE   r`   ra   r
   r   dtypesDtyperM   dictcompactrN   r   r   r   r   rV      s   
 rV   rX   Tr_   r   rW   rY   rZ   r[   r\   r]   r^   r`   ra   rM   c                 K   s    t | |||||||||	|
|dS )a  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``.
        name: Name of the module. Defaults to ``None``.
        **kwargs: Additional parameters that specify values for single axes, e.g. ``a=4``.
    )rY   rZ   r[   r\   r]   r^   r`   ra   r
   r   rM   )rV   )rW   rY   rZ   r[   r\   r]   r^   r`   ra   r
   r   rM   r   r   r   Norm   s   #rq   c                   @   sL   e Zd ZU eed< dZeed< dZej	j
ed< dZeed< ejdd	 ZdS )
_LinearexprTr]   r   r
   NrM   c                 C   sX   t jj|| jf| jrt| jd| jdnd t| jd| jdd| jd ur(| jS i S )Nr]   rb   weight)r]   rt   )rG   r   linearrs   r]   r   r
   rM   )r   r-   r   r   r   rN     s   z_Linear.__call__)r   r   r   r=   rk   r]   rl   r
   r   rm   rn   rM   ro   rp   rN   r   r   r   r   rr     s   
 rr   rs   c                 K      t | ||||dS )a  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"``.
        name: Name of the module. Defaults to ``None``.
        **kwargs: Additional parameters that specify values for single axes, e.g. ``a=4``.
    )r]   r
   r   rM   )rr   )rs   r]   r
   r   rM   r   r   r   Linear&  s   rw   c                   @   sD   e Zd ZU eed< eed< dZeed< dZeed< e	j
dd ZdS )	_Dropoutrs   	drop_ratedropoutrng_collectionNrM   c                 C   sD   |r t jj|| jf| j| | jd| jd ur| jS i S |S )N)ry   rng)rG   r   rz   rs   ry   make_rngr{   rM   )r   r-   rf   r   r   r   rN   A  s   
z_Dropout.__call__)r   r   r   r=   rk   rE   r{   rM   ro   r   rp   rN   r   r   r   r   rx   ;  s   
 rx   rz   ry   r{   c                 K   rv   )a  Dropout layer.

    Args:
        expr: Einstein string determining the axes along which dropout is applied. Will be passed
            to ``einx.elementwise``.
        drop_rate: Drop rate.
        rng_collection: the rng collection name to use when requesting an rng key. Defaults
            to ``"dropout"``.
        name: Name of the module. Defaults to ``None``.
        **kwargs: Additional parameters that specify values for single axes, e.g. ``a=4``.
    )r{   r   rM   )rx   )rs   ry   r{   r   rM   r   r   r   DropoutO  s   r~   )NNNN)
rX   TTTTNr_   Tr   N)Tr   N)rz   N)#
flax.linenlinenr   rG   flax	functoolsr   	jax.numpynumpyjnptypingr   r   r   r   rH   import_r>   r   rS   r=   rm   rn   r   rO   register_tensor_factoryrU   rV   rl   rE   rq   rr   rw   rx   r~   r   r   r   r   <module>   s    r

(
2	

3
