U
    zh                    @   s8  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mZmZ d dlmZ zd dlZW n ek
r   dZY nX d dlZd dlmZ d dlmZmZ d dlmZ d dl m!Z! d dl"m#Z#m$Z$ d d	l%m&Z&m'Z'm(Z( d d
l)m*Z* d dl+m,Z, d dl-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3 d dl4m5Z5m6Z6 d dl7m8Z8 d dl9m:Z: ddl;m<Z<m=Z=m>Z>m?Z? ddl@mAZA ddlBmCZCmDZD ddlEmFZFmGZGmHZH ddlImJZJ ddlKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z] ddl?m^Z^m_Z_m`Z`maZa ddlbmcZcmdZdmeZemfZfmgZgmhZhmiZimjZjmkZkmlZlmmZmmnZnmoZompZpmqZqmrZrmsZsmtZtmuZumvZv ddlwmxZxmyZymzZzm{Z{ ddl|m}Z}m~Z~ ddlmZmZmZmZmZmZ ddlmZmZmZmZmZmZ ddlmZmZmZmZmZ ddlmZmZmZmZ dd lmZ dd!lmZ dd"lmZ dd#lmZmZmZmZmZmZmZmZmZ dd$lmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ dd%lmZmZ dd&lmZ dd'lmZ dd(lmZ dd)lmZmZmZmZmZ dd*lmZmZ dd+lmZmZ dd,lmZmZmZmZ ee֡ZeZG d-d. d.ZejG d/d0 d0ZG d1d2 d2eۃZejG d3d4 d4ZG d5d6 d6Zd7d8 ZdIezd9d:d;ZdJd<d=ZejG d>d? d?ZdKe3d9dAdBZddCee\ edDdEdFZG dGdH dHZe e_dS )L    N)AnyList
NamedTupleOptionalUnion)ValueRanges)SymInt)GuardSourceTracingContext)call_torchbind)HigherOrderOperator)
_EventBase_StreamBase)
FakeTensoris_fakemaybe_get_fake_mode)is_sparse_any)BackwardState)_constrain_range_for_size
DimDynamicRelaxedUnspecConstraintStatefulSymbolicContextSubclassSymbolicContextSymbolicContext)immutable_dictimmutable_list)is_traceable_wrapper_subclass)TensorWeakRef   )configmutation_guardreplay_recordtrace_rules) get_registered_device_interfaces)InternalTorchDynamoErrorunimplemented)GuardBuilderinstall_guardmake_dupe_guard)SideEffects)
AttrSourceCallMethodItemSourceConstantSourceConstDictKeySourceConvertIntSourceFloatTensorSourceGetItemSource
GradSourceis_cell_contentsis_constant_sourceis_from_defaultsis_from_optimizer_sourceLocalSourceNumpyTensorSourceOptimizerSourceRandomValueSourceSourceTupleIteratorGetItemSource)is_callable_allowedis_numpyis_numpy_dtypeis_numpy_type_info)build_checkpoint_variableclone_inputcommon_constant_typesget_fake_valueget_locals_to_stealget_static_address_typeis_function_or_wrapperis_namedtuple	is_typingis_utils_checkpointistypeodict_valuesproxy_args_kwargs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   )MutableLocaltypestrVariableTrackerVariableTrackerMeta)ConstantVariableEnumVariable)AutocastModeVariableEventVariableNullContextVariablePreserveVersionContextVariableStreamContextVariableStreamVariable)ConstDictVariableDataClassVariableDefaultDictVariableHFPretrainedConfigVariablePythonSysModulesVariableSetVariable)DeviceMeshVariablePlacementClassVariablePlacementVariableProcessGroupVariableWorldMetaClassVariable)!CollectiveFunctionRewriteVariableFunctoolsPartialVariableTritonKernelVariableUserMethodVariable) TorchHigherOrderOperatorVariable)ItertoolsVariable)LazyVariableTracker)	BaseListVariableListVariableNamedTupleVariableRangeVariableRestrictedListSubclassVariableSizeVariableSliceVariableTupleIteratorVariableTupleVariable)AutogradFunctionContextVariableAutogradFunctionVariableComptimeVariableDebuggingVariableDelayGraphBreakVariableGetAttrVariableGetSetDescriptorVariableInspectSignatureVariableLambdaVariableLoggingLoggerVariableMethodWrapperVariableNumpyDTypeVariableNumpyTypeInfoVariableNumpyVariablePythonModuleVariableRegexPatternVariableSavedTensorBoxTorchVersionVariableTypingVariable)FSDPManagedNNModuleVariableUnspecializedNNModuleVariable)OptimizerVariable)TorchScriptObjectVariableSDPAParamsVariable)NumpyNdarrayVariableSymNodeVariableTensorSubclassVariableTensorVariableUnspecializedPythonVariable)TorchCtxManagerClassVariableTorchInGraphFunctionVariable)build_torch_function_fnTensorWithTFOverrideVariable)KeyedJaggedTensorVariableSourcelessGraphModuleVariableUserDefinedClassVariableUserDefinedObjectVariablec                   @   s   e Zd ZdS )_missingN__name__
__module____qualname__ r   r   Q/var/www/html/venv/lib/python3.8/site-packages/torch/_dynamo/variables/builder.pyr      s   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 k	s t|S | jS d S N)
isinstancer   r   AssertionError)selfrr   r   r   example   s
    zGraphArg.examplec                 C   s,   t | jtjr(t| j| _t| js(td S r   )r   r   torchTensorr   r   r   r   r   r   r   r   __post_init__   s    zGraphArg.__post_init__c                 C   s   | j | d S r   )r   reconstructr   Zcodegenr   r   r   r      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__  s    zGraphArg.__eq__)r   r   r   r:   __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 fddZdd Z  ZS )BackwardStateGraphArgc                    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     s    zBackwardStateGraphArg.__init__c                 C   sD   |j jjst|tjd |dd |  |	|j jj d S )Nr   r   T)
