
    BjI                    <   d Z ddlmZ ddlZddlmZmZmZmZ ddl	m
Z
 ddlZddlmZ ddlmZ dd	lmZmZ dd
l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 ddlm Z   G d de          Z! e!d          Z" e!d          Z# e!d          Z$ G d de          Z%dS )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            
      
    e Zd ZdZeeeee e	d          e
 e	d          fZeedAd                        ZeedBd	                        ZeedCd                        ZedCd            ZdD fdZdEdZdFdZdEdZdGdZdHdZdIdZdHdZedJd            ZdKdZedLd"            ZedMdNd%            ZdOd'ZdPd(ZdPd)ZdPd*ZdQd,Z dR fd/Z!dS fd6Z"e#dTd7            Z$dGd8Z%dUd:Z&dVd<Z'dWd=Z(dX fd>Z)dXd?Z*dXd@Z+ xZ,S )Y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.
    N.valueNonereturnc                    d S N r   s    c/var/www/html/Carbon-Document/venv/lib/python3.11/site-packages/torch/_dynamo/variables/constant.pycreatezConstantVariable.create2       14    boolc                    d S r   r   r    s    r!   r"   zConstantVariable.create6   r#   r$   r   kwargsr   c                    d S r   r   )r   r'   s     r!   r"   zConstantVariable.create:   s    >Acr$   c                P   |s!| x t           S xdu r t          S du rt          S |                    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                            t1          |                     |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`.
        NTFsourcec                B    g | ]}t                               |          S r   r   r"   .0xs     r!   
<listcomp>z+ConstantVariable.create.<locals>.<listcomp>W   '    ???A%,,Q//???r$   c                B    g | ]}t                               |          S r   r,   r-   s     r!   r0   z+ConstantVariable.create.<locals>.<listcomp>Z   r1   r$   c              3  J   K   | ]}t                               |          V  d S r   r,   )r.   args     r!   	<genexpr>z*ConstantVariable.create.<locals>.<genexpr>^   s1      #W#WS$4$;$;C$@$@#W#W#W#W#W#Wr$   )r*   )CONSTANT_VARIABLE_NONECONSTANT_VARIABLE_TRUECONSTANT_VARIABLE_FALSE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ir/   item_sources	            r!   r"   zConstantVariable.create>   s     	3TT11TTTT11UU22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$   c                *    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_literalrJ   r   r:   numberitemr   selfr   r'   	__class__s      r!   rR   zConstantVariable.__init__n   s    ""6"""//66 	 	 97;E{{9 9 9 	 	6 >j	::>DJJJDJJJr$   c                    | j         S r   r    rW   s    r!   as_proxyzConstantVariable.as_proxy~   
    zr$   strc                f    dt          | j                  j         dt          | j                   dS )NzConstantVariable(z: ))rJ   r   __name__reprrZ   s    r!   __repr__zConstantVariable.__repr__   s2    S4
#3#3#<SSTZ@P@PSSSSr$   c                    | j         S r   r    rZ   s    r!   as_python_constantz#ConstantVariable.as_python_constant   r\   r$   Literal[True]c                    dS NTr   rZ   s    r!   is_python_constantz#ConstantVariable.is_python_constant       tr$   c                D    t          | j        t          t          f          S r   )r:   r   intr%   rZ   s    r!   is_symnode_likez ConstantVariable.is_symnode_like   s    $*sDk222r$   valuesc                    | j         |v S r   r    )rW   rm   s     r!   is_constant_matchz"ConstantVariable.is_constant_match   s    zV##r$   c                    | j         d u S r   r    rZ   s    r!   is_constant_nonez!ConstantVariable.is_constant_none   s    zT!!r$   list[VariableTracker]c                .    |                      d          S )zz
        Need this when adding a BaseListVariable and a ConstantVariable together.
        Happens in detectron2.
        N)tx)unpack_var_sequencerZ   s    r!   rK   zConstantVariable.items   s     ''4'000r$   rt   r   r4   c                p    t                               | j        |                                                   S r   )r   r"   r   rd   )rW   rt   r4   s      r!   getitem_constzConstantVariable.getitem_const   s2      &&Js--//0
 
 	
r$   objobjectc                .    t          |           t          v S r   )rJ   r   )rx   s    r!   rS   z ConstantVariable.is_base_literal   s    Cyy111r$   cachedict[int, object] | Nonec                (   i t          |           v rdS t          |           t          t          t          t
          t          j        fv r-| t          |           <   t          fd| D                       S t          
                    |           S )NTc              3  N   K   | ]}t                               |          V   d S r   )r   
is_literal)r.   r/   r{   s     r!   r5   z.ConstantVariable.is_literal.<locals>.<genexpr>   s4      JJ'221e<<JJJJJJr$   )idrJ   rE   rC   r;   r=   torchSizeallr   rS   )rx   r{   s    `r!   r   zConstantVariable.is_literal   s    =Ec77e499uc9ejAAA E"S''NJJJJcJJJJJJ//444r$   InstructionTranslator | Nonec                t    	 d |                                  D             S # t          $ r}t          |d }~ww xY w)Nc                B    g | ]}t                               |          S r   r,   r-   s     r!   r0   z8ConstantVariable.unpack_var_sequence.<locals>.<listcomp>   s'    RRR1$++A..RRRr$   )rd   	TypeErrorNotImplementedErrorrW   rt   es      r!   ru   z$ConstantVariable.unpack_var_sequence   sN    	-RR8O8O8Q8QRRRR 	- 	- 	-%1,	-s     
727c                    	 t                               t          | j                            S # t          $ r<}t          t          |          |t          |j                             Y d}~dS d}~ww xY w)z9Generic len for any constant value (sequence or mapping).argsN)	r   r"   lenr   r   r   rJ   rE   r   r   s      r!   len_implzConstantVariable.len_impl   s|    	E#**3tz??;;; 	E 	E 	E$T!WWbtAF||DDDDDDDDDD	Es   +. 
A41A//A4c                ,    |                      |          S )z6Sequence length - delegates to len_impl for constants.r   rW   rt   s     r!   	sq_lengthzConstantVariable.sq_length       }}R   r$   c                ,    |                      |          S )z5Mapping length - delegates to len_impl for constants.r   r   s     r!   	mp_lengthzConstantVariable.mp_length   r   r$   namec                    t          | j        |          st          t          ||g           t	          | j        |          }t          |          rt          |S )Nr   )hasattrr   r   AttributeErrorgetattrcallabler   )rW   rt   r   members       r!   const_getattrzConstantVariable.const_getattr   sZ    tz4(( 	F$^RtfEEEET**F 	&%%r$   r   dict[str, VariableTracker]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 }~nd }~ww xY wt3          | j        t>          t@          f          rtC          | j        |          r|s|s	 t                               t7          | j        |                                S # tD          tF          f$ r;}t;          t=          |          |tI          |j%                             Y d }~nd }~ww xY wtC          tL          |          r)t          |          dk    r|d         '                                r|d         }t7          tL          |          }t3          |tP          j)        tP          j*        tP          j+        f          r;|j,        -                    d|| j        |fi           }                    |||          S 	 t                               || j        |                    S # t8          $ r;}t;          t=          |          |tI          |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    rt          |          dk    r|d         '                                r	 t                              ta          | j        |d         1                                                    S # t8          $ r;}t;          t=          |          |tI          |j%                             Y d }~nd }~ww xY w|dk    rt          |          dk    r|d         '                                r|rJ |d         1                                }	 || j        v }t                              |          S # td          $ r;}t;          t=          |          |tI          |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   rd   r-   s     r!   r0   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   )r:   )r.   r/   r   s     r!   r5   z/ConstantVariable.call_method.<locals>.<genexpr>   s-      <<!z!_--<<<<<<r$   c                6    g | ]}|                                 S r   r   )r.   as     r!   r0   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	__round____contains__)3tensorr   r   r   r]   r   BuiltinVariabler   r   r   r   force_unpack_var_sequencer   r"   r   r   rQ   call_methodlistsr   ru   r   anyr[   rK   r:   __dict__r   	Exceptionr   rJ   floatrk   r   OverflowError
ValueErrorrE   r   operatorrh   r   SymBoolSymFloatSymIntoutputcreate_proxybytescomplexroundrd   r   )rW   rt   r   r   r'   arg_unpacked	arg_constr   
const_argsconst_kwargsmethodr   exc
add_targetopproxysearchresultr   rX   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 &	6gdj$6O6O &	6 F +223L74:t3L3L3N3NOOO%z2   ,S		!#(^^         $''QIINNG..00 # (]
Xt,, M  Q I22'dj*-Er E +11"eZHHHQ/66rr$*j7Q7QRRR$ Q Q Q0a"4<<PPPPPPPPPQ
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 ;3t99>>d1g6P6P6R6R>I'..$*d1g&@&@&B&BCC    I I I(a"4<<HHHHHHHHHI^##D		Q47;U;U;W;W:!W//11FI4:-'..v666 I I I(a"4<<HHHHHHHHHIww""2tT6:::s   "=D   .EE*H; ;.I,+I,-K 
K?K::K??4M4 4O 1N;;O (R: :
S?1S::S?V7 7
W(W##W(AY$ $
Z).1Z$$Z)>"\! !
]&+1]!!]&tree_map_fnr   map_fnrestSequence[VariableTracker]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   r9   r%   rd   r   _tree_map_fallbackr   
startswithr   rq   cloner:   rk   r   r   r]   r   r   dtyperQ   call_tree_map)rW   rt   r   r   r   r   none_is_leaf_varr   tree_map_moduleotherrX   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"   )rW   rt   r   r   s       r!   call_obj_hasattrz!ConstantVariable.call_obj_hasattrt  s,     T**)00888r$   c                    dS rg   r   rZ   s    r!   is_python_hashablez#ConstantVariable.is_python_hashable{  ri   r$   rk   c                *    t          | j                  S r   hashr   rZ   s    r!   get_python_hashz ConstantVariable.get_python_hash~      DJr$   r   c                    ddl m} t          ||          r*|                                 |                                k    S t          |t
                    o)|                                 |                                k    S )Nr   r   )r   r   r:   rd   evaluate_exprr   )rW   r   r   s      r!   is_python_equalz ConstantVariable.is_python_equal  s    ++++++e_-- 	F**,,0C0C0E0EEEuo.. H''))U-E-E-G-GG	
