o
    Zhj                 
   @  s
  d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlmZ d dlmZ d dlmZmZmZmZmZmZmZmZ d dlmZmZ d dlmZ d dlZd dlm  mZ  d dlm!Z!m"Z"m#Z#m$Z$ d d	l%m&Z&m'Z' d d
l(m)Z) d dl*m+Z+ d dl,m-Z- d dl.m/Z/m0Z0m1Z1m2Z2m3Z3 d dl4m5Z5 d dl6m7Z7 d dl8m9Z9 d dl:m;Z; d dl<m=Z= d dl>m?Z?m@Z@ d dlAmBZB d dlCmDZD d dlEmFZFmGZG d dlHmIZImJZJmKZKmLZLmMZMmNZN d dlOmPZP d dlQmRZR ddlSmTZTmUZUmVZV er*d dlWmXZXmYZYmZZZm[Z[ d dl\m]Z] d dl^m_Z_ d dl`maZa d d lbmcZcmdZd eeefZgz	ejhiefd!ZjW n! ekyY Zl zd"emelv rMd dlZjnelW Y dZl[lndZl[lww G d#d$ d$Znen ZoepZqejjrZsed%ZtejujvjwZwdZxd ayG d&d' d'ZzeG d(d) d)e{Z|eG d*d+ d+e{Z}eG d,d- d-e{Z~eG d.d/ d/e{ZeG d0d1 d1e{ZG d2d3 d3e	jZe Zdd7d8Zejdd:d;Zdd@dAZddEdFZddIdJZedddNdOZedddQdRZddXdYZddZd[ZG d\d] d]ZedddadbZejddfdgZddhdiZG djdk dkZG dldm dmZG dndo doe$Zee?dpdqf ZeBeG drds dsZddtduZeBeG dvdw dwZeBedxdyG dzd{ d{ZeBedxdyG d|d} d}ZeBedxdyG d~d deZeBedxdyG dd dZG ddd ddeGZeZdddZG dd de=ZdddZdddZdddZejvjjjeejvjwjjdd ejvjwjjdd ejvjwjjdd iZeejvjwjjejvjwjjejvjwjjZd dlmZmZmZmZmZmZmZmZ ejdddZdddZdddZdS )    )annotationsN)defaultdict)	dataclass)AnyCallablecastLiteralOptionalTYPE_CHECKINGTypeVarUnion)Self	TypeGuard)ReferenceType)SymBoolSymFloatSymIntTensor)is_functorch_wrapped_tensoris_legacy_batchedtensor)FakeScriptObject)dtrace_structured)suggest_memory_format)	assert_eqassert_metadata_eqis_sparse_anyis_sparse_compressedMetaConverter)render_call)immutable_dict)normalize_function)StorageWeakRef)TorchFunctionMode)IntLikeTypepy_sym_types)dataclass_slots)no_dispatch)is_traceable_wrapper_subclassTorchDispatchMode)KeyPathkeystrPyTreetree_map	tree_map_TreeSpec)count)CapturedTraceback   )_CacheKeyState_PySymInputStub_SymIntOutputStub)	GeneratorIterableMappingSequence)TracebackType)Source)
OpOverload)ShapeEnvSymbolicContextnot_implementedz 'not_implemented' not registeredc                   @  s   e Zd ZdS )_UnassignedN)__name__
__module____qualname__ rC   rC   L/var/www/auris/lib/python3.10/site-packages/torch/_subclasses/fake_tensor.pyr?   K   s    r?   Tc                   @  s    e Zd ZdddZdddZdS )	IncrementRecursionCountreturnNonec                 C  s   t d7 a d S Nr1   RECURSION_COUNTselfrC   rC   rD   __init__b      z IncrementRecursionCount.__init__c                 C  s   t d8 a d S rI   rJ   rL   rC   rC   rD   __del__f   rO   zIncrementRecursionCount.__del__NrG   rH   )r@   rA   rB   rN   rP   rC   rC   rC   rD   rF   a   s    
rF   c                   @     e Zd ZU ded< dS )UnsupportedFakeTensorExceptionstrreasonNr@   rA   rB   __annotations__rC   rC   rC   rD   rS   k      
 rS   c                   @  rR   )DynamicOutputShapeExceptionr;   funcNrV   rC   rC   rC   rD   rY   p   rX   rY   c                   @  rR   )DataDependentOutputExceptionr;   rZ   NrV   rC   rC   rC   rD   r[   u   rX   r[   c                   @  rR   )UnsupportedOperatorExceptionr;   rZ   NrV   rC   rC   rC   rD   r\   z   rX   r\   c                   @  rR   )MetadataMismatchErrorrT   rU   NrV   rC   rC   rC   rD   r]      rX   r]   c                   @  s    e Zd ZU ded< dddZdS )	FakeTensorTLSOptional[bool]allow_non_fake_inputs_overriderG   rH   c                 C  s
   d | _ d S N)r`   rL   rC   rC   rD   rN         
zFakeTensorTLS.__init__NrQ   )r@   rA   rB   rW   rN   rC   rC   rC   rD   r^      s   
 r^   itemsrG   dict[T, Literal[True]]c                  G  s   t | dS NT)dictfromkeys)rc   rC   rC   rD   ordered_set      rh   2Generator[Optional[TorchDispatchMode], None, None]c               	   c  sR    t jt jjj} z| V  W | d urt j|  d S d S | d ur(t j|  w w ra   )torch_C_unset_dispatch_mode_TorchDispatchModeKeyFAKE_set_dispatch_mode)oldrC   rC   rD   unset_fake_temporarily   s   rr   subclassr   out list[Union[Tensor, int, SymInt]]c                  sV   | g}|r)|   t s|  q  \}}| fddt|D  |s|S )Nc                 3  s    | ]}t  |V  qd S ra   getattr).0keycurrrC   rD   	<genexpr>       z$get_plain_tensors.<locals>.<genexpr>)popr'   append__tensor_flatten__extendreversed)rs   rt   todoZ
inner_keys_rC   rz   rD   get_plain_tensors   s   
	r   xobjectTypeGuard[Tensor]c           	        s   ddl m} t trdS t r?t  \}} fdd|D }tdd |D }tdd |D }||ks=J d	|S t |rIt	 j
S t trdt rdtj }tjj |}t	|S t trxt rxtjj }t	|S d
S )Nr   FunctionalTensorTc                   s   g | ]}t  |qS rC   rv   )rx   attrr   rC   rD   
<listcomp>   s    zis_fake.<locals>.<listcomp>c                 s      | ]}t |V  qd S ra   is_fakerx   r   rC   rC   rD   r|          zis_fake.<locals>.<genexpr>c                 s  r   ra   r   r   rC   rC   rD   r|      r   z got mixed fake and real tensors!F)#torch._subclasses.functional_tensorr   
isinstance
FakeTensorr'   typer   allanyr   elemr   rk   _is_functional_tensorrl   $_functionalization_reapply_views_tls
_functorch_unwrap_functional_tensorr   get_unwrapped)	r   r   attrsr   Zflattened_tensorsZall_fakeZany_fakereapply_views	unwrappedrC   r   rD   r      s(   



r   tOptional[FakeTensorMode]c                   s   ddl m} ttrjS tr4 \}}fdd|D }|d  t fdd|D s2J  S t|r>tj	S tt
rYtrYtj }tjj|}t|S tt
rmtrmtjj}t|S d S )Nr   r   c                   s   g | ]	}t t |qS rC   )maybe_get_fake_moderw   )rx   Zt_namer   rC   rD   r      s    z'maybe_get_fake_mode.<locals>.<listcomp>c                 3  s    | ]} |u V  qd S ra   rC   r   )mrC   rD   r|      r   z&maybe_get_fake_mode.<locals>.<genexpr>)r   r   r   r   	fake_moder'   r   r   r   r   r   rk   r   rl   r   r   r   r   r   )r   r   Zinner_tensor_namesr   modesr   r   rC   )r   r   rD   r      s*   




r   rZ   r;   torch._C._SchemaInfoc                 C  s   t j| jS ra   )rk   rl   Z_SchemaInfo_schemarZ   rC   rC   rD   get_schema_info   s   r   boolc                 C  s6   ddl m} tjj}||  jdo||  jt|v S )Nr   decomposition_tableztorch._decomp)	torch._decompr   rk   _decompdecompositionsrA   
startswithr@   dir)rZ   r   r   rC   rC   rD   torch_decomp_decompositions   s   
r   tytype[T]treer+   list[T]c                   s   t |} fdd|D S )Nc                   s   g | ]	}t | r|qS rC   )r   rx   r   r   rC   rD   r          z%tree_flatten_only.<locals>.<listcomp>)pytreetree_leaves)r   r   Z	flat_valsrC   r   rD   tree_flatten_only   s   
r   c                 C  s@   t | tu o| jtjko| jp| jpt| pt| pt	|  S ra   )
r   r   layoutrk   strided	is_sparseZ	is_nestedr   r   r   r   rC   rC   rD   _is_plain_tensor   s   
r   c                   @  s   e Zd ZU ed3ddZded< ded< d	ed
< dddd4ddZd5ddZd6ddZd7ddZ	d8ddZ
		 d9d d d!d"d:d-d.Zd;d1d2Zd S )<FakeTensorConverterrG   weakref.WeakValueDictionaryc                 C  s   | j jS ra   )meta_convertertensor_memorL   rC   rC   rD   r     s   zFakeTensorConverter.tensor_memor   r   z)dict[StorageWeakRef, list[ReferenceType]]constant_storage_mappingr   exportF	copy_datar   r   rH   c                C  s   t |d| _|| _i | _d S )N)r   )r   r   r   r   )rM   r   r   rC   rC   rD   rN     s   
