o
    -i                    @   sb  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 ddl
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,m-Z- d
dl.m/Z/m0Z0 d
dl1m2Z2 d
dl3m4Z4m5Z5m6Z6m7Z7m8Z8 d
dl9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZK ddlLmMZMmNZNmOZO ddlPmQZQ ddlRmSZSmTZT ddlUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\ ddl]m^Z^m_Z_m`Z`maZambZbmcZc ddldmeZemfZfmgZgmhZhmiZi ddljmkZkmlZlmmZmmnZn er2ddlompZp ddlqmrZr esetZuejvejwejxejyejzej{ej|ej}ej~ejejejejejejejejejejejejejejejejejiZede
je
jgeOf ZeeeO eeeO df f Zeje#jeje#jeje#jeje#jeje#jeje#jiZejej{ejej}ejejejwejejejejejejejyejejzejej|ej~ejejvejxf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  ZG d!d" d"eOZejd#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)IterableKeysViewSequence)AnyCallableTYPE_CHECKINGUnion)	sym_floatsym_int)is_sparse_any)BaseTorchFunctionMode)is_traceable_wrapper_subclass   )configgraph_break_hints	polyfills	variables)AttributeMutationErrorObservedAttributeErrorObservedUserStopIterationraise_observed_exceptionunimplemented_v2Unsupported	UserErrorUserErrorType)GuardBuilderinstall_guard)DummyModule)
AttrSourceGetItemSourceGlobalSourceis_constant_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set_methodsstr_methodstensortype_to_dtype   )#AsPythonConstantNotImplementedErrorValueMutationNewVariableTrackerConstantVariable)EventVariableStreamVariable)ConstDictVariableDefaultDictVariableDictKeysVariableDictViewVariableFrozensetVariableis_hashableSetVariable)BaseListVariableListIteratorVariableListVariableSizeVariableTupleIteratorVariableTupleVariable)FakeItemVariablesupported_comparison_opsSymNodeVariableTensorVariableUnspecializedPythonVariable)MutableMappingVariableUserDefinedDictVariableUserDefinedObjectVariableUserDefinedVariable)	PyCodegen)InstructionTranslatorrV   .BUILTIN_TO_TENSOR_FN_MAPBUILTIN_TO_TENSOR_RFN_MAPc                     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                       s   e Zd ZdZd 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)
         Nc                    s   |pi }| ||i |S NrY   )selffunctypesargskwargsmost_recent_funcrY   X/home/ubuntu/LTX-2/.venv/lib/python3.10/site-packages/torch/_dynamo/variables/builtin.py__torch_function__   s   zKpopulate_builtin_to_tensor_fn_map.<locals>.GetMethodMode.__torch_function__)rY   N)__name__
