o
    ei                    @   s  U 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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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 ddlZddlmZmZ ddlmZ ddl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)m*Z*m+Z+m,Z,m-Z-m.Z. d
dl/m0Z0m1Z1 d
dl2m3Z3 d
dl4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z: d
dl;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZN ddlOmPZPmQZQmRZR ddlSmTZTmUZUmVZV ddlWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^m_Z_ ddl`maZambZbmcZcmdZdmeZemfZfmgZg ddlhmiZimjZj ddlkmlZlmmZmmnZnmoZompZp ddlqmrZrmsZsmtZtmuZu er@ddlvmwZw ddlxmyZy eze{Z|ej}ej~ejejejejejejejejejejejejejejejejejejejejejejejejiZede
je
jgeRdB f ZeeeR eeeR df f Zeje%jeje%jeje%jeje%jeje%jeje%jiZejejejejejejej~ejejejejejejejejejejejejejej}ejfZejejejejejejfZejfZejejejejejfZejejejejejfZi aeedef edef f ed< i aeedef edef f ed< d'd d!ZG d"d# d#eRZejd$dde
jd fd%d&ZdS )(a\  
Built-in function and type variable tracking for TorchDynamo's symbolic execution.

This module contains variable tracker classes for Python built-in functions, types,
and operations during graph compilation. It handles symbolic execution of:

- Built-in functions (len, getattr, isinstance, etc.)
- Type constructors (int, float, str, list, dict, etc.)
- Built-in operators and methods
- Special Python constructs (super, hasattr, etc.)

Key classes:
- BuiltinVariable: Tracks built-in functions and handles their execution
- TypeVariable: Manages type constructor calls and type checking
- SuperVariable: Handles super() calls in class hierarchies

These variable trackers ensure that built-in Python operations are correctly
handled during symbolic execution, either by executing them directly when safe
or by creating appropriate graph nodes when needed.
    N)defaultdictOrderedDict)CallableIterableKeysViewSequence)AnycastLiteralTYPE_CHECKINGUnion)	sym_floatsym_int)is_sparse_any)BaseTorchFunctionMode)is_traceable_wrapper_subclass   )configgraph_break_hints	polyfills	variables)ObservedAttributeErrorObservedUserStopIterationraise_observed_exceptionunimplementedUnsupported	UserErrorUserErrorType)GuardBuilderinstall_guard)DummyModule)
AttrSourceGetItemSourceGlobalSourceis_constant_sourceSource
TypeSource)check_constant_argscheck_numpy_ndarray_argscheck_unspec_or_constant_argscheck_unspec_python_argscmp_name_to_op_mappingdict_methodsextract_fake_example_valuefrozenset_methodsget_fake_valueguard_if_dynis_tensor_getset_descriptoris_wrapper_or_member_descriptoristypenumpy_operator_wrapperproxy_args_kwargsraise_args_mismatchset_methodsstr_methodstensortype_to_dtype   )#AsPythonConstantNotImplementedErrorValueMutationNewVariableTracker)CONSTANT_VARIABLE_NONEConstantVariableEnumVariable)ConstDictVariableDefaultDictVariableDictKeysVariableDictViewVariableFrozensetVariableis_hashableOrderedSetClassVariableSetVariable)BaseListVariableListIteratorVariableListVariableRangeVariableSizeVariableTupleIteratorVariableTupleVariable)EventVariableStreamVariable)FakeItemVariablesupported_comparison_opsSymNodeVariableTensorVariableUnspecializedPythonVariable)MutableMappingVariableUserDefinedDictVariableUserDefinedObjectVariableUserDefinedVariable)	PyCodegen)InstructionTranslatorr\   .BUILTIN_TO_TENSOR_FN_MAPBUILTIN_TO_TENSOR_RFN_MAPreturnc                     s  t tdkrd S d G fdddt} td tdtjdtjdtjdtjd|    fddtffddtf fd	dtffd
dt	ffddt
fg}|D ]\}}|D ]}|| d usmJ t|< qaq[fddtffddt	ffddt
fg}tjtjtjh}|D ]"\}}|D ]}||v rq|| d usJ t| krt|< qqW d    d S 1 sw   Y  d S )Nr   c                       sP   e Zd ZdZ		ddedef dedee deeef dB d	ef
 fd
dZ	dS )z8populate_builtin_to_tensor_fn_map.<locals>.GetMethodModez
        Mode to extract the correct methods from torch function invocations
        (Used to get the correct torch.Tensor methods from builtins)
         Nfunc.typesargskwargsr_   c                    s   |pi }| ||i |S Nr`   )selfra   rb   rc   rd   most_recent_funcr`   i/var/www/addictedbytheproject.nl/epg/venv/lib/python3.10/site-packages/torch/_dynamo/variables/builtin.py__torch_function__   s   zKpopulate_builtin_to_tensor_fn_map.<locals>.GetMethodMode.__torch_function__)r`   N)
__name__
__module____qualname____doc__r   r   r   dictstrrj   r`   rg   r`   ri   GetMethodMode   s    	
rq   r:   )dtypec                       |  S re   r`   o)inp0r`   ri   <lambda>       z3populate_builtin_to_tensor_fn_map.<locals>.<lambda>c                    rs   re   r`   rt   inp0_intr`   ri   rw      rx   c                    
   |  S re   r`   rt   )rv   inp1r`   ri   rw         
 c                    r{   re   r`   rt   )rz   inp1_intr`   ri   rw      r}   c                    s
   |  dS Nr   r`   rt   ry   r`   ri   rw     r}   c                    
   | d S Nr:   r`   rt   )r|   r`   ri   rw     r}   c                    r   r   r`   rt   )r~   r`   ri   rw     r}   c                    r   r   r`   rt   ry   r`   ri   rw     r}   )lenr]   r   torchonesint32un_ops
