o
    Zh                     @   st  d Z ddlZddlZddlZddlmZmZ ddl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mZ dd
l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  erdddl!m"Z" dd Z#G dd deZ$G dd deZ%G dd de$Z&G dd de$Z'G dd de$Z(G dd de(Z)G dd de(Z*G d d! d!eZ+G d"d# d#e+Z,G d$d% d%e+Z-dS )&a  
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)OptionalTYPE_CHECKING)is_fake   )	polyfills	variables)create_call_functioncreate_instruction)raise_observed_exceptionunimplemented)GuardBuilderinstall_guard)is_from_local_source)cmp_name_to_op_mapping	dict_keysdict_valuesspecialize_symnode   )ValueMutationNewVariableTrackerConstantVariable)InstructionTranslatorc                 C   s   t | tjr|  s|  rdS t | tjr!|  jj	dd uS t | tj
r1tdd | jD S t | tjtjtjtjtjjtjtjtjjtjtjtjtjtjtjtjfS )NTexample_valuec                 s   s    | ]}t |V  qd S N)is_hashable.0e r   L/var/www/auris/lib/python3.10/site-packages/torch/_dynamo/variables/dicts.py	<genexpr>C   s    zis_hashable.<locals>.<genexpr>)
isinstancer   LazyVariableTrackeris_realizedr   TensorVariableas_proxynodemetagetTupleVariableallitemsBuiltinVariableZSymNodeVariabler   ZEnumVariableZuser_definedZUserDefinedClassVariableUserFunctionVariableZSkipFunctionVariablemiscZNumpyVariableNNModuleVariableUnspecializedNNModuleVariableZMethodWrapperVariableZTorchInGraphFunctionVariableZTypingVariableZFunctoolsPartialVariableWeakRefVariablexr   r   r    r   1   s<   
r   c                       s(  e Zd ZdhejZG dd dZefdeeef ddf fddZd	d
 Zdd Z	dd Z
dd Zdd ZdefddZdd Zdd Zdd Zdd Zdddefd d!Zdddefd"d#Zdefd$d%Zdefd&d'Zd(d) Zd*d+ Z	,	-	.	/		0d9 fd1d2Zd3d4 Zd5d6 Z fd7d8Z  ZS ):ConstDictVariableuser_clsc                   @   sL   e Zd ZdZdddZedd Zdd	 Zed
d Z	dd de
f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
        returnNc                 C   s2   t |}t|stdt| d|  || _d S )NzDict key of type z. Key: )r   r   r   typevt)selfr9   r   r   r    __init__h   s   
z+ConstDictVariable._HashableTracker.__init__c                    s   t | jtjr| j s| j r| j S t | jtjr(| j j	j
d }|S t | jtjrAtj t fdd| jjD }|S t | jtjrL| jjS t | jtjrW| jjS t | jtjrc| j S t | jtjrttj  | jjjS | j }|S )Nr   c                 3   s    | ]} |j V  qd S r   )underlying_valuer   Hashabler   r    r!   }       zFConstDictVariable._HashableTracker.underlying_value.<locals>.<genexpr>)r"   r9   r   r#   r$   r   original_valuer%   r&   r'   r(   r*   r5   _HashableTrackertupler,   r0   valuer1   r.   Zget_functionr2   Zreferent_vtr<   as_python_constant)r:   r4   r   r=   r    r<   q   s2   


z3ConstDictVariable._HashableTracker.underlying_valuec                 C   
   t | jS r   )hashr<   r:   r   r   r    __hash__   s   
z+ConstDictVariable._HashableTracker.__hash__c                    sh   t | t |kr
dS t| tr(tj t| t|ko't fddt| |D S t| r0| |u S | |kS )NFc                 3   s     | ]\}}  ||V  qd S r   )_eq_impl)r   uvr=   r   r    r!      s    
z>ConstDictVariable._HashableTracker._eq_impl.<locals>.<genexpr>)	r8   r"   rB   r5   rA   lenr+   zipr   )abr   r=   r    rI      s   
z+ConstDictVariable._HashableTracker._eq_implotherc                 C   sN   t j}t||st|sJ t|t||r || j|jS || j|S r   )r5   rA   r"   r   Z
is_literalr8   rI   r<   )r:   rP   r>   r   r   r    __eq__   s   
z)ConstDictVariable._HashableTracker.__eq__r7   N)__name__
__module____qualname____doc__r;   propertyr<   rH   staticmethodrI   boolrQ   r   r   r   r    rA   a   s    
	

