o
    wÖiZ  ã                   @   sh   U d dl mZ d dlZd dlZd dlmZmZmZmZm	Z	 dZ
eed< G dd„ deƒZG dd	„ d	ƒZdS )
é    )ÚEinopsErrorN)ÚListÚOptionalÚSetÚTupleÚUnionu   â€¦Ú	_ellipsisc                   @   s&   e Zd ZdZdefdd„Zdd„ ZdS )ÚAnonymousAxiszHImportant thing: all instances of this class are not equal to each otherÚvaluec                 C   s:   t |ƒ| _| jdkr| jdkrtdƒ‚td | j¡ƒ‚d S )Né   zENo need to create anonymous axis of length 1. Report this as an issuez2Anonymous axis should have positive length, not {})Úintr
   r   Úformat)Úselfr
   © r   úK/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/einops/parsing.pyÚ__init__   s   


üzAnonymousAxis.__init__c                 C   s   d  t| jƒ¡S )Nz{}-axis)r   Ústrr
   )r   r   r   r   Ú__repr__   s   zAnonymousAxis.__repr__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r   r	   	   s    r	   c                
   @   s„   e Zd ZdZdddœdededefdd„Zd	efd
d„Zd	efdd„Z	e
ddeded	eeef fdd„ƒZe
ded	efdd„ƒZdS )Ú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                   sb  dˆ_ d ˆ_tƒ ˆ_dˆ_g ˆ_d|v r9d|vrtdƒ‚t |d¡dks,t |d¡dkr0tdƒ‚| 	dt
¡}dˆ_ d ‰‡ ‡‡‡fd	d
„}d }|D ]Q}|dv r||d urV||ƒ d }|dkrgˆd urdtdƒ‚g ‰qH|dkr{ˆd u rstdƒ‚ˆj ˆ¡ d ‰qHt |¡s‡|dt
fv r“|d u rŽ|}qH||7 }qHtd |¡ƒ‚ˆd ur¥td |¡ƒ‚|d ur¯||ƒ d S d S )NFÚ.z...z6Expression may contain dots only inside ellipsis (...)r   é   zUExpression may contain dots only inside ellipsis (...); only one ellipsis for tensor Tc                    s  | ˆj v rˆr| dksˆ std | ¡ƒ‚| tkr7ˆj  t¡ ˆd u r-ˆj t¡ dˆ_d S ˆ t¡ dˆ_d S t 	| ¡}|rSt
| ƒdkrSˆd u rPˆj g ¡ d S 	 d S ˆj| ˆd\}}|sh|shtd | |¡ƒ‚|rnt| ƒ} ˆj  | ¡ |rydˆ_ˆd u r†ˆj | g¡ d S ˆ | ¡ d S )NÚ_z5Indexing expression contains duplicate dimension "{}"FTr   )r   zInvalid axis identifier: {}
{})Úidentifiersr   r   r   ÚaddÚcompositionÚappendÚhas_ellipsis_parenthesizedr   Ú	isdecimalr   Úcheck_axis_name_return_reasonr	   Úhas_non_unitary_anonymous_axes)ÚxÚ	is_numberÚis_axis_nameÚreason©r   r   Úbracket_groupr   r   r   Úadd_axis_name2   s8   




ÿz0ParsedExpression.__init__.<locals>.add_axis_namez() ú(zDAxis composition is one-level (brackets inside brackets not allowed)ú)zBrackets are not balancedr   zUnknown character '{}'z*Imbalanced parentheses in expression: "{}")Úhas_ellipsisr#   Úsetr   r&   r!   r   r   ÚcountÚreplacer   r"   Úisalnumr   )r   r   r   r   r-   Úcurrent_identifierÚcharr   r+   r   r      sT    ÿ"€
ÿzParsedExpression.__init__Úreturnc                 C   s:   g }| j D ]}t|tƒsJ dƒ‚|D ]}| |¡ qq|S )Nzdoes not work with ellipsis)r!   Ú
isinstanceÚlistr"   )r   ÚresultÚcomposed_axisÚaxisr   r   r   Úflat_axes_orderp   s   
ÿz ParsedExpression.flat_axes_orderc                 C   s,   | j D ]}t|tƒrt|ƒdkr dS qdS )Nr   TF)r!   r8   r9   Úlen)r   Úaxesr   r   r   Úhas_composed_axesx   s
   
€z"ParsedExpression.has_composed_axesÚnamec                 C   sn   t  | ¡sdS | d dks| d dkr| dkr|rdS dS t | ¡r+t d | ¡t¡ | dv r5t d	t¡ dS )
N)Fznot a valid python identifierr   r   éÿÿÿÿ)TÚ )Fz8axis name should should not start or end with underscorez9It is discouraged to use axes names that are keywords: {})r<   zQIt is discouraged to use 'axis' as an axis name and will raise an error in future)	r   ÚisidentifierÚkeywordÚ	iskeywordÚwarningsÚwarnr   ÚRuntimeWarningÚFutureWarning)rA   r   r   r   r   r%      s   

þz.ParsedExpression.check_axis_name_return_reasonc                 C   s   t  | ¡\}}|S )z‹
        Valid axes names are python identifiers except keywords,
        and additionally should not start or end with underscore
        )r   r%   )rA   Úis_validÚ_reasonr   r   r   Úcheck_axis_name‘   s   z ParsedExpression.check_axis_nameN)F)r   r   r   r   r   Úboolr   r   r=   r@   Ústaticmethodr   r%   rM   r   r   r   r   r      s    R"r   )Úeinopsr   rE   rG   Útypingr   r   r   r   r   r   r   Ú__annotations__Úobjectr	   r   r   r   r   r   Ú<module>   s    