o
    hd/                     @   s   d dl Z d dlmZ d dlmZ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mZ dd	lmZmZmZmZ G d
d deZG dd dZG dd deZdd ZdefddZG dd deZG dd dedZdd ZdS )    N)Enum)AnyCallableDictListOptionalSet   )	variables)current_scope_idunimplemented)
AttrSourceSource)dict_valuesidentityistypeodict_valuesc                   @   s   e Zd ZdZdZdZdS )MutableLocalSourcez
    If the VariableTracker.mutable_local represents a Variable that:
    - already existed that Dynamo began tracking while introspection (Existing)
    - is a new variable that is created during Dynamo introspection (Local)
    r      N)__name__
__module____qualname____doc__ExistingLocal r   r   R/var/www/html/ai/venv/lib/python3.10/site-packages/torch/_dynamo/variables/base.pyr      s    r   c                   @   s   e Zd ZdZdefddZdS )MutableLocalBasez/
    Base class for Variable.mutable_local
    typc                 C   s<   |t ju r
d| _d S |t ju rt | _d S td|  d S )Nr   z Unsupported MutableLocalSource: )r   r   scoper   r   r   )selfr   r   r   r   __init__   s
   


zMutableLocalBase.__init__N)r   r   r   r   r   r"   r   r   r   r   r      s    r   c                       s0   e Zd ZdZ fddZdd Zdd Z  ZS )MutableLocalz
    Marker used to indicate this (list, iter, etc) was constructed in
    local scope and can be mutated safely in analysis without leaking
    state.
    c                    s   t  tj d S N)superr"   r   r   r!   	__class__r   r   r"   C      zMutableLocal.__init__c                 C      t | S r$   )idr&   r   r   r   __hash__F      zMutableLocal.__hash__c                 C   s   | |u S r$   r   )r!   otherr   r   r   __eq__I   r-   zMutableLocal.__eq__)r   r   r   r   r"   r,   r/   __classcell__r   r   r'   r   r#   <   s
    r#   c                 C   s   | dkS )Nr   r   )scope_idr   r   r   _is_top_level_scopeM   r-   r2   mc                 C   s   t  }t|r	dS | j|kS )NT)r   r2   r    )r3   r1   r   r   r   is_side_effect_safeQ   s   
r4   c                   @   s   e Zd Zdd ZdS )HasPostInitc                 O   s,   t j| g|R i |}|j|i | |S r$   )type__call____post_init__)clsargskwargsobjr   r   r   r7   _   s   zHasPostInit.__call__N)r   r   r   r7   r   r   r   r   r5   ^   s    r5   c                
       s  e Zd ZdZdgZedeed   fddZdd Ze	dd	 Z
e	d
dd dfded gd f fddZdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)ed*efd+d,Zd)ed*d fd-d.Zd/d0 Zd1d2 Zd3d4 Zd5d6 Z d7d8 Z!d9d: Z"d)ed*d fd;d<Z#	=	>	?	@	*	 dQdAdBZ$	=	>	?	@	*	 dQdCdDZ%	
	
	
	
dRdEe&e' dFe(dGe)dHe&e' f fdIdJZ*dKdL Z+dMdN Z,dOdP Z-  Z.S )SVariableTrackerz
    Base class for tracked locals and stack values

    VariableTracker instances are immutable and should be copied in
    order to change them.
    valuevarsc                     s$   t    fdd|  d iS )zMCombine the guards from many VariableTracker into **kwargs for a new instancec                    sP   t | ttttfv r| D ]}| qd S t| ts J t|  | j	 d S r$   )
r6   listtupler   r   
isinstancer=   typestrupdateguards)varirE   visitr   r   rI   u   s   
z(VariableTracker.propagate.<locals>.visitrE   )set)r?   r   rH   r   	propagatep   s
   zVariableTracker.propagatec                 K   s$   t | j}|| | jdi |S )z)Shallow copy with some (optional) changesNr   )dict__dict__rD   r(   )r!   r;   r:   r   r   r   clone   s   

