o
    Ih                    @   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   X/var/www/vscode/kcb/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)
_pytest.python_apir9   _pytest.recwarnr:   appendImportErrorsysmodulesget&_AssertRaisesRegexWithHighlightContext)ctxf_ctxsr9   r:   mr5   r5   r6   is_forbidden_context_managerj   s   
rF   c                   @   s   e Zd ZU eed< dS )UserDefinedVariablevalueN)__name__
__module____qualname__r1   __annotations__r5   r5   r5   r6   rG   |   s   
 rG   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UserDefinedClassVariablerH   returnNc                    s   t  jdi | || _d S Nr5   )super__init__rH   selfrH   kwargs	__class__r5   r6   rQ      s   
z!UserDefinedClassVariable.__init__c                 C      | j S r0   rH   rS   r5   r5   r6   as_python_constant      z+UserDefinedClassVariable.as_python_constantc                 C   rW   r0   rX   rY   r5   r5   r6   as_proxy   r[   z!UserDefinedClassVariable.as_proxyc                 C   s   | j j d| j dS N())rV   rI   rH   rY   r5   r5   r6   __repr__   s   z!UserDefinedClassVariable.__repr__c                   C   s   t jt jt jt jhS r0   )torchdevicefinfo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)ra   TensorcudaStreamEventhasattrupdaterg   setr&   keys)_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>)dirrt   r1   rw   dicttuplelistunion)
exceptionsr5   r5   r6   supported_c_new_functions   s   z2UserDefinedClassVariable.supported_c_new_functionsc                 C   s   | t  v S r0   )rM   r   rX   r5   r5   r6   is_supported_new_method   s   z0UserDefinedClassVariable.is_supported_new_methodc                 C   s   | j |  v S r0   )rH   rf   rY   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
deleted_ok	outputside_effectshas_pending_mutation_of_attr	load_attrrr   r   DeletedVariablerH   __dict__rS   r   keymutated_attrr5   r5   r6   has_key_in_generic_dict      z0UserDefinedClassVariable.has_key_in_generic_dictry   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EnumVariablerI   rK   r   sourcefromkeysrw   r   )      __mro__ztorch.ra   )2 r   r   r   r   createrH   rI   rK   r   GetAttrVariablecollectionsOrderedDictdefaultdictrP   var_getattrinspectgetattr_staticAttributeErrorru   r   rM   r   r   rr   typesFunctionTypestaticmethodr,   build__get__classmethod__func__propertyUserFunctionVariablefgetcall_functionUserMethodVariableClassMethodDescriptorTypeismemberdescriptorr?   version_info
is_literalenumEnumrs   rJ   
startswithismethoddescriptorr    )	rS   r   ry   r   r   r   optionsobjfuncrU   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_proxyra   nn
functionalcross_entropyr%   )inputtargetr   r   r   
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   LambdaVariable)rS   r   argsrT   r   r   r   r5   r   r6   _call_cross_entropy_loss  s$   


z1UserDefinedClassVariable._call_cross_entropy_lossr   list[VariableTracker]rT   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__rH   __ne__rw   mutation_type)lenrH   r   r   r   r   r,   r   r   r   r   r   builtinr   call_custom_dict_fromkeysrl   r   r   rr   rM   ConstDictVariabler+   r   rw   r   r   track_new_user_defined_objectrP   call_method)rS   r   ry   r   rT   r   r   rU   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   rZ   rx   xr5   r5   r6   rz         z:UserDefinedClassVariable.call_function.<locals>.<listcomp>c                 S      i | ]	\}}||  qS r5   r   rx   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   rQ   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   )rr   r   TensorVariabler   r5   r5   r6   r   t  s    r   r   )yr   r   r   r   r   r   r   r   r   rZ   itemsrH   ra   r   CrossEntropyLossr   
contextlibnullcontextctx_managerr   r   r   inline_user_function_returnr,   r   r   construct_dictr   r   r-   is_supported_argr+   r   __optional_keys__r   r   r|   	call_dictdequehas_force_unpack_var_sequenceforce_unpack_var_sequencer}   listsDequeVariableweakrefrefWeakRefVariable	functoolspartial	functionsFunctoolsPartialVariablewarningscatch_warningsCatchWarningsCtxManagerVariableri   rb   is_python_constantCUDADeviceVariablerv   ru   rl   is_standard_new"cls_supports_mutation_side_effectsr   rF   r   r   _AsyncGeneratorContextManagerclosingredirect_stdoutredirect_stderrsuppress	ExitStackAsyncExitStack_GeneratorContextManagerrr   _dynamoconfigenable_trace_contextlibr   r   r1   r   r   r#   rJ   _field_defaultsr~   extendzipindexallNamedTupleVariabler   dataclassesfieldsry   initdefaultMISSINGdefault_factoryr   rm   rq   r   npr&   ListVariabler   stackr%   randomRandomRandomVariabler   MappingProxyTyper   MappingProxyVariabler
   %instantiate_user_defined_class_objectrP   )rS   r   r   rT   r   r   constant_argsr   r   r   fn	rest_argsr   r   cm_objr+  field_defaultsvar_tracker_kwargs
