
    'i                     t    U d dl Z d dlZd dlmZmZmZmZmZ d dlm	Z	 dZ
eed<    G d d      Z G d d	      Zy)
    N)ListOptionalSetTupleUnion)EinopsErroru   …	_ellipsisc                   "    e Zd ZdZdefdZd Zy)AnonymousAxiszHImportant thing: all instances of this class are not equal to each othervaluec                     t        |      | _        | j                  dk  r2| j                  dk(  rt        d      t        d| j                         y )N   zENo need to create anonymous axis of length 1. Report this as an issuez0Anonymous axis should have positive length, not )intr   r   )selfr   s     H/var/www/stems/demucs_env/lib/python3.12/site-packages/einops/parsing.py__init__zAnonymousAxis.__init__   sO    Z
::?zzQ!"ijj!$TUYU_U_T`"abb	     c                 2    t        | j                         dS )Nz-axis)strr   )r   s    r   __repr__zAnonymousAxis.__repr__   s    djj/"%((r   N)__name__
__module____qualname____doc__r   r   r    r   r   r   r   
   s    Rcc c)r   r   c            
           e Zd ZdZddddededefdZdefd	Zdefd
Z	e
ddededeeef   fd       Ze
dedefd       Zy)ParsedExpressionz
    non-mutable structure that contains information about one side of expression (e.g. 'b c (h w)')
    and keeps some information important for downstream
    F)allow_underscoreallow_duplicates
expressionr   r   c                    d _         d  _        t                _        d _        g  _        d|v rid|vrt        d      t        j                  |d      dk7  st        j                  |d      dk7  rt        d      |j                  dt              }d _         d  fd	}d }|D ]  }|d
v rR| ||       d }|dk(  rt        d      g (|dk(  s.t        d       j
                  j                         d Yt        j                  |      s
|dt        fv r||}}||z  }t        d| d       t        d| d      |	 ||       y y )NF.z...z6Expression may contain dots only inside ellipsis (...)r      zUExpression may contain dots only inside ellipsis (...); only one ellipsis for tensor Tc                    | j                   v rr| dk(  sst        d|  d      | t        k(  rej                   j                  t               'j                  j                  t               d_        y j                  t               d_        y t        j                  |       }|r.t        |       dk(  r j                  j                  g        y 	 y j                  |       \  }}|s|st        d|  d	|       |rt        |       } j                   j                  |        |rd_        j                  j                  | g       y j                  |        y )
N_z2Indexing expression contains duplicate dimension ""FTr   )r   zInvalid axis identifier: 
)identifiersr   r	   addcompositionappendhas_ellipsis_parenthesizedr   	isdecimalr   check_axis_name_return_reasonr   has_non_unitary_anonymous_axes)x	is_numberis_axis_namereasonr   r   bracket_groupr   s       r   add_axis_namez0ParsedExpression.__init__.<locals>.add_axis_name3   sY   D$$$(Q#X?O%(Z[\Z]]^&_``I~  $$Y/ ($$++I66;D3!((36:D3MM!,	Q1$,((//3  '+'I'I!^n'I'o$f!\%(A!Bvh&OPP%a(A  $$Q':>D7 ($$++QC0!((+r   z() (zDAxis composition is one-level (brackets inside brackets not allowed))zBrackets are not balancedr%   zUnknown character ''z'Imbalanced parentheses in expression: "r&   )has_ellipsisr,   setr(   r/   r*   r   r   countreplacer	   r+   isalnum)r   r    r   r   r5   current_identifiercharr4   s   ` ``   @r   r   zParsedExpression.__init__   s   "':>'%(U49+8:*J&!"Z[[yyU+q0CIIj#4NRS4S!k  $++E9=J $D-1 	,D " 	ADu}%1!"45%)"3;$0)*pqq$&MS[$,)*EFF$$++M:$(MT"dsI.>&>%-)-&&$.&!$7vQ"?@@)	A, $ G
|STUVV),- *r   returnc                     g }| j                   D ]1  }t        |t              sJ d       |D ]  }|j                  |        3 |S )Nzdoes not work with ellipsis)r*   
isinstancelistr+   )r   resultcomposed_axisaxiss       r   flat_axes_orderz ParsedExpression.flat_axes_orderq   sT    !-- 	$MmT2Q4QQ2% $d#$	$ r   c                 h    | j                   D ]#  }t        |t              st        |      dkD  s# y y)Nr   TF)r*   rB   rC   len)r   axess     r   has_composed_axesz"ParsedExpression.has_composed_axesy   s3    $$ 	D$%#d)a-	 r   namec                 
   t         j                  |       sy| d   dk(  s| d   dk(  r	| dk(  r|ryyt        j                  |       rt	        j
                  d|  t        d	       | d
v rt	        j
                  dt        d	       y)N)Fznot a valid python identifierr   r%   )T )Fz8axis name should should not start or end with underscorez7It is discouraged to use axes names that are keywords:    )
stacklevel)rF   zQIt is discouraged to use 'axis' as an axis name and will raise an error in future)r   isidentifierkeyword	iskeywordwarningswarnRuntimeWarningFutureWarning)rL   r   s     r   r.   z.ParsedExpression.check_axis_name_return_reason   s    %9!W^tBx3s{/T  &MdVT" 
 xg! 
 r   c                 6    t         j                  |       \  }}|S )z
        Valid axes names are python identifiers except keywords,
        and additionally should not start or end with underscore
        )r   r.   )rL   is_valid_reasons      r   check_axis_namez ParsedExpression.check_axis_name   s     -JJ4P'r   N)F)r   r   r   r   r   boolr   r   rG   rK   staticmethodr   r.   r\   r   r   r   r   r      s    
 EJdi P.3 P.T P.]a P.d 4  C 4 TYZ^`cZcTd  , c d  r   r   )rS   rU   typingr   r   r   r   r   einopsr   r	   r   __annotations__r   r   r   r   r   <module>rb      s4      4 4 	3 ) )E Er   