txoutputZbackward_state_varr   Zload_import_fromr   r   call_functionZdup_topstorer   r   r   r   r     s
    z!BackwardStateGraphArg.reconstruct)r   r   r   r   r   __classcell__r   r   r   r   r     s   	r   c                   @   s*   e Zd ZU ee ed< eee  ed< dS )FrameStateSizeEntryscalarsizeN)r   r   r   r   intr   r   r   r   r   r   r     s   
r   c                       sN  e Zd ZdZed fddZdd Zdd Zee	
d	d
d Zdd Zdd Zdd Zee	
d	dd ZejdddZee	
d	dd Zdd ZedddZeeeeef dddZeddd Zee e!f dd!d"Z"e#j$j%dd#d$Z&d%d& Z'e#j(dd'd(Z)e#j(dd)d*Z*d+d, Z+d-d. Z,d/d0 Z-d1d2 Z.  Z/S )3VariableBuilderz3Wrap a python value in a VariableTracker() instancer   c                    sH   |d k	st dt d k	s$t dt   || _|| _| | _d S )NzRConsider SourcelessBuilder for ephemeral objects, usually objects created locally.zExpected active TracingContext)r   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kr<| j jj| }t| j|j}|r8| | |S | j jj|| j}|rX|S | |}| j|_| 	|r| j jj
||}| j jj|| j| |S r   )r   r   side_effectsr(   r   install_guardsZvariable_tracker_cachelookup_wrap_can_lift_attrs_to_inputs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fkrdS dS )NTF)typer   r   r   r   )r   r   r   r   r   r   B  s    z)VariableBuilder._can_lift_attrs_to_inputsNc                   C   s   ddhS )Nr   rT   r   r   r   r   r   _common_constantsL  s    z!VariableBuilder._common_constantsc                 C   s   | j S r   r   r   r   r   r   
get_sourceZ  s    zVariableBuilder.get_sourcec                    sD   |    t ts   tjkr$d S t fdd|D ddi i S )Nc                    s   g | ]}  |qS r   )
make_guard).0guardr   r   r   
<listcomp>d  s     z2VariableBuilder.install_guards.<locals>.<listcomp>skiprT   )r   r   r,   guard_sourcer	   ZCONSTANTr'   )r   guardsr   r   r   r   ]  s    zVariableBuilder.install_guardsc                 C   s(   t |tst| j|_| jjj||S r   )r   rW   r   r   r   r   r   Ztrack_mutable)r   r   varr   r   r   set_source_and_track_mutableg  s    z,VariableBuilder.set_source_and_track_mutablec                 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tf| jft	t| jftj| jfg}tjrtr|tj| jf i }|D ]6\}}t |t	r|n|fD ]}||kst!|||< qq|S r   )"r   r   nn	Parameterr   r   functional_tensorFunctionalTensorwrap_tensortuplelistrK   collectionsdequeSizewrap_listlikerO   wrap_tuple_iteratorslicerangewrap_slice_rangerB   wrap_literalrePatternwrap_regex_patternr   Ztrace_numpynpappendndarraywrap_numpy_ndarrayr   r   )clsentriesresulttsfntr   r   r   _type_dispatchl  s.    