field_namevar_tracker	field_varry   rH   default_kwargsfield
factory_fnvarstackedtensor_variableseedrandom_objectrU   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 overriddenrw   N)r   r   rH   rr   r   r   r1   rw   )rS   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   rl   rH   rP   call_obj_hasattr)rS   r   ry   r   rU   r5   r6   rM    s
   z)UserDefinedClassVariable.call_obj_hasattrc                    s   |dkr| j jS t ||S )NrI   )rH   rI   rP   const_getattrrS   r   ry   rU   r5   r6   rN    s   z&UserDefinedClassVariable.const_getattrrN   Nr   r/   r   r   rT   r   rN   r,   r   r/   r   r   rT   r   rN   r,   )rI   rJ   rK   ru   r1   rL   rQ   rZ   r\   strr`   r   r  	lru_cacherf   rq   r   r   r   r   r   r   r   r   r  rM  rN  __classcell__r5   r5   rU   r6   rM      s`   
 


P@4  	rM   c                   @   s$   e Zd Zedd Zedd ZdS )!UserDefinedExceptionClassVariablec                 C   rW   r0   rX   rY   r5   r5   r6   r:       z$UserDefinedExceptionClassVariable.fnc                 C   rW   r0   rX   rY   r5   r5   r6   python_type  rX  z-UserDefinedExceptionClassVariable.python_typeN)rI   rJ   rK   r   r:  rY  r5   r5   r5   r6   rW    s
    
rW  c                   @      e Zd ZdS )NO_SUCH_SUBOBJNrI   rJ   rK   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   rz     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   random_callsr   r=   wrap_unspecialized_primitive)r   r:  r   rT   r^  random_call_indexexample_valuer   r5   r5   r6   call_random_fn  s   rc  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.
    rH   
value_typeN)re  
cls_sourcebase_cls_vt	init_argsrN   c                   sl   t  jdi | || _|pt|| _t|| ju sJ || _|d u r.| jd ur.t| j| _|| _|| _	d S rO   )
rP   rQ   rH   ru   re  rf  r   r   rg  rh  )rS   rH   re  rf  rg  rh  rT   rU   r5   r6   rQ     s   

z"UserDefinedObjectVariable.__init__c                 C   s6   | j j}|dv rtt| jdd }| jj d| dS )N)builtin_function_or_methodgetset_descriptormethod_descriptormethodrI   r^   r_   )re  rI   rT  rs   rH   rV   )rS   innerr5   r5   r6   __str__  s   z!UserDefinedObjectVariable.__str__c                 C      | j j d| jj dS r]   rV   rI   re  rY   r5   r5   r6   r`        z"UserDefinedObjectVariable.__repr__c                 C   s   dS NFr5   rS   r   r5   r5   r6   is_underlying_vt_modified     z3UserDefinedObjectVariable.is_underlying_vt_modifiedc                 C   rW   r0   re  rY   r5   r5   r6   rY  
  r[   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_pytreeis_constant_classre  r   r   rK  r   EQUALS_MATCHrH   rP   rZ   )rS   pytreerU   r5   r6   rZ     s   