zFakeTensorConverter.__init__fake_tensorr   c                 C  sT   t |tr
|jd usJ t|j }|| jvrg | j|< | j| t| d S ra   )	r   r   constantr!   _typed_storager   r   weakrefref)rM   r   weak_strC   rC   rD   add_constant_storage_mapping"  s
   

z0FakeTensorConverter.add_constant_storage_mappingtensorr   c                 C  s`   t |trJ t| }|| jvrd S | j| D ]}| }|d ur)|  d |_q| j|= d S ra   )r   r   r!   r   r   Z_fix_weakrefr   )rM   r   r   Zweak_tensor_reftenrC   rC   rD   invalidate_constant_aliases0  s   
z/FakeTensorConverter.invalidate_constant_aliasesr   Optional[FakeTensor]c                 C  s(   | j jj|}|d u rd S | j|S ra   )r   	describerZlookup_tensorgetr   )rM   r   tidrC   rC   rD   	_get_memo?  s   zFakeTensorConverter._get_memovc                 C  s   | j j|}|| j j|< d S ra   )r   r   Zget_tensor_idr   )rM   r   r   r   rC   rC   rD   set_tensor_memoE  s   z#FakeTensorConverter.set_tensor_memoNT)sourcesymbolic_contexttracer   FakeTensorModemake_constant	shape_envOptional[ShapeEnv]r   Optional[Source]r   Optional[SymbolicContext]r   c                  s0  |s(|s(|r(t jj  }r(||jv r(|j| }ddlm}	 t||	s%J |j}| 	|}
|
d ur3|
S |j
r:tdt|t jju rF|rFJ |rJ|nd  d fd
d}| j||||||d}|tu rgtdddlm} d }| jst|r| dkr|jjdkr|jt jt jt jt jt jfv r|d urt||s|d urddlm}m} ddlm} t   |! }W d    n1 sw   Y  t"#|st"$|st||r|j%}n||}|j&|||j'|d}|jt jkr|j(|||d|_)n|jt jkr|j*|||d|_)|r| +| |S )Nr   )StatefulSymbolicContextzquantized nyi in meta tensorsmake_meta_tCallable[[], object]deviceUnion[torch.device, str]rG   r   c                   s<   t   t|  | dW  d    S 1 sw   Y  d S )Nr   )r&   r   )r   r   r   r   rC   rD   mk_fake_tensort  s   
$z<FakeTensorConverter.from_real_tensor.<locals>.mk_fake_tensor)r   callbackr   r   r   zmeta converter nyi)RandomValueSourcecpu)CallMethodItemSourceFloatTensorSource)
DimDynamic)r   Zdynamic_dimr   )hintr   )r   r   r   r   rG   r   ),rk   Z_guardsZTracingContextZtry_getZtensor_to_context%torch.fx.experimental.symbolic_shapesr   r   Ztensor_sourcer   is_quantizedrS   r   nn	Parameterr   NotImplementedZtorch._dynamo.sourcer   r   r   dimr   dtypeZint64Zint32Zint16Zint8Zfloat64r   r   r   r&   itemmathisnanisinfbaseZcreate_unspecified_symbolZDYNAMICcreate_symintnode	item_memoZcreate_symfloatnoder   )rM   r   r   r   r   r   r   r   Ztracing_contextr   
maybe_memor   rt   r   valuer   r   r   Zitem_sourcesymbolrC   r   rD   from_real_tensorO  s   








z$FakeTensorConverter.from_real_tensorr   torch.devicec                 C  sR   |j jdksJ d|j j d| |}|d ur|S t|||}| || |S )Nmetaz$tensor's device must be `meta`, got z instead)r   r   r   r   r   )rM   r   r   r   r  rt   rC   rC   rD   from_meta_and_device  s   
z(FakeTensorConverter.from_meta_and_device)rG   r   )r   r   r   r   rG   rH   )r   r   rG   rH   )r   r   rG   rH   )r   r   rG   r   )r   r   r   r   rG   rH   )FN)r   r   r   r   r   r   r   r   r   r   r   r   r   r   rG   r   )r   r   r   r   r   r  rG   r   )r@   rA   rB   propertyr   rW   rN   r   r   r   r   r  r	  rC   rC   rC   rD   r     s(   
 



 r   r   r  rH   c                 C  sD   t j s
t j r t jjd u rt jd| dnt jd| d d S d S )Nr1   r   )rk   cudais_availablexpuversionZhipemptyzerosr  rC   rC   rD   init_gpu_context  s    r  r   r   Generator[None, None, None]c              
   c  s    | j }tj }||ksJ | d| tj < d| _ tj  tjd zd V  W || _ n|| _ w W d    n1 sBw   Y  W d    d S W d    d S 1 sZw   Y  d S )N, T)in_kernel_invocationrk   rl   Z_meta_in_tls_dispatch_includeZ_DisableTorchDispatchZ_PreserveDispatchKeyGuardZ!_set_meta_in_tls_dispatch_include)r   Zprev_in_kernelZmeta_in_tlsrC   rC   rD   in_kernel_invocation_manager  s   
"r  c                 C  s$   t j|  dd dd S )Nz::.r   )rk   rl   Z _should_allow_numbers_as_tensorsnamesplitr   rC   rC   rD   should_allow_numbers_as_tensors  s   r  c                   @  s   e Zd ZejdddkZdS )FakeTensorConfigZTORCH_FAKE_TENSOR_DEBUG01N)r@   rA   rB   osenvironr   debugrC   rC   rC   rD   r    s    r  c                   @  sn   e Zd ZU ded< ded< ddd!d
dZd"ddZd#ddZd#ddZd#ddZ	d$d%ddZ	d&dd Z
dS )'SymNumberMemoDescriptorrT   _namer   _is_nested_intFis_nested_intr&  rG   rH   c                C  
   || _ d S ra   )r$  )rM   r&  rC   rC   rD   rN   0  rb   z SymNumberMemoDescriptor.__init__ownerr  c                 C  s
   || _ d S ra   r#  )rM   r(  r  rC   rC   rD   __set_name__3  rb   z$SymNumberMemoDescriptor.__set_name__objr   c                 C  s   d| j  S )Nr   r)  rM   r+  rC   rC   rD   _memo6  ri   zSymNumberMemoDescriptor._memoc                 C     d| j  dS )Nr   Z_vcr)  r,  rC   rC   rD   _memo_vc9     z SymNumberMemoDescriptor._memo_vcc                 C  r.  )Nr   _epochr)  r,  rC   rC   rD   _memo_epoch@  r0  z#SymNumberMemoDescriptor._memo_epochNobjtypeOptional[type[FakeTensor]]-Optional[Union[torch.SymInt, torch.SymFloat]]c                 C  s   t || | }d u rd S t|tjr|jjd ur|S | js*t || ||j	ks9| jsDt || 
||jjkrDt|| |d  d S |S ra   )rw   r-  r   rk   r   noder   r$  r/  _versionr2  r   epochsetattr)rM   r+  r3  rrC   rC   rD   __get__C  s   zSymNumberMemoDescriptor.__get__r  c                 C  s   |d u r!t || |d  t || |d  t || |d  d S | r(| jrKt || || | js>t || ||j t || ||jj d S d S ra   )	r9  r-  r/  r2  is_inferencer$  r7  r   r8  )rM   r+  r  rC   rC   rD   __set__Y  s   zSymNumberMemoDescriptor.__set__)r&  r   rG   rH   )r(  rT   r  rT   rG   rH   )r+  r   rG   rT   ra   )r+  r   r3  r4  rG   r5  )r+  r   r  r5  rG   rH   )r@   rA   rB   rW   rN   r*  r-  r/  r2  r;  r=  rC   rC   rC   rD   r"  &  s   
 



r"  c                      s  e Zd ZU dZded< ded< ded< ded< e Ze Ze Ze Z	ed	d
Z
ejjjZed;ddZejd<ddZed=ddZejd>ddZe		d?d@ddZdA fdd ZedBd"d#Zeed$e fdCd+d,ZedDd/d0Zd1d2dEd6d7ZdFd9d:Z  ZS )Gr   al  
    Meta tensors give you the ability to run PyTorch code without having to
    actually do computation through tensors allocated on a `meta` device.
    Because the device is `meta`, meta tensors do not model device propagation.
    FakeTensor extends MetaTensors to also carry an additional `fake_device`
    which tracks devices that would have been used.
    r  fake_devicer   r   Optional[Tensor]r   real_tensorTr%  rG   c                 C  s   | j jr	tdS | jS Nr  )r   r  rk   r   r>  rL   rC   rC   rD   r     s   
zFakeTensor.devicer   rH   c                 C     t ra   NotImplementedErrorrM   r   rC   rC   rD   r        	list[str]c                 C  s   t d)Nz+torch.compile doesn't support named tensors)rS   rL   rC   rC   rD   names  s   zFakeTensor.namesc                 C  rB  ra   rC  rE  rC   rC   rD   rH    rF  Nr   r   r   r   c                 C  sZ  t j| ||jd|d}|jstj| ntj| |jj	dks'J |jj	t
|tjr/|nt|}|js>|j	dks>J |j	dv rGt| |j	ddddtj fv r|jd u r|j	dkrxtt|j	 rxt|j	 d	tt|j	  }n	t|j	 d
}||_||_||_t
|trJ ||_d |_d |_d |_d |_d |_tjrt |_ |S )NT)Zdispatch_deviceZdevice_for_backend_keysr  )r  r  r  hpur  Zmps:z:0)!r   Z_make_subclassrequires_grad_allow_unsafe_data_ptr_accessrk   rl   Z_set_throw_on_mutable_data_ptrZ(_set_warn_deprecated_on_mutable_data_ptrr   r   r   
allow_metar  Z_get_privateuse1_backend_nameindexrw   Zis_initializedZcurrent_devicer>  r   r   r   r@  nonzero_memor  unique_memounique_consecutive_memonested_int_memor  r!  r0   extractZ_debug_trace)clsr   r   r   r   r@  rM   rC   rC   rD   __new__  sL   	


zFakeTensor.__new__argsr   kwargsc                   s   t    d S ra   )superrN   )rM   rV  rW  	__class__rC   rD   rN     r0  zFakeTensor.__init__r   c                 C  s
   | | S ra   )from_tensor)r   r   rC   rC   rD   r[    s   
zFakeTensor.from_tensorrC   rZ   r;   typesSequence[type]Sequence[object]Mapping[str, object]c           
      C  s(  |t jjjjkr't|dkrt|d tsJ |d jj	r"t dS |d j
S t| }r2||S dd |D }|rCtd| tS d }tj|i |D ]}t|trY|j} nqM|d us`J t jt jjj}	|	rttd||	 tS |j	ryJ | ||i |W  d    S 1 sw   Y  d S )Nr1   r   r  c                 S  s"   g | ]}t |ts|tur|qS rC   )
issubclassr   r   rx   r   rC   rC   rD   r   %  s    
z1FakeTensor.__torch_dispatch__.<locals>.<listcomp>z(FakeTensor unrecognized subclass(es): %sz(FakeTensor mode already active: %s in %s)rk   opsprimr   defaultlenr   r   r   r  r>  _DISPATCH_META_HANDLERSr   not_implemented_logr!  r   r   Zarg_tree_leavesrl   _get_dispatch_modern   ro   )
rT  rZ   r\  rV  rW  handlerunrecognized_typesr   argZmaybe_cur_fake_moderC   rC   rD   __torch_dispatch__  sH   


	
$zFakeTensor.__torch_dispatch__	flat_argstuple[torch.device, bool]c                   sx   d  d}d dddd fd
d}|D ]}|| qt r- d u r-d}td  d us8J d  |fS )NFr   r   rG   r   c                 S  s   | j jdko|  dkS )Nr   r   )r   r   r   r   rC   rC   rD   cpu_zero_dimZ  s   z4FakeTensor._find_common_device.<locals>.cpu_zero_dimr   rH   c                   s|   t | tsd S  d u r| j | d S | }| j kr#r!|d S |r'd S r0| j |d S td d  d| j )Nz,Unhandled FakeTensor Device Propagation for z, found two different devices r  )r   r   r   RuntimeError)r   Zt_is_cpu_zero_dimcommon_devicero  rZ   Zis_cpu_zero_dimrC   rD   merge_devices]  s(   

