o
    j9:j-                     @   s   d Z ddlZddlZddlZddlmZmZmZ ddlm	Z	m
Z
mZmZ ddlmZ ddlmZmZmZ ddlmZmZmZmZ dd	lmZ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%m&Z&m'Z'm(Z(m)Z) ddl*m+Z+m,Z,m-Z-m.Z.m/Z/ ddl0m1Z1 ddl2m3Z3m4Z4m5Z5 ddl6m7Z7 erddl8m9Z9 ddl:m;Z; ddl<m=Z= G dd de/Z>G dd de/Z?G dd de>Z@G dd de>ZAG dd de/ZBG dd  d eBZCG d!d" d"eBZDG d#d$ d$eBZEe3eFB ZGG d%d& d&ejHjIeGe/f ZJG d'd( d(e>ZKdS ))aI  
Dictionary-related variable tracking classes for PyTorch Dynamo.

This module implements variable tracking for different types of dictionary-like objects:
- Regular Python dictionaries (dict)
- Ordered dictionaries (collections.OrderedDict)
- Default dictionaries (collections.defaultdict)
- Dictionary views (keys and values)

These classes are responsible for tracking dictionary operations during graph compilation,
maintaining proper guards for dictionary mutations and key existence checks. They handle
dictionary creation, modification, key/value access, and view operations while ensuring
correct behavior in the compiled code through appropriate guard installation.

The implementation uses a special HashableTracker wrapper to handle
dictionary keys while preserving proper aliasing semantics. Set-related classes live
in sets.py.
    N)CallableIteratorSequence)AnyLiteralTYPE_CHECKINGUnion)
MappingKey   )graph_break_hints	polyfills	variables)create_call_functioncreate_call_methodcreate_dup_topcreate_instruction)raise_observed_exceptionunimplemented)GuardBuilderinstall_guard)
AttrSourceDictGetItemSourceis_constant_sourceis_from_local_source)cmp_name_to_op_mapping
dict_items	dict_keysdict_valuesistyperaise_args_mismatch   )AttributeMutationExistingAttributeMutationNewNO_SUCH_SUBOBJValueMutationNewVariableTracker)ConstantVariable)HashableTrackeris_hashableraise_unhashable)SetVariable)	PyCodegen)InstructionTranslator)UserFunctionVariablec                       s  e Zd ZeZejZejZ	dhe
jZefdee
e
f dededdf fddZdedefdd	Zdeeef fd
dZdefddZdeeef fddZdeee
f fddZdefddZde
defddZddddde
dee
 deee
f de
fddZddddde
dee
 deee
f d eed!f de
fd"d#Zdefd$d%Zdefd&d'Zd(e
dB d)e
defd*d+ZdRd.d/Z dRd0d1Z!ddd2e
de
fd3d4Z"ddd2e
de
fd5d6Z#d2e
de
dB fd7d8Z$d2e
ddfd9d:Z%dSd;d<Z&ddd=e'e
 ddfd>d?Z(ddd@e
de
fdAdBZ)dddCed=e'e
 deee
f de
f
 fdDdEZ*ddde'e
 fdFdGZ+ddde
fdHdIZ,dddCede-fdJdKZ.dede
f fdLdMZ/defdNdOZ0dddCef fdPdQZ1  Z2S )TConstDictVariableuser_clsitemskwargsreturnNc                    s   d|v r	| d d|v r| d t jdi | t t fdd| D s,J dttdf ddf fdd	| |}|fd
d| D | _| j	rWt
| j	 nd| _| | _|| _d S )Noriginal_itemsshould_reconstruct_allc                 3   s,    | ]\}}t |t fot |tV  qd S N)
isinstancer%   .0xvHashable d/home/nk/hobo-godmode/plappi-mvp/.venv/lib/python3.10/site-packages/torch/_dynamo/variables/dicts.py	<genexpr>i   s    
z-ConstDictVariable.__init__.<locals>.<genexpr>keyr'   r2   c                    s   t |  r| S  | S r5   )r6   r@   r;   r=   r>   make_hashableo   s   z1ConstDictVariable.__init__.<locals>.make_hashablec                    s   i | ]	\}} ||qS r=   r=   r7   )rB   r=   r>   
<dictcomp>u   s    z.ConstDictVariable.__init__.<locals>.<dictcomp>Tr=   )popsuper__init__r'   allr0   r   r%   _get_dict_cls_from_user_clssourcer   r4   copyr3   r/   )selfr0   r/   r1   dict_cls	__class__)r<   rB   r>   rF   W   s(   





