o
    Zh                    @   s  d Z ddlZddlZddlZddlZddlZddl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 ddlmZ ddlZddlZddlmZ ddlmZ ddlmZ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' ddl(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z. ddl/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZA ddlBmCZCmDZDmEZE ddlFmGZG zddlHZIW n eJy   dZIY nw zddlKmLZL W n eMy   eNdZLY nw erddlOmPZP dd ZQdd ZRG dd deEZSG dd deSZTG dd deTZUG dd dZVd d! ZWG d"d# d#eSZXG d$d% d%eXZYG d&d' d'eXZZG d(d) d)eXZ[G d*d+ d+eXZ\G d,d- d-Z]G d.d/ d/eEZ^G d0d1 d1eXZ_G d2d3 d3eXZ`G d4d5 d5eXZaG d6d7 d7eXZbG d8d9 d9eXZcdS ):a  
This module contains variable classes for handling user-defined objects in Dynamo's tracing system.

The key classes are:
- UserDefinedVariable: Base class for representing custom Python objects
- UserDefinedClassVariable: Handles Python class objects/types
- UserDefinedObjectVariable: Fallback class for instance objects, with support for method calls,
  attribute access, and other Python object behaviors.
- Specialized subclasses for common patterns:
  - UserDefinedDictVariable: For dict subclasses
  - UserDefinedTupleVariable: For tuple subclasses
  - FrozenDataClassVariable: Special handling of frozen dataclasses
  - MutableMappingVariable: For collections.abc.MutableMapping subclasses

Dynamo specializes to VariableTracker subclasses like FrozenDataClassVariable if available; if no
subclass qualifies, it falls back to UserDefinedObjectVariable.

These classes help Dynamo track and handle arbitrary Python objects during tracing,
maintaining proper semantics while enabling optimizations where possible.
    N)TYPE_CHECKING)is_typeddict)TracingContext)"is_traceable_wrapper_subclass_type   )	polyfills	variables)create_call_function)$do_not_convert_to_tracable_parameter)handle_observed_exceptionObservedAttributeErrorraise_observed_exceptionunimplemented)GuardBuilderinstall_guard)
AttrSourceCallFunctionNoArgsSourceGetItemSourceRandomValueSource
TypeSourceUnspecializedParamBufferSource)build_checkpoint_variablecheck_constant_argscmp_name_to_op_mappingdict_methodsget_custom_getattrhas_torch_functionis_frozen_dataclassis_namedtuple_clsis_utils_checkpointis_wrapper_or_member_descriptoristypelist_methodsnamedtuple_fieldsobject_has_getattributeproxy_args_kwargstensortype_to_dtypetuple_methodsunpatched_nn_module_getattr   )AttributeMutationExistingValueMutationNewVariableTracker)DefaultDictVariable)
PyTreeSpec)InstructionTranslatorc                 C   s   | t jtjfv S N)object__setattr__BaseException)val r5   S/var/www/auris/lib/python3.10/site-packages/torch/_dynamo/variables/user_defined.pyis_standard_setattrf      r7   c                 C   sl   g }zddl m} ddlm} || || W n	 ty#   Y nw tjd }r2||j	 | |v S )Nr   )RaisesContext)WarningsCheckerz!torch.testing._internal.jit_utils)
Z_pytest.python_apir9   Z_pytest.recwarnr:   appendImportErrorsysmodulesgetZ&_AssertRaisesRegexWithHighlightContext)ctxZf_ctxsr9   r:   mr5   r5   r6   is_forbidden_context_managerj   s   
rB   c                   @   s   e Zd ZU eed< dS )UserDefinedVariablevalueN)__name__
__module____qualname__r1   __annotations__r5   r5   r5   r6   rC   |   s   
 rC   c                       s6  e Zd ZU ee ed< d. fddZdd Zdd	 Zde	fd
dZ
eeddd Zeeddd Zeeddd Zedd Zdd Zd/ddZddde	ddf fddZd/ddZ	 	!	"	#		d0 fd$d%Z			 	!	"	#		d1 fd&d'Zd(d) Zddde	ddf fd*d+Zd/ fd,d-Z  ZS )2UserDefinedClassVariablerD   returnNc                    s   t  jdi | || _d S Nr5   )super__init__rD   selfrD   kwargs	__class__r5   r6   rM      s   
z!UserDefinedClassVariable.__init__c                 C      | j S r0   rD   rO   r5   r5   r6   as_python_constant      z+UserDefinedClassVariable.as_python_constantc                 C   rS   r0   rT   rU   r5   r5   r6   as_proxy   rW   z!UserDefinedClassVariable.as_proxyc                 C   s   | j j d| j dS N())rR   rE   rD   rU   r5   r5   r6   __repr__   s   z!UserDefinedClassVariable.__repr__c                   C   s   t jt jt jt jhS r0   )torchdeviceZfinfoZiinfoSizer5   r5   r5   r6   _constant_fold_classes   s
   z/UserDefinedClassVariable._constant_fold_classesc                  C   sD   t jt jjt jjh} tt dr| t jjt jjh tt	
 | B S )Nhpu)r]   ZTensorcudaZStreamEventhasattrupdatera   setr&   keys)Z_in_graph_class_listr5   r5   r6   _in_graph_classes   s   