zVariableBuilder._type_dispatchr   c                 C   s   |  tj t|S r   )r   r&   ID_MATCHr   r   r   r   r   r   r     s    z"VariableBuilder.wrap_regex_patternc                 C   s   ddl m } tjdd f|dd ftjdd ftjdd fg}i }|D ]>\}}t|tt	fr`|n|fD ]}||ksvt
||t|< qfqF|S )Nr   )comptimec                 S   s    t tjfd| ji| tjS Nr   )r   r   creater   r   r&   ZCLOSURE_MATCHr  r   r   r   <lambda>  s   
z.VariableBuilder._id_dispatch.<locals>.<lambda>c                 S   s   t  S r   )r~   r  r   r   r   r        c                 S   s   t tfd| ji| tjS r  )r   _dataclasses_fields_lambdar   r   r&   FUNCTION_MATCHr  r   r   r   r    s   
c                 S   s   t  S r   )r   r  r   r   r   r    r  )r  inspect	signaturedataclassesfieldsr   __version__r   r   r   r   id)r  r  r  r  r  r  r  r   r   r   _id_dispatch  s     
zVariableBuilder._id_dispatchc           %   	      s  ddl m} | r,ddlm} ddlm} nG dd d}G dd d} t}|d k	rl|S 	 t
}|d k	r|S td	tsttjrS trΈS tjjjkr(tj jjjj   fd
dt!" D }t#|tS t$j%krLtj& t'jdS tt(t)j*t)j+fr\s, - rtj. ntj/ t0dd 1 D   rtj2 njjjj    fddt(fddt!" D }tt)j*r<t3jd}t4|tt5j|j6jd}nt#|tjd}7|S t8tj9j:rv;S t<=r>S tt?rdd D rĈtj@ t<jAjdS t8tBjCrtj@ tDjdS tEFrtjG tEjdS t8tHjIr:tj& tJjdS tKrPtLjdS t8tMjNrLt3, d}	t5j|	jO}
g }t3, d}t!jPD ]&\}}|Qt5jtR||| qi }t3, d}jS" D ]8\}}t<=|stTd t5jtR|||||< qtU, VtjW|VtjX|Vtj/ tY|
||S tZrptj@ t[jdS t\d k	rt8t\j]r^t\_S t`rt\statbrtj&ntjW tcjdS tdrtj@ tejdS tfrVt8t\jgr<tjW t3jd}tU|Vtj@ ntj@ thjdS tijrtj& tijAjjdS ttjkjljmrtj& tnjdS t8tjkjljor~d }z
jp}W n tqk
r   Y nX g }jVtjWg}t8|trrTt3jd}|Q|Vtj/ t!|D ]&\}}|Qt5jtR||| q,tU|  jjjsttujtv|dS t8twjxrttydd tjkjljmrtyddd krtyjzd d krtj& t{tnjzt3jdd!dd S tbr:t|}d k	r:t~r$d"jj_t|}jjdS t\rXt8t\jrXS tr|tjW tS trtjW tS t8trȈtjWtj tjjdS t8tjjrtj@ t3jd#}t5j|j}tAj|S t8trntj@ jjd$tjjd%jjjd&}t|j t|jjdS t8tjjrtjW tAjjS t8trĈtj@ td jdS t8tjjrtjkrtjdS ttj	r(td'd d k	r(tjW tjdS t	r`tjW tjd}jjjst|S t8tjj	rtj@ tj_tjdS t	rtjdS t	rֈtj@ tjdS t	rtj@ tjdS t
r"tj@ tjdS t
rHtj@ tjdS tt
r~tj k
r~tj& tjdS t8tjr8j }tj}jjjjt||tjd(}jjjjtd)d*j t||d}t||d+d d+|d,|jjd-< jjjĠ|jjš jjjƠQt||d  t||d.kS t8||frftj@ tɈd d jdS t8tjjj̃rtj@ t͈jjΈjψjgjd/S tѠ҈rȈtj& tшjdS tӈrtԈ\}|d k	rt3j|_t|ՈjjdS t8twjtjfr:tj& tوjdS t8twjxrt8jztj9j:tjjjfrt5jt3jddjz} | rt8| tۃstad0tj& t܈j| jdS t8twjރrڈtj& t߈S t8twjrtj& tS tttrztjjjtj9jfkr:t|ՈjjdS tjkjkr`tj& tjS tj@ tjdS ttrЈtj/ 7tfd1d2ttD tt3jd3d4S ttrd5d6lm}!m}" td7sS tt5j|"j   tt5j|!j  tjjjjj}#jjjjtd)d*j tjd}$tjd+d d+|#|$jjd-< tjA|$|#jdS S d S )8Nr   )
has_triton)	Autotuner)JITFunctionc                   @   s   e Zd ZdS )z*VariableBuilder._wrap.<locals>.JITFunctionNr   r   r   r   r   r    s   r  c                   @   s   e Zd ZdS )z(VariableBuilder._wrap.<locals>.AutotunerNr   r   r   r   r   r    s   r  Z_torchdynamo_inlinec              
      s<   i | ]4\}\}}t |t|t  t  |d qS r   )rY   r  r   r0   r   r-   r   ikvr   r   r   
<dictcomp>  s   
  z)VariableBuilder._wrap.<locals>.<dictcomp>r   c                 s   s   | ]}t |V  qd S r   rY   
is_literalr   r   r   r   r   	<genexpr>  s     z(VariableBuilder._wrap.<locals>.<genexpr>c                    sP    rt |}|}nt | }t||}t |}t||}||fS r   )rY   r  r-   r   rr   r0   )r  r   r!  keyZ
source_keyZsource_valuer   )	all_constr   r   r   build_key_value  s    
z.VariableBuilder._wrap.<locals>.build_key_valuec                 3   s"   | ]\}\}} |||V  qd S r   r   r  )r)  r   r   r&  %  s   
 default_factory)r*  r   c                 s   s   | ]}t |V  qd S r   r#  r   xr   r   r   r&  ;  s    r   r   funcargskeywordsz*functools.partial with non-literal keyworddtypesaved_tensors)r   r2  __self__r    apply)memberTstreamr   r   )	stream_iddevice_indexdevice_typeenter_result)dynamic_dim[^a-zA-Z0-9]+_F)r   r   graphargrT   )Ztarget_valuesr   z"Failed to produce a valid self objc                    s&   g | ]}t j| t j|d qS )r-  )rr   r  r0   r   r   r  r  r   r   r     s
    
z)VariableBuilder._wrap.<locals>.<listcomp>r   )user_clsZuser_cls_sourcer   )FlattenScriptObjectSourceScriptObjectQualifiedNameSource__obj_flatten__)Ztorch.utils._tritonr  Ztriton.runtime.autotunerr  Ztriton.runtime.jitr  r  getr   r  r  r  getattr_staticr   rJ   r   traceable_tensor_subclassesr   rG   r   r   utils_pytreeZSUPPORTED_NODESr   r&   ZDICT_VERSIONr   r   Zguard_on_key_orderr   r   r   	enumerateitemsra   sysmodulesr  re   dictr   defaultdictOrderedDictr   is_nn_moduleZ
BOOL_FALSESEQUENCE_LENGTHallkeysZDICT_CONST_KEYSr*   rc   r   r*  r   r   r   Modulewrap_modulerY   r$  r   	frozensetr
  r  enumEnumrZ   r   Zis_reorderable_logging_functionZBUILTIN_MATCHloggingLoggerr   rI   r@   	functoolspartialr.  r/  r   r0   r0  r%   r'   r   
TYPE_MATCHZ	DICT_KEYSrm   rH   r   r   Zgenericr  Zasarrayr=   r   callabler   r>   r   r?   Ziinfor   rl   Zcan_rewriteZautogradfunctionZFunctionMetar}   ZFunctionCtxr2  RuntimeErrorr   r   r   r|   r   types
MethodTypegetattrr3  r   r"   lookup_callabler<   !has_user_defined_allowed_in_graphZcreate_with_sourcenumberwrap_unspecialized_primitiverb   Zis_matching_objectwraprd   r   Z
NAME_MATCHrp   makecudaZStreamContextr7  r_   r   create_proxyZStreamr8  r9  r:  rM   noder`   device_CZ_SDPAParamsr   r   r\   Z_TensorMetar   
contextlibnullcontextr]   r   ZoptimZ	Optimizerr8   r   rk   Zis_group_member_typerj   Zis_process_grouprg   is_device_meshrh   Zis_placement_typeri   is_placement	itertools__dict__valuesrq   SymBoolZrequire_hintr.   	shape_env$create_unspecified_symint_and_symbolr   r   DYNAMICroot_tracercreate_graph_inputr   subr   metabound_symbolsexprtracked_fakesTrackedFaker   rn   ampZautocast_modeZautocastr[   Z
fast_dtypeZ_enabledZ_cache_enabledr   Zis_matching_clsrF   rR   r   
ModuleTyper!   ZDummyModuler   TreeSpecrW   ro   __func__GetSetDescriptorTyper   MethodWrapperTyper   
issubclasshooksZBackwardHookr   Z _unsafe_preserve_version_counterr^   constructorr   rw   r   lenr   rB  rC  hasattrwrap_user_definedrr   realize_all_typeZqualified_namerD  Z_libraryZfake_class_registryZto_fake_obj	fake_mode)%r   r   r  r  r  Ztype_dispatchZid_dispatchr  Zfactory_sourceZfunc_srcZfunc_objr/  Zargs_sourcer  argr0  Zkeywords_sourcer   r!  Z	dt_sourceZactual_saved_tensorsr2  r   Zsaved_tensors_sourceZstream_sourceZ
stream_varZstream_proxyZ
value_hintZ
new_sourceZ
new_symintZsym_node_proxy	attr_nameZself_objrB  rC  Zfake_script_objproxyr   )r(  r)  r   r   r   r     sd   


 



	

	


 









 
	

 	 


 









	


   
 
 




 
	     zVariableBuilder._wrapc                 C   s>   |  tj t|| jd}tt|s,|S | jj	j