zConstDictVariable.__init__c                    sV   t tjtjf | v r|}nt fdd|jD }| v s"J ||tju r)t }|S )Nc                 3   s    | ]	}| v r|V  qd S r5   r=   )r8   baseaccepted_dict_typesr=   r>   r?      s    z@ConstDictVariable._get_dict_cls_from_user_cls.<locals>.<genexpr>)dictcollectionsOrderedDictdefaultdictnext__mro__)rK   r/   rL   r=   rP   r>   rH   ~   s   
z-ConstDictVariable._get_dict_cls_from_user_clsc                 C      dd | j   D S )Nc                 S       i | ]\}}|j  | qS r=   )vtas_proxyr8   kr:   r=   r=   r>   rC           z.ConstDictVariable.as_proxy.<locals>.<dictcomp>r0   rK   r=   r=   r>   r[      s   zConstDictVariable.as_proxyc                 C   s|   g }| j   D ]-\}}t|jdrt|jjn|j }t|dr&t|jn| }|| d|  qdd| d S )Nvaluez: {, })r0   hasattrrZ   reprra   
debug_reprappendjoinrK   r0   r]   r:   key_strval_strr=   r=   r>   rg      s   "zConstDictVariable.debug_reprc                 C   rX   )Nc                 S   rY   r=   rZ   as_python_constantr\   r=   r=   r>   rC      s    z8ConstDictVariable.as_python_constant.<locals>.<dictcomp>r_   r`   r=   r=   r>   rn      s   z$ConstDictVariable.as_python_constantc                 C   s   |    dd | j D S )Nc                 S   s   i | ]
\}}|j  |qS r=   rm   r\   r=   r=   r>   rC      s    z=ConstDictVariable.keys_as_python_constant.<locals>.<dictcomp>install_dict_keys_match_guardr0   r`   r=   r=   r>   keys_as_python_constant   s   z)ConstDictVariable.keys_as_python_constantc                 C      | j S r5   r/   r`   r=   r=   r>   python_type      zConstDictVariable.python_typerZ   c                 C   sD   t |tsJ t}t|sdS ||}|| jv o!t | j| tj S NF)r6   r%   r'   r(   r0   r   DeletedVariable)rK   rZ   r<   r@   r=   r=   r>   __contains__   s   zConstDictVariable.__contains__txr,   tree_map_fnr-   map_fnresttree_map_kwargsc                    s   g }|D ]%}|  }t|trt|jt| jkr$| |||||  S || qt| j  | j D ]6\}}	g }
|D ]"}z
|
|j|  W q= ty_   | ||||| Y     S w |		||||
| |< q5 fdd D }| j
 |dd t dS )Nc                       i | ]}|j  | qS r=   rZ   r8   key_trackernew_items_hashedr=   r>   rC          
z:ConstDictVariable.call_tree_map_branch.<locals>.<dictcomp>Tr0   r3   r4   rI   mutation_type)realizer6   r.   lenr0   _tree_map_fallbackrh   typeKeyErrorcall_tree_mapcloner$   )rK   ry   rz   r{   r|   r}   other_dicts	candidater   ra   sibling_leavesupdated_original_itemsr=   r   r>   call_tree_map_branch   sP   



z&ConstDictVariable.call_tree_map_branchkeypath.c                    s  g }|D ]&}|  }t|trt|jt| jkr%| ||||||  S || qt| j  | j D ]D\}	}
g }|D ]#}z
||j|	  W q> tya   | |||||| Y     S w |	j	
 }|t|f }|
|||||| |	< q6 fdd D }| j |dd t dS )Nc                    r~   r=   r   r   r   r=   r>   rC     r   zDConstDictVariable.call_tree_map_with_path_branch.<locals>.<dictcomp>Tr   )r   r6   r.   r   r0   _tree_map_with_path_fallbackrh   r   r   rZ   rn   r	   call_tree_map_with_pathr   r$   )rK   ry   rz   r{   r|   r}   r   r   r   r   ra   r   	key_constchild_keypathr   r=   r   r>   call_tree_map_with_path_branch   sV   	


	z0ConstDictVariable.call_tree_map_with_path_branchc                 C   s   t dd | j D S )Nc                 s   s    | ]
}t |tj V  qd S r5   )r6   r   rw   r8   r9   r=   r=   r>   r?     s    
z(ConstDictVariable.len.<locals>.<genexpr>)sumr0   valuesr`   r=   r=   r>   r     s   zConstDictVariable.lenc                    s"    j pt fdd j D S )Nc                 3   s*    | ]\}}   j|j|V  qd S r5   )is_new_itemr3   getrZ   r8   r@   ra   r`   r=   r>   r?   !  s
    
z2ConstDictVariable.has_new_items.<locals>.<genexpr>)r4   anyr0   r`   r=   r`   r>   has_new_items   s   zConstDictVariable.has_new_itemsra   otherc                 C   s<   |r|  r|  rt| t| kS t|t|kS r5   )is_realizedidr   )rK   ra   r   r=   r=   r>   r   &  s   zConstDictVariable.is_new_itemcodegenr+   c                 C   sh   d}| j   D ]!\}}| j|j}| ||s| jr(||j || |d7 }q|td|d d S )Nr   r    	BUILD_MAParg)r0   r3   r   rZ   r   r4   append_outputr   )rK   r   num_argsr@   ra   itemr=   r=   r>   reconstruct_kvs_into_new_dict.  s   
z/ConstDictVariable.reconstruct_kvs_into_new_dictc                    s   | j tju rS  fdd |  rD g tddt   |   	t   
d |    g tdtd d S |    tdd d S |  rx tddd	t g  |  |    	td
dd	 d S |   d S )Nc                            t dgS )NrT   extend_outputcreate_load_python_modulerS   create_load_attrr=   r   r=   r>   <lambda>>  
    z/ConstDictVariable.reconstruct.<locals>.<lambda>r   Fupdater    POP_TOPr   r   DICT_UPDATE)r/   rS   rT   add_push_null_contains_self_referencer   r   r   	add_cacher   load_methodr   r   r   rK   r   r=   r   r>   reconstruct:  sF   