z*UserDefinedClassVariable._in_graph_classesc                  C   s,   dd t tD } tjtjtjtjh| S )Nc                 S   s8   g | ]}t tt|trttt|trtt|jqS r5   )
isinstancegetattrbuiltinstype
issubclassr3   __new__).0namer5   r5   r6   
<listcomp>   s    
zFUserDefinedClassVariable.supported_c_new_functions.<locals>.<listcomp>)dirrk   r1   rn   dicttuplelistunion)
exceptionsr5   r5   r6   supported_c_new_functions   s   z2UserDefinedClassVariable.supported_c_new_functionsc                 C   s   | t  v S r0   )rI   rx   rT   r5   r5   r6   is_supported_new_method   s   z0UserDefinedClassVariable.is_supported_new_methodc                 C   s   | j |  v S r0   )rD   r`   rU   r5   r5   r6   can_constant_fold_through   s   z2UserDefinedClassVariable.can_constant_fold_throughtxr/   c                 C   >   |j j| |r|j jj| |dd}t|tj S || jjv S NTZ
deleted_ok	outputside_effectshas_pending_mutation_of_attr	load_attrri   r   DeletedVariablerD   __dict__rO   r{   keyZmutated_attrr5   r5   r6   has_key_in_generic_dict      z0UserDefinedClassVariable.has_key_in_generic_dictrp   r,   c           	         s  ddl m}m} | jd urt| j|nd }|dkr || jjS |dkr+|| jjS |dkr=d|i}t	j
| |fi |S | jtjtjhv rQ|dkrQt ||S z	t| j|}W n tyr   t| jtu rntt| nd }Y nw |dkrt|rt ||S |tv rt|tjst	j
| ||d	S t|trt||| j|S t|trt|j t!rt	"|j j#$|| gi S t	j%|j | |d	S t|tj&r|d | j}t|||S |rt'|st(j)d
kr|dkrt||| j|S |*|r||S t|t+j,r
||S |t-| jdi v s#| jj./ds#| jj.dkr-|r-t|||S |rBt0|sBt1|sBt|||S t ||S )Nr)   )ConstantVariableEnumVariablerE   rG   r   sourcefromkeysrn   r   )      __mro__ztorch.r]   )2 r   r   r   r   createrD   rE   rG   r   GetAttrVariablecollectionsOrderedDictdefaultdictrL   var_getattrinspectgetattr_staticAttributeErrorrl   r   rI   ry   r   ri   typesFunctionTypestaticmethodr,   build__get__classmethod__func__propertyUserFunctionVariablefgetcall_functionUserMethodVariableClassMethodDescriptorTypeismemberdescriptorr=   version_infoZ
is_literalenumEnumrj   rF   
startswithismethoddescriptorr    )	rO   r{   rp   r   r   r   optionsobjfuncrQ   r5   r6   r      sr   




z$UserDefinedClassVariable.var_getattrc                    s   ddl m} |d|d|d|d|d|dfdd}||i |\  fd	d
}t|S )aj  
        functional: input, target, weight=None, size_average=None, ignore_index=- 100, reduce=None, reduction='mean',
        label_smoothing=0.0

        non functional ctor: weight=None, size_average=None, ignore_index=- 100, reduce=None, reduction='mean',
        label_smoothing=0.0

        non functional loss call: input, target, optional_output
        r)   r   Nimeang        c                 S   s   | |||||fS r0   r5   )weightsize_averageignore_indexreduce	reductionlabel_smoothingr5   r5   r6   normalize_args(  s   	zIUserDefinedClassVariable._call_cross_entropy_loss.<locals>.normalize_argsc                    sF   ddl m} |jjdtjjjgt| | gi R  dS )Nr)   wrap_fx_proxyr   r{   proxy)	builderr   r   create_proxyr]   nnZ
functionalZcross_entropyr%   )inputtargetr   r   r   Z
reduce_argr   r   r{   r   r5   r6   fake_cross_entropy_lossB  s*   
zRUserDefinedClassVariable._call_cross_entropy_loss.<locals>.fake_cross_entropy_loss)r   r   r   r   ZLambdaVariable)rO   r{   argsrP   r   r   r   r5   r   r6   _call_cross_entropy_loss  s$   


z1UserDefinedClassVariable._call_cross_entropy_lossr   list[VariableTracker]rP   dict[str, VariableTracker]c                    s  |dkr,t |dkr,|s,d| jjvr,| j}| jr"t| jd}t|}t|| j |S | jt	j
t	jhv rM|dkrMddlm} |j|| jg|R i |S |dkrit |dkrit|d drit| j|d jkS |dkrt |dkrt|d drt| j|d jkS |d	kr| jt	j
u rt|d tr|d jt	j
u rt |dksJ t |dksJ tji t	j
t d
S |d	krt| jjr|jj| |d |dd  S t ||||S )N__subclasses__r   r   r)   )BuiltinVariable__eq__rD   __ne__rn   mutation_type)lenrD   r   r   r   r   r,   r   r   r   r   r   builtinr   Zcall_custom_dict_fromkeysrd   r   r   ri   rI   ConstDictVariabler+   ry   rn   r   r   track_new_user_defined_objectrL   call_method)rO   r{   rp   r   rP   r   r   rQ   r5   r6   r   \  sV   ""

z$UserDefinedClassVariable.call_methodc                    sP  ddl m} ddlm} t||}|  r0|r0tj| 	 dd |D i dd |
 D S | jtjju r>| |||S | jtju rMdd	lm} | S | jtju rb|t|tj| g||S | jtju rt|dkrt|d
 rti tj|d
 t dS t | jr| jj!rt"d t#t$j%|g|R i |S | jtj&u r%tjd }|st|d
krg }	nft|dkr|d
 '|r|d
 (|}	nQt|dkr|d
 '|r|d
 (|}	|d }n8t"d n3t)|dkr|d }t|d
krg }	t|dkr|d
 '|r|d
 (|}	n	t"d nt"d tj*j+|	|t dS | jt,j-u r3t.|d
 S | jt/j0u rT|sAt"d |d
 }
|dd  }tj1j2|
||dS | jt3j4u re|setj5||S | jtj6j7u r|st|dkr|d
 8 sJ tj9||d
 	 S t:t;| jt;rt<| jdrt<| jdr| = r|>| jr| j?rt@| jsddl1mA}mB} | jtjCtjDtjEtjFtjGtjHtjIfv rt"| j d | jtjJu rtK|d
 |rtjLjMjNst"d ||d
 |d
 j?dg|dd   }|jOj Pt#tQ| |}|R|d|| |S tS| jrtT| j}| jjUdkrEt|dks8J |r=J |d
 (|}	ni| jjV}tW|}	|	Xd gt|t|	   i }tY||	D ]'\}}|d u r||v ru|| }n||v s|J t||| }|||< qb|
 D ]\}}||v sJ ||	|Z|< qt[dd |	D sJ t\|	| jS t]| jrC| = rCt^_| j}tW|}	|	Xd gt|t|	   i }tY||	D ]H\}}|d u r&|j`|v r||j` }n-|jasq|jbt^jcur	t||jb}n|jdt^jcurt||jd}|e|g i }nq|||j`< q|f| |jOj Pt#tQ| |}|R|d|| |S | j| g v sQth| jrtir| jtjv rt|dkrtK|d
 tjkrt|d
 j