||S )Nr   )r   r&   r^  r   r   r)   "cls_supports_mutation_side_effectsr   r   r   r   r   )r   r   r  r   r   r   r    s
    z!VariableBuilder.wrap_user_definedc                    s  t jr,t|tjkr, tj tj	|dS  tj
 |D ]}||kr<td q< fddt|D } jjjd}t jtr~ jjt|kr~ j}t|tst jjjjtdd jt||d}d	|jjd
< tt  j||d |d}g }t|j!D ]N\}	}
t"||	dd}|
 jjj#|< t$j%tj&t'||	 d}|(|)| qt*|ddi t+||dd dd}||jjd< t,-||t. d}t/|tr 0||S |S )Nr	  z-list elements are pointing to the list itselfc                    s(   g | ] \}}t j|t  |d qS r  )rr   r  r0   r   )r   r  itemr   r   r   r     s   z1VariableBuilder.wrap_listlike.<locals>.<listcomp>r   r=  r>  r   TZ	steal_arg)
target_clsr   r  example_valuesubclass_typer   FbaseindexZindex_is_slicer   rT   )r   r   r   r?  mutable_local)1r   specialize_intr   r   r   r   r&   CONSTANT_MATCHrY   r  rR  r%   rJ  r   r   Zlocal_scoperE  r   r   r6   Z
local_namerD   r   r   r{  r|  r   r}  r   rm  r~  wrap_fx_proxy_clsr   rK  r0   input_source_to_varr\  r]  TENSOR_MATCHr   r   r   r'   r   rs   Zcls_for_instancerU   rJ   r   )r   r   r  r   Zmaybe_gmr   Ztensor_list_proxyZlist_variabler   r  tensor_variableZsource_ir   r?  r  r   r   r   r     st    

 
  	 
 zVariableBuilder.wrap_listlikec                    sF     tj  fddttD }t|t  jd} |S )Nc                    s,   g | ]$}t  jt  |t|qS r   )r   r   r;   r   rP   r@  r  r   r   r   8  s   z7VariableBuilder.wrap_tuple_iterator.<locals>.<listcomp>)r  r   )	r   r&   ZTUPLE_ITERATOR_LENr   rQ   rz   rU   r   r   )r   r   r   r  r   r  r   r   6  s    
  z#VariableBuilder.wrap_tuple_iteratorc                    sJ    fdddD }  tj ttr8t| jdS t| jdS d S )Nc                    s,   g | ]$}t  jt  |t|qS r   )r   r   r*   r   rd  r%  r  r   r   r   E  s   z4VariableBuilder.wrap_slice_range.<locals>.<listcomp>)startstopstepr   )r   r&   r^  r   r   ry   r   rv   )r   r   rK  r   r  r   r   D  s    
z VariableBuilder.wrap_slice_rangec                 C   s|  ddl m} t|jdkr,tdt|  t||rxt|j	ddrRt
| jdS | tj t| jd| _| |jS t|tjjtjjtjjfrtjstd	 t|| jjr| tj t|| jd}t t!|s|S | jj"j#$||S t%|j&tjj'j(j)r| tj t|S t*|d
dr^t*|dds>t+d| tjtj, t-|| . dS | jj"j/|| j0| . dS d S )Nr   )OptimizedModuler   zuninitialized nn.Module: Z_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=True)1Z
eval_framer  r  ru  r%   rV   rJ   r  rF  forwardr   r   r   r&   r^  r*   rV  r  r   r   r   ZRNNZGRUZLSTMr   Z	allow_rnnr    Zis_dynamic_nn_moduler   exportr   r)   r  r   r   r   r   r  r   paralleldistributedZDistributedDataParallelrd  r   r
  r   r   register_attr_or_moduler   )r   r   r  r  r   r   r   rV  Q  sR    
 
  zVariableBuilder.wrap_modulec                 C   s   t jsrt|tkrrt jsf||  ksJ| j	 
 rJt| jsJt| jrf| tj tj|| jdS | |S n4t jst|tkr| |S | tj tj|dS d S )Nr-  r	  )r   r  r   r   r
   rE  #force_unspec_int_unbacked_size_liker   r   r   is_localr4   r2   r   r&   r  rY   r  wrap_symintspecialize_floatfloatwrap_symfloatr  r   r   r   r     s"    