rA   r,   r7   Nc                    s   d|v r	| d d|v r| d t jd	i | tj t fdd| D s-J  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 r   )r"   r   r   r4   rK   r=   r   r    r!      s    
z-ConstDictVariable.__init__.<locals>.<genexpr>c                    s   t |  r| S  | S r   )r"   )keyr=   r   r    make_hashable   s   z1ConstDictVariable.__init__.<locals>.make_hashablec                    s   i | ]	\}} ||qS r   r   r\   )r^   r   r    
<dictcomp>   s    z.ConstDictVariable.__init__.<locals>.<dictcomp>r   )popsuperr;   r5   rA   r+   r,   r   sourcer[   copyrZ   r6   )r:   r,   r6   kwargs	__class__)r>   r^   r    r;      s   



zConstDictVariable.__init__c                 C      dd | j   D S )Nc                 S       i | ]\}}|j  | qS r   r9   r&   r   krK   r   r   r    r_      s     z.ConstDictVariable.as_proxy.<locals>.<dictcomp>r,   rG   r   r   r    r&         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r9   
debug_reprrj   r   r   r    r!      s    
z/ConstDictVariable.debug_repr.<locals>.<genexpr>})joinr,   rG   r   r   r    rq      s   
zConstDictVariable.debug_reprc                 C   rg   )Nc                 S   rh   r   r9   rD   rj   r   r   r    r_          z8ConstDictVariable.as_python_constant.<locals>.<dictcomp>rl   rG   r   r   r    rD      s   z$ConstDictVariable.as_python_constantc                 C   s   |    dd | j D S )Nc                 S   s   i | ]
\}}|j  |qS r   rt   rj   r   r   r    r_      s    z=ConstDictVariable.keys_as_python_constant.<locals>.<dictcomp>)install_dict_keys_match_guardr,   rG   r   r   r    keys_as_python_constant      z)ConstDictVariable.keys_as_python_constantc                 C      | j S r   )r6   rG   r   r   r    python_type   s   zConstDictVariable.python_typec                 C   sB   t |tsJ tj}t|o ||| jv o t | j|| tj S r   )r"   r   r5   rA   r   r,   r   DeletedVariable)r:   r9   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{   r   r4   r   r   r    
<listcomp>   s    
z)ConstDictVariable.len.<locals>.<listcomp>)rL   r,   valuesrG   r   r   r    rL      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 r   )is_new_itemrZ   r)   r9   )r   r]   rC   rG   r   r    r!      s
    
z2ConstDictVariable.has_new_items.<locals>.<genexpr>)r[   anyr,   rG   r   rG   r    has_new_items   s
   zConstDictVariable.has_new_itemsc                 C   s<   |r|  r|  rt| t| kS t|t|kS r   )r$   idrealize)r:   rC   rP   r   r   r    r      s   zConstDictVariable.is_new_itemc                    s   | j tju r  fdd d}| j D ]!\}}| j|j}| ||s*| j	r7 |j  | |d7 }q| j tju rO 
td|dgtdd d S  td|d d S )Nc                            t dgS )NOrderedDict)extend_outputcreate_load_python_modulecollectionscreate_load_attrr   codegenr   r    <lambda>  
    z/ConstDictVariable.reconstruct.<locals>.<lambda>r   r   	BUILD_MAPargF)r6   r   r   add_push_nullr,   rZ   r)   r9   r   r[   r   r	   r   append_output)r:   r   num_argsr]   rC   itemr   r   r    reconstruct  s(   
	

zConstDictVariable.reconstructtxr   r   c                 C   s(   t |}|| jvrtt| | j| S r   )r5   rA   r,   r
   KeyErrorr:   r   r   r]   r   r   r    'getitem_const_raise_exception_if_absent%  s   



z9ConstDictVariable.getitem_const_raise_exception_if_absentc                 C   s.   t |}|| jvrtd|j  | j| S )Nzdict KeyError: )r5   rA   r,   r   rC   r   r   r   r    getitem_const-  s   


zConstDictVariable.getitem_constc                 C   s"   t |}|| jvrd S | j| S r   )r5   rA   r,   )r:   r   r]   r   r   r    maybe_getitem_const3  s   