__module____qualname____doc__rc   rY   r`   rY   rb   GetMethodMode   s    rh   r7   )dtypec                       |  S rZ   rY   o)inp0rY   rb   <lambda>       z3populate_builtin_to_tensor_fn_map.<locals>.<lambda>c                    rj   rZ   rY   rk   inp0_intrY   rb   rn      ro   c                    
   |  S rZ   rY   rk   )rm   inp1rY   rb   rn         
 c                    rr   rZ   rY   rk   )rq   inp1_intrY   rb   rn      rt   c                    s
   |  dS Nr   rY   rk   rp   rY   rb   rn      rt   c                    
   | d S Nr7   rY   rk   )rs   rY   rb   rn     rt   c                    rw   rx   rY   rk   )ru   rY   rb   rn     rt   c                    rw   rv   rY   rk   rp   rY   rb   rn   	  rt   )lenrW   r   torchonesint32un_ops
un_int_opsbin_opsbin_int_opstensor_and_int_opsoperatormatmulimatmulgetitemrX   )rh   setups_and_oplistssetup_fnop_listoprsetups_and_oplistsrskipsrY   )rm   rq   rs   ru   ra   rb   !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d Z	e
ejdd Zdd Ze
ej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d Ze
dd Zdd Zd fddZdefddZdd Z fddZdd d!Zd"d# Zd$d% Zd&d' Z d(d) Z!e
d*d+ Z"d,d- Z#e
d.ee$ d/e%fd0d1Z&dd4d5Z'dd6d7Z(i Z)eeedf ed3e*e eeef gef f e+d8< d2d3d9e*d: d;d<dd:fd=d>Z,	9	?	;	<		:d fd@dAZ-ddBdCZ.e.Z/e.Z0ddDdEZ1ddFdGZ2ddHdIZ3ddJdKZ4ddLdMZ5e3Z6e3Z7ddOdPZ8ddQdRZ9ddSdTZ:ddUdVZ;ddWdXZ<dYdZ Z=dd[d\Z>dd]d^Z?	d	3dd_d`Z@dadb ZAddcddZBddedfZCeBZDeBZEddgdhZFdidj ZGddkdlZHddmdnZIe
ddodpZJe
	2	3ddqdrZKddsdtZLddudvZMddwdxZNddydzZOdd{d|ZPdd}d~ZQdddZRdddZSdddZTdddZUdddZVdddZWdddZX	dd2d3dedefddZYd2d3dededefddZZd2d3dedefddZ[d2d3defddZ\d2d3defddZ]d2d3ded;efddZ^dddZ_dddZ`dddZadddZbdddZcdddZddddZedddZfdddZgdddZhdddZidddZjdddZkdddZldddZmd2d3dedefddZn  ZoS )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.
    fnc                 C   s   t |tj | ||dS Nsource)r   
make_guardr   BUILTIN_MATCH)clsvaluer   rY   rY   rb   create_with_source(  s   z"BuiltinVariable.create_with_sourcec                  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 )Nr7   )rM   c                 s   s$    | ]}t |ttjr|V  qd S rZ   )
isinstancetypemathsqrt.0xrY   rY   rb   	<genexpr>n  s   " z;BuiltinVariable._constant_fold_functions.<locals>.<genexpr>)>absallanyboolcallablechrcomplexdivmodfloatgetattrintry   maxminordpowreprroundstr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tensorrM   updatevaluesr   __dict__)fnsrM   rY   rY   rb   _constant_fold_functions-  s   	
 !"#$%&'()*+,-./0123456789;z(BuiltinVariable._constant_fold_functionsc                 C      | j |  v S rZ   )r   r   r[   rY   rY   rb   can_constant_fold_throughq     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 rZ   )(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   rY   rY   rb   _fx_graph_functionst  s   	
 !"#$%&')z#BuiltinVariable._fx_graph_functionsreturn.c                  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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__)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rY   rY   rb   _binops  s0   zBuiltinVariable._binopsc               
      s  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fdd	
}| | tf|f | | tf|f |d
	d dd}| | tf|f | | tf|f |dd dd}	| | ttf|	f | | ttf|	f | | ttf|	f | | ttf|	f q,d dd}
d 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tf|fttf|
fttf|
fg}| tj | d dd}ttf|fttf|fttf|fttf|fg}| tj |  fdd}t D ]}t |sSJ || vsZJ ||| |< qJ| S )!Nr7   )BaseUserFunctionVariableUserFunctionVariableNNModuleVariable)supported_const_comparison_ops)BaseTorchVariable)UserDefinedClassVariablerS   rT   )forward_namereverse_namec                   s.   t | r|| ||gi S || ||gi S rZ   )r   call_method)txabr  r  )rT   rY   rb   user_defined_handler  s   
z=BuiltinVariable._binop_handlers.<locals>.user_defined_handler)r  r
  rV   c                S   s   | | ||gi S rZ   r	  )r
  r  r  r  rY   rY   rb   user_defined_inplace_handler     zEBuiltinVariable._binop_handlers.<locals>.user_defined_inplace_handlerr   c                S   s2   ddl m} || | jjd|gt||gi R  S Nr7   wrap_fx_proxycall_function)builderr  outputcreate_proxyr3   )r
  r  r  r   r  rY   rY   rb   dynamic_handler   s   z8BuiltinVariable._binop_handlers.<locals>.dynamic_handlerc                 S      t g |j|| S rZ   )rK   itemsunpack_var_sequencer
  r  r  rY   rY   rb   tuple_add_handler<     z:BuiltinVariable._binop_handlers.<locals>.tuple_add_handlerc                 S   r  rZ   )rI   r  r  r  rY   rY   rb   size_add_handler?  r  z9BuiltinVariable._binop_handlers.<locals>.size_add_handlerc                 S   s   t g || |jS rZ   )rK   r  r  r  rY   rY   rb   rn   d  s    z1BuiltinVariable._binop_handlers.<locals>.<lambda>c                 S   s   t g |j|| t dS Nmutation_type)rH   r  r  r9   r  rY   rY   rb   rn   p  s    c                 S   s   t |g |j|jS rZ   )r   r  r  rY   rY   rb   rn   w  s    c                 S   s>   |  s	|| sd S || }| jj| |j| |S rZ   )is_immutablehas_unpack_var_sequencer  r  side_effectsmutationr  extend)r
  r  r  seqrY   rY   rb   list_iadd_handler  s   
z:BuiltinVariable._binop_handlers.<locals>.list_iadd_handlerc              
   S   sx   t |tr
||}}z|j|j|  t dW S  ty; } ztt|| t	t
tj|jd W Y d }~d S d }~ww )N)r  r#  r^   )r   r<   	__class__r  as_python_constantr9   MemoryErrorr   r   listmapcreater^   )r
  lstconstexcrY   rY   rb   expand_list_like  s   

z9BuiltinVariable._binop_handlers.<locals>.expand_list_likec           
         s  dfdd}t t f|fg}tv r?t t f|fg}t}|ttf|jfttf|jfg fdd}|ttf|f |S t t f|fg}	 v r؈j	
dr؈t d  d 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fdd}	|ttf|	f |S )Nr
  rV   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 )Nr+  )	r<   r   	TypeErrorr   r   r/  r0  r1  r^   )r
  r  r  r4  r   rY   rb   compare_by_value  s   zYBuiltinVariable._binop_handlers.<locals>.create_cmp_op_handlers.<locals>.compare_by_valuec                    s   |  t| t  ||gi S rZ   )inline_user_function_returnr:   buildpolyfill_fn_mappingr  r7  rY   rb   handler  s   zPBuiltinVariable._binop_handlers.<locals>.create_cmp_op_handlers.<locals>.handleris_c                    s   t  S rZ   r;   r  )none_resultrY   rb   never  s   zNBuiltinVariable._binop_handlers.<locals>.create_cmp_op_handlers.<locals>.neverc                    s   t  |j|jS rZ   )r<   r   r  r7  rY   rb   rn         zQBuiltinVariable._binop_handlers.<locals>.create_cmp_op_handlers.<locals>.<lambda>c                    s"   t  | j|j| j|jS rZ   )r<   r  get_submodule
module_keyr  r7  rY   rb   rn   #  s    c                    sx   t |t |urt jdkS ||u rt ||S t|tjr6t|tjr8|j|jur:t ||S d S d S d S )Nr=  )r   r<   r1  rd   r1   r   ExceptionVariableexc_type)r
  leftrightr7  rY   rb   	handle_isL  s   

zRBuiltinVariable._binop_handlers.<locals>.create_cmp_op_handlers.<locals>.handle_isr
  rV   )r<   r;  r   r(  rN   r:   _comparison_with_symnodeappendr   rd   
startswithobjectrO   rF   r?   r>   r=   _comparison_with_tensor)
r   r8  resultop_varr<  r?  obj_op_nonenone_op_objtypes_that_are_never_nonerG  r  r   r  r  rS   rT   r  r  )r>  r   rb   create_cmp_op_handlers  s   


	
7z?BuiltinVariable._binop_handlers.<locals>.create_cmp_op_handlersrH  )!	functionsr   r  	nn_moduler  r   r  rz   r  user_definedr  rS   rT   r   r   r  rJ  r:   rN   rI   rK   r<   rH   rF   rG   r   r   r(  r   r   rM   r   r   )op_handlersr   magic_method_namesin_place_opr  r  inplace_namer  r  r  r  r   list_like_addition_handlersr*  list_like_iadd_handlersr5  list_like_expansion_handlersrT  rY   rS  rb   _binop_handlers  s   













=





 "zBuiltinVariable._binop_handlersc                 C   sR   t  | }|d u rd S g }|D ]\\}}}t||r&t||r&|| q|S rZ   )r   r_  get
issubclassrJ  )r   a_typeb_typehandlersmatchestype1type2r<  rY   rY   rb   _find_binop_handlere  s   
z#BuiltinVariable._find_binop_handlerc                 C   r   rZ   )r   r   r   rY   rY   rb   can_insert_in_graphq  r   z#BuiltinVariable.can_insert_in_graphNc                    s   t  jdi | || _d S )NrY   )super__init__r   )r[   r   r_   r,  rY   rb   rk  t  s   
zBuiltinVariable.__init__c                 C   s,   | j d u rd}n| j j}| jj d| dS )NNone())r   rd   r,  )r[   namerY   rY   rb   __repr__x  s   
zBuiltinVariable.__repr__c                 C   s   | j S rZ   r  r   rY   rY   rb   r-    s   z"BuiltinVariable.as_python_constantc                    s4   t tj ttjttji}| j|v r|| j S t  S rZ   )	r   rz   r   int64r   float64r   rj  as_proxy)r[   DTYPErl  rY   rb   rt    s   


zBuiltinVariable.as_proxycodegenrU   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   rd   re   r
  	f_globalsappend_outputcreate_load_global)r[   rv  rp  rY   rY   rb   reconstruct  s   zBuiltinVariable.reconstructc                 O   s
   t ||S rZ   )r%   r[   r^   r_   rY   rY   rb   constant_args     
zBuiltinVariable.constant_argsc                 G   4   d}|D ]}t |tjr dS |pt |tj}q|S NF)r   r   GetAttrVariablerO   )r[   r^   
any_tensorargrY   rY   rb   tensor_args     zBuiltinVariable.tensor_argsc                 C   r  r  )ra  r   r  rO   )r[   	arg_typesr  arg_typerY   rY   rb   tensor_args_type  r  z BuiltinVariable.tensor_args_typec                 O   s\   g }g }t || D ]}t|tj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   trY   rY   rb   r     s
    
zBBuiltinVariable.python_and_tensor_constant_only.<locals>.<genexpr>)		itertoolschainr   r   r   rO   rJ  r   r}  )r[   r^   r_   r  non_tensor_argsirY   rY   rb   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 rY   r-  r   rY   rY   rb   
<listcomp>      z=BuiltinVariable.unwrap_unspec_args_kwargs.<locals>.<listcomp>c                 S      i | ]	\}}||  qS rY   r  r   kvrY   rY   rb   
<dictcomp>      z=BuiltinVariable.unwrap_unspec_args_kwargs.<locals>.<dictcomp>)r  )r^   r_   rY   rY   rb   unwrap_unspec_args_kwargs  s   z)BuiltinVariable.unwrap_unspec_args_kwargsc                 C   s   |   ot||S rZ   )r   r'   r|  rY   rY   rb   has_constant_handler  s   
z$BuiltinVariable.has_constant_handlerr  
has_kwargsc                    s  ddl m  t	g t fddD r	fddS tr6tts+tu r6		dfd	d
}|S 		 rWt
ju rGtd tjrW	rO	jS rW	j tdkrstjgR  skntdkr~\fdd ndfdd}| t	dj d 

rd	
fdd}| 	 rtdd D rsdfdd}ndfdd}| fddtdkrۇfddS tdkr\dfdd}|S dfdd}|S )Nr7   LazyVariableTrackerc                 3   s    | ]}t | V  qd S rZ   )ra  r  r  rY   rb   r         z0BuiltinVariable._make_handler.<locals>.<genexpr>c                    s     | dd |D |S )Nc                 S   r  rY   realizer   r  rY   rY   rb   r    r  zCBuiltinVariable._make_handler.<locals>.<lambda>.<locals>.<listcomp>)r  r
  r^   r_   objrY   rb   rn     s    z/BuiltinVariable._make_handler.<locals>.<lambda>r
  rV   c                    sH    t u rtdd |D stdt|dg tjd tj |fi |S )Nc                 s   s(    | ]}t |tjot |jtV  qd S rZ   )r   r   r<   r   r   r   rY   rY   rb   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   r   r   SUPPORTABLEr   rC  r  r  rY   rb   create_exception_class_object  s   zDBuiltinVariable._make_handler.<locals>.create_exception_class_objectr   r   c                    s    | g|R  S rZ   rY   )r
  r^   _)binop_handlerrY   rb   rn     s    c                    s*    D ]}|| g|R  }|r|  S qd S rZ   rY   )r
  r^   r  r   rv)binop_handlersrY   rb   call_binop_handlers  s   z:BuiltinVariable._make_handler.<locals>.call_binop_handlerscall_c                    s"  z| g|R i |}|d ur|W S W d S  t yq   ztj| g|R i | W   t yp } z7||}|sdt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||}|s |  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  )r6  inspect	signaturebindr  logwarningr   rd   r   	DIFFICULTr   remove_from_stats)r
  r^   r_   rN  er  r4  )r   r  self_handlerrY   rb   call_self_handler  sB    
z8BuiltinVariable._make_handler.<locals>.call_self_handlerc                 s       | ]}t |tV  qd S rZ   )ra  r<   r   rY   rY   rb   r   +  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  rY   r  r   rY   rY   rb   r  3  r  PBuiltinVariable._make_handler.<locals>.constant_fold_handler.<locals>.<listcomp>r+  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/  r0  r<   r1  r^   r8   r   r   
DYNAMO_BUGr:   r:  r
  r^   r_   resr4  r  rY   rb   constant_fold_handler/  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  rY   r  r   rY   rY   rb   r  L  r  r  c                 S   r  rY   r  r  rY   rY   rb   r  M  r  zPBuiltinVariable._make_handler.<locals>.constant_fold_handler.<locals>.<dictcomp>r  r  r  r  r  r+  )r'   r  r8   r   r   r  r  r   r   r/  r0  r<   r1  r^   r:   r:  r  r  rY   rb   r  G  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  rY   )python_type_namer   r  rY   rY   rb   r  d  r  zPBuiltinVariable._make_handler.<locals>.call_unimplemented_v2.<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 ro  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   rd   )r^   real_arg_types)r  r   r  rY   rb   call_unimplemented_v2c  s    

z<BuiltinVariable._make_handler.<locals>.call_unimplemented_v2c                    s    |S rZ   rY   r  )r  rY   rb   rn   t  ro   c                    s    | ||}|r
|S  | d S rZ   rY   )r
  r^   r_   r  )r  r<  rY   rb   builtin_dispatchx  s   z7BuiltinVariable._make_handler.<locals>.builtin_dispatchc                    s.   D ]}|| ||}|r|  S q | d S rZ   rY   )r
  r^   r_   r   r  )r  rd  rY   rb   r    s   rH  )lazyr  r   r   r  isclassra  r  GeneratorExitri  r   r   r   rO   r  _handle_insert_op_in_graphrJ  ry   rh  r   rd   r   r   )r   r  r  r  r  r  r  r  rY   )r  r  r  r  r  r   r<  rd  r  r  r  rb   _make_handler  sf   




!
zBuiltinVariable._make_handlerr
  rV   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  r7   r   )	ry   r   r   r   r  var_getattrr   r   r6  r[   r
  r^   rY   rY   rb   	call_vars  s   zBuiltinVariable.call_varsc                 C   sh  ddl m}m} |r| jg || R  sd S ddl m} ddlm}m} ||||rn|j	s^t
  t|d tsX| jtv rDt| 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t|d tjr|d (|d|dd  |W S |j!j"d|gt$||R  }t dd
 |D r3|t)||W S t*||ra| +||\}}||i |}t dd
 t,-|| D }|t.||||dW S t/dd
 |D rst||d W S |tj0u rt|d tj.r|d 1 |d< |||W S  t2y   t3dd|  d| d| d| j dg t4j5d Y d S w )Nr7   )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jkV  qd S rZ   )r   r   rO   r  rY   rY   rb   r     s    
z=BuiltinVariable._handle_insert_op_in_graph.<locals>.<genexpr>r  __eq__c                 s   r  rZ   r   rL   r  rY   rY   rb   r     r  c                 s   "    | ]}t |tjr|jV  qd S rZ   r   r   rP   need_unwrapr   rY   rY   rb   r         

)	raw_valuer  c                 s   r  rZ   r   rN   r   rY   rY   rb   r     r  z,unimplemented builtin op on tensor argumentszpartial tensor op: r  r  z with tensor argumentsr  )6r  r  r  r  r   r  torch_functionr  r  exportr   r   rO   r   rX   rW   r1  r  bytecode_transformationr  rU  r  rd   IN_PLACE_DESUGARING_MAPr   r<   r   r   rN   rz   selectr&   r   r  r  r2   r3   NumpyNdarrayVariabler   ry   r	  rL   r(   r  r  r  rP   r   r   r-  NotImplementedErrorr   r   r  )r[   r
  r^   r_   r  r  r  r  r  r\   tmpfn_varr   r  r  proxy_args_kwargsr  r  rY   rY   rb   r    s   




	

z*BuiltinVariable._handle_insert_op_in_graphcall_function_handler_cacher^   r:   r_   dict[str, VariableTracker]c                 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|< }||||S )	Nc                 S   r  rY   r  r  rY   rY   rb   r  9  s    z1BuiltinVariable.call_function.<locals>.<dictcomp>c                 s       | ]}t |V  qd S rZ   r   r   rY   rY   rb   r   :      z0BuiltinVariable.call_function.<locals>.<genexpr>Tc                 s   r  rZ   r  r   rY   rY   rb   r   <  r  c                 S   s   g | ]}t |qS rY   r  r   rY   rY   rb   r  A  r  z1BuiltinVariable.call_function.<locals>.<listcomp>)r  r   r  r`  r  r   )r[   r
  r^   r_   keyr<  rY   rY   rb   r  1  s   zBuiltinVariable.call_functionlist[VariableTracker]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u rRt|dkrR|dv rRt|d trRztt|}||d  }tj|W S  ttfyQ } ztt||tt tj|j!d	 W Y d }~nd }~ww | j tu rb|d
