o
    Zhy                    @   s  U d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmZ ddlmZmZmZmZmZmZ ddlZddlZddlmZ ddl m!Z!m"Z"m#Z# ddl$m%Z% ddl&m'Z' dd	l(m)Z) dd
l*m+Z+m,Z,m-Z- ddl.m/Z/m0Z0 ddl1m2Z2 ddl3m4Z4 ddl5m6Z6 ddl7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z> ddl?m@Z@mAZA ddlBmCZC ddlDmEZE ddlFmGZG ddlHmIZImJZJmKZKmLZLmMZM ddlNmOZO ddlPmQZQmRZRmSZS ddlTmUZUmVZVmWZW ddlXmYZYmZZZm[Z[m\Z\m]Z] ddl^m_Z_ ddl`maZambZbmcZcmdZdmeZemfZfmgZgmhZhmiZimjZjmkZkmlZlmmZmmnZnmoZompZpmqZqmrZrmsZsmtZt ddlumvZvmwZwmxZxmyZymzZzm{Z{m|Z|m}Z}m~Z~mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ ddlmZmZmZmZmZ ddlmZmZ dd lmZmZmZmZmZmZ dd!lmZmZmZmZmZmZ dd"lmZmZmZmZmZ dd#lmZmZmZmZmZmZmZmZmZmZmZmZ dd$lmZ dd%lmZ dd&lmZ dd'lmZmZmZmZmZmZmZmZmZ dd(lmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ dd)lmZmZmZ dd*lmZ dd+lmZ dd,lmZ dd-lmZmZmZmZmZmZ dd.lmZmZmZmZ dd/lmZmZmZmZ dd0l mZmZmZmZmZmZmZmZm	Z	m
Z
 zddlZW n ey   dZY nw erdd1lmZ e
eZejed2ZeZd3d4 ZG d5d6 d6ZejG d7d8 d8ZG d9d: d:eZed;d< ee	 D Z ee! e"d=< e# Z$e#e! e"d>< G d?d@ d@Z%dAdB Z&dCdD Z'	dedEefdFdGZ(dHdI Z)	dedJdKZ*	dfdLdMZ+	dedNdOZ,dPdQ Z-dRdS Z.da/ee#e0  e"dT< dEe#e0 fdUdVZ1ejG dWdX dXZ2	YdgdEe>fdZd[Z3dd\d]eer d^e4fd_d`Z5G dadb dbZ6e67 e6_8G dcdd ddZ9dS )haq  
This module contains classes and utilities for building variable trackers in Dynamo.
Variable trackers are used to convert Python values into symbolic representations
that can be traced and transformed during graph capture.

The key classes are:

- VariableBuilder: Handles source-tracked objects that need guards and proper
  reconstruction in the output graph. Used for inputs, module attributes, etc.

- SourcelessBuilder: Handles ephemeral objects created during tracing that don't
  need source tracking or guards. Used for temporary lists, intermediate values, etc.

Variable trackers enable Dynamo to track the flow of values through the program,
maintain guards for dynamic properties, and reconstruct values in the output graph.
The builders in this module handle converting Python values into appropriate
VariableTracker instances based on their type and usage context.
    N)MutableMapping)AnyCallable
NamedTupleOptionalTYPE_CHECKINGUnion)SymInt)get_metrics_contextis_int_specialization_caseis_torch_sym)TracingContext)call_torchbind)HigherOrderOperator)
FakeTensoris_fakemaybe_get_fake_mode)is_sparse_any	safe_grad)justknobs_check)BackwardState)normalize_source_name)_constrain_range_for_size_nested_int_aware_sort
DimDynamicRelaxedUnspecConstraintStatefulSymbolicContextSubclassSymbolicContextSymbolicContext)immutable_dictimmutable_list)is_traceable_wrapper_subclass)ValueRanges)TensorWeakRef   )configgraph_break_hintsmutation_guardreplay_recordtrace_rules) get_registered_device_interfaces)InternalTorchDynamoErrorunimplementedunimplemented_v2)GuardBuilderinstall_guardmake_dupe_guard)auto_dynamic
auto_unsetFrameStateSizeEntryInferStrideprocess_automatic_dynamic)SideEffects)AttrProxySource
AttrSourceCallMethodItemSourceChainedSourceConstDictKeySourceConvertIntSourceDictGetItemSourceFloatTensorSourceGetItemSource
GradSourceis_constant_sourceis_from_optimizer_sourceListGetItemSourceLocalSourceNumpyTensorSourceOptimizerSourceRandomValueSourceSourceSubclassAttrListSourceTupleIteratorGetItemSource)_extract_tensor_dictbuild_checkpoint_variablebuild_invoke_subgraph_variableclone_inputcommon_constant_types	dict_keysget_fake_valueget_items_from_dictget_locals_to_stealget_static_address_typeis_frozen_dataclassis_function_or_wrapperis_invoke_subgraphis_lru_cache_wrapped_functionis_namedtupleis_parameter_freezing	is_typingis_utils_checkpointis_wrapper_or_member_descriptoristypenamedtuple_fieldsodict_valuesproxy_args_kwargsrange_iteratorset_example_valuetensor_always_has_static_shapetuple_iteratortuple_iterator_getitemtuple_iterator_len unwrap_with_attr_name_if_wrapperwrap_fake_exception   )typestrValueMutationExistingValueMutationNewVariableTrackerVariableTrackerMeta)ConstantVariableEnumVariable)AutocastModeVariableEventVariableNullContextVariablePreserveVersionContextVariableStreamContextVariableStreamVariable)ConstDictVariableDefaultDictVariableDictKeySetVariableFrozensetVariableMappingProxyVariableSetVariable)DeviceMeshVariablePlacementClassVariablePlacementVariableProcessGroupVariableWorldMetaClassVariable)BuiltinMethodVariableCollectionsNamedTupleFunction!CollectiveFunctionRewriteVariableCreateTMADescriptorVariableFunctoolsPartialVariableFunctoolsWrapsVariableSysFunctionVariableTracebackVariableTritonKernelVariableUserFunctionVariableUserMethodVariableWrapperUserFunctionVariable) TorchHigherOrderOperatorVariable)ItertoolsVariable)LazyVariableTracker)	BaseListVariableListIteratorVariableListVariableNamedTupleVariableRangeVariableSizeVariableSliceVariableTupleIteratorVariableTupleVariable)AutogradEngineVariableAutogradFunctionContextVariableAutogradFunctionVariableComptimeVariableDebuggingVariableDelayGraphBreakVariableGetAttrVariableGetSetDescriptorVariableLambdaVariableLoggingLoggerVariableMethodWrapperVariableNumpyDTypeVariableNumpyTypeInfoVariableNumpyVariablePythonModuleVariableRandomClassVariableRandomVariableRegexPatternVariableSavedTensorBoxTorchVersionVariableTypingVariableWeakRefVariable)FSDPManagedNNModuleVariable$UnspecializedBuiltinNNModuleVariableUnspecializedNNModuleVariable)OptimizerVariable)TorchScriptObjectVariableSDPAParamsVariable)NumpyNdarrayVariable$supported_const_comparison_op_valuesSymNodeVariableTensorSubclassVariableTensorVariableUnspecializedPythonVariable)DispatchKeySetVariableFuncTorchInterpreterVariableTorchCtxManagerClassVariableTorchInGraphFunctionVariable)build_torch_function_fnTensorWithTFOverrideVariable#torch_function_mode_stack_state_mgrTorchFunctionModeVariable)
FrozenDataClassVariableKeyedJaggedTensorVariableMutableMappingVariableSourcelessGraphModuleVariableUserDefinedClassVariableUserDefinedDictVariable!UserDefinedExceptionClassVariableUserDefinedListVariableUserDefinedObjectVariableUserDefinedTupleVariable)InstructionTranslatorZcudagraph_static_inputsc                 C   sB   t   t dd t| dW  d    S 1 sw   Y  d S )NignorezThe .grad attribute of a TensorZgrad)warningscatch_warningsfilterwarningshasattr)t r   N/var/www/auris/lib/python3.10/site-packages/torch/_dynamo/variables/builder.pysafe_has_grad  s   
$r   c                   @      e Zd ZdS )_missingN__name__
__module____qualname__r   r   r   r   r   $      r   c                   @   s   e Zd ZU eed< eeejf ed< e	ed< e
ejjj ed< dZe	ed< dZe
ej ed< ed	d
 Zdd Zdd Zdd Zdd ZdS )GraphArgsource_examplepass_arg_as_tensorfake_tensorT	is_tensorNexample_strong_refc                 C   s*   t | jtr|  }|d usJ |S | jS N)
