o
    j9:jI                     @  s   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 deZ!e!dZ"e!dZ#e!dZ$G d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                	      s  e Zd ZdZeeeeee	de
e	dfZeed]ddZeed^d
dZeed_ddZed_ddZd` fddZdaddZdbddZdaddZdcddZddddZdedd Zddd!d"Zedfd$d%Zdgd)d*Zedhd-d.Zedidjd1d2Zdkd4d5Zdld6d7Zdld8d9Zdld:d;Zdmd=d>Z dn fdAdBZ!do fdIdJZ"e#dpdKdLZ$dcdMdNZ%dqdPdQZ&drdSdTZ'dsdUdVZ(dt fdWdXZ)dtdYdZZ*dtd[d\Z+  Z,S )u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                 C     d S N r   r   r   g/home/nk/hobo-godmode/plappi-mvp/.venv/lib/python3.10/site-packages/torch/_dynamo/variables/constant.pycreate2      zConstantVariable.createboolc                 C  r   r   r   r   r   r   r   r    6   r!   r   kwargsr   c                 K  r   r   r   )r   r#   r   r   r   r    :   r!   c           	      K  s>  |s|  du r
 t S  du r tS du rtS |d}t| tr0dd | D }tj|fi |S t| trEdd | D }tj	|fi |S t| t
rd| j| j| jf}tdd	 |D }tj|fi |S t| ttfrg }t| D ]\}}|r|t||nd}|tj||d
 qqtjt| |fi |S t| fi |S )aV  
        Create a `ConstantVariable` based on the given value, and supports
        automatic routing for collection types like `tuple` (in which case we'd
        create `ConstantVariable` for the leaf items).

        NOTE: the caller must install the proper guards if needed; most often
        the guard will be `CONSTANT_MATCH`.
        NTFsourcec                 S     g | ]}t |qS r   r   r    .0xr   r   r   
<listcomp>W       z+ConstantVariable.create.<locals>.<listcomp>c                 S  r%   r   r&   r'   r   r   r   r*   Z   r+   c                 s  s    | ]}t |V  qd S r   r&   )r(   argr   r   r   	<genexpr>^       z*ConstantVariable.create.<locals>.<genexpr>)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_sourcer   r   r   r    >   s>   





c                   s\   t  jdi | t|sJ dt| dtd ur)t|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_literalrC   r   r3   numberitemr   selfr   r#   	__class__r   r   rJ   n   s   
	
zConstantVariable.__init__c                 C     | j S r   r   rO   r   r   r   as_proxy~      zConstantVariable.as_proxystrc                 C  s    dt | jj dt| j dS )NzConstantVariable(z: ))rC   r   __name__reprrS   r   r   r   __repr__   s    zConstantVariable.__repr__c                 C  rR   r   r   rS   r   r   r   as_python_constant   rU   z#ConstantVariable.as_python_constantLiteral[True]c                 C     dS NTr   rS   r   r   r   is_python_constant      z#ConstantVariable.is_python_constantc                 C  s   t | jttfS r   )r3   r   intr"   rS   r   r   r   is_symnode_like   s   z ConstantVariable.is_symnode_likevaluesc                 G  s
   | j |v S r   r   )rO   rc   r   r   r   is_constant_match      
z"ConstantVariable.is_constant_matchc                 C  s
   | j d u S r   r   rS   r   r   r   is_constant_none   re   z!ConstantVariable.is_constant_nonelist[VariableTracker]c                 C  s   | j ddS )zz
        Need this when adding a BaseListVariable and a ConstantVariable together.
        Happens in detectron2.
        N)tx)unpack_var_sequencerS   r   r   r   rD      s   zConstantVariable.itemsrh   r   r,   c                 C  s   t | j|  S r   )r   r    r   r[   )rO   rh   r,   r   r   r   getitem_const   s   zConstantVariable.getitem_constobjobjectc                 C  s   t | tv S r   )rC   r   )rk   r   r   r   rK      s   z ConstantVariable.is_base_literalcachedict[int, object] | Nonec                   s`    d u ri  t |  v rdS t| tttttjfv r+|  t | < t fdd| D S t	
| S )NTc                 3  s    | ]	}t | V  qd S r   )r   
is_literalr'   rm   r   r   r-      s    z.ConstantVariable.is_literal.<locals>.<genexpr>)idrC   r>   r<   r4   r6   torchSizeallr   rK   )rk   rm   r   rp   r   ro      s   
zConstantVariable.is_literalInstructionTranslator | Nonec              
   C  s4   z