un_int_opsbin_opsbin_int_opstensor_and_int_opsoperatormatmulimatmulgetitemr^   )rq   setups_and_oplistssetup_fnop_listoprsetups_and_oplistsrskipsr`   )rv   rz   r|   r~   rh   ri   !populate_builtin_to_tensor_fn_map   sP   



	"r   c                       s:
  e Zd ZU dZe ZdhejZede	de
dd fddZeejdeede	f  fd	d
ZdefddZeejdeede	f  fddZeejdeedef eee edef f f fddZeejdeedef eeeee ef ef  f fddZedede	f dee dedee dB fddZdefddZde	de	ddf fddZ defddZ!de	fd d!Z"de	f fd"d#Z#dd&d'Z$d(ededefd)d*Z%d(edefd+d,Z&d-ee defd.d/Z'd(ededefd0d1Z(ed(e)e deeef deee	 eee	f f fd2d3Z*d(e)e deeef defd4d5Z+edede	f d-ee d6eded7eedf eeef gedB f fd8d9Z,d:d7d(e	defd;d<Z-d:d7d(e)e deeef dedB fd=d>Z.i Z/eeedf ed7e)e eeef gef f e0d?< d:d7d(e)e deeef defd@dAZ1d:d7dBed(ee deeef def
 fdCdDZ2d:d7dEededB fdFdGZ3e3Z4e3Z5d:d7dEededB fdHdIZ6d:d7dEededB fdJdKZ7d:d7dEededB fdLdMZ8d:d7d(ededB fdNdOZ9d:d7dPe)e defdQdRZ:d:d7dSedB dTedB dedB fdUdVZ;e9Z<e9Z=d:d7dEedefdWdXZ>d:d7dEedefdYdZZ?d:d7dEedefd[d\Z@d:d7dEed(ededef
d]d^ZAd:d7d(ededB fd_d`ZBd(ededefdadbZCd:d7d(edefdcddZDd:d7d(e	de	defdedfZE	dd:d7dgedB d(edededB f
dhdiZFd:d7dged(ededef
djdkZG	dd:d7dgedB d(edededB f
dldmZHd:d7dged(ededef
dndoZIeHZJeHZKd:d7dEededB fdpdqZLdre	d(edededB fdsdtZMd:d7dEededB fdudvZNd:d7d(ededefdwdxZOed:d7dyed(ededef
dzd{ZPed:d7dyed(ededef
d|d}ZQd:d7d(ededefd~dZRd:d7d(ededefddZSd:d7d(ededefddZTd:d7d(ededefddZUd:d7d(ededefddZVd:d7dEededefddZWd:d7dededefddZXd:d7dSedTedefddZYd:d7d(edefddZZd:d7dgedededB fddZ[d:d7dedededef
ddZ\d:d7dededefddZ]d:d7dBedefddZ^	dd:d7dgedededB dedB f
ddZ_d:d7dgededededB f
ddZ`d:d7dgededefddZad:d7dgedefddZbd:d7dgededB fddZcd:d7dgedededB fddZdd:d7dSededB fddZed:d7ded(ededef
ddZfd:d7d(edefddZgd:d7dedefddZhd:d7dededefddZid:d7dededefddZjd:d7dSedTededB fddZkd:d7dSedTededB fddZld:d7dSedTededB fddZmd:d7dSedTededB fddĄZnd:d7dSedTededB fddƄZod:d7dSedTededB fddȄZpd:d7dSedTededB fddʄZqd:d7dSedTededB fdd̄Zrd:d7dSededB fdd΄Zsd:d7dSedTedefddЄZtdeud fddӄZvdewfddՄZxdedefdd؄Zy  ZzS )BuiltinVariablea  
    A VariableTracker that represents a built-in value (functions and operators).
    A lot of the code here assumes it will be a function object.

    The BuiltinVariable class wraps Python built-in functions (like len, isinstance, etc.)
    and operators (like +, -, *, etc.) to enable symbolic execution during tracing. This allows
    Dynamo to properly handle these operations when converting Python code to FX graphs while
    maintaining correct semantics and enabling optimizations.
    fnvaluesourcer_   c                 C   s   t |tj | ||dS Nr   )r   
make_guardr   BUILTIN_MATCH)clsr   r   r`   r`   ri   create_with_source/  s   z"BuiltinVariable.create_with_source.c                  C   sh  h t ttttttttt	t
tttttttttjtttj tjtjtjtjtjtjtjtjtjtjtj tj!tj"tj#tj$tj%tj&tj'tj(tj)tj*tj+tj,tj-tj.tj/tj0tj1tj2tj3tj4tj5tj6tj7} ddl8m9} | :|;  | :dd t<j=; D  | S )Nr:   )rS   c                 s   s$    | ]}t |ttjr|V  qd S re   )
isinstancetypemathsqrt.0xr`   r`   ri   	<genexpr>u  s   " z;BuiltinVariable._constant_fold_functions.<locals>.<genexpr>)>absallanyboolcallablechrcomplexdivmodfloatgetattrintr   maxminordpowreprroundrp   formatsumr   r   posnegnot_truthinvertmulr   floordivtruedivmodaddsubr   length_hintlshiftrshiftand_or_xoripowimulr   	ifloordivitruedivimodiaddisubilshiftirshiftiandixoriorindextensorrS   updatevaluesr   __dict__)fnsrS   r`   r`   ri   _constant_fold_functions4  s   	
 !"#$%&'()*+,-./0123456789;z(BuiltinVariable._constant_fold_functionsc                 C      | j |  v S re   )r   r   rf   r`   r`   ri   can_constant_fold_throughx     z)BuiltinVariable.can_constant_fold_throughc                  C   s   h t jt jt jt jt jt jt jt jt j	t j
t jt jt jt jt jt jt jt jt jt jt jt jt jt jt jt jt jt jt jt jt jt j t j!t j"t j#t j$t j%t j&t j'} | S re   )(r   r   r   r   r   r   r   r   r   r   r   r   r   ltgtgeleneeqr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r`   r`   ri   _fx_graph_functions{  s   	
 !"#$%&')z#BuiltinVariable._fx_graph_functionsc                  C   s   t jg dt jft jg dt jft jg dt jft jg dt jft j	g dt j
ft jg dt jftg dt jft jg dt jft jg dt jft jg d	t jft jg d
t jfi} | S )N)__add____radd____iadd__)__sub____rsub____isub__)__mul____rmul____imul__)__truediv____rtruediv____itruediv__)__floordiv____rfloordiv____ifloordiv__)__mod____rmod____imod__)__pow____rpow____ipow__)
__lshift____rlshift____ilshift__)
__rshift____rrshift____irshift__)__xor____rxor____ixor__)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r`   r`   ri   _binops  s2   zBuiltinVariable._binopsc                     sv  ddl mm ddlm ddlm ddlm  ddl	m
mm i } t  D ]\}\}}g | |< g | |< |\}}}||ddd	d
tdtdtdtdtffdd}| | tf|f | | tf|f |ddd	d
tdtdtdtf
dd}| | tf|f | | tf|f |ddd	d
tdtdtdtf dtf
dd}	| | ttf|	f | | ttf|	f | | ttf|	f | | ttf|	f q,dd	d
tdtdtfdd}
dd	d
tdtdtfdd}ttf|fttf|fttf|fttf|
fttf|
fttfdd fttttffdd fttfd d fg}| tj | dd	d
tdtdtfd!d"}ttf|fttf|
fttf|
fg}| tj | dd	d#td$tdtfd%d&}ttf|fttf|fttf|fttf|fg}| tj  | d'tdtf dt!t"t"t#t#f t$f  f fd(d)}t%& D ]}t'|sJ || vsJ ||| |< q| S )*Nr:   )BaseUserFunctionVariableUserFunctionVariableNNModuleVariable)supported_const_comparison_ops)BaseTorchVariable)UserDefinedClassVariablerY   rZ   )forward_namereverse_nametxr\   abr  r  r_   c                   s.   t | r|| ||gi S || ||gi S re   )r   call_method)r  r  r  r  r  )rZ   r`   ri   user_defined_handler  s   
z=BuiltinVariable._binop_handlers.<locals>.user_defined_handler)r  c                S   s   | | ||gi S re   r  )r  r  r  r  r`   r`   ri   user_defined_inplace_handler  s   zEBuiltinVariable._binop_handlers.<locals>.user_defined_inplace_handlerr   r   .c                S   s2   ddl m} || | jjd|gt||gi R  S Nr:   wrap_fx_proxycall_function)builderr  outputcreate_proxyr5   )r  r  r  r   r  r`   r`   ri   dynamic_handler+  s   z8BuiltinVariable._binop_handlers.<locals>.dynamic_handlerc                 S      t g |j|| S re   )rO   itemsunpack_var_sequencer  r  r  r`   r`   ri   tuple_add_handlerM     z:BuiltinVariable._binop_handlers.<locals>.tuple_add_handlerc                 S   r#  re   )rM   r$  r%  r&  r`   r`   ri   size_add_handlerR  r(  z9BuiltinVariable._binop_handlers.<locals>.size_add_handlerc                 S   s   t g || |jS re   )rO   r%  r$  r&  r`   r`   ri   rw   y  s    z1BuiltinVariable._binop_handlers.<locals>.<lambda>c                 S   s   t g |j|| t dS Nmutation_type)rK   r$  r%  r<   r&  r`   r`   ri   rw     s    c                 S   s   t |g |j|jS re   )r   r$  r&  r`   r`   ri   rw     s    c                 S   s>   |  s	|| sd S || }| jj| |j| |S re   )is_immutablehas_unpack_var_sequencer%  r   side_effectsmutationr$  extend)r  r  r  seqr`   r`   ri   list_iadd_handler  s   
z:BuiltinVariable._binop_handlers.<locals>.list_iadd_handlerlstconstc              
   S   s   t |ts| r||}}zt |tsJ |j|j|  t dW S  tyF } ztt	|| t
ttj|jd W Y d }~d S d }~ww )N)r$  r,  rc   )r   rI   is_python_constant	__class__r$  as_python_constantr<   MemoryErrorr   r   listmapr?   createrc   )r  r4  r5  excr`   r`   ri   expand_list_like  s    
z9BuiltinVariable._binop_handlers.<locals>.expand_list_liker   c           
         s  dddt dt dt ffdd}ttf|fg}tv rUttf|fttf|fg}t}|tt f|jft tf|jfg dddt dt dt ffdd	}|t t f|f |S ttf|fg}		 v rj
d
rt d  dddt dt dt f fdd}|}|}ttttf}||tf|ft|f|fg t}|tftfffddfffddff|ff|ftttftttff|ftt f|jft tf|jftt f|jft tf|jfg	 dddt dt dt d B ffdd}	|t t f|	f |S )Nr  r\   r  r  r_   c              
      s\   z
t  |j|jW S  ty- } ztt|| ttt j|jd W Y d }~d S d }~ww )Nr6  )	r?   r   	TypeErrorr   r   r;  r<  r=  rc   )r  r  r  r>  r   r`   ri   compare_by_value  s   zYBuiltinVariable._binop_handlers.<locals>.create_cmp_op_handlers.<locals>.compare_by_valuec                    s   |  t| t  ||gi S re   )inline_user_function_returnr=   buildpolyfill_fn_mappingr&  rA  r`   ri   handler  s   zPBuiltinVariable._binop_handlers.<locals>.create_cmp_op_handlers.<locals>.handleris_c                    s   t  S re   )r?   r&  )none_resultr`   ri   never  s   zNBuiltinVariable._binop_handlers.<locals>.create_cmp_op_handlers.<locals>.neverc                    s   t  |j|jS re   )r?   r   r&  rA  r`   ri   rw   <      zQBuiltinVariable._binop_handlers.<locals>.create_cmp_op_handlers.<locals>.<lambda>c                    s"   t  | j|j| j|jS re   )r?   r   get_submodule
module_keyr&  rA  r`   ri   rw   C  s    leftrightc                    s   t |t |urt jdkS ||u rt ||S t|tjr2t|tjr2t |j|jS t|tjrLt|tjrN|j	|j	urPt ||S d S d S d S )NrG  )
r   r?   r=  rk   r3   r   ObjectVariabler   ExceptionVariableexc_type)r  rM  rN  rA  r`   ri   	handle_isl  s    

