o
    j9:jr                     @   sT  d Z ddlZddlZddlmZmZ ddlmZ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 dd
lmZmZ ddlmZmZmZ ddlmZ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' e	rddl(m)Z) 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.Z0G dd de.Z1G dd de.Z2dS )a  
Set-related variable tracking classes for PyTorch Dynamo.

This module implements variable tracking for different types of set-like objects:
- Regular Python sets (set)
- Frozen sets (frozenset)
- Ordered sets (torch.utils._ordered_set.OrderedSet)
- Dictionary key sets (dict_keys views used as sets)

These classes are responsible for tracking set operations during graph compilation,
maintaining proper guards for set mutations and element existence checks.

The implementation uses a special HashableTracker wrapper to handle set elements
while preserving proper aliasing semantics. Sets are modeled internally as
dictionaries with None values.
    N)IterableSequence)AnyLiteralTYPE_CHECKING
OrderedSet   )	polyfills	variables)create_call_functioncreate_instruction)raise_observed_exception)GuardBuilderinstall_guard)
AttrSourceis_constant_sourceis_from_local_source)cmp_name_to_op_mappingistyperaise_args_mismatch   )ValueMutationNewVariableTracker)ConstantVariable)HashableTrackeris_hashableraise_unhashable)	PyCodegen)InstructionTranslator)BuiltinVariablec                
       s  e Zd ZdZeZejZej	Z
deeeB  deddf fddZdefdd	Zeded
 fddZedefddZdefddZdefddZdefddZdAddZde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 d$d%de!e fd&d'Z"dedef fd(d)Z#defd*d+Z$d$d%d,ef fd-d.Z%d$d%d,ede&fd/d0Z'd$d%d1e!e ddfd2d3Z(d$d%d4ed1e!e de)eef def
d5d6Z*d$d%d,ed1e!e de)eef def
 fd7d8Z+dBd:d;Z,d$d%d<edefd=d>Z-d$d%defd?d@Z.  Z/S )CSetVariablez2Represents a Python set during symbolic execution.itemskwargsreturnNc                    s   d|v r	| d d|v r| d t jdi | g }|D ]}t|tr,|| q|t|  qt|t	
 | _| jrHt| j nd| _t|t	
 | _d S )Noriginal_itemsshould_reconstruct_allT )popsuper__init__
isinstancer   appendrealizedictfromkeysr!   _default_valuer"   sourcer   r&   r%   )selfr"   r#   hashable_itemsitem	__class__r'   c/home/nk/hobo-godmode/plappi-mvp/.venv/lib/python3.10/site-packages/torch/_dynamo/variables/sets.pyr*   7   s    



zSetVariable.__init__c                 C   sf   | j sdS g }| j D ]}t|tr|jn|}t|dr t|jn| }|| q
dd	| d S )Nzset()value{,})
r"   r+   r   vthasattrreprr8   
debug_reprr,   join)r2   r"   vr<   val_strr'   r'   r7   r?   X   s   
zSetVariable.debug_reprr   c                 C      t | j S Nsetr"   keysr2   r'   r'   r7   	set_itemsc      zSetVariable.set_itemsc                   C   s
   t d S rD   )r   creater'   r'   r'   r7   r0   g   s   
zSetVariable._default_valuec                 C      dd | j D S )Nc                 S      h | ]}|j  qS r'   )r<   as_proxy.0kr'   r'   r7   	<setcomp>m       z'SetVariable.as_proxy.<locals>.<setcomp>rI   rH   r'   r'   r7   rN   l      zSetVariable.as_proxyc                 C      t S rD   )rF   rH   r'   r'   r7   python_typeo      zSetVariable.python_typec                 C   rL   )Nc                 S   rM   r'   r<   as_python_constantrO   r'   r'   r7   rR   s   rS   z1SetVariable.as_python_constant.<locals>.<setcomp>rT   rH   r'   r'   r7   rZ   r   rU   zSetVariable.as_python_constantcodegenr   c                 C   s2   | dd | jD  |tdt| jd d S )Nc                 S      g | ]}|j qS r'   r<   rP   xr'   r'   r7   
<listcomp>v       z+SetVariable.reconstruct.<locals>.<listcomp>	BUILD_SETarg)foreachrI   append_outputr   lenr2   r[   r'   r'   r7   reconstructu   s   zSetVariable.reconstructr<   c                 C   s@   t |tsJ t|sdS t|}|| jv ot | j| tj S NF)r+   r   r   r   r"   r   DeletedVariable)r2   r<   keyr'   r'   r7   __contains__y   s   zSetVariable.__contains__c                 C   s   t dd | j D S )Nc                 s   s    | ]
}t |tj V  qd S rD   )r+   r   rk   r^   r'   r'   r7   	<genexpr>   s    
z"SetVariable.len.<locals>.<genexpr>)sumr"   valuesrH   r'   r'   r7   rg      s   zSetVariable.lenc                    s"    j pt fdd j D S )Nc                 3   s*    | ]\}}   j|j|V  qd S rD   )is_new_itemr%   getr<   )rP   rl   r8   rH   r'   r7   rn      s
    
