o
    EiX+                     @   sL  d dl Z d dlZd dlZd dlmZ d dlZd dlmZm	Z	m
Z
mZ edd e jddd D Zedk r?ed	e j d
d ZejdZG dd dZ	d!de	e jjje jjje jjjf de
e fddZejjjdd ZG dd de jjZ edd Z!G dd de jjZ"edd Z#G dd de jjZ$edd  Z%dS )"    N)partial)CallableUnionOptionalAnyc                 c   s    | ]}t |V  qd S N)int.0i r   J/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/einx/nn/torch.py	<genexpr>   s    r   .   )r   r   z7einx.nn.torch requires PyTorch version >= 2, but found c                 C   s.   dt tv rtj| S dd lm} || S )Ncompilerr   )dirtorchr   allow_in_graphtorch._dynamo_dynamo)funcr   r   r   r   _allow_in_graph   s   
r   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 S r   )paraminit)selfr   r   r   r   r   __init__   s   
zParamFactory.Concrete.__init__c                 C   s   | j t| jfS r   )r   r   CacheKeyr   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   #      
zParamFactory.CacheKey.__init__c                 C   s
   t | jS r   )hashr   r    r   r   r   __hash__&   r)   zParamFactory.CacheKey.__hash__c                 C   s   t |tjo| j|jkS r   )
isinstancer   r   r   )r   otherr   r   r   __eq__)      zParamFactory.CacheKey.__eq__c                 C   s   t | j}||fS r   )r   Tracerr   )r   backendvirtual_argxr   r   r   	to_tracer,   s   zParamFactory.CacheKey.to_tracerN)r"   r#   r$   r   r+   r.   r4   r   r   r   r   r   "   s
    r   c                   @   r   )zParamFactory.Tracerc                 C   r&   r   r'   r(   r   r   r   r   1   r)   zParamFactory.Tracer.__init__c                    s\  | j d ur| j n|dd }| }tj }tjj|j g|||fgd}|d u r-tdt|t	r|dks:|dkrDt
tjj jdd}nT|dkrNtjj j}nJ|d	krXtjj j}n@|d
krt fdd|d D }td| d }t
tjj jd|ddd}ntd| dt|ttfrt
tjj j|d}tj }tjj||g|||fgd}|S )Nr   )argsoutputinplace_updateszFMust specify init for tensor factory torch.nn.parameter.Uninitialized*get_at	rearrangeg{Gz?)stdaddmultiplydotc                    s   g | ]} | qS r   r   r	   shaper   r   
<listcomp>M   s    z0ParamFactory.Tracer.__call__.<locals>.<listcomp>in_axisg      ?g۶%?g        g       g       @)meanr:   abz3Don't know which initializer to use for operation '')val)r   geteinxtracerTensorapplymaterialize
ValueErrorr,   strr   ttorchnnnormal_zeros_ones_npprodsqrttrunc_normal_r   float	constant_)r   r?   kwargsr   r3   r6   fan_inr:   r   r>   r   __call__4   sF   
zParamFactory.Tracer.__call__N)r"   r#   r$   r   r\   r   r   r   r   r0   0   s    r0   N)r"   r#   r$   rH   rI   inputInputr%   r   TensorFactoryr0   r   r   r   r   r      s    r   r3   r   c                 C   s8   t | tjjjtjjjfrt | tjjst	| |S | S )a  Create a tensor factory for an uninitialized PyTorch parameter or buffer.

    If the given parameter is not initialized, this returns a tensor factory that calls
    the ``materialize`` method of ``uninitialized`` with the given shape and returns
    ``uninitialized``. Otherwise, the parameter is returned as is.

    Args:
        x: An instance of ``torch.nn.parameter.UninitializedParameter``,
            ``torch.nn.parameter.UninitializedBuffer`` or ``torch.nn.parameter.Parameter``.
        init: Initializer for the parameter. If ``None``, uses a default init method determined
            from the calling operation. Defaults to ``None``.

    Returns:
        A tensor factory with the given default parameters, or the parameter itself if it is
        already materialized.
    )