zRBuiltinVariable._binop_handlers.<locals>.create_cmp_op_handlers.<locals>.handle_is)r=   r?   rE  r@   r   r1  rT   _comparison_with_symnodeappendr   rk   
startswithobjectrU   rI   rA   rQ   rP   _comparison_with_tensor)
r   rB  resultop_varrF  rI  obj_op_nonenone_op_objtypes_that_are_never_nonerR  r  r
  r  r  rY   rZ   r  r  )rH  r   ri   create_cmp_op_handlers  s   




	
7z?BuiltinVariable._binop_handlers.<locals>.create_cmp_op_handlers)(	functionsr
  r  	nn_moduler  r   r  r   r  user_definedr  rY   rZ   r   r	  r$  r=   rp   rT  r   r   rT   rI   rM   rO   r?   rK   rJ   r   r   r1  r   r   r;  tuple_TrackersType_HandlerCallbackrS   r   r   )op_handlersr   magic_method_namesin_place_opr  r  inplace_namer  r  r"  r'  r)  list_like_addition_handlersr3  list_like_iadd_handlersr?  list_like_expansion_handlersr^  r`   r]  ri   _binop_handlers  sT  



	
	










=






 5zBuiltinVariable._binop_handlersr   a_typeb_typeNc                 C   sR   t  | }|d u rd S g }|D ]\\}}}t||r&t||r&|| q|S re   )r   rl  get
issubclassrT  )r   rm  rn  handlersmatchestype1type2rF  r`   r`   ri   _find_binop_handler  s   
z#BuiltinVariable._find_binop_handlerc                 C   r   re   )r   r   r   r`   r`   ri   can_insert_in_graph  r   z#BuiltinVariable.can_insert_in_graphrd   c                    s   t  jdi | || _d S )Nr`   )super__init__r   )rf   r   rd   r8  r`   ri   rx    s   
zBuiltinVariable.__init__c                 C   s,   | j d u rd}n| j j}| jj d| dS )NNone())r   rk   r8  )rf   namer`   r`   ri   __repr__  s   
zBuiltinVariable.__repr__c                 C   s   | j S re   r  r   r`   r`   ri   r9    s   z"BuiltinVariable.as_python_constantc                    s4   t tj ttjttji}| j|v r|| j S t  S re   )	r   r   r   int64r   float64r   rw  as_proxy)rf   DTYPEry  r`   ri   r    s   


zBuiltinVariable.as_proxycodegenr[   c                 C   sD   | j j}| j jdksJ ||jjvsJ d||j|dd d S )Nbuiltinszshadowed globalT)r   )r   rk   rl   r  	f_globalsappend_outputcreate_load_global)rf   r  r}  r`   r`   ri   reconstruct  s   zBuiltinVariable.reconstructrc   c                 O   s
   t ||S re   )r'   rf   rc   rd   r`   r`   ri   constant_args     
zBuiltinVariable.constant_argsc                 G   s0   d}|D ]}t |tjr dS |p| }q|S NF)r   r   GetAttrVariable	is_tensor)rf   rc   
any_tensorargr`   r`   ri   tensor_args  s   zBuiltinVariable.tensor_args	arg_typesc                 C   s4   d}|D ]}t |tjr dS |pt |tj}q|S r  )rp  r   r  rU   )rf   r  r  arg_typer`   r`   ri   tensor_args_type  s   z BuiltinVariable.tensor_args_typec                 O   sX   g }g }t || D ]}| r|| q|| qtdd |D o+| j| S )Nc                 s   s(    | ]}|j d urt|j ndV  qd S r  )r   r$   r   tr`   r`   ri   r     s
    
zBBuiltinVariable.python_and_tensor_constant_only.<locals>.<genexpr>)	itertoolschainr   r  rT  r   r  )rf   rc   rd   r  non_tensor_argsir`   r`   ri   python_and_tensor_constant_only  s   z/BuiltinVariable.python_and_tensor_constant_onlyc                 C   s    dd | D dd |  D fS )Nc                 S      g | ]}|  qS r`   r9  r   r`   r`   ri   
<listcomp>      z=BuiltinVariable.unwrap_unspec_args_kwargs.<locals>.<listcomp>c                 S      i | ]	\}}||  qS r`   r  r   kvr`   r`   ri   
<dictcomp>      z=BuiltinVariable.unwrap_unspec_args_kwargs.<locals>.<dictcomp>)r$  )rc   rd   r`   r`   ri   unwrap_unspec_args_kwargs  s   z)BuiltinVariable.unwrap_unspec_args_kwargsc                 C   s   |   ot||S re   )r   r)   r  r`   r`   ri   has_constant_handler  s   
z$BuiltinVariable.has_constant_handler
has_kwargsr\   c              	      s  ddl m  t	g t fddD r	fddS trDtts+tu rDddd	t	t
d
f dttt
f dt
ffdd}|S 	 retju rUtd tjre	r]	jS re	j tdkrstjgR  syn'tdkr\fdd nddd	tdtdtffdd}| t	dj d 

rddd	tt
 dttt
f dt
d B f	
fdd}| 	 rtdd D rsddd	tt
 dttt
f dt
d B ffdd}nddd	tt
 dttt
f dt
d B ffdd}| d	tt
 dd ffddtdkr*fddS tdkrN\ddd	tt
 dttt
f dt
d B ffdd }|S ddd	tt
 dttt
f dt
d B ffd!d }|S )"Nr:   LazyVariableTrackerc                 3   s    | ]}t | V  qd S re   )rp  r  r  r`   ri   r         z0BuiltinVariable._make_handler.<locals>.<genexpr>c                    s     | dd |D |S )Nc                 S   r  r`   realizer   r  r`   r`   ri   r     r  zCBuiltinVariable._make_handler.<locals>.<lambda>.<locals>.<listcomp>)r  r  rc   rd   objr`   ri   rw     s    z/BuiltinVariable._make_handler.<locals>.<lambda>r  r\   rc   .rd   r_   c                    sB    t u rtdd |D stdt|dg tjd t ||S )Nc                 s   s&    | ]}|  ot| tV  qd S re   )r7  r   r9  rp   r   r`   r`   ri   r     s
    
zWBuiltinVariable._make_handler.<locals>.create_exception_class_object.<locals>.<genexpr>zassert with non-string messagez1Dynamo only supports asserts with string messagesgb_typecontextexplanationhints)AssertionErrorr   r   rp   r   SUPPORTABLEr   rP  r  r  r`   ri   create_exception_class_object  s   zDBuiltinVariable._make_handler.<locals>.create_exception_class_objectr   r   c                    s    | g|R  S re   r`   )r  rc   _)binop_handlerr`   ri   rw   2  s    r  c                    s*    D ]}|| g|R  }|r|  S qd S re   r`   )r  rc   r  r   rv)binop_handlersr`   ri   call_binop_handlers5  s   z:BuiltinVariable._make_handler.<locals>.call_binop_handlerscall_c                    s  z| g|R i |W S  t yh   ztj| g|R i | W   t yg } z7||}|s[td| tdd d| d| d j g t	j
d W Y d }~Y d S W Y d }~Y d S d }~ww  ty } z||}|sx |  W Y d }~d S d }~ww )Nz1incorrect arg count %s %s and no constant handlerz"invalid call to builtin op handlerzinvalid args to z:  z/Encountered TypeError when trying to handle op r  )r@  inspect	signaturebindr  logwarningr   rk   r   	DIFFICULTr   remove_from_stats)r  rc   rd   er  r>  )r   r  self_handlerr`   ri   call_self_handlerD  sB    
z8BuiltinVariable._make_handler.<locals>.call_self_handlerc                 s       | ]}t |tV  qd S re   )rp  r?   r   r`   r`   ri   r   n  r  c              
      s   z dd |D  }W nE t y- } ztt|| tttj|jd W Y d }~n(d }~w tyP } zt	dd  d| dg t
j|d W Y d }~nd }~ww t| |S )	Nc                 S   r  r`   r  r   r`   r`   ri   r  z  r  PBuiltinVariable._make_handler.<locals>.constant_fold_handler.<locals>.<listcomp>r6  constant fold exceptionattempted to run function  with arguments 7Encountered exception when attempting to constant fold.r  r  r  r  from_exc)	Exceptionr   r   r;  r<  r?   r=  rc   r;   r   r   
DYNAMO_BUGr=   rD  r  rc   rd   resr>  r  r`   ri   constant_fold_handlerr  s,   	z<BuiltinVariable._make_handler.<locals>.constant_fold_handlerc              
      s   t ||rfz dd |D i dd | D }W nE ty> } ztdd  d| dg tj|d	 W Y d }~n&d }~w ty_ } ztt|| t	t
