
    ȅiB                     
   S r SSKrSSKrSSKJr  SSKJrJrJrJ	r	J
r
Jr  SSKJr  SSKrSSKJrJr  SSKJrJr  SS	KJrJr  SS
KJrJrJrJrJrJr  SSKJ r J!r!  \
(       a  SSK"J#r#  SSK$J%r%   " S S\!5      r& " S S\!5      r'g)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                   x  ^  \ rS rSrSr\\S\SS 4S j5       5       r\\S\	S\	S\
4S j5       5       r\S\	S\	S\
4S j5       rS\	S\	SS	4U 4S
 jjrS\	4S jrS\4S jrS\	4S jrS\S   4S jrS\4S jrS\	S\4S jrS\4S jr\S\\
   4S j5       rSSS\
S\
4S jr\S\S\4S j5       r\S\S\4S j5       rS\S   S\\
   4S jrSSS\S\
4S jrSSS\S\\
   S\\\
4   S\
4
U 4S  jjr SSS!S"S#\
S$\!\
   S%\\\
4   S\
4U 4S& jjr"\#SSS\SS 4S' j5       r$S\S   4S( jr%S\&4S) jr'S*\S\4S+ jr(S,r)U =r*$ )-ConstantVariable%   z
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                     g N r    s    Z/home/james-whalen/.local/lib/python3.13/site-packages/torch/_dynamo/variables/constant.pycreateConstantVariable.create.   s    36    kwargsc                     g r#   r$   )r    r*   s     r&   r'   r(   3   s    >Ar)   c                    UR                  S5      n[        U [        5      (       a<  U  Vs/ s H  n[        R	                  U5      PM     nn[
        R                  " U40 UD6$ [        U [        5      (       a<  U  Vs/ s H  n[        R	                  U5      PM     nn[
        R                  " U40 UD6$ [        U [        5      (       aL  U R                  U R                  U R                  4n[        S U 5       5      n[
        R                  " U40 UD6$ [        U [        [        45      (       a|  / n[!        U 5       H<  u  psU(       a  [#        X'5      OSnUR%                  [        R	                  UUS95        M>     [
        R&                  R)                  [+        U 5      5      " U40 UD6$ [        U 40 UD6$ s  snf s  snf )a&  
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              3   L   #    U  H  n[         R                  U5      v   M     g 7fr#   )r   r'   ).0args     r&   	<genexpr>*ConstantVariable.create.<locals>.<genexpr>L   s     #WJS$4$;$;C$@$@J   "$Nr-   )get
isinstancesetr   r'   r   SetVariable	frozensetFrozensetVariableslicestartstopsteptupleSliceVariablelist	enumerater   appendBaseListVariablecls_fortype)	r    r*   r-   xitems
slice_argsslice_args_varsiitem_sources	            r&   r'   r(   7   s    H% eS!!9>?A%,,Q/E?((9&99y))9>?A%,,Q/E?..u???u%%++uzz5::>J##WJ#WWO**?EfEEe}--E!%(:@mF6d$++* ,  ) --55d5kB5SFSS000+ @ @s   F8<F=Nc                   > [         TU ]  " S0 UD6  [        R                  U5      (       d   S[	        U5       S35       e[
        b5  [        U[
        R                  5      (       a  UR                  5       U l	        g Xl	        g )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_literalrF   r   r6   numberitemr    selfr    r*   	__class__s      r&   rO   ConstantVariable.__init__\   ss    "6"//66 	 =77;E{m D9 	6 >j		::DJJr)   c                     U R                   $ r#   r%   rT   s    r&   as_proxyConstantVariable.as_proxyl       zzr)   c                 t    S[        U R                  5      R                   S[        U R                  5       S3$ )NzConstantVariable(z: ))rF   r    __name__reprrX   s    r&   __repr__ConstantVariable.__repr__o   s2    "4

#3#<#<"=RTZZ@P?QQRSSr)   c                     U R                   $ r#   r%   rX   s    r&   as_python_constant#ConstantVariable.as_python_constantr   r[   r)   Tc                     gNTr$   rX   s    r&   is_python_constant#ConstantVariable.is_python_constantu       r)   c                 B    [        U R                  [        [        45      $ r#   )r6   r    intboolrX   s    r&   is_symnode_like ConstantVariable.is_symnode_likex   s    $**sDk22r)   valuesc                      U R                   U;   $ r#   r%   )rT   ro   s     r&   is_constant_match"ConstantVariable.is_constant_match{   s    zzV##r)   c                     U R                   S L $ r#   r%   rX   s    r&   is_constant_none!ConstantVariable.is_constant_none~   s    zzT!!r)   c                      U R                  SS9$ )zb
Need this when adding a BaseListVariable and a ConstantVariable together.
Happens in detectron2.
N)tx)unpack_var_sequencerX   s    r&   rH   ConstantVariable.items   s     ''4'00r)   rw   r   r0   c                 b    [         R                  U R                  UR                  5          5      $ r#   )r   r'   r    rc   )rT   rw   r0   s      r&   getitem_constConstantVariable.getitem_const   s,      &&JJs--/0
 	
