
    9i5@                        d Z ddlZ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ZddlmZmZ ddlmZmZ dd	lmZmZ dd
lmZmZmZmZmZmZ ddlm Z m!Z! e
rddl"m#Z# ddl$m%Z%  G d de!          Z& G d de!          Z'dS )a  
Constant and enum variable tracking in Dynamo.

This module is fundamental to Dynamo's ability to track and propagate constant
values during compilation, ensuring proper handling of Python literals and
maintaining type safety through the compilation process.
    N)Sequence)AnyLiteralOptionaloverloadTYPE_CHECKINGUnion)override)
AttrSourceGetItemSource   )graph_break_hints	variables)raise_observed_exceptionunimplemented)cmp_name_to_op_mappingcommon_constant_typesistypenpraise_args_mismatchraise_on_overridden_hash   )ValueMutationNewVariableTracker)InstructionTranslator)UserFunctionVariablec                       e Zd ZdZeededd fd                        Zeededede	fd                        Zededede	fd            Zdededdf fd	Z
defd
ZdefdZdefdZded         fdZdefdZdedefdZdefdZedee	         fd            Zddde	de	fdZededefd            Zededefd            Zded         dee	         fdZdddede	fdZdddedee	         deee	f         de	f
 fdZddd d!d"e	d#e e	         d$eee	f         de	f fd%Z!e"dddedd fd&            Z#d' Z$d( Z%d) Z& xZ'S )*ConstantVariablea  
    Variable tracker for Python literals and basic immutable types, with automatic
    routing support for collection types (lists, tuples, sets, etc.).

    The create() method intelligently constructs appropriate variable types for
    nested collections.
    valuereturnc                     d S N r   s    S/var/www/icac/venv/lib/python3.11/site-packages/torch/_dynamo/variables/constant.pycreatezConstantVariable.create.   s    363    kwargsc                     d S r"   r#   )r   r(   s     r%   r&   zConstantVariable.create2   s    >Acr'   c                 
   |                     d          }t          | t                    rd | D             }t          j        |fi |S t          | t
                    rd | D             }t          j        |fi |S t          | t                    r?| j        | j	        | j
        f}t          d |D                       }t          j        |fi |S t          | t          t          f          rg }t          |           D ]H\  }}|rt          ||          nd}|                    t"                              ||                     It          j                            t+          |                     |fi |S t#          | fi |S )aV  
        Create a `ConstantVariable` based on the given value, and supports
        automatic routing for collection types like `tuple` (in which case we'd
        create `ConstantVariable` for the leaf items).

        NOTE: the caller must install the proper guards if needed; most often
        the guard will be `CONSTANT_MATCH`.
        sourcec                 B    g | ]}t                               |          S r#   r   r&   .0xs     r%   