r$   c                    | j         S r   r    rZ   s    r!   get_real_python_backed_valuez-ConstantVariable.get_real_python_backed_value  r\   r$   c                    t          | j        t          t          f          r1t                              t          j        | j                            S t                      	                    |          S r   )
r:   r   rk   r%   r   r"   r   indexrQ   nb_index_impl)rW   rt   rX   s     r!   r   zConstantVariable.nb_index_impl  sV     dj3+.. 	G#**8>$*+E+EFFFww$$R(((r$   c                Z    t                               t          | j                            S r   )r   r"   rk   r   r   s     r!   nb_int_implzConstantVariable.nb_int_impl  s       &&s4:777r$   c                Z    t                               t          | j                            S r   )r   r"   r   r   r   s     r!   nb_float_implzConstantVariable.nb_float_impl  s"      &&uTZ'8'8999r$   )r   r   r   r   )r   r%   r   r   )r   r   r'   r   r   r   )r   r   r'   r   r   r   )r   r   )r   r]   )r   re   r   r%   )rm   r   r   r%   )r   rr   )rt   r   r4   r   r   r   )rx   ry   r   r%   r   )rx   ry   r{   r|   r   r%   )rt   r   r   rr   )rt   r   r   r   )rt   r   r   r]   r   r   )
rt   r   r   r]   r   rr   r'   r   r   r   )rt   r   r   r   r   r   r   r   r   r   r   r   )rt   r   r   r]   r   r   r   rk   r   ry   r   r%   )r   ry   )rt   r   r   r   )-r`   r   __qualname____doc__rk   r   r]   r   r%   rJ   r   _cpython_typer   staticmethodr"   rR   r[   rb   rd   rh   rl   ro   rq   propertyrK   rw   rS   r   ru   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__rX   s   @r!   r   r       sY         %eT44::wS		RM444 \ X4444 \ X4AAA \ XA-1 -1 -1 \-1^         T T T T      3 3 3 3$ $ $ $" " " " 1 1 1 X1
 
 
 
 2 2 2 \2 	5 	5 	5 	5 \	5- - - -E E E E! ! ! !! ! ! !   m; m; m; m; m; m;^2
 2
 2
 2
 2
 2