isinstancer   r#   )selfrr   r   r   exampleL  s
   zGraphArg.examplec                 C   s0   t | jtjrt| j| _t| jsJ d S d S r   )r   r   torchTensorr#   r   r   r   r   r   r   __post_init__U  s
   zGraphArg.__post_init__c                 C   s   || j  d S r   r   r   codegenr   r   r   reconstructZ  s   zGraphArg.reconstructc                 C   s   d | _ d | _d S r   )r   r   r   r   r   r   erase]  s   
zGraphArg.erasec                 C   s   | j  |j  kS r   )r   namer   otherr   r   r   __eq__a     zGraphArg.__eq__)r   r   r   rH   __annotations__r   r#   r   r	   boolr   _subclassesr   r   r   r   r   propertyr   r   r   r   r   r   r   r   r   r   (  s   
 
r   c                       s&   e Zd Zd fddZdd Z  ZS )BackwardStateGraphArgreturnNc                    s   t  jd t dd dd d S )NF)r   r   r   r   r   )super__init__r   r   	__class__r   r   r  f  s   
zBackwardStateGraphArg.__init__c                    sH    j jjsJ   fdd  dd      j jj d S )Nc                      s     tjdS )Nr   )Zload_import_fromr   r   r   r   r   r   <lambda>r  s    z3BackwardStateGraphArg.reconstruct.<locals>.<lambda>r   F)txoutputZbackward_state_varZadd_push_nullcall_functionZdup_topstorer   r   r  r   r   o  s   
z!BackwardStateGraphArg.reconstructr   N)r   r   r   r  r   __classcell__r   r   r  r   r   e  s    	r   c                 c   s0    | ]\}}| d st|rt|V  qdS )_N)
startswithinspectisclassid).0r   memberr   r   r   	<genexpr>{  s    
r  ITERTOOLS_TYPE_IDSITERTOOLS_POLYFILLED_TYPE_IDSc                       s  e Zd ZdZdeddf fddZdd Zd	d
 Zdd Zdd Z	e
dd Ze
eddd ZdejfddZdejfddZdd Zdd Zdd Ze
eddeeed egef f fddZd d! Zdefd"d#Zde e!e"e#e$f fd$d%Z%de&fd&d'Z'de(fd(d)Z)de e*e+f fd*d+Z,de-j.d,e/fd-d.Z0de-j1j2fd/d0Z3d1d2 Z4de-j.fd3d4Z5de-j.fd5d6Z6d7d8 Z7d9d: Z8d;d< Z9d=d> Z:  Z;S )?VariableBuilderz3Wrap a python value in a VariableTracker() instancer   r   Nc                    sH   |d usJ dt  d usJ dt   || _|| _| | _d S )NzRConsider SourcelessBuilder for ephemeral objects, usually objects created locally.zExpected active TracingContext)r   Ztry_getr  r  r  r   r   )r   r  r   r  r   r   r    s   

zVariableBuilder.__init__c                 C   s   || j jjv r| j jj| }t| j|j}|r| | |S | j jj|| j}|r,|S | |}| j|_| 	|rN|| j jjvrNt
|sN| j jj||}| j jj|| j| |S r   )r  r  side_effectsr0   r   install_guardsZvariable_tracker_cachelookup_wrap_can_lift_attrs_to_inputsr]   track_object_existingadd)r   valueZside_effect_resultZ	dup_guardZ	cached_vtvtr   r   r   __call__  s&   

zVariableBuilder.__call__c                 C   s   t |tttthv S r   )typer   r   r   r   )r   r   r   r   r   r    s   z)VariableBuilder._can_lift_attrs_to_inputsc                 C   s   | j S r   r   r   r   r   r   
get_source  s   zVariableBuilder.get_sourcec                    sF   |    z fdd|D }W n
 ty   Y d S w t|ddi i S )Nc                    s   g | ]}  |qS r   )
make_guard)r  guardr   r   r   
<listcomp>      z2VariableBuilder.install_guards.<locals>.<listcomp>skiprj   )r#  NotImplementedErrorr/   )r   guardstmpr   r   r   r    s   zVariableBuilder.install_guardsc                 C   s   |  tjS r   )_type_dispatch_implr%   trace_numpy)clsr   r   r   _type_dispatch  s   zVariableBuilder._type_dispatchc                 C   s   t jt jjt jjt jjjf| jft	t
ttjt jf| jft| jft| jfttf| jft	t| jftj| jftj| jft jj j!| j"ft j#j$| j%ft&j'| j(fg}|rZt)rZ|*t)j+| j,f i }|D ]\}}t-|t	ri|n|fD ]}||vstJ |||< qlq^|S r   ).r   r   nn	Parameterr   r   functional_tensorFunctionalTensorwrap_tensortuplelistr`   collectionsdequeSizewrap_listlikere   wrap_tuple_iteratorrb   wrap_range_iteratorslicerangewrap_slice_rangerO   wrap_literalrePatternwrap_regex_patternweakrefReferenceTypewrap_weakrefutilshooksZRemovableHandlewrap_removable_handleZjitZScriptFunctionwrap_jit_functiontypesMappingProxyTypewrap_mapping_proxynpappendndarraywrap_numpy_ndarrayr   )r.  r-  entriesresulttsfnr   r   r   r   r,    s:   




z#VariableBuilder._type_dispatch_implr  c                 C   s   |  tj t|S r   )r  r.   ID_MATCHr   r   r  r   r   r   rC    s   z"VariableBuilder.wrap_regex_patternc                 C   s    |  tj tj| j|| jdS Nr   )r  r.   
TYPE_MATCHr   buildr  r   rW  r   r   r   rF    s   zVariableBuilder.wrap_weakrefc                 C   s   t d d S )Nz"unregistered hook removable handle)r,   rW  r   r   r   rI    s   z%VariableBuilder.wrap_removable_handlec                 C   s   |  tj t|d| jdS )N_torchdynamo_inliner   )r  r.   rY  r   r   rW  r   r   r   rJ    s   z!VariableBuilder.wrap_jit_functionc                    s    tj  tj tdd | D }|std fdd t fdd| D }t	|d d}t
|jd}jjj||S )Nc                 s       | ]}t |V  qd S r   rp   
is_literalr  kr   r   r   r        z5VariableBuilder.wrap_mapping_proxy.<locals>.<genexpr>z+mapping proxy type supports only const keysc                    s0   t | }| }t  |}t||}||fS r   )rp   creater?   r#  r   )r`  vkey
source_keysource_valuer  r   r   r   build_key_value  s
   
