o
    I&i3                     @   s   d dl Z d dlmZ d dl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 G d
d deZG dd d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   )	variables)current_scope_idunimplemented)
AttrSourceSource)identityistypec                   @   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   GC:\wamp64\www\opt\env\Lib\site-packages\torch/_dynamo/variables/base.pyr      s    r   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	ParentsTrackerz
    This is a perf optimization to limit the number of objects we need to visit in tx.replace_all.
    This must be a seperate object so that it is not cloned in apply.
    c                 C   s   t  | _d S N)dictparentsselfr   r   r   __init__   s   zParentsTracker.__init__c                 C   s   d| j |< d S NT)r   )r   parentr   r   r   add!      zParentsTracker.addc                 C   s\   t | j}t| j}|r*| jD ]}||vr't|tsJ d||< || q|s| S r!   )r   r   listpop
isinstancer   appendkeys)r   rvZworklistr"   r   r   r   recursive_parents$   s   


z ParentsTracker.recursive_parentsN)r   r   r   r   r    r#   r+   r   r   r   r   r      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   )r   r-   r   r   r   r    5   s
   


zMutableLocalBase.__init__N)r   r   r   r   r   r    r   r   r   r   r,   0   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 r   )superr    r   r   r   	__class__r   r   r    \      zMutableLocal.__init__c                 C      t | S r   )idr   r   r   r   __hash___      zMutableLocal.__hash__c                 C   s   | |u S r   r   )r   otherr   r   r   __eq__b   r7   zMutableLocal.__eq__)r   r   r   r   r    r6   r9   __classcell__r   r   r1   r   r/   U   s
    r/   c                 C   s   | dkS )Nr   r   )scope_idr   r   r   _is_top_level_scopef   r7   r<   mc                 C   s   t  }t|r	dS | j|kS r!   )r	   r<   r.   )r=   r;   r   r   r   is_side_effect_safej   s   
r>   c                   @   s"   e Zd Zdd ZdefddZdS )VariableTrackerMetac                 O   s,   t j| g|R i |}|j|i | |S )zCall __post_init__)type__call____post_init__)clsargskwargsobjr   r   r   rA   w   s   zVariableTrackerMeta.__call__returnc                 C   s0   t tj|r| ttjfvr| }t | |S )z-Make isinstance work with LazyVariableTracker)r@   __instancecheck__r   ZLazyVariableTrackerVariableTrackerrealize)rC   instancer   r   r   rH   }   s   z%VariableTrackerMeta.__instancecheck__N)r   r   r   rA   boolrH   r   r   r   r   r?   v   s    r?   c                	       s  e Zd ZdZh dZdd Zedd Ze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edefddZdedd fddZdd  Zd!d" Zd#d$ Zd%d& Zded  fd'd(Zdefd)d*Zdee fd+d,Zdedd fd-d.Z	/	0	1	2		 dJd3d4Z	/	0	1	2		 dJd5d6Zd7d8 Z dKd9d:Z!d;d< Z"dKd=d>Z#d?d@ Z$dddddAdBe%dCe&dDedEe'f fdFdGZ(dHdI Z)  Z*S )LrI   z
    Base class for tracked locals and stack values

    VariableTracker instances are immutable and should be copied in
    order to change them.
    >   Zguardssourceuser_code_variable_nameparents_trackermutable_localvaluec                 K   s$   t | j}|| | jdi |S )z)Shallow copy with some (optional) changesNr   )r   __dict__updater2   )r   rE   rD   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   )rC   rQ   r   r   r   copy   s   zVariableTracker.copyNc                 C      dS )NFr   _r   r   r   <lambda>       zVariableTracker.<lambda>fnc           	         s@   du rt   t|}| v r | d S t|trO|sB fdd}| }| }||}|sA| rA|| }nV|}|durN| }nIt|tra fdd|D }n7t|trut fdd|D }n#t|t t	j
frd	|vsJ d
 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   c                    sj   d}t | j}| D ]}|| jvr(|| }| ||< |p'||| u}q|r3| jdi |S | S )NFr   )r   rR   r)   _nonvar_fieldsrU   rT   )vchangedr*   keyZpriorcacherC   r\   skip_fnr   r   update_object_dict   s   

z1VariableTracker.apply.<locals>.update_object_dictc                    s   g | ]
} | qS r   rU   .0r^   ra   r   r   
<listcomp>   s    z)VariableTracker.apply.<locals>.<listcomp>c                 3   s     | ]} | V  qd S r   re   rf   ra   r   r   	<genexpr>   s    z(VariableTracker.apply.<locals>.<genexpr>r   z(_nonvar_fields should have excluded thisc              	      s"   i | ]\}}| | qS r   re   rg   kr^   ra   r   r   
<dictcomp>   s    z)VariableTracker.apply.<locals>.<dictcomp>)r   r5   r'   rI   unwrapis_realizedr   r%   tuplecollectionsOrderedDictitems)	rC   r\   rQ   rb   rc   idxrd   Zwas_realizedresultr   ra   r   rU      s<   