z,UserDefinedObjectVariable.as_python_constantc                    s(   | j rt| j tj | jS t  S r0   )r   r   rK  r   ID_MATCHrH   rP   guard_as_python_constantrY   rU   r5   r6   r    s   
z2UserDefinedObjectVariable.guard_as_python_constantc                 C   s   t | sJ d|  d S )Nz<calling torch function on object without __torch_function__ )r   rY   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)r  torch_functionr  rH   r   )rS   r   r  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)r  r  r  r  r  )rS   r   r:  r   r   rT   r  r  r5   r5   r6   r  )  s   z-UserDefinedObjectVariable.call_torch_functionc                  C   s   t j t jt jt jh} | S r0   )r3  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   )rs   rH   r   r   ru   r   )rS   ry   r5   r5   r6   _maybe_get_baseclass_methodC  s   z5UserDefinedObjectVariable._maybe_get_baseclass_methodr   r   rT   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 supportedrV   r   unpatched_nn_module_initr   ))r   r   r   r  r1   rQ   r   r7   rr   rH   	threadinglocalmethod_setattr_standardr   r   rd  r   NotImplementedra   r!  r"  "enable_faithful_generator_behaviorr   GeneratorTyper   r   r   r   mutation_guardr  r   Moduler   r~   __len__r   rK  r   SEQUENCE_LENGTHrP   r   )rS   r   ry   r   rT   r   r   rl  otherr   r  rU   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, ...))	rZ   NotImplementedErrorr   r   r   is_attribute_mutation
store_attrr   r   rS   r   ry   rH   r5   r5   r6   r    s   
z1UserDefinedObjectVariable.method_setattr_standardc                 C   s&   t t| jdd  ot| jtj S )Nr2   )r7   r   r   rH   rr   r  r  rY   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   rH   r   r   rx   r   rY   r5   r6   rz     s    
zAUserDefinedObjectVariable.unpack_var_sequence.<locals>.<listcomp>)r   r  r~   r  r  r  r   rK  r   r  ranger   rH   rP   unpack_var_sequencerS   r   rU   rY   r6   r    s   
z-UserDefinedObjectVariable.unpack_var_sequencec                 C   s   |  |dg i S )N__next__)r   r  r5   r5   r6   next_variable  r8   z'UserDefinedObjectVariable.next_variablec                 C   s&   z| j |  v W S  ty   Y dS w rr  )rH   r  	TypeErrorrY   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  r  r5   r5   r6   r     r   z:UserDefinedObjectVariable.call_function.<locals>.<genexpr>c                 s   r  r0   r  )rx   r   r5   r5   r6   r     r   z9Sourceless UserDefinedObjectVariable method not supportedr   __self____call__)%r  r(  valuesrc  rH   r!   r   
MethodTyper   r  ra   ry  _contextlib_DecoratorContextManagercloner   TorchCtxManagerClassVariableis_matching_clsrV   r   autograd	grad_modeinference_moder   moder   r   r   r,   r   callabler   rK  r   FUNCTION_MATCHr   rP   )rS   r   r   rT   r   r   rE  func_srcfunc_varobj_srcobj_varrU   r5   r6   r     s\   


z'UserDefinedObjectVariable.call_functionc                 C   s
   t | jS r0   )r   rH   rY   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 rr  )
rr   r   r   r   BuiltinFunctionTypera   _Cr!  ry  is_instancemethod)rS   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 rw  )r   r   rH   r[  _collectionsr$   rr   _tuplegetterr   	__slots__r  isgetsetdescriptor__getattribute__r   )rS   ry   r  r  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 )	rf  	enumerateru   rH   r   r   r   r   r   )rS   ry   idxklass
mro_sourceklass_source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   rV   __getattr__z)UserDefined with non-function __getattr__r  r   r   _torchdynamo_inlinez7Found a method whose __func__ is not of FunctionType - )"SourcelessUserDefinedObjectBuilder)_buffers_parameters)Wr   r  r   r   r   r$   rH   r   r   ru   r   r   r   r   r   r   r   r   r   r   rr   r   r   r   r   rf  rM   r  r[  r  r   r   r(   UnspecializedNNModuleVariabler!   r  r|   r  _modules manually_trace_nn_module_getattrra   r   r  r  NNModuleVariableset_nn_module_stack_sourceget_nn_module_stack_sourcer   r  r  rQ   r   r   r   r   lookupcreate_with_sourcer   r   r   r   r,   r   r   r    r  rd  r  rs   rl   r  r  r   r  ismethod
isfunctionr   r   r!  r"  inline_inbuilt_nn_modulesFSDPManagedNNModuleVariableexportr   _wrap_sourcer  rV   )rS   r   ry   r  r   r   getattribute_fn
new_sourceresultr   rf  r  
getattr_fnoutr  r   descriptor_sourcedescriptor_get_sourcedescriptor_var	owner_vardynamic_subobjr  	object_vtsubobj_from_classsrc_from_classr5   r5   r6   r   #  sd  





+












	





