a
    hQ                     @   s  d Z ddlZddlZddlZddlZddlZddlmZ ddl	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 dd	lmZmZ dd
lmZmZ ddlmZ ddlmZmZm Z m!Z!m"Z"m#Z# ddl$m%Z%m&Z& ddl'm(Z( erddl)m*Z* ddl+m,Z, dd Z-dd Z.d0ddZ/dd Z0G dd de&Z1G dd de&Z2G dd de1Z3G d d! d!e1Z4G d"d# d#e1Z5G d$d% d%e5Z6G d&d' d'e5Z7G d(d) d)e&Z8G d*d+ d+e8Z9G d,d- d-e8Z:G d.d/ d/e8Z;dS )1a  
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)
- Sets and frozensets (implemented internally using dictionaries)

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. Sets are implemented as dictionaries with
None values for efficiency and code reuse.
    NHashable)OptionalTYPE_CHECKING)is_fake   )graph_break_hints	polyfills	variables)create_call_functioncreate_instruction)raise_observed_exceptionunimplemented_v2)GuardBuilderinstall_guard)is_from_local_source)cmp_name_to_op_mapping
dict_items	dict_keysdict_valuesistypespecialize_symnode   )ValueMutationNewVariableTrackerConstantVariable)	PyCodegenInstructionTranslatorc                 C   s    t t| td| dgd d S )Nzwrong number of arguments for z() callargs)r   	TypeErrorr   )txname r%   K/var/www/auris/lib/python3.9/site-packages/torch/_dynamo/variables/dicts.pyraise_args_mismatch<   s
    r'   c                 C   s   t | jddS )N__instancecheck__F)type__dict__get)objr%   r%   r&   was_instancecheck_overrideD   s    r-   c                 C   s>   |d u rddl m} | }tt|tdt|  gd d S )Nr   r   zunhashable type: r    )torch._dynamo.symbolic_convertr   Z
current_txr   r"   r   r)   )argr#   r   r%   r%   r&   raise_unhashableH   s    r0   c                 C   s   t | tjr |  s |  r dS t | tjrB|  jj	dd uS t | tj
rbtdd | jD S t | tjrt| jst| jdtju rt | jtrt | jtS t | tjtjtjtjtjtjtjtjjtjtjtj tj!tj"tj#tj$fS d S )NTexample_valuec                 s   s   | ]}t |V  qd S N)is_hashable.0er%   r%   r&   	<genexpr>d       zis_hashable.<locals>.<genexpr>__hash__)%
isinstancer
   LazyVariableTrackeris_realizedr3   TensorVariableas_proxynodemetar+   TupleVariableallitemsUserDefinedObjectVariabler-   valueinspectgetattr_staticintr9   py_HashableBuiltinVariableZSymNodeVariabler   ZEnumVariableZUserDefinedClassVariableUserFunctionVariableZSkipFunctionVariablemiscZNumpyVariableNNModuleVariableUnspecializedNNModuleVariableZMethodWrapperVariableZTorchInGraphFunctionVariableZTypingVariableZFunctoolsPartialVariableWeakRefVariable)xr%   r%   r&   r3   R   sN    


r3   c                       s,  e Zd ZdhejZG dd dZefeeef dd fddZdd	 Zd
d Z	dd Z
dd Zdd ZedddZdd Zdd Zdd Zdd Zdddd Zd!ed"d#d$Zd!ed"d%d&Zed'd(d)Zed'd*d+Zd,d- Zd.d/ Zd0d1d2d3 fd4d5Zd6d7 Zd8d9 Z fd:d;Z  ZS )<ConstDictVariableuser_clsc                   @   sN   e Zd ZdZddddZedd Zdd	 Zed
d Z	d e
dddZdS )z"ConstDictVariable._HashableTrackeraB  
        Auxiliary opaque internal class that wraps a VariableTracker and makes it hashable
        This should not be seen or touched by anything outside of ConstDictVariable and its children
        Note that it's also fine to put VTs into dictionaries and sets, but doing so does not take into account aliasing
        Nreturnc                 C   s"   t |}t|st| || _d S r2   )r   r3   r0   vt)selfrU   r%   r%   r&   __init__   s    z+ConstDictVariable._HashableTracker.__init__c                    s
  t | jtjr,| j s,| j r,| j S t | jtjrN| j j	j