zConstDictVariable.reconstructr   c                 C   s,   t |}|| jvrtt||gd | j| S )Nargs)r'   r0   r   r   )rK   ry   r   r@   r=   r=   r>   'getitem_const_raise_exception_if_absenti  s   

z9ConstDictVariable.getitem_const_raise_exception_if_absentc                 C   sJ   t |}|| jvr d|j d}tdd|j |dgtjd | j| S )NzDictionary key z not found during tracingzkey not found in dictzKey z>Check if the key exists in the dictionary before accessing it.gb_typecontextexplanationhints)r'   r0   ra   r   r   
USER_ERROR)rK   ry   r   r@   msgr=   r=   r>   getitem_constq  s   


	zConstDictVariable.getitem_constc                 C   s    t |}|| jvrd S | j| S r5   )r'   r0   )rK   r   r@   r=   r=   r>   maybe_getitem_const  s   

z%ConstDictVariable.maybe_getitem_constc                 C   sV   || v sJ t |}t| j |}t| j | }t|tjr)|	  d S d S r5   )
r'   tupler0   keysindexr3   r6   r   LazyVariableTrackerr   )rK   r   r@   r   original_key_vtr=   r=   r>   realize_key_vt  s   z ConstDictVariable.realize_key_vtc                 C   s   | j rt| tj d S d S r5   )rI   r   
make_guardr   DICT_KEYS_MATCHr`   r=   r=   r>   rp     s   z/ConstDictVariable.install_dict_keys_match_guardr   c                 C   s   | j sd S |jj| rd S |d | v }|d j d u r?|d  r?|r(t| jnt| j}t| 	t
j||d  d d S |d j rU|rO| |d  d S |   d S d S )Nr   rA   )rI   outputside_effectsis_modifiedis_python_constantr   CONTAINS_GUARDNOT_CONTAINS_GUARDr   r   	functoolspartialrn   r   rp   )rK   ry   r   containsguard_fnr=   r=   r>   install_dict_contains_guard  s*   

z-ConstDictVariable.install_dict_contains_guardr@   c                 C   s   |  ||S r5   )r   rK   ry   r@   r=   r=   r>   mp_subscript_impl  s   z#ConstDictVariable.mp_subscript_implnamec              	      s
  ddl m} ddlm} t |dkr2|jtg|R i |}jj	|  | j
|j
 td S |dkr^|s:|rKt|dt| dt| d |   | jrZjj| j t| S |d	krt|rrt|d
t| d |   | jrjj| j t| S |dkr|s|rt|dt| dt| d |   | jrjj| j |s|rtt t| S |dkr|   |s|rt|dt| dt| d | j| j
 t d dS |dkr4|  r4|ot|d }|st|d  |   |st|dkrt|dt| dt| d jj	|  |d | j
 |d < td S |dkrp|  rp|oFt|d }|rg|   d| _jj	|  | j
  |d  td S t! "|||S |dkrt|dvrt|dt| d |ot|d }|st|d  |d | vr| #| t|dkrtd S |d S | $|d S |dkr!|  r!t|dvrt|dt| d |ot|d }|st|d  |d | vr| #| t|dkr	tt% |d S d| _jj	|  | j
& |d S |dkr|  rt'| j(trDt'| j(t)j*sDt|rDt| | j
sPtt%dgd | j(t)j*u rt|dkscd|v rt|dkrx|d + rx|d , }	n|-d }
r|
+ r|
, }	nt| | j
j.|	d\}}
n| j
. \}}
d| _jj	|  t/0|j1|
gS |dkr|s|rt|dt| dt| d d| _jj	|  | j
2  td S |dkrR|  rR|   t|dk}t|dk}|s|rIjj	|  |r/t3|d t4r|d   |d }n	|t|d }| j
|j
 |rD fd d!|
 D }| j
| td S t! "|||S |d"krt|smt|d#t| dt| d |out|d }|st|d  | #| |d | v }t56|S |d$kr|  rt|dvrt|d%t| dt| d |ot|d }|st|d  |   |st|dkrt|d&t| dt| d | 7|d }|d ur|S t|dkrtd }n|d }jj	|  || j
 |d < |S |d'krr|   jj	|  |d | vr3tt% d}	t|dkrI|d + rI|d , }	|r_d|v r_|d + r_|-d, }	 |d }| j
j8||	d td S |d(krt9| t4rt|dkrt|d)t| d |t:j;<| |d gi S |d*krt56| "d(||j= S |d+kr?t|dkrt|d)t| d |d }t9|t4t/j>t/j?fr(t3|t/j>r|j@d usJ t3|j@t4sJ |j@}| j(tur| j(}| }n|j(}|}|  |j| j
 t d |d,}|d   |j
|d j
 |S ttd-| A jB d.|A jB d/gd d S |d0krN| "d|| | S |d1krudd2lCmD} | jrktE| jskjj| j || Ft d3S t! "|||S )4Nr    )DictBuiltinVariable)SourcelessBuilderrF   r0   z0 args and 0 kwargsz
 args and z kwargsr   z0 args argsr   rJ   )r0   r   rI   __setitem__r   r
   z2 args and 0 kwargs__delitem__Tr   )r    r
   z1 or 2 argsrD   popitemzpopitem(): dictionary is emptyr   last)r   clearr   c                    s"   i | ]\}} t ||qS r=   )r%   buildr\   r<   ry   r=   r>   rC     s    z1ConstDictVariable.call_method.<locals>.<dictcomp>rx   zmore than 1 args and 0 kwargs
setdefaultz1 or 2 args and 0 kwargszat most 2 args and 0 kwargsmove_to_end__eq__1 args__ne____or__)r0   r   rI   r/   z$unsupported operand type(s) for |: 'z'and ''__ior____iter__ListIteratorVariabler   )G r   builderr   r'   call_custom_dictrR   r   r   mutationr0   r   r&   creater   r   rp   rI   guard_on_key_orderaddDictItemsVariableDictKeysVariabler   	TypeErrorDictValuesVariabler   rJ   r$   
is_mutabler(   r)   r4   r   rE   call_methodr   r   r   rD   
issubclassr/   rS   rT   r   rn   r   r   r   TupleVariablerZ   r   r6   r.   r%   r   r   r   r   r   dict___eq__call_functionra   UserDefinedDictVariableDefaultDictVariable_base_vtrt   __name__listsr   r   unpack_var_sequence)rK   ry   r   r   r1   r   r   temp_dict_vtarg_hashabler   r:   r]   has_arg
has_kwargsdict_vtkwargs_hashabler   ra   r9   r@   r   r/   to_cpynew_dict_vtr   rM   r   r>   r    s<  
























		


zConstDictVariable.call_methodc                 C   s   |    dd | jD S )Nc                 S      g | ]}|j qS r=   r   r   r=   r=   r>   
<listcomp>:      z9ConstDictVariable.unpack_var_sequence.<locals>.<listcomp>ro   rK   ry   r=   r=   r>   r  8  s   z%ConstDictVariable.unpack_var_sequencec                 C   s   |    t|t| jS )z Mapping length for dict objects.)rp   r%   r   r   r0   r  r=   r=   r>   	mp_length<  s   zConstDictVariable.mp_lengthc                    s|   t  fddttjtjfD r%t j|rtdS  jtu r%tdS d j d}t	dd j |d	gt
jd
 d S )Nc                 3   s    | ]} j |u V  qd S r5   rs   )r8   tr`   r=   r>   r?   F  s
    