z%UserDefinedObjectVariable.var_getattrry   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 rr  )r   r   r   rK  r   rL  r   r   r   r   rr   r   r   r   )rS   r   ry   var_vtr5   r5   r6   rM    s   z*UserDefinedObjectVariable.call_obj_hasattrrP  rQ  rR  rS  )%rI   rJ   rK   __doc__rG   _nonvar_fieldsrQ   rT  rn  r`   rt  rY  rZ   r  r  r  r  r   r  rU  r  r  r   r  r  r  r  r  r   r  r  r  r   r  r   rM  rV  r5   r5   rU   r6   rd    st    	
	
54
 
 erd  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   rl   ry   r,   r   rs   r   r  )r   rH   r   r+  	field_maprC  r5   r5   r6   r     s   

zFrozenDataClassVariable.createNrN   c                    s*   t  j|fi | |d u ri }|| _d S r0   )rP   rQ   r+  )rS   rH   r+  rT   rU   r5   r6   rQ   +  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+  rx  ry  rz  r!   rH   TreeSpecLeafSpecConstantNoder  r,  ry   rZ   rs   r=   rY  )rS   r+  r}  r   rT   rC  datactorr5   r5   r6   rZ   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+  rH   ry   r\   rl   r  r=   rY  )rS   r+  r   rT   rC  r   r  r5   r5   r6   r\   O  s   z FrozenDataClassVariable.as_proxyr   r/   c                    s   || j | < t |||S r0   )r+  rZ   rP   r  r  rU   r5   r6   r  e  s   z/FrozenDataClassVariable.method_setattr_standardc                 C   ro  r]   rp  rY   r5   r5   r6   r`   i  rq  z FrozenDataClassVariable.__repr__r0   rP  rQ  )rI   rJ   rK   r   r   rQ   rZ   r\   r  rT  r`   rV  r5   r5   rU   r6   r    s    
r  c                       s8   e Zd Z		d fddZ							dd
dZ  ZS )SourcelessGraphModuleVariablerN   Nc                    s   t  j|fi | d S r0   )rP   rQ   rR   rU   r5   r6   rQ   n  s   z&SourcelessGraphModuleVariable.__init__r   r   rT   r   r,   c                 C   s(   t | jjj}| g| }||||S r0   )r   r   rH   forwardr   r  )rS   r   ry   r   rT   fn_variabler5   r5   r6   r   u  s   
z)SourcelessGraphModuleVariable.call_methodrP  rR  )rI   rJ   rK   rQ   r   rV  r5   r5   rU   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 rO   )rP   rQ   r   ExceptionVariablere  exc_vtrR   rU   r5   r6   rQ     s   z+UserDefinedExceptionObjectVariable.__init__c                 C   rW   r0   rv  rY   r5   r5   r6   r:    rX  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 )NrQ   r   r2   r   )	__cause____context____suppress_context____traceback__r)   )r  r   r   r   r  r   rH   r   r   rr   call_setattrrP   r   rS   r   ry   r   rT   rl  rU   r5   r6   r     s$   
z.UserDefinedExceptionObjectVariable.call_methodc                 C      | j jS r0   )r  r  rY   r5   r5   r6   r       z.UserDefinedExceptionObjectVariable.__context__contextvariables.ExceptionVariablec                 C   s   | j |S r0   )r  set_context)rS   r  r5   r5   r6   r       z.UserDefinedExceptionObjectVariable.set_contextc                 C   r  r0   )r  exc_typerY   r5   r5   r6   r    r  z+UserDefinedExceptionObjectVariable.exc_type)r  r  )rI   rJ   rK   rQ   r   r:  r   r  r  r  rV  r5   r5   rU   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@   rA   ru   KeyedJaggedTensor)r   modr5   r5   r6   is_matching_object  s   z,KeyedJaggedTensorVariable.is_matching_objectrN   Nc                    s4   ddl m} t||u sJ t j|fi | d S )Nr   )r  )torchrec.sparse.jagged_tensorr  ru   rP   rQ   )rS   rH   rT   r  rU   r5   r6   rQ     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)_length_per_key_offset_per_keyT)#force_unspec_int_unbacked_size_like)	ra   r!  r"  3force_unspec_int_unbacked_size_like_on_torchrec_kjtr   r   patchrP   r   rO  rU   r5   r6   r     s   
 z%KeyedJaggedTensorVariable.var_getattrrP  rQ  )rI   rJ   rK   r   r  rQ   r   rV  r5   r5   rU   r6   r    s
    
r  c                   @   rZ  )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 )RemovableHandleVariableNrN   c                    s"   t  jdi | || _|| _d S rO   )rP   rQ   r   r  )rS   r   r  rT   rU   r5   r6   rQ     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   remove_hookr   r   r   rP   r   )rS   r   method_namer   rT   rU   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.utilsinvalid_removeable_handle)load_import_fromr5   codegenr5   r6   <lambda>  s    z5RemovableHandleVariable.reconstruct.<locals>.<lambda>r   F)r  r   add_push_nullextend_outputr	   rP   reconstruct)rS   r&  rU   r%  r6   r*    s   
z#RemovableHandleVariable.reconstructc                 C   s   t S r0   )r  rY   r5   r5   r6   rY    ru  z#RemovableHandleVariable.python_type)NNrP  rQ  )	rI   rJ   rK   r   rQ   r   r*  rY  rV  r5   r5   rU   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   )	rP   rQ   _dict_vtr   r   r   r+   r   _dict_methods)rS   rH   dict_vtrT   rU   r5   r6   rQ     s   

z UserDefinedDictVariable.__init__r   r   rT   r   rN   r,   c                    s8   |  |}|| jv r| j||||S t ||||S r0   )r  r.  r-  r   rP   r
  rU   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   )	ru   rH   r  r|   r   r   r-  r  r  r  r5   r5   r6   r    s   
z+UserDefinedDictVariable.unpack_var_sequencec                 C      | | jS r0   )is_modifiedr-  rs  r5   r5   r6   rt    r  z1UserDefinedDictVariable.is_underlying_vt_modifiedr0   rR  rI   rJ   rK   r  rd  r  rQ   r   r  rt  rV  r5   r5   rU   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   )rP   rQ   _list_vtr   r   r1  r+   )rS   rH   list_vtrT   rU   r5   r6   rQ   ,  s   
z UserDefinedListVariable.__init__r   r   rT   r   rN   r,   c                    D   | j d usJ | |}|tv r| j ||||S t ||||S r0   )r4  r  r"   r   rP   r
  rU   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   )r4  ru   rH   r  r~   r  r  r  r5   r5   r6   r  B     z+UserDefinedListVariable.unpack_var_sequencec                 C   r0  r0   )r1  r4  rs  r5   r5   r6   rt  H  r  z1UserDefinedListVariable.is_underlying_vt_modifiedr0   rR  r2  r5   r5   rU   r6   r3  !  s    	r3  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   )rP   rQ   	_tuple_vtrR   rU   r5   r6   rQ   W  s   
z!UserDefinedTupleVariable.__init__c                 C   s
   || _ d S r0   )r;  )rS   tuple_vtr5   r5   r6   set_underlying_tuple_vt[  r  z0UserDefinedTupleVariable.set_underlying_tuple_vtc                 K   s   t | fi |}|| |S r0   )r:  r=  )rH   r<  rT   r  r5   r5   r6   r   ^  s   
zUserDefinedTupleVariable.creater   r   rT   r   rN   r,   c                    r6  r0   )r;  r  r'   r   rP   r
  rU   r5   r6   r   d  r7  z$UserDefinedTupleVariable.call_methodc                 C   r8  r0   )r;  ru   rH   r  r}   r  r  r  r5   r5   r6   r  q  r9  z,UserDefinedTupleVariable.unpack_var_sequencerR  )rI   rJ   rK   r  rd  r  rQ   r=  r   r   r   r  rV  r5   r5   rU   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   )rP   rQ   r   r   generic_dict_vtr*   r   rR   rU   r5   r6   rQ   {  s   zMutableMappingVariable.__init__r   r/   ry   rN   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 )NrA   r   )ru   rH   rA   r   abcMappingr|   r   r   r   mapping_getr   r  r   r   r   r?  maybe_getitem_constr   rP   r   )rS   r   ry   r  rU   r5   r6   r     s   z"MutableMappingVariable.var_getattr)	rI   rJ   rK   rd  r  rQ   rT  r   rV  r5   r5   rU   r6   r>  x  s    "r>  c                   @   rZ  )r5  Nr\  r5   r5   r5   r6   r5    r]  r5  )dr  rt   r   r   r*  r   r  r   r3  r?   r  r   r  r  typingr   typing_extensionsr   torch._dynamo.configra   torch.nntorch._guardsr   torch.utils._python_dispatchr   r   r   r   bytecode_transformationr	   create_parameter_opr
   excr   r   r   r   guardsr   r   r   r   r   r   r   r   r   ry  r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   baser*   r+   r,   dictsr-   numpyr0  ModuleNotFoundErrortorch.utils._cxx_pytreer.   r>   ru   torch._dynamo.symbolic_convertr/   r7   rF   rG   rM   rW  r[  rc  rd  r  r  r  r  r  r  r,  r3  r:  r>  r5  r5   r5   r5   r6   <module>   s    P    ?
    ET)'/+,"