<listcomp>z+ConstantVariable.create.<locals>.<listcomp>D   '    ???A%,,Q//???r'   c                 B    g | ]}t                               |          S r#   r-   r.   s     r%   r1   z+ConstantVariable.create.<locals>.<listcomp>G   r2   r'   c              3   J   K   | ]}t                               |          V  d S r"   r-   )r/   args     r%   	<genexpr>z*ConstantVariable.create.<locals>.<genexpr>K   s1      #W#WS$4$;$;C$@$@#W#W#W#W#W#Wr'   Nr+   )get
isinstancesetr   SetVariable	frozensetFrozensetVariableslicestartstopsteptupleSliceVariablelist	enumerater   appendr   r&   BaseListVariablecls_fortype)	r   r(   r+   items
slice_argsslice_args_varsir0   item_sources	            r%   r&   zConstantVariable.create6   s    H%% eS!! 	T?????E(99&999y)) 	T?????E.u?????u%% 	T+uz5:>J##W#WJ#W#W#WWWO*?EEfEEEe}-- 
	TE!%((  1:@JmFA666d$++* ,      -55d5kkBB5SSFSSS00000r'   Nc                 *    t                      j        di | t                              |          sJ dt	          |           d            t
          5t          |t
          j                  r|                                | _	        d S || _	        d S )Nz7
Cannot construct `ConstantVariable` for value of type a`  .

This failure likely due to PyTorch-internal use of `ConstantVariable` on
non-literal python values, please try using `VariableTracker.build` instead. If
you believe it's a necessary and legitimate use case (the value is immutable and
can't easily be represented with another `VariableTracker` class), please add
its type to `common_constant_types`.
r#   )
super__init__r   is_base_literalrI   r   r9   numberitemr   selfr   r(   	__class__s      r%   rQ   zConstantVariable.__init__[   s    ""6"""//66 	 	 97;E{{9 9 9 	 	 	 >j	::>DJJJDJJJr'   c                     | j         S r"   r$   rV   s    r%   as_proxyzConstantVariable.as_proxyk   
    zr'   c                 f    dt          | j                  j         dt          | j                   dS )NzConstantVariable(z: ))rI   r   __name__reprrY   s    r%   __repr__zConstantVariable.__repr__n   s2    S4
#3#3#<SSTZ@P@PSSSSr'   c                     | j         S r"   r$   rY   s    r%   as_python_constantz#ConstantVariable.as_python_constantq   r[   r'   Tc                     dS NTr#   rY   s    r%   is_python_constantz#ConstantVariable.is_python_constantt       tr'   c                 D    t          | j        t          t          f          S r"   )r9   r   intboolrY   s    r%   is_symnode_likez ConstantVariable.is_symnode_likew   s    $*sDk222r'   valuesc                     | j         |v S r"   r$   )rV   rk   s     r%   is_constant_matchz"ConstantVariable.is_constant_matchz   s    zV##r'   c                     | j         d u S r"   r$   rY   s    r%   is_constant_nonez!ConstantVariable.is_constant_none}   s    zT!!r'   c                 .    |                      d          S )zz
        Need this when adding a BaseListVariable and a ConstantVariable together.
        Happens in detectron2.
        N)tx)unpack_var_sequencerY   s    r%   rJ   zConstantVariable.items   s     ''4'000r'   rq   r   r5   c                 p    t                               | j        |                                                   S r"   )r   r&   r   rb   )rV   rq   r5   s      r%   getitem_constzConstantVariable.getitem_const   s2      &&Js--//0
 
 	
r'   objc                 .    t          |           t          v S r"   )rI   r   ru   s    r%   rR   z ConstantVariable.is_base_literal   s    Cyy111r'   c                     t          |           t          t          t          t          t
          j        fv rt          d | D                       S t          	                    |           S )Nc              3   J   K   | ]}t                               |          V  d S r"   )r   
is_literalr.   s     r%   r6   z.ConstantVariable.is_literal.<locals>.<genexpr>   s1      CC!'22155CCCCCCr'   )
rI   rD   rB   r:   r<   torchSizeallr   rR   rw   s    r%   rz   zConstantVariable.is_literal   sQ    99uc9ejAAACCsCCCCCC//444r'   c                 t    	 d |                                  D             S # t          $ r}t          |d }~ww xY w)Nc                 B    g | ]}t                               |          S r#   r-   r.   s     r%   r1   z8ConstantVariable.unpack_var_sequence.<locals>.<listcomp>   s'    RRR1$++A..RRRr'   )rb   	TypeErrorNotImplementedError)rV   rq   es      r%   rr   z$ConstantVariable.unpack_var_sequence   sN    	-RR8O8O8Q8QRRRR 	- 	- 	-%1,	-s     
727namec                     t          | j        |          st          t          ||g           t	          | j        |          }t          |          rt          |S )Nargs)hasattrr   r   AttributeErrorgetattrcallabler   )rV   rq   r   members       r%   const_getattrzConstantVariable.const_getattr   sZ    tz4(( 	F$^RtfEEEET**F 	&%%r'   r   c                    ddl m |dk    rPt          | j        t                    r6t          j        t          j                                      || g||          S |dk    rt          | j        t                    r|st          |          dk    r2t          ||dt          |           dt          |           d           |d                             |          }	 d	 |D             }t                              | j                            |                    S # t          $ r' t!                                          ||||          cY S w xY w|d
k    rLt          | j        t                    r2ddlm}  ||                     |          t+                                S t-          fd|D                       rNt
          j                            ||                                 | j                                      ||||          S 	 d |D             }d |                                D             }	n4# t          $ r' t!                                          ||||          cY S w xY wt3          | j        t                    ry|t          j        v rkt7          | j        |          }
	 t                               |
|i |	          S # t8          $ r(}t;          t=          |          |           Y d }~nd }~ww xY wt3          | j        t>          t@          f          r|s|s	 t                               t7          | j        |                                S # tB          tD          f$ rS}t;          t=          |          |tG          tI          t          j        |j%                                       Y d }~nd }~ww xY wtM          tN          |          rBt          |          dk    r.|d         (                                r|d         }t7          tN          |          }t3          |tR          j*        tR          j+        tR          j,        f          r;|j-        .                    d|| j        |fi           }                    |||          S 	 t                               || j        |                    S # t8          $ rS}t;          t=          |          |tG          tI          t          j        |j%                                       Y d }~nd }~ww xY wnt3          | j        t^                    r;|dk    r5t7          | j        |          }
t                               |
|i |	          S t=          | j                  t`          u rx|t`          j        v rjt7          | j        |          }
	 t                               |
|i |	          S # t8          $ r'}t;          t=          |          |           Y d }~nd }~ww xY w|dk    r0|s.|s,t                              t          | j                            S |dk    rt          |          dk    r|d         (                                r	 t                              tc          | j        |d         2                                                    S # t8          $ rS}t;          t=          |          |tG          tI          t          j        |j%                                       Y d }~nd }~ww xY w|dk    rt          |          dk    r|d         (                                r|rJ |d         2                                }	 || j        v }t                              |          S # tf          $ rS}t;          t=          |          |tG          tI          t          j        |j%                                       Y d }~nd }~ww xY wt!                                          ||||          S )Nr   SymNodeVariableformatjoinz1 args and 0 kwargsz
 args and z kwargsr   c                 6    g | ]}|                                 S r#   rb   r.   s     r%   r1   z0ConstantVariable.call_method.<locals>.<listcomp>   s$    JJJQ1133JJJr'   __iter__)ListIteratorVariable)mutation_typec              3   8   K   | ]}t          |          V  d S r"   )r9   )r/   r0   r   s     r%   r6   z/ConstantVariable.call_method.<locals>.<genexpr>   s-      <<!z!_--<<<<<<r'   c                 6    g | ]}|                                 S r#   r   )r/   as     r%   r1   z0ConstantVariable.call_method.<locals>.<listcomp>   s$    ???Q!..00???r'   c                 >    i | ]\  }}||                                 S r#   r   )r/   kvs      r%   
<dictcomp>z0ConstantVariable.call_method.<locals>.<dictcomp>   s*    QQQ$!QAq3355QQQr'   r   call_functiondecode__len__	__round____contains__)4tensorr   r   r   strr   BuiltinVariabler   r   lenr   force_unpack_var_sequencer   r&   r   r   rP   call_methodlistsr   rr   r   anyrZ   rJ   r9   __dict__r   	Exceptionr   rI   floatrh   OverflowError
ValueErrorrD   mapr   r   operatorre   r{   SymBoolSymFloatSymIntoutputcreate_proxybytescomplexroundrb   r   )rV   rq   r   r   r(   arg_unpacked	arg_constr   
const_argsconst_kwargsmethodr   exc
add_targetopproxysearchresultr   rW   s                     @r%   r   zConstantVariable.call_method   s~    	,+++++8tz3 7 7,SZ88FFTMDM6   V^^tz3 7 7^ Ta#)4yy@@CKK@@@	    7<<R@@LCJJ\JJJ	'..tzy/I/IJJJ& C C Cww**2tT6BBBBBCZF4:s$;$; 433333''((,,<L<N<N    <<<<t<<<<< 	2,33DMMOOTZ k"dD&112	???$???JQQ&,,..QQQLL" 	? 	? 	?77&&r4v>>>>>	? dj#&& .	643<+?+?TZ..F6'..vvz/R\/R/RSSS 6 6 6(a"555555556
UCL11 (	6 F +223L74:t3L3L3N3NOOO%z2   ,S		!#&6&=sx"H"HII         $''IINNG..00 # (]
Xt,, M   I22'dj*-Er E +11"eZHHH/66rr$*j7Q7QRRR$   0 GGRd37G7NPQPV3W3W.X.X         
E** 	6tx/?/?TZ..F#**66:+N+N+NOOO$*((TW5E-E-ETZ..F6'..vvz/R\/R/RSSS 6 6 6(a"555555556 9df#**3tz??;;;[  SYY!^^Q8R8R8T8T^'..$*d1g&@&@&B&BCC      (GGRd3/?/F+O+O&P&P         ^##D		Q47;U;U;W;W!W//11F4:-'..v666   (GGRd3/?/F+O+O&P&P         ww""2tT6:::s   "=D   .EE*H; ;.I,+I,-K 
K?K::K?)4M O/A	N==O(R= =
TA	TT2W 
XW>>X0AZ5 5
\?A	\\'"^
 

_'A	_""_'tree_map_fnr   map_fnresttree_map_kwargsc           
         | j         |                    d          }|L	 t          |                                          }n_# t          $ r |                     |||||          cY S w xY wt          t          |dd           dd          }|                    d           }|r|                    || g|i           S |D ]1}	|		                                s|                     |||||          c S 2| 
                                S t          | j         t          t          t          t          t          t           t"          j        f          r|                    || g|i           S t'                                          |||||          S )Nnone_is_leaffn
__module__ optree)r   r8   ri   rb   r   _tree_map_fallbackr   
startswithr   ro   cloner9   rh   r   r   r   r   r{   dtyperP   call_tree_map)rV   rq   r   r   r   r   none_is_leaf_varr   tree_map_moduleotherrW   s             r%   r   zConstantVariable.call_tree_map#  s    :.22>BB+	#'(8(K(K(M(M#N#NLL*   22#'     #*Kt44lB# # $3#=#=h#G#GG $++BrBBB!  E 1133 #66'" +       zz||#dj3tWc5%+"VWW 	?''TMDM2>>>ww$$
 
 	
s   !A #A)(A)c                 j    t          | j        |          }t          j                            |          S r"   )r   r   r   r   r&   )rV   rq   r   r   s       r%   call_obj_hasattrz!ConstantVariable.call_obj_hasattrW  s,     T**)00888r'   c                     dS rd   r#   rY   s    r%   is_python_hashablez#ConstantVariable.is_python_hashable^  rf   r'   c                 *    t          | j                  S r"   )hashr   rY   s    r%   get_python_hashz ConstantVariable.get_python_hasha  s    DJr'   c                     ddl m} t          ||          r*|                                 |                                k    S |                                 |                                k    S )Nr   r   )r   r   r9   rb   evaluate_expr)rV   r   r   s      r%   is_python_equalz ConstantVariable.is_python_equald  sm    ++++++e_-- 	F**,,0C0C0E0EEE&&((E,D,D,F,FFFr'   )(r^   r   __qualname____doc__r   staticmethodri   r&   r   r   rQ   rZ   r   r`   rb   r   re   rj   rm   ro   propertyrD   rJ   rt   objectrR   rz   r   rr   r   dictr   r   r   r
   r   r   r   r   __classcell__rW   s   @r%   r   r   %   s         6d61666 \ X6AcASA_AAA \ XA"1c "1S "1_ "1 "1 "1 \"1Hc S T       #    T# T T T TC    GDM    3 3 3 3 3$ $ $ $ $ $"$ " " " " 1tO, 1 1 1 X1
)
0?
	
 
 
 
 2V 2 2 2 2 \2 5 54 5 5 5 \5