z,SetVariable.has_new_items.<locals>.<genexpr>)r&   anyr"   rH   r'   rH   r7   has_new_items   s   zSetVariable.has_new_itemsr8   otherc                 C   s<   |r|  r|  rt| t| kS t|t|kS rD   )is_realizedidr-   )r2   r8   ru   r'   r'   r7   rq      s   zSetVariable.is_new_itemtxr   c                 C   rL   )Nc                 S   r\   r'   r]   r^   r'   r'   r7   r`      ra   z3SetVariable.unpack_var_sequence.<locals>.<listcomp>r"   r2   rx   r'   r'   r7   unpack_var_sequence   rU   zSetVariable.unpack_var_sequencec                    s   t  jdi |S Nr'   )r)   cloner2   r#   r5   r'   r7   r}         zSetVariable.clonec                 C      dS rj   r'   rH   r'   r'   r7   is_python_hashable   rX   zSetVariable.is_python_hashablenamec                    s&   |dkrt ||  S t ||S )Nr6   )r   buildrW   r)   var_getattrr2   rx   r   r5   r'   r7   r      s   zSetVariable.var_getattrc                 C   s   t |tt|S rD   )r   r   r=   rF   r   r'   r'   r7   call_obj_hasattr   s   zSetVariable.call_obj_hasattrargsc                 C   s   | j sd S |jj| rd S |d | v }|d j d u r?|d  rA|r(t| jnt| j}t| 	t
j||d  d d S d S d S )Nr   )rl   )r1   outputside_effectsis_modifiedis_python_constanttypeCONTAINS_GUARDNOT_CONTAINS_GUARDr   
make_guard	functoolspartialrZ   )r2   rx   r   containsguard_fnr'   r'   r7   install_set_contains_guard   s"   
z&SetVariable.install_set_contains_guardfnc              
   C   sz   z|dd | g|D i dd |  D }W n ty6 } ztt||t|jd W Y d }~nd }~ww t||S )Nc                 S   s   g | ]}|  qS r'   rZ   r^   r'   r'   r7   r`      s    z0SetVariable._fast_set_method.<locals>.<listcomp>c                 S   s   i | ]	\}}||  qS r'   r   )rP   rQ   rA   r'   r'   r7   