tj|jd
 W Y d }~nd }~ww t| |S d S )Nc                 S   r  r`   r  r   r`   r`   ri   r    r  r  c                 S   r  r`   r  r  r`   r`   ri   r    r  zPBuiltinVariable._make_handler.<locals>.constant_fold_handler.<locals>.<dictcomp>r  r  r  r  r  r6  )r)   r$  r;   r   r   r  r  r   r   r;  r<  r?   r=  rc   r=   rD  r  r  r`   ri   r    s8   

c                    sj   dd | D }t ddj d  d dj d| d d	d
j d| dj dddgd d S )Nc                 S   r  r`   )python_type_namer   r  r`   r`   ri   r    r  zMBuiltinVariable._make_handler.<locals>.call_unimplemented.<locals>.<listcomp>z Failed to trace builtin operatorzbuiltin r  z4Dynamo does not know how to trace builtin operator `z` with argument types z (has_kwargs r|  zAvoid calling builtin `z?. Consider using an equivalent alternative function/method to `z`.zIf you are attempting to call a logging function (e.g. `print`), you can try adding it to `torch._dynamo.config.reorderable_logging_functions`.z"Please report an issue to PyTorch.r  )r   rk   )rc   real_arg_types)r  r   r  r`   ri   call_unimplemented  s    

z9BuiltinVariable._make_handler.<locals>.call_unimplementedc                    s    |S re   r`   r  )r  r`   ri   rw     rx   c                    s    | ||}|r
|S  | |S re   r`   )r  rc   rd   r  )r  rF  r`   ri   builtin_dispatch  s
   z7BuiltinVariable._make_handler.<locals>.builtin_dispatchc                    s2   d }D ]}|| ||}|r|  S q | |S re   r`   )r  rc   rd   r  r   )r  rq  r`   ri   r    s   )lazyr  r   r   r  isclassrp  BaseExceptionGeneratorExitrb  r=   ro   rp   rv  r   r   r   rU   r  _handle_insert_op_in_graphrT  r   ru  r   r   rk   r   r   r   )r   r  r  r  r  r  r  r  r`   )r  r  r  r  r  r   rF  rq  r  r  r  ri   _make_handler  s   








&



 

zBuiltinVariable._make_handlerr  c                 G   sz   t |dkrtdd|  d| d| j dg tjd t |dks$J z	|d |d	W S  ty<   tt| Y d S w )
Nr   z1unimplemented builtin op vars() with no argumentszvars: r  3Dynamo does not know how to trace builtin operator z with no argumentsr  r:   r   )	r   r   r   r   r  var_getattrr   r   r@  rf   r  rc   r`   r`   ri   	call_vars  s   zBuiltinVariable.call_varsc                 C   sj  ddl m}m} |r| jg || R  sd S ddl m} ddlm}m} ||||rm|j	s]t
  |d  sW| jtv rCt| j }	nt| j }	|d }
|d |d< |
|d< n	t| j }	n| j}	|||	}|||||S | j}z| j|i |rddlm} ddlm} |||||j||W S |tv rt|d tjrt| }|d |d g}|tju rt|d trtj}|d tjd|d g}t||rt d	d
 |D s|j!j"dt#|gt$||R  }|tj%||W S |tj&u rt'|dkr|d  r|d (|dt)|dd  |W S |j!j"d|gt$||R  }t dd
 |D r0|t*||W S t+||r^| ,||\}}||i |}t dd
 t-.|| D }|t/||||dW S t0dd
 |D rpt||d W S |tj1u rt|d tj/rt)|}|d 2 |d< |||W S  t3y   t4dd|  d| d| d| j dg t5j6d Y d S w )Nr:   )r  wrap_fx_proxy_clsSourcelessBuilder)can_dispatch_torch_functiondispatch_torch_functionr   r   )	unique_id)invoke_and_store_as_constantc                 s   s    | ]	}t |tu V  qd S re   )r   rU   r  r`   r`   ri   r   A  s    
z=BuiltinVariable._handle_insert_op_in_graph.<locals>.<genexpr>r  __eq__c                 s   r  re   r   rR   r  r`   r`   ri   r   V  r  c                 s   "    | ]}t |tjr|jV  qd S re   r   r   rV   need_unwrapr   r`   r`   ri   r   `      

)	raw_valuer  c                 s   r  re   r   rT   r   r`   r`   ri   r   m  r  z,unimplemented builtin op on tensor argumentszpartial tensor op: r  r  z with tensor argumentsr  )7r  r  r  r  r   r  torch_functionr  r  exportr   r  r   r^   r]   r=  r  bytecode_transformationr  r_  r  rk   IN_PLACE_DESUGARING_MAPr   r   r?   r   r   rT   r   selectr(   r   r   r!  r4   r5   NumpyNdarrayVariabler   r   r  r;  rR   r*   r  r  r  rV   r   r   r9  NotImplementedErrorr   r   r  )rf   r  rc   rd   r  r  r  r  r  ra   tmpfn_varr   r  r  proxy_args_kwargsr  r  r`   r`   ri   r    s   




	

("
z*BuiltinVariable._handle_insert_op_in_graphcall_function_handler_cachec                 C   s   |rdd |  D }| jgdd |D dR }n| jgdd |D R }| j|}|sB| | jdd |D t| | j|< }|d usHJ ||||S )	Nc                 S   r  r`   r  r  r`   r`   ri   r    s    z1BuiltinVariable.call_function.<locals>.<dictcomp>c                 s       | ]}t |V  qd S re   r   r   r`   r`   ri   r         z0BuiltinVariable.call_function.<locals>.<genexpr>Tc                 s   r  re   r  r   r`   r`   ri   r     r  c                 S   s   g | ]}t |qS r`   r  r   r`   r`   ri   r    r  z1BuiltinVariable.call_function.<locals>.<listcomp>)r$  r   r  ro  r  r   )rf   r  rc   rd   keyrF  r`   r`   ri   r    s   zBuiltinVariable.call_functionr}  c              
      s  | j tu r9|dkr9t|dksJ t|dksJ |\}}}| }t|tr9|jj|r9|	 r9|
|||S |dkr| j tu r_t|dkr_t|dksPJ |jj| |d |dd  S | j tu rt|dkr|sti tt d}t|d tr|d j tu r|S |jj| |d |dd  S | j tu rt|dkr|d |r|st|d tr|d j tu r|d |}	tj|	t dS |jj| |d |dd  S | j tu rtg t d}
t|d tr|d j tu r|
S |jj| |d |dd  S | j ttfv ret|dkre| j tu r|dv s#|d	kretjd
kre|d 	 rezt| j |}||d  }tj|W S  tt fyd } zt!t"||tt#tj|j$d W Y d }~nd }~ww | j tu rs|dkrstj%S | j tu r|dkrtj&|tg|R i |S | j tu rt| j |}|t'v rt|d tj(r|d j)*|||dd  |S t|d tjr|d *|||dd  |S | j t+u rt| j |}|t,v rt|d tj-r|d j.*|||dd  |S t|d tj/r|d *|||dd  |S | j t0u r3t| j |}|t1v r3t|d tj2r3|d *|||dd  |S | j t3u rat|dkrat| j |}|t4v rat|d tra|d *|||dd  |S | j tu rt|dkrt|d trttt||d  S t5 *||||S )N__setattr__   r   __new__r:   r+  r   )fromhexhexfrom_numberr     r6  rx  fromkeys)6r   rV  r   r  r   rY   r   r/  is_attribute_mutationr7  method_setattr_standardtrack_new_user_defined_objectro   rA   r<   r   rb  has_force_unpack_var_sequenceforce_unpack_var_sequencer   rO   r;  rK   r   r   sysversion_infor   r9  r?   r=  OverflowError
ValueErrorr   r   r<  rc   r>   call_custom_dict_fromkeysr,   rX   _dict_vtr  setr7   UserDefinedSetVariable_set_vtrH   	frozensetr.   rE   rp   r8   rw  )rf   r  r}  rc   rd   r  name_varvaldict_vt	init_argslist_vtr   r  r  resolved_fnry  r`   ri   r    s   









zBuiltinVariable.call_methodr  c                 C   sr   |  s	t|tr7|  r||dg i }n|}| jtu rtnt}ddlm	} |||j
d|| fi dS d S )Nitemr   r  r  r  r  )r  r   rT   r  r   r   r   r   torch._dynamo.variables.builderr  r   r!  r  )rf   r  r  r%  fn_r  r`   r`   ri   _call_int_float'  s    	zBuiltinVariable._call_int_floatc                 C   s   |  r3||dg i }t|trt|jtjr|S t|tjr)tj	t
|jS t	|| dkS t|trWt|jtjrA|S t|jtjtjfsMJ t	|| dkS d S )Nr%  r   )r  r  r   rT   sym_numr   SymBoolr   r?   r=  r   r   r  r3   SymIntSymFloat)rf   r  r  r%  r`   r`   ri   	call_boolB  s   
zBuiltinVariable.call_boolc                 C   s   t |tjrE|jj}t|jjtju r t||}|	|g i S t
|r4tddt|j ddgd n|j}t||}|	||gi S t |tjr]t|jjtju r]tjt|jS t |tttttfrotj| S dS )z&Handle repr() on user defined objects.z4Attempted to call repr() method implemented in C/C++ z6 has a C/C++ based repr method. This is not supported.zWrite the repr method in Pythonr  N)r   r   rY   r   r~  r   rV  r=   rD  r  r2   r   __func__r  r?   r=  r   rL   rA   rB   rG   rD   
debug_repr)rf   r  r  repr_methodfn_vtbound_methodr`   r`   ri   	call_repr`  s:   
zBuiltinVariable.call_reprc                 C   sn  t |tjrtjjt|jdS t |tjrt|j	dr!|j	j
}nt|j	dr,|j	j}ntdt|dg tjd t|j	j
tj
u rVz	tjj| dW S  tyU   Y d S w t|rktddt|j	 d	d
gd d S |j}zt||}W n ty   tjddd Y d S w |||gi S t |tjfrt|jdkr|j }nddd |jD }tjj|dS d S )N)r   __str__r~  z+failed to call str() on user defined objectz5User defined object has no __str__ or __repr__ methodr  z0Attempted to a str() method implemented in C/C++r/  z5 has a C/C++ based str method. This is not supported.zWrite the str method in Pythonz%Failed to create UserFunctionVariableT)exc_infor   , c                 s   s    | ]}|  V  qd S re   r  )r   r  r`   r`   ri   r     r  z+BuiltinVariable.call_str.<locals>.<genexpr>)r   r   r  r?   r=  rp   r   rY   hasattrr   r6  r~  r   r   
USER_ERRORr   rV  AttributeErrorr2   r0  r=   rD  r  r  r  r  rP  r   rc   rQ  join)rf   r  r  
str_methodr4  user_func_variabler   r`   r`   ri   call_str  sR   


