
    קg`0                     .   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 e	rd d
lmZ  G d de          Z G d d          Z G d de          Zd ZdefdZ G d de          Z G d de          Zd ZdS )    N)Enum)AnyCallableDictListOptionalTYPE_CHECKING   )	variables)current_scope_idunimplemented)
AttrSourceSource)istype)InstructionTranslatorc                       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     X/var/www/html/ai-engine/env/lib/python3.11/site-packages/torch/_dynamo/variables/base.pyr   r      s$          HEEEr   r   c                   "    e Zd ZdZdeddfdZdS )MutableLocalBasez/
    Base class for Variable.mutable_local
    typreturnNc                     |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!   s     r   __init__zMutableLocalBase.__init__"   s[    0 $---DJJJ&,,,)++DJJJBSBBCCCCCr   )r   r   r   r   r   r&   r   r   r   r    r       sI         D. D4 D D D D D Dr   r    c                   0     e Zd ZdZd fdZd Zd Z x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.
    r"   Nc                 ^    t                                          t          j                   d S N)superr&   r   r   )r%   	__class__s    r   r&   zMutableLocal.__init__I   s%    +122222r   c                      t          |           S r*   )idr%   s    r   __hash__zMutableLocal.__hash__L   s    $xxr   c                 
    | |u S r*   r   )r%   others     r   __eq__zMutableLocal.__eq__O   s    u}r   r"   N)r   r   r   r   r&   r0   r3   __classcell__r,   s   @r   r(   r(   B   se         3 3 3 3 3 3        r   r(   c                     | dk    S )Nr   r   )scope_ids    r   _is_top_level_scoper9   S   s    q=r   mc                 V    t                      }t          |          rdS | j        |k    S )NT)r   r9   r$   )r:   r8   s     r   is_side_effect_safer<   W   s1    !!H
 8$$ t7hr   c                   0     e Zd Zg ZdefdZd fdZ xZS )VariableTrackerMetar"   c                     t                               t          j        |          r)| t          t          j        fvr|                                }t                               | |          S )z-Make isinstance work with LazyVariableTracker)type__instancecheck__r   LazyVariableTrackerVariableTrackerrealize)clsinstances     r   rA   z%VariableTrackerMeta.__instancecheck__f   sf    !!)8
 
 	*)
 
 
  ''))H%%c8444r   Nc                     t                                          |||           t          j                            |            d S r*   )r+   r&   r>   all_subclassesappend)rE   namebasesattrsr,   s       r   r&   zVariableTrackerMeta.__init__q   s<    ue,,,*11#66666r   r4   )r   r   r   rH   boolrA   r&   r5   r6   s   @r   r>   r>   c   s]        N	5D 	5 	5 	5 	57 7 7 7 7 7 7 7 7 7r   r>   c                       e Zd ZdZh dZd Ze	 d1ded gdf         dede	e
eef                  ddfd	            Zdefd
Zd Zd Zd Zd Zd Zd ZdddedefdZdddedd fdZd Zd Zd Zd Zd Zded          fdZded          fdZdefdZ defdZ!dee         fdZ"dddedd fd Z#	 	 	 	 	 	 	 	 d2d%Z$	 	 	 	 	 	 d3d&Z%d' Z&d4d(Z'd4d)Z(d* Z)d+ Z*d, Z+ddd-d.e,d/e-ddf fd0Z. xZ/S )5rC   z
    Base class for tracked locals and stack values

    VariableTracker instances are immutable and should be copied in
    order to change them.
    >   valueguardssourcemutable_localparents_trackeruser_code_variable_namec                 n    t          | j                  }|                    |            | j        di |S )z)Shallow copy with some (optional) changesr   )dict__dict__updater,   )r%   kwargsargss      r   clonezVariableTracker.clone   s;    DM""Ft~%%%%%r   NfnrO   cacher"   c                 n   |i }t          |          }||v rdS |||<   t          |t                    rv|                                } ||           |                                }|j        }|j                                        D ] \  }}||vr|                     |||           !dS t          |t          t          f          r|D ]}|                     |||           dS t          |t          t          j        f          r.|                                D ]}|                     |||           dS dS )zM
        Walk value and call fn on all the VariableTracker instances
        N)r.   
isinstancerC   unwrap_nonvar_fieldsrW   itemsvisitr   listtuplerV   collectionsOrderedDictvalues)rE   r\   rO   r]   idxnonvarskeysubvalues           r   rc   zVariableTracker.visit   sf    =Eii%<<Fc
e_-- 	/LLNNEBuIIILLNNE*G!&!5!5!7!7 3 3Xg%%IIb(E2223 3 ED%=)) 	/! / /		"h..../ /ED+"9:;; 	/!LLNN / /		"h....	/ 	// /r   c                      | j         j         dS )Nz())r,   r   r/   s    r   __repr__zVariableTracker.__repr__   s    .)----r   c                     	 t          |                                           S # t          $ r t          |           cY S w xY wr*   )repras_python_constantNotImplementedErrorr/   s    r   
debug_reprzVariableTracker.debug_repr   sN    	//11222" 	 	 	::	s    # ??c                     	 t          |                                           S # t          $ r t          |  d          dw xY w)a  
        Abstract method to be implemented by subclasses of VariableTracker.

        This method should return the type represented by the instance of the subclass.
        The purpose is to provide a standardized way to retrieve the Python type information
        of the variable being tracked.

        Returns:
            type: The Python type (such as int, str, list, etc.) of the variable tracked by
                the subclass. If the type cannot be determined or is not relevant,
                leaving it undefined or invoking super() is always sound.

        Note:
            This is an abstract method and may be overridden in subclasses.

        Example:
            class SetVariable(VariableTracker):
                def python_type(self):
                    return set

        Raises:
            NotImplementedError: If the method is not implemented in a subclass.
        z has no typeN)r@   rq   rr   r/   s    r   python_typezVariableTracker.python_type   sZ    0	G//11222" 	G 	G 	G%&;&;&;<<$F	Gs	    # Ac                 &    t          |  d          )zFor constantsz is not a constantrr   r/   s    r   rq   z"VariableTracker.as_python_constant   s    !T"="="=>>>r   c                     	 |                                  S # t          $ r'}t          t          |                     Y d}~dS d}~ww xY w)zcSimilar to as_python_constant(), but add ID_MATCH guards to try to force things to become constantsN)rq   rr   r   str)r%   es     r   guard_as_python_constantz(VariableTracker.guard_as_python_constant   s^    	"**,,," 	" 	" 	"#a&&!!!!!!!!!	"s    
AAAc                 R    	 |                                   dS # t          $ r Y dS w xY wNTF)rq   rr   r/   s    r   is_python_constantz"VariableTracker.is_python_constant   s@    	##%%%4" 	 	 	55	    
&&c                 R    | j         r| j                             |          S t          r*   )rQ   
make_guardrr   )r%   r\   s     r   r   zVariableTracker.make_guard   s(    ; 	.;))"---!!r   txr   rJ   c                     t           )z/getattr(self, name) returning a python constantrw   r%   r   rJ   s      r   const_getattrzVariableTracker.const_getattr   s    !!r   c                     |                      ||          }t          j                            |          st          d}| j        rt          | j        |          }t          j                            ||          S )z,getattr(self, name) returning a new variableN)rQ   )r   r   ConstantVariable
is_literalrr   rQ   r   create)r%   r   rJ   rO   rQ   s        r   var_getattrzVariableTracker.var_getattr   sr    ""2t,,)44U;; 	&%%; 	3T22F)00v0FFFr   c                 R    	 |                                   dS # t          $ r Y dS w xY wr}   )as_proxyrr   r/   s    r   is_proxyzVariableTracker.is_proxy   s;    	MMOOO4" 	 	 	55	r   c                 :    t          t          |                     r*   )rr   ry   r/   s    r   r   zVariableTracker.as_proxy  s    !#d)),,,r   c                     	 |                                  }dd l}t          ||j        j                  r|j        S d S # t          $ r Y d S w xY w)Nr   )r   torch.fxr_   fxProxynoderr   )r%   proxytorchs      r   maybe_fx_nodezVariableTracker.maybe_fx_node  sb    	MMOOEOOO%00 "z!4" 	 	 	44	s   8= 
A
Ac                     t           r*   rw   )r%   codegens     r   reconstructzVariableTracker.reconstruct      !!r   c                     ||j         j        u s
J d            	 ddlm}  ||          }|                     |           dS # t
          $ r Y dS w xY w)z[If it is possible to reconstruct the Python object this
        VariableTracker represents.zOnly root tx can reconstructr
   )	PyCodegenTF)outputroot_txr   r   r   rr   )r%   r   r   cgs       r   can_reconstructzVariableTracker.can_reconstruct  s     RY&&&&(F&&&	++++++2BR   4" 	 	 	55	s   &A 
AAc                     t           r*   rw   r%   r   s     r   unpack_var_sequencez#VariableTracker.unpack_var_sequence!  r   r   c                 ,    |                      |          S r*   )r   r   s     r   force_unpack_var_sequencez)VariableTracker.force_unpack_var_sequence$  s     ''+++r   c                 T    	 |                      |           dS # t          $ r Y dS w xY wr}   )r   rr   r   s     r   has_unpack_var_sequencez'VariableTracker.has_unpack_var_sequence-  sB    	$$R(((4" 	 	 	55	s    
''c                 ,    |                      |          S r*   )r   r   s     r   has_force_unpack_var_sequencez-VariableTracker.has_force_unpack_var_sequence5  s    ++B///r   c                 *    t          d|             d S )Nzinspect_parameter_names: r   r/   s    r   inspect_parameter_namesz'VariableTracker.inspect_parameter_names8  s    8$8899999r   c                 D    t          d| j        j         d|            d S )Nzhasattr  )r   r,   r   r   s      r   call_hasattrzVariableTracker.call_hasattr;  s,    A!8AA4AABBBBBr   rZ   List[VariableTracker]rY   Dict[str, VariableTracker]c                 6    t          d|  d| d|            d S )Nzcall_function r   r   )r%   r   rZ   rY   s       r   call_functionzVariableTracker.call_function>  s1     	=t==d==V==>>>>>r   c           
         |dk    rZ|                      |          rE|s|rJ t          j                            t	          |                     |                              S |dk    r]t	          |          dk    rJ|d                                         r0|s.|                     ||d                                                   S t          d|  d| d| d|            d S )N__len____getattr__r   r   zcall_method r   )
r   r   r   r   lenr   r~   r   rq   r   )r%   r   rJ   rZ   rY   s        r   call_methodzVariableTracker.call_methodF  s     9!=!=b!A!A''''-44S9Q9QRT9U9U5V5VWWWM!!D		QQ**,,   ##BQ(B(B(D(DEEEBTBBDBB4BB&BBCCCCCr   c                     d S r*   r   )r%   rJ   s     r   set_name_hintzVariableTracker.set_name_hintY  s    r   c                     | S )z=Used by LazyVariableTracker to build the real VariableTrackerr   r/   s    r   rD   zVariableTracker.realize\      r   c                     | S )zSUsed by LazyVariableTracker to return the real VariableTracker if it already existsr   r/   s    r   r`   zVariableTracker.unwrap`  r   r   c                     dS )z:Used by LazyVariableTracker to indicate an unrealized nodeTr   r/   s    r   is_realizedzVariableTracker.is_realizedd  s    tr   c                 ,    t          d|  d           d S )Nznext()r   r   s     r   next_variablezVariableTracker.next_variableh  s    odooo&&&&&r   c                 :    |j         o|                     |           S r*   )strict_checks_fnr   s     r   is_strict_modezVariableTracker.is_strict_modek  s    "@r':':4'@'@@r   )rQ   rR   rQ   rR   c                d    t                                                       || _        || _        d S r*   )r+   r&   rQ   rR   )r%   rQ   rR   r,   s      r   r&   zVariableTracker.__init__n  s0     	*r   r*   )r   r   rZ   r   rY   r   r"   rC   )rZ   r   rY   r   r"   rC   )r"   rC   )0r   r   r   r   ra   r[   classmethodr   r   r   r   intrc   ry   rn   rs   ru   rq   r{   r~   r   r   r   r   r   r   r   r   r   r   r   rM   r   r   r   r   r   r   r   rD   r`   r   r   r   r   r(   r&   r5   r6   s   @r   rC   rC   v   s          N& & & 
 +/	/ /'($.// / S#X'	/
 
/ / / [/B.# . . . .  G G G:? ? ?" " "  " " "
" 7 "s "s " " " "G5 GS GEV G G G G  - - -	 	 	" " "  ".?)@ " " " ",t4E/F , , , ,T    04 0 0 0 0:c : : : :C6 Cc CFW C C C C?#? &? -	?
 
? ? ? ?D &	D
 -D 
D D D D&          ' ' 'A A A &*	+ + + + $	+
 
+ + + + + + + + + +r   rC   )	metaclassc                      t          |           dk    r<| \  }t          |t                    rt          |          S t	          |          j        S d                    t          t          |                     S )Nr   r   )	r   r_   rC   ry   r@   r   joinmaptypestr)objsobjs     r   r   r   y  s`    
4yyA~~c?++ 	&s88O99%%xxGT**+++r   )rf   enumr   typingr   r   r   r   r   r	    r   r   excr   rQ   r   r   utilsr   torch._dynamo.symbolic_convertr   r   r    r(   r9   r<   r@   r>   rC   r   r   r   r   <module>r      s              E E E E E E E E E E E E E E E E       / / / / / /       ' ' ' ' ' ' ' '        EDDDDDD       "D "D "D "D "D "D "D "DJ    #   "  	+ 	 	 	 	7 7 7 7 7$ 7 7 7&@+ @+ @+ @+ @+ 3 @+ @+ @+ @+F, , , , ,r   