<dictcomp>   s    z0SetVariable._fast_set_method.<locals>.<dictcomp>r   )r"   	Exceptionr   r   listr   r   r   )r2   rx   r   r   r#   resexcr'   r'   r7   _fast_set_method   s   
$zSetVariable._fast_set_methodc              
      s
  ddl m} ddlm} |dv r*|||r*|  tu r*|  }| |t||||S ddlm	}m
}	 |dkr^||tj|g|R i |}
|jj|  | j  | j|
j td S |dkr|sjt|dkr{t||d	t| d
t| d t|d st|d | |jj|  t | jt|d < td S |dkr|s|rt||dt| d
t| d z| j j}W n ty } ztt|t |j!d W Y d }~nd }~ww d| _"|jj|  | jt| |S |dkr |st|dkrt||d	t| d
t| d ||t#j$%|| |d gi S |dkrG|r4t||dt| d ||t#j&%|| g|d| ' iS |dkrj|r[t||dt| d ||t#j(%|| g|i S |dkr|r~t||dt| d ||t#j)%|| g|d| ' iS |dkr|rt||dt| d ||t#j*%|| g|d| ' iS |dkr|rt||dt| d ||t#j+%|| g|i S |dkr|st|dkrt||d	t| d
t| d ||t#j,%|| g|d| ' iS |dkr=|st|dkr.t||d	t| d
t| d ||t#j-%|| g|i S |dkre| . re|rVt||dt| d ||t#j/%|| g|i S |dkr|stt|dkrt||d	t| d
t| d |d | vrtt||d d| _"|jj|  | jt|d  td S |dkr|st|dkrt||d	t| d
t| d |d | v rd| _"|jj|  | jt|d  td S |dv r3t|dkrt||d t| d! t0j1t0j2d}|d 3 }t4|ts#||t%||gi }|||5|%|| |gi S |d"v rvddddd"5|}t6|d tt7j8||	fsgtt9|d#| d$| :  d%|d :  d&gd |d usnJ | ;||||S |d'v rd(d)d*d+d'5|}t6|d tt7j8||	fstt9|d#| d$|d :  d%| :  d&gd |d usJ |d ;||| g|S |d,v rt6|d tt7j8||	fstt9|d#| d$| :  d%|d :  d&gd ddddd,5|}|d usJ | ;|||| | S |d-kr+t6|d tt7j8||	fstd.S | ;|d||}t<=|t|jdkS |d/kr@| ;|d-||}t<=||j> S |t?v rgt6|d tt7j8||	fsXt<=|t@S t<=|t?| | j|d jS |d0krt|st||d1t| d
t| d |rt|d st|d | | A|| |d | v }t<=||S |d2kr|s|rt||dt| d
t| d t<=|t| jS |d3kr|s|rt||dt| d
t| d | jB| jC tD d d4S |d5kr"|s|rt||dt| d
t| d d| _"|jj|  | j  td S |d6krIdd7lEmF} | jGr?tH| jGs?|jjIJ| jG || K|tD d8S tL ;||||S )9Nr	   )check_constant_argsr   )SourcelessBuilder)
isdisjointunionintersection
differencesymmetric_difference)DictItemsVariableDictKeysVariabler*   addz1 args and 0 kwargs
 args and  kwargsr   r(   z0 args and 0 kwargsr   Tr   r   z0 kwargsclsintersection_updater   r   zExpect: 0 kwargs, Actual: difference_updater   symmetric_difference_updateupdateremovediscard)issubset
issupersetz1 argsz args)__and____or____xor____sub__z unsupported operand type(s) for z: 'z' and '')__rand____ror____rxor____rsub__r   r   r   r   )__iand____ior____ixor____isub____eq__F__ne__rm   zmore than 1 args and 0 kwargs__len__copy)r"   mutation_typer1   clear__iter__)ListIteratorVariabler   )Mutilsr   builderr   rW   rF   r   getattrdictsr   r   rK   call_setr   r   mutationr"   r   r   r   rg   r   r   r   r!   r0   r   rI   r(   r<   KeyErrorr   r   r   r&   r
   set_isdisjointcall_functionset_intersectionpython_type_varset_intersection_update	set_unionset_differenceset_difference_updateset_symmetric_differenceset_symmetric_difference_update
is_mutable
set_updateoperatorleger-   r   rr   r+   r   UserDefinedSetVariable	TypeErrorpython_type_namecall_methodr   r   r8   r   NotImplementedr   r}   r   r   listsr   r1   r   guard_on_key_orderr   r{   r)   )r2   rx   r   r   r#   r   r   py_typer   r   temp_set_vtresulteopru   mr	eq_resultr   r   r5   r'   r7   r      s  	


 


















	"
	"
	"

	

	







zSetVariable.call_methodr    c                 C   
   t tS rD   )r   r    rF   rH   r'   r'   r7   r   /     