zVariableBuilder.wrap_literalc                 C   s&   t |r"t|| jjkr"tddd S )Nz*Cannot wrap a Tensor that has already beenz"wrapped by this instance of Dynamo)r   r   r   r  r$   r  r   r   r    assert_not_wrapped_by_this_graph  s
    z0VariableBuilder.assert_not_wrapped_by_this_graphc                 C   s  |   }|| jjjkst|  s2t|d k	r^|  s^| 	| | jjj
|| j|dS t|r| 	| | jjj
|tdd| j|dS t|tjkrt|}n>t|tjtjjtjjjtjjjfkst|stt|d }|| jjjk}|r| jjj| S | 	| | jjjjtdd| jt||d}i }t|tjkrlt| j|| j |d< | !t"j# t$|tjr|j%rt$|tj&j'j(j)st*d t+|r|j,st*d|j- d t.f | j||||d|}t"j/}t$|t0r t1|r t"j2}| !t3j4|t$|t5r|nt6|d	 t|r| !t"j# |7 \}	}
|	D ]2}t8||}t9| j |}t:;t<| j|| qN|| jjj|< d
|j=j>kst|j?@ |j=j>d
< |jAj=j>d }tB|| jjCk	rtDdtE||d|}||j=j>d< | jjF| |S )Nr   r=  r>  Ztorch_function_fn3torch.compile does not support strided NestedTensorz2torch.compile does not support sparse Tensor with z layout)r   r  r  r  r   r	  Ztensor_dictr  z(Wrapped Tensor must be this graph's fakeFr?  )Gr   r   r   r   r   r   rQ  rE   Zis_fsdp_moduler  r  r   r3   r   r}  r   r   rG  r   r   r   r   r   r   r   r   r   r   r  r{  r|  r   r   r   r&   r^  r   	is_nestednested	_internalnested_tensorNestedTensorr%   r   	is_sparseZlayoutwrap_fx_proxyr  r1   r5   ZNOT_NONE_MATCHr\  r]  r7   r   __tensor_flatten__rd  r*   rr   r  r   rm  r~  ru  copyr  r   r  r$   r   Zadd_symbol_bindings)r   r   r   r  Zis_duplicate_tensorZtensor_proxyoptionsr  Z
guard_typeattrsr>  attrZinner_valueinner_sourcefake_tensor_valuer?  r   r   r   r     s    



  



    
	

zVariableBuilder.wrap_tensorc              
   C   sj  t d k	stt|t jstt|  }ddlm} |jj	 }|rvzd|j_	W n& t
k
rt   t|jt jsptY nX z&||}|rddlm} ||}W n. tk
r } ztt| W 5 d }~X Y nX tt| j|| | jjjjtdd| jt||d}d|i}	tf t| j||d	|	}
|
| jjj |< |
j!j"j#d
 }t$||d|d|d}||j"j#d< |
S )Nr   )_utilT)clone_preserve_stridesr=  r>  r   r   r  r   r  r  r  r   r   r   r   r?  )%r   r   r   r   r7   r   Ztorch._numpyr  flagsZ	writeable
ValueErrorr  ZnditerZ_try_convert_to_tensorZtorch._prims_commonr  NotImplementedErrorr%   strrr   r  r   r   r   r{  r|  r   r}  r   r   r  r   r  r  rm  r~  r   )r   r   r   r  readonlyZtensor_valuer  er  r  Znumpy_ndarray_variabler  r?  r   r   r   r  H  sZ    


  z"VariableBuilder.wrap_numpy_ndarrayc                 C   s  t |tkst| j| jjjkr0| jjj| j S | jjj}t	 j
r| }t| | jjj|jj | jjjt|| jd  nFt|  stjjjr| tj tj|| jdS | j }|| jjj krt!|d d}n2| jjj | }|j"|krt#$d|||j" d |_"|| jjj |< tj%r4|j"d ks<tj&sDt'j(}n| tj tj|dS |j)|| j|d}| jjj|jj | jjjt|| jd  n.t|  st| tj tj|| jdS t*|  t+rtt,|  -tj. d|  i}| jjj/j0t12dd| jt ||  d	}t3|j| t4||f|}	|	| jjj| j< t|  s| jj5rt*|  t6std
| d|   |	j7jj8d }
t9|  |dd d|d|jj8d< |	S )Nr-  )r   r   z%automatic dynamic int %s val %s != %sr	  )r   r<  r   r=  r>  r   =Dynamo attempts to add additional input during export: value=	, source=r  Fr  r?  ):r   r   r   r   r   r   unspec_variable_maprx  r
   rE  r  Zcreate_unbacked_symintr   r  r   rm  r  r  r   r  r   r3   r   r   _dynamor   r  r   r&   r  rY   r  frame_stater   r   logdebugautomatic_dynamic_shapesassume_static_by_defaultr   rz  ry  r   r9   r'   r   r^  r{  r|  r   r}  rM   r   r  r6   r  r~  r   )r   r   rx  wrapped_valuer   frame_state_entryr<  r  r  
unspec_varr  r   r   r   r    s    






	zVariableBuilder.wrap_symintc           	      C   s  | j | jjjkr | jjj| j  S tjjjs@t| 	 s@t