krbtd S | j tu rz|dkrzt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 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 &|||dd  |S | j t/u rPt|dkrPt| j |}|t0v rPt|d trP|d &|||dd  |S | j tu rst|dkrst|d trsttt||d  S t1 &||||S )N__setattr__   r   __new__r7   r"  r   )fromhexhexr+  rk  fromkeys)2r   rL  ry   r  r   rS   r  r&  is_attribute_mutationis_python_constantmethod_setattr_standardtrack_new_user_defined_objectdictr?   r9   r   tuplehas_force_unpack_var_sequenceforce_unpack_var_sequencer   rK   r/  rH   r   r<   r   r-  r1  OverflowError
ValueErrorr   r   r0  r^   call_custom_dict_fromkeysr*   rR   _dict_vtr	  setr4   UserDefinedSetVariable_set_vtrE   	frozensetr,   rC   r   r5   rj  )r[   r
  rp  r^   r_   r  name_varvaldict_vt	init_argslist_vtr   r  r  resolved_fnrl  rY   rb   r	  E  s   





$





zBuiltinVariable.call_methodc                 C   st   t |ttjfr8t |tj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   rN   r   rO   r	  r   r   r   r   torch._dynamo.variables.builderr  r  r  rt  )r[   r
  r  r  fn_r  rY   rY   rb   _call_int_float  s    zBuiltinVariable._call_int_floatc                 C   sL   t |tr$t |jtjr|S t|jtjtjfsJ t||	 dkS d S rv   )