z5FakeTensor._find_common_device.<locals>.merge_devicesTr   z!Could not find common device for r   r   rG   r   )r   r   rG   rH   )r  rk   r   )rZ   rm  has_scalar_only_inputsrs  rk  rC   rq  rD   _find_common_deviceM  s   	
"

zFakeTensor._find_common_devicer1   )coeffrw  Union[int, torch.SymInt]torch.SymIntc                C  s6   | j d u r| jjd d| _ t| j tjsJ | j | S )Nnt_tensor_id)rR  r   create_symbolic_nested_intr   rk   r   )rM   rw  rC   rC   rD   get_nested_int  s   

zFakeTensor.get_nested_intr   c                 C  s<   |   dkr
|  S |   dkrdd | D S dd | D S )Nr   r1   c                 S     g | ]}|  qS rC   )r   r   rC   rC   rD   r         z%FakeTensor.tolist.<locals>.<listcomp>c                 S  r~  rC   )tolistr   rC   rC   rD   r     r  )r   r   rL   rC   rC   rD   r    s
   zFakeTensor.tolist)rG   r  )r   r  rG   rH   )rG   rG  )r   rG  rG   rH   )NN)r   r   r   r   r   r  r   r?  r@  r?  rG   r   )rV  r   rW  r   rG   rH   )r   r   r   r   rG   r   
rZ   r;   r\  r]  rV  r^  rW  r_  rG   r   )rZ   r;   rm  r^  rG   rn  )rw  rx  rG   ry  )rG   r   ) r@   rA   rB   __doc__rW   r"  rO  r  rP  rQ  rR  rk   rl   rn   ro   	_mode_keyr
  r   setterrH  staticmethodrU  rN   r[  classmethodr/   r   rl  rv  r}  r  __classcell__rC   rC   rY  rD   r   g  sJ   
 

OICr   r3   r4   c                   @  s   e Zd ZU dZded< ded< ded< ded< d	ed
< ded< ded< ded< ded< ded< ded< ded< ded< ded< ded< ded< ded< d(d%d&Zd'S ))TensorMetadatazK
    The Tensor metadata relevant to hashing FakeTensors when caching.
    ztorch.dtyper   ztuple[_MetadataIntLike, ...]shapestrider  r   ztorch.layoutr   zOptional[torch.memory_format]memory_format_MetadataIntLikestorage_offsetzOptional[_MetadataIntLike]storage_bytesr   rK  r   is_conjis_negr<  r   r_   is_coalescedOptional[int]	dense_dim
sparse_dimresultlist[object]moder   stater2   rG   rH   c                 C  sd   t | D ]*}t| |j}t|tttjfr|	||| qt|t
r*||| q|| qd S ra   )dataclassesfieldsrw   r  r   tuplelistrk   Size_prep_args_for_hashr   convert_sym_intr   )rM   r  r  r  fieldr  rC   rC   rD   _flatten_into  s   
zTensorMetadata._flatten_intoN)r  r  r  r   r  r2   rG   rH   )r@   rA   rB   r  rW   r  rC   rC   rC   rD   r    s(   
 r  c                 C  s   t | }| jst| s| j|dsd}|  }t| j| j| jt	j
kr&|  nd| j| j||t| s7|   nd| j| j|  |  |  | j| jrN|  ndt| rW|  ndt| ra|  S dS )z1
    Extract the TensorMetadata of a tensor.
    )r  NrC   )r   _has_symbolic_sizes_stridesr   Zis_contiguousr  r  r   r  r   rk   r   r  r   untyped_storagenbytesrK  r   r  r  r<  r   r  r  r  )r   r  r  rC   rC   rD   extract_tensor_metadata  s<   
r  c                   @  sJ   e Zd ZU dZded< ded< dd	d
ZdddZdddZdddZdS )_DispatchCacheKeyz0
    Key for the FakeTensor dispatch cache.
    tuple[object, ...]ry   int	hashvaluetuprG   rH   c                 C  s   || _ t|| _d S ra   )ry   hashr  )rM   r  rC   rC   rD   rN     s   z_DispatchCacheKey.__init__otherr   r   c                 C  s   t |to
| j|jkS ra   )r   r  ry   )rM   r  rC   rC   rD   __eq__  s   z_DispatchCacheKey.__eq__c                 C  s   | j S ra   )r  rL   rC   rC   rD   __hash__  s   z_DispatchCacheKey.__hash__c                 C  s"   | j D ]}t|tr|  qd S ra   )ry   r   r3   strip_shape_env)rM   r   rC   rC   rD   r    s
   

z!_DispatchCacheKey.strip_shape_envN)r  r  rG   rH   )r  r   rG   r   )rG   r  rQ   )	r@   rA   rB   r  rW   rN   r  r  r  rC   rC   rC   rD   r    s   
 