zBuiltinVariable.call_strc                 G   sr   t |dkr|d |r|d |}| ||S t |dkr+| ||d |d S t |dkr7| ||S d S )Nr:   r   r   )r   r  r  _call_min_max_seq_call_min_max_binary)rf   r  rc   r$  r`   r`   ri   _call_min_max  s   zBuiltinVariable._call_min_maxr$  c                 C   s:   t |dksJ t |dkr|d S tt| j||S Nr   r:   )r   	functoolsreducepartialrA  )rf   r  r$  r`   r`   ri   r@    s   z!BuiltinVariable._call_min_max_seqr  r  c                 C   s  |d u s|d u r
d S |  ||r| s||}}| s J t|tr1ttj||gi }t|t	s;t|t	rYddl
m} |t|||jjd| jgt||gi R  dS | rt|tjrndd l}t|j}nttj}| jtu r}d|ind|i}|||g|}n4t|tjrdd l}t|jt|ji| j }	t|	}nttjttji| j }
t|
}||||gi }tdd	 ||fD rtd
d	 ||fD rtj|S | r| }n|j}| jtu rt|j|}nt|j|}tdd	 ||fD }tj |||S |S t|t	st|t	r=| jtu r#tj!ntj"}|jjd|gt||gi R  }t	#||d S t|t$rXt|t$rX| | | }t$#|S d S )Nr:   r  r  r&  r   r   r   c                 s   s"    | ]}t |tjtjfV  qd S re   )r   r   rV   r?   )r   r  r`   r`   ri   r     s    
z7BuiltinVariable._call_min_max_binary.<locals>.<genexpr>c                 s   r  re   r  )r   r   r`   r`   ri   r     r  c                 s   r  re   r  r   r`   r`   ri   r   (  r  )%r  r  r   rR   r   TorchInGraphFunctionVariabler   r   r  rT   r  r  r   r   r!  r   r5   r7  r  numpyNumpyVariableclipclampr   maximumr   minimumr   r   from_tensor_variabler9  r  rV   sym_maxsym_minr=  r?   )rf   r  r  r  r  npr   rd   rX  np_fntorch_fnraw_braw_resr  py_fnr  r   r`   r`   ri   rA    s   







z$BuiltinVariable._call_min_max_binaryc                 C   :   ddl m} ||t||tdgi }||g i S )Nr:   r  __abs__r  r  r=  r   r  r?   )rf   r  r  r  
abs_methodr`   r`   ri   call_absF  
   zBuiltinVariable.call_absc                 C   rX  )Nr:   r  __pos__rZ  )rf   r  r  r  
pos_methodr`   r`   ri   call_posQ  r]  zBuiltinVariable.call_posc                 C   s6   |  rtdddg d t|}t|}tj|S )Nzunsupported index(Tensor)r/  z;Dynamo does not support tracing builtin index() on a Tensorr  )r  r   r0   r   r   r   r?   r=  )rf   r  r  constant_valuer`   r`   ri   
call_index\  s   
zBuiltinVariable.call_indexc                 O   s:   ddl m} ||t||tdgi }||||S )Nr:   r  	__round__rZ  )rf   r  r  rc   rd   r  round_methodr`   r`   ri   
call_roundk  s
   zBuiltinVariable.call_roundc                 G   s>   t |i r
t|S | j| rtdd |D }t|S d S )Nc                 s   s     | ]}t jt|V  qd S re   )r   r?   r=  r0   r  r`   r`   ri   r     s    
z-BuiltinVariable.call_range.<locals>.<genexpr>)r)   r   rL   _dynamic_argsrb  r  r`   r`   ri   
call_rangez  s   



zBuiltinVariable.call_rangec                 O   s(   t dd |D pt dd | D S )Nc                 s   r  re   r  r   r`   r`   ri   r     r  z0BuiltinVariable._dynamic_args.<locals>.<genexpr>)r   r   r  r`   r`   ri   rf    s   zBuiltinVariable._dynamic_argsc                 G   s   t ||S re   )r   SliceVariabler  r`   r`   ri   
call_slice     zBuiltinVariable.call_slicec                 O   s0   ddl m} |||jjd| jgt||R  S r  )r  r  r   r!  r   r5   )rf   r  rc   rd   r  r`   r`   ri   
_dyn_proxy  s   zBuiltinVariable._dyn_proxyr  c                 O   s"  t |tjrJ | j|i |r| j|g|R i |S tj| j}|d u r.|g t dS |	|r|j
rt|j
st |trJt|j
tj n9t|ddrdt |trdt|ttfsd|jj|j
 t |tjrtt|j
tj nt |tjst|j
tj |t||t dS d S )Nr+  r   F)r   r   IteratorVariablerf  rk  rI   cls_forr   r<   r.  r   r$   rN   r   r   r   TUPLE_ITERATOR_LENr   rA   r3   rH   rE   r   guard_on_key_orderr   MappingProxyVariableMAPPING_KEYS_CHECKUnspecializedNNModuleVariableSEQUENCE_LENGTHr;  r%  rf   r  r  rc   rd   r   r`   r`   ri   _call_iter_tuple_list  sF   


z%BuiltinVariable._call_iter_tuple_listc                 O   s&   t j| j}|t||t dS r*  )r   rI   rm  r   r;  r  r<   rt  r`   r`   ri   _call_iter_tuple_generator  s
   z*BuiltinVariable._call_iter_tuple_generatorc                 O   s   t |tjrtj| j}|t||t dS t |tj	s)t |t
r6||r6| j||g|R i |S | j||g|R i |S r*  )r   r   rl  rI   rm  r   r;  r  r<   LocalGeneratorObjectVariablerY   r  rv  ru  rt  r`   r`   ri   _call_tuple_list  s   z BuiltinVariable._call_tuple_listc              
   O   sh   t |tjtjtjtjtjtjtjt	fr|