r   rN   sym_numrz   SymBoolr1   SymIntSymFloatr1  rt  r[   r
  r  rY   rY   rb   	call_bool  s   
zBuiltinVariable.call_boolc              
   C   s|  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 } ztd| W Y d }~d S d }~w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__rq  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++ z5 has a C/C++ based str method. This is not supported.zWrite the str method in Pythonz)Failed to create UserFunctionVariable: %sr   , c                 s   s    | ]}|  V  qd S rZ   r  )r   r  rY   rY   rb   r     r  z+BuiltinVariable.call_str.<locals>.<genexpr>)r   r   r  r<   r1  r   r   rS   hasattrr   r"  rq  r   r   
USER_ERRORr   rL  AttributeErrorr0   __func__r  r  r  r9  rC  ry   r^   rD  join)r[   r
  r  
str_methodbound_methoduser_func_variabler  r   rY   rY   rb   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 )Nr7   r   r   )ry   r  r  _call_min_max_seq_call_min_max_binary)r[   r
  r^   r  rY   rY   rb   _call_min_max"  s   zBuiltinVariable._call_min_maxc                 C   s:   t |dksJ t |dkr|d S tt| j||S Nr   r7   )ry   	functoolsreducepartialr/  )r[   r
  r  rY   rY   rb   r.  +  s   z!BuiltinVariable._call_min_max_seqc                 C   s  |d u s|d u r
d S |  ||rt|tjs||}}t|tjs$J t|tr5ttj||gi }t|t	s?t|t	r]ddl
m} |t|||jjd| jgt||gi R  dS | rt|tjrrdd l}t|j}nttj}| jtu rd|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	rA| jtu r'tj!ntj"}|jjd|gt||gi R  }t	#||d S t|t$r[t|t$r]| | | }t$|S d S d S )Nr7   r  r  r  r   r   r   c                 s   s"    | ]}t |tjtjfV  qd S rZ   )r   r   rP   r<   )r   r  rY   rY   rb   r   g  s    
z7BuiltinVariable._call_min_max_binary.<locals>.<genexpr>c                 s   r  rZ   r  )r   r  rY   rY   rb   r   q  r  c                 s   r  rZ   r  r   rY   rY   rb   r   }  r  )%r  r   r   rO   rL   TorchInGraphFunctionVariablerz   r   r  rN   r  r  r   r  r  r   r3   r  r  numpyNumpyVariableclipclampr   maximumr   minimumr   r   from_tensor_variabler-  r  rP   sym_maxsym_minr1  r<   )r[   r
  r  r  r  npr   r_   rN  np_fntorch_fnraw_braw_resr  py_fnr  r   rY   rY   rb   r/  2  s   






z$BuiltinVariable._call_min_max_binaryr  c                 C   *   t t||tdgi }||g i S )N__abs__r   r   r  r<   r1  )r[   r
  r  
abs_methodrY   rY   rb   call_abs     zBuiltinVariable.call_absc                 C   rF  )N__pos__rH  )r[   r
  r  
pos_methodrY   rY   rb   call_pos  rK  zBuiltinVariable.call_posc                 C   s:   t |tj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   rO   r   r.   r   r   r<   r1  )r[   r
  r  constant_valuerY   rY   rb   
call_index  s   
zBuiltinVariable.call_indexc                 O   s*   t t||tdgi }||||S )N	__round__rH  )r[   r
  r  r^   r_   round_methodrY   rY   rb   
call_round  rK  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 rZ   )r   r<   r1  r.   r  rY   rY   rb   r     s    
z-BuiltinVariable.call_range.<locals>.<genexpr>)r'   r   RangeVariable_dynamic_argsr  r  rY   rY   rb   
call_range  s   