r,   r   rP   	parameterUninitializedParameterUninitializedBuffer_subclasses
FakeTensorr   r%   )r3   r   r   r   r   r   `   s   r   c                 C   s8   t | tjjjtjjjfrt | tjjst| 	 S d S r   )
r,   r   rP   r`   ra   rb   rc   rd   r   r!   )r3   r   r   r   tensor_factory   s   re   c                       sx   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ej	ef de
e def fddZ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㈵>float32NstatsparamsrB   varscalebiasepsilonfastvardtype
decay_raterZ   c                    s   t    || _|| _|| _|| _|| _|| _|
| _|| _	|r4|
d ur4| 
dtjjjtt|	 d nd | _|rN|
d urN| 
dtjjjtt|	 d nd | _|r_tjjjtt|	 dnd | _|rptjjjtt|	 dnd | _d| _d S )NrB   rq   rl   F)superr   rj   rk   use_meanuse_varro   rp   rr   rZ   register_bufferr   rP   r`   rb   varsrB   rl   ra   rm   rn   initialized)r   rj   rk   rB   rl   rm   rn   ro   rp   rq   rr   rZ   	__class__r   r   r      s0   

zNorm.__init__c                 C   s*  | j d uo| j p| j }t|| j| j|r| jr| jn| j|r%| jr%| j	n| j| j
d ur/| j
nd | jd ur8| jnd | j| j| jd
\}}}| j d uoL| j}|rt 2 |d uri| j| j | j d| j  |   |d ur~| j	| j | j	 d| j  |   W d    n1 sw   Y  | jsd| _|S )N)rB   rl   rm   rn   ro   rp   rZ      T)rr   trainingry   _normrj   rk   ru   rB   rv   rl   rm   rn   ro   rp   rZ   r   no_gradcopy_)r   r3   use_emarB   rl   
update_emar   r   r   forward   s2   
""zNorm.forward)	rg   TTTTrh   Tri   N)r"   r#   r$   __doc__rN   boolrX   r   r   rq   r   r   r   r   __classcell__r   r   rz   r   rf      sF    	
-rf   c
           
      C   sR   | j  tjj| ||f||||||dd|	W  d    S 1 s"w   Y  d S )Nr   )rB   rl   rm   rn   ro   rp   r1   )devicerH   rP   norm)
r3   rj   rk   rB   rl   rm   rn   ro   rp   rZ   r   r   r   r~      s"   $r~   c                	       sJ   e Zd ZdZ		ddededeejef 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``.
    Tri   exprrn   rq   rZ   c                    sZ   t    tjjjtt| d| _|r"tjjjtt| d| _nd | _|| _	|| _
d S )Nrs   )rt   r   r   rP   r`   ra   rx   weightrn   r   rZ   )r   r   rn   rq   rZ   rz   r   r   r     s   

zLinear.__init__c                 C   s   t || j| j| j| jS r   )_linearr   r   rn   rZ   r   r3   r   r   r   r     r/   zLinear.forward)Tri   )r"   r#   r$   r   rN   r   r   r   rq   r   r   r   r   r   r   rz   r   r      s    r   c                 C   sH   | j  tjj| |||fddi|W  d    S 1 sw   Y  d S )Nr1   r   )r   rH   rP   linear)r3   r   r   rn   rZ   r   r   r   r     s   $r   c                       s6   e Zd ZdZdededef fddZ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_raterZ   c                    s    t    || _|| _|| _d S r   )rt   r   r   r   rZ   )r   r   r   rZ   rz   r   r   r   3  s   

zDropout.__init__c                 C   s   | j rt|| j| j| jS |S r   )r}   _dropoutr   r   rZ   r   r   r   r   r   :  s   zDropout.forward)
r"   r#   r$   r   rN   rX   r   r   r   r   r   r   rz   r   r   )  s    	r   c                 C   sF   | j  tjj| |f|dd|W  d    S 1 sw   Y  d S )Nr   )r   r1   )r   rH   rP   dropout)r3   r   r   rZ   r   r   r   r   A  s   $r   r   )&r   rH   math	functoolsr   numpyrT   typingr   r   r   r   tuple__version__split_versionImportErrorr   rI   import_rO   r   rP   r`   ra   rb   	Parameterr   r]   register_tensor_factoryre   Modulerf   r~   r   r   r   r   r   r   r   r   <module>   sD    "	M
#
	\
!
