o
    ڷiy                     @   sX   d Z ddlmZmZ ddlmZ ddlmZmZm	Z	m
Z
 G dd dZG dd dZd	S )
zAlex Rogozhnikov    )AnyDict)EinopsError)TransformRecipe_apply_recipe_prepare_recipes_for_all_dimsget_backendc                       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__ L/home/ubuntu/vllm_env/lib/python3.10/site-packages/einops/layers/__init__.pyr      s
   

zRearrangeMixin.__init__c                 C   sF   t | j}| j D ]\}}|d| d| 7 }q
| jj d| dS Nz, =())reprr
   r   r   r   __name__r   paramsaxislengthr   r   r   __repr__   s   
zRearrangeMixin.__repr__c              
   C   sH   zt | jdt| jdW S  ty# } ztd| d| d d }~ww )N	rearrange	operation
axes_names Error while preparing 
 )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   r6   r   r   r   r   __getstate__3   s   zRearrangeMixin.__getstate__c                 C   s    | j dd|d i|d  d S )Nr
   r   r   r   r   stater   r   r   __setstate__6   s    zRearrangeMixin.__setstate__r   
__module____qualname____doc__strr   r   r$   r   intr   r   r   r8   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
   rE   r   r   r   r   r   r   )r   r
   rE   r   r   r   r   r   E   s   

zReduceMixin.__init__c                 C   sN   | j d| j}| j D ]\}}|d| d| 7 }q| jj d| dS r   )r
   rE   r   r   r   r   r    r   r   r   r$   M   s   zReduceMixin.__repr__r   c              
   C   sJ   zt | j| jt| jdW S  ty$ } ztd| d| d d }~ww )Nr&   r)   r*   )r   r
   rE   r   r   r   r+   r   r   r   r   S   s   zReduceMixin.multirecipec                 C   s*   t |}t|| jt|j || j| jdS )Nr-   )r   r   r   r2   r3   rE   r   r4   r   r   r   r   [   s   zReduceMixin._apply_recipec                 C   s   | j | j| jdS )Nr
   rE   r   rF   r7   r   r   r   r8   e   s   zReduceMixin.__getstate__c                 C   s&   | j d|d |d d|d  d S )Nr
   rE   )r
   rE   r   r   r9   r:   r   r   r   r<   h   s   &zReduceMixin.__setstate__r=   r   r   r   r   rD   :   s    

rD   N)
__author__typingr   r   einopsr   einops.einopsr   r   r   r   r	   rD   r   r   r   r   <module>   s    1