zVariableTracker.clonec                 C   s   |  t|S )z=Deeper (but not full) copy, leaving FX and user objects alone)applyr   )r9   r>   r   r   r   copy   s   zVariableTracker.copyNc                 C   s   dS )NFr   )_r   r   r   <lambda>   s    zVariableTracker.<lambda>Ffnc           
         sj   du rt   t|}| v r | d S t|trS|sNt |j}| D ]}||jvr:||  ||< q'|jdi |}	du rM|		  n_|}	nZt
|trf fdd|D }	nGt
|tr{t fdd|D }	n2t
|tjrt fdd| D }	nt
|t r fd	d
t| D }	n|}	|	|f |< |	S )z
        Walk this object and call fn on all the VariableTracker
        instances to produce a new VariableTracker with the results.
        Nr   Fc              	      s   g | ]} | qS r   rO   .0vcacher9   rS   skip_fnupdate_containsr   r   
<listcomp>   s    z)VariableTracker.apply.<locals>.<listcomp>c                 3   "    | ]} | V  qd S r$   rT   rU   rX   r   r   	<genexpr>       
z(VariableTracker.apply.<locals>.<genexpr>c                 3   r]   r$   rT   rU   rX   r   r   r^      r_   c              
      s$   i | ]\}}| | qS r   rT   )rV   krW   rX   r   r   
<dictcomp>   s    z)VariableTracker.apply.<locals>.<dictcomp>r   )rL   r+   rB   r=   rM   keys_nonvar_fieldsrO   rN   _update_containsr   r@   rA   collectionsOrderedDictitems)
r9   rS   r>   rY   rZ   r[   idxupdated_dictkeyresultr   rX   r   rO      sH   









zVariableTracker.applyc                 C   s   | j t| j|hdS N)rE   )rN   rJ   unionrE   )r!   guardr   r   r   	add_guard   s   zVariableTracker.add_guardc                 C   s0   |d u r| S t |tsJ | jt| j|dS rl   )rB   rJ   rN   rm   rE   )r!   rE   r   r   r   
add_guards   s   zVariableTracker.add_guardsc                 G   sL   |r
|  |j | S t|tr| |jS t|tsJ | |dt S )NrE   )add_optionsrB   r=   rp   rE   rL   getrJ   )r!   optionsmorer   r   r   rq      s   
zVariableTracker.add_optionsc                 C   s   | j j dS )Nz())r(   r   r&   r   r   r   __str__      zVariableTracker.__str__c                 C   r*   r$   )strr&   r   r   r   __repr__   r-   zVariableTracker.__repr__c                 C      t |  d)Nz has no typeNotImplementedErrorr&   r   r   r   python_type   rv   zVariableTracker.python_typec                 C   ry   )zFor constantsz is not a constantrz   r&   r   r   r   as_python_constant   s   z"VariableTracker.as_python_constantc                 C   $   z|    W dS  ty   Y dS w NTF)r}   r{   r&   r   r   r   is_python_constant      z"VariableTracker.is_python_constantc                 C   s   | S )z
        For specialized variables, return itself,
        For unspecialized variables, convert to constant variable and return.
        r   r!   txr   r   r   as_specialized   s   zVariableTracker.as_specializedc                 C   s&   z|  d  W dS  ty   Y dS w r   )
make_guardr{   r&   r   r   r   can_make_guard      
zVariableTracker.can_make_guardc                 C   s   | j r	| j |S t r$   )sourcer   r{   )r!   rS   r   r   r   r      s   zVariableTracker.make_guardc                    s<   j    fdd|pg D }|fdd|D  |S )Nc                    s   h | ]	}|j  kr|qS r   name)rV   gr   r   r   	<setcomp>   s    z1VariableTracker.replace_guards.<locals>.<setcomp>c                 3   s    | ]	} j |V  qd S r$   )r   r   )rV   rS   r&   r   r   r^      s    z1VariableTracker.replace_guards.<locals>.<genexpr>)r   r   rD   )r!   rE   fns
new_guardsr   )r   r!   r   replace_guards   s   
zVariableTracker.replace_guardsr   returnc                 C      t  )z/getattr(self, name) returning a python constantrz   r!   r   r   r   r   r   const_getattr  s   zVariableTracker.const_getattrc                 C   sP   t | }| ||}tj|st | jrt| j||d< tj|fi |S )z,getattr(self, name) returning a new variabler   )	r=   rK   r   r
   ConstantVariable