zBuiltinVariable.call_rangec                 O   s(   t dd |D pt dd | D S )Nc                 s   r  rZ   r  r   rY   rY   rb   r     r  z0BuiltinVariable._dynamic_args.<locals>.<genexpr>)r   r   r|  rY   rY   rb   rU    s   zBuiltinVariable._dynamic_argsc                 G   s
   t |S rZ   )r   SliceVariabler  rY   rY   rb   
call_slice  r~  zBuiltinVariable.call_slicec                 O   s0   ddl m} |||jjd| jgt||R  S r  )r  r  r  r  r   r3   )r[   r
  r^   r_   r  rY   rY   rb   
_dyn_proxy  s   zBuiltinVariable._dyn_proxyc                 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   IteratorVariablerU  rY  rF   cls_forr   r9   r%  r   r#   rJ   r   r   r   TUPLE_ITERATOR_LENr   r?   r1   rE   rC   r  guard_on_key_orderr   MappingProxyVariableMAPPING_KEYS_CHECKUnspecializedNNModuleVariableSEQUENCE_LENGTHr/  r  r[   r
  r  r^   r_   r   rY   rY   rb   _call_iter_tuple_list  sF   


z%BuiltinVariable._call_iter_tuple_listc                 O   s&   t j| j}|t||t dS r!  )r   rF   r[  r   r/  r  r9   rb  rY   rY   rb   _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   rZ  rF   r[  r   r/  r  r9   LocalGeneratorObjectVariablerS   r  rd  rc  rb  rY   rY   rb   _call_tuple_list  s   z BuiltinVariable._call_tuple_listc                 O   s   t |tjr	|}nt |tjr||dg i }n| j||g|R i |}|d u rAttjj	
||g|i }t|rAt|}|S )N__iter__)r   r   rZ  rT  r	  rc  r  r   rw  iter_r  ry   ObjectIteratorVariable)r[   r
  r  r^   r_   retrY   rY   rb   	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 )Nr7   )r   FunctoolsPartialVariabler  TF)rU  r   rl  rV  r  r   r   r  r<   r1  rT   r   r   rN   rO   rH   rK   rG   )r[   r
  r  r   rl  r  rY   rY   rb   call_callable:  s2   	
zBuiltinVariable.call_callablec                 O   s6   t |dkr
|d S tdd| d| ddgd d S )	Nr   r7   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  )ry   r   )r[   r  r^   r_   rY   rY   rb   	call_castW  s   
zBuiltinVariable.call_castc                 C   s>   t |tjrt|t|jS t |trt|t|jS d S rZ   )	r   r   r  r:   r:  dirr   r   r   r   rY   rY   rb   call_dirb  s
   
