o
    ٷi	                     @   s   d dl mZ d dlmZmZmZ d dlmZ d dl	Z	d dl
mZ ddlmZmZ ddlmZ dZG dd	 d	ejZG d
d dejZG dd dejeZdS )    )field)DictOptionalcastN   )RearrangeMixinReduceMixin)_EinmixMixinzAlex Rogozhnikovc                   @   s@   e Zd ZU eed< eed< eedZeed< dd Zdd Z	d	S )
Reducepattern	reductiondefault_factorysizesc                 C   s   t | j| jfi | j| _d S N)r   r   r   r   reducerself r   F/home/ubuntu/.local/lib/python3.10/site-packages/einops/layers/flax.pysetup   s   zReduce.setupc                 C      | j |S r   )r   _apply_reciper   inputr   r   r   __call__      zReduce.__call__N
__name__
__module____qualname__str__annotations__r   dictr   r   r   r   r   r   r   r
      s   
 r
   c                   @   s8   e Zd ZU eed< eedZeed< dd Zdd Z	dS )		Rearranger   r   r   c                 C   s   t | jfi | j| _d S r   )r   r   r   
rearrangerr   r   r   r   r      s   zRearrange.setupc                 C   r   r   )r%   r   r   r   r   r   r   !   r   zRearrange.__call__Nr   r   r   r   r   r$      s
   
 r$   c                	   @   s   e Zd ZU eed< eed< dZee ed< eedZ	eed< dd Z
d	d
 Zdee dee dee dee fddZdd ZdS )EinMixr   weight_shapeN
bias_shaper   r   c                 C   s   | j | j| j| j| jd d S )N)r   r'   r(   axes_lengths)initialize_einmixr   r'   r(   r   r   r   r   r   r   +   s   
zEinMix.setupc                 C   sJ   |  dtjj||| _|d ur |  dtjj||| _d S d | _d S )Nweightbias)paramjaxnninitializersuniformr+   r,   )r   r'   weight_boundr(   
bias_boundr   r   r   _create_parameters3   s   
zEinMix._create_parameterspre_reshape_patternpre_reshape_lengthspost_reshape_patternpost_reshape_lengthsc                 C   sL   d | _ |d urt|tt|d| _ d | _|d ur$t|tt|d| _d S d S )N)r   )pre_rearranger$   r   r#   post_rearrange)r   r5   r6   r7   r8   r   r   r   _create_rearrange_layers;   s   zEinMix._create_rearrange_layersc                 C   sR   | j d ur
|  |}t| j|| j}| jd ur|| j7 }| jd ur'| |}|S r   )r9   jnpeinsumeinsum_patternr+   r,   r:   )r   r   resultr   r   r   r   J   s   





zEinMix.__call__)r   r   r    r!   r"   r(   r   r   r#   r   r   r4   r   r;   r   r   r   r   r   r&   %   s"   
 
r&   )dataclassesr   typingr   r   r   
flax.linenlinenr/   r.   	jax.numpynumpyr<    r   r   _einmixr	   
__author__Moduler
   r$   r&   r   r   r   r   <module>   s    