z5ConstDictVariable.call_obj_hasattr.<locals>.<genexpr>TFzhasattr on z is not supportedzunsupported hasattr operationzClass z+Consider using a regular dictionary insteadr   )r   rR   rS   rT   rU   re   r/   r&   r   r   r   SUPPORTABLE)rK   ry   r   r   r=   r`   r>   call_obj_hasattrA  s"   




z"ConstDictVariable.call_obj_hasattrc                    s   |    t jdi |S Nr=   )rp   rE   r   )rK   r1   rM   r=   r>   r   Z  s   zConstDictVariable.clonec                 C      dS )zP
        Dictionaries are mutable and therefore not hashable in Python.
        Fr=   r`   r=   r=   r>   is_python_hashable^     z$ConstDictVariable.is_python_hashablec                    s&   |dkrt ||  S t ||S )NrN   )r%   r   rt   rE   var_getattrrK   ry   r   rM   r=   r>   r   d  s   zConstDictVariable.var_getattrr   r+   r2   Nr2   N)3r	  
__module____qualname__rR   _cpython_typer   DICT_CONTAINSr   DICT_NOT_CONTAINSr   r%   _nonvar_fieldsr   r   rF   rH   r[   strrg   rn   rq   rt   boolrx   r   r   r   r   intr   r   r   r   r   r   r   r   r   rp   listr   r   r  r  r  r&   r  r   r  r   __classcell__r=   r=   rM   r>   r.   K   s    
'


2


6


/


	
*
	
  r
r.   c                
       s   e Zd ZejZdededdf fddZde	fddZ
d	d
dee fddZdddZdddZd	d
dedefddZd	d
dedee deeef def
ddZd	d
defddZd	d
dedef fddZ  ZS ) MappingProxyVariabledv_dictr1   r2   Nc                    s*   t  jdi | t|tsJ || _d S r  )rE   rF   r6   r.   r0  rK   r0  r1   rM   r=   r>   rF   o  s   
zMappingProxyVariable.__init__c                 C   s   t jS r5   )typesMappingProxyTyper`   r=   r=   r>   rt   t  ru   z MappingProxyVariable.python_typery   r,   c                 C      | j |S r5   )r0  r  r  r=   r=   r>   r  w     z(MappingProxyVariable.unpack_var_sequencer   r+   c                    sd   | j rd| j  d}tdd| j  |dgtjd   fdd  | j  td	d
 d S )Nz*Preexisting MappingProxyVariable (source: zS) cannot be reconstructed because the connection to the original dict will be lost.z%mapping proxy cannot be reconstructedSource: zCUse a mapping proxy constructed in the same `torch.compile` region.r   c                      r   )Nr3  )r   r   r2  r   r=   r   r=   r>   r     r   z2MappingProxyVariable.reconstruct.<locals>.<lambda>r    F)rI   r   r   r  r   r0  r   r   )rK   r   r   r=   r   r>   r   z  s"   
	

z MappingProxyVariable.reconstructc                 C   s@   | j r|jj rd}tdd| j  d|ddgd d S d S d S )Na  A dict has been modified while we have an existing mappingproxy object. A mapping proxy object, as the name suggest, proxies a mapping object (usually a dict). If the original dict object mutates, it is reflected in the proxy object as well. For an existing proxy object, we do not know the original dict it points to. Therefore, for correctness we graph break when there is dict mutation and we are trying to access a proxy object.z-mapping proxy affected by dictionary mutationr6  z, Dict mutation detectedzNAvoid modifying dictionaries that might be referenced by mapping proxy objectszROr avoid using the mapping proxy objects after modifying its underlying dictionaryr   )rI   r   r   has_existing_dict_mutationr   )rK   ry   r   r=   r=   r>   _check_mutation_guard  s   

z*MappingProxyVariable._check_mutation_guardr@   c                 C   s   |  | | j||S r5   )r8  r0  r   r   r=   r=   r>   r     s   
z&MappingProxyVariable.mp_subscript_implr   r   c                 C   s   |  | | j||||S r5   )r8  r0  r  rK   ry   r   r   r1   r=   r=   r>   r    s   
z MappingProxyVariable.call_methodc                 C   r4  r5   )r0  r  r  r=   r=   r>   r    r5  zMappingProxyVariable.mp_lengthc                    s0   |   tju rt||tjjv S t ||S r5   )rt   r2  r3  r%   r   __dict__rE   r  r!  rM   r=   r>   r    s   z%MappingProxyVariable.call_obj_hasattrr"  )ry   r,   r2   N)r	  r$  r%  r2  r3  r&  r.   r   rF   r   rt   r-  r%   r  r   r8  r   r*  rR   r  r  r&   r  r.  r=   r=   rM   r>   r/  j  sB    






r/  c                   @   s0   e Zd Zd
ddZdddee ddfdd	ZdS )NNModuleHooksDictVariabler2   Nc                 C      d S r5   r=   r`   r=   r=   r>   rp        z7NNModuleHooksDictVariable.install_dict_keys_match_guardry   r,   r   c                 C   r<  r5   r=   rK   ry   r   r=   r=   r>   r        z5NNModuleHooksDictVariable.install_dict_contains_guardr#  )r	  r$  r%  rp   r-  r%   r   r=   r=   r=   r>   r;    s    
r;  c                       s   e Zd ZejZ	ddeeef dededB de	ddf
 fddZ
