o
    wi	                     @   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)OptionalDictcastN   )RearrangeMixinReduceMixin)_EinmixMixinzAlex Rogozhnikovc                   @   sD   e Zd ZU eed< eed< edd dZeed< dd Zd	d
 Z	dS )Reducepattern	reductionc                   C      i S N r   r   r   O/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/einops/layers/flax.py<lambda>       zReduce.<lambda>default_factorysizesc                 C   s   t | j| jfi | j| _d S r   )r   r   r   r   reducerselfr   r   r   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   r   dictr   r   r   r   r   r   r
      s   
 r
   c                   @   s<   e Zd ZU eed< edd dZeed< dd Zdd	 Z	d
S )	Rearranger   c                   C   r   r   r   r   r   r   r   r      r   zRearrange.<lambda>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dd 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_shapec                   C   r   r   r   r   r   r   r   r   )   r   zEinMix.<lambda>r   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   r8   r9   r:   r;   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   )r<   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   r7   r   r>   r   r   r   r   r   r)   %   s"   
 
r)   )dataclassesr   typingr   r   r   
flax.linenlinenr2   r1   	jax.numpynumpyr?    r   r   _einmixr	   
__author__Moduler
   r'   r)   r   r   r   r   <module>   s    