d }nt | jtjr~tj t fdd| jjD }nt | jtjr| jjS t | jtjr| jjS t | jtjr| j S t | jtjrtj  | jjjS t | jtj r| jjS | j }|S )Nr1   c                 3   s   | ]} |j V  qd S r2   )underlying_valuer4   r   r%   r&   r7      r8   zFConstDictVariable._HashableTracker.underlying_value.<locals>.<genexpr>)r:   rU   r
   r;   r<   r3   original_valuer=   r>   r?   r@   rA   rQ   _HashableTrackertuplerC   rM   rE   rN   rK   Zget_functionrO   Zreferent_vtrX   rD   as_python_constant)rV   rP   r%   r   r&   rX      s2    


z3ConstDictVariable._HashableTracker.underlying_valuec                 C   s
   t | jS r2   )hashrX   rV   r%   r%   r&   r9      s    z+ConstDictVariable._HashableTracker.__hash__c                    sl   t | t |krdS t| trPtj t| t|koNt fddt| |D S t| r`| |u S | |kS d S )NFc                 3   s   | ]\}}  ||V  qd S r2   )_eq_impl)r5   uvr   r%   r&   r7      s   z>ConstDictVariable._HashableTracker._eq_impl.<locals>.<genexpr>)	r)   r:   r[   rQ   rZ   lenrB   zipr   )abr%   r   r&   r_      s    
z+ConstDictVariable._HashableTracker._eq_impl)otherrT   c                 C   sN   t j}t||s&t|s&J t|t||r@|| j|jS || j|S r2   )rQ   rZ   r:   r   Z
is_literalr)   r_   rX   )rV   rf   r   r%   r%   r&   __eq__   s    
z)ConstDictVariable._HashableTracker.__eq__)__name__
__module____qualname____doc__rW   propertyrX   r9   staticmethodr_   boolrg   r%   r%   r%   r&   rZ      s   	

rZ   NrC   rT   c                    s   d|v r| d d|v r$| d t jf i | tj t fdd| D sZJ  fddfdd| D | _t| j | _	|
 | _|| _d S )	Noriginal_itemsshould_reconstruct_allc                 3   s*   | ]"\}}t |t fo t |tV  qd S r2   )r:   r   r5   rP   ra   r   r%   r&   r7      s   z-ConstDictVariable.__init__.<locals>.<genexpr>c                    s   t |  r| S  | S r2   )r:   )keyr   r%   r&   make_hashable   s    z1ConstDictVariable.__init__.<locals>.make_hashablec                    s   i | ]\}} ||qS r%   r%   rr   )rt   r%   r&   
<dictcomp>   r8   z.ConstDictVariable.__init__.<locals>.<dictcomp>)popsuperrW   rQ   rZ   rB   rC   r   sourcerq   copyrp   rR   )rV   rC   rR   kwargs	__class__)r   rt   r&   rW      s    


zConstDictVariable.__init__c                 C   s   dd | j   D S )Nc                 S   s    i | ]\}}|j  | qS r%   rU   r>   r5   kra   r%   r%   r&   ru      r8   z.ConstDictVariable.as_proxy.<locals>.<dictcomp>rC   r^   r%   r%   r&   r>      s    zConstDictVariable.as_proxyc                 C   s"   dd dd | j D  d S )N{, c                 s   s*   | ]"\}}|j   d |  V  qdS )z: NrU   
debug_reprr~   r%   r%   r&   r7      s   z/ConstDictVariable.debug_repr.<locals>.<genexpr>})joinrC   r^   r%   r%   r&   r      s    
zConstDictVariable.debug_reprc                 C   s   dd | j   D S )Nc                 S   s    i | ]\}}|j  | qS r%   rU   r\   r~   r%   r%   r&   ru     s   z8ConstDictVariable.as_python_constant.<locals>.<dictcomp>r   r^   r%   r%   r&   r\     s    z$ConstDictVariable.as_python_constantc                 C   s   |    dd | j D S )Nc                 S   s   i | ]\}}|j  |qS r%   r   r~   r%   r%   r&   ru     r8   z=ConstDictVariable.keys_as_python_constant.<locals>.<dictcomp>)install_dict_keys_match_guardrC   r^   r%   r%   r&   keys_as_python_constant
  s    z)ConstDictVariable.keys_as_python_constantc                 C   s   | j S r2   )rR   r^   r%   r%   r&   python_type  s    zConstDictVariable.python_typerS   c                 C   sB   t |tsJ tj}t|o@||| jv o@t | j|| tj S r2   )r:   r   rQ   rZ   r3   rC   r
   DeletedVariable)rV   rU   r   r%   r%   r&   __contains__  s    zConstDictVariable.__contains__c                 C   s   t dd | j D S )Nc                 S   s   g | ]}t |tjs|qS r%   )r:   r
   r   r5   rP   r%   r%   r&   
<listcomp>  s   z)ConstDictVariable.len.<locals>.<listcomp>)rb   rC   valuesr^   r%   r%   r&   rb     s
    zConstDictVariable.lenc                    s&    j r
dS t fdd j D S )NTc                 3   s(   | ] \}}   j|j|V  qd S r2   )is_new_itemrp   r+   rU   )r5   rs   rE   r^   r%   r&   r7   &  s   z2ConstDictVariable.has_new_items.<locals>.<genexpr>)rq   anyrC   r^   r%   r^   r&   has_new_items#  s
    zConstDictVariable.has_new_itemsc                 C   s<   |r,|  r,|  r,t| t| kS t|t|kS r2   )r<   idrealize)rV   rE   rf   r%   r%   r&   r   +  s    zConstDictVariable.is_new_itemc                 C   sh   d}| j   D ]B\}}| j|j}| ||s6| jr||j || |d7 }q|td|d d S )Nr   r   	BUILD_MAPr/   )rC   rp   r+   rU   r   rq   append_outputr   )rV   codegennum_argsrs   rE   itemr%   r%   r&   reconstruct_kvs_into_new_dict1  s    

z/ConstDictVariable.reconstruct_kvs_into_new_dictr   r   c                    sH   | j tju r:  fdd |    tdd n
|   d S )Nc                      s      t dgS )NOrderedDictextend_outputcreate_load_python_modulecollectionscreate_load_attrr%   r   r%   r&   <lambda>A  s   z/ConstDictVariable.reconstruct.<locals>.<lambda>r   F)rR   r   r   add_push_nullr   r   r   rV   r   r%   r   r&   reconstruct=  s    

zConstDictVariable.reconstructr   r#   r/   c                 C   s(   t |}|| jvrtt| | j| S r2   )rQ   rZ   rC   r   KeyError)rV   r#   r/   rs   r%   r%   r&   'getitem_const_raise_exception_if_absentM  s    


z9ConstDictVariable.getitem_const_raise_exception_if_absentc                 C   sL   t |}|| jvrBd|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.Zgb_typecontextZexplanationhints)rQ   rZ   rC   rE   r   r   Z
USER_ERROR)rV   r#   r/   rs   msgr%   r%   r&   getitem_constU  s    


	zConstDictVariable.getitem_constr   c                 C   s"   t |}|| jvrd S | j| S r2   )rQ   rZ   rC   )rV   r/   rs   r%   r%   r&   maybe_getitem_constd  s    

z%ConstDictVariable.maybe_getitem_constc                 C   sT   || v sJ t |}t| j |}t| j | }t|tj	rP|
  d S r2   )rQ   rZ   r[   rC   keysindexrp   r:   r
   r;   r   )rV   r/   rs   r   Zoriginal_key_vtr%   r%   r&   realize_key_vtj  s    
z ConstDictVariable.realize_key_vtc                 C   s   | j rt| tj d S r2   )rx   r   
make_guardr   ZDICT_KEYS_MATCHr^   r%   r%   r&   r   s  s    z/ConstDictVariable.install_dict_keys_match_guardc                 C   s   ddl m} | jsd S |jj| r(d S |d | v }|d jd u rvt|d |rvt| t	j
tj|d j| d n&|d jr|r| |d  n|   d S )Nr   r   r   )rs   invert) r   rx   outputside_effectsZis_modifiedr:   r   r   	functoolspartialr   ZDICT_CONTAINSrE   r   r   )rV   r#   r!   r   containsr%   r%   r&   install_dict_contains_guardw  s(    	
z-ConstDictVariable.install_dict_contains_guardlist[VariableTracker]dict[str, VariableTracker]r   r!   rz   rT   c                    sp  ddl m}m  tj|o$t|d }|dkrrttj|g|R i |}|j	j
|  | j|j  d S |dkrt|dksJ | ||d S |dkr|s|rJ |   | jr|j	j| j t| S |dkr|   | j r|j	j| j |s
|rJ t| S |dkrX|   | jr@|j	j| j |sL|rPJ t| S |d	kr|   |sv|rzJ | j| j t d d
S |dkr|s|rJ |    t| jS |dkr8|  r8|st|d  |   |st|dks
J |j	j
|  |d | j|d <  d S |dkr|r|  r|   d| _|j	j
|  | j|d   d S |dv rt|dv r|d | vr| || t|dkr|dkrt t!|  d S |d S nx|dkr6|r6|  r6d| _|j	j
|  | j"|d S |dkrhd| _|j	j
|  | j#   d S |dkrL|  rL|   t|dk}t|dk}	|s|	r6|j	j
|  |rt$|d tr|d   |d }
n|%|t|d }
| j|
j |	r, fdd| D }| j|  d S t& '||||S n |dv rt|d | v rt| (||d S |dkrt|dkr|st|d  | || |d | v } |S |dkrd|rd|  rd|   |rJ t|dksJ | )|d }|d ur|S t|dkr4 d }n|d }|j	j
|  || j|d < |S n|dkr|   |st|dksJ |j	j
|  |d }| j| }| j"| || j|<  d S |dkrZt|dksJ t$|d tst*d|d + j, d|   | j| j t d d
}|d   |j|d j |S t& '||||S d S )Nr   )rJ   r   r   rW   __getitem__rC   r   r   ry   )rC   Zmutation_typerx   __len____setitem__r   __delitem__T)rv   r+   )r   r   rv   clearupdatec                    s    i | ]\}}  ||qS r%   )creater~   r   r   r%   r&   ru     s   z1ConstDictVariable.call_method.<locals>.<dictcomp>)r+   __getattr__r   
setdefaultmove_to_end__or__z/unsupported operand type(s) for |: 'dict' and '')-r   rJ   r   rQ   rZ   r3   r
   dictZ	call_dictr   r   mutationrC   r   r   rb   r   r   rx   Zguard_on_key_orderaddDictItemsVariableDictKeysVariableDictValuesVariableclonery   r   
is_mutabler0   rq   r   r   r   r   rv   r   r:   Zcall_custom_dictrw   call_methodr   r   r"   r   rh   )rV   r#   r$   r!   rz   rJ   Zarg_hashableZtemp_dict_vthas_argZ
has_kwargsZdict_vtr   rE   rP   rs   valZnew_dict_vtr{   r   r&   r     s   







&














zConstDictVariable.call_methodc                 C   s   |    dd | j D S )Nc                 S   s   g | ]
}|j qS r%   rU   r   r%   r%   r&   r   M  r8   z9ConstDictVariable.unpack_var_sequence.<locals>.<listcomp>)r   rC   r   rV   r#   r%   r%   r&   unpack_var_sequenceK  s    z%ConstDictVariable.unpack_var_sequencec                 C   s\   | j tu r*|| j jv r tdS tdS d| j  d}tdd| j  |dgtjd d S )	NTFzhasattr on z is not supportedzunsupported hasattr operationzClass z+Consider using a regular dictionary insteadr   )rR   r   r*   r   r   r   r   SUPPORTABLE)rV   r#   r$   r   r%   r%   r&   call_obj_hasattrO  s    



z"ConstDictVariable.call_obj_hasattrc                    s   |    t jf i |S r2   )r   rw   r   )rV   rz   r{   r%   r&   r   b  s    zConstDictVariable.clone)rh   ri   rj   r   Z_nonvar_fieldsrZ   r   rW   r>   r   r\   r   r   rn   r   rb   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__r%   r%   r{   r&   rQ      sH   P
"				+ .rQ   c                       s`   e Zd Zedd fddZdd Zdd Zd	d
ddZed e	e
df ddddZ  ZS )MappingProxyVariableNdv_dictrT   c                    s*   t  jf i | t|ts J || _d S r2   )rw   rW   r:   rQ   r   rV   r   rz   r{   r%   r&   rW   i  s    zMappingProxyVariable.__init__c                 C   s   t jS r2   )typesMappingProxyTyper^   r%   r%   r&   r   n  s    z MappingProxyVariable.python_typec                 C   s   | j |S r2   )r   r   r   r%   r%   r&   r   q  s    z(MappingProxyVariable.unpack_var_sequencer   r   c                    sd   | j r4d| 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                      s      t dgS )Nr   )r   r   r   r   r%   r   r%   r&   r     s   z2MappingProxyVariable.reconstruct.<locals>.<lambda>r   F)rx   r   r   r   r   r   r   r   )rV   r   r   r%   r   r&   r   t  s"    
	

