
    9j5                    h   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ZddlZddlZddlZddlmZmZmZ ddlmZmZmZmZ ddlmZ ddlZddlZddlmZm Z  ddl!m"Z" ddl#m$Z$m%Z% d	d
l&m'Z'm(Z(m)Z)m*Z* d	dl+m,Z, d	dl-m.Z. d	dl/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7 d	dl8m9Z9 d	dl:m;Z;m<Z< d	dl=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZF d	dlGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[ ddl\m]Z]m^Z^m_Z_m`Z` ddlambZbmcZc ddldmeZe ddlfmgZg 	 ddlhZi	 ddlkmlZl er&ddlompZp ddlqmrZr ddlsmtZt ddlumvZv ddlamwZw ddlxmyZymzZz de{de|fd Z}de{de|fd!Z~d"e{de|fd#Zd$e{de|fd%Zd&e{de|fd'Z eeej                  ej
                  ej                  h      Zeen   ed(<   d$e{de|fd)Z G d* d+e`      Z G d, d-e      Z G d. d/e      Z G d0 d1      Zd2d3d4ed5ef   d6ee`   d7eee`f   de`f
d8Z G d9 d:e      Z G d; d<e      Z G d= d>e      Z G d? d@e      Z G dA dBe      Z G dC dDe      ZeeefZeD  ci c]6  } | | j4                  j7                         D ch c]  } e|      s| c}8 c}} Zeenee   f   edE<    G dF dGe      Z G dH dIe      Z G dJ dKe`      Z G dL dMe      Z G dN dOe      Z G dP dQe      Z G dR dSe      Z G dT dUe      Z G dV dWe      Z G dX dYe      Z G dZ d[e      Zy# ej$ r dZiY w xY w# em$ r  end      ZlY w xY wc c}w c c}} w )\am  
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
  - UserDefinedSetVariable: For set subclasses
  - UserDefinedTupleVariable: For tuple subclasses
  - UserDefinedExceptionObjectVariable: For exception 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)CallableIterableSequence)AnyLiteralTYPE_CHECKINGUnion)is_typeddict)SourceTracingContext)"is_traceable_wrapper_subclass_type)
GetAttrKeyis_structseq_class   )configgraph_break_hints	polyfills	variables)create_call_function)$do_not_convert_to_tracable_parameter)handle_observed_exceptionObservedAttributeErrorObservedKeyErrorObservedTypeErrorObservedUserStopIterationraise_observed_exceptionraise_type_errorunimplemented)get_external_object_by_index)GuardBuilderinstall_guard)	
AttrSourceCallFunctionNoArgsSourceDictGetItemSourceGetItemSourceRandomValueSourceTypeDictSourceTypeMROSource
TypeSourceUnspecializedParamBufferSource)check_constant_argscmp_name_to_op_mappingdict_methodsfrozenset_methodsget_custom_getattrhas_torch_functionis_lru_cache_wrapped_functionis_namedtuple_clsis_wrapper_or_member_descriptoristypelist_methodsnamedtuple_fieldsobject_has_getattributeproxy_args_kwargsraise_args_mismatchraise_on_overridden_hashset_methodstensortype_to_dtypetuple_methodsunpatched_nn_module_getattr   )MutationTypeNO_SUCH_SUBOBJValueMutationNewVariableTracker)ConstDictVariableDefaultDictVariable)HashableTracker)SetVariable)
PyTreeSpec)	PyCodegenSideEffectsInstructionTranslatorConstantVariable)DunderDictVariable)ListVariableTupleVariablevalreturnc                 F    | t         j                  t        j                  fv S N)object__setattr__BaseExceptionrS   s    d/media/conek/DATA/Code/OCR/venv/lib/python3.12/site-packages/torch/_dynamo/variables/user_defined.pyis_standard_setattrr\   |       6%%}'@'@AAA    c                 F    | t         j                  t        j                  fv S rV   )rW   __delattr__rY   rZ   s    r[   is_standard_delattrra      r]   r^   ctxc                    g }	 ddl m} ddlm} |j	                  |       |j	                  |       t        j                  j                  d      x}r|j	                  |j                         | |v S # t
        $ r Y Kw xY w)Nr   )RaisesContext)WarningsCheckerz!torch.testing._internal.jit_utils)
_pytest.python_apird   _pytest.recwarnre   appendImportErrorsysmodulesget&_AssertRaisesRegexWithHighlightContext)rb   f_ctxsrd   re   ms        r[   is_forbidden_context_managerrp      su    F43m$o& KKOO?@@q@a>>?&=  s   .A2 2	A>=A>objc                 z    t        |       xr/ t        t        |       d      xr t        |       j                  dk(  S )N__name__cython_function_or_method)callablehasattrtypers   rq   s    r[   is_cython_functionry      s9     	>DIz*	>I"==r^   valuec                 |    t        j                  |       xr& t        j                  |       xr dt	        | di       v S )N__is_pydantic_dataclass____dict__)inspectisclassdataclassesis_dataclassgetattrrz   s    r[   is_pydantic_dataclass_clsr      s>     	J$$U+	J'75*b+IIr^   KNOWN_DATA_DESCRIPTOR_TYPESc                 z    t        |       }|t        v ryt        |d      xr t        |d      xs t        |d      S )zTReturn True if *obj* is a data descriptor (has __get__ and (__set__ or __delete__)).T__get____set__
__delete__)rw   r   rv   )rq   tps     r[   is_data_descriptorr      sA    	cB	((2y! I;'"l";r^   c                   (    e Zd ZU eed<   dedefdZy)UserDefinedVariablerz   namerT   c                     |t        | j                  di       vr*	 t        j                  t	        | j                        |      S y# t
        $ r Y yw xY w)zEGet method from the base class if not overridden in value's __dict__.r}   N)r   rz   r~   getattr_staticrw   AttributeError)selfr   s     r[   _maybe_get_baseclass_methodz/UserDefinedVariable._maybe_get_baseclass_method   sT    wtzz:r::--d4::.>EE  " s   (A 	AAN)rs   
__module____qualname__rW   __annotations__strr   r    r^   r[   r   r      s    M  r^   r   c            
       ^    e Zd ZU ee   ed<   dee   deddf fdZdee   fdZdefdZ	de
fdZeej                  deee      fd	              Zeej                  deee      fd
              Zeej                  dee   fd              Zededefd       ZdefdZde
defdZde
defdZ	 	 	 	 d0dZddde
def fdZddde
dededz  def
dZddde
dededz  def
dZddde
dededz  def
 fdZddde
dededz  def
dZdddefdZ dddefdZ!dddefd Z"ddd!e#e   de$e
ef   defd"Z%ddde
d!e&e   de$e
ef   def
 fd#Z'ddde&d   fd$Z(ddd!e#e   de$e
ef   def fd%Z)defd&Z*ddde
dd'fd(Z+ddde
def fd)Z,de-d*   fd+Z.de/fd,Z0d-edefd.Z1defd/Z2 xZ3S )1UserDefinedClassVariablerz   kwargsrT   Nc                 @    t        |   di | || _        d| _        y )NFr   )super__init__rz   ban_mutationr   rz   r   	__class__s      r[   r   z!UserDefinedClassVariable.__init__   s$    "6"
 "r^   c                     | j                   S rV   r   r   s    r[   as_python_constantz+UserDefinedClassVariable.as_python_constant       zzr^   c                     | j                   S rV   r   r   s    r[   as_proxyz!UserDefinedClassVariable.as_proxy   r   r^   c                 N    | j                   j                   d| j                   dS N())r   rs   rz   r   s    r[   __repr__z!UserDefinedClassVariable.__repr__   s$    ..))*!DJJ<q99r^   c                  ~    t         j                  t         j                  t         j                  t         j                  hS rV   )torchdevicefinfoiinfoSizer   r^   r[   _constant_fold_classesz/UserDefinedClassVariable._constant_fold_classes   s*     LLKKKKJJ	
 	
r^   c                     t         j                  t         j                  j                  t         j                  j                  t         j                  j
                  t         j                  j                  t         j                  j                  t         j                  j                  t         j                  j                  t         j                  j                  t         j                  j                  t         j                  t         j                  t         j                  j                  t         j                  j                  t         j                  j                  t         j                  j                  h} t        t         d      rC| j!                  t         j"                  j                  t         j"                  j                  h       t%        t'        j(                               | z  S )Nhpu)r   TensorcudaFloatTensorDoubleTensor
HalfTensorBFloat16Tensor
ByteTensor
CharTensor	IntTensorShortTensor
LongTensorStreamEventxpurv   updater   setr<   keys)_in_graph_class_lists    r[   _in_graph_classesz*UserDefinedClassVariable._in_graph_classes   s    LLJJ""JJ##JJ!!JJ%%JJ!!JJ!!JJ  JJ""JJ!!LLKKJJJJIIIIOO! 
$ 5%  ''II$$IIOO &++-.1EEEr^   c            	          t        t              D  ch c]X  } t        t        t        |       t              r8t        t        t        |       t              rt        t        |       j                  Z }} t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  t         j                  h	}|j#                  |      S c c} w rV   )dirbuiltins
isinstancer   rw   
issubclassrY   __new__rW   dictr   	frozensettuplelistintfloatr   union)r   
exceptions	c_new_fnss      r[   supported_c_new_functionsz2UserDefinedClassVariable.supported_c_new_functions	  s    
 H 
'(D14878T2MB Hd#++ 

  
 NNLLKKMMLLKKMMKK

	 z**# 
s   ADc                     | t         j                         v ryt        | dd       }t        |t              xr t        |      S )NT__self__)r   r   r   r   rw   r   )rz   owners     r[   is_supported_new_methodz0UserDefinedClassVariable.is_supported_new_method  s=    ,FFHHz40%&D+=e+DDr^   c                     | j                   | j                         v ryt        | j                   t              xr$ t	        | j                   t
        j                        S NT)rz   r   r   rw   r   enumEnumr   s    r[   can_constant_fold_throughz2UserDefinedClassVariable.can_constant_fold_through'  sA    ::4466 $**d+Q
4::tyy0QQr^   r   c                     | j                   j                  D ]!  }||j                  v s|j                  |   c S  t        S )z?Walk cls.__mro__ only (not the metaclass chain) to find *name*.)rz   __mro__r}   rA   r   r   bases      r[   lookup_cls_mro_attrz,UserDefinedClassVariable.lookup_cls_mro_attr.  s>    JJ&& 	+Dt}}$}}T**	+ r^   c                     t        | j                        j                  D ]!  }||j                  v s|j                  |   c S  t        S )z<Walk type(cls).__mro__ (the metaclass chain) to find *name*.)rw   rz   r   r}   rA   r   s      r[   lookup_metaclass_attrz.UserDefinedClassVariable.lookup_metaclass_attr5  sC    $,, 	+Dt}}$}}T**	+ r^   txrM   rC   c                     ddl m} t        | j                        }t	        |d      r|t        ur| j                  |dg i       S  |j                  d      S )Nr?   rN   __bool__T)constantrO   rw   rz   rv   call_methodcreate)r   r   rO   	metaclasss       r[   	bool_implz"UserDefinedClassVariable.bool_impl<  sS     	/ $	9j)it.C##B
B;;&&&t,,r^   c           	      v   | j                   t        | j                   |      nd }| j                  t        j                  t        j
                  hv r|dk(  rt        |   ||      S t        | j                        }|t        ur;d|j                  v r-t        dd| j                   d| dt        j                         | j                  |      }|t        urt        |      r| j!                  ||||      S | j#                  |      }|t        ur=t%        t        |      d      r| j'                  ||||      S | j)                  ||||      S |t        ur"t+        j,                  | |t        |      |	      S t        | j                        }|t        urx| j                  d
      }|t        ur_t/        |t0        j2                        rEt+        j4                  ||       j7                  |t*        j8                  j;                  |      gi       S t=        t>        |d| j                  j@                   d| dg       y )Nfromkeys__getattribute__z&Custom metaclass with __getattribute__ztype(z) = z\Dynamo does not trace attribute access on classes whose metaclass overrides __getattribute__gb_typecontextexplanationhintsr   source__getattr__ztype object 'z' has no attribute ''args)!r   r"   rz   collectionsOrderedDictdefaultdictr   var_getattrrw   r}   r   r   SUPPORTABLEr   rA   r   resolve_meta_data_descriptorr   rv   resolve_cls_descriptorresolve_cls_plain_attrr   GetAttrVariabler   typesFunctionTypeUserMethodVariablecall_functionrO   r   r   r   rs   )	r   r   r   r   metacls	meta_attrcls_attrmeta_getattrr   s	           r[   r  z$UserDefinedClassVariable.var_getattrI  s   26++2IDKK.t JJ;22K4K4KLL
"7&r400 tzz"$#59I9I#I@

|4y97'33* ..t4	N*/A)/L44Ry&QQ ++D1>)tH~y1222tXvNN..r46JJ N*,,T4iQWXX tzz"$55mDL>1je007 !33L$GUU33::4@A2 
 	!!$**"5"5!66J4&PQRS	
r^   r  r   c                 `   |dk(  rNt        j                  || j                  j                  | j                  xr t        | j                  d            S |dk(  rN| j                  xr t        | j                        }t        j                  || j                  j                  |      S t        j                  | j                  |      }|rt        j                  |||      S ddl
m}  |j                  |      rt        j                  ||      S t        j                  | |t        |      |      S )zEHandle data descriptors from the metaclass MRO (type.__dict__ slots).r}   r   r   r?   rN   )rC   buildrz   r}   r   r"   r(   r   rw   r    rO   
is_literalr   r  )r   r   r   r  r   attr_sourceresolvedrO   s           r[   r  z5UserDefinedClassVariable.resolve_meta_data_descriptor  s     :"((

##{{Jz$++z'J 
 9++D-*DK"((TZZ-?-?MM ((T:"((Xv>>&&&&x0"((X66((tT(^FSSr^   r  c                    t        |t              r0t        j                  ||j	                  | j
                        |      S t        |t              rzt        |j                  t              r>t        j                  ||j                  j                        }|j                  || gi       S t        j                  |j                  | |      S t        |t        j                        r3|j	                  d| j
                        }t        j                  |||      S t        |t        t        j                   f      r$|rt        j                  |||      S t#        |      S |t$        v r<t        |t        j&                        s"t        j(                  | |t+        |      |      S t-        j.                  t+        |      dd      }t        |t        j&                        r|rn|t1        | j
                  di       v s>| j
                  j2                  j5                  d      s| j
                  j2                  dk(  rt        j                  |||      S | j7                  ||||      S t-        j8                  |      st;        |      r|r| j
                  t<        j>                  urn|t1        | j
                  di       v s>| j
                  j2                  j5                  d      s| j
                  j2                  dk(  rt        j                  |||      S t        j(                  | |t+        |      |      S t        j                  |||      S )z(Handle descriptors found in cls.__mro__.r   N)py_typer   r   r}   ztorch.r   ) r   staticmethodrC   r  r   rz   classmethod__func__propertyfgetr  r   r
  r  ClassMethodDescriptorType_collections_tuplegetterUserDefinedObjectVariabler,   r	  r  rw   r~   r   r   r   
startswithinvoke_cls_descriptor_getismethoddescriptorr3   r   r   )r   r   r   r  r   fget_vtfuncget_fns           r[   r  z/UserDefinedClassVariable.resolve_cls_descriptor  s    h-"((X-=-=djj-I6RRh,(++X6)//H4E4E4J4JK,,R$<<//0A0A4PVWWh ? ?@##D$**5D"((T6::
 h<+D+D EF&,,R6BB,X66 ))*e((3
 ,,dDN6  ''X	4Hfe001

J;;::((33H=::((G3&,,R6BB11"dHfMM %%h/3R4
 JJk&=&==GDJJ
B??zz,,77Azz,,7 ',,R6BB,,T4hPVWW $$R6::r^   c                     |dk(  r%t         j                  |      rt        |   ||      S | j                  t
        j                  u r!t        j                  | |t        |            S t        j                  |||      S )z2Handle non-descriptor attributes from cls.__mro__.r   )r  )r   r   r   r  rz   r   r   r   r  rw   rC   r  )r   r   r   r  r   r   s        r[   r  z/UserDefinedClassVariable.resolve_cls_plain_attr  sr     9!9!Q!Q"
 7&r400::000,,T4hPP$$R6::r^   
descriptorc                 l   ddl m} d}d}| j                  rCt        | j                  |      }t        t	        |      d      }t        j                  |||      }nt        |      } |j                  d      }	t        j                  |j                  j                  ||      j                  ||	| gi       S )z7Trace a class-MRO descriptor's __get__(None, cls) call.r?   rN   Nr   r   )r   rO   r   r"   r)   rC   r  r   r   r   r
  r   r  r  )