-23-	o	- - - - 7 s     x;#x; x; ?#	x;
 S/)*x; 
x; x; x; x; x; x;t2
#2
 ,2
  	2

 '2
 c?232
 
2
 2
 2
 2
 2
 2
h 9)9149	9 9 9 X9       G G G G G G Gr'   r   c            	           e Zd ZdZdeej        ej        f         deddf fdZ	e
deded	edd fd
            Zdeej        ef         fdZdefdZdeej        ej        f         fdZdddedefdZd Zd Zd Z xZS )EnumVariablezVariableTracker for enum.Enum and enum.IntEnum instances

    Provides specialized handling for Python enum types, supporting
    both standard Enum and IntEnum with proper value tracking and comparison.
    r   r(   r    Nc                 H     t                      j        di | || _        d S )Nr#   )rP   rQ   r   rU   s      r%   rQ   zEnumVariable.__init__t  s+    ""6"""


r'   cls_typevalue_vtoptionsc           
      F   |                                 r:t          |          D ]*}|j        |                                k    r | |fi |c S +t	          dd| dt          |           d| dt          |           dg t
          j        t
          j                   d S )Nz!Failed to construct Enum variablezvalue: z, allowed enum values: zAttempted to construct an Enum value that is non-constant (e.g. int, string) or is not an acceptable value for the Enum. Acceptable values for Enum `z`: .)gb_typecontextexplanationhints)re   rD   r   rb   r   r   