h 9 9 9 X9          
 
 
 
   ) ) ) ) ) )8 8 8 8: : : : : : : :r$   r   TFc                  `     e Zd ZdZeZd fdZdd	ZddZddZ	ddZ
ddZddZddZ xZS )FakeIdVariablea6  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.
    r   rk   r'   r   r   r   c                H     t                      j        di | || _        d S )Nr   )rQ   rR   r   rV   s      r!   rR   zFakeIdVariable.__init__  s+    ""6"""


r$   c                    | j         S r   r    rZ   s    r!   rd   z!FakeIdVariable.as_python_constant  r\   r$   r%   c                    dS NFr   rZ   s    r!   rh   z!FakeIdVariable.is_python_constant  s    ur$   rJ   c                    t           S r   )rk   rZ   s    r!   python_typezFakeIdVariable.python_type  s    
r$   c                    dS rg   r   rZ   s    r!   r   z!FakeIdVariable.is_python_hashable  ri   r$   c                *    t          | j                  S r   r   rZ   s    r!   r   zFakeIdVariable.get_python_hash  r   r$   r   ry   c                x    t          |t          t          f          r| j        |                                k    S dS r  )r:   r  r   r   rd   )rW   r   s     r!   r   zFakeIdVariable.is_python_equal  s8    en.>?@@ 	<:!9!9!;!;;;ur$   codegenc                R    t          dt          | j                  ddg           d S )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   )rW   r  s     r!   reconstructzFakeIdVariable.reconstruct  sB    6
OO@ O
	
 
	
 
	
 
	
 
	
 
	
r$   )r   rk   r'   r   r   r   r   r   )r   rJ   r   )r  r   r   r   )r`   r   r   r   rk   r  rR   rd   rh   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   r6   r7   r8   r  r   r$   r!   <module>r!     s    # " " " " "  8 8 8 8 8 8 8 8 8 8 8 8 & & & & & &  . . . . . .       9 9 9 9 9 9 9 9 J J J J J J J J J J J J 3 3 3 3 3 3 3 3  0((((((DDDDDD//////H: H: H: H: H: H: H: H:V *)$// ))$// **511 2
 2
 2
 2
 2
_ 2
 2
 2
 2
 2
r$   