r   r   r   r(  r   rO   descriptor_sourcedescriptor_get_sourcedescriptor_varnone_vars
             r[   r"  z2UserDefinedClassVariable.invoke_cls_descriptor_get  s     	/  $;; *4;; =$.z:K/Li$X!,222zCTUN6zBN*#**40++''(
 -Xt,b
1		2r^   c                     | j                  d      }|rM| j                  xr t        | j                  d      }t        j                  || |      j                  |g i       S t        |d| j                          d       y )N__len__)	source_fnzobject of type z has no length)r   r   r"   r   r
  r  r   python_type_name)r   r   ro   r   s       r[   len_implz!UserDefinedClassVariable.len_impl,  su    ,,Y7[[GZY%GF//46mBB'( 	t/D/D/F.G~VWr^   c                 $    | j                  |      S rV   r2  r   r   s     r[   	sq_lengthz"UserDefinedClassVariable.sq_length5      }}R  r^   c                 $    | j                  |      S rV   r4  r5  s     r[   	mp_lengthz"UserDefinedClassVariable.mp_length8  r7  r^   r   c                   	
 ddl m}  |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d      fdt        dt        d	t        d
t        dt        dt        dt        t        df   fd} ||i |\  	
dt        dt        dt        f	
fd}t        j                  |      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?   rN   Nimeang        weightsize_averageignore_indexreduce	reductionlabel_smoothingrT   .c                     | |||||fS rV   r   )r<  r=  r>  r?  r@  rA  s         r[   normalize_argszIUserDefinedClassVariable._call_cross_entropy_loss.<locals>.normalize_argsL  s       r^   inputtargetc                     ddl m}  | j                  j                  dt        j
                  j                  j                  gt        | |	gi              S )Nr?   )wrap_fx_proxyr  r   proxy)	builderrG  outputcreate_proxyr   nn
functionalcross_entropyr8   )
rD  rE  rG  r>  rA  
reduce_argr@  r=  r   r<  s
      r[   fake_cross_entropy_losszRUserDefinedClassVariable._call_cross_entropy_loss.<locals>.fake_cross_entropy_lossf  ss     / ,bii,,#HH''55 '!""((&%+	  r^   )r  rO   r   rC   r   r   LambdaVariable)r   r   r   r   rO   rC  rQ  r>  rA  rP  r@  r=  r<  s    `     @@@@@@r[   _call_cross_entropy_lossz1UserDefinedClassVariable._call_cross_entropy_loss;  s    	' '>&6&=&=d&C,C,<,C,CD,I,C,<,C,CD,I&=&6&=&=d&C)@)9)@)@)H/F/?/F/Fs/K	#	)	 *	 $		
 '	 -	 ?C'(	0 D+F+	
	"	,;		 	4 ''(?@@r^   c           
      	   ddl m} |dk(  rt        |      dk(  r|sd| j                  j                  vrh| j
                  }| j
                  r!t        | j
                  d      }t        |      }t        j                  || j                  j                         |      S | j                  t        j                  t        j                  hv r3|dk(  r.t        j                  j                   || j                  g|i |S | j                  t        j                  u r!|dk(  r|d   j#                  ||g |dd  |      S |dk(  r"t        |      dk(  r|sddlm}  |||d         S |d	k(  rMt        |      dk(  r?t)        |d   d
      r0t        j                  || j                  |d   j                  k(        S |dk(  rMt        |      dk(  r?t)        |d   d
      r0t        j                  || j                  |d   j                  k7        S t+        | j                  t,              r-|dk7  r(|j/                  |t,              j#                  ||||      S t+        | j                  t0        t2        f      r-|dk7  r(|j/                  |t0              j#                  ||||      S |dk(  r| j                  t        j                  u rt5        |d   t6              ry|d   j                  t        j                  u rZ|r4t        |      dk7  r&t9        ||dt        |       dt        |       d       t;        i t        j                  t=                     S t        |      dk(  r6t5        |d   t        j>                        r|dk(  r|d   jA                  |      S |dk(  rVt6        jC                  | j                  jD                        r-|jF                  jH                  jK                  | |d   |dd        S |dk(  r<| jL                  r0tO        dtQ        | j                        dtR        jT                         tW        | j                        }|tV        ur|jX                  D ]  }	||	j                  v s|	j                  |   }
t5        |
tZ        j\                        rO| j
                  xr t        | j
                  |      }t        j^                  |
| |      ja                  |||      c S  n tb        | E  ||||      S )Nr?   SourcelessBuilder__subclasses__r   r   move_to_endr/  )generic_len__eq__rz   __ne__r   1 args and 0 kwargs
 args and  kwargsmutation_type	__enter__rX   zCClass attribute mutation when the __dict__ was already materializedzVDyanmo does not support tracing mutations on a class when its __dict__ is materializedr   r   )2rJ  rV  lenrz   r}   r   r"   r#   rC   r  rW  r   r   r  r   DictBuiltinVariablecall_custom_dict_fromkeysr   object_protocolrY  rv   r   r   r   r   r   r   r   r9   rD   rB   GenericContextWrappingVariableenterr   r   rK  side_effectstrack_new_user_defined_objectr   r   r   r   r  rw   r   r  r	  r
  r  r   )r   r   r   r   r   rV  r   rY  r   klassmethodr   s              r[   r   z$UserDefinedClassVariable.call_method  sS    	/ $$D	Q 

(;(;;[[F{{#DKK1AB1&9"((TZZ-F-F-H&QQJJ;22K4K4KLL
"00JJDJJ!%)/  ZZ;222t}7L7&&r448fEEY3t9>&4r47++X#d)q.WT!Wg5N"((TZZ47==-HIIX#d)q.WT!Wg5N"((TZZ47==-HII

D)di.?$++B5AAD$  

S)$45$):K$++B4@@T4QWXXI

k55547$<=Q!8!88#d)q.#)4ykCK=@	 %K++;K;M  IN47I$L$LM#7==$$Y#;#S#SJJ$
 99))GGQQR 
 ]"t'8'8]DJJt'33	 $	D "** 5>>)"^^D1F!&%*<*<=!%!NDKK1N(;;"D '-D&9:  w"2tT6::r^   c                     t        | j                  t              rRt        | j                  t        j
                        r.| j                  D cg c]  }t        j                  ||       c}S t        c c}w rV   )	r   rz   rw   r   r   r   rC   r  NotImplementedError)r   r   items      r[   unpack_var_sequencez,UserDefinedClassVariable.unpack_var_sequence  sQ     djj$'Jtzz499,M@D

KO))"d3KK!! Ls   A3c                 x   ddl m} ddlm}m} ddlm} t        ||      }t        j                  j                         r| j                  t        j                  j                  u rzt        j                  st        dddd	g
       |j                   j                   j#                  |j%                  |t&              | g       }	|	j)                  |dt+        |      |       |	S | j-                         rx|rvt/        j0                  | | j3                         |D 
cg c]  }
|
j3                          c}
i |j5                         D ci c]  \  }}||j3                          c}}      S | j                  t        j6                  j8                  u r| j;                  |||      S | j                  t<        j>                  u rddlm }  ||i |S | j                  tB        jD                  u r8|jG                  t/        j0                  |tH        jJ                        | g||      S | j                  tB        jL                  u rtO        |      dk(  r tP        jR                  j%                  d       }nHtO        |      dk(  r6tU        jV                  |d         stY        tZ        ||d   g       |d   }g }n|^}}tQ        j\                  j^                  |t`        g|i |}tU        |j4                  tB        jL                  |tc                     S te        | j                        rq| j                  jf                  r3t        dti        | j                        ddgtj        jl                  
       tQ        j\                  j^                  |t`        g|i |S | j                  tB        jn                  u r*tP        jR                  j%                  d       }	 dAdtp        tr           d z  dtt        d z  dtr        fd}d }	  tw        jx                  |      jz                  |i |}|J d|j~                  v rc|j~                  d   j                  |      s&t        dd| d| ddgtj        j|                  
       |j~                  d   j                  |      }ng }d|j~                  v r|j~                  d   }tP        j                  j                  ||tc                      S | j                  t        j                  u rtO        |      dk(  rt        |d   tP        j                        rt        |d   |      rp|d   j                         d!v r[|d   j                  }t        ||d   j                               j                  }tQ        j                  ||d   | j                  "      S | j                  t        j                  u rLtO        |      dkD  r|d   }ntP        jR                  j%                  d       }tQ        j                  |d   |      S | j                  t        j                  u rN|s t        d#d$d%d&gtj        j|                  
       |d   }|dd  }tP        j                  j                  |||'      S | j                  t        j                  u r"|s tP        j                  j%                  ||      S | j                  t        j                  j                  u r`|s^tO        |      dk(  rP|d   j                         st        |d(       tP        j                  j%                  ||d   j3                               S t        t        | j                        t              r%t        | j                  d)      rt        | j                  d*      r| j                         r |j                  | j                        r| j                  rt        | j                        sdd+lcmd} dd,lSme}mf} | j                  t<        j                  t<        j                  t<        j                  t<        j                  t<        j                  fv r7t        d-| j                   | j                   d.g tj        jl                  
       |}| j                  t<        j                  u rt        |d   ||f      rt        j                  j                  j                  st        d/d| d0d1g
       t        |d   |      r:|d   }|d   j4                  }|d   j                         }|j                  |||      S  ||d   |d   j                  "      g|dd  z   }|jG                  t/        j0                  |tH        j                        | g||      S t        | j                        rt        | j                        rf|stO        |      dk7  r&t        |d2d3tO        |       d4tO        |       d5       |j                   j                   j#                  | | t+        |            S |jG                  t/        j0                  |tH        j                        | g||      S | j                  t        j                  u r?dd6lBmv}  |j%                  |t              j                  |||      }! | |!j4                        S t        | j                        r*t        d7| j                   d8tj        jl                  
       nl| j                  | j                         v st        | j                        rdd9lBm{}" t        r| j                  t        v rtO        |      dk(  rt        |d   |"      r}tO        |d   j4                        dkD  rbt        d: |d   j4                  D              rC || |j                   j                  d;t        j                   gt        ||       <      }#|#g}t        | j                  t        j                        rdd=lBm}$ t	        |j5                         D ci c]  \  }}t/        j0                  ||      | c}}      }% |$t+        |            }& | j                  |&j3                         i |%j3                         }'dd>lm}( dd?lm})  |(|'|)j                  |&|%            }* |||j                   j                  d;t        |*fi       <      }+|+S t        | j                  t        j                        rdd=lBm}$ t	        |j5                         D ci c]  \  }}t/        j0                  ||      | c}}      }% |$t+        |            }& | j                  |&j3                         i |%j3                         },dd>lm}( dd@lm}-  |(|,|-j                  |&|%            }* |||j                   j                  d;t        |*fi       <      }+|+S  || |j                   j                  d;| j                  gt        ||       <      }+|+S | j                  t        j                  u rZtO        |      dk(  r'|d   j                         r|d   j3                         }.nd }.t        j                  |.      }/t!        |/      S | j                  t        j"                  u r;tO        |      dk(  r-t        |d   t              rtQ        j$                  |d         S  |j                  | j                        rY| j                  rMt'               5  |jG                  t/        j0                  |tH        j                        | g||      cd d d        S t(        0|   |||      S c c}