z;VariableBuilder.wrap_mapping_proxy.<locals>.build_key_valuec                 3   s    | ]
\}} ||V  qd S r   r   r  r`  rc  rg  r   r   r    s    r   )r  r.   rY  ZMAPPING_KEYS_CHECKallkeysr,   dictitemsrx   r|   r   r  r  r  track_mutable)r   r  	all_constrm  dict_vtrS  r   )rg  r   r   rM    s   	z"VariableBuilder.wrap_mapping_proxyc                 C   s~   ddl m } |dd ftjdd ftjdd fg}i }|D ]\}}t|ttfr*|n|fD ]}||vs5J ||t|< q-q|S )Nr$   )comptimec                 S      t  S r   )r   rW  r   r   r   r  %      z.VariableBuilder._id_dispatch.<locals>.<lambda>c                 S   s   t tfd| ji| tjS )Nr   )r   _dataclasses_fields_lambdar   r  r.   FUNCTION_MATCHrW  r   r   r   r  (  s    
c                 S   rr  r   )r   rW  r   r   r   r  .  rs  )	rq  dataclassesfieldsr   __version__r   r5  r6  r  )r.  rq  rR  rS  rT  rU  r   r   r   r   _id_dispatch  s   
zVariableBuilder._id_dispatchc           0   	      sd  ddl m}m} | rddlm} ddlm} nG dd d}G dd d}| r2dd	lm}m	} nd
d }dd }
 t}|d urL|S  t}	|	d ur^|	S tshttjrmS trtj fddttD }
t|
tjd}|S tttjtjfrtj t dd ! D   sj"j#j$%j&   fddtfddt't(D }ttjrt)jd}t*|tt+j"|j,jd}n
t-|tjd}j"j#j./|S t0t1j2j3r4S t56r7S t0t1j8j9r4t:jd}j"j#j.;| |S tt<rZt dd D rZfddD }tj= t>|jdS t0t?j@t1jAt1jBjCjDfrutj= tEjdS tFGrtjH tFjdS t0tIjJrtjK tLjdS tMrtNjdS tOrtPjdS t0tQjRr0t)S d}t+j"|jT}g }t)S d}t'jUD ]\}}|Vt+j"tW||| qi }t)S d}jXY D ]\}}t56|stZd  t+j"t[|||||< qt\S ]tj|]tj^|]tj t_|||S t`rBtj= tajdS tbd urVt0tbjcrVdtbeS tfgrvtbsaJ thrktjKntj tijdS tfjrtj= tkjdS tflrt0tbjmrtj t)jd!}t\|]tj= ntj= tnjdS toprΈtjK tojqj"jdS tt1jrjsjtrtjK tujdS t0t1jrjsjvrKd }zjw}W n
 txy   Y nw g }j]tjg}t0|tyr6t)jd"}|V|]tj t'|D ]\}}|Vt+j"tW||| q"t\|  j"j#j.;tzjt{|d#S t0t|j}rtt~d$d t1jrjsjtrt~d%d&d'krt~jd'd krtjK ttujt)jd$d(dd'S t0t1jBjrtj= tjdS t1jjjju rtjK tfd)d*S thrtfd urtfrd+j"j#_tfjjdS tbrt0tbjrS t0trt1jju rtZd, tjtj tjjdS t0t1jjr*tj= t)jd-}t+j"|j}tqj"|S t0t1jrZtj= j"j#d.td/jjjd0} t| j t| jjdS t0t1jBjrqtj tqj"jS t0t1jCjjrtj= tS t0t1jrtj= t1jj j"j#d.t1jjjtfi }!t|!j t|!jdS t0t1jBjrˈtjv rtjdS ttjrtd1d d u rtj tjdS trtj tjd}j"j#j.;|S t0t1jjrtj= tj_tjdS t0t1jr0tj tS tr=tjdS trPtj= tjdS trctj tjdS t Èrvtj= tjdS tĠňrtj tĈjdS ttv rttvrtjK tȈjdS tɈr4t0t1jʃrjntˈj}"j̡ rψj"j#jjtψjjЃ|"tjd2}#nt0t1jӃrވj"j#j͠ԡ }#ntZd3 j"j#jjtנd4d5j&t|#|#|"d}$t|"|#d6d d6|#d7|$jjd8< |#jj}%t0|%tj݃sJ |% d9j"j#jޠVt|#|"d  t0t1jʃr+|#n|#d:k}&t|$|&S t0||frKtj= td d jdS |u rUtd:d;S |u r_td<d;S t0t1jjjr}tj= tjjjjgjd=S trtjK tjdS td>d6rtj td?jdS trtj td@jdS tju rtjdS tju stjdAkrވtju rtjdS trtdBd6rtj tdBjdS tQju rtj= tjdS tju rtj= tjdS t0t|jr9tr9tj= tjdS tr[t\}'|'d urPt)j|'_tfjjdS t ju rptj= tjdS tt jrtrtj tjd}j"j#j./| |S t0t|jtjfrtjK tjd}j"j#j.;| |S t0t|j}rt0jt1j2j3t1jj	j