z MappingProxyVariable.reconstructr   r   c                 C   sF   | j r4|jj r4d}tdd| j  d|ddgd | j||||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 mutationr   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   )rx   r   r   Zhas_existing_dict_mutationr   r   r   )rV   r#   r$   r!   rz   r   r%   r%   r&   r     s    
	z MappingProxyVariable.call_method)rh   ri   rj   rQ   rW   r   r   r   listr   strr   r   r%   r%   r{   r&   r   g  s   
r   c                   @   s   e Zd Zdd Zdd ZdS )NNModuleHooksDictVariablec                 C   s   d S r2   r%   r^   r%   r%   r&   r     s    z7NNModuleHooksDictVariable.install_dict_keys_match_guardc                 C   s   d S r2   r%   rV   r#   r!   r%   r%   r&   r     s    z5NNModuleHooksDictVariable.install_dict_contains_guardN)rh   ri   rj   r   r   r%   r%   r%   r&   r     s   r   c                       sf   e Zd Zddd fddZ fddZ fddZed	d
 Zdddd fddZdd Z	  Z
S )DefaultDictVariableNrS   c                    s.   t  j||fi | |tju s$J || _d S r2   )rw   rW   r   defaultdictdefault_factory)rV   rC   rR   r   rz   r{   r%   r&   rW     s    zDefaultDictVariable.__init__c                    s$   | j tttfvr| jsdS t  S )NF)r   r   r[   r   rC   rw   is_python_constantr^   r{   r%   r&   r     s    z&DefaultDictVariable.is_python_constantc                    s   d| j   dt   dS )Nzdefaultdict(r   ))r   r   rw   r^   r{   r%   r&   r     s    zDefaultDictVariable.debug_reprc                 C   s0   t | tjr| jttttfv S t | tjj	S d S r2   )
r:   r
   rJ   fnr   r[   r   setZ	functionsZBaseUserFunctionVariabler   r%   r%   r&   is_supported_arg  s    z$DefaultDictVariable.is_supported_argr   r   r   r   c                    s   |dkr~t |dksJ |d | v r4| ||d S | jd u rNt|d  q| j|g i }t |d|d |f| |S nt ||||S d S )Nr   r   r   r   )rb   r   r   r   call_functionrw   r   )rV   r#   r$   r!   rz   Zdefault_varr{   r%   r&   r     s    