|dg i S ttjj||g|i }|r2t|}|S )N__iter__)r   r   rK   rL   rl  rA   r  rU   rO   rD   r  r  r   r  iter_r  ObjectIteratorVariable)rf   r  r  rc   rd   retr`   r`   ri   	call_iter  s*   
zBuiltinVariable.call_iterc                 C   s~   ddl m}m} ddlm} t|tj|||frtj	dS t|t
r,tj	t|jS t|ttttttfr=tj	dS d S )Nr:   )r
  FunctoolsPartialVariabler  TF)r_  r
  r~  r`  r  r   r   r  r?   r=  rZ   r   r   rT   rU   rK   rO   rJ   )rf   r  r  r
  r~  r  r`   r`   ri   call_callable  s2   	
zBuiltinVariable.call_callabler  c                 O   s6   t |dkr
|d S tdd| d| ddgd d S )	Nr   r:   zbad args to builtin cast()z	got args r  z0Dynamo expects exactly 2 args to builtin cast().z3Ensure your call to cast() has exactly 2 arguments.r  )r   r   )rf   r  rc   rd   r`   r`   ri   	call_cast?  s   
zBuiltinVariable.call_castc                 C   s>   t |tjrt|t|jS t |trt|t|jS d S re   )	r   r   r  r=   rD  dirr   r   r   )rf   r  r  r`   r`   ri   call_dirL  s
   
zBuiltinVariable.call_dirc                O   s   t j|tg|R i |S re   )r   call_custom_dictro   rf   r  rc   rd   r`   r`   ri   	call_dictU  s   zBuiltinVariable.call_dictuser_clsc                O   s   t |}t|dkr.t|d tjr.t|d jtjr.| jj	|d js.|d 
| |d< | t| tjt| |g||S )Nr:   r   )r;  r   r   r   r  r  r  r   r/  has_pending_mutationget_forwarded_dictrC  r=   rD  r   construct_dict)r  r  rc   rd   	args_listr`   r`   ri   r  ^  s   z BuiltinVariable.call_custom_dictc          	      O   s  |t tthvr'td|j d| d| d|j d|j dd|j dgd	 |r\|tus=t|d
ks=t|d
ks=d|vrRt| |j ddt| dt| d g ||dR }t|dkrrt| |j ddt| d t|d
krg |tR }t|dkrt| |j ddt| d |\}}|turt	nt
}t|t rdd |D }|t |||t dS || r|| }tdd |D r|t |||t dS td|j d| d| d|j dddgd	 d S )Nz$Unsupported dict type for fromkeys()z.fromkeys(): r  zFailed to call z.fromkeys() because z5 is not any type of dict, OrderedDict, or defaultdictzEnsure z0 is a type of dict, OrderedDict, or defaultdict.r  r:   r   z	.fromkeysz1 args and 1 kwargs (`value`)z
 args and  kwargsr   zat least 1 argsz argsr   z2 argsc                 S   s   g | ]}t |qS r`   )r?   r=  )r   r  r`   r`   ri   r    s    z=BuiltinVariable.call_custom_dict_fromkeys.<locals>.<listcomp>r+  c                 s   r  re   )rF   r  r`   r`   ri   r     r  z<BuiltinVariable.call_custom_dict_fromkeys.<locals>.<genexpr>zfailed to call dict.fromkeys()zo.fromkeys() because arguments could not be automatically converted to a list, or some dict key is not hashable.z(Manually convert the argument to a list.zEnsure all keys are hashable.)ro   r   r   r   rk   r   r6   popr>   rA   rB   r   r  r<   r  r  r   )	r  r  rc   rd   r  r   DictVariableTypearg_listkeysr`   r`   ri   r  w  s   
	








z)BuiltinVariable.call_custom_dict_fromkeysc           	      O   s  ddl m} |r
J |stg t dS t|dkr*tt|tdt| dgd |d }t	|t
jr;|jt dS ||rL||}t|t dS t|t
jr|t|jtr|||d}t|t
jr|||||}t|trr|S ||t||S tt|td	gd d S )
Nr:   r  r+  z&set() takes 1 positional argument but  were givenr6  r   ry  z!failed to construct builtin set())r  r  rH   r<   r   r   r@  r?   r=  r3   r   cloner  r  r   rY   r   r   r  UserMethodVariablerC  r  call_set)	rf   r  rc   rd   r  r  r$  iter_fnoutr`   r`   ri   r    sB   	




zBuiltinVariable.call_setc                 O   s   |rJ |s
t g S t|dkr!tt|tdt| dgd |d }t|tj r5t dd |jD S |	|rC|
|}t |S tt|tdgd d S )	Nr:   z,frozenset() takes 1 positional argument but r  r6  r   c                 S   s   g | ]}|j qS r`   )vtr   r`   r`   ri   r  
	  rJ  z2BuiltinVariable.call_frozenset.<locals>.<listcomp>z'failed to construct builtin frozenset())rE   r   r   r@  r?   r=  r3   r   	set_itemsr  r  )rf   r  rc   rd   r  r$  r`   r`   ri   call_frozenset  s.   	



zBuiltinVariable.call_frozensetc                    sx   ddl m  |rt|dkrd|v stddt| d |dtd} fdd	|D }tj||	 t
 d
S )Nr:   r  strictzip1 kwargs (`strict`)r  Fc                    s$   g | ]}  t|gi qS r`   )r=  iterr  r  r  r  r`   ri   r  %	      z,BuiltinVariable.call_zip.<locals>.<listcomp>r  r,  )r  r  r   r6   r  r?   r=  r   ZipVariabler9  r<   )rf   r  rc   rd   r  	iter_argsr`   r  ri   call_zip	  s$   zBuiltinVariable.call_zipc              
   O   sb   z|d  |dt|dd  |W S  ty0 } ztt||t|jd W Y d }~d S d }~ww )Nr   __len__r:   r6  )r  r;  r;  r   r   rc   )rf   r  rc   rd   r  r`   r`   ri   call_len/	  s   "&zBuiltinVariable.call_lenc                 O   s    |d  |dt|dd  |S )Nr   __getitem__r:   )r  r;  r  r`   r`   ri   call_getitem:	  s    zBuiltinVariable.call_getitemisinstance_type_varc           	   
      s  z   }W n ty$   tdd  d| dd  g tjd Y nw | }t tjrJ j	d urJdt
dtd	tf fd
d}tj| |S t tjrit jtjritdd  d| ddg tjd t tjrd|jjv rtj|j| jS t tjrtt||S t|tstt|dd r|f}n#t|tjr|j}nt|trtdd |D r|}ntt |dgd zt!||}W n t y   ||v }Y nw tj|S )Nz6builtin isinstance() cannot determine type of argumentzisinstance(r8  r|  z=Dynamo doesn't have a rule to determine the type of argument r  
tensor_vartensor_typer_   c                    s@   dt dtffdd t|tu rt fdd|D S  |S )Ntyr_   c                    sX   | t vr#  jjd }t|r| tjjju rt	|| S t
  | S t |  } j|v S )Nexample_value)r9   r  nodemetar   r   nn	parameter	Parameterr   rp  python_typerr   )r  example_valdtypesr  r`   ri   
check_typeW	  s   

zOBuiltinVariable.call_isinstance.<locals>._tensor_isinstance.<locals>.check_typec                 3   s    | ]} |V  qd S re   r`   )r   r  r  r`   ri   r   j	  r  zNBuiltinVariable.call_isinstance.<locals>._tensor_isinstance.<locals>.<genexpr>)r   r   r   rb  r   )r  r  r  r  ri   _tensor_isinstanceT	  s   z;BuiltinVariable.call_isinstance.<locals>._tensor_isinstancez<isinstance() called on user defined object with C extensionszeUser-defined object with C extensions can have torch.Tensor attributes; intentionally graph breaking.__instancecheck__c                 s   s*    | ]}t |tptt|d dV  qdS )r  N)r   r   r   r   )r   tpr`   r`   ri   r   	  s
    
z2BuiltinVariable.call_isinstance.<locals>.<genexpr>z?isinstance() arg 2 must be a type, a tuple of types, or a unionr6  )"r  r  r   r   r  r9  r   r   rU   rr   r=   r   r   r?   r=  rY   r   rb   MemberDescriptorTyper  r8  r   r  !UserDefinedExceptionClassVariabler   r   r   	UnionType__args__rb  r   r   r@  rp  )	rf   r  r  r  r  isinstance_typer  isinstance_type_tupler   r`   r  ri   call_isinstanceB	  sz   

	
	zBuiltinVariable.call_isinstanceleft_tyright_tyc              
   C   s^   z
|  }|  }W n ty&   tdd| d| dddgtjd Y nw tt||S )z,Checks if first arg is subclass of right argz(issubclass() with non-constant argumentszissubclass(r8  r|  z7issubclass() with non-constant arguments not supported.z#Make sure your arguments are types.r  )r9  r  r   r   r:  r   r?   rp  )rf   r  r  r  
left_ty_pyright_ty_pyr`   r`   ri   call_issubclass	  s   
zBuiltinVariable.call_issubclassc                 C   s   t ||S re   )r   SuperVariablerf   r  r  r  r`   r`   ri   
call_super	  rj  zBuiltinVariable.call_superc              
   G   s   |d }z| |W S  ty   t|dkr|d  Y S   ty? } zt|tjr:|  |jd W  Y d }~S  d }~ww )Nr   r   r:   )	next_variabler   r   r   r   r   rI   r  r$  )rf   r  rc   r  exr`   r`   ri   	call_next	  s   zBuiltinVariable.call_nextattrc                 C   s>   |  r| }t|tjrtt|j|S |||S d S re   )	r7  r9  r   r   r   r?   r9  r   call_obj_hasattr)rf   r  r  r  r}  r`   r`   ri   call_hasattr	  s   zBuiltinVariable.call_hasattrseqsc                    s   t d}|r8tjdkr,t|dkrd|v s"t ddt| d |dt d}nt ddt| d  fd	d