zBuiltinVariable.call_dirc                 O   s   t j|tg|R i |S rZ   )r   call_custom_dictr  r[   r
  r^   r_   rY   rY   rb   	call_dicth  s   zBuiltinVariable.call_dictc                 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 )Nr7   r   )r/  ry   r   r   r  r  r  r  r&  has_pending_mutationget_forwarded_dictr9  r:   r:  r   construct_dict)r
  user_clsr^   r_   rY   rY   rb   rq  k  s   z BuiltinVariable.call_custom_dictc           	      O   sn  |t tthv s	J |r-|tu sJ t|dkr!t|dkr!d|v s#J g ||dR }t|dkr@td}tt| |gd t|dkrPg |td R }t|dksXJ |\}}|turbt	nt
}t|t r~d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 )Nr7   r   r   z-fromkeys expected at least 1 arguments, got 0r+  r   c                 S   s   g | ]}t |qS rY   )r<   r1  )r   r  rY   rY   rb   r    s    z=BuiltinVariable.call_custom_dict_fromkeys.<locals>.<listcomp>r"  c                 s   r  rZ   )rD   r  rY   rY   rb   r     r  z<BuiltinVariable.call_custom_dict_fromkeys.<locals>.<genexpr>zfailed to call dict.fromkeys()z.fromkeys(): r  zFailed to call 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.r  )r  r   r   ry   popr<   r1  r   r6  r?   r@   r   keysr   r9   r  r  r   r   rd   )	r
  rw  r^   r_   msgr  r   DictVariableTypery  rY   rY   rb   r  ~  sJ   $




z)BuiltinVariable.call_custom_dict_fromkeysc                 O   s  |rJ |st g t dS t|dkr$tt|tdt| dgd |d }t|tj r5|j	t dS |
|rF||}t |t dS t|tjrtt|jtrt||d}t|tjrt||||}t|t rl|S tt||S tt|tdgd d S )	Nr"  r7   z&set() takes 1 positional argument but  were givenr+  r   rg  z!failed to construct builtin set())rE   r9   ry   r   r6  r<   r1  r1   r   cloner  r  r   rS   r   r   r  UserMethodVariabler9  r   r  call_set)r[   r
  r^   r_   r  r  iter_fnoutrY   rY   rb   r    s@   	




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 )	Nr7   z,frozenset() takes 1 positional argument but r|  r+  r   c                 S   s   g | ]}|j qS rY   )vtr   rY   rY   rb   r    r@  z2BuiltinVariable.call_frozenset.<locals>.<listcomp>z'failed to construct builtin frozenset())rC   ry   r   r6  r<   r1  r1   r   	set_itemsr  r  )r[   r
  r^   r_   r  r  rY   rY   rb   call_frozenset  s.   	



zBuiltinVariable.call_frozensetc                    sL   |rt |dkrd|v sJ |dd} fdd|D }tj||t dS )Nr7   strictFc                    s    g | ]}t t |gi qS rY   )r   iterr  r  r
  rY   rb   r    s     z,BuiltinVariable.call_zip.<locals>.<listcomp>)r  r#  )ry   rx  r   ZipVariabler9   )r[   r
  r^   r_   r  rY   r  rb   call_zip  s   zBuiltinVariable.call_zipc              
   O   s^   z|d  |d|dd  |W S  ty. } ztt||t|jd W Y d }~d S d }~ww )Nr   __len__r7   r+  )r	  r'  r   r   r/  r^   )r[   r
  r^   r_   r  rY   rY   rb   call_len  s   &zBuiltinVariable.call_lenc                 O   s   |d  |d|dd  |S )Nr   __getitem__r7   r  rr  rY   rY   rb   call_getitem  s   zBuiltinVariable.call_getitemc              
      s  z   }W n ty$   tdd  d| dd  g tjd Y nw | }t tjrC j	d urC fdd}tj
| |S t tjrbt jtjrbtd	d  d| dd
g tjd t tjrzd|jjv rztj
|j| jS t tjrt
t||S t|tstt|dd r|f}n(tjdkrt|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(r$  ro  z=Dynamo doesn't have a rule to determine the type of argument r  c                    s6   fdd t |tu rt fdd|D S  |S )Nc                    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)r6   rt  nodemetar   rz   nn	parameter	Parameterr   ra  python_typeri   )tyexample_valdtypesr  rY   rb   
check_type  s   

zOBuiltinVariable.call_isinstance.<locals>._tensor_isinstance.<locals>.check_typec                 3   s    | ]} |V  qd S rZ   rY   )r   r  r  rY   rb   r   !  r  zNBuiltinVariable.call_isinstance.<locals>._tensor_isinstance.<locals>.<genexpr>)r   r  r   )
tensor_vartensor_typer  r  rb   _tensor_isinstance  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__)r  
   c                 s   s*    | ]}t |tptt|d dV  qdS )r  N)r   r   r   r   )r   tprY   rY   rb   r   J  s
    
z2BuiltinVariable.call_isinstance.<locals>.<genexpr>z?isinstance() arg 2 must be a type, a tuple of types, or a unionr+  )!r  r  r   r   r  r-  r   r   rO   ri   r<   r1  rS   r   r]   MemberDescriptorTyper  r,  r   r  !UserDefinedExceptionClassVariabler   r   r   sysversion_info	UnionType__args__r  r   r   r6  ra  )r[   r
  r  isinstance_typer  r  isinstance_type_tupler  rY   r  rb   call_isinstance  sr   

	
zBuiltinVariable.call_isinstancec              
   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(r$  ro  z7issubclass() with non-constant arguments not supported.z#Make sure your arguments are types.r  )r-  r  r   r   r&  r   r<   ra  )r[   r
  left_tyright_ty
left_ty_pyright_ty_pyrY   rY   rb   call_issubclasse  s   
zBuiltinVariable.call_issubclassc                 C   s   t ||S rZ   )r   SuperVariabler[   r
  r  r  rY   rY   rb   
call_supery  s   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   r7   )	next_variabler   ry   r   r   r   rF   r  r  )r[   r
  r^   r  exrY   rY   rb   	call_next|  s   zBuiltinVariable.call_nextc                 C   s>   |  r| }t|tjrtt|j|S |||S d S rZ   )	r  r-  r   r   r   r<   r%  r   call_obj_hasattr)r[   r
  r  attrrp  rY   rY   rb   call_hasattr  s   zBuiltinVariable.call_hasattrc                    s$    fdd|D }t j||t dS )Nc                    s$   g | ]}|  r| n|qS rY   )r%  r  )r   r)  r  rY   rb   r    s    z,BuiltinVariable.call_map.<locals>.<listcomp>r"  )r   MapVariabler9   )r[   r
  r   seqsrY   r  rb   call_map  s   