zDefaultDictVariable.call_methodc                    s:      fdd  | j |    tdd d S )Nc                      s      t dgS )Nr   r   r%   r   r%   r&   r     s   z1DefaultDictVariable.reconstruct.<locals>.<lambda>r   F)r   r   r   r   r   r   r%   r   r&   r     s    


zDefaultDictVariable.reconstruct)N)rh   ri   rj   rW   r   r   rm   r   r   r   r   r%   r%   r{   r&   r     s   

r   c                       s   e Zd ZdZee dd fddZdd Zedd	 Z	e
d
d Zdd Zdd Zdd ZddddZee eeef dd fddZdedddZdd Zd d! Z  ZS )"SetVariablez.We model a sets as dictionary with None valuesNro   c                    s(   t |t }t j|fi | d S r2   )r   fromkeysr   _default_valuerw   rW   rV   rC   rz   r{   r%   r&   rW     s    zSetVariable.__init__c                 C   s0   | j s
dS dddd | j  D  d S d S )Nzset()r   ,c                 s   s   | ]}|j  V  qd S r2   r   r5   r   r%   r%   r&   r7     r8   z)SetVariable.debug_repr.<locals>.<genexpr>r   rC   r   r   r^   r%   r%   r&   r     s    zSetVariable.debug_reprc                 C   s   t | j S r2   )r   rC   r   r^   r%   r%   r&   	set_items
  s    zSetVariable.set_itemsc                   C   s
   t d S r2   )r   r   r%   r%   r%   r&   r     s    zSetVariable._default_valuec                 C   s   dd | j D S )Nc                 S   s   h | ]}|j  qS r%   r}   r   r%   r%   r&   	<setcomp>  r8   z'SetVariable.as_proxy.<locals>.<setcomp>r   r^   r%   r%   r&   r>     s    zSetVariable.as_proxyc                 C   s   t S r2   )r   r^   r%   r%   r&   r     s    zSetVariable.python_typec                 C   s   dd | j D S )Nc                 S   s   h | ]}|j  qS r%   r   r   r%   r%   r&   r     r8   z1SetVariable.as_python_constant.<locals>.<setcomp>r   r^   r%   r%   r&   r\     s    zSetVariable.as_python_constantr   r   c                 C   s2   | dd | jD  |tdt| jd d S )Nc                 S   s   g | ]
}|j qS r%   r   r   r%   r%   r&   r     r8   z+SetVariable.reconstruct.<locals>.<listcomp>	BUILD_SETr   )foreachr   r   r   rb   r   r%   r%   r&   r     s    zSetVariable.reconstructr   r   c           
   
      s4  |dkrTt tj|g||R  }|jj|  | j  | j	|j t
