
    N jvC                        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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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)Never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                     ^  \ 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       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\S\\\4   S-  S\	4S j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+$ )0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.
valueNreturnc                     g N r!   s    q/root/GenerationalWealth/GenerationalWealth/venv/lib/python3.13/site-packages/torch/_dynamo/variables/constant.pycreateConstantVariable.create.   s    &)    c                     g r$   r%   r&   s    r'   r(   r)   2   s    36r*   kwargsc                     g r$   r%   )r!   r,   s     r'   r(   r)   7   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>P   s     #WJS$4$;$;C$@$@Js   "$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)   ;   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=c                   > [         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_literalrG   r   r7   numberitemr!   selfr!   r,   	__class__s      r'   rP   ConstantVariable.__init__`   ss    "6"//66 	 =77;E{m D9 	6 >j		::DJJr*   c                     U R                   $ r$   r&   rU   s    r'   as_proxyConstantVariable.as_proxyp       zzr*   c                 t    S[        U R                  5      R                   S[        U R                  5       S3$ )NzConstantVariable(z: ))rG   r!   __name__reprrY   s    r'   __repr__ConstantVariable.__repr__s   s2    "4

#3#<#<"=RTZZ@P?QQRSSr*   c                     U R                   $ r$   r&   rY   s    r'   as_python_constant#ConstantVariable.as_python_constantv   r\   r*   Tc                     gNTr%   rY   s    r'   is_python_constant#ConstantVariable.is_python_constanty       r*   c                 B    [        U R                  [        [        45      $ r$   )r7   r!   intboolrY   s    r'   is_symnode_like ConstantVariable.is_symnode_like|   s    $**sDk22r*   valuesc                      U R                   U;   $ r$   r&   )rU   rp   s     r'   is_constant_match"ConstantVariable.is_constant_match   s    zzV##r*   c                     U R                   S L $ r$   r&   rY   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_sequencerY   s    r'   rI   ConstantVariable.items   s     ''4'00r*   rx   r   r2   c                 b    [         R                  U R                  UR                  5          5      $ r$   )r   r(   r!   rd   )rU   rx   r2   s      r'   getitem_constConstantVariable.getitem_const   s,      &&JJs--/0
 	
r*   objc                 &    [        U 5      [        ;   $ r$   )rG   r   )r~   s    r'   rQ    ConstantVariable.is_base_literal   s    Cy111r*   cachec                   ^ Tc  0 m[        U 5      T;   a  g[        U 5      [        [        [        [
        [        R                  4;   a#  U T[        U 5      '   [        U4S jU  5       5      $ [        R                  U 5      $ )NTc              3   P   >#    U  H  n[         R                  UT5      v   M     g 7fr$   )r   
is_literal)r1   rH   r   s     r'   r3   .ConstantVariable.is_literal.<locals>.<genexpr>   s"     Jc'221e<<cs   #&)idrG   rB   r@   r8   r:   torchSizeallr   rQ   )r~   r   s    `r'   r   ConstantVariable.is_literal   sf    =Ec7e9uc9ejjAA E"S'NJcJJJ//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$   )rd   r   r(   	TypeErrorNotImplementedError)rU   rx   rH   es       r'   ry   $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   )rU   rx   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$   )r7   )r1   rH   r   s     r'   r3   /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_sequencerd   r   r(   r   r   rO   call_methodlistsr   ry   r   anyrZ   rI   r7   __dict__r   	Exceptionr   rG   floatrl   r   OverflowError
ValueErrorrB   mapr   operatorrh   r   SymBoolSymFloatSymIntoutputcreate_proxybytescomplexr   round)rU   rx   r   r   r,   arg_unpackedrH   	arg_constr   a
const_argskvconst_kwargsmethodr   exc
add_targetopproxysearchresultr   rV   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!   r6   rm   rd   r   _tree_map_fallbackr   
startswithr   ru   cloner7   rl   r   r   r   r   r   dtyperO   call_tree_map)rU   rx   r   r   r   r   none_is_leaf_varr   tree_map_moduleotherrV   s             r'   r   ConstantVariable.call_tree_map1  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(   )rU   rx   r   r   s       r'   call_obj_hasattr!ConstantVariable.call_obj_hasattre  s+     T*))0088r*   c                     grg   r%   rY   s    r'   is_python_hashable#ConstantVariable.is_python_hashablel  rj   r*   c                 ,    [        U R                  5      $ r$   )hashr!   rY   s    r'   get_python_hash ConstantVariable.get_python_hasho  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   r7   rd   evaluate_exprr   )rU   r   r   s      r'   is_python_equal ConstantVariable.is_python_equalr  s\    +e--**,0C0C0EEEuo. H'')U-E-E-GG	
r*   r&   r$   ),r_   r   __qualname____firstlineno____doc__r   staticmethodr
   r(   rm   r   r   rP   rZ   r   ra   rd   r   rh   rn   rr   ru   propertyrB   rI   r|   objectrQ   dictrl   r   r   ry   r   r   r   r   r   r   r   r   r   __static_attributes____classcell__rV   s   @r'   r   r   %   s    )d)u)  )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 	5tCK'84'? 	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$ )EnumVariablei  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%   )rO   rP   r!   rT   s      r'   rP   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)rh   rB   r!   rd   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$   )r7   r!   rl   rY   s    r'   rZ   EnumVariable.as_proxy  s+    djj#&&tzz?"zzr*   c                 4    S[        U R                  5       S3$ )NzEnumVariable(r^   )rG   r!   rY   s    r'   ra   EnumVariable.__repr__  s    tDJJ/022r*   c                     U R                   $ r$   r&   rY   s    r'   rd   EnumVariable.as_python_constant  r\   r*   rx   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$ )Nr5   )r   r!   r   r   r   GetAttrVariabler   r/   r   r   build)rU   rx   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rg   )r   r!   rY   s    r'   r   EnumVariable.is_python_hashable  s     T2r*   c                 4    [        U R                  5       5      $ r$   )r   rd   rY   s    r'   r   EnumVariable.get_python_hash  s    D++-..r*   r   c                 r    [        U[        5      =(       a!    U R                  5       UR                  5       :H  $ r$   )r7   r   rd   )rU   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   rP   classmethodr   r(   rl   rZ   r   ra   rd   r  r   r   r   r   rm   r   r   r   r   s   @r'   r   r     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   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   CONSTANT_VARIABLE_NONEr   r%   r*   r'   <module>r*     sl      $ I I -  : + 9  4 D/V
 V
r
 *$/ ;
? ;
r*   