U
    zhF                     @   sz   d dl Z d dlZd dlmZ d dlmZ ddlmZ g ZeG dd dZ	G dd	 d	Z
d
d Zi ZdddZdd ZdS )    N)	dataclass)Union   )DimListc                   @   s"   e Zd ZU eed< dZeed< dS )	LevelInfolevelTaliveN)__name__
__module____qualname__int__annotations__r   bool r   r   C/var/www/html/venv/lib/python3.8/site-packages/functorch/dim/dim.pyr      s   
r   c                   @   sb   e Zd Zdeedef dddZdd Zedd Z	e	j
ed	d
dZ	edd Zdd ZdS )DimN)namesizec                 C   s$   || _ d | _d | _|d k	r || _d S N)r   _size_vmap_levelr   )selfr   r   r   r   r   __init__   s
    zDim.__init__c                 C   sD   | j d k	r@dt| j _td js@t td jkr@t  t  qd S )NF)	r   Z_vmap_active_levels_vmap_stackr   _vmap_levelsZcurrent_levelr   Z_vmap_decrement_nestingpopr   r   r   r   __del__   s    
zDim.__del__c                 C   s   | j s
t| jS r   )is_boundAssertionErrorr   r   r   r   r   r   )   s    
zDim.size)r   c                 C   sn   ddl m} | jd krD|| _t|d| _tt| _tt	| j n&| j|krj|d|  d| j d| d S )Nr   )DimensionBindErrorZsamezDim 'z*' previously bound to a dimension of size z$ cannot bind to a dimension of size )
 r!   r   Z_vmap_increment_nestingr   lenr   r   appendr   )r   r   r!   r   r   r   r   .   s    


c                 C   s
   | j d k	S r   )r   r   r   r   r   r   =   s    zDim.is_boundc                 C   s   | j S r   r   r   r   r   r   __repr__A   s    zDim.__repr__)N)r	   r
   r   strr   r   r   r   propertyr   setterr   r&   r   r   r   r   r      s   


r   c                 C   s   | j dks| j dkst| jS )N
STORE_FAST
STORE_NAME)opnamer    argval)instr   r   r   extract_nameE   s    r/   c                    s   t  }|d k	st|j}|d k	s&t|j|j }}||f}|tkr|d d tt	|j }|j
dks||j
dkr|j| dkrtnt  fddt|< nN|j
dkst|j}tfd	d
t|D t|  fddt|< t|  S )N   r   r*   r+   r   c                      s
    dS )Nr%   r   r   )ctorr   r   r   <lambda>]       zdims.<locals>.<lambda>UNPACK_SEQUENCEc                 3   s"   | ]}t  d  |  V  qdS )r   N)r/   ).0i)firstinstructionsr   r   	<genexpr>a   s    zdims.<locals>.<genexpr>c                      s   t  fddtD S )Nc                 3   s,   | ]$\}}| k rt |nt|d V  qdS )r%   N)r   r   )r5   r6   n)
first_listr   r   r9   e   s   z)dims.<locals>.<lambda>.<locals>.<genexpr>)tuple	enumerater   )r;   namesr   r   r2   e   s   )inspectcurrentframer    f_backf_codef_lasti_cachelistdisget_instructionsr,   r-   r   r   r<   ranger#   )listsframeZcalling_framecodelastikeyunpackZndimsr   )r1   r7   r;   r8   r   r>   r   dimsM   s,    rO   c                    sJ   fdd |d krS t |ttfs<t fdd|D S  |fS d S )Nc                    s(   t | tr| S t | tst |  S d S r   )
isinstancer   r   r    )a)
positionalr   r   convertm   s    
z_dim_set.<locals>.convertc                 3   s   | ]} |V  qd S r   r   )r5   rQ   )rS   r   r   r9   w   s     z_dim_set.<locals>.<genexpr>)rP   r   r   r<   )rR   argr   )rS   rR   r   _dim_setl   s    rU   )r   )rF   r?   dataclassesr   typingr   r"   r   r   r   r   r/   rD   rO   rU   r   r   r   r   <module>   s   .
