o
    wi                     @   sX   d Z ddlmZmZ ddlmZmZmZmZ ddl	m
Z
 G dd dZG dd	 d	Zd
S )zAlex Rogozhnikov    )AnyDict   )TransformRecipe_apply_recipe_prepare_recipes_for_all_dimsget_backend)EinopsErrorc                       sj   e Zd ZdZdededdf fddZdefdd	Zdee	e
f fd
dZdd Zdd Zdd Z  ZS )RearrangeMixinz
    Rearrange layer behaves identically to einops.rearrange operation.

    :param pattern: str, rearrangement pattern
    :param axes_lengths: any additional specification of dimensions

    See einops.rearrange for source_examples.
    patternaxes_lengthsreturnNc                    s4   t    || _|| _|  | _t| j | _d S N)	super__init__r   r   multirecipe_multirecipetupleitems_axes_lengths)selfr   r   	__class__ S/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/einops/layers/__init__.pyr      s
   

zRearrangeMixin.__init__c                 C   s>   t | j}| j D ]\}}|d||7 }q
d| jj|S )N, {}={}{}({}))reprr   r   r   formatr   __name__r   paramsaxislengthr   r   r   __repr__   s   
zRearrangeMixin.__repr__c              
   C   sB   zt | jdt| jdW S  ty  } ztd| |d }~ww )N	rearrange	operation
axes_names Error while preparing {!r}
 {})r   r   r   r   r	   r   r   er   r   r   r   "   s   zRearrangeMixin.multirecipec                 C   s(   t |}t|| jt|j |d| jdS )Nr%   backendrecipetensorreduction_typer   )r   r   r   lenshaper   r   xr-   r   r   r   r   *   s   zRearrangeMixin._apply_recipec                 C   s   | j | jdS )Nr   r   r5   r   r   r   r   __getstate__4   s   zRearrangeMixin.__getstate__c                 C   s    | j dd|d i|d  d S )Nr   r   r   r   r   stater   r   r   __setstate__7   s    zRearrangeMixin.__setstate__r   
__module____qualname____doc__strr   r   r$   r   intr   r   r   r7   r;   __classcell__r   r   r   r   r
   
   s    	
r
   c                       sd   e Zd ZdZdededef fddZdd Zd	ee	e
f fd
dZdd Zdd Zdd Z  ZS )ReduceMixinaN  
    Reduce layer behaves identically to einops.reduce operation.

    :param pattern: str, rearrangement pattern
    :param reduction: one of available reductions ('min', 'max', 'sum', 'mean', 'prod'), case-sensitive
    :param axes_lengths: any additional specification of dimensions

    See einops.reduce for source_examples.
    r   	reductionr   c                    s:   t    || _|| _|| _|  | _t| j | _	d S r   )
r   r   r   rD   r   r   r   r   r   r   )r   r   rD   r   r   r   r   r   F   s   

zReduceMixin.__init__c                 C   sD   d | j| j}| j D ]\}}|d ||7 }qd | jj|S )Nz
{!r}, {!r}r   r   )r   r   rD   r   r   r   r   r    r   r   r   r$   N   s   zReduceMixin.__repr__r   c              
   C   sD   zt | j| jt| jdW S  ty! } ztd| |d }~ww )Nr&   r)   )r   r   rD   r   r   r	   r   r*   r   r   r   r   T   s   zReduceMixin.multirecipec                 C   s*   t |}t|| jt|j || j| jdS )Nr,   )r   r   r   r1   r2   rD   r   r3   r   r   r   r   \   s   zReduceMixin._apply_recipec                 C   s   | j | j| jdS )Nr   rD   r   rE   r6   r   r   r   r7   f   s   zReduceMixin.__getstate__c                 C   s&   | j d|d |d d|d  d S )Nr   rD   )r   rD   r   r   r8   r9   r   r   r   r;   i   s   &zReduceMixin.__setstate__r<   r   r   r   r   rC   ;   s    

rC   N)
__author__typingr   r   einopsr   r   r   r    r	   r
   rC   r   r   r   r   <module>   s    1