zSetVariable.python_type_varrd   c                 C   s   t d)NzIllegal to getitem on a set)RuntimeError)r2   rx   rd   r'   r'   r7   getitem_const2  s   zSetVariable.getitem_constc                 C   s   t |t| jS rD   )r   r   rg   rI   rz   r'   r'   r7   	sq_length7  r   zSetVariable.sq_lengthr[   r   r$   Nr$   r    )0__name__
__module____qualname____doc__rF   _cpython_typer   SET_CONTAINSr   SET_NOT_CONTAINSr   r   r   r   r   r*   strr?   propertyrI   staticmethodr0   rN   r   rW   rZ   ri   boolrm   intrg   rt   rq   r   r{   r}   r   r   r   r   r   r.   r   r   r   r   r   __classcell__r'   r'   r5   r7   r!   .   s    
!
	





  
c
r!   c                
       s   e Zd Zdeddf fddZdee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e	 deee	f ddfddZ  ZS )OrderedSetClassVariabler#   r$   Nc                    s   t  jdi | d S r|   )r)   r*   r~   r5   r'   r7   r*   <  s   z OrderedSetClassVariable.__init__c                 C   rV   rD   r   rH   r'   r'   r7   rZ   ?  rX   z*OrderedSetClassVariable.as_python_constantrx   r   r   c                    sT   |dkr#ddl m} | jrt| j|}nd }|| |ttt||dS t ||S )N__new__r   )GetAttrVariable)r   r1   )	miscr  r1   r   r   r   r   r)   r   )r2   rx   r   r  attr_sourcer5   r'   r7   r   B  s   z#OrderedSetClassVariable.var_getattrr   c                    s   ddl m} |dkr+t|dks|r#t||dt| dt| d tjg t dS tt|}||v rJt	|d	 tj
rJ|d	 |||dd  |S t ||||S )
Nr   )set_methodsr  r	   z'OrderedSet.__new__ only accepts one argr   r   r   r   )builtinr  rg   r   r   OrderedSetVariabler   r   rF   r+   r!   r   r)   )r2   rx   r   r   r#   r  resolved_fnr5   r'   r7   r   P  s"   
z#OrderedSetClassVariable.call_methodr	  c                 C   sb   t |dks|rt|ddt | dt | d t |dkr"g }n|d |}tj|t dS )Nr   r   zOrderedSet only accepts one argr   r   r   r   )rg   r   force_unpack_var_sequencer   r	  r   )r2   rx   r   r#   r"   r'   r'   r7   r   j  s   z%OrderedSetClassVariable.call_function)r   r   r   r   r*   r   r   rZ   r   r   r   r   r.   r   r   r   r  r'   r'   r5   r7   r  ;  s0    

r  c                   @   sZ   e Zd ZdefddZdee fddZdeee  fddZ	de
fdd	ZdddZdS )r	  r$   c                 C   X   | j sdS g }| j D ]}t|jdrt|jjn|j }|| q
dd| d S )NzOrderedSet([])r8   zOrderedSet([r:   ])r"   r=   r<   r>   r8   r?   r,   r@   r2   r"   rQ   key_strr'   r'   r7   r?        
 zOrderedSetVariable.debug_reprc                 C      t dd | jD S )Nc                 S   s   g | ]}|j  qS r'   rY   rO   r'   r'   r7   r`     rS   z9OrderedSetVariable.as_python_constant.<locals>.<listcomp>)r   rI   rH   r'   r'   r7   rZ        z%OrderedSetVariable.as_python_constantc                 C   rV   rD   r   rH   r'   r'   r7   rW     rX   zOrderedSetVariable.python_typec                 C   s   t  S rD   )r  rH   r'   r'   r7   r     s   z"OrderedSetVariable.python_type_varr[   r   Nc                    sT      fdd  dd | jD   tdt| jd  tdd d S )	Nc                      s     ddS )Nztorch.utils._ordered_setr   )load_import_fromr'   r[   r'   r7   <lambda>  s    z0OrderedSetVariable.reconstruct.<locals>.<lambda>c                 S   r\   r'   r]   r^   r'   r'   r7   r`     ra   z2OrderedSetVariable.reconstruct.<locals>.<listcomp>
BUILD_LISTrc   r   F)add_push_nullre   rI   rf   r   rg   extend_outputr   rh   r'   r  r7   ri     s   
zOrderedSetVariable.reconstructr   )r   r   r   r   r?   r   r   rZ   r   rW   r  r   ri   r'   r'   r'   r7   r	    s    r	  c                
       s   e Zd ZeZdefddZeded fddZ	de
fddZd"d
dZdefddZd#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defddZdedefd d!Z  ZS )$FrozensetVariabler$   c                 C   r  )Nzfrozenset()r8   r9   r:   r;   r  r  r'   r'   r7   r?     r  zFrozensetVariable.debug_reprr   c                 C   rC   rD   rE   rH   r'   r'   r7   rI     rJ   zFrozensetVariable.set_itemsc                 C   rV   rD   )	frozensetrH   r'   r'   r7   rW     rX   zFrozensetVariable.python_typer    c                 C   r   rD   )r   r    r  rH   r'   r'   r7   r     r   z!FrozensetVariable.python_type_varc                 C   r  )Nc                 S   rM   r'   rY   rO   r'   r'   r7   rR     rS   z7FrozensetVariable.as_python_constant.<locals>.<setcomp>)r  rI   rH   r'   r'   r7   rZ     r  z$FrozensetVariable.as_python_constantr[   r   Nc                    sP      fdd  dd | jD   tdt| jdgtdd d S )	Nc                      s      dgS )Nr  )r  create_load_globalr'   r  r'   r7   r    s    z/FrozensetVariable.reconstruct.<locals>.<lambda>c                 S   r\   r'   r]   r^   r'   r'   r7   r`     ra   z1FrozensetVariable.reconstruct.<locals>.<listcomp>r  rc   r   F)r  re   rI   r  r   rg   r   rh   r'   r  r7   ri     s   
zFrozensetVariable.reconstructrx   r   r   r   r#   c                    s`   |dv rt d| d|dkrtd S |dv r't ||||}t|jS t ||||S )Nr   r(   r   r   r   r   Illegal call_method z on a frozensetr*   )r   r   r   r   )r   r   rK   r)   r   r  r"   )r2   rx   r   r   r#   r   r5   r'   r7   r     s   