w c c}}w # tZ        $ r2}t        dd| d| ddgtj        j|                  |       Y d }~d }~ww xY wc c}}w c c}}w # 1 sw Y   qxY w)BNr   rJ   r?   )rV  rG  )rf  z/P2P compilation disabled for P2POp constructionztorch.distributed.P2POpzP2P compilation is disabled.z3Set TORCHDYNAMO_ENABLE_P2P_COMPILATION=1 to enable.r   r   )NullContextVariabler   r   r_  zTypedDict with optional keysz<Dyanmo does not support tracing TypedDict with optional keysz(Avoid using TypedDict with optional keysiterablemaxlenrT   c                      y rV   r   )rr  rs  s     r[   deque_signaturez?UserDefinedClassVariable.call_function.<locals>.deque_signatureG  s     r^   z&collections.deque() with bad argumentszargs=	, kwargs=z8Detected call to collections.deque() with bad arguments.z$Fix the call to collections.deque().)r   r   r   r   from_excz.collections.deque() with bad iterable argumentzZCall to collections.deque() has an iterable argument that Dynamo cannot convert to a list.zeUse a simpler sequence type that Dynamo can convert to a list (e.g. list, tuple, list iterator, etc.))rs  r`  )ra  __exit__r   z!missing args to functools.partialr  z0functools.partial requires at least one argumentzFix the functools.partial call.)r   keywordsz0torch.cuda.device() requires a constant argumentra  rx  )TorchCtxManagerClassVariable)BaseUserFunctionVariable3FunctionDecoratedByContextlibContextManagerVariablezunsupported contextlib.* APIz 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,attempted to trace contextlib.contextmanagerz.Tracing contextlib.contextmanager is disabled.z7Set torch._dynamo.config.enable_trace_contextlib = Trueztorch.return_typesr\  r]  r^  )SizeVariablezPydantic dataclass constructorzwDynamo graph breaks on pydantic dataclass constructors because validation mutates the instance outside traced bytecode.rQ   c              3   <   K   | ]  }|j                           y wrV   )	is_tensor).0xs     r[   	<genexpr>z9UserDefinedClassVariable.call_function.<locals>.<genexpr>9  s     =!=   r  rH  rR   )register_graph_created_object)StreamVariable)EventVariableNN)rh  rK   rJ  rV  rG  ctx_managerrf  r+   r   distributedis_availablerz   P2POpr   enable_p2p_compilationr   rK  ri  r   rW   r   r   r   rC   r  r   itemsrM  CrossEntropyLossrS  
contextlibnullcontextrq  r   r   inline_user_function_returnr   construct_dictr  rb  r   rO   rE   is_supported_argr   	TypeErrorrc  call_custom_dictr   rB   r
   __optional_keys__r   r   r  dequer   r   r   r~   	signaturebind
USER_ERROR	argumentshas_force_unpack_var_sequenceforce_unpack_var_sequencelistsDequeVariabler  
MethodTyper   UserFunctionVariableget_namecm_objr   r  r
  r   weakrefrefWeakRefVariable	functoolspartial	functionsFunctoolsPartialVariablewarningscatch_warningsCatchWarningsCtxManagerVariabler   r   is_python_constantr   CUDADeviceVariabler   rw   rv   is_standard_new"cls_supports_mutation_side_effectsrp   r  rz  r{  r|  _AsyncGeneratorContextManagerclosingredirect_stdoutredirect_stderrAsyncExitStack_GeneratorContextManager_dynamoenable_trace_contextlibkeys_as_python_constantr  %instantiate_user_defined_class_objectr2   r   r9   r   r}  r   r   r   r   rQ   npr<   allrL  stackr8   r   rR   rD   graph_bytecode_inputsr  streamsr  !make_construct_in_graph_stream_fnr   r   r   make_construct_in_graph_event_fnrandomRandomRandomVariableMappingProxyTypeMappingProxyVariabler   r   )1r   r   r   r   rK   rV  rG  rf  constant_argsvarr  kvrq  default_factorydict_vtrs  ru  
bound_argser  r  fncallback	rest_argsrz  r{  r|  arg_newfn_var	args_listkwargs_dictr}  tuprQ   stackedrR   
var_kwargsvar_argsstreamr  r  indtensor_variableeventr  seedrandom_objectr   s1                                                   r[   r  z&UserDefinedClassVariable.call_function  s    	/=?+D&9))+

e>O>O>U>U0U00M5 >M	 ))((FF!((V4C
 OOB
DJ?J))+"(()'')6:;a**,;=C\\^LTQq!..00L  ZZ58844400T6BBZZ:1118&777ZZ;22211%%b)*B*BC 
 ZZ;2224yA~"+"<"<"C"CD"ITa +;;DGD,Y$q'K"&q')-&$33DDD#)G '''.0	  $**%zz++:

O ^B*66	 00AAD#)  ZZ;,,,//66t<F MQ"3-$.?BTz
 JDW..?DDdUfU
 )))Z111!++J7UU " P"'vYvh ?%-F /99
 #,,Z8RRSUV :///#--h7??00f4D4F 1  
 JJ%***D	Q47I$B$BC47$BCQ  "&??!W^^Fa!1!1!34==B//DGDKKPPZZ7;;&4y1}7$55<<TB,,T!Wh??ZZ9,,,? R9*55	 aBQRI &&??V @   ZZ82224<<CCBOOZZ5::,,,VD	Q7--/ %WX//66r47;U;U;WXXtDJJ'.

K 

J $$&>>>tzzJ0<6 zz88""****))  :#zzl#'::, /; !;*66	 GzzZ@@@ZQ24PQF }}++CC! N"'v$TU	2 d1g'CD!!WF $QI"&q'"A"A"CK!//I{KK HQQ H	 11%%	GG     tzz*!$**-SY!^',-t9+ZF}GD	 yy--KKJ  55#))IKK MDM  ZZ5::%+#**2u5CCBfUC		**&tzz2 8::,S'33 JJ$00221$**= , JJ"55INtAw5Q&*=tAw}}== (0"))00' +48  y$**ell30.AGPA_**2q114P
 )d4#113!446 R33"DD * #0))00')Evr#V #"K DJJ40 /AGPA_**2q114P
 )d4"

113!446 R23!BB * #0))00')Evr#  #" #00"))00'

 +48# #"ZZ6==(4yA~$q'"<"<">Aw113"MM$/M!-00JJ%000D	Q47$56 11$q'::;[;;DJJGDKK57 55#))IKK MDM  w$Rv66_ <L|  
D#D66(; Z>*55 	 	
v Q6 Qb s<   }} 2%}& 
!~$

!~*
8~0&	~!/'~~!0~9c                     t        j                  | j                  dd      }t        |t              r|j
                  }|t        j                  u S )z"Check for __new__ being overriddenr   N)r~   r   rz   r   r  r  rW   r   )r   new_fns     r[   r  z(UserDefinedClassVariable.is_standard_new  s<    ''

ItDfl+__F''r^   rO   c                     | j                   rGt        | j                   j                  t        j                  t
        j                  |                   t        j                  |t        | j                  |            S )Nattr)r   r!   
make_guardr  r  r    HASATTRrC   r  rv   rz   )r   r   r   s      r[   call_obj_hasattrz)UserDefinedClassVariable.call_obj_hasattr  s[     ;;&&%%l&:&:F
 $$RT)BCCr^   c                 Z    |dk(  r| j                   j                  S t        |   ||      S )Nrs   )rz   rs   r   const_getattrr   r   r   r   s      r[   r  z&UserDefinedClassVariable.const_getattr  s-    :::&&&w$R..r^   Tc                      yr   r   r   s    r[   is_python_hashablez+UserDefinedClassVariable.is_python_hashable      r^   c                 ,    t        | j                        S rV   )hashrz   r   s    r[   get_python_hashz(UserDefinedClassVariable.get_python_hash  s    DJJr^   otherc                 j    t        |t        j                        xr | j                  |j                  u S rV   )r   r   r   rz   r   r  s     r[   is_python_equalz(UserDefinedClassVariable.is_python_equal  s,    ui@@A *

ekk)	
r^   c                     | j                   S rV   r   r   s    r[   get_real_python_backed_valuez5UserDefinedClassVariable.get_real_python_backed_value  r   r^   )r   rM   rT   rC   )4rs   r   r   rw   rW   r   r   r   r   r   r   r   r  r  cacher   r   r   r   boolr   r   r   r   r   rC   r  r   r  r  r  r"  r2  r6  r9  r   r   rS  r   r   ro  r  r  r  r  r   r  r   r  r  r  __classcell__r   s   @r[   r   r      s   <"d6l "c "d "DL & :# : __
CV$5 
  
 __Fs4<0 F  F: __+s3x +  +( Ev E$ E ER4 R  # & -#- 
-Q
5 Q
S Q
_ Q
fT#T T 	T
 T 
T8H;#H; H; 	H;
 H; 
H;T;#; ; 	;
 ; 
; 2#2 2 	2
 2 
24X2 X X!3 ! !!3 ! !EA#EA 'EA S/)*	EA
 
EANb;#b; b; ?#	b;
 S/)*b; 
b;H")"		 "r7#r7 'r7 S/)*	r7
 
r7h( (	D)	D14	D		D/ 7 /s /s /
GDM    
V 
 
f r^   r   c                   \     e Zd Zedee   fd       Zdddee   de	e
ef   def fdZ xZS )!UserDefinedExceptionClassVariablerT   c                     | j                   S rV   r   r   s    r[   r  z$UserDefinedExceptionClassVariable.fn  s    zzr^   r   rM   r   r   c                 "   ddl m} | j                  l|j                  j                  j                  |j                  |t              | t        |            }|j                  |dt        |      t        |             |S t        | 1  |||      S )Nr?   rU  r   )rJ  rV  r   rK  rh  ri  r   rY   r   r   r   r   r  )r   r   r   r   rV  r  r   s         r[   r  z/UserDefinedExceptionClassVariable.call_function  s}     	/;; ))((FF!((];T
C
 OOB
DJVEJw$Rv66r^   )rs   r   r   r  rw   rW   r  r   rC   r   r   r  r  r  s   @r[   r  r    s_    DL  7#7 '7 S/)*	7
 
7 7r^   r  c                       e Zd Zy)RemovableHandleClassNrs   r   r   r   r^   r[   r  r    s     	r^   r  r   rM   r  .r   r   c                    ddl m} |D cg c]  }|j                          }}|j                         D ci c]  \  }}||j                          }}}t	        | j
                  j                        } ||i |}	t        |      }
| j
                  j                  j                  |||f        || |
      j                  |	      S c c}w c c}}w )Nr?   )VariableBuilder)
rJ  r  r   r  rb  rK  random_callsr&   rh   wrap_unspecialized_primitive)r   r  r   r   r  r  r  r  random_call_indexexample_valuer   s              r[   call_random_fnr    s     ),01qA  "1D14:LLNCDAqa%%''CFCBII223 ''M01FII!!2tV"45 2v&CCMRR 2Cs
   CCc                       e Zd ZU dZdZedz  ed<   dZee	   dz  ed<   ddhe
j                  Zddddddededz  dedz  d	edz  d
ee   dz  de	ddf fdZdefdZdefdZdQdZdddefdZdefdZdefdZdef fdZdef fdZdef fdZ	 	 	 	 dRdZdddef fdZdddefdZdddefdZdSdZ dddefd Z!ddd!ed"d#d$ee	   de"ee	f   defd%Z#e$e%jL                  dee	   fd&              Z'ddd'edef fd(Z(ddd)ed$e)e	   de"ee	f   def
 fd*Z*dddefd+Z+dddefd,Z,dddefd-Z-	 dTddd)eded.edef
d/Z.defd0Z/ddde)e   f fd1Z0dddefd2Z1ddde)e   fd3Z2dddefd4Z3defd5Z4ddd$ee   de"eef   def fd6Z5defd7Z6d8edefd9Z7d)edefd:Z8d)edefd;Z9d<edefd=Z:d<ede;eef   dz  fd>Z<ddd'edefd?Z=ddd)ede>fd@Z?ddd)edefdAZ@ddd)edBedCeAdz  def
dDZBddd)edBedCeAdz  def
dEZCddd)edFedCeAdz  def
dGZDddd)edCeAdz  deAdz  fdHZEddd)eddIfdJZFdefdKZGdeHfdLZIdMedefdNZJ	 	 	 	 	 	 	 	 	 	 	 	 dUdOZK	 	 	 	 	 	 	 	 	 	 	 	 	 	 dVdPZL xZMS )Wr   z_
    Mostly objects of defined type.  Catch-all for something where we only know the type.
    N_base_vt_base_methodsrz   
value_type)r  
cls_sourcebase_cls_vt	init_argsr  r  r  r   rT   c                h   t        |   di | || _        |xs t        |      | _        t        |      | j                  u sJ || _        |&| j                  t        | j                        | _        || _        || _	        d | _
        i | _        i | _        dd lmc m} |j!                  | j                        | _        |j!                  | j                        r>| j                  r2t%        | j                  j'                  t(        j*                               t-        | j                        | _        y )Nr   r   )r   r   rz   rw   r  r  r   r)   r  r  r  _looked_up_attrs_subobj_from_classtorch.utils._pytreeutils_pytreeis_constant_classis_pytree_constant_classr!   r  r    EQUALS_MATCHr7   _object_has_getattribute)	r   rz   r  r  r  r  r   pytreer   s	           r[   r   z"UserDefinedObjectVariable.__init__  s     	"6"
$3UE{doo---$$++"9(5DO '" 37
 46 68,,(.(@(@(Q%##DOO4$++001J1JKL(?

(K%r^   c                     | j                   j                  }|dv r t        t        | j                  dd             }| j
                  j                   d| dS )N)builtin_function_or_methodgetset_descriptormethod_descriptorrk  rs   r   r   )r  rs   r   r   rz   r   )r   inners     r[   __str__z!UserDefinedObjectVariable.__str__A  sU    (( 
 
 

J=>E..))*!E7!44r^   c                 b    | j                   j                   d| j                  j                   dS r   r   rs   r  r   s    r[   r   z"UserDefinedObjectVariable.__repr__L  +    ..))*!DOO,D,D+EQGGr^   r   rM   c                 |    | j                   %t        j                  j                  ||       | _         | j                   S rV   )r  r   rP   r   r5  s     r[   get_dict_vtz%UserDefinedObjectVariable.get_dict_vtO  s0    <<$77>>r4HDL||r^   rh  rK   c                 R    | j                   |j                  | j                         S yNF)r  is_modified)r   rh  s     r[   is_base_vt_modifiedz-UserDefinedObjectVariable.is_base_vt_modifiedT  s$    ==$++DMM::r^   c                     | j                   S rV   r  r   s    r[   python_typez%UserDefinedObjectVariable.python_typeY  s    r^   c                     | j                   S rV   r   r   s    r[   r  z6UserDefinedObjectVariable.get_real_python_backed_value\  r   r^   c                 4   t        | j                  t        j                  t        j
                  t        j                  j                  j                  f      r| j                  S | j                  r| j                  r| j                  S ddlm} t        | j                  |      rgddlm}  |j                         }|N|j                   rB|j"                  j$                  j'                  | dd      }||j)                         } ||      S t*        | Q         S )Nr   )_MaskModWrapperrL   r  T