z%ConstDictVariable.maybe_getitem_constc                 C   sX   || v sJ t |}t| j |}t| j | }t|tj	r*|
  d S d S r   )r5   rA   rB   r,   keysindexrZ   r"   r   r#   r   )r:   r   r]   r   Zoriginal_key_vtr   r   r    realize_key_vt9  s   
z ConstDictVariable.realize_key_vtc                 C   s   | j rt| tj d S d S r   )rb   r   
make_guardr   ZDICT_KEYS_MATCHrG   r   r   r    rv   B  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 r<t|d |r<t| t	j
tj|d j| d d S |d jrR|rL| |d  d S |   d S d S )Nr   r   r   )r]   invert) r   rb   outputside_effectsZis_modifiedr"   r   r   	functoolspartialr   ZDICT_CONTAINSrC   r   rv   )r:   r   argsr   containsr   r   r    install_dict_contains_guardF  s*   
	z-ConstDictVariable.install_dict_contains_guardr   list[VariableTracker]rd   dict[str, VariableTracker]r   c                    s  ddl m}m m tj|ot|d }|dkr;ttj	|g|R i |}|j
j|  | j|j  d S |dkrOt|dksGJ | ||d S |dkrx|sW|rYJ |   | jrj|j
j| j  fdd| j D S |d	kr|   | jr|j
j| j  |s|rJ t| S |d
kr|   | jr|j
j| j  |s|rJ t| S |dkr|   |s|rJ | j| j t d dS |dkr|s|rJ |    t| jS |dkr|r|  r|   |st|dksJ |j
j|  |d | j|d <  d S |dkrD|rD|  rD|   d| _|j
j|  | j|d   d S |dv rvt|dv rv|d | vrv| || t|dkrr|dkrnt t!|  d S |d S |dkr|r|  rd| _|j
j|  | j"|d S |dkrd| _|j
j|  | j#   d S |dkr |  r |   t|dk}t|dk}	|s|	r|j
j|  |rt$|d tr|d   |d }
n	|%|t|d }
| j|
j |	r fdd| D }| j|  d S t& '||||S |dv r4|d | v r4| (||d S |dkrQt|dkrQ| || |d | v } |S |dkr|r|  r|   |rgJ t|dkspJ | )|d }|d ur~|S t|dkr d }n|d }|j
j|  || j|d < |S |dkr|   |st|dksJ |j
j|  |d }| j| }| j"| || j|<  d S t& '||||S )Nr   )r-   r   r*   r   r;   __getitem__r,   c                    s   g | ]\}} |j |gqS r   r9   rj   )r*   r   r    r~     s    z1ConstDictVariable.call_method.<locals>.<listcomp>r   r   rc   )r,   Zmutation_typerb   __len____setitem__r   __delitem__T)r`   r)   )r   r   r`   clearupdatec                    s    i | ]\}}  ||qS r   )createrj   )r   r>   r   r    r_     ru   z1ConstDictVariable.call_method.<locals>.<dictcomp>)r)   __getattr__r|   
setdefaultmove_to_end)*r   r-   r   r*   r5   rA   r   r   dictZ	call_dictr   r   Zmutationr,   r   r   rL   r   rv   rb   Zguard_on_key_orderaddnameDictKeysVariableDictValuesVariableclonerc   r   
is_mutabler[   r   r   r
   r   r`   r   r"   Zcall_custom_dictra   call_methodr   r   )r:   r   r   r   rd   r-   Zarg_hashableZtemp_dict_vthas_argZ
has_kwargsZdict_vtr   rC   r4   r]   valre   )r   r>   r*   r    r   m  s   



&













zConstDictVariable.call_methodc                 C   s   |    dd | j D S )Nc                 S      g | ]}|j qS r   r   r}   r   r   r    r~         z9ConstDictVariable.unpack_var_sequence.<locals>.<listcomp>)rv   r,   r   r:   r   r   r   r    unpack_var_sequence  rx   z%ConstDictVariable.unpack_var_sequencec                 C   s@   | j tu r|| j jv rtdS tdS td| j  d d S )NTFzhasattr on z is not supported)r6   r   __dict__r   r   r   )r:   r   r   r   r   r    call_obj_hasattr	  s
   


z"ConstDictVariable.call_obj_hasattrc                    s   |    t jdi |S Nr   )rv   ra   r   )r:   rd   re   r   r    r     s   zConstDictVariable.cloner   r   rd   r   r7   r   )rS   rT   rU   r   Z_nonvar_fieldsrA   r   r;   r&   rq   rD   rw   rz   rY   r|   rL   r   r   r   r   r   r   r   rv   r   r   r   r   r   __classcell__r   r   re   r    r5   [   sV    K
"			!
	' 	r5   c                       sX   e Zd Zdeddf fddZdd Zdd	 Zd
ed dee	df ddfddZ
  ZS )MappingProxyVariabledv_dictr7   Nc                    s*   t  jdi | t|tsJ || _d S r   )ra   r;   r"   r5   r   r:   r   rd   re   r   r    r;     s   
zMappingProxyVariable.__init__c                 C   s   | j |S r   )r   r   r   r   r   r    r     s   z(MappingProxyVariable.unpack_var_sequencec                    s>   | j rtd   fdd  | j  tdd d S )NzgCan't reconstruct an existing mapping variable because the connection to the original dict will be lostc                      r   )NMappingProxyType)r   r   typesr   r   r   r   r    r   )  r   z2MappingProxyVariable.reconstruct.<locals>.<lambda>r   F)rb   r   r   r   r   r   r:   r   r   r   r    r   !  s   

z MappingProxyVariable.reconstructr   r   rd   c                 C   s,   | j r|jj rt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.)rb   r   r   Zhas_existing_dict_mutationr   r   r   r:   r   r   r   rd   r   r   r    r   3  s
   	z MappingProxyVariable.call_method)rS   rT   rU   r5   r;   r   r   listr   strr   r   r   r   re   r    r     s    
r   c                   @   s   e Zd Zdd Zdd ZdS )NNModuleHooksDictVariablec                 C      d S r   r   rG   r   r   r    rv   I     z7NNModuleHooksDictVariable.install_dict_keys_match_guardc                 C   r   r   r   r:   r   r   r   r   r    r   L  r   z5NNModuleHooksDictVariable.install_dict_contains_guardN)rS   rT   rU   rv   r   r   r   r   r    r   G  s    r   c                       s^   e Zd Zdd fddZ fddZ fddZed	d
 Z						d fddZ  Z	S )DefaultDictVariableNr7   c                    s.   t  j||fi | |tju sJ || _d S r   )ra   r;   r   defaultdictdefault_factory)r:   r,   r6   r   rd   re   r   r    r;   Q  s   
zDefaultDictVariable.__init__c                    s$   | j tttfvr| jsdS t  S )NF)r   r   rB   r   r,   ra   is_python_constantrG   re   r   r    r   V  s   
z&DefaultDictVariable.is_python_constantc                    s   d| j   dt   dS )Nzdefaultdict(ro   ))r   rq   ra   rG   re   r   r    rq   ]  s   zDefaultDictVariable.debug_reprc                 C   s,   t | tjr| jttttfv S t | tjj	S r   )
r"   r   r-   fnr   rB   r   setZ	functionsZBaseUserFunctionVariabler   r   r   r    is_supported_argb  s   z$DefaultDictVariable.is_supported_argr   r   rd   r   r   c                    s   |dkr=t |dksJ |d | v r| ||d S | jd u r&t|d  | j|g i }t |d|d |f| |S t ||||S )Nr   r   r   r   )rL   r   r   r   call_functionra   r   )r:   r   r   r   rd   Zdefault_varre   r   r    r   i  s   
zDefaultDictVariable.call_methodr   rR   r   )
rS   rT   rU   r;   r   rq   rX   r   r   r   r   r   re   r    r   P  s    
r   c                       s   e Zd ZdZdee ddf 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 Zdee deeef ddf fddZdddefddZdd  Zd!d" Z  ZS )#SetVariablez-We model a sets as dictonary with None valuesr,   r7   Nc                    s(   t |t }t j|fi | d S r   )r   fromkeysr   _default_valuera   r;   r:   r,   rd   re   r   r    r;     s   zSetVariable.__init__c                 C   ,   | j sdS dddd | j  D  d S )Nzset()rn   ,c                 s       | ]}|j  V  qd S r   rp   r   rk   r   r   r    r!     r?   z)SetVariable.debug_repr.<locals>.<genexpr>rr   r,   rs   r   rG   r   r   r    rq        "zSetVariable.debug_reprc                 C   s   t | j S r   )r   r,   r   rG   r   r   r    	set_items  s   zSetVariable.set_itemsc                   C   s
   t d S r   )r   r   r   r   r   r    r     s   
zSetVariable._default_valuec                 C      dd | j D S )Nc                 S      h | ]}|j  qS r   ri   r   r   r   r    	<setcomp>      z'SetVariable.as_proxy.<locals>.<setcomp>r   rG   r   r   r    r&        zSetVariable.as_proxyc                 C      t S r   )r   rG   r   r   r    rz     r   zSetVariable.python_typec                 C   r   )Nc                 S   r   r   rt   r   r   r   r    r     r   z1SetVariable.as_python_constant.<locals>.<setcomp>r   rG   r   r   r    rD     r   zSetVariable.as_python_constantc                 C   s2   | dd | jD  |tdt| jd d S )Nc                 S   r   r   r   r}   r   r   r    r~     r   z+SetVariable.reconstruct.<locals>.<listcomp>	BUILD_SETr   )foreachr   r   r	   rL   r   r   r   r    r     s   zSetVariable.reconstructr   rd   r   c                    sj  |dkr|rJ t |dksJ d}|d t f}n|dkr:|r$J |r(J | j j}t |||f| |S |dkrY|rBJ t |dksJJ t	t
j|| |d gi S |dkrx|raJ t |dksiJ t	t
j|| |d gi S |dkr|rJ t |dksJ t	t
j|| |d gi S |d	kr|rJ t |dksJ t	t
j|| |d gi S |d
krt |dkr|  r|rJ t |dksJ t	t
j|| |d gi S |dkr|rJ t |dksJ |d | vrtd t |d||S |dkr,|rJ t |dksJ |d | v r&t |d||S tjd dS t ||||S )Nr   r   r   r   r`   
isdisjointintersectionunion
differencer   removezkey does not existdiscard)rC   )rL   r   r   r   r`   r9   ra   r   r   r.   r   Zset_isdisjointr   Zset_intersectionZ	set_unionZset_differencer   Z
set_updater   r   r   )r:   r   r   r   rd   resultre   r   r    r     sx   


zSetVariable.call_methodr   r   r   c                 C   s   t d)NzIllegal to getitem on a set)RuntimeError)r:   r   r   r   r   r    r     s   zSetVariable.getitem_constc                 C   r   r   r   rG   r   r   r    rv        z)SetVariable.install_dict_keys_match_guardc                 C   r   r   r   r   r   r   r    r     r   z'SetVariable.install_dict_contains_guard)rS   rT   rU   rV   r   r   r;   rq   rW   r   rX   r   r&   rz   rD   r   r   r   r   r   rv   r   r   r   r   re   r    r     s4    


Ar   c                       s|   e Zd Zdee ddf fddZdd Zedd	 Zd
d Z	dd Z
dd Zdee deeef ddf fddZ  ZS )FrozensetVariabler,   r7   Nc                       t  j|fi | d S r   ra   r;   r   re   r   r    r;        zFrozensetVariable.__init__c                 C   r   )Nzfrozenset()rn   r   c                 s   r   r   rp   r   r   r   r    r!     r?   z/FrozensetVariable.debug_repr.<locals>.<genexpr>rr   r   rG   r   r   r    rq     r   zFrozensetVariable.debug_reprc                 C   s
   | j  S r   )r,   r   rG   r   r   r    r        
zFrozensetVariable.set_itemsc                 C   r   r   )	frozensetrG   r   r   r    rz     r   zFrozensetVariable.python_typec                 C   r   )Nc                 S   r   r   rt   r   r   r   r    r     r   z7FrozensetVariable.as_python_constant.<locals>.<setcomp>r   rG   r   r   r    rD     r   z$FrozensetVariable.as_python_constantc                    s<     dd | jD    fdd  tdd d S )Nc                 S   r   r   r   r}   r   r   r    r~     r   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   rd   r   c                    *   |dv rt d| dt ||||S )Nr   r`   r   r   r   r   Illegal call_method z on a frozensetr   ra   r   r   re   r   r    r        zFrozensetVariable.call_method)rS   rT   rU   r   r   r;   rq   rW   r   rz   rD   r   r   r   r   r   r   r   re   r    r     s&    