dkrt[dd |d
 j
D r|||jOjld tjmgtn||R  d!}|g}|||jOjld | jgtn||R  d!}|S | jtojpu rt|dkrtK|d
 tjr|d
 j}nd }top|}tq|S | jtrjsu rt|dkrtK|d
 tjtrtu|d
 S |>| jr | j?r tv  |t|tjw| g||W  d    S 1 sw   Y  tx e|||S )"Nr   )SideEffectsr)   r   c                 S      g | ]}|  qS r5   rV   ro   xr5   r5   r6   rq         z:UserDefinedClassVariable.call_function.<locals>.<listcomp>c                 S      i | ]	\}}||  qS r5   r   ro   kvr5   r5   r6   
<dictcomp>      z:UserDefinedClassVariable.call_function.<locals>.<dictcomp>)NullContextVariabler   r   z*TypedDict with optional keys not supportedz*deque() with more than 2 arg not supported)maxlenr   z*deque() with more than 1 arg not supportedz)deque() with invalid kwargs not supported)r   r   zfunctools.partial malformed)r   keywords	__enter____exit__)BaseUserFunctionVariable3FunctionDecoratedByContextlibContextManagerVariablez not supported. This may be due to its use of context-specific operations that are not supported in Dynamo yet (i.e. Exception handling)zcontextlib.contextmanagerr   rM   ztorch.return_typesc                 s   s    | ]}|d uV  qd S r0   r5   r   r5   r5   r6   	<genexpr>C      z9UserDefinedClassVariable.call_function.<locals>.<genexpr>c                 s   s    | ]	}t |tjV  qd S r0   )ri   r   ZTensorVariabler   r5   r5   r6   r   t  s    r   r   )yr   r   r   r   r   rz   r   r   r   rV   itemsrD   r]   r   ZCrossEntropyLossr   
contextlibnullcontextZctx_managerr   r   r   inline_user_function_returnr,   r   r   Zconstruct_dictr   r   r-   Zis_supported_argr+   r   __optional_keys__r   r   rs   Z	call_dictdequeZhas_force_unpack_var_sequenceZforce_unpack_var_sequencert   listsZDequeVariableweakrefrefZWeakRefVariable	functoolspartialZ	functionsZFunctoolsPartialVariablewarningscatch_warningsZCatchWarningsCtxManagerVariablerb   r^   is_python_constantZCUDADeviceVariablerm   rl   rd   is_standard_newZ"cls_supports_mutation_side_effectsr   rB   r   r   _AsyncGeneratorContextManagerclosingredirect_stdoutredirect_stderrsuppress	ExitStackAsyncExitStack_GeneratorContextManagerri   _dynamoconfigZenable_trace_contextlibr   r   r1   r   r   r#   rF   _field_defaultsru   extendzipindexallZNamedTupleVariabler   dataclassesfieldsrp   initdefaultMISSINGdefault_factoryr   re   rh   r   npr&   ListVariabler   stackr%   randomRandomRandomVariabler   MappingProxyTyper   ZMappingProxyVariabler
   Z%instantiate_user_defined_class_objectrL   )rO   r{   r   rP   r   r   Zconstant_argsr   r   r   fnZ	rest_argsr   r   Zcm_objr	  field_defaultsZvar_tracker_kwargs
field_nameZvar_trackerZ	field_varrp   rD   Zdefault_kwargsfieldZ
factory_fnvarZstackedZtensor_variableseedZrandom_objectrQ   r5   r6   r     s  




$
	










	 
"z&UserDefinedClassVariable.call_functionc                 C   s*   t | jdd}t|tr|j}|tju S )z"Check for __new__ being overriddenrn   N)r   r   rD   ri   r   r   r1   rn   )rO   Znew_fnr5   r5   r6   r     s   

z(UserDefinedClassVariable.is_standard_newc                    sB   | j rt| j |}t|tj tt| j	|S t
 ||S r0   )r   r   r   