frt+j"t)jd$dj}(|(rt0|(tsJ dCtjK tj|(jdS t0t|jrtS t0t|jrtS tttr:ttr:tj= tS tttrt1jjjt1j2jt1j2jfv ratfjjdS t1jrju rwtjK tj"S tj= tjdS tt	rBd<dDlm})m}* t1j j!"rЈj"j#jjtנd4d5j&tjd}+tوjd6d d6|+jjd8< tjq|+jdS t#dEs݈$S t%&t+j"|*j' (  t%&t+j"|)j)  t1j j!*j"j#j+},j"j#jjtנd4d5j&t|,jd}+tوjd6d d6|,|+jjd8< tjq|+|,jdS t0ttjf	rtj,tj,u 	rtj tj j"j#j$%j&  fdFdtfdGdt't(D }t-|t0tj	rtjntt- jdH}-d+|-_.t/|-jdI}j"j#j.;|S t0ty	rtj,tyj,u 	rtj tj fdJdt0ty1D }
t2|
jt- dK}.t3jq|.jdL}j"j#j.;|S t0t4
r;tj tj fdMdt0t41D }
t5|
jt- dK}/t6|/jdN}j"j#j.;|S ttt7
rStj t8jdS t9
rstj t:jqj"jd}j"j#j.;|S t0t;
rt dOd D 
rfdPdD }t\S ]tjS ]tj t<|jdS tZdQ d S $S )RNr   )
has_tritonhas_triton_tma)	Autotuner)JITFunctionc                   @   r   )z*VariableBuilder._wrap.<locals>.JITFunctionNr   r   r   r   r   r}  B  r   r}  c                   @   r   )z(VariableBuilder._wrap.<locals>.AutotunerNr   r   r   r   r   r|  E  r   r|  )create_1d_tma_descriptorcreate_2d_tma_descriptorc                   S      d S r   r   r   r   r   r   r~  O     z7VariableBuilder._wrap.<locals>.create_1d_tma_descriptorc                   S   r  r   r   r   r   r   r   r  R  r  z7VariableBuilder._wrap.<locals>.create_2d_tma_descriptorc                    s(   g | ]}t jt|t j|d qS r   )r   rb  getattrr8   r   )r  r   rW  r   r   r&  f  s    
z)VariableBuilder._wrap.<locals>.<listcomp>)Z	tuple_clsr   c                 s   r\  r   r]  r_  r   r   r   r  s  ra  z(VariableBuilder._wrap.<locals>.<genexpr>c                    sP    r
t |}|}nt | }t||}t |}t||}||fS r   )rp   rb  r;   r#  r   r=   )ir`  rc  rd  re  rf  r  )ro  r   r   r   rg    s   
z.VariableBuilder._wrap.<locals>.build_key_valuec                 3   $    | ]\}\}} |||V  qd S r   r   r  r  r`  rc  ri  r   r   r    
    


default_factory)r  r   )user_clsr   r   c                 s   s6    | ]}t |tju r|jd kp|tjjjv V  qdS )r   N)r"  rK  BuiltinMethodTyper   r   rG  _pytreeZBUILTIN_TYPESr  xr   r   r   r    s    
c                       g | ]	}t  j|qS r   SourcelessBuilderrb  r  r  rc  r   r   r   r&        r  r   funcargskeywordsz*functools.partial with non-literal keyworddtypesaved_tensors)r   r  __self__r    apply)r  c                      s(   t tjjjj j jjj	
 fi S r   )r   r   _dynamoexternal_utilsFakeCompiledAutogradEngineZexec_final_callbacksr	  r  r  r  Zget_ca_final_callbacks_varr   r   r   r   r  Z  s    
z'VariableBuilder._wrap.<locals>.<lambda>TzHDirectly using invoke_subgraph is not supported. Use mark_compile_regionstreamr	  r   )	stream_iddevice_indexdevice_typeenter_result)dynamic_dimzaunbacked symint input is not supported yet. If you need this feature, please file a github issue.[^a-zA-Z0-9]+r  F)r   r   grapharg is not a basic Symbol.rj   )Zrankr$   )Ztarget_valuesr   Z__script_if_tracing_wrapperZ__original_fn__wrapped__)      r[  z"Failed to produce a valid self obj)FlattenScriptObjectSourceScriptObjectQualifiedNameSource__obj_flatten__c                    s<   t   | }t||}t  |}t||}||fS r   )r;   r#  r   rb  r=   )r  r`  rc  re  rd  rf  r  r   r   r   rg    s
   c                 3   r  r   r   r  ri  r   r   r    r  )r  mutation_typer   )rp  r   c                    ,   g | ]}t jt|t  |d qS r  )r   rb  r5  __getitem__r?   r#  r  r  rW  r   r   r&  !      
)r   r  )tuple_vtr   c                    r  r  )r   rb  r6  r  rC   r#  r  rW  r   r   r&  6  r  )list_vtr   c                 s   r\  r   r]  r_  r   r   r   r  J  ra  c                    r  r   r  r  r   r   r   r&  P  r  z2dict_keys with non-constant keys are not supported(=  Ztorch.utils._tritonrz  r{  Ztriton.runtime.autotunerr|  Ztriton.runtime.jitr}  Z$triton.tools.experimental_descriptorr~  r  r/  getr"  ry  r  r!   r^   r%   traceable_tensor_subclassesr4  rY   r  r.   SEQUENCE_LENGTHr_   r   r   rl  r7  defaultdictOrderedDictrY  rj  rk  r  r  Zguard_on_key_orderr  r   	enumeraterR   r8   ry   r  r  rx   r  rn  r   r   r0  Modulewrap_modulerp   r^  r@  Z	overridesZTorchFunctionModer   r  	frozensetrV  r{   enumEnumDispatchKey_C
_functorchTransformTyperq   r   Zis_reorderable_logging_functionZBUILTIN_MATCHloggingLoggerru  r   r\   rL   rW   rM   	functoolspartialr#  r  r  rO  r?   r  rm  r,   r=   r/   r$  ZDICT_KEYS_MATCHr   r[   r   rN  ZgenericrQ  Zasarrayr)   Zis_numpycallabler   Zis_numpy_dtyper   Zis_numpy_type_infoZiinfor   r   Zcan_rewriterb  ZautogradfunctionZFunctionMetar   ZFunctionCtxr  RuntimeErrorr5  r   r   rK  
MethodTyper  r  r   Z_ImperativeEnginer   r  r  r  Z_exec_final_callbacks_stubr   lookup_callableis_callable_allowed!has_user_defined_allowed_in_graphZcreate_with_sourcenumberwrap_unspecialized_primitiver   _higher_order_opsZinvoke_subgraphZ
NAME_MATCHr   makecudaZStreamContextr  rv   Streamcreate_proxyr  r  r  rc   noderw   deviceZ_SDPAParamsr   pyfunctorchFuncTorchInterpreterr   EventrG  Zstore_user_object_weakrefZget_user_object_from_idrs   Z_TensorMetar   
contextlibnullcontextr  getattr_staticrt   r   Zis_matching_objectZoptimZ	OptimizerrF   r   DispatchKeySetZDISPATCH_KEY_SET_MATCHr   r   Zis_group_member_typer   Zis_process_groupr~   is_device_meshEQUALS_MATCHr   Zis_placement_typer   is_placementr  r  r   r   r	   r<   Zhas_hint	shape_env$create_unspecified_symint_and_symbolinthintr   DYNAMICSymBoolcreate_unbacked_symintroot_tracercreate_graph_inputrA  subr   metaexprsympySymboltracked_fakesTrackedFaker   r   r   ampZautocast_modeZautocastrr   Z
fast_dtypeZ_enabledZ_cache_enabledr   Zis_matching_clsr   rX   	tracebackclear_framesr   sysexc_infoversion_info	exceptionr   rV   wrapsr   
namedtupler   r  r   Zis_supported_builtin_methodrh   r  randomRandomr   r   Zis_supported_random_obj
ModuleTyper(   ZDummyModuler   r  TreeSpecrn   r   __func__GetSetDescriptorTyper   MethodWrapperTyper   
issubclassBaseExceptionr   rH  ZBackwardHookr1  BufferZ _unsafe_preserve_version_counterru   constructorr   r   r  r  Z_libraryZfake_class_registryZtracing_with_realr   wrap_user_definedr   realize_all_typeZqualified_namer  Zmaybe_to_fake_obj	fake_mode__new__rl   Zshould_reconstruct_allr   r>  __len__r   r   r6  r   r   r   r   rU   r   rP   rz   )0r   r  rz  r{  r|  r}  r~  r  Ztype_dispatchZid_dispatchr  rS  Zfactory_sourcevarrm  Zfunc_srcZfunc_objr  Zargs_sourcer  argr  Zkeywords_sourcer`  rc  Z	dt_sourceZactual_saved_tensorsr  r*  Zsaved_tensors_sourceZstream_sourceZ
stream_varZstream_proxyZevent_proxyr   Z
new_symintZsym_node_proxysym_exprZtracing_symintZ	attr_nameZself_objr  r  proxyZfake_script_objrp  r  r  r   )ro  rg  r   r  r   r  9  sx  






	













	

	










	




	





"








"zVariableBuilder._wrapc                 C   s>   |  tj t|| jd}tt|s|S | jj	j
||S rX  )r  r.   rY  r   r   r6   "cls_supports_mutation_side_effectsr"  r  r  r  r  r   r  rS  r   r   r   r  [  s
   z!VariableBuilder.wrap_user_definedc                    s  t jrt|tju r tj tj	|dS  tj
 t|tr@tdd |D r@ j  r@ tj tdd |D S  fddt|D } jjjd}t jtr߈ jjt|v r߈ j}t|tskJ  jjjjtdd	 j t|||d
}d|j!j"d< t#t$ j||d |d}g }t|j%D ]1\}}	t&||dd}
|	 jjj'|
< t(|| |	j)j!j"d< t*j+tj,t-|| d}|.|
/| qt0|ddi t1||dd dd}||j!j"d< t23|| jd
}t|tt4j5fr jjj67||S |S )Nr  c                 s   r\  r   r]  r  itemr   r   r   r  q  ra  z0VariableBuilder.wrap_listlike.<locals>.<genexpr>c                 S      g | ]}t |qS r   rp   rb  r  r   r   r   r&  u  r'  z1VariableBuilder.wrap_listlike.<locals>.<listcomp>c                    s(   g | ]\}}t j|t  |d qS r  )r   rb  r?   r#  )r  r  r  r   r   r   r&  w  s    r   r  r  r   TZ	steal_arg)
target_clsr  r  example_valuesubclass_typer   FbaseindexZindex_is_slicetensor_dictr(  rj   )r   r   r   r  )8r%   specialize_intr"  r   r9  r  r.   CONSTANT_MATCHrp   rb  r  r^   r5  rj  r   guard_sourceis_unspecialized_nn_moduler   r  r  r  Zlocal_scoper  r   rD   Z
local_namerS   r6  r  r  rA  r  r   r  r  wrap_fx_proxy_clsr   rm  r?   input_source_to_varrK   r  r  r  TENSOR_MATCHr#   rO  r$  r/   r   r   Zcls_for_instancer7  r8  r  rn  )r   r  r  Zmaybe_gmr   Ztensor_list_proxyZlist_variabler*  r  tensor_variableZsource_ir%  r  rS  r   r   r   r:  c  sz   
	
	zVariableBuilder.wrap_listlikec                    sH     tj  fddttD }t| jd} jjj	
|S )Nc                    ,   g | ]}t  jt  |t|qS r   )r  r  rJ   r#  rf   r  rW  r   r   r&        z7VariableBuilder.wrap_tuple_iterator.<locals>.<listcomp>r   )r  r.   ZTUPLE_ITERATOR_LENr>  rg   r   r   r  r  r  rn  )r   r  r  rS  r   rW  r   r;    s   
z#VariableBuilder.wrap_tuple_iteratorc                 C   s@   |  tj dd t|D }t|| jd}| jjj	
||S )Nc                 S   r  r   r  r  r   r   r   r&    r'  z7VariableBuilder.wrap_range_iterator.<locals>.<listcomp>r   )r  r.   ZRANGE_ITERATOR_MATCHcopydeepcopyr   r   r  r  r  rn  )r   r  rm  rS  r   r   r   r<    s   z#VariableBuilder.wrap_range_iteratorc                    sF    fdddD }  tj ttrt| jdS t| jdS )Nc                    r&  r   )r  r  r8   r#  r  r_  rW  r   r   r&    r'  z4VariableBuilder.wrap_slice_range.<locals>.<listcomp>)startstopstepr   )r  r.   rY  r   r=  r   r   r   )r   r  rm  r   rW  r   r?    s   
z VariableBuilder.wrap_slice_ranger%  c                 C   sh   ddl m} td| j t| |||d || jjj	v r2| jjj	| }|j
|jjjd d< d S d S )Nr$   )mark_static_addressz Marking static input %s, id: %s)r%  r  _dynamo_static_input_type)Z
decoratorsr-  static_inputs_logdebugr   r   r  r  r  r  r/  r  r  r  )r   r  r%  r-  r  r   r   r   mark_static_input  s   z!VariableBuilder.mark_static_inputc                 C   sd  ddl m} t|jdkr"tdt|dt| dg tjdd t||rHt	
|jd	d
r5t| jdS | tj t| jd| _| |jS t|tjjtjjtjjfr]tjs]td t|dd
rt|dd
smtd | tj t||  d}t !t"|s|S | j#j$j%&||S t'(|| j#j)rt|tj*j+j,j-r|. }t/| j| _| tj tj0jj1rt2 }|3 D ]	}| j4||d q|5 D ]	}| j4||d q|r|| j#j$j6| j7< |j89dst|j:dd
rt;|| jd}nt<|| jd}t !t"|s|S | j#j$j%&||S t=|j:tjj>j?j@r%| tj t<||  dS | j#j$jA|| j7|  dS )Nr$   )OptimizedModuler   zUninitialized nn.Modulez6Attempted to trace an uninitialized nn.Module of type .z?Ensure your nn.Module instance has called `super().__init__()`.)Zgb_typecontextZexplanationhintsZ_torchdynamo_disableFr   	_orig_modz5TorchDynamo purposely graph breaks on RNN, GRU, LSTMsZ_is_fsdp_managed_moduleZ_fsdp_use_orig_paramsz3Dynamo only supports FSDP with use_orig_params=Truer.  )z	torch.nn.z	torch.ao.Z_dynamo_marked_static)BZ
eval_framer3  len__dict__r-   rk   r&   Z
USER_ERRORr^   r  r  forwardr   r   r  r.   rY  r8   r  r7  r   r   r0  ZRNNZGRUZLSTMr%   Z	allow_rnnr,   r  r   r#  r6   r  r"  r  r  r  r  r'   Zis_dynamic_nn_moduleexportfxZexperimentalZproxy_tensorZ
_AttrProxyget_baser7   r  inline_inbuilt_nn_modulesrZ   
parametersr2  buffersZ
nn_modulesr   r   r  r  r   r   r  ZparalleldistributedZDistributedDataParallelregister_attr_or_module)r   r  r3  rS  Zfreezingpbr   r   r   r    s|   
	
zVariableBuilder.wrap_modulec                 C   s   t js"t|tu r"t|| jr| tj t	j
|| jdS | |S t js0t|tu r0| |S | tj t	j
|| jd}t|ttfrN| jjj||S |S )Nr  )r%   r  r"  r  r   r   r  r.   r  rp   rb  wrap_symintspecialize_floatfloatwrap_symfloatr   r6  setr  r  r  rn  r  r   r   r   r@  U  s   

zVariableBuilder.wrap_literalc                 C   s*   t |rt|| jju rtddd S d S )Nz*Cannot wrap a Tensor that has already beenz"wrapped by this instance of Dynamo)r   r   r  r	  r+   rW  r   r   r    assert_not_wrapped_by_this_graphg  s   z0VariableBuilder.assert_not_wrapped_by_this_graphc                 C   sF  |   }|| jjjvsJ t|d u}tjr1|s1t|tj	j
s'|r1|  r1| j|t d d}|o>tj p>t p>tjjj}|  sG|r]|  s]| | | jjj|| j|dS t|dkry| tj | | | jjj|| j|dS t|r| | | jjj|tdd| j|dS t|tjv rt|}nt|tjtj	j
tjj j!tjj"j#fv st$|sJ t|d }|| jjj%v }|r| jjj%| S t|dkr| tj | | i }t|tjv rt&| j|| j'|d< | tj( t|tjr|j)rt|tj*j+j,j-st.d t|tjr)t/|r)| jj0r%tj1s)t.d	 t2|rBt3|d urB|j4t3|j4krBt.d
 t5|| jd|d}| jjj6j7tdd| jt|||d}	t8| j|	| t9d| j|	|||d|}
|: rt5|j;| jt<|ddd tj=}t|t>rt?|rtj@}| tAjB|t|tCr|ntD|d t$|r| tjE | tj( tFtG|HtjI |J \}}|D ]}tK||}t<| j'|}tLMtN| j|| q|
| jjj%|< d|	jOjPvsJ tQ||	jOjPd< |
jRjOjPd }tS|| jjTurtUdtV||d|}||	jOjPd< |
S )Nr.  Tr   Zguardedr  r  Ztorch_function_fn3torch.compile does not support strided NestedTensorz-torch.compile does not support sparse TensorszInconsistent dtype between tensor and its gradient. This can happen in FSDP and crashes meta tensor creation. This is potentially a workaround. Fixing it correctly requires some design around FSDP + torch.compile.r  r   r   )r  r  r  r  r   _base)r  r   r   r  r  r  z(Wrapped Tensor must be this graph's fakeFr  r   )Wr#  r  r  r  rT   r%   r>  r   r   r0  r1  r   r!  r2  rZ   r  Zprepare_freezingis_specialized_nn_moduleZis_fsdp_modulerJ  rB  r   r  r.   rV  rA   rA  r  r"  r  r   r   r   r   r2  r3  r!   r#  r   r   rY  	is_nestednested	_internalnested_tensorNestedTensorr,   r   r;  Zcapture_sparse_computer   r   r  wrap_to_fake_tensor_and_recordr  r  cache_real_value_when_exportwrap_fx_proxy_is_viewrM  r8   r$  r@   rB   ZNOT_NONE_MATCHr  r  rE   r#   ZTENSOR_SUBCLASS_METADATA_MATCHr/   rI   r$  r  __tensor_flatten__r  r   r  r  r  r  rK   r  r   r	  r+   r   )r   r  r   Zis_static_inputZmake_graph_attributer  Zis_duplicate_tensoroptionsr  Ztensor_proxyr%  Z
guard_typeattrsr  attrZinner_valueinner_sourcefake_tensor_valuer  r   r   r   r4  n  s.  




	









	

zVariableBuilder.wrap_tensorc                 C   s  t d usJ t|t jsJ t|  }ddlm} |jj }|r:zd|j_W n t	y9   t|j
t js7J Y nw t 4 z||}|rQddlm} ||}W n tyj } ztt| W Y d }~nd }~ww W d    n1 suw   Y  tt| j|| t|| jd|d}| jjjjtdd| jt|||d	}	t | j|	| d
|i}
t!dt"| j|	|d|
}|| jjj#|< |j$j%j&d }t'||d|d|d}||	j%j&d< |S )Nr   )_utilT)clone_preserve_stridesFrL  r  r  r   r   r  r  r  r  r  r   r   r   r   r  r   )(rN  r   rP  rE   r#  Ztorch._numpyr^  flagsZ	writeable
ValueErrorr  Znditerr   Ztemp_restore_stackZ_try_convert_to_tensorZtorch._prims_commonr_  r)  r,   strr   r  r  r  rT  r  r  r  rA  r  r   r"  rU  r"  r   r#  r  r  r  r   )r   r  r   r^  readonlyZtensor_valuer_  er  r  rY  Znumpy_ndarray_variabler  r   r   r   rQ  P  sv   



z"VariableBuilder.wrap_numpy_ndarrayc                 C   s  t |tu sJ | j| jjjv r| jjj| j S | jjj}t j	r8|
 }t| | jjjt|| jd  nt|  stjjjrQ| tj tj|| jdS | j }t| j|t|| j  d}t | j }| j}t!|t"rz|# }| j t$ v rt%&d| j  t'j(}n6tj)r|j*t+u rt, }n*t!|t-r|j.d urt/|j.|ddid stj0st'j(}n| tj tj|dS |j1|| j|d}| jjjt|| jd  nt|  sJ | tj tj|| jdS t!|  t2rJ t3|  4tj5 d|  i}	| jjj6j7t89d	d
| jt |||  d}
|j:j;}t!|t<j=s3J | d|
| jjj6j>|< t?|
|fi |	}|| jjj| j< t|  s|| jj@rlt!|  t-sltAd| d|   tB|  |dd d|d|
j:jCd< |S )Nr  r!  &%s marked dynamic via source whitelistr   Fr  )r   r  r   r  r  r   r  =Dynamo attempts to add additional input during export: value=	, source=ra  r  )Dr"  r  r   r  r  unspec_variable_mapr  r   r  Z#force_unspec_int_unbacked_size_liker  r   r  rO  r  r   rA   r#  r   r  r%   r  r  r.   r  rp   rb  r5   r3   make_scalarr   r!  r   r   r:   r=  get_dynamic_sourceslogr1  r   r  automatic_dynamic_shapesscalarr1   $get_automatic_dynamic_shapes_mark_asrD   dynamismrl  assume_static_by_defaultr  rG   r/   r$  rY  r  r  rA  r  r  r  r  r  Zbound_symbolsr   r;  AssertionErrorr   r  )r   r  r  wrapped_valuer   frame_state_entrynormalized_source_namebase_sourcer  rY  r  r  
unspec_varr   r   r   rE    s   









	zVariableBuilder.wrap_symintc                 C   s  | j | jjjv r| jjj| j  S t| j| j  t|| j 	 d}t
jjjsIt|  sIt|sIt|sIt
jjjjsItddsI|jturW| tj tj|| jdS t
j|t
jd}t
j j!"|rt| tj tj|| jdS t#|  t$r}J t%|  &tj' t(|  }||d}t)|| jd|d}| jjj*j+t,-dd	| j t.|||d
}t/| j|| t0t1f| j||d|}t#|t1sJ || jjj| j < | jj2rt#|  t3st4d| d|   d }	|j5j6j7d }t8|sJ |}	|	j9| jj9u sJ d|	j9 dt:|  |d|	d|d|j6j7d< t;| j| jjj<ddgt=|gi R  }
| jjj>?t@|
jA| jd  tB jCdddd |
S )Nrg  z.pytorch/compiler:unspecialize_float_killswitchFr  )r  )r   	raw_valuerL  r  r  r   r  r  r  ri  rj  r  fake mode (^) from fake tensor metadata doesn't match mode({self.tx.fake_mode}) from InstructionTranslatorTra  r  call_methodr  Ztensorify_float_attempt)	overwrite)Dr   r  r  rk  r5   r   r3   rl  r   r!  r   r  r%   rF  rA   r#  mathisnanisinfZ	_inductorZtritonZ
cudagraphsr   rp  r1   r  r.   r  rp   rb  tensorZfloat64r  r  Zis_gradtrackingtensorr   rG   r/   r$  rY  r>   rT  r  r  rA  r  r"  rU  r"  r   r;  rD   rt  r  r  r  r   r	  r   rV  r  ra   r  rO  r  Zsym_numr
   rI  )r   r  rv  ru  r   rY  r  r  ry  r]  r   r   r   r   rH    s   









zVariableBuilder.wrap_symfloatc                 C   s  | j | jjjv r| jjj| j  S t|}t|  ts&t	|  
tj d|  i}|d|i t|| jd|  d}| jjjjtdd| j t|||  d}t| j|| ttf| j||d|}|| jjj| j < t|  s| jjrt|  tstd	| d
|   d }t|tr|j}n|jjjd }t |sJ |}|j!| jj!u sJ d|j! dt"|  |d|d|d|jjd< |S )Nr   rz  FrL  r  r  r   r{  ri  rj  r  r|  r}  Tra  r  )#r   r  r  rk  r   r  r   r#  rG   r/   r$  r.   rY  updaterT  r  r  rA  r  r"  rU  r"  r   rA   r;  rD   rt  rp   r  r  r  r  r   r	  r   )r   r  ru  rY  r  r  ry  r]  r   r   r   r    sd   


z,VariableBuilder.wrap_unspecialized_primitive)<r   r   r   __doc__rH   r  r!  r  r#  r  classmethodr/  r  	lru_cacher,  rA  rB  rC  rD  rE  rF  rI  rJ  rM  rl  r  r   r   rn   ry  r  r  r   r5  r6  r`   r   r:  re   r;  rb   r<  r=  r>  r?  r   r   r   r2  r0  r  r  r@  rJ  r4  rQ  rE  rH  r  r  r   r   r  r   r    sb    	
&      (Yi cHt 
r  c                 C   sl   t | tr	| j}ntd|   g }t|D ]}d }| jr(tt| jd|j	}|
t||d qt|S )Nz)Dataclass fields handling fails for type __dataclass_fields__r   )r   r   r  r,   rv  rw  r   r=   r8   r   rO  r   )objr  rm  fieldr   r   r   r   rt    s   
rt  c                 C   s>   t | tjrt | tst| rt| |u s| jst| } | S r   )r   r   r   r   Z_is_functional_tensorr   rO  rN   )r  r	  r   r   r   _clone_input  s   r  r   c                 K   sL   | |||d|}|d u rt ddti|S t ddti|}||  |S )N)r  r  r  r  r  r   )r"  r   r   Zinstall_global)r  r  r  r  rY  kwargsrS  r   r   r   rV    s   
rV  c                 C   sP   | j r&tj  t|| j|jj|j< W d    d S 1 sw   Y  d S d S r   )	r;  r   r  DisableTorchFunctionSubclassr  r	  tracerreal_value_cacher  r{  r   r   r   rU  	  s   "rU  c                 K   sV   |d u rt | ||||fi |S t|tjr"t| ||||fi |S t|||||| S r   )_wrap_fx_proxyr   r   r   _wrap_fx_preexisting_tensorhandle_traced_output)r  r  r  r  r  rY  r   r   r   r"  <	  s   