d S |dkr|rdJ t|dkrzt|| d}|d t f}n|dkr|rJ |rJ z| j j}W nB t y } z(tt|ttt
j|jd W Y d }~n
d }~0 0 t |||f| |S |dkr\|r,J t|dks>J t tj|| |d gi S |d	kr|rpJ t tj|| g|i S |d
kr|rJ t tj|| g|i S |dkr|rJ t tj || g|i S |dkr|r J t tj!|| g|i S |dkrL|r0J t tj"|| g|i S |dkrt|dkrnt|| |rxJ t tj#|| g|i S |dkrt|dkrt|| |rJ t tj$|| g|i S |dkr| % r|rJ t tj&|| g|i S |dkrj|r*J t|dks<J |d | vrXtt||d t |d||S |dkr|r~J t|dksJ |d | v rt |d||S t
jd dS nd|dv r"t'j(t'j)d}|d * }	t+|	tst t||	gi }	t |,||| |	gi S t ||||S )NrW   r   r   r   r   rv   r    
isdisjointintersectionintersection_updateunion
differencedifference_updatesymmetric_differencesymmetric_difference_updater   removediscard)rE   )issubset
issuperset)-r
   rJ   r   Zcall_setr   r   r   rC   r   r   r   r   rb   r'   r   r   r   rv   rU   r   r   r   mapr!   rw   r   rK   r	   Zset_isdisjointr   Zset_intersectionZset_intersection_updateZ	set_unionZset_differenceZset_difference_updateZset_symmetric_differenceZset_symmetric_difference_updater   Z