make_guardr   HASATTRr   r   rd   rD   rL   call_obj_hasattr)rO   r{   rp   r   rQ   r5   r6   r    s
   z)UserDefinedClassVariable.call_obj_hasattrc                    s   |dkr| j jS t ||S )NrE   )rD   rE   rL   const_getattrrO   r{   rp   rQ   r5   r6   r    s   z&UserDefinedClassVariable.const_getattrrJ   Nr{   r/   r   r   rP   r   rJ   r,   r{   r/   r   r   rP   r   rJ   r,   )rE   rF   rG   rl   r1   rH   rM   rV   rX   strr\   r   r   	lru_cacher`   rh   rx   ry   rz   r   r   r   r   r   r   r  r  __classcell__r5   r5   rQ   r6   rI      s`   
 


P@4  	rI   c                   @   s$   e Zd Zedd Zedd ZdS )!UserDefinedExceptionClassVariablec                 C   rS   r0   rT   rU   r5   r5   r6   r       z$UserDefinedExceptionClassVariable.fnc                 C   rS   r0   rT   rU   r5   r5   r6   python_type  r(  z-UserDefinedExceptionClassVariable.python_typeN)rE   rF   rG   r   r  r)  r5   r5   r5   r6   r'    s
    
r'  c                   @      e Zd ZdS )NO_SUCH_SUBOBJNrE   rF   rG   r5   r5   r5   r6   r+        r+  c                 C   sr   ddl m} dd |D }dd | D }t| jj}||i |}t|}| jj|||f || ||S )Nr)   )VariableBuilderc                 S   r   r5   r   r   r5   r5   r6   rq     r   z"call_random_fn.<locals>.<listcomp>c                 S   r   r5   r   r   r5   r5   r6   r     r   z"call_random_fn.<locals>.<dictcomp>)	r   r.  r   r   r   Zrandom_callsr   r;   Zwrap_unspecialized_primitive)r{   r  r   rP   r.  Zrandom_call_indexZexample_valuer   r5   r5   r6   call_random_fn  s   r/  c                       sj  e Zd ZdZddhejZddddd	dC fddZdefd	d
ZdefddZ	dd Z
dd Z fddZ fddZdd Zdd ZdDddZeeddd Zdd  Z	!	"	#	$		%dE fd&d'ZdDd(d)Zd*d+ Z fd,d-Zd.d/ Zd0d1 Z			!	"	#	$		%dF fd2d3Zd4d5 Zd6d7 Zd8d9 ZdDd:d;Z d<d= Z!dDd>d?Z"ddd@edd%fdAdBZ#  Z$S )GUserDefinedObjectVariablez_
    Mostly objects of defined type.  Catch-all for something where we only know the type.
    rD   
value_typeN)r1  
cls_sourcebase_cls_vt	init_argsrJ   c                   sl   t  jdi | || _|pt|| _t|| ju sJ || _|d u r.| jd ur.t| j| _|| _|| _	d S rK   )
rL   rM   rD   rl   r1  r2  r   r   r3  r4  )rO   rD   r1  r2  r3  r4  rP   rQ   r5   r6   rM     s   

z"UserDefinedObjectVariable.__init__c                 C   s6   | j j}|dv rtt| jdd }| jj d| dS )N)Zbuiltin_function_or_methodZgetset_descriptorZmethod_descriptormethodrE   rZ   r[   )r1  rE   r$  rj   rD   rR   )rO   innerr5   r5   r6   __str__  s   z!UserDefinedObjectVariable.__str__c                 C      | j j d| jj dS rY   rR   rE   r1  rU   r5   r5   r6   r\        z"UserDefinedObjectVariable.__repr__c                 C   s   dS NFr5   rO   r   r5   r5   r6   is_underlying_vt_modified     z3UserDefinedObjectVariable.is_underlying_vt_modifiedc                 C   rS   r0   r1  rU   r5   r5   r6   r)  
  rW   z%UserDefinedObjectVariable.python_typec                    sJ   dd l m  m} || jr | jd ur t| jtj	 | j
S t  S Nr   )torch.utils._pytreeutils_pytreeZis_constant_classr1  r   r   r  r   ZEQUALS_MATCHrD   rL   rV   )rO   pytreerQ   r5   r6   rV     s   

z,UserDefinedObjectVariable.as_python_constantc                    s(   | j rt| j tj | jS t  S r0   )r   r   r  r   ZID_MATCHrD   rL   guard_as_python_constantrU   rQ   r5   r6   rE    s   
z2UserDefinedObjectVariable.guard_as_python_constantc                 C   s   t | sJ d|  d S )Nz<calling torch function on object without __torch_function__ )r   rU   r5   r5   r6   torch_function_check  s   
z.UserDefinedObjectVariable.torch_function_checkc                 C   s$   |    ddlm} ||| j| jS )Nr)   )build_torch_function_fn)rF  torch_functionrG  rD   r   )rO   r{   rG  r5   r5   r6   get_torch_fn#  s   z&UserDefinedObjectVariable.get_torch_fnr{   r/   c                 C   s8   |    ddlm}m} ||||| | |||||S )Nr)   )_get_subclass_type_varcall_torch_function)rF  rH  rJ  rK  rI  )rO   r{   r  r   r   rP   rJ  rK  r5   r5   r6   rK  )  s   z-UserDefinedObjectVariable.call_torch_functionc                  C   s   t j t jt jt jh} | S r0   )r  randint	randrangeuniform)fnsr5   r5   r6   _supported_random_functions8  s   z5UserDefinedObjectVariable._supported_random_functionsc                 C   s@   |t | jdi vrz
tt| j|W S  ty   Y d S w d S )Nr   )rj   rD   r   r   rl   r   )rO   rp   r5   r5   r6   _maybe_get_baseclass_methodC  s   z5UserDefinedObjectVariable._maybe_get_baseclass_methodr   r   rP   r   r,   c                    sz  ddl m}m} | |}|d ur|tju r|d S t|s&t| j	t
jr2| j|g|R i |S |tju rWt|dkrW|sW|d }t|tsNtjtS || j	|j	u S tjjjrgt| j	tjrgtd t|tjr| jd u rtd ntt| jd|}	ddlm}
 |tjjju r|
}||| |	d |||S |t!j"u r| jr|s|st#| j$t%j& |t| j	S t' (||||S )	Nr)   )r   r   r   z,Generator as graph argument is not supportedrR   r   unpatched_nn_module_initr   ))r   r   r   rQ  r1   rM   r   r7   ri   rD   	threadinglocalmethod_setattr_standardr   r   r0  r   NotImplementedr]   r  r  Z"enable_faithful_generator_behaviorr   GeneratorTyper   r   r   r   mutation_guardrS  r   Moduler   ru   __len__r   r  r   SEQUENCE_LENGTHrL   r   )rO   r{   rp   r   rP   r   r   r5  otherr   rS  rQ   r5   r6   r   K  s>   




z%UserDefinedObjectVariable.call_methodc                 C   sn   z|  }W n ty   td|  Y nw |jj| s)td|  d| d |jj| || td S )Nznon-const setattr name: zsetattr(z, z, ...))	rV   NotImplementedErrorr   r   r   Zis_attribute_mutationZ
store_attrr   r   rO   r{   rp   rD   r5   r5   r6   rV    s   
z1UserDefinedObjectVariable.method_setattr_standardc                 C   s&   t t| jdd  ot| jtj S )Nr2   )r7   r   r   rD   ri   rT  rU  rU   r5   r5   r6   needs_slow_setattr  s
   z,UserDefinedObjectVariable.needs_slow_setattrc                    sp    j r2 dtju r2 dtju r2 dtju r2t j tj	  fddt