r   c                       st   e Zd Zdee ddf fddZdd Zedd	 Zd
d Z	dd Z
dee deeef ddf fddZ  ZS )DictKeySetVariabler,   r7   Nc                    r   r   r   r   re   r   r    r;   )  r   zDictKeySetVariable.__init__c                 C   r   )Nzdict_keys([])zdict_keys([r   c                 s   r   r   rp   r   r   r   r    r!   6  r?   z0DictKeySetVariable.debug_repr.<locals>.<genexpr>z])r   rG   r   r   r    rq   0  s   zDictKeySetVariable.debug_reprc                 C   ry   r   rl   rG   r   r   r    r   :  s   zDictKeySetVariable.set_itemsc                 C   r   r   r   rG   r   r   r    rz   >  r   zDictKeySetVariable.python_typec                 C   s   t dd | jD d  S )Nc                 S   r   r   rt   r   r   r   r    r   C  r   z8DictKeySetVariable.as_python_constant.<locals>.<setcomp>)r   r   r   r   rG   r   r   r    rD   A  s
   z%DictKeySetVariable.as_python_constantr   rd   r   c                    r  )Nr  r  z on a dict_keysr  r   re   r   r    r   F  r  zDictKeySetVariable.call_method)rS   rT   rU   r   r   r;   rq   rW   r   rz   rD   r   r   r   r   r   r   re   r    r  (  s$    


r  c                       s   e Zd ZU dZdZee ed< deddf fddZ	e
dd	 Ze
d
d Zdd Zdd Zded deedf ddf fddZ  ZS )DictViewVariablezu
    Models _PyDictViewObject

    This is an "abstract" class. Subclasses will override kv and the items method
    Nkvr   r7   c                    s8   t  jdi | | jdv sJ t|tsJ || _d S )N)r   r   r   )ra   r;   r  r"   r5   r   r   re   r   r    r;   [  s   