r  T)frozenc                   @  s*   e Zd ZU dZded< ded< ded< dS )_DispatchCacheEntryOutputInfoaV  
    Entry type for the FakeTensor dispatch cache for an output. Accounts for two
    possibilities:
    1) The op is inplace, and a hit means we need to alias the argument at a
       given index.
    2) We need to synthesize a new FakeTensor given tensor metadata. For view
       ops, we further capture the index of the arg to alias.
    r  inplace_idxzOptional[TensorMetadata]metadataview_idxNr@   rA   rB   r  rW   rC   rC   rC   rD   r    s
   
 	r  c                   @  s&   e Zd ZU dZded< dZded< dS )_DispatchCacheEntryz
    Entry type for the FakeTensor dispatch cache. It supports two types of outputs
    1) tensor
    2) tuple of tensors

    is_output_tuple flag helps in differentiating the return type
    z$tuple[_DispatchCacheEntryOutputInfo]output_infosFr   is_output_tupleN)r@   rA   rB   r  rW   r  rC   rC   rC   rD   r  '  s   
 r  c                   @  s   e Zd ZU dZded< dS )_BypassDispatchCachez<
    Signals cases that should skip FakeTensor caching.
    rT   rU   Nr  rC   rC   rC   rD   r  6  s   
 r  c                   @  s2   e Zd ZU dZded< ded< ded< ded< dS )	DispatchCacheInfozG
    Information about the state of the FakeTensor dispatch cache.
    r  hitsmissesdict[str, int]bypassessizeNr  rC   rC   rC   rD   r  @  s   
 r  c                      s  e Zd ZU i Zded< dZded< dZded< eeZ	ded< dZ
ded	< d
Zded< ded< ded< ded< ded< dZded< dZded< dd
ddd
dd fdd Zdd!d"Zdd&d'Zedd(d)Zedd+d,Zed-e fdd6d7Zd fd9d:Zd fdAdBZeddCdDZeddFdGZeddHdIZddJdKZddOdPZddQdRZddVdWZ dd[d\Z!dd_d`Z"ddbdcZ#ddedfZ$ddhdiZ%ddjdkZ&d-e fddldmZ'ddsdtZ(ddzd{Z)dd|d}Z*e+d~dddddddZ,dddZ-dddZ.dddZ/dddddZ0e+e1j2j3e1j4j5e1j6j5e1j7j5e1j8j5e1j9j5e1j:j5e1j;j5e1j<j5e1j=j>e1j?j5Z@dddZAe+e1jBj5e1jCj5ZDdddZEdddZFddddddddZG  ZHS )r   z,dict[_DispatchCacheKey, _DispatchCacheEntry]cacher   r  
cache_hitscache_missesr  cache_bypassesr8  Fr   r  static_shapesr   r   zOptional[str]_stackrM  r  nt_tensor_id_counternt_tensor_id_initial_countTN)allow_fallback_kernelsallow_non_fake_inputsr   r  r   r  r  r_   r   rG   rH   c                  s   t dt|  t   || _dd l}dd l}|jj	j
| _t| j|d| _|d ur.|| _n|d u | _d| _|jj	j| _|jj	j| _|jj	joJ| j | _|jj	j| _|| _d| _g | _|| _t | _d | _ |j!j"j#| _$dd l%}|j&j'j(j)| _*| j*| _+d S )Nzcreate_mode 0x%xr   r   F),logr!  idrX  rN   r  Ztorch._dynamo.configZtorch._functorch.configr   configZ"fake_tensor_propagate_real_tensorspropagate_real_tensorsr   fake_tensor_converterr  Zallow_scalar_outputsZ(fake_tensor_allow_unsafe_data_ptr_accessrL  Zfake_tensor_allow_metarM  _dynamoZfake_tensor_cache_enabledcache_enabledZ$fake_tensor_cache_crosscheck_enabledcache_crosscheck_enabledr  r  enter_stackr   	tracebackextract_stack_stack_tracer  rl   rn   ro   r  $torch.nested._internal.nested_tensornested	_internalZnested_tensorZ_tensor_id_counterr  r  )rM   r  r  r   r  r   rk   rY  rC   rD   rN   n  sF   


	

zFakeTensorMode.__init__c                 C  s   | j | _d S ra   )r  r  rL   rC   rC   rD   reset_nt_tensor_id_counter  ri   z)FakeTensorMode.reset_nt_tensor_id_counterr   r   TypeGuard[FakeTensor]c                 C  s   t |to	|j| u S ra   )r   r   r   rM   r   rC   rC   rD   is_our_fake  s   zFakeTensorMode.is_our_fakec                 C  sD   t j rt j rJ t j  S t j p tt do t j  S )NrI  )rk   r  Z_is_compiledr  r  hasattrrI  rL   rC   rC   rD   avoid_device_init  s   

z FakeTensorMode.avoid_device_initrT   c                 C  s$   | j d u rdt| j| _ | j S )N )r  joinr  format_listr  rL   rC   rC   rD   stack  s   
zFakeTensorMode.stackrC   rZ   r;   r\  r]  rV  r^  rW  r_  c                 C  sL   t jt jjjd u sJ |z	| ||||W S  ty%   td  w )Nzfake tensor raised TypeError)	rk   rl   rh  rn   ro   dispatch	TypeErrorr  	exception)rM   rZ   r\  rV  rW  rC   rC   rD   rl    s   

z!FakeTensorMode.__torch_dispatch__r   c                   s|   dd l }d }| jr|j }|jd |j| j}| |ur-| jd||f t	 
 S |j|  | jdd |f | S )Nr   TF)r  r  rl   Z_only_lift_cpu_tensors_set_only_lift_cpu_tensorsrm   r  r  r   rX  	__enter__rp   )rM   rk   Zprev_only_lift_cpu_tensorsmaybe_prev_fake_moderY  rC   rD   r    s   

zFakeTensorMode.__enter__aOptional[type[BaseException]]bOptional[BaseException]cOptional[TracebackType]c                   sX   | j  \}}}|r(t ||| |d urtj| |d ur*tj| d S d S d S ra   )r  r~   rX  __exit__rk   rl   rp   r  )rM   r  r  r  liver  Z maybe_prev_only_lift_cpu_tensorsrY  rC   rD   r    s   
zFakeTensorMode.__exit__c                 C  s   dS re   rC   rT  rC   rC   rD   is_infra_mode0  rF  zFakeTensorMode.is_infra_moder  c                 C  s   t tjtjttjttjS )z8
        Query the state of the dispatch cache.
        )r  r   r  r  rf   r  re  r  r  rC   rC   rD   
cache_info4  s   zFakeTensorMode.cache_infoc                 C  s$   d| _ d| _| j  | j  dS )z+
        Clear the dispatch cache.
        r   N)r  r  r  clearr  r  rC   rC   rD   cache_clear@  s   
zFakeTensorMode.cache_clearc              
   C  s<  t }zqt| j}| ||||}| r |jdusJ |jj}ntj}||d}	|	durJ| 	||	|||}t j
d7  _
| jrI| ||||| n(| ||| | ||||}| ||||||}	|  |	||< t jd7  _W n ty }
 ztj|
j  d7  < W Y d}
~
nd}
~
ww |t u r| ||||}|S )z
        Lookup a cache entry for the given arguments. If none exists, dispatch
        and cache the result (if the result is eligible for caching).
        Nr1   )_UNASSIGNEDr2   r   
_cache_keyZcache_on_shape_envZfake_tensor_cacher   r  r   _output_from_cache_entryr  r  _crosscheck_cache_output_validate_cache_key_dispatch_impl_make_cache_entryr  r  r  r  rU   )rM   rZ   r\  rV  rW  outputr  ry   r  entryerC   rC   rD   _cached_dispatch_implJ  s:   

 z$FakeTensorMode._cached_dispatch_implr  r2   r  c                 C  sZ   |t  t j t  | jr| jjndg}|r| ||| |r'| ||| tt	|S )z
        Create a cache key given the dispatch args. Raises _BypassDispatchCache
        for any situation that precludes caching.
        N)
rk   Zget_default_dtyperl   Z_get_default_deviceZis_inference_mode_enabledr   settingsr  r  r  )rM   r  rZ   rV  rW  
key_valuesrC   rC   rD   r  u  s   zFakeTensorMode._cache_keyc                 C  s   t jj|jv rtdt jj|jv rtdt jj|jv r!td|tjj	kr+td|| j
v r4td| dkr>tdt jj|sItd|jr\t j| t jjjr^tdd	S d	S )
za
        Validate that the cache key generated by _cache_key will be
        reasonable.
        zdata dependent outputzdynamic output shapezinplace viewzunsafe viewZliftzinductor::resize_storage_bytes_znon-builtinCompositeImplicitAutogradN)rk   TagZdata_dependent_outputtagsr  Zdynamic_output_shapeinplace_viewatenZ_unsafe_viewrd  lift_fnsr  _libraryutils
is_builtinis_viewrl   Z%_dispatch_has_kernel_for_dispatch_keyZDispatchKeyr  )rM   rZ   rV  rW  rC   rC   rD   r    s&   
z"FakeTensorMode._validate_cache_keyr  r  ?Union[Mapping[str, object], Sequence[object], Iterable[object]]c                 C  s0  t |tr| || | | || | dS |D ]z}t |trY| |s+td|jdur4tdt	|r@t|j
 dt |  trMtdt|}||| | qt |trbtdt |trn||| qt |ttfrytdt |tttfr| ||| q|t| || qdS )a7  
        Translate the provided args into a form suitable for caching at FakeTensor
        dispatch, i.e., convert unhashable types like lists & dicts into tuples and
        convert FakeTensors into metadata. Raises _BypassDispatchCache to signal
        unsupported cases that should bypass caching.
        Nznot our fakeconstant attributez tensorzsymbolic nbytesznon-fake tensorzsymbolic shape)r   rf   r  keysvaluesr   r  r  r   r   r   r  r  r   r  r  r   r  r   r   r  r  r   r   )rM   r  rV  r  rk  r  rC   rC   rD   r    s6   