set_updateoperatorleger   r   r+   )
rV   r#   r$   r!   rz   Ztemp_set_vtresultr6   oprf   r{   r%   r&   r      s    




























zSetVariable.call_methodr   r   c                 C   s   t dd S )NzIllegal to getitem on a set)RuntimeError)rV   r#   r/   r%   r%   r&   r     s    zSetVariable.getitem_constc                 C   s   d S r2   r%   r^   r%   r%   r&   r     s    z)SetVariable.install_dict_keys_match_guardc                 C   s   d S r2   r%   r   r%   r%   r&   r     s    z'SetVariable.install_dict_contains_guard)rh   ri   rj   rk   r   r   rW   r   rl   r   rm   r   r>   r   r\   r   r   r   r   r   r   r   r   r%   r%   r{   r&   r     s(   


lr   c                       s|   e Zd Zee dd fddZdd Zedd Zd	d
 Z	dd Z
ddddZee eeef dd fddZ  ZS )FrozensetVariableNro   c                    s   t  j|fi | d S r2   rw   rW   r   r{   r%   r&   rW     s    zFrozensetVariable.__init__c                 C   s0   | j s
dS dddd | j  D  d S d S )Nzfrozenset()r   r   c                 s   s   | ]}|j  V  qd S r2   r   r   r%   r%   r&   r7     r8   z/FrozensetVariable.debug_repr.<locals>.<genexpr>r   r   r^   r%   r%   r&   r     s    zFrozensetVariable.debug_reprc                 C   s
   | j  S r2   )rC   r   r^   r%   r%   r&   r     s    zFrozensetVariable.set_itemsc                 C   s   t S r2   )	frozensetr^   r%   r%   r&   r     s    zFrozensetVariable.python_typec                 C   s   dd | j D S )Nc                 S   s   h | ]}|j  qS r%   r   r   r%   r%   r&   r     r8   z7FrozensetVariable.as_python_constant.<locals>.<setcomp>r   r^   r%   r%   r&   r\     s    z$FrozensetVariable.as_python_constantr   r   c                    s<     dd | jD    fdd  tdd d S )Nc                 S   s   g | ]
}|j qS r%   r   r   r%   r%   r&   r     r8   z1FrozensetVariable.reconstruct.<locals>.<listcomp>c                      s      dgS )Nr  )r   Zcreate_load_globalr%   r   r%   r&   r     s   z/FrozensetVariable.reconstruct.<locals>.<lambda>r   F)r   r   r   r   r   r   r%   r   r&   r     s
    