t jD S t |S )N__iter__r[  __getitem__c                    s*   g | ]}t jj j| t j|d qS )r   )r   LazyVariableTrackerr   rD   r   r   ro   r   rU   r5   r6   rq     s    
zAUserDefinedObjectVariable.unpack_var_sequence.<locals>.<listcomp>)r   rQ  ru   ra  r[  rb  r   r  r   r\  ranger   rD   rL   unpack_var_sequencerO   r{   rQ   rU   r6   rf    s   
z-UserDefinedObjectVariable.unpack_var_sequencec                 C   s   |  |dg i S )N__next__)r   rg  r5   r5   r6   next_variable  r8   z'UserDefinedObjectVariable.next_variablec                 C   s&   z| j |  v W S  ty   Y dS w r;  )rD   rP  	TypeErrorrU   r5   r5   r6   is_supported_random  s
   z-UserDefinedObjectVariable.is_supported_randomc                    sz  |   r tdd |D r tdd | D r t|| j||S t| jtjr| jj}| jj	}|t
jjjju rMtj|jrM|sM|sMt|j|||S |t
jjjju ro|jt
jjju rot|j}t|j||g|S | jd u rxtd t| jd}t|||}t| jd}	t|||	}
|||
g| |S t| jr| jrt| j t!j" | #|d||S t$ |||S )Nc                 s       | ]}|  V  qd S r0   r   rd  r5   r5   r6   r     r   z:UserDefinedObjectVariable.call_function.<locals>.<genexpr>c                 s   rl  r0   rm  )ro   r   r5   r5   r6   r     r   z9Sourceless UserDefinedObjectVariable method not supportedr   __self____call__)%rk  r  valuesr/  rD   r!   r   
MethodTyper   rn  r]   rB  Z_contextlibZ_DecoratorContextManagercloner   ZTorchCtxManagerClassVariableZis_matching_clsrR   r   ZautogradZ	grad_modeZinference_moder   moder   r   r   r,   r   callabler   r  r   ZFUNCTION_MATCHr   rL   )rO   r{   r   rP   r   r   r  Zfunc_srcZfunc_varZobj_srcZobj_varrQ   r5   r6   r     s\   


z'UserDefinedObjectVariable.call_functionc                 C   s
   t | jS r0   )r   rD   rU   r5   r5   r6   _check_for_getattr     
z,UserDefinedObjectVariable._check_for_getattrc                 C   s.   t |tsdS t |jtjptjjj	|jS r;  )
ri   r   r   r   BuiltinFunctionTyper]   Z_Cr  rB  Zis_instancemethod)rO   subobjr5   r5   r6   _is_c_defined_property  s   
z0UserDefinedObjectVariable._is_c_defined_propertyc                 C   s   t | j|t}dd l}t| js8|tu s0t||js0t |r&|| jj	v s0| 
|s0t |r8| j|}|S t| jrC|tu rCt|S r@  )r   r   rD   r+  _collectionsr$   ri   _tuplegetterr   	__slots__ry  isgetsetdescriptor__getattribute__r   )rO   rp   rx  rz  r5   r5   r6   _getattr_static  s,   
		z)UserDefinedObjectVariable._getattr_staticc                 C   r|   r}   r   r   r5   r5   r6   r     r   z1UserDefinedObjectVariable.has_key_in_generic_dictc                 C   s   | j d usJ tt| jjD ] \}}||jv r/t| j d}t||}t|d}t||  S qtd| dt| jj  d S )Nr   r   zCould not find z in )	r2  	enumeraterl   rD   r   r   r   r   r   )rO   rp   idxklassZ
mro_sourceZklass_sourceZdict_sourcer5   r5   r6   get_source_by_walking_mro  s   


 z3UserDefinedObjectVariable.get_source_by_walking_mroc              	   C   s:  ddl m} ddl m} | jrt| j|nd }t| jrNtt	| jd}| jr.t| jd}zt