r"  c              	   K   s  ddl m} t|tjsJ dt| t||sJ d|v r/|d d ur/|jj|d  |j	j
dkrDd|j	jv sCJ d| dnd|j	jvsSJ |j	jd  tjj q t||ju rbnMt||| |jrtj  t||j|jj|j	< W d    n1 sw   Y  d	| ttfv i}d
|v r|d
 d usJ |d
 |d
< t|fd|i|}|jjdkrt||jurtd| W d    n1 sw   Y  t|||||| S )Nr$   InstructionTranslatorBasez1_wrap_fx_preexisting_tensor expected tensor, got r*  placeholderr  zplaceholder z* doesn't have 'example_value' in node.metar   r   r  r  zN`tensor` needs to be a `FakeTensor`wrapped by this instance of Dynamo. Found: )symbolic_convertr  r   r   r   r"  r  r*  r  r  opr  r  rG  +_disable_saved_tensors_hooks_during_tracingr   r	  rU  r;  r  r  r  r  r  r   r   rT  r  r+   r  )r  r  r  r  r  rY  r  r  r   r   r   r  Q	  sR   
	"r  c                 K   s   ddl m} t||sJ d|v r |d d ur |jj|d  d|jjvs/J |jjd  tj	j
  t|j|dd}W d    n1 sHw   Y  t|||||| S )Nr$   r  r*  r  T)Zallow_non_graph_fake)r  r  r   r  r*  r  r  r  r   r  rG  r  rQ   r  )r  r  r  r  r  rY  r  r   r   r   r  	  s   r  c                 C   s~  dd l }dd l}dd l}t| |jrkt| |jj}t| |jj}t| |j	} t