zFrozensetVariable.reconstructr   r   c                    s>   |dv rt d| dn|dkr,td S t ||||S )Nr   rv   r   r  r  r   Illegal call_method z on a frozensetrW   )r  r   r   rw   r   rV   r#   r$   r!   rz   r{   r%   r&   r     s
    
zFrozensetVariable.call_method)rh   ri   rj   r   r   rW   r   rl   r   r   r\   r   r   r   r   r   r%   r%   r{   r&   r    s   

r  c                       sn   e Zd Zee dd fddZdd Zedd Zd	d
 Z	dd Z
ee eeef dd fddZ  ZS )DictKeySetVariableNro   c                    s   t  j|fi | d S r2   r  r   r{   r%   r&   rW     s    zDictKeySetVariable.__init__c                 C   s0   | j s
dS dddd | j  D  d S d S )Nzdict_keys([])zdict_keys([r   c                 s   s   | ]}|j  V  qd S r2   r   r   r%   r%   r&   r7     r8   z0DictKeySetVariable.debug_repr.<locals>.<genexpr>z])r   r^   r%   r%   r&   r     s    zDictKeySetVariable.debug_reprc                 C   s   | j S r2   r   r^   r%   r%   r&   r     s    zDictKeySetVariable.set_itemsc                 C   s   t S r2   r   r^   r%   r%   r&   r     s    zDictKeySetVariable.python_typec                 C   s   t dd | jD d  S )Nc                 S   s   h | ]}|j  qS r%   r   r   r%   r%   r&   r     r8   z8DictKeySetVariable.as_python_constant.<locals>.<setcomp>)r   r   r   r   r^   r%   r%   r&   r\     s    z%DictKeySetVariable.as_python_constantr   r   c                    s*   |dv rt d| dt ||||S )Nr  r  z on a dict_keys)r  rw   r   r  r{   r%   r&   r     s    zDictKeySetVariable.call_method)rh   ri   rj   r   r   rW   r   rl   r   r   r\   r   r   r   r   r%   r%   r{   r&   r    s   

	
r  c                       s   e Zd ZU dZdZee ed< edd fddZ	e
dd Ze
d	d
 Zdd ZddddZed eedf dd fddZ  ZS )DictViewVariablezu
    Models _PyDictViewObject

    This is an "abstract" class. Subclasses will override kv and the items method
    Nkvr   c                    s8   t  jf i | | jdv s J t|ts.J || _d S )N)r   r   rC   )rw   rW   r  r:   rQ   r   r   r{   r%   r&   rW     s    zDictViewVariable.__init__c                 C   s   t | jj| j S r2   )getattrr   rC   r  r^   r%   r%   r&   