deleted_ok)r   rz   r   r   r   DispatchKey_C
_functorchTransformTyper  r   !torch.nn.attention.flex_attentionr2  torch._dynamo.symbolic_convertrM   
current_txexportrK  rh  	load_attrr   r   )r   r2  rM   r   fn_vtr  r   s         r[   r   z,UserDefinedObjectVariable.as_python_constant_  s    JJYY))588+>+>+L+LM
 ::((T[[ :: 	Fdjj/2L1&113B~"))		..88tPT8U$ 113B*2..w)++r^   c                     t        | j                  t        j                        r;t        | j                  t              rt	        | j                        S | j                  S t
        |          S rV   )r   rz   r   r   r   r   r   r   r   s    r[   r   z"UserDefinedObjectVariable.as_proxy  sI    djj$)),$**c*4::&::w!!r^   c                     | j                   r>t        | j                   j                  t        j                               | j
                  S t        |          S rV   )r   r!   r  r    ID_MATCHrz   r   guard_as_python_constantr@  s    r[   rC  z2UserDefinedObjectVariable.guard_as_python_constant  s?    ;;$++001F1FGH::w/11r^   c                    | j                  d      ro| j                  |dg i       }|j                         rI|j                         }t	        |t
              s)t        t        |dt        |      j                   g       |S y )Nr   z&__bool__ should return bool, returned r   )
r   r   r  r   r   r  r   r  rw   rs   )r   r   resultresult_values       r[   r   z#UserDefinedObjectVariable.bool_impl  s     ++J7%%b*b"=F((*%88:!,5,!DT,EWE`E`Dab Mr^   c           	         t        j                  t        | j                        dd       }|t        |   |      S | j                  xr | j                  |d      }| j                  |d||      }|j                  |g i       }|j                         rVt        |j                         t              s8t        t        |dt        |j                               j                    dg       |S )N	__index__z!__index__ returned non-int (type r   r   )r~   r   rw   rz   r   nb_index_implr   get_source_by_walking_mroresolve_type_attrr  r  r   r   r   r   r  rs   )r   r   	type_attrr   
method_varrE  r   s         r[   rI  z'UserDefinedObjectVariable.nb_index_impl  s     **4

+;[$O	7(,,P!?!?K!P++BYO
))"b"5 $$&z%%'0
 %7V=V=V=X8Y8b8b7ccde r^   c           	      |   | j                   xr | j                  |d      }| j                  |dt        j                  t        | j                        d      |      }|j                  |g i       }t        |j                         t              s/t        t        |d|j                         j                   dg       |S )N__int__z__int__ returned non-int (type r   r   )r   rJ  rK  r~   r   rw   rz   r  r   r/  r   r   r  rs   r   r   r   rM  rE  s        r[   nb_int_implz%UserDefinedObjectVariable.nb_int_impl  s     N!?!?I!N++""4

#3Y?	

 ))"b"5&,,.4$5f6H6H6J6S6S5TTUV r^   c           	      |   | j                   xr | j                  |d      }| j                  |dt        j                  t        | j                        d      |      }|j                  |g i       }t        |j                         t              s/t        t        |d|j                         j                   dg       |S )N	__float__z#__float__ returned non-float (type r   r   )r   rJ  rK  r~   r   rw   rz   r  r   r/  r   r   r  rs   rP  s        r[   nb_float_implz'UserDefinedObjectVariable.nb_float_impl  s     P!?!?K!P++""4

#3[A	

 ))"b"5&,,.6$9&:L:L:N:W:W9XXYZ r^   c                 .    t        |       s
J d|         y )Nz<calling torch function on object without __torch_function__ )r0   r   s    r[   torch_function_checkz.UserDefinedObjectVariable.torch_function_check  s!    !$' 	
J4&Q	
'r^   c                 @    | j                          ddlm}  |||       S )Nr?   )get_torch_function_fn)rV  torch_functionrX  )r   r   rX  s      r[   get_torch_fnz&UserDefinedObjectVariable.get_torch_fn  s    !!#9$R..r^   r  r  rR   r   c                 f    | j                          ddlm}  ||| j                  |      ||||      S )Nr?   )call_torch_function)rV  rY  r\  rZ  )r   r   r  r  r   r   r\  s          r[   r\  z-UserDefinedObjectVariable.call_torch_function  s=     	!!#7"b!
 	
r^   c                      t         j                   t         j                  t         j                  t         j                  h} | S rV   )r  randint	randrangeuniform)fnss    r[   _supported_random_functionsz5UserDefinedObjectVariable._supported_random_functions  s0     MMNNNN	
 
r^   keyc                    | j                  d      }| j                  6| j                  *|| j                  v r| j                  j                  ||      S t	        |t
        j                        rU| j                  xr | j                  |d      }t        j                  || || j                        j                  ||gi       S t        |   ||      S )N__getitem__r0  r   )r   r  r  mp_subscript_implr   r  r	  r   rJ  r   r
  r  r   )r   r   rc  rk  r0  r   s        r[   rg  z+UserDefinedObjectVariable.mp_subscript_impl  s     11-@MM%"".$,,,==222s;;fe001 (F(FM)I //	$++mBr*+ w(S11r^   r   c                    ddl m} ddl m} ddlm} | j                  |      }|1|t        j                  u r |j                  d       S t        |      s$t        | j                  t        j                        r | j                  |g|i |S t        |      r(| j                  ||d   t!        j"                               S |t        j$                  u rkt'        |      dk(  r]|s[|d   }	t        |	t(              st+        j,                  |t.              S t+        j,                  || j                  |	j                  u       S t0        j2                  j4                  j6                  rJt        | j                  t8        j:                        r&t=        dd| j                   d	| d
| d| ddg       t        | j                  t0        j>                  j@                        r4||jB                  v r&t=        dd| d| dg tD        jF                         | jH                  8| jJ                  ,|| jJ                  v r| jH                  jM                  ||||      S t        |t8        jN                        rm| jP                  }
d }|
r| jS                  ||      }ddl*m+} |t0        jX                  jZ                  j                  u r|} ||| ||
      j]                  |||      S |t^        j`                  u rk| jP                  r_|s]|s[tc        | jP                  je                  tf        jh                               t+        j,                  |t'        | j                              S tj        |   ||||      S )Nr   trace_rulesr?   )r
  rN   r   zcall_method on generatorobject=z	, method=, args=rv  zWDetected a method call to a user-defined generator object. This is not fully supported.zSet `torch._dynamo.config.enable_faithful_generator_behavior = False`. Note that this may cause silent incorrectness, since we will eagerly unpack generators instead of lazily evaluating them.r   ztorch.Generator methodztorch.Generator.zM() is a stateful RNG operation that cannot be soundly traced in the FX graph.unpatched_nn_module_initrf  )6r  rj  r
  r   rO   r   rW   r   r   r\   r   rz   	threadinglocalmethod_setattr_standardra   r   DeletedVariablerZ  rb  r   rC   r  NotImplementedr   r  r   "enable_faithful_generator_behaviorr  GeneratorTyper   r6  	Generator#_GENERATOR_METHODS_THAT_GRAPH_BREAKr   FUNDAMENTALr  r  r   r	  r   rJ  mutation_guardrn  rM  Moduler  r   r/  r!   r  r    SEQUENCE_LENGTHr   )r   r   r   r   r   rj  r
  rO   rk  r  r   r0  rn  r   s                r[   r   z%UserDefinedObjectVariable.call_method-  s    	#(.11$7(.'..t44"6*jY__.U3t33BHHHH"6*33Q!:!:!<  &3t9>&Q!%)BC*00^DD ',,Ru{{1JKK}}##FF:

E//L 6%djj\4&vYW]V^_!3+
 4::uxx'9'9:KKKK4.tf5"24& 9O !O:-99: )&&2d000}}00T4HH &%"4"45 	 $ > >r4 HIEUXX__5555F)DIf-D&12 %$++tvdkk44\5Q5QRS&,,RTZZAAw"2tT6::r^   c                    | j                  d      }|r| j                  d      }| j                  xr | j                  |d      }| j	                  |d||      }t        |t        j                        s|j                  |g i       S t        d| j                          dd| j                          dg t        j                         y )Nr/  z!Cannot trace user-defined __len__z
.__len__()zDynamo cannot trace len() on zu because the __len__ method is either not traceable (e.g., defined in C or built-in) or returns a non-constant value.r   )r   lookup_class_mro_attrr   rJ  rK  r   r   r  r  r   r1  r   r  )r   r   rk  rL  r   rM  s         r[   r2  z"UserDefinedObjectVariable.len_impl  s    11)<229=I[[RT%C%CB	%RF//Iy&QJj)*C*CD!//B;;7,,./z:/0E0E0G/H I& &"..	
r^   c                     | j                   D| j                  8| j                  d      | j                  v r| j                   j                  |      S | j	                  |      S Nr/  )r  r  r   r6  r2  r5  s     r[   r6  z#UserDefinedObjectVariable.sq_length  U    MM%"".00;t?Q?QQ==**2..}}R  r^   c                     | j                   D| j                  8| j                  d      | j                  v r| j                   j                  |      S | j	                  |      S r  )r  r  r   r9  r2  r5  s     r[   r9  z#UserDefinedObjectVariable.mp_length  r  r^   directly_update_dictc           
         d}	 |j                         }|j                  j                  j                  |       sJ d	       t        j                  j                         rt        | j                        t        j                  j                  u rW|j                  j                  j                  | |      s|| j                  j                  v rt        d
d|  d| d| ddg       |dk(  rt        dd|  d| ddg       |r#| j                  |      j                  ||       nS| j!                  |      }|r|\  }}d }	d }
| j"                  r'| j%                  ||      }	t'        t)        |	      d      }
t+        j,                  |||	      }t+        j,                  |||
d      }t/        |t0              r| |g}n|| |g}|j3                  ||i       S t5        j6                  t        | j                        |d       }t/        |t0              rm|j8                  ad }| j"                  rt'        | j%                  ||      d      }t+        j,                  ||j8                  |      }|j3                  || |gi       S t;        | j                  d      ss| j=                  |      }t5        j>                  |      sMt+        j,                  |dt        | j                        j@                   d| d      }tC        tD        ||g       |j                  j                  jG                  | ||       tH        jJ                  jM                  d       S # t        $ r t        dd|  d| d| ddg       Y Ww xY w)Nr  z-non-const setattr name on user-defined objectrk  , name=z, value=zODetected a call to `setattr` of a user-defined object with a non-constant name.z!Ensure that the name is a string.r   z`Attempted setattr on a user-defined object that does not have an AttributeMutation mutation_typezP2POp mutationzCDynamo does not support mutating torch.distributed.P2POp instances.zaConstruct a new torch.distributed.P2POp instead of mutating an existing one inside torch.compile.r   z+__class__ assignment on user-defined objectzFDynamo does not support reassigning __class__ on user-defined objects.zBMove the __class__ assignment outside of the torch.compile region.r   Trealizefsetr   r}   r   ' object has no attribute 'r   )'r   rm  r   rK  rh  is_attribute_mutationr   r  r  rw   rz   r  has_pending_mutation_of_attrr}   r(  setitem$try_get_descritor_and_setter_py_funcr  rJ  r"   r)   rC   r  r   r  r  r~   r   r  rv   r}  ismemberdescriptorrs   r   r   
store_attrr   rO   r   )r   r   r   rz   r  name_strtmpr(  setterdesc_sourcefunc_sourcedesc_varfunc_varr   fset_sourcefset_var	error_msgs                    r[   rq  z1UserDefinedObjectVariable.method_setattr_standard  sP    	..0H yy%%;;DA 	
1	
A **,TZZ E$5$5$;$;;		&&CCD(Stzz222 (!$wtfHUGDaw	 {"E!$xw7dX	  R ((59;;HEC%("
F #"??"&"@"@X"NK",Z-Di"PK*00ZM*00V[RVWj(3 %=D$dE2D--b$;;
 !//TZZ0@(DQJ*h/JOO4O"??",66r8Df#K +00
  --b4-DD tzz:.33H=J--j9+11TZZ(1122MhZWXY	 )9+N
		))$%@))0066} # 	G!$wtfHUGDm:;	 	s   M "M,+M,c                     t        t        j                  | j                  dd              xr% t	        | j                  t
        j                         S )NrX   )r\   r~   r   rz   r   ro  rp  r   s    r[   needs_slow_setattrz,UserDefinedObjectVariable.needs_slow_setattr  sD    &""4::}dC
 
 :TZZ99	:r^   c           
         | j                   H| j                  <| j                  d      }|)|| j                  v r| j                   j                  |      S | j                  r| j                  d      t
        j                  u r| j                  d      t
        j                  u r| j                  d      t
        j                  u rt        | j                  j                  t        j                               t        t        | j                              D cg c]D  }t         j"                  j%                  | j                  |   t'        | j                  |            F c}S t(        |   |      S c c}w )N__iter__r/  re  r   )r  r  r   ro  r   r   r  r/  re  r!   r  r    r{  rangerb  rz   r   LazyVariableTrackerr   r%   r   )r   r   iter_methodr  r   s       r[   ro  z-UserDefinedObjectVariable.unpack_var_sequence  s-   ==$););)G:::FK&;$:L:L+L}}88<<KK00<M00;t||K00?4CSCSS$++001M1MNO s4::/
 	 --44JJqM(a8 5   w*2..s   A	E3c                     ddl m} 	 |j                  |t              j	                  || gi        y# t
        $ r t        |       Y yw xY w)Nr?   rU  TF)rJ  rV  r   iterr  r   r   )r   r   rV  s      r[   r  z7UserDefinedObjectVariable.has_force_unpack_var_sequence4  sH    .	$$R.<<R$L  	%b)	s   (1 AAc                     ddl m} g }|j                  |t              j	                  || gi       }	 	 |j                  |      }|j                  |       $# t        $ r t        |       Y |S w xY w)Nr?   rU  )	rJ  rV  r   r  r  next_variablerh   r   r   )r   r   rV  rE  iter_rs         r[   r  z3UserDefinedObjectVariable.force_unpack_var_sequence>  sy     	/!((T2@@dVRP''+a   - )"-s   "A A.-A.c                 *    | j                  |dg i       S )N__next__)r   r5  s     r[   r  z'UserDefinedObjectVariable.next_variableO  s    JB77r^   c                 Z    	 | j                   | j                         v S # t        $ r Y yw xY wr*  )rz   rb  r  r   s    r[   is_supported_randomz-UserDefinedObjectVariable.is_supported_randomR  s1    	::!A!A!CCC 		s    	**c                 |   | j                         rJt        d |D              r8t        d |j                         D              rt        || j                  ||      S t        | j                  t        j                        r+| j                  j                  }| j                  j                  }|t        j                  j                  j                  j                  u r]t        j                   j#                  |j$                        r4|s2|s0t        j                   |j$                        j'                  |||      S |t        j(                  j*                  j,                  j                  u r|j$                  t        j(                  j*                  j,                  u rQt/        j0                  ||j2                        }t        j                   |j$                        j'                  ||g|      S | j4                  4t7        dd| j                   d| d| d| dd	| j                   d