def fd	d
Zdef fddZededefddZdddedef fddZdddedee deeef def
 fddZdddedef fddZd ddZ  ZS )!r  Nr0   r/   default_factoryr1   r2   c                    s@   t  j||fi | |tju sJ |d u rtd }|| _d S r5   )rE   rF   rS   rU   r&   r   r@  )rK   r0   r/   r@  r1   rM   r=   r>   rF     s
   

zDefaultDictVariable.__init__c                    s$   | j tttfvr| jsdS t  S rv   )r@  r-  r   rR   r0   rE   r   r`   rM   r=   r>   r     s   
z&DefaultDictVariable.is_python_constantc                    s,   | j d usJ d| j   dt   dS )Nzdefaultdict(rc   ))r@  rg   rE   r`   rM   r=   r>   rg     s   zDefaultDictVariable.debug_reprr   c                 C   s0   t | tjtjjtjjfpt | tjo| jd u S r5   )r6   r   BaseBuiltinVariable	functionsBaseUserFunctionVariablePolyfilledFunctionVariabler&   ra   r   r=   r=   r>   is_supported_arg  s   z$DefaultDictVariable.is_supported_argry   r,   r@   c                    s\   || v r
|  ||S | j rtt||gd d S | j|g i }t |d||gi  |S )Nr   r   )r   r@  is_constant_noner   r   r  rE   r  )rK   ry   r@   default_varrM   r=   r>   r     s   
z%DefaultDictVariable.mp_subscript_implr   r   c                    s   |dkrH| j rHt|dkrt||dt| d t|d tr?|d jdkr?| |d r?|jj	|  |d | _
td S t ||||S |dkrnt|dkr^t||d	t| d t|tj|| |d gi S t ||||S )
N__setattr__r
   z2 argsr   r   r@  r    r   r   )r   r   r   r   r&   ra   rF  r   r   r   r@  r   rE   r  r%   r   r   r  r  r9  rM   r=   r>   r    s&   

