
    3jI                    &   S r SSKJr  SSKrSSKJrJrJrJr  SSK	J
r
  SSKrSSKJr  SSKJr  SS	KJrJr  SS
K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KJ r    " S S\5      r!\!" S5      r"\!" S5      r#\!" S5      r$ " S S\5      r%g)z
Constant 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.
    )annotationsN)AnyLiteraloverloadTYPE_CHECKING)override)GetItemSource   )	variables)raise_observed_exceptionunimplemented)common_constant_typesistypenpraise_args_mismatch   )ValueMutationNewVariableTracker)Sequence)InstructionTranslator)UserFunctionVariablec            
      p  ^  \ rS rSrSr\\\\\	\
" S5      \\
" S5      4r\\S%S j5       5       r\\S&S j5       5       r\\S'S j5       5       r\S'S j5       rS(U 4S	 jjrS)S
 jrS*S jrS)S jrS+S jrS,S jrS-S jrS,S jr\S.S j5       r      S/S jr\S0S j5       r\S1S2S jj5       r    S3S jrS4S jrS4S jrS4S jr S5S jr!          S6U 4S jjr"            S7U 4S jjr#\$      S8S j5       r%S+S jr&S9S jr'S:S jr(S;S  jr)    S<U 4S! jjr*    S<S" jr+    S<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.