g       | j4                  J t9        | j4                  d      }t/        j0                  |||d      }t9        | j4                  d      }	t/        j0                  |||	      }
|j'                  ||
g|z   |      S t;        | j                        rl| j4                  rL| j<                  J t9        | j<                  d      }t?        |jA                  tB        jD                               | jG                  |d||      S tH        | M  |||      S )Nc              3   <   K   | ]  }|j                           y wrV   r  )r  r  s     r[   r  z:UserDefinedObjectVariable.call_function.<locals>.<genexpr>a  s     9qA((*9r  c              3   <   K   | ]  }|j                           y wrV   r  )r  r  s     r[   r  z:UserDefinedObjectVariable.call_function.<locals>.<genexpr>b  s     DqA((*Dr  z<attempted to call sourceless user-defined object as a methodrk  z, function=rl  rv  zDynamo does not support this.zEnsure the user-defined object z, is constructed outside the compiled region.r   r  Tr  r   __call__)%r  r  valuesr  rz   r4   r  r  r  r   r   r  _contextlib_DecoratorContextManagercloner   rz  is_matching_clsr   r  autograd	grad_modeinference_moderC   r  moder   r   r"   ru   r  r!   r  r    CLOSURE_MATCHr   r   )r   r   r   r   r%  rq   r  func_srcr  obj_srcobj_varsource_attrr   s               r[   r  z'UserDefinedObjectVariable.call_functionY  s    $$&9D99DFMMODD!"djj$??DJJ 0 01::&&D**%%C//HHNNN::JJMM  ==MM-D&12
 00??EEEMMU^^%=%=%L%LL &++B9 ==MM-SE623 {{"Z%djj\TF'$yY_X`a ?9$**Eqr	 ;;***!$++z:H&,,RxNH j9G%++BW=G))"wi$.>GGdjj!{{222(*Ek44\5O5OPQ##B
D&AAw$Rv66r^   c                 ,    t        | j                        S rV   )r/   rz   r   s    r[   _check_for_getattrz,UserDefinedObjectVariable._check_for_getattr  s    !$**--r^   subobjc                     t        |t              syt        |j                  t        j                        xs= t
        j                  j                  j                  j                  |j                        S r*  )
r   r  r  r  BuiltinFunctionTyper   r6  r  r  is_instancemethod)r   r  s     r[   _is_c_defined_propertyz0UserDefinedObjectVariable._is_c_defined_property  sV    &(+ KK22
 CXX##55fkkB	Cr^   c                    || j                   v r| j                   |   S t        j                  | j                  |t              }| j
                  ss|t        u s;t        j                  |      s&t        j                  |      s| j                  |      r0t        | j                        j                  | j                  |      }n| j
                  r|t        u rt        || j                   |<   |S rV   )r  r~   r   rz   rA   r  r  isgetsetdescriptorr  rw   r   r   )r   r   r  s      r[   _getattr_staticz)UserDefinedObjectVariable._getattr_static  s    4(((((..''

D.I ,,n$))&1))&1**62 $**%66tzz4HF**v/G ! &,d#r^   c                     || j                   v r| j                   |   S t        }| j                  j                  j                  D ]!  }||j
                  v s|j
                  |   } n || j                   |<   |S )u  Walk type(obj).__mro__ to find *name* in the class hierarchy.

        This only searches the class chain (type(obj).__mro__), NOT the
        metaclass chain (type(type(obj)).__mro__).  The distinction matters
        because inspect.getattr_static conflates both chains — it can return
        metaclass descriptors (e.g. type.__dict__['__annotations__'], a
        getset_descriptor) when the attribute doesn't exist on the class MRO.
        Walking cls.__mro__ directly avoids that leak.
        )r  rA   rz   r   r   r}   )r   r   rE  r   s       r[   r}  z/UserDefinedObjectVariable.lookup_class_mro_attr  s{     4*****400JJ((00 	Dt}}$t,	 )/%r^   	attr_namec                    t        j                  t        | j                        |d       }t        j                  t        |      dd       }|r>t        j                  |      ry| j
                  r| j
                  j                  |      ryy)Nr   TF)r~   r   rw   rz   
isfunctionr  containsr   r  r(  r  s       r[   should_skip_descriptor_setterz7UserDefinedObjectVariable.should_skip_descriptor_setter  sl    ++D,<iN
''Z(8)TJ!!&) $,,"7"7	"Br^   c                    t        j                  t        | j                        |d       }t	        |t
              r|j                  ||j                  fS t        j                  t        |      dd       }t        j                  |      r||fS y )Nr   )r~   r   rw   rz   r   r  r  r  r  s       r[   r  z>UserDefinedObjectVariable.try_get_descritor_and_setter_py_func  sx     ++D,<iN
j(+
0K
00''Z(8)TJf%''r^   c                    |j                   j                  j                  | |      rC|j                   j                  j                  | |d      }t	        |t
        j                         S || j                  j                  v S )NTr3  )	rK  rh  r  r=  r   r   rr  rz   r}   )r   r   rc  mutated_attrs       r[   has_key_in_generic_dictz1UserDefinedObjectVariable.has_key_in_generic_dict  sk    99!!>>tSI9911;;D#RV;WL!,	0I0IJJJ djj))))r^   c                    | j                   J t        t        | j                        j                        D ]  \  }}||j
                  v s|j
                  |   }t        d|      D ]  }t        | j                        j                  |   }t        |      |f}||j                  j                  v rK|j                  j                  j                  |       t        | j                         }	t        |	|      }
t        |
      }t        |j                  t!        j"                  t$        j&                  |                    | j(                  rt+        | j                  d      rk|| j                  j
                  vrSt+        |d      sGt        | j(                  j                  t!        j"                  t$        j,                  |                   t        |      |f}|j                  j.                  }||v r||   c S |dk7  r"t        | j                         }	t        |	|      }
n| j                   }
t        |
      }t1        ||      }|||<   |c S  t3        dd| d	t        | j                         d