is_literalr{   r   r   )r!   r   r   rs   r>   r   r   r   var_getattr  s   
zVariableTracker.var_getattrc                 C   r~   r   )as_proxyr{   r&   r   r   r   is_proxy  r   zVariableTracker.is_proxyc                 C   s   t t| r$   )r{   rw   r&   r   r   r   r     s   zVariableTracker.as_proxyc                 C   r   r$   rz   )r!   codegenr   r   r   reconstruct     zVariableTracker.reconstructc                 C   r   r$   rz   r   r   r   r   unpack_var_sequence  r   z#VariableTracker.unpack_var_sequencec                 C   s&   z|  | W dS  ty   Y dS w r   )r   r{   r   r   r   r   has_unpack_var_sequence"  r   z'VariableTracker.has_unpack_var_sequencec                 C   s   t d|   d S )Nznum_parameters: r   r&   r   r   r   num_parameters)  r)   zVariableTracker.num_parametersc                 C   s   t dt|   d S )Nz	hasattr: )r   reprr   r   r   r   call_hasattr,  s   zVariableTracker.call_hasattrr:   List[VariableTracker]r;   Dict[str, VariableTracker]c                 C   s   t d|  d| d|  d S )Nzcall_function  r   )r!   r   r:   r;   r   r   r   call_function/  s   zVariableTracker.call_functionc              	   C   s   |dkr |  |r |s|rJ tjt| |fi t| S |dkrBt|dkrB|d  rB|sB| ||d 	 
| |d S td|  d| d| d| )N__len____getattr__r   r   zcall_method r   )r   r
   r   lenr   r=   rK   r   r   r}   rq   r   )r!   r   r   r:   r;   r   r   r   call_method4  s"   
 zVariableTracker.call_methodrE   r   mutable_localrecursively_containsc                    s,   t    |p	t | _|| _|| _|| _d S r$   )r%   r"   rJ   rE   r   r   r   )r!   rE   r   r   r   r'   r   r   r"   K  s   
zVariableTracker.__init__c                    s>    j d u rt  _ tj j  fddd d  j vsJ d S )Nc                       |  uS r$   r   rF   r&   r   r   rR   _      z/VariableTracker.__post_init__.<locals>.<lambda>)rZ   )r   rJ   r=   rO   _aggregate_mutables)r!   r:   r;   r   r&   r   r8   Z  s   
zVariableTracker.__post_init__c                 C   s*   | j |j  |jd ur| j |j |S r$   )r   rD   r   add)r!   rF   r   r   r   r   d  s   
z#VariableTracker._aggregate_mutablesc                    s6   t   _tj j  fdddd d  jvsJ d S )Nc                    r   r$   r   r   r&   r   r   rR   r  r   z2VariableTracker._update_contains.<locals>.<lambda>T)rZ   r[   )rJ   r   r=   rO   r   r&   r   r&   r   rd   l  s   
z VariableTracker._update_contains)r:   r   r;   r   r   r=   )NNNN)/r   r   r   r   rc   staticmethodr   rK   rN   classmethodrP   r   rO   ro   rp   rq   ru   rx   r|   r}   r   r   r   r   r   rw   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r#   r"   r8   r   rd   r0   r   r   r'   r   r=   e   s    
7


r=   )	metaclassc                  G   s>   t | dkr| \}t|trt|S t|jS dtt| S )Nr   r   )	r   rB   r=   rw   r6   r   joinmaprC   )objsr<   r   r   r   rC   y  s   

rC   ) re   enumr   typingr   r   r   r   r   r    r
   r   excr   r   r   r   utilsr   r   r   r   r   r   r#   r2   r4   r6   r5   r=   rC   r   r   r   r   <module>   s$     %  