zDefaultDictVariable.call_methodc                    s   |dkr| j S t ||S )Nr@  )r@  rE   r   r!  rM   r=   r>   r   +  s   zDefaultDictVariable.var_getattrr   r+   c                    s~      fdd  | j  g tddt   |   t   d |    g t	dt
d d S )Nc                      r   )NrU   r   r=   r   r=   r>   r   7  r   z1DefaultDictVariable.reconstruct.<locals>.<lambda>r    Fr   r   )r   r@  r   r   r   r   r   r   r   r   r   r   r=   r   r>   r   4  s,   




zDefaultDictVariable.reconstructr5   r"  )r	  r$  r%  rS   rU   r&  rR   r%   r   r   rF   r+  r   r*  rg   staticmethodrF  r   r-  r  r   r   r.  r=   r=   rM   r>   r    sX    


	r  c                
       s   e Zd ZU dZdZedB ed< dededdf fddZ	e
defd	d
Ze
dee fddZdddee fddZdddZdddedefddZdddedee deeef def
 fddZdddefddZ  ZS )DictViewVariablezu
    Models _PyDictViewObject

    This is an "abstract" class. Subclasses will override kv and the items method
    Nkvr0  r1   r2   c                    s8   t  jdi | | jdv sJ t|tsJ || _d S )N)r   r   r0   r=   )rE   rF   rL  r6   r.   r0  r1  rM   r=   r>   rF   [  s   
zDictViewVariable.__init__c                 C   s    | j d usJ t| jj| j  S r5   )rL  getattrr0  r0   r`   r=   r=   r>   
view_itemsa  s   zDictViewVariable.view_itemsc                 C   s   t r5   )NotImplementedErrorr`   r=   r=   r>   view_items_vtf  r  zDictViewVariable.view_items_vtry   r,   c                 C   rr   r5   )rP  r  r=   r=   r>   r  l  ru   z$DictViewVariable.unpack_var_sequencer   r+   c                 C   s2   | j d usJ || j || j  |d d S )Nr   )rL  r0  r   r  r   r=   r=   r>   r   o  s   
zDictViewVariable.reconstructr   c                 C   s0   | j d usJ ||  jv rtdS tdS )NTF)rL  rt   r:  r&   r   r!  r=   r=   r>   r  u  s   

z!DictViewVariable.call_obj_hasattrr   c                    sN   |dkrddl m} || jt dS |dkrt||  S t ||||S )Nr   r    r   r   __repr__)	r
  r   rP  r$   r%   r   rg   rE   r  )rK   ry   r   r   r1   r   rM   r=   r>   r  }  s   zDictViewVariable.call_methodc                 C   s   t |t| jS )z&Sequence length for dict view objects.)r%   r   r   rN  r  r=   r=   r>   	sq_length  s   zDictViewVariable.sq_lengthr"  )r	  r$  r%  __doc__rL  r*  __annotations__r.   r   rF   propertyrN  r-  r%   rP  r  r   r&   r  rR   r  rR  r.  r=   r=   rM   r>   rK  R  s:   
 


rK  c                
       s   e Zd ZeZdZedee fddZ	ede
