
    'iy                     d    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      Z G d d      Zy	)
zAlex Rogozhnikov    )AnyDict)EinopsError)TransformRecipe_apply_recipe_prepare_recipes_for_all_dimsget_backendc                   d     e Zd ZdZdededdf fdZdefdZdee	e
f   fdZd	 Zd
 Zd Z x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                     t         |           || _        || _        | j	                         | _        t        | j                  j                               | _        y N)	super__init__r   r   multirecipe_multirecipetupleitems_axes_lengths)selfr   r   	__class__s      P/var/www/stems/demucs_env/lib/python3.12/site-packages/einops/layers/__init__.pyr   zRearrangeMixin.__init__   sJ    ( ,,."4#4#4#:#:#<=    c                     t        | j                        }| j                  j                         D ]  \  }}|d| d| z  } | j                  j
                   d| dS Nz, =())reprr   r   r   r   __name__r   paramsaxislengths       r   __repr__zRearrangeMixin.__repr__   sg    dll# --335 	+LD&4&&**F	+..))*!F8155r   c                     	 t        | j                  dt        | j                              S # t        $ r}t	        d| d|       d d }~ww xY w)N	rearrange	operation
axes_names Error while preparing 
 )r   r   r   r   r   r   es     r   r   zRearrangeMixin.multirecipe!   sZ    	R0dFWFW@X   	R 7xs1#FGTQ	Rs   *- 	AAAc                     t        |      }t        || j                  t        |j                           |d| j
                        S )Nr)   backendrecipetensorreduction_typer   )r	   r   r   lenshaper   r   xr3   s      r   r   zRearrangeMixin._apply_recipe)   s@    a.$$S\2&++
 	
r   c                 4    | j                   | j                  dS )Nr   r   r<   r   s    r   __getstate__zRearrangeMixin.__getstate__3   s    <<9J9JKKr   c                 8     | j                   dd|d   i|d    y )Nr   r    r   r   states     r   __setstate__zRearrangeMixin.__setstate__6   s"    HeI.H%2GHr   r"   
__module____qualname____doc__strr   r   r'   r   intr   r   r   r>   rD   __classcell__r   s   @r   r   r   	   sW    > >S >T >6# 6RT#"67 R
LIr   r   c                   ^     e Zd ZdZdededef fdZd Zdee	e
f   fdZd	 Zd
 Zd Z x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                     t         |           || _        || _        || _        | j                         | _        t        | j                  j                               | _	        y r   )
r   r   r   rO   r   r   r   r   r   r   )r   r   rO   r   r   s       r   r   zReduceMixin.__init__E   sQ    "( ,,."4#4#4#:#:#<=r   c                     | j                   d| j                  }| j                  j                         D ]  \  }}|d| d| z  } | j                  j
                   d| dS r   )r   rO   r   r   r   r"   r#   s       r   r'   zReduceMixin.__repr__M   ss    LL#2dnn%78 --335 	+LD&4&&**F	+..))*!F8155r   r   c                     	 t        | j                  | j                  t        | j                              S # t
        $ r}t        d| d|       d d }~ww xY w)Nr*   r-   r.   )r   r   rO   r   r   r   r/   s     r   r   zReduceMixin.multirecipeS   s^    	R05IZIZC[   	R 7xs1#FGTQ	Rs   47 	A AAc                     t        |      }t        || j                  t        |j                           || j
                  | j                        S )Nr2   )r	   r   r   r7   r8   rO   r   r9   s      r   r   zReduceMixin._apply_recipe[   sD    a.$$S\2>>++
 	
r   c                 J    | j                   | j                  | j                  dS )Nr   rO   r   rU   r=   s    r   r>   zReduceMixin.__getstate__e   s    <<dnnVZVgVghhr   c                 @     | j                   d|d   |d   d|d    y )Nr   rO   )r   rO   r   r@   rA   rB   s     r   rD   zReduceMixin.__setstate__h   s+    feI.%:LfPUVdPefr   rE   rL   s   @r   rN   rN   :   sP    > > >S >6RT#"67 R
igr   rN   N)
__author__typingr   r   einopsr   einops.einopsr   r   r   r	   r   rN   r@   r   r   <module>r[      s/   
   d d.I .Ib/g /gr   