j|| |d|||gi W S  tyM   t| Y nw |jj| |rm|jjj| |dd}t|t
jrktt| |S |d	krd
|i}	t
j| |fi |	S |dkr|}
|
d u r| j}
d
|
i}	tt	| jfi |	S z| |}W n ty(   t}|  }t|tjr|t u rt| t
j!rt"| jj#t$rt"| jj%t$rt"| jj&t$r| '||}nd }| jrt| jd}t
j|| |d|||gi }| jr|t(j)j*j+u rt|t
j!t
j,fr|-t| . | | Y S |d ur&t/d Y nw ddl0m1} |t(j)j*j2u r9|}t|t3r_| jrQtt| jd|}t|d}t
j|j4| |d|g i S t|t5r|6| j}|d urz|7|j8||dS |7||S t|t9rt
j|j:| ;|d|dS t|tj<r|6| jd }t=>|||S t?|rt@|j6sd }d }| jr| A|}t|d}t=>|||}ntB|}tt	| j}t
j|j6j:||d|| |gi S t|tjst|tjCrt| jt(j)j*rtD| j|}||u r-tE|dr-|jF}|}|r t|dnd }||u r-tE|dst|tjCrb|jG| jur^t|j:tjsJt/d|  ddlHmI} |||jG}t
|j:|S |j:}nt|tjskJ |}tJ|r{t
j|| |dS tK|rtL|rtM|dS |d ur|7|j8||dS |7||S t(jNjOjPst| t
jQr|rt| t
j!r|jjRs|dv rtS| j|}| T|}|turt@|rd
|i}	t
j| |fi |	S |rt
jU||S | jd urt| jjV|t}||u rt| j|}t
jU||S t=>||S tt| d S )Nr   )trace_rulesr)   r   r~  r   Tr~   r   r   rR   __getattr__z)UserDefined with non-function __getattr__rR  r   r   _torchdynamo_inlinez7Found a method whose __func__ is not of FunctionType - )"SourcelessUserDefinedObjectBuilder)_buffers_parameters)Wr   r  r   r   r   r$   rD   r   r   rl   r   r   r   r   r   r   r   r   r   r   ri   r   r   r   r   r2  rI   r  r+  ru  r   r   r(   ZUnspecializedNNModuleVariabler!   r  rs   r  Z_modulesZ manually_trace_nn_module_getattrr]   r   rZ  r  ZNNModuleVariableZset_nn_module_stack_sourceZget_nn_module_stack_sourcer   rY  rS  rM   r   r   r   r   lookupZcreate_with_sourcer   r   r   r   r,   r   r   r    r  r0  rq  rj   rd   r  rn  r   r  ismethod
isfunctionr   r   r  r  Zinline_inbuilt_nn_modulesZFSDPManagedNNModuleVariableZexportr   Z_wrap_sourcerc  rR   )rO   r{   rp   r  r   r   Zgetattribute_fnZ
new_sourceresultr   r2  rx  Z
getattr_fnoutrS  r   Zdescriptor_sourceZdescriptor_get_sourceZdescriptor_varZ	owner_varZdynamic_subobjr  Z	object_vtZsubobj_from_classZsrc_from_classr5   r5   r6   r   #  sd  





+












	





z%UserDefinedObjectVariable.var_getattrrp   c                 C   sj   | j rtt| j |tj z| ||}tj	t
|tj W S  ty4   t| tj	d Y S w r;  )r   r   r   r  r   r  r   r   r   r   ri   r   r   r   )rO   r{   rp   Zvar_vtr5   r5   r6   r    s   z*UserDefinedObjectVariable.call_obj_hasattrr   r!  r"  r#  )%rE   rF   rG   __doc__rC   _nonvar_fieldsrM   r$  r7  r\   r=  r)  rV   rE  rF  rI  rK  r   r   r%  rP  rQ  r   rV  r`  rf  ri  rk  r   ru  ry  r  r   r  r   r  r&  r5   r5   rQ   r6   r0    st    	
	
54
 
 er0  c                       sX   e Zd Zedd Zdd fddZdd Zd	d
 Zd fddZde	fddZ
  ZS )FrozenDataClassVariablec                 C   sl   ddl m} t|sJ i }||D ]}t||jr.t| t||j|o)t||j||j< qt	|||dS )Nr   r	  )r	  r   )
r  r	  r   rd   rp   r,   r   rj   r   r  )r{   rD   r   r	  Z	field_mapr  r5   r5   r6   r     s   

zFrozenDataClassVariable.createNrJ   c                    s*   t  j|fi | |d u ri }|| _d S r0   )rL   rM   r	  )rO   rD   r	  rP   rQ   r5   r6   rM   +  s   
z FrozenDataClassVariable.__init__c                 C   s   ddl m} dd lm  m} t| j|j|j|j	fst
dg }i }|| jD ]}|jrF| j|j  }t|ddrA|||j< q(|| q(|  }||i |S )Nr   r  z@currently can't reconstruct arbitrary frozen dataclass instanceskw_onlyF)r  r	  rA  rB  rC  r!   rD   ZTreeSpecZLeafSpecZConstantNoder^  r
  rp   rV   rj   r;   r)  )rO   r	  rD  r   rP   r  datactorr5   r5   r6   rV   1  s&   