z"FakeTensorMode._prep_args_for_hashry   r  r   c                 C  sl   t |ts	td|jd urtd|jrtdt|r!td| D ]}t|t|kr3tdq%d S )Nznon-FakeTensor outputr  zsparse outputzsparse compressed outputzkwarg aliases output)r   r   r  r   r   r   r  r  )rM   r  ry   rZ   rV  rW  r  ZkvalrC   rC   rD    _validate_output_for_cache_entry  s   

z/FakeTensorMode._validate_output_for_cache_entryr   r  c                   s,  t t|D ]}t|| t|krt|d d d  S qd }|jr6dd t|D }	t|	dks2J |	d }t|}
t fdd|
jD |
_t fdd|
j	D |
_	 
|
j|
_|
jd u rbd n 
|
j|
_td |
|d}t|fd	d
}|  ||||}tj|}tj|}||krtd|S )Nr  r  r  c                 S  s   g | ]\}}t |tr|qS rC   r   r   )rx   ir   rC   rC   rD   r   "  s    zCFakeTensorMode._get_output_info_for_cache_entry.<locals>.<listcomp>r1   r   c                 3      | ]}  |V  qd S ra   convert_outputrx   r   r  rC   rD   r|   '  r}   zBFakeTensorMode._get_output_info_for_cache_entry.<locals>.<genexpr>c                 3  r  ra   r  r  r  rC   rD   r|   (  r}   Fr  r  zdispatch_key_set mismatch)rangere  r  r  r  	enumerater  r  r  r  r  r  r  r  r  rk   rl   Z_dispatch_key_setr  )rM   r  ry   rZ   rV  rW  r  idxr  Zidxsr  r  Zentry_for_synth_outputZsynth_outputZsynth_key_setZkey_setrC   r  rD    _get_output_info_for_cache_entry  sF   




z/FakeTensorMode._get_output_info_for_cache_entryr  c           
   	     s   |du rt dddd}t|fddS t|tr'|D ]} | qn
 | t|trL fdd|D }	tt|	ddS  |}t|fddS )z
        Make a cache entry object for the given 'output' Tensor. Raises
        _BypassDispatchCache if the output tensor has characteristics that
        prevent caching it.
        Nr  Fr  c              
     s    g | ]}  |qS rC   )r  )rx   Zout_elemrV  rZ   ry   rW  rM   r  rC   rD   r   l  s    z4FakeTensorMode._make_cache_entry.<locals>.<listcomp>T)r  r  r   r  r  r  )
rM   r  ry   rZ   rV  rW  r  output_infoZout_elementr  rC   r  rD   r  K  s:   

z FakeTensorMode._make_cache_entryr  c              
     s  |j d ur||j  }t|tsJ |S |j}|d u rd S t|r"J dfdd t fd	d
|jD }t fdd
|jD }	 |j}
|j	d urT |j	 t
j}| jd ur`| jj}t| ) |  tj||	|j|jd|jd}W d    n1 sw   Y  W d    n1 sw   Y  |jrtj|d |jrtj|d |jr|tt|j }t|tsJ | }t| # |  |||
||	 W d    n1 sw   Y  W d    n1 sw   Y  t| ||jS )Nr  r  r  r2   rG   Union[IntLikeType]c                   s8   t | tr|jd usJ |  |jS t | trJ | S ra   )r   r4   r   rS  r3   )r  r  ry   rC   rD   check_value  s
   
zGFakeTensorMode._get_output_tensor_from_cache_entry.<locals>.check_valuec                 3      | ]} |V  qd S ra   rC   r  r#  r  rC   rD   r|     r}   zEFakeTensorMode._get_output_tensor_from_cache_entry.<locals>.<genexpr>c                 3  r$  ra   rC   r  r%  rC   rD   r|     r}   r  )r   r   r   rK  T)r  r  r  r2   rG   r!  ) r  r   r   r  r   r  r  r  r  r  
contextlibnullcontextr   Zsuppress_guardsr  rk   empty_stridedr   r   rK  r  rl   Z	_set_conjr  Z_set_negr  r   r  r  r  set_r   )rM   r  r  ry   rZ   rV  Zinplace_argr  r  r  r  Zmaybe_suppressr  Zview_argZstoragerC   )r#  ry   r  rD   #_get_output_tensor_from_cache_entry~  sV   




 
 z2FakeTensorMode._get_output_tensor_from_cache_entry=Union[Optional[FakeTensor], tuple[Optional[FakeTensor], ...]]c                   sB   |j r fdd|jD }t|S |jd  S )z?
        Create a new FakeTensor from the cache entry.
        c              	     s   g | ]} | qS rC   )r*  )rx   r   rV  rZ   ry   rM   r  rC   rD   r     s    z;FakeTensorMode._output_from_cache_entry.<locals>.<listcomp>r   )r  r  r  r*  )rM   r  r  ry   rZ   rV  ZoutputsrC   r,  rD   r    s   
z'FakeTensorMode._output_from_cache_entryc           
      C  s  z
|  ||||}W n ty' } ztd| d| d| d| |d}~ww zI|durc|durct|trSt|t|ks@J t||D ]
\}}	tt||	 qEW dS t|trZJ tt|| W dS |du siJ |du soJ W dS  ty } ztd| d| d| |d}~ww )z
        Helper to validate that the output synthesized from the cache matches
        the output created by normal dispatch.
        z*FakeTensor cache crosscheck failure: func=z, args=z	, kwargs=z: Dispatch raised=N)	r  	Exceptionrp  r   r  re  zipr   r   )
rM   r  rZ   r\  rV  rW  Ztrue_outputr  r  r  rC   rC   rD   r    sN   
z'FakeTensorMode._crosscheck_cache_outputc                 C  s   |pi }t   td||| W d    n1 sw   Y  |tv r)t| |S t tjkr<tddt | t }|t	v r[t
|  ||i |W  d    S 1 sVw   Y  | jrf| ||||S | ||||S )Nz%s %s %sz'%sFakeTensorMode.__torch_dispatch__: %s )r&   r  r!  rf  getEffectiveLevelloggingDEBUGrK   rF   _DISPATCH_HANDLE_DIRECTLYr  r  r   r  )rM   rZ   r\  rV  rW  incrrC   rC   rD   r    s$   

 zFakeTensorMode.dispatchpathr)   fakerealtuple[Optional[object], bool]c           
        s  ddl ddlm} dfd	d
}t|tjrz|||dddddd W n= tyb   z1tjjj	rKt
d fddd t|dfW  Y d  S td| d| dt| d  d  ww tt| | D ]O\}\}}	z|||	 W qn ty   z6tjjj	rt
d fddd t|dfW  Y d    S td| d|	 dt| d| d 
 d  ww |dfS z
||| W |dfS  ty   ztd| d| dt| d  d  ww ) z
        Helper to cross-check fake/real output properties & values,
        and create new fake vals if mismatched.
        Returns tuple of object & boolean, for whether or not it was overwrriten
        r   N)_check_fake_real_tensorsr6  r   r7  rG   rH   c                   s   t | ttfr@ jd usJ | jjj jj   jj	  s< jj
| jj|ddjjur>td|  d| dd S d S t | tttfrW| |krYtd|  d| dd S d S )NT)Zcompute_hintzmismatch between fake value z and real value r/  )r   r   r   r   r6  exprZfree_symbols
var_to_valr  unbacked_var_to_valZ_maybe_evaluate_staticEqStruer]   r  floatr   )r6  r7  )rM   sympyrC   rD   _check_fake_real_vals/  s6   


z?FakeTensorMode._maybe_infer_fake.<locals>._check_fake_real_valsReal tensor propagation foundFT)contextsizesstridesr  rK  mismatched_fake_kernelc                        t  jdS NoprU   rT   rU   rC   excrZ   rC   rD   <lambda>Y     z2FakeTensorMode._maybe_infer_fake.<locals>.<lambda>Zmetadata_fnzFReal tensor propagation found a metadata mismatch between fake tensor z and real tensor z,  at outputz, for func: c                     rH  rI  rL  rC   rM  rC   rD   rO  n  rP  zIReal tensor propagation found an output size mismatch between fake shape z and real shape z, at outputz.size(z), for func: zQReal tensor propagation found an output value mismatch between fake output value z and real output value )r6  r   r7  r   rG   rH   )rA  torch._subclasses.fake_utilsr9  r   rk   r   r]   r   r  *generate_fake_kernels_from_real_mismatchesr   _infer_fake_from_real_tensorr*   r  r.  r  )
rM   rZ   r5  r6  r7  r9  rB  jZs_fakeZs_realrC   )rN  rZ   rM   rA  rD   _maybe_infer_fake#  s   
	
" z FakeTensorMode._maybe_infer_fakefake_inreal_infake_outreal_outOptional[object]c              
     s  ddl m} djrtjjdfdd}t|\}}	t|\}
}z
|d|||| W n= tyn   z1t	j
jjr\td	 fd
dd |  tfdd|W  Y d  S td| d| d  d  ww tfddt||
D  \}}t|rr|  t||	S )z
        Helper to cross-check fake/real output properties & values,
        and create new fake vals if mismatched, but at the kernel level.
        Means this handles pytree outputs & checks aliasing.
        r   )_check_alias_infoNrG   rH   c                     s   t tjj j_d S ra   )r  setr   pending_fresh_unbacked_symbols
differencerC   )pending_unbackedrM   rC   rD   _clear_pending_unbacked  s
   zXFakeTensorMode._maybe_infer_fake_kernel_from_pytree_out.<locals>._clear_pending_unbackedrC  rG  c                     s   t d j dS )Nz>Mismatched aliasing spec between fake kernel and real kernel: rJ  rL  rC   rM  rC   rD   rO    s   
zIFakeTensorMode._maybe_infer_fake_kernel_from_pytree_out.<locals>.<lambda>rQ  c                   s   t  | S ra   rT  r   rZ   rM   rC   rD   rO    s    zGReal tensor propagation found an aliasing mismatch between fake output z and real output z,  for func: c                   s$   g | ]\\}}}  |||qS rC   )rV  )rx   Z
_fake_pathZ	_fake_outZ	_real_outrc  rC   rD   r     s    
zKFakeTensorMode._maybe_infer_fake_kernel_from_pytree_out.<locals>.<listcomp>rQ   )rR  r\  r   r  r^  r   Ztree_flatten_with_pathtree_flattenr]   rk   r   r  rS  r   r,   r.  r   tree_unflatten)rM   rZ   rW  rX  rY  rZ  r\  ra  Zfake_paths_leavesZ	fake_specZreal_leavesr   Zfake_leavesZ	overridesrC   )rN  rZ   r`  rM   rD   (_maybe_infer_fake_kernel_from_pytree_out  s^   

	z7FakeTensorMode._maybe_infer_fake_kernel_from_pytree_outc           %        s  t  	f\t}|rdd D }td| tS fddD }tdd |D p8tdd D jjv }t	j
