o
    Zhd                     @   s   d dl Z 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dlmZ ddlmZ ddlmZ G d	d
 d
ZeG dd deZG dd dZdedeeeegef fddZdddZe  dS )    N)AnyCallablefinalOptionalUnion)Self   )is_function_or_wrapper   )VariableTracker)SymNodeVariablec                   @   s0   e Zd ZdZdededdfddZd
dd	ZdS )	LazyCachez+Container to cache the real VariableTrackervaluesourcereturnNc                 C   s(   t |ts	|s	J || _|| _d | _d S N)
isinstanceLazySymNodeFormatStringr   r   vt)selfr   r    r   K/var/www/auris/lib/python3.10/site-packages/torch/_dynamo/variables/lazy.py__init__   s
   

zLazyCache.__init__c                 C   sX   | j d u sJ ddlm} | }t| jtrd }n| j}t	|| j|| _ | `| `d S )Nr   )InstructionTranslator)
r   Zsymbolic_convertr   Z
current_txr   r   r   r   r   build)r   r   Ztxr   r   r   r   realize   s   zLazyCache.realizer   N)__name__
__module____qualname____doc__r   r   r   r   r   r   r   r      s    r   c                       sF  e Zd ZdZdhejZededededd fd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efddZd	edefddZdee fddZdefddZdef fddZdedefddZejZeZe	
d'dedeeeeeef f  defdd Zdefd!d"Z defd#d$Z!defd%d&Z"  Z#S )(LazyVariableTrackera  
    A structure that defers the creation of the actual VariableTracker
    for a given underlying value until it is accessed.

    The `realize` function invokes VariableTracker.build() to produce the real object.
    Once a LazyVariableTracker has been realized, internal bookkeeping will
    prevent double realization.

    This object should be utilized for processing containers, or objects that
    reference other objects where we may not want to take on creating all the
    VariableTrackers right away.
    _cacher   r   optionsr   c                 K   s   t t| |fd|i|S )Nr   )r!   r   )r   r   r#   r   r   r   create7   s   zLazyVariableTracker.createkwargsNc                    s*   t |tsJ t jdi | || _d S )Nr   )r   r   superr   r"   )r   r"   r%   	__class__r   r   r   ;   s   
zLazyVariableTracker.__init__c                 C   s.   | j jdu r| j   | j jdusJ | j jS )z.Force construction of the real VariableTrackerN)r"   r   r   r   r   r   r   r   @   s   
zLazyVariableTracker.realizec                 C   s$   |   r| jjdusJ | jjS | S )z4Return the real VariableTracker if it already existsN)is_realizedr"   r   r)   r   r   r   unwrapG   s   zLazyVariableTracker.unwrapc                 C   s   | j jd uS r   )r"   r   r)   r   r   r   r*   N   s   zLazyVariableTracker.is_realizedc                 K   sJ   | d| j| ju sJ | d| j| jur|   tj|  fi |S )Nr"   r   )getr"   r   r   r   cloner+   )r   r%   r   r   r   r-   Q   s   zLazyVariableTracker.clonec                 C   s   |   rJ t| jjS r   )r*   typer"   r   r)   r   r   r   	peek_typeW   s   zLazyVariableTracker.peek_typec                 C      |   rJ | jjS r   r*   r"   r   r)   r   r   r   
peek_value[   s   zLazyVariableTracker.peek_valuec                    s   |   r
t|  S t  S r   )r*   reprr+   r&   __repr__r)   r'   r   r   __str___   s   
zLazyVariableTracker.__str__itemc                 C   s   t |  |S r   getattrr   )r   r6   r   r   r   __getattr__d   s   zLazyVariableTracker.__getattr__cachec           	         s   du ri  t |}| v r | d S t|}t|tr&|  }nYt|trG|}|j}|j}|D ]}||vrE||  ||< q5n8|t	u rV fdd|D }n)|t
u rgt
 fdd|D }n|ttjfv r} fddt	| D }n|}||f |< |S )	zP
        Walk an object and realize all LazyVariableTrackers inside it.
        Nr   c                    s   g | ]} | qS r   realize_all.0vr:   clsr   r   
<listcomp>   s    z3LazyVariableTracker.realize_all.<locals>.<listcomp>c                 3   s    | ]	} | V  qd S r   r;   r=   r@   r   r   	<genexpr>   s    z2LazyVariableTracker.realize_all.<locals>.<genexpr>c                    s   i | ]\}}| | qS r   r;   )r>   kr?   r@   r   r   
<dictcomp>   s    z3LazyVariableTracker.realize_all.<locals>.<dictcomp>)idr.   
issubclassr!   r<   r   r   __dict___nonvar_fieldslisttupledictcollectionsOrderedDictitems)	rA   r   r:   idxZ	value_clsresultZ
value_dictZnonvarskeyr   r@   r   r<   k   s4   	

zLazyVariableTracker.realize_allc                    sN   dt dtfdd |  rJ | jj}t|tr#t fdd|D S  |S )Nr   r   c                 S   s    t | ptt| tpt| S r   )inspect	isbuiltinrG   r.   r	   )r   r   r   r   _helper   s
   
z0LazyVariableTracker.is_hashable.<locals>._helperc                 3   s    | ]} |V  qd S r   r   r=   rU   r   r   rC      s    z2LazyVariableTracker.is_hashable.<locals>.<genexpr>)r   boolr*   r"   r   r   rK   all)r   r   r   rV   r   is_hashable   s   
zLazyVariableTracker.is_hashablec                 C   r0   r   r1   r)   r   r   r   original_value      z"LazyVariableTracker.original_valuec                 C   r0   r   )r*   r"   r   r)   r   r   r   original_source   r[   z#LazyVariableTracker.original_sourcer   )$r   r   r   r    r   rI   staticmethodr   r$   r   r   r   r   r   r+   rW   r*   r-   r.   r/   r2   strr5   r9   visitr4   classmethodr   rL   intrK   r<   rY   rZ   r\   __classcell__r   r   r'   r   r!   &   s8    'r!   c                   @   s0   e Zd ZdededdfddZdefddZdS )	r   sym_node_variablefmt_spec_varr   Nc                 C   s.   ddl m} || _|d|  d | _d S )Nr
   )ConstantVariablez{:})Zconstantre   sym_node_varr$   as_python_constantfmt_var)r   rc   rd   re   r   r   r   r      s
   
z LazySymNodeFormatString.__init__c                 C   s   t | j t | j S r   )r^   formatri   rh   rg   Zevaluate_exprr)   r   r   r   r4      s   z LazySymNodeFormatString.__repr__)r   r   r   r   r   r   r^   r4   r   r   r   r   r      s    

r   namer   c              	      s2   t tt dtdtdtdtf fdd}|S )Nr   argsr%   r   c                    s   t |   |i |S r   r7   )r   rl   r%   rk   r   r   realize_and_forward   s   z8_create_realize_and_forward.<locals>.realize_and_forward)	functoolswrapsr8   r   r!   r   )rk   rn   r   rm   r   _create_realize_and_forward   s   rq   c                  C   s:   t j D ]\} }| tjvrt|rtt| t|  qd S r   )r   rH   rO   r!   callablesetattrrq   )rk   r   r   r   r   	_populate   s   
rt   r   )rM   ro   rS   typingr   r   r   r   r   Ztyping_extensionsr   utilsr	   baser   Ztensorr   r   r!   r   r^   rq   rt   r   r   r   r   <module>   s(     