z*FrozenDataClassVariable.as_python_constantc                 C   sp   ddl m} g }i }|| jD ]}| j|j  }t|dr'|jr'|||j< q|| q|  }||i |S )Nr   r  r  )	r  r	  rD   rp   rX   rd   r  r;   r)  )rO   r	  r   rP   r  r   r  r5   r5   r6   rX   O  s   z FrozenDataClassVariable.as_proxyr{   r/   c                    s   || j | < t |||S r0   )r	  rV   rL   rV  r_  rQ   r5   r6   rV  e  s   z/FrozenDataClassVariable.method_setattr_standardc                 C   r8  rY   r9  rU   r5   r5   r6   r\   i  r:  z FrozenDataClassVariable.__repr__r0   r   r!  )rE   rF   rG   r   r   rM   rV   rX   rV  r$  r\   r&  r5   r5   rQ   r6   r    s    
r  c                       s8   e Zd Z		d fddZ							dd
dZ  ZS )SourcelessGraphModuleVariablerJ   Nc                    s   t  j|fi | d S r0   )rL   rM   rN   rQ   r5   r6   rM   n  s   z&SourcelessGraphModuleVariable.__init__r   r   rP   r   r,   c                 C   s(   t | jjj}| g| }||||S r0   )r   r   rD   forwardr   r   )rO   r{   rp   r   rP   Zfn_variabler5   r5   r6   r   u  s   
z)SourcelessGraphModuleVariable.call_methodr   r"  )rE   rF   rG   rM   r   r&  r5   r5   rQ   r6   r  m  s    r  c                       sV   e Zd Z fddZedd Z fddZedd ZdddZedd Z	  Z
S )"UserDefinedExceptionObjectVariablec                    s(   t  j|fi | t| jd| _d S rK   )rL   rM   r   ZExceptionVariabler1  exc_vtrN   rQ   r5   r6   rM     s   z+UserDefinedExceptionObjectVariable.__init__c                 C   rS   r0   r?  rU   r5   r5   r6   r    r(  z%UserDefinedExceptionObjectVariable.fnc                    s   |dkr#|  | }r#t|r#t|dkr#|| j_|| j_td S |dkrHt|dkrHt	|d tjrH|d jdv rH| j
||d |d  t ||||S )NrM   r   r2   r   )	__cause____context____suppress_context____traceback__r)   )rQ  r   r   r   r  r   rD   r   r   ri   Zcall_setattrrL   r   rO   r{   rp   r   rP   r5  rQ   r5   r6   r     s$   
z.UserDefinedExceptionObjectVariable.call_methodc                 C      | j jS r0   )r  r  rU   r5   r5   r6   r       z.UserDefinedExceptionObjectVariable.__context__contextvariables.ExceptionVariablec                 C   s   | j |S r0   )r  set_context)rO   r  r5   r5   r6   r       z.UserDefinedExceptionObjectVariable.set_contextc                 C   r  r0   )r  exc_typerU   r5   r5   r6   r    r  z+UserDefinedExceptionObjectVariable.exc_type)r  r  )rE   rF   rG   rM   r   r  r   r  r  r  r&  r5   r5   rQ   r6   r    s    


r  c                       s8   e Zd Zedd Zd fddZd fd	d
Z  ZS )KeyedJaggedTensorVariablec                 C   s"   t jd}|d uot| |ju S )Nztorchrec.sparse.jagged_tensor)r=   r>   r?   rl   KeyedJaggedTensor)r   modr5   r5   r6   is_matching_object  s   z,KeyedJaggedTensorVariable.is_matching_objectrJ   Nc                    s4   ddl m} t||u sJ t j|fi | d S )Nr   )r  )Ztorchrec.sparse.jagged_tensorr  rl   rL   rM   )rO   rD   rP   r  rQ   r5   r6   rM     s   z"KeyedJaggedTensorVariable.__init__r{   r/   c                    sd   t jjjr+| jd ur+|dv r+tjdd t ||W  d    S 1 s&w   Y  t ||S )N)Z_length_per_keyZ_offset_per_keyT)Z#force_unspec_int_unbacked_size_like)	r]   r  r  Z3force_unspec_int_unbacked_size_like_on_torchrec_kjtr   r   patchrL   r   r  rQ   r5   r6   r     s   
 z%KeyedJaggedTensorVariable.var_getattrr   r!  )rE   rF   rG   r   r  rM   r   r&  r5   r5   rQ   r6   r    s
    
r  c                   @   r*  )RemovableHandleClassNr,  r5   r5   r5   r6   r    s    r  c                       sL   e Zd ZdZ		d	d fddZd fdd	Z fd
dZdd Z  ZS )RemovableHandleVariableNrJ   c                    s"   t  jdi | || _|| _d S rK   )rL   rM   r   r  )rO   r   r  rP   rQ   r5   r6   rM     s   
z RemovableHandleVariable.__init__r{   r/   c                    sN   |dkr| j | jkr|jj| j  | j| _ tjd S t 	|||| d S )Nremove)
r  REMOVEDr   r   Zremove_hookr   r   r   rL   r   )rO   r{   method_namer   rP   rQ   r5   r6   r     s   z#RemovableHandleVariable.call_methodc                    sB   | j | jkr  fdd  tdd d S t   d S )Nc                      s     ddS )Nztorch._dynamo.utilsZinvalid_removeable_handle)Zload_import_fromr5   codegenr5   r6   <lambda>  s    z5RemovableHandleVariable.reconstruct.<locals>.<lambda>r   F)r  r  Zadd_push_nullZextend_outputr	   rL   reconstruct)rO   r  rQ   r  r6   r    s   
z#RemovableHandleVariable.reconstructc                 C   s   t S r0   )r  rU   r5   r5   r6   r)    r>  z#RemovableHandleVariable.python_type)NNr   r!  )	rE   rF   rG   r  rM   r   r  r)  r&  r5   r5   rQ   r6   r    s    r  c                       R   e Zd ZdZejZd fdd	Z							
d fddZdd Zdd Z	  Z
S )UserDefinedDictVariablez
    Represents user defined objects that are subclasses of dict/OrderedDict.

    Internally, it uses a ConstDictVariable to represent the dict part of the
    variable tracker. For everything else, it falls back to
    UserDefinedObjectVariable.
    Nc                    sR   t  j|fi | || _| jd u r$| jd u sJ dtji t d| _t| _d S )Nz@dict_vt must be constructed by builder.py when source is presentr   )	rL   rM   _dict_vtr   r   r   r+   r   _dict_methods)rO   rD   Zdict_vtrP   rQ   r5   r6   rM     s   