jjju oXt d t	joX d jjd	k}	|r]|rgtrs|s|	std
d |D swJ  dfddD }
t |
\}}|i |}t|tu r|rt  | }W d    n1 sw   Y  j|ddS |rt	dkrt dksJ   d	 t d tu r d S d}jrt	j
jjjkrd	v r	d dkrd}t	j
jjjkrd}\} 	tdd |D }t	jjj vrt	jj!j vr|rt|dkrs|sfddD }
t |
\}}t  |i |}W d    n	1 saw   Y  t "|}dd |D }tfdd|D }|rt #tfdd|S |D ]}$| qt \ 	%| 	 d:fdd
dd l&m'm( t) j*r1td!d |D r1tfd"dD s1t+d# 
fd$dD }t |\t,-}|st,.|}z	i W n t/y  } zt+d%| W Y d }~nd }~ww |s0|0  t,1j2 nj*rFt+d&|j3rCj3j4nd  d; 	f
d(d)}rqt5 6}|d urq||g R i 	S dd*l7m8} |vr9sdd+l7m:} |v rst;rtd,d |D r ||  i 	W  d    S 1 sw   Y    j< i 	}|tur||W  d    S W d    n	1 sw   Y  d-j=j>v rt?d.rt@s |jA i 	W  d    S 1 sw   Y  t	jBjCjD}|d ur4|jEv r4|jFg R i 	S j*rcurct,-scj3d urct,GsctH}tId/fd0dd1 ||S t	jJjKjLM> jNjO}|rt	jJjNPt	jJjNQfd2d-  | i 	}||W  d    W  d    S 1 sw   Y  W d    n	1 sw   Y  tRD ]!\}} |r| g R i 	}!|!tur||!  S q	 d<d=fd6d7}"tSs|" }#||#S ztT  i 	}W d    n	1 sw   Y  W n% tUy- }$ z
|"|$W  Y d }$~$S d }$~$w tVy;   t+Wd8  w |jX|	6dd9S )>Nc                 S  s   g | ]
}t |rt|qS rC   )_check_for_subclass_argr   r   rC   rC   rD   r     s
    z1FakeTensorMode._dispatch_impl.<locals>.<listcomp>z,FakeTensorMode unrecognized subclass(es): %sc                   s   g | ]	}  |r|qS rC   )r  ra  rL   rC   rD   r     r   c                 s  s    | ]}|j V  qd S ra   )r  )rx   r  rC   rC   rD   r|     s    
z0FakeTensorMode._dispatch_impl.<locals>.<genexpr>c                 s  s    | ]}t |tV  qd S ra   )r   r   rx   r  rC   rC   rD   r|     r}   r   r  c                 s      | ]}|j d uV  qd S ra   r   ra  rC   rC   rD   r|     s    

z. should not have fake inputs without constantsc                       g | ]}  |r|jn|qS rC   r  r   rh  rL   rC   rD   r   
      Tr   r1   r/  Fr   r   c                 s  ri  ra   r   rx   r  rC   rC   rD   r|   C  r}   c                   rj  rC   rk  rh  rL   rC   rD   r   L  rl  c                 S  s   g | ]	}t |tr|qS rC   r  ra  rC   rC   rD   r   W  r   c                 3  r  ra   )may_turn_constra  rL   rC   rD   r|   X  r}   c                   s    j | ddS )NTrm  )r  r   )	converterrM   rC   rD   rO  ]  s    z/FakeTensorMode._dispatch_impl.<locals>.<lambda>r   rE   rG   1Optional[Union[T, Tensor, torch._C.ScriptObject]]c                   s`   t | tr| jS t | tr& jd usJ | j| jj jj	 jj
S t | tr.| jS | S ra   )r   r   r@  r$   r   r6  Zpytyper:  Zxreplacer;  r<  r   Zreal_objr   rL   rC   rD   maybe_to_real_tensork  s   


z;FakeTensorMode._dispatch_impl.<locals>.maybe_to_real_tensor)compute_unbacked_bindingsfree_unbacked_symbolsc                 s  ri  ra   )r@  rn  rC   rC   rD   r|     r}   c                 3  sF    | ]}t |to | ojd uotfddD V  qd S )Nc                 3  s    | ]	}| j jvV  qd S ra   )r   r<  rx   srL   rC   rD   r|         z:FakeTensorMode._dispatch_impl.<locals>.<genexpr>.<genexpr>)r   r   r   r   rh  )rt  rM   symsrC   rD   r|     s    


zpropagate_real_tensors %sc                      g | ]} |qS rC   rC   rh  )rr  rC   rD   r     r  z9real-tensor fallback failed for %s: %s; silently ignoringz,SKIPPED propagate_real_tensors %s(%s, %s) %srY  c                   s   dd l td d fd	d
 
uritjjjs+f	f| 
 nf	f| 
} t| t	s[t
t	s[t
| t

kr[t tt| tt
 nt | 
 j| dd | S )Nr   zmaybe_propagate_real_tensors %sr   r   real_tr   rG   rH   c                   s2  t | trDtdt| t| || _t|  | D ]	\}}|| qt|  | D ]	\}}|| q/| 	 |	  d S t | t
r | rt | jjjrgjd us\J j| jj| d S t | jj }jrt |jjr|jdkrjd usJ j|t| d S d S d S d S d S d S )Nz%maybe_propagate_real_tensors %s -> %sr1   )r   r   r  r!  r  r@  r.  r  r  r  r$   r6  r:  Symbolr   Zset_unbacked_var_to_valr=  lhsrhsr  )r   rz  rv  Zreal_s)rt  gorM   rA  rC   rD   r~    s0   

zOFakeTensorMode._dispatch_impl.<locals>.maybe_propagate_real_tensors.<locals>.goT)peek)r   r   rz  r   rG   rH   )rA  r  r!  rk   r   r  rS  rf  r   r   r   r-   r  r   rd  r   )rY  )
rV  rs  rt  rZ   rW  nil	real_argsreal_kwargsrZ  rM   )r~  rA  rD   maybe_propagate_real_tensors  sB   	
zCFakeTensorMode._dispatch_impl.<locals>.maybe_propagate_real_tensors)
meta_tabler   c                 s  s    | ]}t | V  qd S ra   )r   rn  rC   rC   rD   r|   	  r}   zprims::prim_meta_implZmissing_fake_kernelc                     s   dt  iS )NrK  )rT   rC   r   rC   rD   rO  G	  s   rQ  c                     s    S ra   rC   rC   )ctxrC   rD   rO  T	  s    errorOptional[RuntimeError]r   c                   sH   t jjr	d S sst| d u rt} t | S ra   )rk   r	  r
  Zcan_generate_trivial_fake_implcan_run_unsafe_fallbackr\   run_fallback_kernel)r  )	args_specrm  rZ   has_symbolic_sizesrM   rC   rD   maybe_run_unsafe_fallbacka	  s   z@FakeTensorMode._dispatch_impl.<locals>.maybe_run_unsafe_fallbackz*failed while attempting to run meta for %sr  )r   rE   rG   rq  )rY  rE   rG   rE   ra   )r  r  rG   r   )Yr   rd  _check_for_subclassrg  r!  r   r   r  r  rk   rb  r  Z_to_copyrd  r   r   r   r   r  r   re  ro  r&   cloner  re  r  primsZ
device_put%validate_and_convert_non_fake_tensorsr  Znondeterministic_seededr  r  r   Ztree_map_onlyr   invalidate_written_to_constantsr   rs  rt  r   r  r  library_utilsr  ZMutationCheckerZeroDivisionErrorcheckZcheck_aliasing_constraintr#  r   r<  get_fast_op_implsr   r   r  cpp_meta_supports_symintr   r   Z	decomposer   r  r  stride_incorrect_opr  r  r  Z_custom_ops_profiledataZgeneric_fake_kernelZhas_fake_kernel"inferred_fake_kernel_from_real_outr   r	  Zsimple_registryZ	singletonfind	fake_implZkernelZFakeImplCtxZset_ctx_getterop_implementations_checkshas_metar  rD  r-  r  +wrap_meta_outputs_with_default_device_logic)%rM   rZ   r\  rV  rW  Zhas_unrecognized_typesrj  flat_arg_fake_tensorsZis_lift_funcZ!device_conversion_skip_const_propZconst_flat_argsZ
const_argsZconst_kwargsrt   Zavoiding_device_initZall_constantZflat_outZflat_out_tensorsr   Zreal_flat_argsr  Zmutation_checkerrN  r  Z	fast_implr  r   r:  Zprofilesr  Zmaybe_fake_implZrun_impl_checkZop_implZop_impl_outr  fallbackZnot_implemented_errorrC   )rV  r  rs  rp  r  rm  rt  rZ   r  rW  rr  r  r  r  rZ  rM   rx  rD   r    s  




*



 K

	"
"




P



zFakeTensorMode._dispatch_implZ
debugprimsr  r  ZxlaZvisionZ	torchtextZ
torchaudioZ	quantizedc                 C  s"   | j sdS |j| jv p| dkS )NFzfbgemm::gmm)r  	namespace+_can_run_unsafe_fallback_allowed_namespacesr  rM   rZ   rC   rC   rD   r  	  s
   
z&FakeTensorMode.can_run_unsafe_fallbackrp  r   rm  r  r.   %tuple[list[object], list[FakeTensor]]c                   s6   g d
 fddfddD }|fS )z
        Checks if the list of tensors are fake tensors.
        If not, try to convert them to fake tensors.
        Returns the original args, kwargs, and a flattened list of (args, kwargs) that are fake tensors.
        r   rE   rG   Union[T, FakeTensor]c                   s   t | ts| S | s[tjjjv r&t \}}t	dt
|| tjd u r.jntj}|sTt | trA| jurAt	dt \}}t	dt
|| | }n| }| |S )NzECan't call metadata mutating ops on non-Fake Tensor inputs. Found in zMixing fake modes NYIzuPlease convert all Tensors to FakeTensors first or instantiate FakeTensorMode with 'allow_non_fake_inputs'. Found in )r   r   r  rk   r  r  r  r   re  AssertionErrorr   fake_tensor_tlsr`   r  r   r   r  r   )r   rV  rW  r  rt   )r  rp  r  rm  rZ   rM   rC   rD   validate	  s2   