t        | j                        j                   d| dt        | j                        j                   d| d| j                   dgt4        j6                         y )Nr?   )rc  r}   r   r  r   z#could not find name in object's mrozname=z, object type=z, mro=zCould not find name `z	` in mro zEnsure the name `z` is defined somewhere in z's type hierarchy.r   )r  	enumeraterw   rz   r   r}   r  idrK  guarded_mro_absent_keysaddr(   r%   r'   r!   r  r  r  r    DICT_NOT_CONTAINSr   rv   NOT_PRESENT_IN_GENERIC_DICTmro_source_cacher$   r   r   r  )r   r   r   idxrj  r(  
absent_idxabsent_klass	cache_key
mro_sourceklass_sourcedict_sourcer  
out_sources                 r[   rJ  z3UserDefinedObjectVariable.get_source_by_walking_mro  s    ***#D$4$<$<= ?	"JCu~~%"^^D1
 #(3- J#'

#3#;#;J#GL!#L!14 8I BII$E$EE II5599)D!.t!?J+8Z+PL"0">K!#..%--l.L.LRVW, KK

J7DJJ$7$77#J	:!..%-- , H Ht  
^T2			22% ++!8!.t!?J#0S#AL#'??L,\:.{DA
#-i !!?	"B 	9D6TZZ0@/ATZZHXH`H`Gab/vYtDJJ?O?W?W>XY#D6)CDJJ<Oab"--		
r^   c                    | j                   rt        | j                   |      nd }| j                  rt        j                  t        | j                        d      }| j                   rt        | j                   d      nd }	 t        j                  || |      j                  |t        j                  ||      gi       S |j                  j                  j!                  | |      r{|j                  j                  j#                  | |d      }t%        |t        j&                        r7t)        t*        |dt        | j                        j,                   d| dg       |S |dk(  r7t/        | j                  d      st)        t*        |       | j1                  |      S |d	k(  r=|}|| j2                  }n|}t        j                  |t        | j                        |      S d
dlm} | j9                  |      }	|	t:        j<                  j>                  j@                  u r|}	|	tB        urtE        |	      r| jG                  |||	|      S t/        | j                  d      r[|| j                  jH                  v rC| j                  jH                  |   }
| jK                  |||      }t        j                  ||
|      S |	tB        ur| jM                  |||	|      S | j                  sZ	 t        | j                        jO                  | j                  |      }| jK                  |||      }t        j                  |||      S | jQ                         }t%        |tR        jT                        r|tV        u rt%        | t        jX                        rt[        | j                  j\                  t^              r[t[        | j                  j`                  t^              r7t[        | j                  jb                  t^              r| je                  ||      }nkd }| j                   rt        | j                   d      }t        j                  || |      j                  |t        jf                  ji                  |      gi       }| j                   ry|t:        j<                  j>                  jj                  u rSt%        |t        jX                  t        jl                  f      r)|jo                  t        | jq                         |             |S |7ts        dd| j                   d| d| d| d| j                   d| ddg       t)        t*        |dt        | j                        j,                   d| dg       y # t        $ r t        |       Y w xY w# t*        $ r Y Vw xY w)Nr   r   Tr3  r   r  r   r}   r   r   rm  r   z1User-defined object with non-function __getattr__rk  r  z, getattr_fn=z!Found a non-function __getattr__ z from a user-defined object z  when attempting to getattr ``z3Ensure the object's __getattr__ is a function type.r   ):r   r"   r  r~   r   rw   rz   r   r
  r  rC   r  r   r   rK  rh  r  r=  r   rr  r   r   rs   rv   r(  r  ry  rn  r}  r   rM  rz  r   rA   r   resolve_data_descriptorr}   (maybe_wrap_nn_module_source_for_instancerK  r   r  r  r	  r>   UnspecializedNNModuleVariabler4   _parametersr   _buffers_modules manually_trace_nn_module_getattrrO   r   r   NNModuleVariableset_nn_module_stack_sourceget_nn_module_stack_sourcer   )r   r   r   r   getattribute_fn
new_sourcerE  r  rn  rL  r  r  
getattr_fnouts                 r[   r  z%UserDefinedObjectVariable.var_getattrH  s   AE
4;; =RV((%44TZZ "4O @D{{
4;;(:;PT . 33#%  -_%:%:2t%D$ErJ	K 99!!>>tTJYY++55dDT5RF&)";";<("D,5566QRVQWWXY M:4::z2(<##B''
 ;(.J~!__
#
"((T$**-=zJJ=  ..t4	 0000I N*/A)/L//D)VLL
 4::z*ttzz7J7J/JZZ((.FBB2tVTF"((VV<< N*))"dIvFF  ,,

+<<TZZNFFr4QWX&,,R6BB
 ,,.
j%"4"4599tY%L%LM4::11484::..54::..5;;BE!
;;!+DKK!GJ22Z-Y%?%?%F%Ft%L$MrR  {{zUXX__-H-HH!??!22 22"4#B#B#DdK J#K!$**WTF-
|T?
|Kghlhrhrgs t004vQ8 J 	!d4::&//00KD6QRST	
S * .)"-.t " s%   ?=U$ AU? $U<;U<?	VVrL  r   c           
         t        |t              rp| j                  |      s_| j                  rt	        | j                  ||      d      }t        j                  ||j                  |d      }|j                  || gi       S t        j                  t        |      dd      }t        |t        j                        r| j                  ||||      S 	 t        | j                         j#                  | j                   |      }t        j                  ||      S # t$        $ r: t'        t$        |dt        | j                         j(                   d| dg       Y Yw xY w)	zMHandle data descriptors found on the type MRO (property, _tuplegetter, etc.).r  T)r   r  r   Nr   r  r   )r   r  r  r   r"   rJ  rC   r  r  r  r~   r   rw   r  r	  invoke_descriptor_getrz   r   r   r   rs   )r   r   r   rL  r   r$  r&  r  s           r[   r  z1UserDefinedObjectVariable.resolve_data_descriptor  s8    i*43N3N4
 {{#D$B$B2t$LfU%++INN64G ((dVR88''YDIfe001--b$	6JJ		DJJ'88TJH $$R6::  	$TZZ(1122MdVSTU	s   /D A EEc                 8   ddl m} ||u s&|t        j                  j                  j
                  u r|}| j                  duxr | j                  du}t        |t              rP|rt        | j                  ||      d      }|j                  | j                        }t        j                  |||      S t        |t               rSd}|rt        | j                  ||      d      }t#        j$                  |j&                  | j)                  |d      ||      S t        |t*        j,                        r3|j                  | j                  d      }t        j                  |||      S t/        |      rt#        j0                  |d| |      S t        |t*        j2                        rdt5        |d	      r)|j6                  }|rt        |d	      nd}t5        |d	      r)d}	|r| j                  ||      }	t#        j$                  || |	|      S t9        j:                  t=        |      d
d      }
t        |
t*        j2                        r| j?                  ||||      S t        |t*        j@                  t*        jB                  t*        jD                  f      s>t        jF                  jH                  jJ                  jM                  |      stO        |      rddl(m)} |jU                  |      rKddl+m,} |j[                         }|j]                  |      }|"|j^                  }t#        j$                  ||       S t#        j`                  | |t=        |      |      S |r| j                  ||      }n$|s"| j                  t        | j                  |      }t        j                  |||      S )zIHandle non-data descriptors and plain class attributes from the type MRO.r   rm  Nr  r   rf  __wrapped__r   _torchdynamo_inliner   ri  r?   )PolyfilledFunctionVariable)1ry  rn  r   rM  rz  r   r  r   r   r  r"   rJ  r   rz   rC   r  r  r   r
  r  r  r  r  r1   WrapperUserMethodVariabler	  rv   r  r~   r   rw   r  MethodDescriptorTypeWrapperDescriptorTypeMethodWrapperTyper6  r  r  r  ry   r  rj  is_polyfilled_callabler  r  _get_polyfill_handlersrl   __torch_dynamo_polyfill__r  )r   r   r   rL  r   rn  can_use_mro_sourcer%  r0  
var_sourcer&  rj  r  polyfill_handlerswrappedtraceable_fns                   r[   rK  z+UserDefinedObjectVariable.resolve_type_attr	  s4    	> 11EHHOO4440I!__D8TT[[PT=Ti. "#222t<j $$TZZ0D"((T6::	;/I!&222t<j	 //""  [1#	  	5#B#BC$$TZZ6D"((T6::*9566=$v  	5#5#56)%:;%99	FLF,ABRV )%:; J!!;;BE
//4:f  ''YDIfe001--b$	6JJ ..//++ xx%%77	B!),&11)<A$>$U$U$W!044Y?&#*#D#DL$77dKK,,T4iQWXX 33B=FDOO76F$$RF;;r^   r(  c                 p   d}d}| j                   r?| j                  ||      }t        t        |      d      }t	        j
                  |||      }nt        |      }t        t        | j                              }t        j                  |j                  j                  ||      j                  || |gi       S )z3Trace a descriptor's __get__(instance, owner) call.Nr   r   )r  rJ  r"   r)   rC   r  r   r   rw   rz   r   r
  r   r  r  )	r   r   r   r(  r   r*  r+  r,  	owner_vars	            r[   r  z/UserDefinedObjectVariable.invoke_descriptor_gety	  s     ! $?? $ > >r4 H$.z:K/Li$X!,222zCTUN6zBN,T$**-=>	++''(
 -T9-r
2		3r^   c                 $   |rt        | t        j                        rs|j                  j                  r$t
        j                  j                  j                  r9|dv r$| j                  J t        | j                  |      }| j                  |      }|S )zCWrap source for nn.Module instance dict attribute access if needed.)r  r  )r   r   r  rK  r<  r   r  r   install_free_tensorsr   r*   _wrap_source)r   r   r   r   s       r[   r  zBUserDefinedObjectVariable.maybe_wrap_nn_module_source_for_instance	  st     4!H!HIYY%%)=)=)R)R22{{...7TJ&&v.Fr^   rO   c                    | j                   rGt        | j                   j                  t        j                  t
        j                  |                   	 | j                  ||      }t        j                  |t        |t        j                               S # t        $ r- t        |       t        j                  j!                  d      cY S w xY w)Nr  F)r   r!   r  r  r  r    r  r  rC   r  r   r   rr  r   r   rO   r   )r   r   r   var_vts       r[   r  z*UserDefinedObjectVariable.call_obj_hasattr	  s     ;;&&%%l&:&:F	<%%b$/F"((
69+D+DEE  & 	<%b)--44U;;	<s   A B 3CCc                 |    t        | j                  |        | j                  | j                  j                         S yr   )r:   rz   r  r  r   s    r[   r  z,UserDefinedObjectVariable.is_python_hashable	  s0     T2==$==3355r^   c                 x    | j                   | j                   j                         S t        | j                        S rV   )r  r  r  rz   r   s    r[   r  z)UserDefinedObjectVariable.get_python_hash	  s.    ==$==0022DJJr^   r  c                     t        |t              rA| j                         r1|j                         r!| j                         |j                         k(  S t        |t              sy| j
                  |j
                  u S r*  )r   rC   r  r   r   rz   r  s     r[   r  z)UserDefinedObjectVariable.is_python_equal	  sb    uo.'')((***,0H0H0JJJ%!45zzU[[((r^   c                 `   t        t        |dd      dd      }|j                  d      }|r	 ddl}ddlm}	 | j
                  |	v xs8 |j                  | j
                        xs |j                  | j
                        }
|
s4|j                  d      }|!	 |j                         }|| j
                  f|	v }
n[ddlmc m} | j
                  |j(                  v xs8 |j                  | j
                        xs |j                  | j
                        }
|
s|j+                  || g|i       S | j                  |||||      S # t        $ r | j                  |||||      cY S w xY w# t        $ rB ddl}|j                  t              }|j!                  d	       | j                  |||||      cY S w xY w)
aE  Emulate tree_map behavior for user-defined objects.

        In pytree, a type is a leaf if it is NOT in SUPPORTED_NODES.
        User-defined objects (that are not registered with register_pytree_node)
        are always treated as leaves. This works for both torch.utils._pytree
        and optree implementations.
        r  Nr   r  optreer   _NODETYPE_REGISTRY	namespacezYFailed to import optree.registry._NODETYPE_REGISTRY, falling back to tracing for tree_map)r   r!  r  optree.registryr  r  is_namedtuple_classr   rl   r   rm  _tree_map_fallbackri   logging	getLoggerrs   warningr  r  r  SUPPORTED_NODESr  )r   r   tree_map_fnmap_fnresttree_map_kwargstree_map_module	is_optreer  r  is_registerednamespace_varr  r  logr  s                   r[   call_tree_map_branchz.UserDefinedObjectVariable.call_tree_map_branch	  s     "'+tT"BLRTU#..x8	/>
 OO'99 B11$//BB00A  %$3$7$7$DM$0(5(H(H(JI !* $- "4-4M> 10 6#9#99 >--doo>>,,T__=  ''TMDM2>>
 &&
 	
W  3 #'#:#: " + & $ /$   ''1; ..# s1   A'E"  D> >EE" EE" "AF-,F-c           	      |   |j                         }|j                  d      }|r	 ddl}	ddlm}
 | j
                  |
v xs8 |	j                  | j
                        xs |	j                  | j
                        }|s4|j                  d      }|!	 |j                         }|| j
                  f|
v }n[ddlmc m} | j
                  |j                   v xs8 |j                  | j
                        xs |j                  | j
                        }|sNt#        j$                  |D cg c]  }t'        j(                  ||       c}      }|j+                  ||| g|i       S | j                  ||||||      S # t        $ r | j                  ||||||      cY S w xY w# t        $ r | j                  ||||||      cY S w xY wc c}w )zEmulate tree_map_with_path behavior for user-defined objects.

        Same logic as call_tree_map_branch but passes keypath to the map function.
        r  r   Nr  r  )
get_moduler!  r  r  r  r  r  r   rl   r   rm  _tree_map_with_path_fallbackri   r  r  r  r  r   rR   rC   r  r  )r   r   r  r  r  r  keypathr  r  r  r  r   r!  r  r  r  keypath_vars                    r[   call_tree_map_with_path_branchz8UserDefinedObjectVariable.call_tree_map_with_path_branch.
  s    &002#..x8	$> OO'99 B11$//BB00A  %$3$7$7$DM$0(5(H(H(JI ) $- "4-4M. 10 6#9#99 >--doo>>,,T__=  #117>?!&&r1-?K ''[$,F,FKK00
 	
C  3 #'#D#D " + & $ / '$   88# ( @s6   A'F  E/ F9/FF FF F65F6)r   rM   rT   rP   )r   rM   rT   zVariableTracker | None)rT   NFr   rM   r  (variables.functions.UserFunctionVariabler  rC   r  )collections.abc.Sequence[VariableTracker]r  dict[str, VariableTracker]rT   rC   r   rM   r  r,  r  rC   r  r-  r  r.  r'  ztuple[Any, ...]rT   rC   )Nrs   r   r   __doc__r  rC   r   r  r   r   r   _nonvar_fieldsrW   rw   r)   r   r   r   r#  r   r(  r  r,  r/  r  r   r   rC  r   rI  rQ  rT  rV  rZ  r   r\  r  r  r  rb  rg  r   r   r2  r6  r9  rq  r  ro  r  r  r  r  r  r  r  r  r}  r  r   r  r  r$   rJ  r  r   r  rK  r  r  r  r  r   r  r  r#  r)  r  r  s   @r[   r   r     sV    (,Ho$+ &*M3s8d?) 	 
	+	+N #'(,.26:,L,L 4K	,L
 %,L %t+,L O,t3,L ,L 
,L\	5 	5H# H
 $ 
T f ,F ,B"& "2& 2# 
"*# 
4# 
0# 
0

/6 /? /
#
 
 	

 sm
 S#X
 

* __S   2#2 2 
	2,Y;#Y; Y; 3i	Y;
 S#XY; 
Y;v
2 
 
,!3 ! !!3 ! ! &+h7#h7 h7 	h7
 #h7 
h7T:D :
/&= /$BW /*0G D )	o	"8 7 8O 8T :7#:7 ':7 S/)*	:7
 
:7x.F .
CV 
C 
CC F <# & (s t 

	vv~		%
**A * *PT *N
)N
14N
	N
`^
5 ^
S ^
_ ^
@';#'; '; 	';
 '; 
';Rf<#f< f< 	f<
 f< 
f<P3#3 3 	3
 3 
30#  	
 
$$<)<14<	<&D    

)V 
) 
)_
#_
 @_
 "	_

 :_
 6_
 
_
BL
#L
 @L
 "	L

 :L
 6L
 #L
 
L
r^   r   c                   z    e Zd ZdZdedefdZdefdZdefdZ	ddZ
defd	Zded
   fdZdefdZdedefdZy)FrozenDataClassVariablea  Frozen dataclass variable for as_proxy/as_python_constant/hashability.

    Construction is handled by the generic polyfill path (tracing through
    the auto-generated __init__). Field values are retrieved dynamically
    via var_getattr using InstructionTranslator.current_tx().
    
field_namerT   c                 T    ddl m}  |j                         }| j                  ||      S )Nr   rL   )r:  rM   r;  r  )r   r4  rM   r   s       r[   _get_field_vtz%FrozenDataClassVariable._get_field_vt
  s)    H-"--/J//r^   c                 .   ddl m} dd lmc m} t        | j                  |j                  |j                  |j                  f      st        d      t        | j                  |j                        r|j                         S g }i } || j                        D ]f  }|j                  s| j                  |j                        j                         }t!        |dd      r|||j                  <   V|j#                  |       h  | j%                         |i |S )Nr   fieldsz@currently can't reconstruct arbitrary frozen dataclass instanceskw_onlyF)r   r9  r  r  r  r4   rz   TreeSpecLeafSpecConstantNoderm  treespec_leafinitr6  r   r   r   rh   r/  )r   r9  r  r   r   fielddatas          r[   r   z*FrozenDataClassVariable.as_python_constant
  s    &,,JJ&//6;N;NO
 &R  $**foo.''))$&DJJ' 	&Ezz))%**5HHJ5)U3)-F5::&KK%	& "t!42622r^   c                 4   ddl m} g }i } || j                        D ]d  }| j                  |j                        j                         }t        |d      r|j                  r|||j                  <   T|j                  |       f  | j                         |i |S )Nr   r8  r:  )
r   r9  rz   r6  r   r   rv   r:  rh   r/  )r   r9  r   r   r@  rI  s         r[   r   z FrozenDataClassVariable.as_proxy
  s    &$&DJJ' 	#E&&uzz2;;=Eui(U]]%*uzz"E"	# "t!42622r^   Nc                     | j                    || j                          y |j                  |j                  | j                                      y rV   )r   append_outputcreate_load_const_uncheckedr   )r   codegens     r[   reconstructz#FrozenDataClassVariable.reconstruct
  s@    ;;"DKK //0G0G0IJ	
r^   c                 b    | j                   j                   d| j                  j                   dS r   r%  r   s    r[   r   z FrozenDataClassVariable.__repr__
  r&  r^   Tc                      yr   r   r   s    r[   r  z*FrozenDataClassVariable.is_python_hashable
  r  r^   c                 j     ddl m} t        t         fd | j                        D                    S )Nr   r8  c              3   p   K   | ]-  }j                  |j                        j                          / y wrV   )r6  r   r  )r  fr   s     r[   r  z:FrozenDataClassVariable.get_python_hash.<locals>.<genexpr>
  s1       ""166*::<s   36)r   r9  r  r   rz   )r   	dc_fieldss   ` r[   r  z'FrozenDataClassVariable.get_python_hash
  s1    3 "4::. 
 	
r^   r  c                      t        t              sy j                         j                         uryddlm} t         fd | j                        D              S )NFr   r8  c              3      K   | ]G  }j                  |j                        j                  j                  |j                               I y wrV   )r6  r   r  )r  rL  r  r   s     r[   r  z:FrozenDataClassVariable.is_python_equal.<locals>.<genexpr>
  sB      
 qvv&66u7J7J1667RS
s   AA)r   r3  r/  r   r9  r  rz   )r   r  rM  s   `` r[   r  z'FrozenDataClassVariable.is_python_equal
  sT    %!89U%6%6%883 
tzz*
 
 	
r^   rF  rI   rT   N)rs   r   r   r0  r   rC   r6  rW   r   r   rG  r   r   r  r   r  r  r  r   r^   r[   r3  r3  }
  st    0 0 03F 363& 3
H# HGDM 
 


V 

 

r^   r3  c            
       X     e Zd Zdededdf fdZddded	ee   de	eef   def
d
Z
 xZS )SourcelessGraphModuleVariablerz   r   rT   Nc                 &    t        |   |fi | y rV   r   r   r   s      r[   r   z&SourcelessGraphModuleVariable.__init__
  s    
 	)&)r^   r   rM   r   r   c                     t        j                  || j                  j                  j                        }| g|z   }|j                  |||      S rV   )rC   r  rz   forwardr  r  )r   r   r   r   r   fn_variables         r[   r   z)SourcelessGraphModuleVariable.call_method
  sM     &++B

0B0B0K0KLv}--
 	
r^   )rs   r   r   rW   r   r   r   r   rC   r   r   r  r  s   @r[   rR  rR  
  sh    ** * 
	*
#
 
 ?#	

 S/)*
 

r^   rR  c            
       `    e Zd Zdededdf fdZededef   fd       Zdd	d
e	de
e   dee	ef   def
 fdZdd	d