z UserDefinedDictVariable.__init__r   r   rP   r   rJ   r,   c                    s8   |  |}|| jv r| j||||S t ||||S r0   )rQ  r  r  r   rL   r  rQ   r5   r6   r   	  s   

z#UserDefinedDictVariable.call_methodc                 C   s*   t | jjtjtjjfv r| j|S tr0   )	rl   rD   ra  rs   r   r   r  rf  r^  rg  r5   r5   r6   rf    s   
z+UserDefinedDictVariable.unpack_var_sequencec                 C      | | jS r0   )is_modifiedr  r<  r5   r5   r6   r=    r  z1UserDefinedDictVariable.is_underlying_vt_modifiedr0   r"  rE   rF   rG   r  r0  r  rM   r   rf  r=  r&  r5   r5   rQ   r6   r    s    r  c                       r  )UserDefinedListVariablez
    Represents user defined objects that are subclasses of lists.

    Internally, it uses a ListVariable to represent the list part of the
    variable tracker. For everything else, it falls back to
    UserDefinedObjectVariable.
    Nc                    sP   t  j|fi | || _| jd u r&| jd u sJ dtjg t d| _d S d S )Nz@list_vt must be constructed by builder.py when source is presentr   )rL   rM   _list_vtr   r   r  r+   )rO   rD   Zlist_vtrP   rQ   r5   r6   rM   ,  s   
z UserDefinedListVariable.__init__r   r   rP   r   rJ   r,   c                    D   | j d usJ | |}|tv r| j ||||S t ||||S r0   )r  rQ  r"   r   rL   r  rQ   r5   r6   r   5  
   
z#UserDefinedListVariable.call_methodc                 C   0   | j d usJ t| jjtju r| j |S tr0   )r  rl   rD   ra  ru   rf  r^  rg  r5   r5   r6   rf  B     z+UserDefinedListVariable.unpack_var_sequencec                 C   r  r0   )r  r  r<  r5   r5   r6   r=  H  r  z1UserDefinedListVariable.is_underlying_vt_modifiedr0   r"  r  r5   r5   rQ   r6   r  !  s    	r  c                       s\   e Zd ZdZejZ fddZdd Zedd Z					
			d fddZ
dd Z  ZS )UserDefinedTupleVariablez
    Represents user defined objects that are subclasses of tuple.

    Internally, it uses a TupleVariable to represent the tuple part of the
    variable tracker. For everything else, it falls back to
    UserDefinedObjectVariable.
    c                    s   t  j|fi | d | _d S r0   )rL   rM   	_tuple_vtrN   rQ   r5   r6   rM   W  s   
z!UserDefinedTupleVariable.__init__c                 C   s
   || _ d S r0   )r  )rO   tuple_vtr5   r5   r6   set_underlying_tuple_vt[  rv  z0UserDefinedTupleVariable.set_underlying_tuple_vtc                 K   s   t | fi |}|| |S r0   )r  r  )rD   r  rP   r  r5   r5   r6   r   ^  s   
zUserDefinedTupleVariable.creater   r   rP   r   rJ   r,   c                    r  r0   )r  rQ  r'   r   rL   r  rQ   r5   r6   r   d  r  z$UserDefinedTupleVariable.call_methodc                 C   r  r0   )r  rl   rD   ra  rt   rf  r^  rg  r5   r5   r6   rf  q  r  z,UserDefinedTupleVariable.unpack_var_sequencer"  )rE   rF   rG   r  r0  r  rM   r  r   r   r   rf  r&  r5   r5   rQ   r6   r  L  s    
r  c                       s<   e Zd ZejZ fddZdddeddf fdd	Z  ZS )
MutableMappingVariablec                    s,   t  j|fi | ti | _t | _d S r0   )rL   rM   r   r   generic_dict_vtr*   r   rN   rQ   r5   r6   rM   {  s   zMutableMappingVariable.__init__r{   r/   rp   rJ   r,   c                    s   |dkrt | jjtjjjtjfv rtt	j
| S |dkr1| jr1tj| jjt| jd| _| jS | jt| }r>|S t ||S )Nr?   r   )rl   rD   r?   r   abcMappingrs   r   r   r   Zmapping_getr   rc  r   r   r   r  Zmaybe_getitem_constr   rL   r   )rO   r{   rp   r  rQ   r5   r6   r     s   z"MutableMappingVariable.var_getattr)	rE   rF   rG   r0  r  rM   r$  r   r&  r5   r5   rQ   r6   r  x  s    "r  c                   @   r*  )r  Nr,  r5   r5   r5   r6   r    r-  r  )dr  rk   r   r   r  r   r   r   r  r=   rT  r   r   r   typingr   Ztyping_extensionsr   Ztorch._dynamo.configr]   Ztorch.nnZtorch._guardsr   Ztorch.utils._python_dispatchr   r   r   r   Zbytecode_transformationr	   Zcreate_parameter_opr
   excr   r   r   r   Zguardsr   r   r   r   r   r   r   r   r   rB  r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   baser*   r+   r,   Zdictsr-   numpyr  ModuleNotFoundErrorZtorch.utils._cxx_pytreer.   r<   rl   Ztorch._dynamo.symbolic_convertr/   r7   rB   rC   rI   r'  r+  r/  r0  r  r  r  r  r  r  r  r  r  r  r  r5   r5   r5   r6   <module>   s    P    ?
    ET)'/+,"