|D }tj|||	 t
 dS )NFr  r:   r  r<  r  r  z0 kwargsc                    s$   g | ]}|  r| n|qS r`   )r.  r%  )r   r2  r  r`   ri   r  
  r  z,BuiltinVariable.call_map.<locals>.<listcomp>r  )r?   r=  r  r  r   r6   r  r   MapVariabler9  r<   )rf   r  r   r  rd   r  seq_listr`   r  ri   call_map	  s4   


zBuiltinVariable.call_mapr2  c                 C   s*   | |r
||n|}tj||t dS r*  )r.  r%  r   FilterVariabler<   )rf   r  r   r2  seq_or_listr`   r`   ri   call_filter
  s   zBuiltinVariable.call_filterc                 C   sp   | j ot| j |}| jtu r0zt| j|}W n ty$   tt| Y nw t|s0t	|||S t
j| ||dS r   )r   r!   r   rV  r   r;  r   r   r=   rD  r   r  )rf   r  r}  r   r   r`   r`   ri   r  
  s   
zBuiltinVariable.var_getattrr  defaultc              	      s  |  stdd| d| d| dddgd | }| r%|dkr%d	}jj|rRt|tj	rR|d
v rR|j
rRjj|rRtdd| d| d| ddg d jj||rbjj||S |d ur| ||}|d ur|ddsyJ | s|S n|S |jot|j| |dv rz<| }t|tr|dkr fddt|jD }tj| dW S |dkrt|j W S |dkrt|jW S W n	 ty   Y nw t|tjr||S t|tjtj tjtj!tj"tj#tj$frpt|tj$r"t%|j&j't(j)r"t*j+r"|dv r"tdd| d| dd| dgd | rN|, j-j.d }	t|	t/j0rNt1|	rNj2rCt*j3sNtddd g t4j5d z||W S  t6y^     tyo   tj7|| d Y S w t|tj8rt9|j&|}
t|
t/j:j;t/j:j<frt/j=j>?|
rtj8|
 dS |t@v rtj7|| dS d S t|tAr|jBs||j&jCvrt9|j&|}
n|j&jC| }
t*jDr҈jEF|j&||
 t|
 S tG|tjHr|d!v rtt9|jI|S z||W S  ty   tj7|| d Y S w )"Nz)getattr() with non-constant name argumentzgetattr(r8  r|  z:getattr() with non-constant name argument is not supportedz1Ensure the name argument of getattr() is a stringr  _gradgrad)named_parameters
parametersnamed_buffersbuffersnamed_modulesmodulesz,getattr() on nn.Module with pending mutationzPIntentionally graph breaking on getattr() on a nn.Module with a pending mutationTF>   __base__	__bases__	__flags__r  c              	      s(   g | ]\}}t | ot |qS r`   )r=   rD  r"   )r   r  r  r   r  r`   ri   r  e
  s    z0BuiltinVariable.call_getattr.<locals>.<listcomp>r   r  r  )assertRaisesRegexassertNotWarnsassertWarnsRegexassertWarnszFailed to trace unittest methodzfunction: unittest.TestCase.z3Dynamo does not know how to trace unittest method `z` zAvoid calling `TestCase.z%`. Please report an issue to PyTorch.r  zAttempted to wrap sparse Tensorr/  z-torch.compile does not support sparse Tensors)rk   rl   )Jr7  r   r9  r  r   r/  r  r   r   rr  is_state_mutatedr  has_pending_mutation_of_attr	load_attrr  is_constant_matchr   r!   r   	enumerater  rO   r=   rD  r  r?   r=  r  r  r  r  rU   NamedTupleVariablerB   DistributedVariabler  rY   rp  r   r8  unittestTestCaser   enable_trace_unittestr  r  r  r   Tensorr   r  capture_sparse_computer   SPARSE_TENSORr;   r  rH  r   _opsOpOverloadPacket
OpOverload_dynamotrace_rulesis_aten_op_or_tensor_methodr+   r    is_torchr   replay_record_enabledexec_recorderrecord_module_accessr3   r  r   )rf   r  r  r  r  r}  hasattr_varr   
tuple_argsfake_valmemberr`   r  ri   call_getattr'
  s  	





	

zBuiltinVariable.call_getattrr   c              	      sP  t  tjtjtjtjtjtjtjfr 	|d||gi S |j
j r0| r0| }  r%ddlm} |dkrStdd  d| d| dd	g tjd
 n|dkr jd u rqtdd  d| d| dddgd
 n j|jkrtdd  d| d| dddgd
  fdd|j
jD }|D ]	}|j
j| qt|1 t  |||j
jdtjjgt |gi R  }	W d    n1 sw   Y  W d    n1 sw   Y  dtjdtjfdd}
|j
d|
|	  fi  |
   j!j"d  |	S |dv r	d}nt#|r%tdd  d| d| ddd| dgd
 |j
j$ || |S t  tj%r|j
& sLtdd   d!d"gtj'd
 | rt |tj(rt)|  j!|}z
 *|| }W n t+t,fyx   d }Y nw |d ur| rt)|  j!|}t-. j/d}||u r|tj0j1j2u r|S  3| d S )#Nr  r:   r  requires_gradz!setattr() on Tensor.requires_gradzsetattr(r8  r|  zsetattr() on Tensor.requires_grad not supported. Mutating requires_grad can introduce a new leaf from non-leaf or vice versa in the middle of the graph, which AOTAutograd does not currently know how to handle.r  dataz&Failed to mutate tensor data attributezVDyanmo only supports mutating `.data` of tensor created outside `torch.compile` regionzWDon't mutate `.data` on this tensor, or move the mutation out of `torch.compile` regionz9Failed to mutate tensor data attribute to different dtypezPDyanmo only supports mutating `.data` of tensor to a new one with the same dtypec                    s   g | ]
}|j  j kr|qS r`   r   )r   tfr  r`   ri   r    s    z0BuiltinVariable.call_setattr.<locals>.<listcomp>r  r   r_   c                 S   s.   | j }|dkr|d }tjj| f|f | S rC  )_versionr   _C	_autograd_unsafe_set_version_counter)r   versionr`   r`   ri   _lower_version_count_by_1*  s
   z?BuiltinVariable.call_setattr.<locals>._lower_version_count_by_1r  )r  r  r  zFailed to set tensor attributez6Dyanmo doesn't support setting these tensor attributeszDon't mutate attribute 'z@' on tensors, or move the mutation out of `torch.compile` regionz#nn.Module mutation in HigherOrderOpznn.Module: zPInplace modifying nn.Module params/buffers inside HigherOrderOps is not allowed.z<Remove the mutation or move it outside of the HigherOrderOp.)4r   r   rB   PlacementVariabler  rY   NestedUserFunctionVariablerP  TracebackVariabler  r   r/  r  r7  r9  r  r  r  r   r   r  r   rr   tracked_fakesremovedynamo_disable_gradr   no_gradr!  r  set_r5   r  r  r  r1   
store_attrr  is_root_tracerFUNDAMENTALrU   r/   r  r;  r   r  getattr_staticmodule_typer  Moduler  convert_to_unspecialized)rf   r  r  r  r   r}  r  	to_remover  r  r  assigning_fake_valgetattr_varexisting_fake_attrmod_setattrr`   r  ri   call_setattr
  s   




 



	

zBuiltinVariable.call_setattrc                 C      | |d|gi S )N__delattr__r  )rf   r  r  r  r`   r`   ri   call_delattrv  s   zBuiltinVariable.call_delattrc              
   C   s   z|  }W n ty } zttjt|ddd d }~ww |jo%t|j}|d u r6t|t	j
r6|jr6|j}|tju rI|jdt}tt|d}t|||S )Nunknown_python_type)	case_namer/  r  )r  r  r   r   INVALID_INPUTrp   r   r&   r   r   rY   
cls_sourcer   r  r   install_global_by_idr!   r#   r=   rD  )rf   r  r  py_typeerrorr   r}  r`   r`   ri   	call_type~  s.   

zBuiltinVariable.call_typec                 C   s*   | |rtt||}t|S d S re   )r.  r;  reversedr%  r   rO   )rf   r  r  r$  r`   r`   ri   call_reversed  s   