dd |   D W S  ty } zt|d }~ww )Nc                 S  r%   r   r&   r'   r   r   r   r*      r+   z8ConstantVariable.unpack_var_sequence.<locals>.<listcomp>)r[   	TypeErrorNotImplementedErrorrO   rh   er   r   r   ri      s   z$ConstantVariable.unpack_var_sequencec              
   C  sR   z	t t| jW S  ty( } ztt||t|jd W Y d}~dS d}~ww )z9Generic len for any constant value (sequence or mapping).argsN)	r   r    lenr   rv   r   rC   r>   r{   rx   r   r   r   len_impl   s   &zConstantVariable.len_implc                 C  
   |  |S )z6Sequence length - delegates to len_impl for constants.r}   rO   rh   r   r   r   	sq_length      
zConstantVariable.sq_lengthc                 C  r~   )z5Mapping length - delegates to len_impl for constants.r   r   r   r   r   	mp_length   r   zConstantVariable.mp_lengthnamec                 C  s8   t | j|stt||gd t| j|}t|rt|S )Nrz   )hasattrr   r   AttributeErrorgetattrcallablerw   )rO   rh   r   memberr   r   r   const_getattr   s   zConstantVariable.const_getattrr{   dict[str, VariableTracker]c              
     s"  ddl m  |dkrt| jtrttj|| g||S |dkrlt| jtrl|s0t	|dkrAt
||dt	| dt	| d |d |}zd	d
 |D }t| j|W S  tyk   t |||| Y S w |dkrt| jtrddlm} || |t dS t fdd|D rtj||  | j||||S zdd
 |D }dd | D }	W n ty   t |||| Y S w t| jtr|tjv rt| j|}
zt|
|i |	W S  ty } ztt|| W Y d }~nd }~ww t| jtt frt!| j|r|sA|sAztt| j| W S  t"t#fy@ } ztt||t$|j%d W Y d }~nd }~ww t!t&|rt	|dkr|d ' r|d }tt&|}t|t(j)t(j*t(j+fr}|j,-d|| j|fi } |||S z
t|| j|W S  ty } ztt||t$|j%d W Y d }~n\d }~ww nVt| jt.r|dkrt| j|}
t|
|i |	S t| jt/u r|t/jv rt| j|}
zt|
|i |	W S  ty } ztt|| W Y d }~nd }~ww |dkr?t	|dkr?|d ' r?ztt0| j|d 1 W S  ty> } ztt||t$|j%d W Y d }~nNd }~ww |dkrt	|dkr|d ' r|rWJ |d 1 }z|| jv }t|W S  t2y } ztt||t$|j%d W Y d }~nd }~ww t ||||S )Nr   SymNodeVariableformatjoinz1 args and 0 kwargsz
 args and z kwargsr   c                 S     g | ]}|  qS r   r[   r'   r   r   r   r*          z0ConstantVariable.call_method.<locals>.<listcomp>__iter__)ListIteratorVariable)mutation_typec                 3  s    | ]}t | V  qd S r   )r3   r'   r   r   r   r-      r.   z/ConstantVariable.call_method.<locals>.<genexpr>c                 S  r   r   r   )r(   ar   r   r   r*      r   c                 S  s   i | ]	\}}||  qS r   r   )r(   kvr   r   r   
<dictcomp>   s    z0ConstantVariable.call_method.<locals>.<dictcomp>rz   call_functiondecode	__round____contains__)3tensorr   r   r   rV   r
   BuiltinVariabler   r   r|   r   force_unpack_var_sequencer   r    r   rw   rI   call_methodlistsr   ri   r   anyrT   rD   r3   __dict__r   	Exceptionr   rC   floatra   r   OverflowError
ValueErrorr>   r{   operatorr_   rr   SymBoolSymFloatSymIntoutputcreate_proxybytescomplexroundr[   rv   )rO   rh   r   r{   r#   arg_unpacked	arg_constr   
const_argsconst_kwargsmethodry   exc
add_targetopproxysearchresultrP   r   r   r      s    

$&$&

$zConstantVariable.call_methodtree_map_fnr   map_fnrestSequence[VariableTracker]tree_map_kwargsc           
   
     s   | j d u r]|d}|d ur)zt| }W n" ty(   | ||||| Y S w tt|dd dd}|d }|rE||| g|i S |D ]}	|		 sX| |||||  S qG| 
 S t| j tttttttjfru||| g|i S t |||||S )Nnone_is_leaffn
