o
    EiA)                  
   @   s   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ejdddfd	e
ejejf d
ee dee dee fddZejjj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)current_module)AnyCallableLiteralOptionalhaikuhkc                   @   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 }t|dr|j}nd}|| _|| _d S )Ndtypefloat32)nameinitr   hasattrr   
param_type)selfr   r   r   r   module r   J/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/einx/nn/haiku.py__init__   s   

zParamFactory.Concrete.__init__c                 C   s   d t | j| j| j| jfS N)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   s   || _ || _|| _|| _d S r   )r   r   r   r   )r   r   r   r   r   r   r   r   r      s   
zParamFactory.CacheKey.__init__c                 C   s   t | j| j| j| jfS r   )hashr   r   r   r   r   r   r   r   __hash__$   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   d t | j| j| j| j|fS r   )r
   Tracerr   r   r   r   )r   backendvirtual_argr   r   r   	to_tracer0   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   s"   || _ || _|| _|| _|| _d S r   )r   r   r   r   	depend_on)r   r   r   r   r   r(   r   r   r   r   7   s
   
zParamFactory.Tracer.__init__c                 C   sh  | 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v sG|dkrOtjj	dd	}n<|d
krZtj
d}n1|dkretj
d}n&|dkrvtjjddd|d d}ntd| dt|ttfrtj
|}| jdkrtj}n| jdkrtj}nJ tjj|||||dtj|| jgdS )Nr   r   r   z=Must specify name for tensor factory hk.get_{parameter|state}z=Must specify init for tensor factory hk.get_{parameter|state}get_at	rearrangeg{Gz?)stddevaddg        multiplyg      ?dotfan_intruncated_normalin_axis)fan_in_axesz3Don't know which initializer to use for operation ''	parameterstateF)shaper   r   r   )kwargsoutputr(   )r   getr   r   
ValueErrorr!   strthkinitializersRandomNormalConstantVarianceScalingintfloatr   get_parameter	get_stateeinxtracerapplyTensorr(   )r   r6   r7   r   r   r   funcr   r   r   __call__>   s@   



zParamFactory.Tracer.__call__N)r   r   r   r   rJ   r   r   r   r   r$   6   s    r$   N)r   r   r   rE   rF   inputInputr   r   TensorFactoryr$   r   r   r   r   r
   
   s    r
   rI   r   r   r   c                 C   s@   | t jkrd}n| t jkrd}ntd|  dt||||S )a  Create a tensor factory for Haiku parameters.

    Args:
        func: Either ``hk.get_parameter`` or ``hk.get_state``. Defaults to ``hk.get_parameter``.
        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.
    r4   r5   zUnknown parameter function 'r3   )r	   rC   rD   r:   r
   r   )rI   r   r   r   r   r   r   r   paramg   s   

rN   c                 C   s4   t | t tjkst | t tjkrt|  S d S r   )idr	   rC   rD   rN   r   )xr   r   r   tensor_factory   s   $rQ   c                       sz   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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``.
        name: Name of the module. Defaults to ``None``.
        **kwargs: Additional parameters that specify values for single axes, e.g. ``a=4``.
    b... [c]Th㈵>r   Nstatsparamsmeanvarscalebiasepsilonfastvarr   
decay_rater   r7   c                    sT   t  j|d || _|| _|| _|| _|| _|| _|| _|| _	|	| _
|
| _|| _d S Nr   )superr   rU   rV   rW   rX   rY   rZ   r[   r\   r   r]   r7   )r   rU   rV   rW   rX   rY   rZ   r[   r\   r   r]   r   r7   	__class__r   r   r      s   
zNorm.__init__c              	   C   s<  | j d ur|d u rtd| j d uo| pt }tjj|| j| jf|r.| j	r.t
tjddn| j	|r<| jr<t
tjddn| j| jrHt
tjddnd | jrSt
tjddnd | j| jd| j\}}}| j d uom|omt  }|r| j	rtdtd| j  |d| j     | jrtdtd| j  |d| j     |S )	Nz2training must be specified when decay_rate is usedrW   r_   rX   rY   rZ   )rW   rX   rY   rZ   r[   r\      )r]   r:   r	   running_initrE   nnnormrU   rV   rW   rN   rD   rX   rY   rC   rZ   r[   r\   r7   	set_state)r   rP   traininguse_emarW   rX   
update_emar   r   r   rJ      s8   
zNorm.__call__)
rS   TTTTrT   Tr   NNr   )r   r   r   __doc__r;   boolrB   r   r   r   rJ   __classcell__r   r   ra   r   rR      sL    	
rR   c                       sJ   e Zd ZdZ			ddededede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"``.
        name: Name of the module. Defaults to ``None``.
        **kwargs: Additional parameters that specify values for single axes, e.g. ``a=4``.
    Tr   NexprrZ   r   r   r7   c                    s*   t  j|d || _|| _|| _|| _d S r^   )r`   r   ro   rZ   r   r7   )r   ro   rZ   r   r   r7   ra   r   r   r      s
   
zLinear.__init__c                 C   s>   t jj|| jf| jrttjddnd ttjddd| jS )NrZ   r_   weight)rZ   rp   )	rE   re   linearro   rZ   rN   r	   rC   r7   )r   rP   r   r   r   rJ      s   zLinear.__call__)Tr   N)r   r   r   rk   r;   rl   r   r   r   rJ   rm   r   r   ra   r   rn      s"    rn   c                	       s@   e Zd ZdZddededee def fddZd	d
 Z	  Z
S )DropoutaV  Dropout layer.

    Args:
        expr: Einstein string determining the axes along which dropout is applied. Will be
            passed to ``einx.elementwise``.
        drop_rate: Drop rate.
        name: Name of the module. Defaults to ``None``.
        **kwargs: Additional parameters that specify values for single axes, e.g. ``a=4``.
    Nro   	drop_rater   r7   c                    s$   t  j|d || _|| _|| _d S r^   )r`   r   ro   rs   r7   )r   ro   rs   r   r7   ra   r   r   r     s   
zDropout.__init__c                 C   s.   |rt jj|| jf| jt d| jS |S )N)rs   rng)rE   re   dropoutro   rs   r	   next_rng_keyr7   )r   rP   rh   r   r   r   rJ     s   zDropout.__call__r   )r   r   r   rk   r;   rB   r   r   r   rJ   rm   r   r   ra   r   rr     s    $
rr   )r   r	   rE   	functoolsr   haiku._src.baser   typingr   r   r   r   rF   import_r<   r
   rC   rD   r;   rN   rK   register_tensor_factoryrQ   ModulerR   rn   rr   r   r   r   r   <module>   s2    ^

R$