e fddZdefddZdefd	d
Zdddede
e deeef def
 fddZ  ZS )r   r   r2   c                 C   
   t | jS r5   )setrN  r`   r=   r=   r>   	set_items     
zDictKeysVariable.set_itemsc                 C      dd | j D S )Nc                 S   r  r=   r   r   r=   r=   r>   r    r  z2DictKeysVariable.view_items_vt.<locals>.<listcomp>rN  r`   r=   r=   r>   rP       zDictKeysVariable.view_items_vtc                 C      t S r5   )r   r`   r=   r=   r>   rt     r=  zDictKeysVariable.python_typec                 C   sX   | j sdS g }| j D ]}t|jdrt|jjn|j }|| q
dd| d S )Nzdict_keys([])ra   zdict_keys([,])rN  re   rZ   rf   ra   rg   rh   ri   )rK   r0   r]   rk   r=   r=   r>   rg     s   
 zDictKeysVariable.debug_reprry   r,   r   r   r1   c                    s   |dkr| j ||||S |dv r"t| j|}||d j}t|S |tv rGt|d ttjt	t
fs8t|tS t|t| | j|d jS t ||||S )Nrx   __and____iand__r   r   __sub____isub____xor____ixor__r   )r0  r  rM  rX  r*   r   r6   r   UserDefinedSetVariabler   r   r%   r   NotImplementedrE   )rK   ry   r   r   r1   mrrM   r=   r>   r    s*   	zDictKeysVariable.call_method)r	  r$  r%  r   r&  rL  rU  rW  r%   rX  r-  rP  r   rt   r*  rg   rR   r  r.  r=   r=   rM   r>   r     s(    
r   c                   @   sF   e Zd ZeZdZedee fddZ	de
fddZdefddZd	S )
r   r   r2   c                 C   rV  r5   )r-  rN  r`   r=   r=   r>   rP    rY  z DictValuesVariable.view_items_vtc                 C   r]  r5   )r   r`   r=   r=   r>   rt     r=  zDictValuesVariable.python_typec                 C   sR   | j sdS g }| j D ]}t|drt|jn| }|| q
dd| d S )Nzdict_values([])ra   zdict_values([r^  r_  )rN  re   rf   ra   rg   rh   ri   )rK   r0   r:   rl   r=   r=   r>   rg     s   
zDictValuesVariable.debug_reprN)r	  r$  r%  r   r&  rL  rU  r-  r%   rP  r   rt   r*  rg   r=   r=   r=   r>   r     s    r   c                
       s   e Zd ZeZdZeded fddZede	e
 fddZdefdd	Zdefd
dZdddede	e
 deee
f de
f
 fddZded fddZ  ZS )r   r0   r2   r'   c                 C   rZ  )Nc                 S   s$   h | ]\}}t t|j|gqS r=   )r'   r   r  rZ   r\   r=   r=   r>   	<setcomp>  s    z.DictItemsVariable.set_items.<locals>.<setcomp>r[  r`   r=   r=   r>   rX    s   zDictItemsVariable.set_itemsc                 C   rZ  )Nc                 S   s    g | ]\}}t |j|gqS r=   )r   r  rZ   r\   r=   r=   r>   r    r^   z3DictItemsVariable.view_items_vt.<locals>.<listcomp>r[  r`   r=   r=   r>   rP     r\  zDictItemsVariable.view_items_vtc                 C   r]  r5   )r   r`   r=   r=   r>   rt     r=  zDictItemsVariable.python_typec                 C   s   | j sdS g }| j D ]/\}}t|jdrt|jjn|j }t|dr)t|jn| }|d| d| d q
dd| d S )	Nzdict_items([])ra   (rc   rA  zdict_items([r^  r_  r`  rj   r=   r=   r>   rg     s    zDictItemsVariable.debug_reprry   r,   r   r   r1   c                    s@  |dkrKt |dkrt||dt | d t|d tr*| j|d|d jgi S t|d ttjtt	frFt
|t | j|d jA dkS tdS |dkr]ddlm} || jt d	S |d
v rrt| j|}||d j}t|S |tv rt|d ttjtt	fst
|tS t
|t| | j|d jS t ||||S )Nr   r    r   r   r   Fr   r   r   ra  )r   r   r6   r   r0  r  r*   r   rh  r   r%   r   rX  r&   r   r
  r   rP  r$   rM  r   ri  rE   )rK   ry   r   r   r1   r   fn_hdlret_valrM   r=   r>   r    sT   		
	zDictItemsVariable.call_methodFc                 C   r  )zC
        Dictionary item views are not hashable in Python.
        Fr=   r`   r=   r=   r>   r  V  r  z$DictItemsVariable.is_python_hashable)r	  r$  r%  r   r&  rL  rU  rW  rX  r-  r%   rP  r   rt   r*  rg   rR   r  r   r  r.  r=   r=   rM   r>   r     s*    
Ar   c                	   @   s   e Zd ZdZededeeef fddZ	edddedeeef fdd	Z
d
eddddfddZdedefddZdeeef fddZdedefddZdededdfddZdeddfddZdedefddZdefddZdee fddZdS ) SideEffectsProxyDictzm
    A proxy dict that allows us to track mutations to the dict using side
    effects table as storage.
    rZ   r2   c                 C   s   t | tjri S t| tjrt| jS |  }|t	ur-t| tj
r'| dS t|dS tddt|  dt|  g tjd d S )Nr:  z-unsupported variable type for __dict__ accesszVariableTracker type: z.Dynamo does not know how to get __dict__ from r   )r   r   NestedUserFunctionVariabler6   LocalGeneratorFunctionVariablerp  get_example_value_dictrZ   get_real_python_backed_valuer#   UserDefinedObjectVariable_getattr_staticobject__getattribute__r   r   r   
DYNAMO_BUG)rZ   ra   r=   r=   r>   rs  f  s"   

z+SideEffectsProxyDict.get_example_value_dictry   r,   c                    s"   t } fdd| D S )Nc              
      s6   i | ]\}}|t j |jottjd |dqS )r:  )rI   )r%   r   rI   r   r   r   ry   rZ   r=   r>   rC     s    z;SideEffectsProxyDict.get_value___dict__.<locals>.<dictcomp>)rp  rs  r0   )ry   rZ   example_value_dictr=   rz  r>   get_value___dict__  s   
