o
    Ei)                     @   s  d dl Z d dlZd dlZd dlZd dlmZmZmZ e	dd e j
ddd D Zedk r7ede j
 ejd	Zd
d ZG dd dZ				d de jjdee dee dee def
ddZdd ZG dd de jjZG dd deZG dd deZG dd deZdS )!    N)AnyCallableOptionalc                 c   s    | ]}t |V  qd S N)int.0i r
   J/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/einx/nn/keras.py	<genexpr>   s    r   .   )   r   z5einx.nn.keras requires Keras version >= 3, but found kerasc                 C   s@   |t | v rt | | }|S | j|||||d }t | |< |S )N)shapedtypeinitializername	trainable)vars
add_weight)layerr   r   r   initr   tensorr
   r
   r   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   | j t| j| j| j| jfS r   )r   r   CacheKeyr   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!   3      
zParamFactory.CacheKey.__init__c                 C   s   t | j| j| j| jfS r   )hashr   r   r   r   r#   r
   r
   r   __hash__9   s   zParamFactory.CacheKey.__hash__c                 C   s<   t |tj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    otherr
   r
   r   __eq__<   s   



zParamFactory.CacheKey.__eq__c                 C   s    t | j| j| j| j}||fS r   )r   Tracerr   r   r   r   )r    backendvirtual_argxr
   r
   r   	to_tracerE   s   zParamFactory.CacheKey.to_tracerN)r%   r&   r'   r!   r.   r1   r6   r
   r
   r
   r   r"   2   s
    	r"   c                   @   r   )zParamFactory.Tracerc                 C   r)   r   r*   r+   r
   r
   r   r!   J   r,   zParamFactory.Tracer.__init__c                    sd  | 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rOtjj	dd	}nO|d
krZtj
d}nD|dkretj
d}n9|dkrt fdd|d D }td| d }tjj	d|d}ntd| dt|ttfrtj
|}tjjt| | ||| jgtj dS )Nr   r   r   z7Must specify name for tensor factory keras.layers.Layerz7Must specify init for tensor factory keras.layers.Layerget_at	rearrangeg{Gz?)stddevaddg        multiplyg      ?dotc                    s   g | ]} | qS r
   r
   r   r   r
   r   
<listcomp>b   s    z0ParamFactory.Tracer.__call__.<locals>.<listcomp>in_axisg۶%?)meanr9   z3Don't know which initializer to use for operation '')argsoutput)r   getr   r   
ValueErrorr/   strtkerasinitializersTruncatedNormalConstantnpprodsqrtr   floateinxtracerapplyr   r   Tensor)r    r   kwargsr   r   r   fan_instdr
   r=   r   __call__P   s4   

zParamFactory.Tracer.__call__N)r%   r&   r'   r!   rV   r
   r
   r
   r   r2   I   s    r2   N)r%   r&   r'   rO   rP   inputInputr(   r"   TensorFactoryr2   r
   r
   r
   r   r      s    r   Tr   r   r   r   r   c                 C   s   t | ||||S )a  Create a tensor factory for Keras parameters.

    Args:
        layer: The layer to create the parameter in. Must be an instance of ``keras.layers.Layer``.
        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``.
        trainable: Whether the parameter is trainable. Defaults to ``True``.

    Returns:
        A tensor factory with the given default parameters.
    )r   r(   )r   r   r   r   r   r
   r
   r   paramq   s   rZ   c                 C   s   t | totdd | D S )Nc                 s   s    | ]}t |tV  qd S r   )r/   r   )r   yr
   r
   r   r      s    zis_leaf.<locals>.<genexpr>)r/   tupleall)r5   r
   r
   r   is_leaf   s   r^   c                       s$   e Zd Z fddZdd Z  ZS )Layerc                    s   t  j|i | d S r   )superr!   )r    rB   rS   	__class__r
   r   r!      s   zLayer.__init__c                 C   sH   t jjdd |td}dt| jjv r| j|dd d S | | d S )Nc                 S   s   t jj| ddS )Nr   r   )r   opszerosr=   r
   r
   r   <lambda>   s    zLayer.build.<locals>.<lambda>)r^   is_initializingT)rg   )rO   	tree_utiltree_mapr^   inspect	signaturecall
parameters)r    inputs_shapetracersr
   r
   r   build   s   
zLayer.build)r%   r&   r'   r!   rp   __classcell__r
   r
   ra   r   r_      s    r_   c                       sp   e Zd ZdZ									ddeded	ed
ededededededee def fddZ	dddZ
  Z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``.
    b... [c]Th㈵>r   Nstatsparamsr@   varscalebiasepsilonfastvarr   
decay_raterS   c                    sN   t  j|	d || _|| _|| _|| _|| _|| _|| _|| _	|
| _
|| _d S Nrc   )r`   r!   ru   rv   use_meanuse_var	use_scaleuse_biasrz   r{   r|   rS   )r    ru   rv   r@   rw   rx   ry   rz   r{   r   r|   rS   ra   r
   r   r!      s   
zNorm.__init__Fc              
   C   s@  | j d uo	| p	|}tjj|| j| jf|r| jrt| dddn| j|r-| jr-t| dddn| j| j	r9t| dddnd | j
rDt| dddnd | j| jd| jd urS| jni \}}}| j d uoc|oc| }|r| jr| jtj| j | jj d	| j  |  | jj | jr| jtj| j | jj d	| j  |  | jj |S )
Nr@   F)r   r   rw   rx   Try   )r@   rw   rx   ry   rz   r{      )r|   rO   nnnormru   rv   r~   rZ   r   r   r   rz   r{   rS   r@   assignr   rd   castvaluer   rw   )r    r5   trainingrg   use_emar@   rw   
update_emar
   r
   r   rl      sP   z	Norm.call)	rs   TTTTrt   Tr   N)NF)r%   r&   r'   __doc__rF   boolrN   r   r   r!   rl   rq   r
   r
   ra   r   rr      sF    	
rr   c                	       s<   e Zd ZdZddedededef fdd	Zd
d Z  Z	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``.
    Tr   exprry   r   rS   c                    s$   t  j|d || _|| _|| _d S r}   )r`   r!   r   r   rS   )r    r   ry   r   rS   ra   r
   r   r!      s   
zLinear.__init__c                 C   s:   t jj|| jf| jrt| ddnd t| ddd| jS )Nry   )r   weight)ry   r   )rO   r   linearr   r   rZ   rS   )r    r5   r
   r
   r   rl     s   
zLinear.call)Tr   )
r%   r&   r'   r   rF   r   r   r!   rl   rq   r
   r
   ra   r   r      s     
r   c                       s8   e Zd ZdZdededef fddZd
dd	Z  Z	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.
        **kwargs: Additional parameters that specify values for single axes, e.g. ``a=4``.
    r   	drop_raterS   c                    s    t    || _|| _|| _d S r   )r`   r!   r   r   rS   )r    r   r   rS   ra   r
   r   r!     s   

zDropout.__init__Nc                 C   s(   |rt jj|| jfd| ji| jS |S )Nr   )rO   r   dropoutr   r   rS   )r    r5   r   r
   r
   r   rl      s   zDropout.callr   )
r%   r&   r'   r   rF   rN   r   r!   rl   rq   r
   r
   ra   r   r     s    	r   )NNNT)r   rO   rj   numpyrK   typingr   r   r   r\   __version__split_versionImportErrorrP   import_rG   r   r   layersr_   rF   r   rZ   r^   rr   r   r   r
   r
   r
   r   <module>   s>    "V
V