__module__ optree)r   r2   r"   r[   rw   _tree_map_fallbackr   
startswithr   rf   cloner3   ra   r   r   rV   r   rr   dtyperI   call_tree_map)
rO   rh   r   r   r   r   none_is_leaf_varr   tree_map_moduleotherrP   r   r   r   @  sP   

	zConstantVariable.call_tree_mapc                 C  s   t | j|}tj|S r   )r   r   r
   r   r    )rO   rh   r   r   r   r   r   call_obj_hasattrt  s   z!ConstantVariable.call_obj_hasattrc                 C  r]   r^   r   rS   r   r   r   is_python_hashable{  r`   z#ConstantVariable.is_python_hashablera   c                 C  
   t | jS r   hashr   rS   r   r   r   get_python_hash~  re   z ConstantVariable.get_python_hashr   c                 C  s@   ddl m} t||r|  | kS t|to|  | kS )Nr   r   )r   r   r3   r[   evaluate_exprr   )rO   r   r   r   r   r   is_python_equal  s   

z ConstantVariable.is_python_equalc                 C  rR   r   r   rS   r   r   r   get_real_python_backed_value  rU   z-ConstantVariable.get_real_python_backed_valuec                   s.   t | jttfrtt| jS t 	|S r   )
r3   r   ra   r"   r   r    r   indexrI   nb_index_implr   rP   r   r   r     s   zConstantVariable.nb_index_implc                 C     t t| jS r   )r   r    ra   r   r   r   r   r   nb_int_impl     zConstantVariable.nb_int_implc                 C  r   r   )r   r    r   r   r   r   r   r   nb_float_impl  r   zConstantVariable.nb_float_impl)r   r   r   r   )r   r"   r   r   )r   r   r#   r   r   r   )r   r   r#   r   r   r   )r   r   )r   rV   )r   r\   r   r"   )rc   r   r   r"   )r   rg   )rh   r   r,   r   r   r   )rk   rl   r   r"   r   )rk   rl   rm   rn   r   r"   )rh   ru   r   rg   )rh   r   r   r   )rh   r   r   rV   r   r   )
rh   r   r   rV   r{   rg   r#   r   r   r   )rh   r   r   r   r   r   r   r   r   r   r   r   )rh   r   r   rV   r   r   r   ra   r   rl   r   r"   )r   rl   )rh   r   r   r   )-rX   r   __qualname____doc__ra   r   rV   r   r"   rC   r   _cpython_typer   staticmethodr    rJ   rT   rZ   r[   r_   rb   rd   rf   propertyrD   rj   rK   ro   ri   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__r   r   rP   r   r       sZ    /












o4






	r   TFc                      sl   e Zd ZdZeZd fdd	Zdd
dZdddZd ddZ	dddZ
dddZd!ddZd"ddZ  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   ra   r#   r   r   r   c                   s   t  jdi | || _d S )Nr   )rI   rJ   r   rN   rP   r   r   rJ     s   
zFakeIdVariable.__init__c                 C  rR   r   r   rS   r   r   r   r[     rU   z!FakeIdVariable.as_python_constantr"   c                 C  r]   NFr   rS   r   r   r   r_     r`   z!FakeIdVariable.is_python_constantrC   c                 C  s   t S r   )ra   rS   r   r   r   python_type  r`   zFakeIdVariable.python_typec                 C  r]   r^   r   rS   r   r   r   r     r`   z!FakeIdVariable.is_python_hashablec                 C  r   r   r   rS   r   r   r   r     re   zFakeIdVariable.get_python_hashr   rl   c                 C  s    t |ttfr| j| kS dS r   )r3   r   r   r   r[   )rO   r   r   r   r   r     s   zFakeIdVariable.is_python_equalcodegenc                 C  s   t dt| jddgd 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   rV   r   )rO   r   r   r   r   reconstruct  s   
zFakeIdVariable.reconstruct)r   ra   r#   r   r   r   r   r   )r   rC   r   )r   r   r   r   )rX   r   r   r   ra   r   rJ   r[   r_   r   r   r   r   r   r   r   r   rP   r   r     s    





r   )&r   
__future__r   r   typingr   r   r   r   typing_extensionsr   rr   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   r   <module>   s.       