zDictViewVariable.__init__c                 C   s   t | jj| j S r   )getattrr   r,   r  rG   r   r   r    
view_itemsa  s   zDictViewVariable.view_itemsc                 C   s   t r   )NotImplementedErrorrG   r   r   r    view_items_vte  s   zDictViewVariable.view_items_vtc                    s     fddfdd j D S )Nc                    s    j dkr| jS | S )Nr   )r  r9   r3   rG   r   r    unwrapl  rm   z4DictViewVariable.unpack_var_sequence.<locals>.unwrapc                    s   g | ]} |qS r   r   r}   )r  r   r    r~   o  s    z8DictViewVariable.unpack_var_sequence.<locals>.<listcomp>r  r   r   )r:   r  r    r   k  s   z$DictViewVariable.unpack_var_sequencec                 C   s$   || j  || j |d d S )Nr   )r   Zload_methodr  r   r   r   r   r    r   q  s   
zDictViewVariable.reconstructr   r   rd   c                    s,   |dkr| j ||||S t ||||S )Nr   )r   r   ra   r   re   r   r    r   v  s   zDictViewVariable.call_method)rS   rT   rU   rV   r  r   r   __annotations__r5   r;   rW   r  r  r   r   r   r   r   r   r   r   re   r    r
  R  s"   
 