zBuiltinVariable.call_mapc                 C   s*   | |r
||n|}tj||t dS r!  )r%  r  r   FilterVariabler9   )r[   r
  r   r)  rY   rY   rb   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   rL  r   r'  r   r   r:   r:  r   r  )r[   r
  rp  r   r   rY   rY   rb   r    s   
zBuiltinVariable.var_getattrr  r  c              	      s  |  stdd| d| d| dddgd | }t|tr&|dkr&d	}jj|rSt|tj	rS|d
v rS|j
rSjj|rStdd| d| d| ddg d jj||rcjj||S |d ur|| ||}| dv svJ | s||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!fr`t|tj!rt"|j#j$t%j&rt'j(r|dv rtdd| d| dd| dgd t|trF|j)j*j+d }	t|	t,j-rFt.|	rFj/r;t'j0sFtdddg t1j2d z||W S  ty_   tj3|| d Y S w t|tj4rt5|j#|}
t|
t,j6j7t,j6j8frt,j9j:;|
rtj4|
 dS |t<v rtj3|| dS d S t|t=r|j>s||j#j?vrt5|j#|}
n|j#j?| }
t'j@rjAB|j#||
 t|
 S tC|tjDr|d v rtt5|jE|S z||W S  ty   tj3|| d Y S w )!Nz)getattr() with non-constant name argumentzgetattr(r$  ro  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 mutation)TF>   __base__	__bases__	__flags__r  c              	      s(   g | ]\}}t | ot |qS rY   )r:   r:  r!   )r   r  r  r   r
  rY   rb   r    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)rd   re   )Fr  r   r-  r   rO   r  r&  r  r   r`  is_state_mutatedrt  has_pending_mutation_of_attr	load_attrr  r   r    r   	enumerater  rK   r:   r:  r  r<   r1  r  r  r  r  NamedTupleVariableDistributedVariabler  rS   ra  r   r,  unittestTestCaser   enable_trace_unittestr  r  r  rz   Tensorr   r  capture_sparse_computer   r  r  r6  r   _opsOpOverloadPacket
OpOverload_dynamotrace_rulesis_aten_op_or_tensor_methodr)   r   is_torchr   replay_record_enabledexec_recorderrecord_module_accessr1   r  r   )r[   r
  r  r  defaultrp  hasattr_varr   
tuple_argsfake_valmemberrY   r  rb   call_getattr  s   	




	

zBuiltinVariable.call_getattrr  c              	      s"  t  tjtjtjtjtjfr |d||gi S |jj	
 r%| r%| }t  tjrddlm} |dkrQtdd  d| d| dd	g tjd
 n|dkr jd u rnt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d }
|jd|
|	 fi  |
  jj d  |	S |dv rd}nt!|rtdd  d| d| ddd| dgd
 |jj	" || |S t  tj#r|j$ s6t%d| rt |tjrt&| j|}z
 '|| }W n t(t)fyb   d }Y nw t |tjrt&| j|}t*+ j,d}||u r|tj-j.j/u r|S  0| d S d S )Nr  r7   r  requires_gradz!setattr() on Tensor.requires_gradzsetattr(r$  ro  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 rY   r   )r   tfr  rY   rb   r  	  s    z0BuiltinVariable.call_setattr.<locals>.<listcomp>r  c                 S   s.   | j }|dkr|d }tjj| f|f | S r1  )_versionrz   _C	_autograd_unsafe_set_version_counter)r   versionrY   rY   rb   _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?Can't inplace modify module params/buffers inside HigherOrderOp)1r   r   PlacementVariabler  rS   NestedUserFunctionVariablerC  r	  r  r&  r  r  r-  rO   r  r  r   r   r  r   ri   tracked_fakesremovedynamo_disable_gradrz   no_gradr  r  set_r3   rt  r  r  r/   
store_attrr  is_root_tracerr   r-   r  r'  r   r  getattr_staticmodule_typer  Moduler  convert_to_unspecialized)r[   r
  r  r  r  rp  r  	to_remover  r  r  assigning_fake_valgetattr_varexisting_fake_attrmod_setattrrY   r  rb   call_setattrD	  s   



 



zBuiltinVariable.call_setattrc                 C      | |d|gi S )N__delattr__r  )r[   r
  r  r  rY   rY   rb   call_delattr	  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_INPUTr   r   r$   r   r   rS   
cls_sourcerz   r  r  install_global_by_idr    r"   r:   r:  )r[   r
  r  py_typeerrorr   rp  rY   rY   rb   	call_type	  s.   

zBuiltinVariable.call_typec                 C   s*   | |rtt||}t|S d S rZ   )r%  r/  reversedr  r   rK   )r[   r
  r  r  rY   rY   rb   call_reversed
  s   

zBuiltinVariable.call_reversedc                 K   sH   | |r t|tjs"tj||t d}||dg | |S d S d S )Nr"  sort)r  r   r   rO   rH   r  r9   r	  )r[   r
  r  r_   list_varrY   rY   rb   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   rN   r1  r   r   rt  rS   r  r   r	  r[   r
  r  rY   rY   rb   call_neg
  s   
zBuiltinVariable.call_negc                 O   s    |  }t|}tj|||S rZ   )r-  r   r   StringFormatVariabler1  )r[   r
  _format_stringr^   r_   format_stringrY   rY   rb   call_format*
  s   zBuiltinVariable.call_formatc                 G   sb  t |dkr!t|d tjr!|d }|j|j}tjt	|S t |dkrOt|d tj