zFrozensetVariable.call_methodTc                 C   r   )zB
        Frozensets are immutable and hashable in Python.
        Tr'   rH   r'   r'   r7   r        z$FrozensetVariable.is_python_hashablec                 C   s   t |  S rD   )hashrZ   rH   r'   r'   r7   get_python_hash  s   z!FrozensetVariable.get_python_hashru   c                 C   s   t |to|  | kS rD   )r+   r   rZ   )r2   ru   r'   r'   r7   is_python_equal  s   
z!FrozensetVariable.is_python_equalr   r   )r   r   r   r  r   r   r?   r   rF   rI   r   rW   r   r   rZ   ri   r   r   r.   r   r   r   r   r!  objectr   r"  r  r'   r'   r5   r7   r    s.    


r  c                
       s   e Zd ZdefddZdddee ddfdd	Zed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 )DictKeySetVariabler$   c                 C   r  )Nzdict_keys([])r8   zdict_keys([r:   r  r  r  r'   r'   r7   r?     r  zDictKeySetVariable.debug_reprrx   r   r   Nc                 C   s   d S rD   r'   )r2   rx   r   r'   r'   r7   r      r  z-DictKeySetVariable.install_set_contains_guardc                 C   s   | j S rD   ry   rH   r'   r'   r7   rI     s   zDictKeySetVariable.set_itemsc                 C   s   ddl m} |S )Nr	   )	dict_keys)r   r%  )r2   r%  r'   r'   r7   rW   
  s   zDictKeySetVariable.python_typec                 C   s   t dd | jD d  S )Nc                 S   rM   r'   rY   rO   r'   r'   r7   rR     rS   z8DictKeySetVariable.as_python_constant.<locals>.<setcomp>)r.   r/   rI   rG   rH   r'   r'   r7   rZ     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   r)   r   )r2   rx   r   r   r#   r5   r'   r7   r     s   zDictKeySetVariable.call_method)r   r   r   r   r?   r   r   r   r   r   rI   r   rW   rZ   r.   r   r  r'   r'   r5   r7   r$    s0    

r$  )3r   r   r   collections.abcr   r   typingr   r   r   torch.utils._ordered_setr    r
   r   bytecode_transformationr   r   r   r   guardsr   r   r1   r   r   r   r   r   r   r   baser   r   constantr   hashabler   r   r   torch._dynamo.codegenr   torch._dynamo.symbolic_convertr   torch._dynamo.variables.builtinr    r!   r  r	  r  r$  r'   r'   r'   r7   <module>   s8        E S