e	f fdZedd       Zede
e   fd       ZddZedee   fd       Zedej,                  dz  fd       Zde	fdZej2                  dej,                  ddfd       Z xZS )"UserDefinedExceptionObjectVariablerz   r   rT   Nc                     t        |   |fi | |j                  dg       }t        j                  | j
                  |      | _        y )Nr  )r   r   rl   r   ExceptionVariabler  exc_vt)r   rz   r   r  r   s       r[   r   z+UserDefinedExceptionObjectVariable.__init__
  s=    )&)JJ{B/	11$//9Mr^   .c                     | j                   S rV   r.  r   s    r[   r  z%UserDefinedExceptionObjectVariable.fn
  s    r^   r   rM   r   r   c                    |dk(  rU| j                  |      x}rBt        j                  |      r-t        |      dk(  rt        j
                  j                  d       S |dk(  rIt        |      dk(  r;|d   j                  dddd      r$| j                  j                  ||d   |d	          n#|d
k(  r| j                  j                  ||||      S t        | )  ||||      S )Nr   r   rX   r   	__cause____context____suppress_context____traceback__r?   with_traceback)r   r~   r#  rb  r   rO   r   is_constant_matchr\  call_setattrr   r   )r   r   r   r   r   rk  r   s         r[   r   z.UserDefinedExceptionObjectVariable.call_method
  s     J;;DAAA**62Fq --44T::M!D	QQ))],BO KK$$Ra$q':%%;;**2tT6BBw"2tT6::r^   c                 d    |dv r| j                   j                  ||      S t        |   ||      S )N)r   r_  r`  ra  rb  )r\  r  r   r  s      r[   r  z.UserDefinedExceptionObjectVariable.var_getattr  s;     
 
 ;;**2t44w"2t,,r^   c                 .    | j                   j                  S rV   )r\  r`  r   s    r[   r`  z.UserDefinedExceptionObjectVariable.__context__   s     {{&&&r^   c                 .    | j                   j                  S rV   )r\  r   r   s    r[   r   z'UserDefinedExceptionObjectVariable.args%  s    {{r^   c                 8    | j                   j                  |      S rV   )r\  set_context)r   r   s     r[   rj  z.UserDefinedExceptionObjectVariable.set_context)  s    {{&&w//r^   c                 .    | j                   j                  S rV   )r\  exc_typer   s    r[   rl  z+UserDefinedExceptionObjectVariable.exc_type,  s    {{###r^   c                 .    | j                   j                  S rV   r\  python_stackr   s    r[   ro  z/UserDefinedExceptionObjectVariable.python_stack0  s    {{'''r^   c                 6    | j                   j                         S rV   )r\  
debug_reprr   s    r[   rq  z-UserDefinedExceptionObjectVariable.debug_repr4  s    {{%%''r^   c                 &    || j                   _        y rV   rn  )r   rz   s     r[   ro  z/UserDefinedExceptionObjectVariable.python_stack7  s    #( r^   )rT   rO   )r   zvariables.ExceptionVariablerT   N)rs   r   r   rW   r   r   r  r   r  r   r   rC   r   r   r  r`  r   rj  rw   rY   rl  	tracebackStackSummaryro  rq  r  r  r  s   @r[   rY  rY  
  sV   Nf N N N
 HS&[)  ;#; ; ?#	;
 S/)*; 
;4	-5 	-S 	- ' '  d?+    0 $$}- $ $ (i44t; ( ((C ( ))"8"8 )T ) )r^   rY  c                        e Zd ZU dZej
                  ddiej                  dddiZee	ee
e
f   f   ed<   eded	efd
       Zeded	efd       Zddde
d	ef fdZ xZS )InspectVariablezHandles inspect.Signature and inspect.Parameter objects.

    Short-circuits property accesses to avoid tracing property getters,
    redirecting them to the underlying private attributes directly.
    
parametersr  _kind_name)kindr   _PROPERTY_REDIRECTSrq   rT   c                 8    t        |       t        j                  v S rV   )rw   rv  r{  rx   s    r[   is_matching_objectz"InspectVariable.is_matching_objectH  s    CyO????r^   c                 &    | t         j                  v S rV   )rv  r{  rx   s    r[   is_matching_classz!InspectVariable.is_matching_classL  s    o9999r^   r   rM   r   c                     | j                   j                  t        | j                        i       }||v rt        |   |||         S t        |   ||      S rV   )r{  rl   rw   rz   r   r  )r   r   r   	redirectsr   s       r[   r  zInspectVariable.var_getattrP  sT    ,,00djj1A2F	97&r9T?;;w"2t,,r^   )rs   r   r   r0  r~   	Signature	Parameterr{  r   rw   r   r   r  rW   r  r}  r  rC   r  r  r  s   @r[   rv  rv  <  s     	L-8GW=7dDcN23 
 @ @4 @ @ :v :$ : :-5 -S -_ - -r^   rv  c                   ^     e Zd Zededefd       Zdededdf fdZdd	d
e	de
f fdZ xZS )KeyedJaggedTensorVariablerq   rT   c                 z    t         j                  j                  d      }|d uxr t        |       |j                  u S )Nztorchrec.sparse.jagged_tensor)rj   rk   rl   rw   KeyedJaggedTensorrq   mods     r[   r}  z,KeyedJaggedTensorVariable.is_matching_objectX  s3    kkoo=>$E490E0E#EEr^   rz   r   Nc                 P    ddl m} t        |      |u sJ t        |   |fi | y )Nr   )r  )torchrec.sparse.jagged_tensorr  rw   r   r   )r   rz   r   r  r   s       r[   r   z"KeyedJaggedTensorVariable.__init__]  s/    	
 E{////)&)r^   r   rM   r   c                    t         j                  j                  j                  r@| j                  4|dv r0t        j                  d      5  t        | !  ||      cd d d        S t        | !  ||      S # 1 sw Y   xY w)N)_length_per_key_offset_per_keyT)#force_unspec_int_unbacked_size_like)	r   r  r   3force_unspec_int_unbacked_size_like_on_torchrec_kjtr   r   patchr   r  r  s      r[   r  z%KeyedJaggedTensorVariable.var_getattre  sr    MM  TT'>>%%$O 5w*2t45 5w"2t,,5 5s   A66A?)rs   r   r   r  rW   r  r}  r   r   r   rC   r  r  r  s   @r[   r  r  W  sa    F F4 F F*f * * *-5 -S -_ - -r^   r  _constant_base_methodsc                   H     e Zd ZdZdededdf fdZdefdZdefdZ xZ	S )	UserDefinedConstantVariablez
    Represents user-defined objects that subclass immutable constant types
    (int, float, str).

    Uses a ConstantVariable as _base_vt for the underlying constant value.
    rz   r   rT   Nc                     ddl m} t        |   |fi | t	        |      j
                  D ]7  }|t        v s |j                   ||            | _        t        |   | _
         n | j                  J y )Nr?   rN   )r   rO   r   r   rw   r   _CONSTANT_BASE_TYPESr   r  r  r  )r   rz   r   rO   r   r   s        r[   r   z$UserDefinedConstantVariable.__init__  su    .)&)K'' 	D++ 7 0 7 7U D%;D%A"		
 }}(((r^   c                     | j                   S rV   r   r   s    r[   r   z.UserDefinedConstantVariable.as_python_constant  r   r^   c                 R    | j                   J | j                   j                         S rV   )r  r   r   s    r[   r   z$UserDefinedConstantVariable.as_proxy  s%    }}(((}}%%''r^   )
rs   r   r   r0  r   r   r   rW   r   r  r  s   @r[   r  r  w  s:    	)c 	)S 	)T 	)C (& (r^   r  c                   &    e Zd Zededefd       Zy)IntWrapperVariablerq   rT   c                 z    t         j                  j                  d      }|d uxr t        |       |j                  u S )Nztorch.export.dynamic_shapes)rj   rk   rl   rw   _IntWrapperr  s     r[   r}  z%IntWrapperVariable.is_matching_object  s1    kkoo;<$?49#??r^   N)rs   r   r   r  rW   r  r}  r   r^   r[   r  r    s(     @ @4 @ @r^   r  c            
            e Zd ZdZ	 	 ddedz  dedz  deddf fdZdd	d
ede	e
   deee
f   de
f
 fdZd fdZdee   fdZ xZS )RemovableHandleVariableNr`  r  r   rT   c                 @    t        |   di | || _        || _        y )Nr   )r   r   r`  r  )r   r`  r  r   r   s       r[   r   z RemovableHandleVariable.__init__  s$     	"6"*r^   r   rM   r   r   c                 >   |dk(  r| j                   | j                  k7  rN| j                   J |j                  j                  j	                  | j                          | j                  | _         t
        j                  j                  d       S t        | %  ||||      S )Nremove)
r  REMOVEDrK  rh  remove_hookr   rO   r   r   r   r   r   r   r   r   r   s        r[   r   z#RemovableHandleVariable.call_method  s     8xx4<<'xx+++		&&22488<<<--44T::w"2tT6::r^   c                     | j                   | j                  k(  r0j                  fd       j                  t	        dd             y t
        |          y )Nc                  (     j                  dd      S )Nztorch._dynamo.utilsinvalid_removeable_handle)load_import_from)rF  s   r[   <lambda>z5RemovableHandleVariable.reconstruct.<locals>.<lambda>  s    00)+F r^   r   F)r  r  add_push_nullextend_outputr   r   rG  )r   rF  r   s    `r[   rG  z#RemovableHandleVariable.reconstruct  sN    88t||#!!
 !!"6q%"@AG$r^   c                     t         S rV   )r  r   s    r[   r/  z#RemovableHandleVariable.python_type  s    ##r^   r  rP  )rs   r   r   r  r@   r   r   r   r   r   rC   r   r   rG  rw   rW   r/  r  r  s   @r[   r  r    s    G .2		#d*	 4Z		
 	 
	;#; ; ?#	;
 S/)*; 
;%$T&\ $r^   r  c            
            e Zd ZdZ	 ddededz  deddf fdZdd	defd
Z	dd	dedef fdZ
dd	dedee   deeef   def
 fdZ x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.
    Nrz   r  r   rT   c                 $   t        |   |fi | |]| j                  J d       t        i t	        |t
        j                        rt
        j                  nt        t                     | _	        n|| _	        t        | _        | j                  J y )Nz@dict_vt must be constructed by builder.py when source is present)user_clsr`  )r   r   r   rD   r   r   r   r   rB   r  r-   r  )r   rz   r  r   r   s       r[   r   z UserDefinedDictVariable.__init__  s     	)&)?;;& R& . "%)@)@A  ++.0DM $DM)}}(((r^   r   rM   c                 $    | j                  |      S rV   )r9  r5  s     r[   r6  z!UserDefinedDictVariable.sq_length  s     ~~b!!r^   rc  c                 `   | j                  d      }|| j                  v r+| j                  J 	 | j                  j                  ||      S t        |   ||      S # t        $ rH t        | j                         t              r(| j                  d      r| j                  |d|gi       cY S  w xY wNre  __missing__)