r)   objc                 &    [        U 5      [        ;   $ r#   )rF   r   r}   s    r&   rP    ConstantVariable.is_base_literal   s    Cy111r)   c                     [        U 5      [        [        [        [        [
        R                  4;   a  [        S U  5       5      $ [        R                  U 5      $ )Nc              3   L   #    U  H  n[         R                  U5      v   M     g 7fr#   )r   
is_literal)r/   rG   s     r&   r1   .ConstantVariable.is_literal.<locals>.<genexpr>   s     Cs!'22155sr3   )
rF   rA   r?   r7   r9   torchSizeallr   rP   r   s    r&   r   ConstantVariable.is_literal   s?    9uc9ejjAACsCCC//44r)   c                      U R                  5        Vs/ s H  n[        R                  U5      PM     sn$ s  snf ! [         a  n[        UeS nAff = fr#   )rc   r   r'   	TypeErrorNotImplementedError)rT   rw   rG   es       r&   rx   $ConstantVariable.unpack_var_sequence   sN    	-8<8O8O8QR8Q1$++A.8QRRR 	-%1,	-s!   ; 6; ; 
AAAnamec                     [        U R                  U5      (       d  [        [        X/S9  [	        U R                  U5      n[        U5      (       a  [        eU$ )Nargs)hasattrr    r   AttributeErrorgetattrcallabler   )rT   rw   r   members       r&   const_getattrConstantVariable.const_getattr   sE    tzz4(($^RfET*F%%r)   r   c                 F  >^ SSK Jm  US:X  aV  [        U R                  [        5      (       a7  [
        R                  " [        R                  5      R                  X/UQU5      $ US:X  a  [        U R                  [        5      (       a  U(       d  [        U5      S:w  a&  [        UUS[        U5       S[        U5       S35        US   R                  U5      n U Vs/ s H  ofR                  5       PM     nn[        R                  U R                  R                  U5      5      $ US	:X  aC  [        U R                  [        5      (       a$  SS
KJn  U" U R+                  U5      [-        5       S9$ [/        U4S jU 5       5      (       aH  [
        R                  R                  XR1                  5       U R                  5      R%                  XX45      $  U V	s/ s H  oR                  5       PM     n
n	UR3                  5        VVs0 s H  u  pXR                  5       _M     nnn[5        U R                  [        5      (       aF  U[        R6                  ;   a2  [9        U R                  U5      n [        R                  U" U
0 UD65      $ [5        U R                  [@        [B        45      (       GaM  [E        U R                  U5      (       Ga1  U(       d6  U(       d/   [        R                  [9        U R                  U5      " 5       5      $ [E        [P        U5      (       a  [        U5      S:X  a  US   RS                  5       (       a  U
S   n[9        [P        U5      n[5        U[T        RV                  [T        RX                  [T        RZ                  45      (       a=  UR\                  R_                  SUU R                  U40 5      nTR                  UUU5      $  [        R                  U" U R                  U5      5      $ O[5        U R                  [`        5      (       a7  US:X  a1  [9        U R                  U5      n[        R                  U" U
0 UD65      $ [?        U R                  5      [b        L aF  U[b        R6                  ;   a2  [9        U R                  U5      n [        R                  U" U
0 UD65      $ US:X  a7  U(       d0  U(       d)   [        R                  [        U R                  5      5      $ US:X  ab  [        U5      S:X  aS  US   RS                  5       (       a;   [        R                  [g        U R                  US   R                  5       5      5      $ US:X  ah  [        U5      S:X  aY  US   RS                  5       (       aA  U(       a   eUS   R                  5       n UU R                  ;   n[        R                  U5      $ ["        TU ]I  XX45      $ s  snf ! [          a    ["        TU ]I  XX45      s $ f = fs  sn	f s  snnf ! [          a    ["        TU ]I  XX45      s $ f = f! [:         a   n[=        [?        U5      U5         S nAGNS nAff = f! [F        [H        4 aJ  n[=        [?        U5      U[K        [M        [        R                  URN                  5      5      S9   S nAGNS nAff = f! [:         aJ  n[=        [?        U5      U[K        [M        [        R                  URN                  5      5      S9   S nAGNLS nAff = f! [:         a   n[=        [?        U5      U5         S nAGNyS nAff = f! [d         a2  n[=        [?        U5      U[K        URN                  5      S9   S nAGNS nAff = f! [:         aJ  n[=        [?        U5      U[K        [M        [        R                  URN                  5      5      S9   S nAGNS nAff = f! [d         aJ  n[=        [?        U5      U[K        [M        [        R                  URN                  5      5      S9   S nAGNSS nAff = f)Nr   SymNodeVariableformatjoinz1 args and 0 kwargsz
 args and z kwargsr   __iter__)ListIteratorVariable)mutation_typec              3   <   >#    U  H  n[        UT5      v   M     g 7fr#   )r6   )r/   rG   r   s     r&   r1   /ConstantVariable.call_method.<locals>.<genexpr>   s     <t!z!_--ts   r   call_functiondecode__len__	__round____contains__)4tensorr   r   r    strr   BuiltinVariabler   r   lenr   force_unpack_var_sequencerc   r   r'   r   r   rN   call_methodlistsr   rx   r   anyrY   rH   r6   __dict__r   	Exceptionr   rF   floatrk   r   OverflowError
ValueErrorrA   mapr   operatorrg   r   SymBoolSymFloatSymIntoutputcreate_proxybytescomplexr   round)rT   rw   r   r   r*   arg_unpackedrG   	arg_constr   a
const_argskvconst_kwargsmethodr   exc
add_targetopproxysearchresultr   rU   s                         @r&   r   ConstantVariable.call_method   s    	,8tzz3 7 7,,SZZ8FFMDM6  V^tzz3 7 7Ta#)4ykCK=@	  7<<R@LC=IJ\113\	J'..tzzy/IJJ ZF4::s$;$; 4'((,<L<N  <t<<<,,33MMOTZZk"D12	?:>?$Q..0$J?BH,,.Q.$!A3355.LQ djj#&&43<<+?TZZ.F6'..vz/R\/RSS 

UCL11gdjj$6O6OF+2274::t3L3NOO $''ING..00']
Xt, M  II22'djj*-ErE +11"eZHH/66r$**j7QRR
 

E**tx/?TZZ.F#**6:+N+NOO$**(TW5E5E-ETZZ.F6'..vz/R\/RSS 9dfI'..s4::?? [ SY!^Q8R8R8T8T'..$**d1g&@&@&BC  ^#D	Q47;U;U;W;W:!W//1F4::-'..v66
 w"2T::I K& Cw*2TBBC$ @Q" 	?7&r>>	?  6(a"556 &z2 ,S	!#&6&=&=sxx"HI 0 % 0 GRd37G7N7NPQPVPV3W.X   6(a"556  I(a"4<HHI  (GRd3/?/F/F+O&P   (GRd3/?/F/F+O&P s   W W8/W X W=1X X"X /X( -Y %Z2 \	 
'\6  9]5 $#_ W W:9W:=X X%$X%(
Y2YYZ/%?Z**Z/2
\<?\\	
\3\..\36
]2 ']--]25
_	??__	
` ?`` tree_map_fnr   map_fnresttree_map_kwargsc           
        > U R                   c  UR                  S5      nUb   [        UR                  5       5      nO.[        [        USS 5      SS5      nUR                  S5      (       + nU(       a  UR                  X/UQ0 5      $ U H/  n	U	R                  5       (       a  M  U R                  UUUUU5      s  $    U R                  5       $ [        U R                   [        [        [        [        [        [         ["        R$                  45      (       a  UR                  X/UQ0 5      $ [&        T
U ]Q  UUUUU5      $ ! [         a    U R                  UUUUU5      s $ f = f)Nnone_is_leaffn
__module__ optree)r    r5   rl   rc   r   _tree_map_fallbackr   
startswithr   rt   cloner6   rk   r   r   r   r   r   dtyperN   call_tree_map)rT   rw   r   r   r   r   none_is_leaf_varr   tree_map_moduleotherrU   s             r&   r   ConstantVariable.call_tree_map'  sf    ::.22>B+	#'(8(K(K(M#NL #*Kt4lB# $3#=#=h#GG++BrBB!E 1133#66'" +   " zz|#djj3tWc5%++"VWW''MDM2>>w$
 	
? + 22#' s   D= =EEc                 l    [        U R                  U5      n[        R                  R	                  U5      $ r#   )r   r    r   r   r'   )rT   rw   r   r   s       r&   call_obj_hasattr!ConstantVariable.call_obj_hasattr[  s+     T*))0088r)   c                     grf   r$   rX   s    r&   is_python_hashable#ConstantVariable.is_python_hashableb  ri   r)   c                 ,    [        U R                  5      $ r#   )hashr    rX   s    r&   get_python_hash ConstantVariable.get_python_hashe  s    DJJr)   r   c                     SSK Jn  [        X5      (       a!  U R                  5       UR	                  5       :H  $ [        U[
        5      =(       a!    U R                  5       UR                  5       :H  $ )Nr   r   )r   r   r6   rc   evaluate_exprr   )rT   r   r   s      r&   is_python_equal ConstantVariable.is_python_equalh  s\    +e--**,0C0C0EEEuo. H'')U-E-E-GG	
r)   r%   )+r^   r   __qualname____firstlineno____doc__r   staticmethodrl   r'   r   r   rO   rY   r   r`   rc   r   rg   rm   rq   rt   propertyrA   rH   r{   objectrP   r   r   rx   r   dictr   r   r   r
   r   r   rk   r   r   __static_attributes____classcell__rU   s   @r&   r   r   %   s    6d616  6 AcASA_A  A"1c "1S "1_ "1 "1Hc S T  # T# TC GDM 3 3$ $ $"$ " 1tO, 1 1
)
0?
	
 2V 2 2 2 5 54 5 5
-23-	o	- 7 s  {;#{; {; ?#	{;
 S/)*{; 
{;z2
#2
 ,2
  	2

 '2
 c?232
 
2
h 9)9149	9 9GDM    	
V 	
 	
 	
r)   r   c            	       V  ^  \ rS rSrSrS\\R                  \R                  4   S\	SS4U 4S jjr
\S\	S	\S
\	SS 4S j5       rS\\R                  \4   4S jrS\4S jrS\\R                  \R                  4   4S jrSSS\S\4S jrS\S   4S jrS\4S jrS\S\4S jrSrU =r$ )EnumVariableit  zVariableTracker 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                 2   > [         TU ]  " S0 UD6  Xl        g )Nr$   )rN   rO   r    rS   s      r&   rO   EnumVariable.__init__{  s    "6"
r)   cls_typevalue_vtoptionsc           
      :   UR                  5       (       a;  [        U5       H,  nUR                  UR                  5       :X  d  M#  U " U40 UD6s  $    [	        SSU S[        U5       3SU S[        U5       S3/ [
        R                  Q[
        R                  QS9  g )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)rg   rA   r    rc   r   r   
USER_ERRORSUPPORTABLE)clsr   r   r   r   s        r&   r'   EnumVariable.create  s     &&((x.<<8#>#>#@@v111 ) 	7hZ'>tH~>NO++3*CX7GqJ R%00Q3D3P3PQ	
r)   c                     [        U R                  [        5      (       a  [        U R                  5      $ U R                  $ r#   )r6   r    rk   rX   s    r&   rY   EnumVariable.as_proxy  s+    djj#&&tzz?"zzr)   c                 4    S[        U R                  5       S3$ )NzEnumVariable(r]   )rF   r    rX   s    r&   r`   EnumVariable.__repr__  s    tDJJ/022r)   c                     U R                   $ r#   r%   rX   s    r&   rc   EnumVariable.as_python_constant  r[   r)   rw   r   r   c                 ,   [        U R                  U5      (       d  [        eU[        ;   a  [        R
                  " X5      $ [        U R                  U5      nU R                  =(       a    [        U R                  U5      n[        R                  " XUS9$ )Nr4   )r   r    r   r   r   GetAttrVariabler   r-   r   r   build)rT   rw   r   r   r-   s        r&   var_getattrEnumVariable.var_getattr  so    tzz4((%%)),,T88T*>DKK!>$$R??r)   Tc                 0    [        U R                  U 5        grf   )r   r    rX   s    r&   r   EnumVariable.is_python_hashable  s     T2r)   c                 4    [        U R                  5       5      $ r#   )r   rc   rX   s    r&   r   EnumVariable.get_python_hash  s    D++-..r)   r   c                 r    [        U[        5      =(       a!    U R                  5       UR                  5       :H  $ r#   )r6   r   rc   )rT   r   s     r&   r   EnumVariable.is_python_equal  s1    uo. H'')U-E-E-GG	
r)   r%   )r^   r   r   r   r   r	   enumEnumIntEnumr   rO   classmethodr   r'   rk   rY   r   r`   rc   r  r   r   r   r   rl   r   r   r   r   s   @r&   r   r   t  s    eDIIt||$;<  PT  

&5
@C
	
 
 %		3/ 
3# 3E$))T\\*A$B @5 @S @_ @GDM / /
V 
 
 
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 &  : + 9  4 D/L
 L
^
;
? ;
r)   