zBuiltinVariable.call_reversedc                 K   sD   | |r t|tjs tj||t d}||dg | |S d S )Nr+  sort)r  r   r   rU   rK   r  r<   r  )rf   r  r  rd   list_varr`   r`   ri   call_sorted  s   zBuiltinVariable.call_sortedc                 C   sP   t |trtj|t| d dS t |tr&||djr&|	|dg i S d S )Nr*  __neg__)
r   rT   r=  r   r   r  rY   r  r   r  rf   r  r  r`   r`   ri   call_neg  s   
zBuiltinVariable.call_neg_format_stringc                 O   s    |  }t|}tj|||S re   )r9  rp   r   StringFormatVariabler=  )rf   r  r6  rc   rd   format_stringr`   r`   ri   call_format  s   zBuiltinVariable.call_formatc                 G   s  t |dkr!t|d tjr!|d }|j|j}tjt	|S t |dkrct|d tj
tjfrc|d jrVt|d tj
rKt|d jtj nt|d jtj t	|d j}tj|S t |dkr{|d  r{tt|d }||S t|d tjrtjt	|d jS t|d tjrtjt	|d jS t|d tjrtjt	|d jS tdt|d| dgtj d d S )Nr   r:   zid() with unsupported argsz5Dynamo doesn't know how to trace id() call with args zkSupported args are Tensors, and functions/nn.Modules/user-defined objects from outside the compiled region.r  )!r   r   r   r  r   rK  rL  r?   r=  idr  rY   r   r   r   r   CLASS_MATCHID_MATCHr   r  r	   rU   call_idr3   r  r   SkipFunctionVariabler~  
fake_valuer   rp   r   r  )rf   r  rc   nn_mod_variabler   constant_resulttensor_variabler`   r`   ri   r=    s@   



zBuiltinVariable.call_idr   c                 C   s$   t dd| dddgtjd d S )Nzcopy.deepcopy()zcopy.deepcopy(r|  z'Dynamo does not support copy.deepcopy()zAvoid calling copy.deepcopy()r  )r   r   r  )rf   r  r   r`   r`   ri   call_deepcopy  s   

zBuiltinVariable.call_deepcopyrM  rN  c           
      C   s  ddl m} ddlm} | j}|tjtjfv rA| o0| o0t	t
| jt	t
| jk}|tju r;t|S t| S ||vrdtd|j d| d| dd|j d	| d| g tjd
 t|trt|tr|jos|jd ur|j|jkrz
t|j|j W n) ty   td|j d| d| dd| d| d|j dg tjd
 Y nw | r|n|}|jd|| | fi }	|t|||	S )Nr:   rG  %supported_tensor_comparison_op_valuesz unsupported Tensor comparison opr{  r8  r|  *Dynamo does not support the comparison op z with Tensor arguments r  z8failed to broadcast when attempting Tensor comparison opz.Dynamo was unable to broad cast the arguments z, when attempting to trace the comparison op .r  )r  r  r   rE  r   r   rG  is_notr  r:  r-   r  r  r?   r=  r   rk   r   r  r   rU   sizer   broadcast_shapesRuntimeErrorr:  r   r!  r   )
rf   r  rM  rN  r  rE  r   	is_result
tensor_clsr  r`   r`   ri   rW    sh   



	z'BuiltinVariable._comparison_with_tensorc              	   C   s   ddl m} | j}||vr,td|j d| d| dd|j d| d| g tjd	 t|tj	r;t
|t d S |jd
|| | fi }tj||d dS )Nr:   rD  z!unsupported SymNode comparison opr{  r8  r|  rF  z with SymNode arguments r  r  r2  )r   rE  r   r   rk   r   r  r   r   r  r?   rV  r   r!  r  rT   r=  )rf   r  rM  rN  rE  r   r  r`   r`   ri   rS  ;  s.   
	z(BuiltinVariable._comparison_with_symnodec                 C   |   t |trt |trd S | r+| r+tj||jjdtjgt	||gi R  d dS t |t
ttfr<||d|gi S d S )Nr  r2  r  )r   r?   is_symnode_likerT   r=  r   r!  r   r   r5   rC   rH   rY   r  r  r`   r`   ri   call_xorX  s$   zBuiltinVariable.call_xorc                 C   &   t |tttfr||d|gi S d S )Nr  r   rC   rH   rY   r  r  r`   r`   ri   	call_ixorn     zBuiltinVariable.call_ixorc                 C   rQ  )Nr   rR  r  r`   r`   ri   call_subu  rT  zBuiltinVariable.call_subc                 C   rQ  )Nr   rR  r  r`   r`   ri   	call_isub|  rT  zBuiltinVariable.call_isubc                 C   rN  )Nr  r2  __and__)r   r?   rO  rT   r=  r   r!  r   r   r5   rC   rH   rY   r  r  r`   r`   ri   	call_and_  s   zBuiltinVariable.call_and_c                 C   rN  )Nr  r2  __iand__)r   r?   rO  rT   r=  r   r!  r   r   r5   rC   rH   rY   r  r  r`   r`   ri   	call_iand  s   zBuiltinVariable.call_iandc                 C   s   t |trt |trd S | r+| r+tj||jjdtjgt	||gi R  d dS t |t
tttttfr?||d|gi S d S )Nr  r2  __or__)r   r?   rO  rT   r=  r   r!  r   r   r5   rA   rC   rW   rH   rX   rY   r  r  r`   r`   ri   call_or_  s0   	zBuiltinVariable.call_or_c                 C   s   t |trt |trd S | r+| r+tj||jjdtjgt	||gi R  d dS t |t
ttttfr>||d|gi S d S )Nr  r2  __ior__)r   r?   rO  rT   r=  r   r!  r   r   r5   rA   rC   rW   rH   rY   r  r  r`   r`   ri   call_ior  s.   	
zBuiltinVariable.call_iorc                 C   sl   t |trtj||jjdtjgt|gi R  d dS t |tr#|j	}t |t
tfr4tt|jdkS d S )Nr  r2  r   )r   rT   r=  r   r!  r   r   r5   rD   dv_dictrK   rA   r?   r   r$  r4  r`   r`   ri   	call_not_  s   


	zBuiltinVariable.call_not_c                 C   r"  )N__contains__r  r  r`   r`   ri   call_contains  s   zBuiltinVariable.call_containsTc                 C   s   dS )NTr`   r   r`   r`   ri   is_python_hashable  s   z"BuiltinVariable.is_python_hashablec                 C   s
   t | jS re   )hashr   r   r`   r`   ri   get_python_hash  r  zBuiltinVariable.get_python_hashotherc                 C   s   t |tjo| j|ju S re   )r   r   r   r   )rf   rf  r`   r`   ri   is_python_equal  s   zBuiltinVariable.is_python_equal)r  r[   r_   Nre   ){rk   rl   rm   rn   rV  	_SENTINELr=   _nonvar_fieldsclassmethodr   r%   r   staticmethodrD  cacher  r   r   r   r   r   ro   rb  r;  rp   r	  r   rc  rd  rl  ru  rv  rx  r~  r9  r  r  r  r  r  r  r   r  r  r  r  r  r  __annotations__r  r  r)  call_int
call_floatr.  r5  r?  rB  r@  rA  call_mincall_maxr\  r`  rb  re  rg  rf  ri  rk  ru  rv  rx  r}  
call_tuple	call_listr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r!  r$  r,  r.  r1  r5  r9  r=  rC  rW  rS  rP  rS  rU  rV  rX  rZ  r\  r^  r`  rb  r
   rc  r   re  rg  __classcell__r`   r`   ry  ri   r     s6  
 
B,"%
   >










 t

 




 


&
<

	
l







3


(
!

	
	R
+




m





%

 (
 )






'

7







"


r   r  c              	   c   sH    ddl m} || d}z||  d V  W ||  d S ||  w )Nr:   )GradModeVariableF)r/  ru  r=  enterexit)r  ru  gmvr`   r`   ri   r    s   
r  )r_   N)rn   
contextlibrD  r  r  loggingr   r   r  rb   typingr  collectionsr   r   collections.abcr   r   r   r   r   r	   r
   r   r   r   r   r   torch._subclasses.meta_utilsr   torch.overridesr   torch.utils._python_dispatchr   r/  r   r   r   r   r>  r   r   r   r   r   r   r   guardsr   r   replay_recordr    r   r!   r"   r#   r$   r%   r&   utilsr'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   baser;   r<   r=   constantr>   r?   r@   dictsrA   rB   rC   rD   rE   rF   rG   rH   listsrI   rJ   rK   rL   rM   rN   rO   streamsrP   rQ   r   rR   rS   rT   rU   rV   ra  rW   rX   rY   rZ   torch._dynamo.codegenr[   torch._dynamo.symbolic_convertr\   	getLoggerrk   r  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  rd  r   rb  rc  r   cmp_eqr   cmp_ner   cmp_ltr   cmp_ler   cmp_gtr   cmp_gerE  r   r   r   r   r   r   r   r   r   r   r   r   r   r]   ro   rm  r^   r   r   contextmanagerIteratorr  r`   r`   r`   ri   <module>   s   $	 T($
	

		$$
A                        