|r\| tj tj|| jdS tj|tjd}t| 	 tr~tt| 	 tj t| 	 |d}| jjjjtdd| j t|| 	 d}t t!f| j||d|}t|t!st|| jjj| j < | jj"r8t| 	 t#s8td| d	| 	  d }|j$j%j&d
 }t'|sXt|}|j(| jj(ks~td|j( dt)| 	 |d|d|d|j%j&d< t*| j| jjj+dt,|gi  }| jjj-.t/|j0| jd  |S )Nr-  )r1  )r   	raw_valuer=  r>  r   r   r  r  r  r  r  fake mode (^) from fake tensor metadata doesn't match mode({self.tx.fake_mode}) from InstructionTranslatorTFr  r?  call_methodr  )r  r  )1r   r   r   r  r   r  r   r  r3   r   mathisnanr   r&   r  rY   r  r   tensorZfloat64r   r9   r   r'   r   r^  r/   r{  r|  r   r}  r   r  r   r  r6   r  rm  r~  r   r  r   r  rl  rL   r  r   r  Zsym_num)	r   r   r  r  r  r  r  r  r   r   r   r   r    sx    


  
zVariableBuilder.wrap_symfloatc                 C   st  | j | jjjkr | jjj| j  S t|}t|  tsLt	|  
tj d|  i}|d|i | jjjjtdd| j t||  d}ttf| j||d|}|| jjj| j < t|  sp| jjrt|  tstd| d|   d }t|tr|j}n|jjjd	 }t|s*t|}|j| jjksPtd
|j dt |  |d|d|d|jjd< |S )Nr   r  r=  r>  r   r  r  r  r  r  r  TFr  r?  )!r   r   r   r  r   r  r   r   r9   r'   r   r&   r^  updater{  r|  r   r}  r   r  r   r3   r  r6   r   rY   r   r  rm  r~  r   r  r   )r   r   r  r  r  r  r  r  r   r   r   rh  ]  sZ    

z,VariableBuilder.wrap_unspecialized_primitive)0r   r   r   __doc__r:   r   r   r   staticmethodr\  	lru_cacher   r   r   r   classmethodr  r   r   r   r  r   r   r  r   r   r   rK   r   r   rO   r   r   r   r   r   r   rU  rV  r   r   r  r   r  r  r  rh  r   r   r   r   r   r     sH   

!     2JH >nir   c                 C   s~   t | tr| j}n t | tr$| j}ntd|   g }t|D ]4}d }| jrbt	t
| jd|j}|t||d q@t|S )Nz)Dataclass fields handling fails for type __dataclass_fields__r   )r   r   r   rb   rA  r%   r  r  r   r0   r*   r   r   r{   )objr   rK  fieldr   r   r   r   r    s    


 r  returnc                 K   sP   | |||d|}|d kr,t f dti|S t f dti|}||  |S d S )N)r   r  r  r  r  )r  r   r   Zinstall_global)r   r  r  r  r  kwargsr  r   r   r   r    s    
r  c                    s  ddl m} t |std|kr@|d d k	r@ jj|d  d|jjks^t|jjd  |} fdd}|d krt	|j dd}nt
| jkrnt|tjr jrtj  |||jj|j< W 5 Q R X d	| ttfki}	d
|kr|d
 d k	st|d
 |	d
< t|fd i|	}t|tjrHt
| jk	rHtd| t|tjrt|tjj}
||}t|j| | |}t|tjjjr|j jkr|r|ntj}|
rtjjn||d< || | |f|S t|jjdr|jjj dkrt|jjj!tjj"s&|jjtj#j$kr2t%|jjS |jjtjj&ksV|jjtj'j(kr^t)|S t*|tj+rt,dd |D rdd |D }t-|f|S t|t.t/frt|j| g }t0|D ]\}}|d kr|1t2j3d)| nj|jj4dt5j6||fi d}d
|kr0|d
 }|7 }t8||dd|d
< n|}|1t9f |  ||d| qt|tj+rrt-||f|S t*|t.rt:|f|S t*|t/t;frt<|fdt= i|S |j>j?dkst|dstd|j>j? dt@| tA||j>f|S n|d ks|jjtjBkr t2j3d*|S t|tjCtjDtjEfrRt|j| tF||f|S tGH|jjrrtI|jjtJs|jjdd tK D krt|j| tL|||jMf|S tGH|jjrtI|jjtNs|jjdd tK D krt|j| tO||f|S |jjd kr2|jjPd!kr2t|j| t2|f|S |d k	r~t|tNr~|jjd"kr~|jjPd!kr~t|j| tO||f|S t|tQr|jjtjRtSt5j6tjTjUtjVt5jWtjXjYjZtStj[d#t\tStj[d$t\tj]f
krt|j| t2j3|f|S t|tj^j'j_r$d%d&l`ma} t|j| ||f|S t|tbrh|jjtj^j'jctj^j'jdfkrht|j| t2j3|f|S t|tQtetbfr|jjtfkrt|j| t2j3|f|S tgd'th| d(|jjP d(|jj   d S )+Nr   )InstructionTranslatorBaser   r  c                    s@   t | tjr<t | ts<t| r.t|  jks<| js<t| } | S r   )	r   r   r   r   Z_is_functional_tensorr   r  r  rA   r	  r   r   r   _clone_input  s    
z'wrap_fx_proxy_cls.<locals>._clone_inputT)Zallow_non_graph_faker   r   r   zU`example_value` needs to be a `FakeTensor`wrapped by this instance of Dynamo. Found: Z
class_typer   Z	set_statec                 s   s   | ]}t |tV  qd S r   )r   r   r+  r   r   r   r&  F  s    z$wrap_fx_proxy_cls.<locals>.<genexpr>c                 S   s   g | ]}t |qS r   )rY   r  r+  r   r   r   r   I  s     z%wrap_fx_proxy_cls.<locals>.<listcomp>r   )kindtargetr/  r  Fr  r  r  ztorch.return_types_fieldsz	expected z. == torch.return_types or named tuple but got c                 S   s   g | ]\}}|j qS r   )Zcurrent_streamr   r>  device_interfacer   r   r   r     s   c                 S   s   g | ]\}}|j qS r   )Eventr  r   r   r   r     s   queryr  Zrecord_eventZget_rankZget_world_sizerT   r   ztorch.* op returned non-Tensor  )N)N)iZsymbolic_convertr  r   r   r   r   r  rm  r~  rC   r   r  r   r   r  ro  ZDisableTorchFunctionSubclassZtracerZreal_value_cacher   r   wrap_to_fake_tensor_and_recordr$   r   r   rM   Z
specializer   r   r   r  r  r   r3  	GeneratorrandomZset_rng_stater   Z_DisableFuncTorchrk  Z_is_in_bad_forkr   rJ   r   rS  rx   r   r   rJ  r   rY   r  rl  operatorgetitemr  r0   r  r{   r   rt   rU   r   r   r   ru   Zmanual_seedr   ZSymFloatrw  r   r  isclassr  r   r#   r`   rn  r   r\   opr   Zsym_intrd  Z_utilsZ_element_sizeseedmodZ
_functorchZvmapZ_validate_and_get_batch_sizer  r   Z_constrain_as_sizebackendsZ
SDPAParamssdpar   r   Zcan_use_flash_attentionZcan_use_efficient_attentionr  r   r%   rV   )r  r   r  r  r  r  r  Zinitial_example_valuer  r  Zis_parameterZspecialized_propsZtensor_typesizesunpackedr  valZproxy_ir   Z	options_ir   r   r  r   r    sf    







  	 