z'SideEffectsProxyDict.get_value___dict__r   Nc                 C   s"   || _ |jj| _| ||| _d S r5   )r   r   r   r|  	item_dict)rK   r   ry   r=   r=   r>   rF     s   
zSideEffectsProxyDict.__init__r@   c                 C   s   t }t||r|j S |S r5   )r'   r   rZ   rn   )rK   r@   Hasherr=   r=   r>   _maybe_unwrap_key  s   z&SideEffectsProxyDict._maybe_unwrap_keyc                 C   s   | j j| ji S r5   )r   store_attr_mutationsr   r   r`   r=   r=   r>   side_effects_table     z'SideEffectsProxyDict.side_effects_tablec                 C   s8   |  |}| j| j|r| jj| j|ddS | j| S )NT)
deleted_ok)r  r   has_pending_mutation_of_attrr   	load_attrr}  rK   r@   r   r=   r=   r>   __getitem__  s   

z SideEffectsProxyDict.__getitem__ra   c                 C   s.   |  |}t|tsJ | j| j|| d S r5   )r  r   r*  r   
store_attrr   )rK   r@   ra   r   r=   r=   r>   r     s   
z SideEffectsProxyDict.__setitem__c                 C   s$   |  |}| j| j|t  d S r5   )r  r   r  r   r   rw   r  r=   r=   r>   r     s   
z SideEffectsProxyDict.__delitem__c                 C   s6   |  |}|  }||v rt|| tj S || jv S r5   )r  r  r6   r   rw   r}  )rK   r@   r   tabler=   r=   r>   rx     s
   

z!SideEffectsProxyDict.__contains__c                 C   s   t dd | D S )Nc                 s   s    | ]}d V  qdS )r    Nr=   )r8   _r=   r=   r>   r?     s    z/SideEffectsProxyDict.__len__.<locals>.<genexpr>)r   r`   r=   r=   r>   __len__  r  zSideEffectsProxyDict.__len__c                 c   sn    t }|  }| D ]\}}t|tjrq|t|V  q| j D ]\}}||vr4|t|V  q$d S r5   )	r'   r  r0   r6   r   rw   r&   r   r}  )rK   r~  dr]   r:   r=   r=   r>   r     s   zSideEffectsProxyDict.__iter__)r	  r$  r%  rS  rJ  r%   rR   r*  rw  rs  r|  rF   kVr  r  r  r   r   r+  rx   r,  r  r   r'   r   r=   r=   r=   r>   rp  `  s*    

rp  c                       s   e Zd ZdZedddedd fddZdedddedd	f fd
dZde	dedd	fddZ
de	defddZde	defddZde	deg ef defddZdddZdddee dd	fddZ  ZS )DunderDictVariablezrepresents object.__dict__ry   r,   rZ   r2   c                 C   s4   |j rt nt }|j ot|j d}| ||||dS )Nr:  )ry   r   rI   )rI   r!   r"   r   )clsry   rZ   r   rI   r=   r=   r>   r     s   zDunderDictVariable.creater1   Nc                    s$   t  ji fi | t||| _d S r5   )rE   rF   rp  r0   )rK   rZ   ry   r1   rM   r=   r>   rF     s   zDunderDictVariable.__init__r   ra   c                 C   s   || j |< d S r5   r_   )rK   r   ra   r=   r=   r>   setitem  s   zDunderDictVariable.setitemc                 C   s
   | j | S r5   r_   rK   r   r=   r=   r>   getitem     
zDunderDictVariable.getitemc                 C   s
   || j v S r5   r_   r  r=   r=   r>   r     r  zDunderDictVariable.containsdefaultc                 C   s(   |  |r
| |S | }|| j|< |S r5   )r   r  r0   )rK   r   r  ra   r=   r=   r>   getitem_or_default  s
   


z%DunderDictVariable.getitem_or_defaultc                 C   r<  r5   r=   r`   r=   r=   r>   rp     r=  z0DunderDictVariable.install_dict_keys_match_guardr   c                 C   r<  r5   r=   r>  r=   r=   r>   r     r?  z.DunderDictVariable.install_dict_contains_guardr#  )r	  r$  r%  rS  classmethodr%   r   r   rF   r*  r  r  r+  r   r   r  rp   r-  r   r.  r=   r=   rM   r>   r    sJ    	


r  )LrS  rS   r   r2  collections.abcr   r   r   typingr   r   r   r   torch.utils._pytreer	   r   r   r   r   bytecode_transformationr   r   r   r   excr   r   guardsr   r   rI   r   r   r   r   utilsr   r   r   r   r   r   rO   r!   r"   r#   r$   r%   constantr&   hashabler'   r(   r)   setsr*   torch._dynamo.codegenr+   torch._dynamo.symbolic_convertr,   rC  r-   r.   r/  r;  r  rK  r   r   r   r*  r  abcMutableMappingrp  r  r=   r=   r=   r>   <module>   sL           %`}AGjf