r
  c                       sZ   e Zd ZdZedd Zedd Zdd Zded	 d
e	e
d	f dd	f fddZ  ZS )r   r   c                 C   rE   r   )r   r  rG   r   r   r    r     r  zDictKeysVariable.set_itemsc                 C   r   )Nc                 S   r   r   r   r}   r   r   r    r~     r   z2DictKeysVariable.view_items_vt.<locals>.<listcomp>r  rG   r   r   r    r    s   zDictKeysVariable.view_items_vtc                 C   r   r   r	  rG   r   r   r    rz     r   zDictKeysVariable.python_typer   r   rd   r7   c                    sl   |dkr| j ||||S |tv r-t|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   ra   r   re   r   r    r     s   
zDictKeysVariable.call_method)rS   rT   rU   r  rW   r   r  rz   r   r   r   r   r   r   r   re   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   rE   r   )r   r  rG   r   r   r    r    r  z DictValuesVariable.view_items_vtc                 C   r   r   )r   rG   r   r   r    rz     r   zDictValuesVariable.python_typeN)rS   rT   rU   r  rW   r  rz   r   r   r   r    r     s
    
r   ).rV   r   r   r   typingr   r   Ztorch._subclasses.fake_tensorr   r   r   r   Zbytecode_transformationr   r	   excr
   r   Zguardsr   r   rb   r   utilsr   r   r   r   baser   r   Zconstantr   Ztorch._dynamo.symbolic_convertr   r   r5   r   r   r   r   r   r  r
  r   r   r   r   r   r    <module>   s<   *   ?0	5t/*0!