r  c                   @   sP   e Zd ZU eeef ed< eed< ee	 ed< e
dddZeed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__  s    zTrackedFake.__hash__)r   r  c                 C   s.   t |tr*| j|jk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   r:   r   r   r   r
  objectr   r   r   r   r   r   r    s
   
r  Fc           #   	      s  | j r t| tjjjjs td | }|j	j
j| d }|rD|jnd }d }|  rnt|d}	t| j||	|}t| r|st| |||dd}
t| | \}}i }|D ].}t| |}t||}t||||}|||< qt|
j|
j||
j|
j|dS |r ttjg|   d g|   |||dS ddlm t fd	d
| ! D rrtdd | ! D d g|   |||dS d }||j	j"krt#d d }t$| ! |_!n|j	j"| }|j!d k	r8| j%t&|j!krt'(d|| j%|j! d |_!nTt)|j!D ]H\}|d k	r| !  |krt'(d|| !| d |j!< qt*| }i   fdd}|j	j+r|j	j+D ]R}|j,|kr||j|j-|j. |j/d k	rb|j/j,|krb||j/j|j-|j. qbg }g }t0|  D ]Љt| dt1 k}t| dt1 k}t| dt1 k}t2j3o&|j!d kp&|j! d k}|j!rL|rLt'(d| d |j!<  }|d kr|rt2j4st5| dr܇fdd| j6D 7 }|j8d kr|j9d krt:dd}n$ddlm;} |t<|j8|j9ddd}n
t:dd}n|s |r t:dd}nd }n0|\}} | d k	r6| d d}!| |j	j=j>|!< |?| |d k	sf|sf|sf| j@ rntjA}"n"|st2jBs|rtj}"ntjC}"|?|" q||j	j"|< t|||||dS )Nr  _baseT)
outer_only)dynamic_sizesconstraint_sizesview_base_contexttensor_source#shape_env_to_source_to_symbol_cacheinner_contexts)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   rz  STATICr  r   r   r   r     s   z&_automatic_dynamic.<locals>.<listcomp>z!automatic dynamic %s dim %s != %sz&automatic dynamic %s size(%s) %s != %sc                    sZ   |  krJddl m}  |  \}}||j|j@ dd}|p:|}||f | < n||f | < d S )Nr   StrictMinMaxConstraintFvr	warn_only)%torch.fx.experimental.symbolic_shapesr  r  )dimconstraint_range
debug_namer  Zold_constraint_rangeZold_debug_nameZnew_constraint_rangeZnew_debug_name)dim2constraintr   r   update_dim2constraintJ  s    
z1_automatic_dynamic.<locals>.update_dim2constraintZ_dynamo_dynamic_indicesZ_dynamo_weak_dynamic_indicesZ_dynamo_static_indicesz#automatic dynamic %s marked dynamic_dynamo_dynamic_rangec                    s   g | ]}|j  kr|qS r   )r  )r   Zdr)r  r   r   r     s    
 F)r  r  )lowerupperr  z.size()[])Dr  r   r   r  r  r  r  r%   r   r   tracing_contexttensor_to_contextrE  r  Z_is_viewr*   _automatic_dynamicr  r   r   r  rd  r   r  r  r  r   r   r  r  r  r  anyr   r  r   r   ndimr  r  r  rJ  r  Zexport_constraintst_idr   r!  Zsharedr   setr   r  Zallow_ignore_mark_dynamicr  r$  popminmaxr   r  r   rx  Zsource_name_to_debug_namer   shaperz  r  ZDUCK)#r  r   r   static_shapesr  r   Zprior_policyr  r  Zbase_sourceZouter_contextr  r>  r  r  Zinner_tensorr  Zinner_contextr  r  r-  r#  
constraintZdynamic_dimsZconstraint_dimsZmarked_dynamicZmarked_weak_dynamicZmarked_staticZautomatic_dynamicZ	dim_rangeZconstraint_dimr  r!  Zdim_nameZdynamicr   )r"  r  r  r   r*    s:    

    

   
	


  






	r*  )parent_context)r   r   c                   s  t  tjtjjtfks.t tjs.t rd k	s:tt	 |
 d\}}|sdt |nttsrtj}|j| td t jt   t fdd}d k	rt|tr|j }	d k	rjjt|	t t|rL| \}
}|
D ]>}t||}t |}t|}t||t|tjd qjjj < t |r|j!rt|" n|# }|$ d|j% |$ |& djj'< n|$ |& djj'< |r|rֈ( st)sjjt| jj*t+   |S  S d S )	N)r   zwrap_to_fake %s %s %s %sc                      s   j j dS )N)r   r  )r  Zfrom_tensorr   r  r   r  r   r   r   r    s   z0wrap_to_fake_tensor_and_record.<locals>.<lambda>)r   r   r5  )rT   )r   strideZvalues_sizeZvalues_stride)r   r7  ),r   r   r   r   r   r   r   r   r   rN   r   r*  r*   r6  r  r  r  r   r   r2  rS   Z	item_memor   r  r   r  r+   r  rd  r  r(  r)  r   r  Z_valuesrv  r   r,  r7  Zinput_source_to_sizes_stridesrQ  r3   Ztracked_fakes_id_to_sourcer  )r  r   r   r   r5  r3  reasonZinner_context_nameZfake_eZsym_valr  r>  r  Z
fake_innerinnerr  rv  r   r6  r   r    s    
  
	