zFFakeTensorMode.validate_and_convert_non_fake_tensors.<locals>.validatec                   ry  rC   rC   rh  )r  rC   rD   r   	  r  zHFakeTensorMode.validate_and_convert_non_fake_tensors.<locals>.<listcomp>N)r   rE   rG   r  rC   )rM   rZ   rp  rm  r  Zvalidated_argsrC   )r  rp  r  rm  rZ   rM   r  rD   r  	  s    z4FakeTensorMode.validate_and_convert_non_fake_tensorsr:  r   r  r+   c                   s2   j d  dd fdd}t||S )	NFr  rE   rG   r  c                   s   t  ts S d u rt\ }|r-t jk fdd tt	 S d urBr9
 S  p@S  S )Nc                     s   dj  d  S )Nz-FakeTensor is wrapped to wrong device, found z, expected r  rC   )rr  r  rC   rD   rO  	      zZFakeTensorMode.wrap_meta_outputs_with_default_device_logic.<locals>.wrap.<locals>.<lambda>)r   r   r   rv  r  rk   _checkr   r   rE   r  r	  )r  r  rr  rp  r   rm  rZ   ru  rM   r  rD   wrap	  s*   




zHFakeTensorMode.wrap_meta_outputs_with_default_device_logic.<locals>.wrapr  rE   rG   r  )r  r,   )rM   r:  rZ   rm  r   r  rC   r  rD   r  	  s
   
!z:FakeTensorMode.wrap_meta_outputs_with_default_device_logicrz  r{  r  ry  c                C  s   dd l }ddlm} |d u r| j}| jsJ d|  jd7  _|||d}|jjd}| j	d us5J | j	j
| j	j||d||d}|S )Nr   )NestedIntNodez1should only called while FakeTensorMode is activer1   Zintermediate_offsets_or_lengths)valr   )symr   r   )r  Z!torch.nested._internal.nested_intr  r  r  r   r  r   ZEphemeralSourcer   r  Zcreate_symbol)rM   r{  rk   r  r   srcretrC   rC   rD   r|  
  s$   z)FakeTensorMode.create_symbolic_nested_intc                 C  s   t jj|jv r	dS || jv S re   )rk   r  Z	view_copyr  _cpp_meta_supports_symintr  rC   rC   rD   r  ,
  s   
z'FakeTensorMode.cpp_meta_supports_symintr   c                 C  s0   |  tkot| o| | o|jjdk S rA  )ZnumelCONSTANT_NUMEL_LIMITr   r  r   r   r  rC   rC   rD   ro  3
  s   
zFakeTensorMode.may_turn_constr  Sequence[FakeTensor]c                 C  s   t dd |D }t|}|rI| rKt|||dd\}}| D ]+\}	}
|	dks.||	r0|	nd}	| |
rH||	rH|
jd urH| j	|
j q!d S d S d S )Nc                 s  ri  ra   r   rn  rC   rC   rD   r|   B
  r}   zAFakeTensorMode.invalidate_written_to_constants.<locals>.<genexpr>T)rV  rW  Znormalize_to_only_use_kwargsinputrM   )
r   r   Z
is_mutabler    rc   Zhas_argumentr  r   r  r   )rM   rZ   r  rV  rW  Zany_constantZschema_infor   Z
new_kwargskr   rC   rC   rD   r  ;
  s"   

z.FakeTensorMode.invalidate_written_to_constants)r  r   r   r   r   r   r   r   r   r   c                C  sD   | j }|d u r
| j}|r|d u sJ dd }| jj| |||||dS )Nz2cannot set both static_shapes and symbolic_context)r   r   r   r   )r   r  r  r  )rM   r   r  r   r   r   r   rC   rC   rD   r[  Q
  s    	
zFakeTensorMode.from_tensor)r  r   r  r   r   r   r  r_   r   r   rG   rH   rQ   )r   r   rG   r  )rG   r   )rG   rT   r  )rG   r   )r  r  r  r  r  r  rG   rH   )rG   r  )
r  r2   rZ   r;   rV  r^  rW  r_  rG   r  )rZ   r;   rV  r^  rW  r_  rG   rH   )r  r  rV  r  r  r2   rG   rH   )r  r2   ry   r  rZ   r;   rV  r^  rW  r_  r  r   rG   rH   )r  r2   ry   r  rZ   r;   rV  r^  rW  r_  r  r   rG   r  )r  r2   ry   r  rZ   r;   rV  r^  rW  r_  r  r   rG   r  )r  r2   r  r  ry   r  rZ   r;   rV  r^  rG   r   )r  r2   r  r  ry   r  rZ   r;   rV  r^  rG   r+  )r  r+  rZ   r;   r\  r]  rV  r^  rW  r_  rG   rH   )
rZ   r;   r5  r)   r6  r   r7  r   rG   r8  )rZ   r;   rW  r   rX  r   rY  r   rZ  r   rG   r[  )
rZ   r;   r\  r]  rV  r^  rW  r_  rG   r   rZ   r;   rG   r   )
rZ   r;   rp  r   rm  r^  r  r.   rG   r  )
r:  r   rZ   r;   rm  r^  r   r  rG   r+   )r{  r  rG   ry  rt  )
rZ   r;   r  r  rV  r^  rW  r_  rG   rH   )r   r   r  r_   r   r   r   r   r   r   rG   r   )Ir@   rA   rB   r  rW   r  r  r   r  r  r8  r  r  r  rN   r  r  r
  r  r  r/   r   rl  r  r  r  r  r  r  r   r  r  r  r  r  r  r*  r  r  r  rV  rf  r  rh   r  r  r  r  r|  r  r  r  r(  rd  Zas_strided_scatterZ
as_stridedZas_strided_r  detachZview_as_realZview_as_complexr)  Zsource_Storage_storage_offsetZ(_sparse_coo_tensor_with_dims_and_tensorsr  r  Z
lift_freshZlift_fresh_copyr  ro  r  r[  r  rC   rC   rY  rD   r   V  s   
 	

_


	
+
"
*
.
 
<
3
B
)
!
a
L   @


11


rm  r^  r  orig_not_implemented_exceptionrp  c           
        s   t jj|jv r	i t ( d fddfdd|D }t||\}}||i |}W d    n1 s9w   Y  t |D ]}t|t	rVt