tjfrO|d jrBt|d jtj t	|d j}tj|S t |dkret|d tre|d }||S t|d tjrxt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   r7   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  )ry   r   r   r  r  rA  rB  r<   r1  idr  rS   r   r   r   r   ID_MATCHr   rO   call_idr1   r  r   SkipFunctionVariablerl  
fake_valuer   r   r   r  )r[   r
  r^   nn_mod_variabler   constant_resulttensor_variablerY   rY   rb   r  /
  s<   



zBuiltinVariable.call_idc                 C   s$   t dd| dddgtjd d S )Nzcopy.deepcopy()zcopy.deepcopy(ro  z'Dynamo does not support copy.deepcopy()zAvoid calling copy.deepcopy()r  )r   r   r  )r[   r
  r   rY   rY   rb   call_deepcopyQ
  s   

zBuiltinVariable.call_deepcopyc           
      C   s  ddl m} ddlm} | j}|tjtjfv rCt|t	o2t|t	o2t
t| jt
t| jk}|tju r=t|S t| S ||vrftd|j d| d| dd|j d	| d| g tjd
 t|t	rt|t	r|jou|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 t|t	r|n|}|jd|| | fi }	|t|||	S )Nr7   r5  %supported_tensor_comparison_op_valuesz unsupported Tensor comparison oprn  r$  ro  *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   r&  r   r   r=  is_notr   rO   r  r+   rt  r  r<   r1  r   rd   r   r  sizerz   broadcast_shapesRuntimeErrorr&  r  r  r   )
r[   r
  rE  rF  r  r&  r   	is_result
tensor_clsr  rY   rY   rb   rM  \
  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 )Nr7   r%  z!unsupported SymNode comparison oprn  r$  ro  r'  z with SymNode arguments r  r  r  )r   r&  r   r   rd   r   r  r   r   r  r<   rL  r  r  rt  rN   r1  )r[   r
  rE  rF  r&  r   r  rY   rY   rb   rI  
  s.   
	z(BuiltinVariable._comparison_with_symnodec                 C   &   t |tttfr||d|gi S d S )N__xor__r   rA   rE   rS   r	  r  rY   rY   rb   call_xor
     zBuiltinVariable.call_xorc                 C   r/  )N__ixor__r1  r  rY   rY   rb   	call_ixor
  r3  zBuiltinVariable.call_ixorc                 C   r/  )Nr   r1  r  rY   rY   rb   call_sub
  r3  zBuiltinVariable.call_subc                 C   r/  )Nr   r1  r  rY   rY   rb   	call_isub
  r3  zBuiltinVariable.call_isubc                 C      t |trt |trd S t |ttfr1t |ttfr1tj||jjdtjgt||gi R  d dS t |t	t
tfrB||d|gi S d S )Nr  r  __and__)r   r<   rN   r1  r  r  r   r   r3   rA   rE   rS   r	  r  rY   rY   rb   	call_and_
  "   zBuiltinVariable.call_and_c                 C   r8  )Nr  r  __iand__)r   r<   rN   r1  r  r  r   r   r3   rA   rE   rS   r	  r  rY   rY   rb   	call_iand
  r;  zBuiltinVariable.call_iandc                 C   s   t |trt |trd S t |ttfr1t |ttfr1tj||jjdtjgt||gi R  d dS t |t	t
ttttfrE||d|gi S d S )Nr  r  __or__)r   r<   rN   r1  r  r  r   r   r3   r?   rA   rQ   rE   rR   rS   r	  r  rY   rY   rb   call_or_
  s4   	zBuiltinVariable.call_or_c                 C   s   t |trt |trd S t |ttfr1t |ttfr1tj||jjdtjgt||gi R  d dS t |t	t
tttfrD||d|gi S d S )Nr  r  __ior__)r   r<   rN   r1  r  r  r   r   r3   r?   rA   rQ   rE   rS   r	  r  rY   rY   rb   call_ior  s2   	
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  r  r   )r   rN   r1  r  r  r   r   r3   rB   dv_dictrH   r?   r<   ry   r  r  rY   rY   rb   	call_not_   s   


	zBuiltinVariable.call_not_r  r  c                 C   r  )N__contains__r  r  rY   rY   rb   call_contains2  r  zBuiltinVariable.call_contains)r   N)rv  rU   rH  )r^   r  r_   r  r   r:   )r
  rV   r  r:   rZ   )prd   re   rf   rg   rL  	_SENTINELr:   _nonvar_fieldsclassmethodr   staticmethodr2  cacher   r   r   r  r   r  r/  r   r   r_  rh  ri  rk  rq  r-  rt  r{  r}  r  r  r  r  r  r   r   r  r  r  r  r   __annotations__r  r	  r  call_int
call_floatr!  r-  r0  r.  r/  call_mincall_maxrJ  rN  rP  rS  rV  rU  rX  rY  rc  rd  rf  rk  
call_tuple	call_listrm  rn  rp  rs  rq  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r$  rM  rI  r2  r5  r6  r7  r:  r=  r?  rA  rC  rE  __classcell__rY   rY   rl  rb   r     sp  
 

B,"%   



 
K
 



|


7
	
c







.





0
$

	


f






 
  





"

5







"
r   c              	   c   sH    ddl m} || d}z||  d V  W ||  d S ||  w )Nr7   )GradModeVariableF)r#  rS  r1  enterexit)r
  rS  gmvrY   rY   rb   r  8  s   
r  )rg   
contextlibr2  r  r  loggingr   r   r  r]   typingr  collectionsr   r   collections.abcr   r   r   r   r   r	   r
   rz   r   r   torch._subclasses.meta_utilsr   torch.overridesr   torch.utils._python_dispatchr   r#  r   r   r   r   r4  r   r   r   r   r   r   r   r   guardsr   r   replay_recordr   r   r    r!   r"   r#   r$   utilsr%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   baser8   r9   r:   constantr<   ctx_managerr=   r>   dictsr?   r@   rA   rB   rC   rD   rE   listsrF   rG   rH   rI   rJ   rK   r   rL   rM   rN   rO   rP   rW  rQ   rR   rS   rT   torch._dynamo.codegenrU   torch._dynamo.symbolic_convertrV   	getLoggerrd   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  _HandlerCallbackr   r  _TrackersTyper   cmp_eqr   cmp_ner   cmp_ltr   cmp_ler   cmp_gtr   cmp_ger;  r   r   r   r   r~   r   r   r   r   r   r   r   r}   rW   r  rK  rX   r   r   contextmanagerr  rY   rY   rY   rb   <module>   s  (
P$ 	

		$$;                    5