view_items	  s    zDictViewVariable.view_itemsc                 C   s   t d S r2   )NotImplementedErrorr^   r%   r%   r&   view_items_vt  s    zDictViewVariable.view_items_vtc                 C   s   | j S r2   )r  r   r%   r%   r&   r     s    z$DictViewVariable.unpack_var_sequencer   r   c                 C   s$   || j  || j |d d S )Nr   )r   Zload_methodr  r   r   r%   r%   r&   r     s    
zDictViewVariable.reconstructr   r   c                    s,   |dkr| j ||||S t ||||S )Nr   )r   r   rw   r  r{   r%   r&   r     s    zDictViewVariable.call_method)rh   ri   rj   rk   r  r   r   __annotations__rQ   rW   rl   r  r  r   r   r   r   r   r   r%   r%   r{   r&   r    s   


	
r  c                       sV   e Zd ZdZedd Zedd Zdd Zed e	e
df dd	 fd
dZ  ZS )r   r   c                 C   s
   t | jS r2   )r   r  r^   r%   r%   r&   r   *  s    zDictKeysVariable.set_itemsc                 C   s   dd | j D S )Nc                 S   s   g | ]
}|j qS r%   r   r   r%   r%   r&   r   1  r8   z2DictKeysVariable.view_items_vt.<locals>.<listcomp>r  r^   r%   r%   r&   r  .  s    zDictKeysVariable.view_items_vtc                 C   s   t S r2   r  r^   r%   r%   r&   r   3  s    zDictKeysVariable.python_typer   r   c                    sl   |dkr| j ||||S |tv rZt|d ttfs>ttS tt| | j	|d j	S t
 ||||S )Nr   r   )r   r   r   r:   r   r   r   r   NotImplementedr   rw   r  r{   r%   r&   r   6  s    
zDictKeysVariable.call_method)rh   ri   rj   r  rl   r   r  r   r   r   r   r   r   r%   r%   r{   r&   r   '  s   


r   c                   @   s$   e Zd ZdZedd Zdd ZdS )r   r   c                 C   s
   t | jS r2   )r   r  r^   r%   r%   r&   r  L  s    z DictValuesVariable.view_items_vtc                 C   s   t S r2   )r   r^   r%   r%   r&   r   P  s    zDictValuesVariable.python_typeNrh   ri   rj   r  rl   r  r   r%   r%   r%   r&   r   H  s   
r   c                   @   s$   e Zd ZdZedd Zdd ZdS )r   rC   c                 C   s   dd | j D S )Nc                 S   s    g | ]\}}t |j|gqS r%   )r
   rA   rU   r~   r%   r%   r&   r   Z  r8   z3DictItemsVariable.view_items_vt.<locals>.<listcomp>r  r^   r%   r%   r&   r  W  s    zDictItemsVariable.view_items_vtc                 C   s   t S r2   )r   r^   r%   r%   r&   r   \  s    zDictItemsVariable.python_typeNr!  r%   r%   r%   r&   r   T  s   
r   )N)<rk   r   r   rF   r
  r   collections.abcr   rI   typingr   r   Ztorch._subclasses.fake_tensorr   r   r   r	   r
   Zbytecode_transformationr   r   excr   r   Zguardsr   r   rx   r   utilsr   r   r   r   r   r   baser   r   Zconstantr   Ztorch._dynamo.codegenr   r.   r   r'   r-   r0   r3   rQ   r   r   r   r   r  r  r  r   r   r   r%   r%   r%   r&   <module>   sL    

1   gF	C  8*-!