|sV| j qCd fd
d}	t|	|S )Nr  rE   rG   Union[T, Tensor]c                   sB     | rtj| | jd}| jr||   | t|< |S | S )Nr  )r  rk   Z
zeros_liker>  r   Z_coalesced_r  r  )r  rt   )r   	inp_implsrC   rD   to_real_tensor
  s   
z+run_fallback_kernel.<locals>.to_real_tensorc                   ry  rC   rC   rh  )r  rC   rD   r   
  r  z'run_fallback_kernel.<locals>.<listcomp>r  c                   sd   t | vrt| trt| s|  jv rt| tr0t | v r)t |  S  j | S | S ra   )r  r   r   r   r   _cdatar  r  r  )r   r  r  storagesrC   rD   map_out
  s   
z$run_fallback_kernel.<locals>.map_out)r  rE   rG   r  r  )rk   r  r  r  r&   r   re  r]  r   r   r   addr   r  r,   )
r   rZ   rm  r  r  rV  rW  r:  r  r  rC   )r   r  r  r  r  rD   r  p
  s"   
	
r  c                   @  s&   e Zd ZdddZ		ddddZdS )FakeCopyModer   r   rG   rH   c                 C  r'  ra   )r   )rM   r   rC   rC   rD   rN   
  rb   zFakeCopyMode.__init__rC   NrZ   r;   r\  r]  rV  r^  rW  Optional[Mapping[str, object]]r   c                 C  s
  |r|ni }|t jjjkr&t|d tsJ || jj|d ddfi |S |tjkrgt	|dkr7t	|dks9J t
t|d }t
tttf |d }t||v rW|t| S | jj|dd}||t|< |S t j  ||i |W  d    S 1 s~w   Y  d S )Nr   T)r     r1   )rk   rl   Z
TensorBaser  r   r   r   r[  __deepcopy__re  r   rf   r  r   r  ZDisableTorchFunctionSubclass)rM   rZ   r\  rV  rW  r   memort   rC   rC   rD   __torch_function__
  s(   
$zFakeCopyMode.__torch_function__)r   r   rG   rH   )rC   N)
rZ   r;   r\  r]  rV  r^  rW  r  rG   r   )r@   rA   rB   rN   r  rC   rC   rC   rD   r  
  s
    
r  rV  c                 C  s>   t | dkrt| d tsJ | d jjrtdS | d jS )Nr1   r   r  )re  r   r   r   r  rk   r   r>  rV  rC   rC   rD   _device_handler
  s   

r  c                 C  s   t dd | D S )Nc                 s  r   ra   )rg  r   rC   rC   rD   r|   
  r   z&_check_for_subclass.<locals>.<genexpr>)r   )rm  rC   rC   rD   r  
  s   r  c                 C  s2   t | t ot | tot| tuot| tjjuS ra   )r   r   r   r   rk   r   r   r   rC   rC   rD   rg  
  s   
rg  c                 C      t dd tt| d  D S )Nc                 s  r   ra   r  ru  rC   rC   rD   r|   
      
<lambda>.<locals>.<genexpr>r   )r  r   r   r  r  rC   rC   rD   rO  
      rO  c                 C  r  )Nc                 s  r   ra   r  ru  rC   rC   rD   r|   
  r  r  r   )r  r   r   r  r  rC   rC   rD   rO  
  r  c                 C  s   t tt| d  S )Nr   )r  r   r   r  r  rC   rC   rD   rO    s    )_device_not_kwarg_ops_is_tensor_constructor_like_tensor_constructorscontains_tensor_typesr  r  r  r  c                  C  s   t d t dtj t dtj tj} | rBt d tdd | D }t|  dd d	D ]\}}t d
|d | d| q0d S d S )NzFakeTensor cache stats:z  cache_hits: %sz  cache_misses: %sz  cache_bypasses:c                 s  r   ra   )re  )rx   r  rC   rC   rD   r|   !  r   z#dump_cache_stats.<locals>.<genexpr>c                 S  s
   | d  S rI   rC   )r  rC   rC   rD   rO  "  s   
 z"dump_cache_stats.<locals>.<lambda>r"  z    %-*s %sr1   rJ  )	r  infor   r  r  r  maxsortedrc   )r  widthr  r   rC   rC   rD   dump_cache_stats  s   

r  r  rK  torch._ops.OpOverloadrZ  torch.Tensorc                   s  dfdd}|  dkr|d|     fd	d
t| D }dg|  }dd
 t| D }|jdd d d}|}|D ]'\}	}
|	|krY|d|j d|  d |||
< ||j|
  }|||
  }qC  tj|||j	|j
|jdW  d    S 1 sw   Y  d S )NrU   rT   rG   rH   c                   s   t d j d|  d)NzQpropagate_real_tensors: we cannot infer a Fake kernel (meta kernel) for operator z	 because z>. Please use torch.library.register_fake to add a Fake kernel.)rp  r#  )rU   )rK  rC   rD   unsupported)  s   z1_infer_fake_from_real_tensor.<locals>.unsupportedr   z'a return has a non-zero storage offset c                   s   g | ]
}t jj jqS rC   )rk   r	  r  Zallocate_sizer   )rx   r   )r  rC   rD   r   >  s    z0_infer_fake_from_real_tensor.<locals>.<listcomp>r  c                 S  s   g | ]\}}||fqS rC   rC   )rx   r  rv  rC   rC   rD   r   K      c                 S  s   | d | d  fS )Nr   r1   rC   r   rC   rC   rD   rO  L  r  z._infer_fake_from_real_tensor.<locals>.<lambda>r"  r1   z(a return was not dense in memory (sizes z	 strides ))r   r   r   )rU   rT   rG   rH   )r  r  r   r  r  sortr  rk   r(  r   r   r   )r  rK  rZ  r  Z
fake_shapeZfake_stridesrF  expectedZfake_striderv  r  rC   r  rK  rD   rT  &  s<   

$rT  r   c                   s^    j d usJ t|\}}tdd |D stdj  fdd|D }t||S )Nc                 s  s    | ]	}t |tjV  qd S ra   )r   rk   r   ra  rC   rC   rD   r|   k  rw  z5inferred_fake_kernel_from_real_out.<locals>.<genexpr>zPpropagate_real_tensors: we don't support operators that return non-Tensors. Got c                   s   g | ]}t  |qS rC   rb  ra  r  rC   rD   r   q  r  z6inferred_fake_kernel_from_real_out.<locals>.<listcomp>)r   r   rd  r   rp  r   re  )r  rK  rZ  Zreal_flat_outspecZfake_flat_outrC   r  rD   r  b  s   r  )rc   rE   rG   rd   )rG   rj   )rs   r   rt   ru   rG   ru   )r   r   rG   r   )r   r   rG   r   )rZ   r;   rG   r   r  )r   r   r   r+   rG   r   )r   r   rG   r   )r   r  rG   rH   )r   r   rG   r  )r   r   rG   r  )r   r   rZ   r;   rm  r^  r  r+   r  rp  rG   r   )rV  r^  rG   r  )rm  r^  rG   r   )r   r   rG   r   rQ   )r  r   rK  r  rZ  r  rG   r  )r  r   rK  r  rZ  r   rG   r   )
__future__r   atexitr&  r  	functoolsr1  r   r  	threadingr  typingr   collectionsr   r   r   r   r   r   r	   r
   r   r   Ztyping_extensionsr   r   r   rk   Ztorch._library.utilsr	  r
  r  r   r   r   r   Ztorch._C._functorchr   r   Z"torch._library.fake_class_registryr   Ztorch._loggingr   Ztorch._prims_commonr   Ztorch._subclasses.meta_utilsr   r   r   r   r   Ztorch._utilsr   Ztorch.fx.immutable_collectionsr   Ztorch.fx.operator_schemasr    Z torch.multiprocessing.reductionsr!   Ztorch.overridesr"   Ztorch.typesr#   r$   Ztorch.utils._backport_slotsr%   Ztorch.utils._mode_utilsr&   Ztorch.utils._python_dispatchr'   r(   Ztorch.utils._pytreer)   r*   r+   r,   r-   r.   Ztorch.utils._statsr/   Ztorch.utils._tracebackr0   Z_fake_tensor_utilsr2   r3   r4   collections.abcr5   r6   r7   r8   r\  r9   Ztorch._guardsr:   Z
torch._opsr;   r   r<   r=   	getLoggerr@   r  Z_loggingZgetArtifactLoggerrg  
ValueErrorr  rT   r?   r  r  ZDimListZ_pytreer   rE   Z_opsrb  r  r  rK   rF   rp  rS   rY   r[   r\   r]   localr^   r  rh   contextmanagerrr   r   r   r   	lru_cacher   r   r   r   r   r  r  r  r  r"  r   r  r  r  r  r  r  r-  r  r  r   r   Z_StoragePointerr  r  r  r  rg  rc  r   rd  r  r  r  rf  r  r  r  r3  Ztorch._subclasses.fake_implsr  r  r  r  r  r  r  r  registerr  rT  r  rC   rC   rC   rD   <module>   s2  ( 



	

	

	

 b

A  ?
+&            "
B
#





(
<