USER_ERRORSUPPORTABLE)clsr   r   r   r   s        r%   r&   zEnumVariable.createx  s     &&(( 	2x.. 2 2<8#>#>#@#@@@3v1111111 A7OhOOtH~~OOJ+3J J8<XJ J J R%0Q3D3PQ	
 	
 	
 	
 	
 	
r'   c                 l    t          | j        t                    rt          | j                  S | j        S r"   )r9   r   rh   rY   s    r%   rZ   zEnumVariable.as_proxy  s,    dj#&& 	#tz??"zr'   c                 2    dt          | j                   dS )NzEnumVariable(r]   )rI   r   rY   s    r%   r`   zEnumVariable.__repr__  s    2tDJ//2222r'   c                     | j         S r"   r$   rY   s    r%   rb   zEnumVariable.as_python_constant  r[   r'   rq   r   r   c                    t          | j        |          st          |t          v rt	          j        | |          S t          | j        |          }| j        ot          | j        |          }t          j
        |||          S )Nr7   )r   r   r   r   r   GetAttrVariabler   r+   r   r   build)rV   rq   r   r   r+   s        r%   var_getattrzEnumVariable.var_getattr  s|    tz4(( 	&%%))),T4888T**>DK!>!>$R????r'   c                 0    t          | j        |            dS rd   )r   r   rY   s    r%   r   zEnumVariable.is_python_hashable  s     T222tr'   c                 D    t          |                                           S r"   )r   rb   rY   s    r%   r   zEnumVariable.get_python_hash  s    D++--...r'   c                 V    |                                  |                                 k    S r"   r   )rV   r   s     r%   r   zEnumVariable.is_python_equal  s%    &&((E,D,D,F,FFFr'   )r^   r   r   r   r	   enumEnumIntEnumr   rQ   classmethodr   r&   rh   rZ   r   r`   rb   r   r   r   r   r   r   s   @r%   r   r   m  sz        eDIt|$;<  PT       

&5
@C
	
 
 
 [
 %	3/    
3# 3 3 3 3E$)T\*A$B    @5 @S @_ @ @ @ @  / / /G G G G G G Gr'   r   )(r   r  r   collections.abcr   typingr   r   r   r   r   r	   typing_extensionsr
   r{   torch._dynamo.sourcer   r   r   r   r   r   r   r   utilsr   r   r   r   r   r   baser   r   torch._dynamo.symbolic_convertr   	functionsr   r   r   r#   r'   r%   <module>r     s      $ $ $ $ $ $ I I I I I I I I I I I I I I I I & & & & & &  : : : : : : : : + + + + + + + + 9 9 9 9 9 9 9 9                4 3 3 3 3 3 3 3  0DDDDDD//////EG EG EG EG EG EG EG EGP
8G 8G 8G 8G 8G? 8G 8G 8G 8G 8Gr'   