N.c                    g N values    Z/home/wildlama/miniconda3/lib/python3.13/site-packages/torch/_dynamo/variables/constant.pycreateConstantVariable.create2       14    c                    g r   r   r   s    r    r!   r"   6   r#   r$   c                    g r   r   )r   kwargss     r    r!   r"   :   s    >Ar$   c                   U(       d!  U =c    [         $ =SL a    [        $ SL a  [        $ 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/                  [1        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`.
NTF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>^   s     #WJS$4$;$;C$@$@Js   "$)r)   )CONSTANT_VARIABLE_NONECONSTANT_VARIABLE_TRUECONSTANT_VARIABLE_FALSE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    111122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   G $G%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_literalrC   r   r3   numberitemr   selfr   r'   	__class__s      r    rL   ConstantVariable.__init__n   ss    "6"//66 	 =77;E{m D9 	6 >j		::DJJr$   c                    U R                   $ r   r   rQ   s    r    as_proxyConstantVariable.as_proxy~       zzr$   c                t    S[        U R                  5      R                   S[        U R                  5       S3$ )NzConstantVariable(z: ))rC   r   __name__reprrU   s    r    __repr__ConstantVariable.__repr__   s2    "4

#3#<#<"=RTZZ@P?QQRSSr$   c                    U R                   $ r   r   rU   s    r    as_python_constant#ConstantVariable.as_python_constant   rX   r$   c                    gNTr   rU   s    r    is_python_constant#ConstantVariable.is_python_constant       r$   c                B    [        U R                  [        [        45      $ r   )r3   r   intboolrU   s    r    is_symnode_like ConstantVariable.is_symnode_like   s    $**sDk22r$   c                     U R                   U;   $ r   r   )rQ   valuess     r    is_constant_match"ConstantVariable.is_constant_match   s    zzV##r$   c                    U R                   S L $ r   r   rU   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_sequencerU   s    r    rE   ConstantVariable.items   s     ''4'00r$   c                b    [         R                  U R                  UR                  5          5      $ r   )r   r!   r   r`   )rQ   rt   r,   s      r    getitem_constConstantVariable.getitem_const   s,      &&JJs--/0
 	
r$   c                &    [        U 5      [        ;   $ r   )rC   r   )objs    r    rM    ConstantVariable.is_base_literal   s    Cy111r$   c                  ^ 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)r+   rD   caches     r    r-   .ConstantVariable.is_literal.<locals>.<genexpr>   s"     Jc'221e<<cs   #&)idrC   r>   r<   r4   r6   torchSizeallr   rM   )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   )r`   r   r!   	TypeErrorNotImplementedError)rQ   rt   rD   es       r    ru   $ConstantVariable.unpack_var_sequence   sN    	-8<8O8O8QR8Q1$++A.8QRRR 	-%1,	-s!   ; 6; ; 
AAAc                     [         R                  [        U R                  5      5      $ ! [         a1  n[        [        U5      U[        UR                  5      S9   SnAgSnAff = f)z9Generic len for any constant value (sequence or mapping).argsN)	r   r!   lenr   r   r   rC   r>   r   )rQ   rt   r   s      r    len_implConstantVariable.len_impl   sK    	E#**3tzz?;; 	E$T!WbtAFF|D	Es   '* 
A%'A  A%c                $    U R                  U5      $ )z6Sequence length - delegates to len_impl for constants.r   rQ   rt   s     r    	sq_lengthConstantVariable.sq_length       }}R  r$   c                $    U R                  U5      $ )z5Mapping length - delegates to len_impl for constants.r   r   s     r    	mp_lengthConstantVariable.mp_length   r   r$   c                    [        U R                  U5      (       d  [        [        X/S9  [	        U R                  U5      n[        U5      (       a  [        eU$ )Nr   )hasattrr   r   AttributeErrorgetattrcallabler   )rQ   rt   namemembers       r    const_getattrConstantVariable.const_getattr   sE    tzz4(($^RfET*F%%r$   c           
       >^ 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        [N        U5      (       a  [        U5      S:X  a  US   RQ                  5       (       a  U
S   n[9        [N        U5      n[5        U[R        RT                  [R        RV                  [R        RX                  45      (       a=  URZ                  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      [`        L aF  U[`        R6                  ;   a2  [9        U R                  U5      n [        R                  U" U
0 UD65      $ US:X  ab  [        U5      S:X  aS  US   RQ                  5       (       a;   [        R                  [c        U R                  US   R                  5       5      5      $ US:X  ah  [        U5      S:X  aY  US   RQ                  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N[S nAff = f! [F        [H        4 a2  n[=        [?        U5      U[K        URL                  5      S9   S nAGNLS nAff = f! [:         a2  n[=        [?        U5      U[K        URL                  5      S9   S nAGNS nAff = f! [:         a   n[=        [?        U5      U5         S nAGNS nAff = f! [:         a2  n[=        [?        U5      U[K        URL                  5      S9   S nAGNuS nAff = f! [d         a2  n[=        [?        U5      U[K        URL                  5      S9   S nAGNS 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   )r3   )r+   rD   r   s     r    r-   /ConstantVariable.call_method.<locals>.<genexpr>   s     <t!z!_--ts   r   call_functiondecode	__round____contains__)3tensorr   r   r   strr   BuiltinVariabler   r   r   r   force_unpack_var_sequencer`   r   r!   r   r   rK   call_methodlistsr   ru   r   anyrV   rE   r3   __dict__r   	Exceptionr   rC   floatrh   r   OverflowError
ValueErrorr>   r   operatorrd   r   SymBoolSymFloatSymIntoutputcreate_proxybytescomplexroundr   )rQ   rt   r   r   r'   arg_unpackedrD   	arg_constr   a
const_argskvconst_kwargsmethodr   exc
add_targetopproxysearchresultr   rR   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Q/66r$**j7QRR 

E**tx/?TZZ.F#**6:+N+NOO$**(TW5E5E-ETZZ.F6'..vz/R\/RSS ;3t9>d1g6P6P6R6RI'..$**d1g&@&@&BC 
 ^#D	Q47;U;U;W;W:!W//1FI4::-'..v66 w"2T::m K& Cw*2TBBC$ @Q" 	?7&r>>	?  6(a"556 &z2 ,S	!#((^ 0 % Q0a"4<PPQ  6(a"556  I(a"4<HHI  I(a"4<HHIs   V  V8/V  W W 1W W"W /W+ -X %Y Z #9[	 '#\ V   V=<V= W W('W(+
X5XXY('YY
Z''ZZ
[&[[	
\'\  \
]'\??]c           
       > 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   r2   ri   r`   r   _tree_map_fallbackr   
startswithr   rq   cloner3   rh   r   r   r   r   r   dtyperK   call_tree_map)rQ   rt   tree_map_fnmap_fnresttree_map_kwargsnone_is_leaf_varr   tree_map_moduleotherrR   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!   )rQ   rt   r   r   s       r    call_obj_hasattr!ConstantVariable.call_obj_hasattrt  s+     T*))0088r$   c                    grc   r   rU   s    r    is_python_hashable#ConstantVariable.is_python_hashable{  rf   r$   c                ,    [        U R                  5      $ r   hashr   rU   s    r    get_python_hash ConstantVariable.get_python_hash~      DJJ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   r3   r`   evaluate_exprr   )rQ   r   r   s      r    is_python_equal ConstantVariable.is_python_equal  s\    +e--**,0C0C0EEEuo. H'')U-E-E-GG	
r$   c                    U R                   $ r   r   rU   s    r    get_real_python_backed_value-ConstantVariable.get_real_python_backed_value  rX   r$   c                   > [        U R                  [        [        45      (       a3  [        R                  [        R                  " U R                  5      5      $ [        TU ]%  U5      $ r   )
r3   r   rh   ri   r   r!   r   indexrK   nb_index_impl)rQ   rt   rR   s     r    r   ConstantVariable.nb_index_impl  sH     djj3+..#**8>>$**+EFFw$R((r$   c                R    [         R                  [        U R                  5      5      $ r   )r   r!   rh   r   r   s     r    nb_int_implConstantVariable.nb_int_impl  s      &&s4::77r$   c                R    [         R                  [        U R                  5      5      $ r   )r   r!   r   r   r   s     r    nb_float_implConstantVariable.nb_float_impl  s      &&uTZZ'899r$   r   )r   Nonereturnr   )r   ri   r  r   )r   r   r'   r   r  r   )r   r   r'   r   r  r  )r  r   )r  r   )r  zLiteral[True]r  ri   )rm   r   r  ri   )r  list[VariableTracker])rt   r   r,   r   r  r   )r{   objectr  ri   r   )r{   r
  r   zdict[int, object] | Noner  ri   )rt   zInstructionTranslator | Noner  r	  )rt   r   r  r   )rt   r   r   r   r  r   )
rt   r   r   r   r   r	  r'   dict[str, VariableTracker]r  r   )rt   r   r   r   r   r   r   zSequence[VariableTracker]r   r  r  r   )rt   r   r   r   r  r   r  rh   r   r
  r  ri   )r  r
  )rt   r   r  r   )/r[   r   __qualname____firstlineno____doc__rh   r   r   r   ri   rC   r   _cpython_typer   staticmethodr!   rL   rV   r]   r`   rd   rj   rn   rq   propertyrE   rx   rM   r   ru   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  __static_attributes____classcell__rR   s   @r    r   r       s/    %eT4:wS	RM4  44  4A  A-1 -1^ T3$" 1 1
'
.=
	
 2 2 	5 	5-.-	-E!!m;!m; m; $	m;
 +m; 
m;^2
!2
 *2
  	2

 (2
 42
 
2
h 9'9/29	9 9 
)) 
)88 
8:: 
: :r$   r   TFc                  z   ^  \ rS rSrSr\rSU 4S jjrSS jrSS jr	SS jr
SS jrSS jrSS	 jrSS
 jrSrU =r$ )FakeIdVariablei  a  A compile-time-only id value that can be used as a dict key but cannot
be reconstructed across graph breaks.

When dynamo evaluates ``id(x)`` on a variable tracker that has no
corresponding runtime object (e.g. a ``ConstDictVariable`` created during
tracing), we mint a fake integer id.  This variable holds that id and
supports the minimal interface needed to participate as a dict key
(hashing and equality).  It intentionally blocks reconstruction so that a
graph break does not silently bake a stale id into the resumed bytecode.
c                2   > [         TU ]  " S0 UD6  Xl        g )Nr   )rK   rL   r   rP   s      r    rL   FakeIdVariable.__init__  s    "6"
r$   c                    U R                   $ r   r   rU   s    r    r`   !FakeIdVariable.as_python_constant  rX   r$   c                    gNFr   rU   s    r    rd   !FakeIdVariable.is_python_constant  s    r$   c                    [         $ r   )rh   rU   s    r    python_typeFakeIdVariable.python_type  s    
r$   c                    grc   r   rU   s    r    r   !FakeIdVariable.is_python_hashable  rf   r$   c                ,    [        U R                  5      $ r   r   rU   s    r    r   FakeIdVariable.get_python_hash  r   r$   c                t    [        U[        [        45      (       a  U R                  UR	                  5       :H  $ gr  )r3   r  r   r   r`   )rQ   r   s     r    r   FakeIdVariable.is_python_equal  s0    en.>?@@::!9!9!;;;r$   c                D    [        S[        U R                  5      SS/S9  g )Nz Reconstruction of FakeIdVariablezdA fake id produced by id() on a compile-time container cannot be reconstructed across a graph break.z<Avoid using id() on containers in code that may graph-break.)gb_typecontextexplanationhints)r   r   r   )rQ   codegens     r    reconstructFakeIdVariable.reconstruct  s)    6

O@ O
	
r$   r   )r   rh   r'   r   r  r  r  r  )r  rC   r  )r.  r   r  r  )r[   r   r  r  r  rh   r  rL   r`   rd   r!  r   r   r   r/  r  r  r  s   @r    r  r    s<    	 M 

 
r$   r  )&r  
__future__r   r   typingr   r   r   r   typing_extensionsr   r   torch._dynamo.sourcer	   r   r   r   r   r   utilsr   r   r   r   baser   r   collections.abcr   torch._dynamo.symbolic_convertr   	functionsr   r   r/   r0   r1   r  r   r$   r    <module>r:     s|    #  8 8 &  .  9 J J 3 (D/H: H:V *$/ )$/ *51 2
_ 2
r$   