zVariableTracker.applyc                 C   s   | j j dS )Nz())r2   r   r   r   r   r   __str__   r$   zVariableTracker.__str__c                 C   r4   r   )strr   r   r   r   __repr__   r7   zVariableTracker.__repr__c                 C      t |  d)Nz has no typeNotImplementedErrorr   r   r   r   python_type   r$   zVariableTracker.python_typec                 C   rx   )zFor constantsz is not a constantry   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|   rz   r   r   r   r   is_python_constant      z"VariableTracker.is_python_constantc                 C   s   | j r	| j |S t r   )rM   
make_guardrz   )r   r\   r   r   r   r      s   zVariableTracker.make_guardnamerG   c                 C      t  )z/getattr(self, name) returning a python constantry   r   txr   r   r   r   const_getattr   s   zVariableTracker.const_getattrc                 C   sD   |  ||}tj|st d}| jrt| j|}tjj||dS )z,getattr(self, name) returning a new variableN)rM   )r   r   ConstantVariableZ
is_literalrz   rM   r   create)r   r   r   rQ   rM   r   r   r   var_getattr   s   zVariableTracker.var_getattrc                 C   r}   r~   )as_proxyrz   r   r   r   r   is_proxy
  r   zVariableTracker.is_proxyc                 C   s   t t| r   )rz   rv   r   r   r   r   r     s   zVariableTracker.as_proxyc                 C   r   r   ry   )r   codegenr   r   r   reconstruct     zVariableTracker.reconstructc                 C   sN   ||j ju s
J dzddlm} ||}| | W dS  ty&   Y dS w )z[If it is possible to reconstruct the Python object this
        VariableTracker represents.zOnly root tx can reconstructr   )	PyCodegenTF)outputZroot_txr   r   r   rz   )r   r   r   Zcgr   r   r   can_reconstruct  s   
zVariableTracker.can_reconstructc                 C   r   r   ry   r   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   rz   r   r   r   r   has_unpack_var_sequence'  s   
z'VariableTracker.has_unpack_var_sequencec                 C   s   t d|   d S )Nzinspect_parameter_names: r
   r   r   r   r   inspect_parameter_names.  r3   z'VariableTracker.inspect_parameter_namesc                 C   s   t d| jj d|  d S )Nzhasattr  )r   r2   r   r   r   r   r   call_hasattr1  s   zVariableTracker.call_hasattrrD   List[VariableTracker]rE   Dict[str, VariableTracker]c                 C   s   t d|  d| d|  d S )Nzcall_function r   r
   )r   r   rD   rE   r   r   r   call_function4  s   zVariableTracker.call_functionc              	   C   s   |dkr|  |r|s|rJ tjt| |S |dkr6t|dkr6|d  r6|s6| ||d  S t	d|  d| d| d| )N__len____getattr__r   r   zcall_method r   )
r   r   r   r   lenr   r   r   r|   r   )r   r   r   rD   rE   r   r   r   call_method9  s   
 zVariableTracker.call_methodc                 C   s@   |j |}| jrt| jts|| _| S | j|d}|| |S )N)rN   )r   Znew_varrP   r'   r/   rN   rT   Zreplace_all)r   r   r   new_nameZnew_vtr   r   r   renameL  s   zVariableTracker.renamec                 C      | S )z=Used by LazyVariableTracker to build the real VariableTrackerr   r   r   r   r   rJ   U     zVariableTracker.realizec                 C   s   t dd | S )zRealize all objects under thisc                 S   s   |   S r   )rJ   )xr   r   r   rZ   [  s    z3VariableTracker.recursive_realize.<locals>.<lambda>)rI   rU   r   r   r   r   recursive_realizeY  s   z!VariableTracker.recursive_realizec                 C   r   )zSUsed by LazyVariableTracker to return the real VariableTracker if it already existsr   r   r   r   r   rm   ]  r   zVariableTracker.unwrapc                 C   rW   )z:Used by LazyVariableTracker to indicate an unrealized nodeTr   r   r   r   r   rn   a  r   zVariableTracker.is_realized)rM   rP   rN   rO   rM   rP   rN   rO   c                   s&   t    || _|| _|| _|| _d S r   )r0   r    rM   rP   rN   rO   )r   rM   rP   rN   rO   r1   r   r   r    e  s
   

zVariableTracker.__init__c                    sF    j d u r	t  _ tj fdd fdd j D dd d d S )Nc                    s   | j  j S r   )rO   r#   )noder   r   r   rZ   x  s    z/VariableTracker.__post_init__.<locals>.<lambda>c                    s   g | ]\}}| j vr|qS r   )r]   rj   r   r   r   rh   y  s    z1VariableTracker.__post_init__.<locals>.<listcomp>c                 S   rW   r!   r   rX   r   r   r   rZ   z  r[   )rc   )rO   r   rI   rU   rR   rr   )r   rD   rE   r   r   r   rB   s  s   


zVariableTracker.__post_init__)rD   r   rE   r   rG   rI   )rG   rI   )+r   r   r   r   r]   rT   classmethodrV   r   rU   ru   rw   r{   r|   r   r   rv   r   r   r   r   r   r   r   r   r   rL   r   r   r   r   r   r   rJ   r   rm   rn   r   r/   r   r    rB   r:   r   r   r1   r   rI      sz    	
<



	
rI   )	metaclassc                  G   s>   t | dkr| \}t|trt|S t|jS dtt| S )Nr   r   )	r   r'   rI   rv   r@   r   joinmaptypestr)ZobjsrF   r   r   r   r   ~  s   

r   )rp   enumr   typingr   r   r   r    r   r	   excr   rM   r   r   utilsr   r   r   r   r,   r/   r<   r>   r@   r?   rI   r   r   r   r   r   <module>   s$    % v