|j|  |jj| | || }	t| |jjjr^| j	|j	u r^|rK|n|j}
|rT|jjn|rZ|jjn|
|	d< ||	 ||fi |S t|jjdr|jjjdkrt|jjj|jjs|jj|jjkrt|jjS |jj|jjks|jj|jjkrt | S t!| |j"rt#dd | D rdd | D }t$|fi |S t| t%t&fr|t
|j|  g }t'| D ]Q\}}|d u r|(t)j*d#i | q|j+j,d	t-j.||fi d
}d|v rt| t&sJ |d }|/ }t0||dd|d< n|}|(t1d$||||d| qt| |j"r9t$||fi |S t!| t%rGt2|fi |S t!| t&t3frWt4|fi |S | j5j6dksrt| dsrJ d| j5j6 dt7|  t8|| j5fi |S | d u s|jj|j9u rt)j*d#i |S t| |j:|j;|j<fr|jj| | t
|j|  t=|| fi |S t>?|jjrt@|jj|jAs|jjdd tB D v rt
|j|  tC|| | jDfi |S t>?|jjrt@|jj|jEs|jjdd tB D v rt
|j|  tF|| fi |S |jjdkr,|jjGdkr,t
|j|  t)| fi |S | d urUt| |jErU|jjdkrU|jjGdkrUt
|j|  tF|| fi |S t| tHr|jj|jItJt-j.|jKjL|jMt-jN|jOjPjQtJ|jRdtStJ|jRdtS|jTf
v s|jjGdkr|jjdv rt
|j|  t)j*| fi |S t| |jUjjVrddlWmX} t
|j|  ||fi |S t| tYr|jj|jjZ|jUjj[|jUjj\|jUjj]dgt&t^_  v rt
|j|  t)j*| fi |S t| tHt`tYfr|jjtau rt
|j|  t)j*| fi |S t| t`s|jjdv r't
|j|  t)j*| fi |S tbdtc|  d |jjG d |jj  d!d" d S )%Nr   Z
class_typer   Z	set_statec                 s   s    | ]}t |tV  qd S r   )r   r  r  r   r   r   r  	  s    