r  c                   @   sB   e Zd ZdZdd ZeedddZedd Zed	d
 Z	dS )SourcelessBuildera  
    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.
    c                 C   s   t dd S )NzUse SourcelessBuilder.create())r   r   r   r   r   r   0	  s    zSourcelessBuilder.__init__r  c                 C   sz  t |}tj|}|r"|| |S t|tr0|S t|tjrDt|S t	
|rXt	|S t|rt|d k	rt|r~d| j_t||S t|rt||S t|tjrt|S t|t tjfrt|S t|tjrt|S t|tjjj  rt!|S t|tj"j#j$tj"j#j%fr t|S t&'|r4t&|S t()|rHt(|S t|t*j+r^t,|S t-d|j. d|j/  d S )NTz&Unexpected type in sourceless builder .)0r   r:  _type_handlersrE  r   rW   r  _HAS_DEFAULT_FACTORY_CLASSr   rY   r$  r  r_  r"   re  r<   r   rf  rF   r   rX  rY  rZ   abcABCMetar   rb  r  r   r   ZfxZgraph_moduleZGraphModuler   rH  rI  r  ZLeafSpecri   rs  rg   rr  r   r   r   r%   r   r   )r   r   Z
value_typeZfast_handlerr   r   r   r  3	  sL    



 zSourcelessBuilder.createc                 C   s   t | stt j| dS )Nr	  )rY   r$  r   r  r	  r   r   r   wrap_constant_literal]	  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 ]}|| |< q| S )Nc                 S   s   t |S r   )rY   r   r   r   r   r   r  g	  r  z6SourcelessBuilder.make_type_handlers.<locals>.<lambda>c                    s   t  fdd|D t dS )Nc                    s   g | ]} |qS r   r   r+  r  r   r   r   r   i	  s     JSourcelessBuilder.make_type_handlers.<locals>.<lambda>.<locals>.<listcomp>r  )rf   rU   rA  r  r  r   r  h	  s    c                    s(   t  fdd| D t|t dS )Nc                    s"   i | ]\}} | |qS r   r   )r   r   r!  rB  r   r   r"  l	  s      zJSourcelessBuilder.make_type_handlers.<locals>.<lambda>.<locals>.<dictcomp>r  )ra   rK  r   rU   rA  rD  r  r   r  k	  s   c                    s   t  fdd|D t dS )Nc                    s   g | ]} |qS r   r   r+  rB  r   r   r   q	  s     rC  r  )rt   rU   rA  rD  r  r   r  p	  s    c                    s   t  fdd|D S )Nc                    s   g | ]} |qS r   r   r+  rB  r   r   r   t	  s     rC  )r{   rA  rD  r  r   r  s	  s   c                    s   t  fdd|D S )Nc                    s   g | ]} |qS r   r   r+  rB  r   r   r   w	  s     rC  )rx   rA  rD  r  r   r  v	  s   c                 S   s   t |S r   )r   rA  r   r   r   r  |	  r  c                 S   s   |S r   r   rA  r   r   r   passthrough~	  s    z9SourcelessBuilder.make_type_handlers.<locals>.passthrough)r:  r  rB   r.  rN  r   r   r   r   r   rP  r   r   rb  r  rX   Zall_subclasses)handlersr  rE  r  r   rD  r   make_type_handlersb	  s"    

z$SourcelessBuilder.make_type_handlersN)
r   r   r   r  r   r  rW   r  r@  rG  r   r   r   r   r:  #	  s   )
r:  )NN)NN)F)r>  r   rp  r  rX  r\  r  rt  rZ  r  r  r   rL  rb  typingr   r   r   r   r   Ztorch.utils._sympy.value_rangesr   numpyr   ModuleNotFoundErrorr   r   Ztorch._guardsr	   r
   Z!torch._higher_order_ops.torchbindr   Z
torch._opsr   Ztorch._streambaser   r   Ztorch._subclasses.fake_tensorr   r   r   Ztorch._subclasses.meta_utilsr   Z%torch.fx.experimental._backward_stater   r  r   r   r   r   r   r   Ztorch.fx.immutable_collectionsr   r   Ztorch.utils._python_dispatchr   Ztorch.utils.weakr   r4  r   r    r!   r"   r  r#   excr$   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?   rH  r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   r  rU   rV   rW   rX   ZconstantrY   rZ   Zctx_managerr[   r\   r]   r^   r_   r`   Zdictsra   rb   rc   rd   re   rf   r  rg   rh   ri   rj   rk   Z	functionsrl   rm   rn   ro   Zhigher_order_opsrp   iterrq   Zlazyrr   listsrs   rt   ru   rv   rw   rx   ry   rz   r{   miscr|   r}   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Z	nn_moduler   r   Z	optimizerr   Zscript_objectr   r  r   r  r   r   r   r   r   r   r   Ztorch_functionr   r   Zuser_definedr   r   r   r   	getLoggerr   r  ZDimListr   	dataclassr   r   r   r   r  r  r  r  r*  r   r  r:  rG  r<  r   r   r   r   <module>   s   
 PX  ,T
<              ?   
 f  h bc