r   r  r  rg  r   r   r/  r   r   r   )r   r   rc  rk  r   s       r[   rg  z)UserDefinedDictVariable.mp_subscript_impl  s     11-@T'''==,,,}}66r3?? w(S11 $ $$&66}E++BubIIs   A AB-+B-r   r   c                 D   |dk(  r[| j                  d      | j                  v r>| j                  d      r-| j                  J 	 | j                  j                  ||||      S t        |   ||||      S # t        $ r" t        |       | j                  |d||      cY S w xY wr  )r   r  r  r   r   r   r   r  s        r[   r   z#UserDefinedDictVariable.call_method  s     M!00?4CUCUU00?==,,,I}}00T4HH w"2tT6:: $ I)"-''M4HHIs   A4 4(BBrV   )rs   r   r   r0  rW   rD   r   r   rC   r6  rg  r   r   r   r   r  r  s   @r[   r  r    s     -1)) #T)) 	)
 
)2"3 " "
2#2 2 
	2*;#; ; ?#	;
 S/)*; 
; ;r^   r  c            	            e Zd ZdZ	 ddededz  deddf fdZdefdZe	de
e   fd	       Ze	deeef   fd
       ZdedefdZ xZS )UserDefinedSetVariablez
    Represents user defined objects that are subclasses of set.

    Internally, it uses a SetVariable to represent the set part of the
    variable tracker. For everything else, it falls back to
    UserDefinedObjectVariable.
    Nrz   set_vtr   rT   c                 \   ddl m} |j                  dd       }t        |   |fi | t        |t              rt        nt        }|t        u rt        nt        | _
        || j                  J d       |t        u r-t        j                  t               t                     | _        nv|j!                  di       }|2t"        j$                  j&                  j(                  j+                         }|j-                  ||      j/                  ||i       | _        n|| _        | j                  J y )Nr?   rU  r   z?set_vt must be constructed by builder.py when source is presentr_  r  )rJ  rV  popr   r   r   r   r   r;   r.   r  r   r   rG   rB   r  rl   r   r  symbolic_convertrM   r;  r   r  )	r   rz   r  r   rV  r   r/  r  r   s	           r[   r   zUserDefinedSetVariable.__init__&  s    	/ZZd#)&)'s3c,73,>[DU>;;& Q& c! ) 5 5E"2"4!
 #JJ{B7	:77MMXXZB 1 8 8[ I W W	2! #DM}}(((r^   c                 R    | j                   J | j                   j                         S rV   )r  r   r   s    r[   r   z)UserDefinedSetVariable.as_python_constantF  s%    }}(((}}//11r^   c                 J    | j                   J | j                   j                  S rV   )r  	set_itemsr   s    r[   r  z UserDefinedSetVariable.set_itemsJ  s"    }}(((}}&&&r^   c                 J    | j                   J | j                   j                  S rV   r  r  r   s    r[   r  zUserDefinedSetVariable.itemsO  "    }}(((}}"""r^   r  c                     | j                   J t        |t              xr% | j                   j                  |j                         S rV   )r  r   r  r  r  s     r[   r  z&UserDefinedSetVariable.is_python_equalT  s@    }}((()
 <mm++ENN;	<r^   rV   )rs   r   r   r0  rW   rG   r   r   r   r  r   r  r   rF   rC   r  r  r  r  r  s   @r[   r  r    s     ;?))%04%7)JM)	)@2F 2 '3s8 ' ' #tO_<= # #<V < <r^   r  c            	       >     e Zd ZdZ	 d	deded   deddf fdZ xZS )
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.
    Nrz   list_vt)rQ   Nr   rT   c                     ddl m} t        |   |fi | |+| j                  J d        |g t                     | _        n|| _        t        | _        | j                  J y )Nr?   r~  z@list_vt must be constructed by builder.py when source is presentr_  )	r  rQ   r   r   r   rB   r  r5   r  )r   rz   r  r   rQ   r   s        r[   r   z UserDefinedListVariable.__init__d  sl     	()&)?;;& R& );K;MNDM#DM)}}(((r^   rV   )	rs   r   r   r0  rW   r	   r   r   r  r  s   @r[   r  r  [  s?     EI))&+,@&A)TW)	) )r^   r  c            
       f    e Zd ZdZdhej
                  Zededed    fd       Zd fd	Z	e
dee   fd       Zd	d
dedee   deeef   def
 fdZddZdedef   fdZddded    dz  fdZdee   dd fdZdefdZ	 	 	 	 	 	 	 	 	 	 	 	 d fdZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 d fdZdedefdZ xZS ) UserDefinedTupleVariablea  
    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.

    NamedTupleVariable and StructSequenceVariable are subclasses that handle
    namedtuples and structseqs (torch.return_types.*) respectively.
    	tuple_clsclsrT   c                 0    t        |       rt        S t        S rV   )r   StructSequenceVariableNamedTupleVariable)r  s    r[   
get_vt_clsz#UserDefinedTupleVariable.get_vt_cls  s    c"))!!r^   Nc                    ddl m} |j                  dd       }t        	|   |fd|i| |a| j
                  J d       |sJ d       |ddlm}  |j                         }|d   j                  |      } ||t               	      | _        n|| _        t        |      | _        t        | _        | j                  J y )
Nr?   r  r   r  zAtuple_vt must be constructed by builder.py when source is presentz0init_args must be provided when tuple_vt is Noner   rL   r_  )r  rR   r  r   r   r   r:  rM   r;  r  rB   r  rw   r  r=   r  )
r   rz   tuple_vtr  r   rR   r   rM   elemsr   s
            r[   r   z!UserDefinedTupleVariable.__init__  s    (ZZd#>)>v>;;& S& PPP9
 zP5*557aL::2>E)%?O?QRDM$DMe*}}(((r^   c                 J    | j                   J | j                   j                  S rV   r  r   s    r[   r  zUserDefinedTupleVariable.items  r  r^   r   rM   r   r   r   c                 J   |dk(  rCt        |      dk7  s|rt        d      t        j                  || j	                  |d               S |dk(  rDt        |      dk7  s|rt        d      t        j                  || j	                  |d                S t
        |   ||||      S )NrZ  r?   zImproper arguments for method.r   r[  )rb  
ValueErrorrC   r  r  r   r   r  s        r[   r   z$UserDefinedTupleVariable.call_method  s     84yA~ !ABB"((T-A-A$q'-JKKX4yA~ !ABB"((1E1Ed1g1N-NOOw"2tT6::r^   c                     | j                   J | j                         j                  fd        | j                         j	                  t        dd             y )Nc                  D     j                   j                              S rV   )rD  rE  )rF  	create_fns   r[   r  z6UserDefinedTupleVariable.reconstruct.<locals>.<lambda>  s     G))33I> r^   r?   F)r   get_construct_fnr  r  r  r   )r   rF  r  s    `@r[   rG  z$UserDefinedTupleVariable.reconstruct  sZ     {{"""))+		

 	21e<=r^   .c                     t         rV   )rm  r   s    r[   r  z)UserDefinedTupleVariable.get_construct_fn  s    !!r^   r  r-  c                     g }t        | j                        }|D ]U  }t        |t              r0t        |j                        |k7  s|j                  | j                  ur y|j                  |       W |S )z>Validate that rest args are compatible for tree_map fast-path.N)rb  r  r   r  r  rh   )r   r  othersn	candidates        r[   _validate_rest_for_tree_mapz4UserDefinedTupleVariable._validate_rest_for_tree_map  si     24

O 	%Iy*BCy'1,&&dnn<MM)$	% r^   	new_itemsc                 ~    ddl m}  ||t                     } t        |       | j                  |t                     S )Nr?   r  r_  )r  r`  )r  rR   rB   rw   rz   )r   r  rR   r  s       r[   _make_tree_map_resultz.UserDefinedTupleVariable._make_tree_map_result  s:     	) :J:LMtDzJJ*,
 	
r^   c                 `    ddl m}  || j                        xs t        | j                        S )Nr   )r  )r  r  r  r   )r   r  s     r[   _is_pytree_nodez(UserDefinedTupleVariable._is_pytree_node  s#    ;"4>>2X6H6XXr^   c           
         | j                         st        | 	  |||||      S | j                  |      }|| j	                  |||||      S g }t        | j                        D ]E  \  }}	|D 
cg c]  }
|
j                  |    }}
|j                  |	j                  |||||             G | j                  |      S c c}
w rV   )
r  r   r#  r  r  r  r  rh   call_tree_mapr  )r   r   r  r  r  r  r  r  r  rn  osibling_leavesr   s               r[   r#  z-UserDefinedTupleVariable.call_tree_map_branch  s     ##%7/K  11$7>**K  ,.	"4::. 	IC4:;qaggcl;N;""V^_	 )))44 <s   .B=c                    | j                         st        | 	  ||||||      S | j                  |      }|| j	                  ||||||      S t        | j                        }g }	t        | j                        D ]X  \  }
}|D cg c]  }|j                  |
    }}|t        ||
         fz   }|	j                  |j                  ||||||             Z | j                  |	      S c c}w rV   )r  r   r)  r  r&  r6   r  r  r  r   rh   call_tree_map_with_pathr  )r   r   r  r  r  r  r'  r  r9  r  r  rn  r  r  child_keypathr   s                  r[   r)  z7UserDefinedTupleVariable.call_tree_map_with_path_branch  s    ##%79K  11$7>44K  #4>>2+-	"4::. 	IC4:;qaggcl;N;#z&+'>&@@M,,"#!		 )))44 <s   C'r  c                     | j                   J t        |t              r|j                   n|}| j                   j                  |      S rV   )r  r   r  r  r  s     r[   r  z(UserDefinedTupleVariable.is_python_equal5  s=    }}(((",U4L"MSX}},,U33r^   r  rP  r+  r/  )rs   r   r   r0  r   r1  r  rw   r  r   r  r   rC   r  r   r   r   rG  r   r   r  r  r  r  r  r#  r)  rW   r  r  r  s   @r[   r  r  u  s   	 		"	1	1N
 " "&@!A " "
)4 #tO, # #;#; ; ?#	;
 S/)*; 
;">&"(38"4 "?	(	)D	0 

o.

	#

Y Y
5#5 @5 "	5
 :5 65 
5:#5##5 @#5 "	#5
 :#5 6#5 ##5 
#5J4V 4 4r^   r  c            
       l     e Zd ZdZdddedededz  def
 fd	Zde	d
e
f   fdZde
fdZde
fdZ xZS )r  zRepresents Python namedtuples (created via collections.namedtuple).

    Namedtuples use _tuplegetter descriptors for field access and
    Type(*args) / Type._make(iterable) for construction.
    r   rM   r   rL  r   NrT   c                     t        |t        j                        r%|j                         \  }\  }}| j                  |   S t
        |   ||||      S rV   )r   r  r  
__reduce__r  r   r  )r   r   r   rL  r   _r  r   s          r[   r  z*NamedTupleVariable.resolve_data_descriptorB  sQ     i!:!:; $..0KAxQ::c?"w.r4FKKr^   .c                 .    | j                   j                  S rV   )r  _maker   s    r[   r  z#NamedTupleVariable.get_construct_fnQ  s    ~~###r^   c                 x    | j                   D cg c]  }|j                          }} | j                  | S c c}w rV   r  r   r  r   r  r  s      r[   r   z%NamedTupleVariable.as_python_constantT  s8    15<A%%'<<t~~u%% =   7c                 x    | j                   D cg c]  }|j                          }} | j                  | S c c}w rV   r  r   r  r  s      r[   r   zNamedTupleVariable.as_proxyX  s5    '+zz2!22t~~u%% 3r  rs   r   r   r0  r   rW   r   rC   r  r   r   r  r   r   r  r  s   @r[   r  r  ;  st    L#L L 	L
 L 
L$(38"4 $&C &&# &r^   r  c            
       l     e Zd ZdZdddedededz  def
 fd	Zde	d
e
f   fdZde
fdZde
fdZ xZS )r  zRepresents C-implemented PyStructSequence types (torch.return_types.*).

    Structseqs use Type(iterable) calling convention and reject tuple.__new__.
    r   rM   r   rL  r   NrT   c                     t        |t        j                        r7t        | j                        }||v r| j
                  |j                  |         S t        | !  ||||      S rV   )	r   r  MemberDescriptorTyper6   r  r  indexr   r  )r   r   r   rL  r   r9  r   s         r[   r  z.StructSequenceVariable.resolve_data_descriptorc  sZ     i!;!;< 't~~6Fv~zz&,,t"455w.r4FKKr^   .c                     | j                   S rV   )r  r   s    r[   r  z'StructSequenceVariable.get_construct_fns  s    ~~r^   c                 |    | j                   D cg c]  }|j                          }}| j                  |      S c c}w rV   r  r  s      r[   r   z)StructSequenceVariable.as_python_constantv  s6    15<A%%'<<~~e$$ =   9c                 |    | j                   D cg c]  }|j                          }}| j                  |      S c c}w rV   r  r  s      r[   r   zStructSequenceVariable.as_proxyz  s3    '+zz2!22~~e$$ 3r   r  r  s   @r[   r  r  ]  st    
L#L L 	L
 L 
L (38"4 %C %%# %r^   r  c                   |     e Zd Zdededdf fdZ	 ddddeded	edef
 fd
Zddde	def fdZ
dddef fdZ xZS )MutableMappingVariablerz   r   rT   Nc                 &    t        |   |fi | y rV   rT  r   s      r[   r   zMutableMappingVariable.__init__  s    )&)r^   r   rM   r   r  c                    t        |t        j                        rt        |j                  t              r|j                  }t        j                  t        | j                        |d      }t        |t              rn|j                  bd}| j                  r| j                  ||      }t        |d      }t        j                  ||j                  |      }	|	j                  || |gi       S t         
| E  ||||      S )aQ  Override to handle property setters on MutableMapping subclasses.

        This is needed because property.__set__ is a slot wrapper (C function),
        not a Python function, so the base class's try_get_descritor_and_setter_py_func
        returns None for properties. But property.fset IS a Python function we can trace.

        Without this, property setters on newly created MutableMapping objects fail
        when accessing nested objects (which haven't been initialized yet on the
        example value). By tracing the fset, we capture the setter logic in the graph
        instead of running it on uninitialized example objects.

        TODO(compiler): This fix is scoped to MutableMapping only because tracing
        property setters on ALL UserDefinedObjectVariable can cause failures when
        the fset calls untraceable C++ functions (e.g., pybind functions). Ideally,
        this should be extended to all user-defined classes with a graceful fallback
        when tracing the fset hits an untraceable function.
        See: https://github.com/pytorch/pytorch/issues/172000
        Nr  )r   r   rO   rz   r   r~   r   rw   r  r  r  rJ  r"   rC   r  r  r   rq  )r   r   r   rz   r  r  r(  r  r  fset_vtr   s             r[   rq  z.MutableMappingVariable.method_setattr_standard  s    2 dI667JtzzSV<WzzH //TZZ0@(DQJ*h/JOO4O"??"&"@"@X"NK",[&"AK)//JOO[Q,,R$CCw.r4@TUUr^   c                    |dk(  rwt        | j                        j                  t        j                  j
                  j                  t        j                  fv r$t        j                  t        j                  |       S t        | 1  ||      S )Nrl   )rw   rz   rl   r   abcMappingr   r   r
  r   mapping_getr   r  r  s      r[   r  z"MutableMappingVariable.var_getattr  sn    
 5=T$**-11OO##''HH6
 
 //	0E0EtLL7&r400r^   c                     | j                  d      t        v r)t        j                  |t	        | j
                              S t        |   |      S r  )r   r-   rC   r  rb  rz   r   r9  )r   r   r   s     r[   r9  z MutableMappingVariable.mp_length  sA    ++I6,F"((S_==w $$r^   r*  )rs   r   r   rW   r   r   rC   r  rq  r   r  r9  r  r  s   @r[   r  r    s    *f * * * &+$V#$V $V 	$V
 #$V 
$VL15 1S 1_ 1%3 % % %r^   r  c                       e Zd Zy)r  Nr  r   r^   r[   r  r    s    r^   r  )r0  r  r   r   r  r   r   r  r~   r  rj   ro  rs  r  r  r  collections.abcr   r   r   typingr   r   r   r	   typing_extensionsr
   torch._dynamo.configr   torch.nntorch._guardsr   r   torch.utils._python_dispatchr   r  r   r   r  r   r   r   r   bytecode_transformationr   create_parameter_opr   excr   r   r   r   r   r   r   r   r  r   guardsr    r!   r   r"   r#   r$   r%   r&   r'   r(   r)   r*   r  r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r   r@   rA   rB   rC   dictsrD   rE   hashablerF   setsrG   numpyr  ModuleNotFoundErrortorch.utils._cxx_pytreerH   ri   rw   torch._dynamo.codegenrI   torch._dynamo.side_effectsrK   r:  rM    torch._dynamo.variables.constantrO   rP   r  rQ   rR   rW   r  r\   ra   rp   ry   r   r   r  r  r  GetSetDescriptorTyper   r   r   r   r   r  r  r   r   r  r   r3  rR  rY  rv  r  r   r   r  r}   r  ru   r  r   r  r  r  r  r  r  r  r  r  r  r  )tro   s   00r[   <module>r#     s  .          
      8 8 5 5 *   0 K > > > : F	 	 	 A 0
 
 
     , R Q 9 % 2
 /6DA)2BV B BBV B Bf  $F t V   09!!""""	0 Yt_ F t 
/ 
z2 zz7(@ 74	 	SScS ?
#S o%&	S
 S,{
 3 {
|+Y
7 Y
x
$= 
0H))B H)V-/ -6- 9 -2 UC(  AU0;<A1::$$&6a(1+660 T3s8^, 
("; (6@2 @+$o +$\Q;7 Q;h;<6 ;<|)7 )4C48 C4L&1 &D%5 %D:%6 :%z	. 	gj  	B
  dJJX 70sB   L L $L.%L)3L)7L.LLL&%L&)L.