z'handle_traced_output.<locals>.<genexpr>c                 S   r  r   r  r  r   r   r   r&  	  r'  z(handle_traced_output.<locals>.<listcomp>r	  )kindtargetr  r  r   Fr  r`  ztorch.return_types_fieldsz	expected z. == torch.return_types or named tuple but got c                 S      g | ]\}}|j qS r   )Zcurrent_streamr  r  device_interfacer   r   r   r&  
      c                 S   r  r   )r  r  r   r   r   r&  '
  r  queryr~  Zrecord_eventZget_rankZget_world_size)
bit_lengthrj   r   
is_integer)hex	__round__ztorch.* op returned non-Tensor  Zunsupported_operator)Z	case_namer   r   )dZtorch._functorch.vmaptorch._subclasses.fake_tensorZtorch._utilsr   r   r0  r1  r  r  r	  rc   r  r  Zcurrent_tracerZtrack_unbacked_symbolsZ
specializer   r   r   r  r   r  r   r  r  	Generatorr  Zset_rng_stater   Z_DisableFuncTorchr  Z_is_in_bad_forkr   r^   r9  rj  r   r5  r6  r  rO  rp   rb  r  r  operatorgetitemr(  r?   r"  r   r    r   r  r   r"  r   Zmanual_seedr	   ZSymFloatr  r   r  r  r  r  r*   rw   r  r  rs   r  r  Zsym_intr  _utilsZ_element_sizeseedmodr  ZvmapZ_validate_and_get_batch_sizerA  r   Z_constrain_as_sizebackendsZ
SDPAParamssdpar   r   Z _are_functorch_transforms_activeZis_flash_attention_availableZcan_use_flash_attentionZcan_use_efficient_attentionr   rk  rG  r   r,   rk   )r  r  r  rY  r  r  r   Zis_parameterZ	is_bufferZspecialized_propsZtensor_typesizesunpackedr  valZproxy_ir   Z	options_ir   r   r   r   r  	  sF  




	






r  c                   C   s@   t jdkrtjS t jdkrtjS t jdkrtjS tdt j )NZdynamicZunbackedZ	obliviousz+invalid automatic_dynamic_shapes_mark_as = )r%   Z automatic_dynamic_shapes_mark_asr   r  SIZE_LIKE_UNBACKEDZOBLIVIOUS_SIZErc  r   r   r   r   rq  s
  s   



rq  _DYNAMIC_SOURCESc                   C   s,   t d urt S ttjjjddda t S )Nr  r  ,)r  rI  r   compilerr%   dynamic_sourcesreplacesplitr   r   r   r   rm  
  s   rm  c                   @   sR   e Zd ZU eeef ed< eed< ee	 ed< de
fddZdedefdd	Zd
S )r  faker   symbolic_contextr   c                 C   s   t | j| j fS r   )hashr  r   r   r   r   r   r   __hash__
  r   zTrackedFake.__hash__r   c                 C   s.   t |tr| j|ju o| j |j kS dS )NF)r   r  r  r   r   r   r   r   r   r   
  s   
 zTrackedFake.__eq__N)r   r   r   r   r   r	   r   rH   r   r   r  r  objectr   r   r   r   r   r   r  
  s   
 r  Fc           4   
      s  | j rt| tjjjjstd | }t	 }|j
jj| d }|r%|jnd }d }	|  r:t|d}
t| j||
|}	t| r~|s~t| |||dd}i }t| | \}}|D ]}t| |}t||}t||||||< qVt|j|j|j|j|	|j|j|dS |r||vrttjg|    tj!g|    d g|    d g|    |	||dS ddl"m# t$fd	d
| % D rtdd | % D tj!g|    d g|    d g|    |	||dS | % }t&| s#| ' |   }d g| }fddt(|D }|j)t*d i }|D ]\}}| ||||< |+||  t, qng }t-||t./t0|t0|}t1| }i   fdd}ddl2m3} |j
j4ri|j
j4D ]}t||rXqN|j5|krg||j |j6|j qNg }g }g } g }!t(|   D ]t| dt7 v }"t| dt7 v }#t| dt7 v }$t| dt7 v }%t| dt7 v }&t8| }'|}
t|
t9r|
: }
|$st|
t;r|
j<d urt=|
j<|'di rt>?d| t@g|    }(tA|(< |t.jB|(dO }tCjDo|E})tCjDo |F}*||v rt>?d| d})d}*|)p|*}+ }|d u rd },d }-|$ritCjGsid }-tH| drcfdd| jID J }.|.jKd u rP|.jLd u rPtMdd},nSddl"mN}/ |/tO|.jK|.jLddd },n@tMdd},n:|"rrtMdd},n1|&s|+r|)rtMdd},|*rtMdd}-nd },d }-n|\},}0d }-| d! d"}1|0|j
jPjQ|1< | R|, |!R|- |#rtjS}2n0|,d us|$s|%sȈ| %  r|+rtT }2ntjU}2n|stCjVs|&rtj}2ntjW}2|-d urtjU}3ntj!}3|R|2 |R|3 qwt||| |!|	||dS )#NrK  rM  T)
outer_only)dynamic_sizesdynamic_stridesconstraint_sizesconstraint_stridesview_base_contexttensor_source#shape_env_to_source_to_symbol_cacheinner_contexts)r  r  r  r  r  r  r  r   is_nested_intc                 3   s$    | ]}t |to | V  qd S r   )r   r	   r  sr  r   r   r  
  s   " z%_automatic_dynamic.<locals>.<genexpr>c                 S   s"   g | ]}t |trtjntjqS r   )r   r	   r   r  STATICr  r   r   r   r&  
  s    z&_automatic_dynamic.<locals>.<listcomp>c                    s   g | ]	} | | fqS r   r   r  )	ex_strider   r   r&  
  r  )rd  c                    s\   |  v r&ddl m}  |  \}}||j|j@ dd}|p|}||f | < d S ||f | < d S )Nr   StrictMinMaxConstraintFvr	warn_only)%torch.fx.experimental.symbolic_shapesr  r  )dimconstraint_ranger   r  Zold_constraint_rangeZold_nameZnew_constraint_rangenew_name)dim2constraintr   r   update_dim2constraint  s   
z1_automatic_dynamic.<locals>.update_dim2constraint)_RelaxedConstraintZ_dynamo_strict_unbacked_indicesZ_dynamo_unbacked_indicesZ_dynamo_dynamic_indicesZ_dynamo_weak_dynamic_indicesZ_dynamo_static_indicesFz#automatic dynamic %s marked dynamic)sizerh  _dynamo_dynamic_rangec                    s   g | ]	}|j  kr|qS r   )r  )r  Zdr)r  r   r   r&  i  s    )r  r  )lowerupperr  z.size()[])XrO  r   r   rP  rQ  rR  rS  r,   r   rm  r  tracing_contexttensor_to_contextr  r  rW  r8   _automatic_dynamicrM  r!   r"  rX  r  r   r  r  r  r  r  r   r   r  r  ZINFER_STRIDEr  r  anyr  r   strider>  sortr   
setdefaultr4   r5   r3   Zmake_tensorr5  r  Ztorch.export.dynamic_shapesr  Zexport_constraintst_idr  rI  r   r:   r=  rD   rr  rl  rn  r1  r2   r1   Z	make_sizer%   ro  Zis_size_dynamicZis_stride_dynamicZallow_ignore_mark_dynamicr   r  popminmaxr   r  r"   r  Zsource_name_to_debug_namerO  r  rq  r  rs  ZDUCK)4rf  r  r   static_shapesr  r   r  Zprior_policyr  r  rx  Zouter_contextr  rZ  r  r[  Zinner_tensorr\  Zex_sizer  r  pending
candidatesZi_strideZneg_irv  r  r  r  
constraintr  r  r  r  Zmarked_strict_unbackedZmarked_unbackedZmarked_dynamicZmarked_weak_dynamicZmarked_staticrw  Z	mark_sizeZautomatic_dynamic_sizeZautomatic_dynamic_strideZautomatic_dynamicZconstraint_sizeZconstraint_strideZ	dim_ranger  Zname_Zdim_nameZdynamic_sizeZdynamic_strider   )r  r  r  r  r   r  
  sx  



















r  )parent_contextr   r   c                   s  t  tjtjjtfv st tjst rd usJ t |d\}}|s/t	 |ntt
s6J j}|j| td t jt   t fdd}d urvt|trv|j }	d urvjjt|	t t|r| \}
}|
D ]}t||}t |}t
|}t||t|tjd qjjj < t|r|jr|  n|! }|" d|j# |" |$ djj%< n|" |$ djj%< |r|r& st'sjjt| jj(t)   |S  S )	N)r  zwrap_to_fake %s %s %s %sc                      s   j j dS )N)r   r  )r	  Zfrom_tensorr   rf  r   r  r  r   r   r    s
    z0wrap_to_fake_tensor_and_record.<locals>.<lambda>)r   r   r  )rj   )r  r  Zvalues_sizeZvalues_stride)r  r  )*r"  r   r   r0  r1  r   r   r!   rd   r  r8   r  r  rn  r1  r   r5  shaperi   Z	item_memor  r  rO  r  r9   rX  r  rT  r  r  r   Z	is_sparseZ_valuesvaluesr  ndimr  Zinput_source_to_sizes_stridesrN  rA   Ztracked_fakes_id_to_sourcer  )rf  r  r   r   r  r  _reasonZinner_context_nameZfake_eZsym_valrZ  r  r[  Z
fake_innerinnerr\  r  r   r  r   rT    s   

	






rT  c                   @   sH   e Zd ZdZdddZedddefdd	Zed
d Zedd Z	dS )r  a  
    Like builder, but stateless and does not require a source. Useful for simple type->VT objects, or objects
    that are being created/evaporated during inlining (ex: consider a locally made list of tensors we then iterate over
    .), such a list should not show up as an artifact from inputs, nor in reconstruction, nor in the graph. However,
    there may be reasons to represent it as a ListVariable internally.

    NOTE - Objects produced here are born UNGUARDED due to the nature of sources!

    NOTE - This class is very new! It will have some rough edges, but it was created to stem the bleeding of giant
    if/else type->VariableTracker trees that were cropping up all over dynamo.
    r   Nc                 C      t d)NzUse SourcelessBuilder.create()rt  r   r   r   r   r  %     zSourcelessBuilder.__init__r  r   c                 C   sX  t |}tj|}|r|| |S t|tr|S t|tjr"t|S t	
|r,t	|S t|rGt|d urGt|r@d| j_t||S t|rRt||S t|tjtjtjjjfrct|S t|t tjfrot|S t|tj ryt!|S t|tj"rt|j#t tjfrt$|j#|j%j&|ksJ t| |j#}z	|'| |j%j&W S  t(y   Y nqw t|tj)j*j+rt,|S t|tj-j.j/tj-j.j0frt|S t12|rt1|S t34|rt3|S |t5j6u rt7|S t|t8j9rt:|S t|tj;j<j=j>rt	t?|S t|t tj@jArtj;j<jBC|S t|tjDrtE|S tFd|jG d|jH  d S )NTz&Unexpected type in sourceless builder r4  )Ir"  r  _type_handlersr  r   rn   rv  _HAS_DEFAULT_FACTORY_CLASSr   rp   r^  rb  r  r)   r  r  r  r  rV   r  r  r  r   r  r  r  r  rq   abcABCMetar   rK  r  r   r  r  r  r  r   Zvar_getattrr)  r<  Zgraph_moduleZGraphModuler   rG  r  r  ZLeafSpecr   r  r~   r  r  r  r   rA  rB  r   r  	variableslazyZLazySymNodeFormatStringrd  r  Zflex_attention_backwardhigher_order_opsZ&FlexAttentionBackwardHighOrderVariableGenericAliasr   r,   r   r   )r  r  
value_typeZfast_handlerZ
cls_obj_vtr   r   r   rb  (  sx   









zSourcelessBuilder.createc                 C   s   t | sJ t j| dS )Nr  )rp   r^  rb  r  r   r   r   wrap_constant_literalk  s   z'SourcelessBuilder.wrap_constant_literalc                     s,  t j i } tD ]}dd | |< q fdd| t<  fdd| t<  fdd| t<  fdd| t<  fdd| tj< | t | t	j
< | t | t< | t | t< dd | tj< d	d | tj< d
d | tj< dd | tjjj< dd | tjjj< dd | tjjj< dd | tjjj< ddd}tjD ]}|| |< q| S )Nc                 S      t |S r   )rp   r  r  r   r   r   r  u      z6SourcelessBuilder.make_type_handlers.<locals>.<lambda>c                       t  fdd|D t dS )Nc                       g | ]} |qS r   r   r  rb  r  r   r   r&  w  r'  JSourcelessBuilder.make_type_handlers.<locals>.<lambda>.<locals>.<listcomp>r  )r}   rm   r  rb  r  r   r  v      c                    s(   t  fdd| D t|t dS )Nc                    s"   i | ]\}} | |qS r   r   rh  r  r   r   
<dictcomp>z  s   " zJSourcelessBuilder.make_type_handlers.<locals>.<lambda>.<locals>.<dictcomp>r  )rx   rm  r"  rm   r  r	  r
  r   r  y  s
    c                    r  )Nc                    r  r   r   r  r  r   r   r&    r'  r  r  )r   rm   r  r	  r
  r   r  ~  r  c                       t  fdd|D S )Nc                    r  r   r   r  r  r   r   r&    r'  r  )r   r  r	  r
  r   r        c                    r  )Nc                    r  r   r   r  r  r   r   r&    r'  r  )r   r  r	  r
  r   r    r  c                 S   rr  r   )r   r  r   r   r   r    rs  c                 S   r  r   )r   r  r   r   r   r    r  c                 S      t |t dS Nr  )r   rm   r  r   r   r   r        c                 S   r  r  )r   rm   r  r   r   r   r    r  c                 S   r  r  r   rm   r  r   r   r   r    r  c                 S   r  r  r  r  r   r   r   r    r  c                 S   r  r  r  r  r   r   r   r    r  r  r   c                 S   s   |S r   r   r  r   r   r   passthrough  r  z9SourcelessBuilder.make_type_handlers.<locals>.passthrough)r  r   )r  rb  rO   rI  rl  r6  r5  r   r9  r7  r  r   r    r  r  rK  r  r  r  r  r  distributionsconstraintsZ_RealZ	_Interval
Constraintro   Zall_subclasses)handlersr   r  r.  r   r	  r   make_type_handlersp  s6   


z$SourcelessBuilder.make_type_handlersr  )
r   r   r   r  r  staticmethodrn   rb  r   r  r   r   r   r   r    s    
B
r  c                   @   s0   e Zd ZdZd
ddZedddefdd	ZdS )"SourcelessUserDefinedObjectBuilderz
    SourceLessBuilder does not return a UserDefinedObjectVariable, but in some
    cases it might be ok to return UserDefinedObjects. In such case, use this
    builder.
    r   Nc                 C   r  )Nz/Use SourcelessUserDefinedObjectBuilder.create()r  r   r   r   r   r    r  z+SourcelessUserDefinedObjectBuilder.__init__r  r   c                 C   sJ   t |}t|trt|t dS t|tjjrt	|t dS t
|t dS r  )r"  r  r   r   rm   r   r   r0  r  r   r   )r  r  r  r   r   r   rb    s   
z)SourcelessUserDefinedObjectBuilder.creater  )r   r   r   r  r  r  rn   rb  r   r   r   r   r    s
    
r  )NNr   )F(:  r  r  r7  r  r(  rv  r  r  r  	itertoolsr  r  r  r  rA  r  r  rK  r   rD  collections.abcr   typingr   r   r   r   r   r   r  r   r	   Ztorch._dynamo.utilsr
   r   r   Ztorch._guardsr   Z!torch._higher_order_ops.torchbindr   Z
torch._opsr   r  r   r   r   Ztorch._subclasses.meta_utilsr   r   Ztorch._utils_internalr   Z%torch.fx.experimental._backward_stater   Ztorch.fx.experimental._dynamismr   r  r   r   r   r   r   r   r   Ztorch.fx.immutable_collectionsr   r    Ztorch.utils._python_dispatchr!   Ztorch.utils._sympy.value_rangesr"   Ztorch.utils.weakr#   r  r%   r&   r'   r(   r)   r  r*   excr+   r,   r-   r*  r.   r/   r0   Zpgor1   r2   r3   r4   r5   r  r6   r   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rG  rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   r  rk   rl   rm   rn   ro   Zconstantrp   rq   Zctx_managerrr   rs   rt   ru   rv   rw   Zdictsrx   ry   rz   r{   r|   r}   rA  r~   r   r   r   r   Z	functionsr   r   r   r   r   r   r   r   r   r   r   r   r  r   iterr   r  r   listsr   r   r   r   r   r   r   r   r   miscr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Z	nn_moduler   r   r   Z	optimizerr   Zscript_objectr   r  r   r  r   r   r   r   r   r   r   r   r   r   Ztorch_functionr   r   r   r   Zuser_definedr   r   r   r   r   r   r   r   r   r   numpyrN  ModuleNotFoundErrorZtorch._dynamo.symbolic_convertr   	getLoggerr   rn  Z_loggingZgetArtifactLoggerr0  r6  ZDimListr   r   	dataclassr   r   r  varsrm  r  r  r   rI  r  r  rt  r  rV  rU  r"  r  r  r  rq  r  rd  rm  r  r  r   rT  r  r  r  r  r   r   r   r   <module>   s   $	X!  8,` Z


<
              
[

8@
 
L  d 