o
    Ihj                 
   @  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   Q/var/www/vscode/kcb/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   todo
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   flattened_tensorsall_fake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   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   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   _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   	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_sparse	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   _fix_weakrefr   )rM   r   r   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   	describer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   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   dynamic_dimr   )hintr   )r   r   r   r   rG   r   ),rk   _guardsTracingContexttry_gettensor_to_context%torch.fx.experimental.symbolic_shapesr   r   tensor_sourcer   is_quantizedrS   r   nn	Parameterr   NotImplementedtorch._dynamo.sourcer   r   r   dimr   dtypeint64int32int16int8float64r   r   r   r&   itemmathisnanisinfbasecreate_unspecified_symbolDYNAMICcreate_symintnode	item_memocreate_symfloatnoder   )rM   r   r   r   r   r   r   r   tracing_contextr   
maybe_memor   rt   r   valuer   r   r   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versionhipemptyzerosr)  rC   rC   rD   init_gpu_context  s    r1  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   _meta_in_tls_dispatch_include_DisableTorchDispatch_PreserveDispatchKeyGuard!_set_meta_in_tls_dispatch_include)r   prev_in_kernel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    _should_allow_numbers_as_tensorsnamesplitr   rC   rC   rD   should_allow_numbers_as_tensors  s   rA  c                   @  s   e Zd ZejdddkZdS )FakeTensorConfigTORCH_FAKE_TENSOR_DEBUG01N)r@   rA   rB   osenvironr   debugrC   rC   rC   rD   rB    s    rB  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_intrM  rG   rH   c                C  
   || _ d S ra   )rK  )rM   rM  rC   rC   rD   rN   0  rb   z SymNumberMemoDescriptor.__init__ownerr?  c                 C  s
   || _ d S ra   rJ  )rM   rO  r?  rC   rC   rD   __set_name__3  rb   z$SymNumberMemoDescriptor.__set_name__objr   c                 C  s   d| j  S )Nr   rP  rM   rR  rC   rC   rD   _memo6  ri   zSymNumberMemoDescriptor._memoc                 C     d| j  dS )Nr   _vcrP  rS  rC   rC   rD   _memo_vc9     z SymNumberMemoDescriptor._memo_vcc                 C  rU  )Nr   _epochrP  rS  rC   rC   rD   _memo_epoch@  rX  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   rT  r   rk   r   noder  rK  rW  _versionrZ  r   epochsetattr)rM   rR  r[  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   )	ra  rT  rW  rZ  is_inferencerK  r_  r   r`  )rM   rR  r!  rC   rC   rD   __set__Y  s   zSymNumberMemoDescriptor.__set__)rM  r   rG   rH   )rO  rT   r?  rT   rG   rH   )rR  r   rG   rT   ra   )rR  r   r[  r\  rG   r]  )rR  r   r!  r]  rG   rH   )r@   rA   rB   rW   rN   rQ  rT  rW  rZ  rc  re  rC   rC   rC   rD   rI  &  s   
 



rI  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_tensorTrL  rG   c                 C  s   | j jr	tdS | jS Nr&  )r   r4  rk   r   rf  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  rj  ra   rk  rm  rC   rC   rD   rp    rn  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)dispatch_devicedevice_for_backend_keysr&  )r*  r,  r*  hpur,  mps:z:0)!r   _make_subclassrequires_grad_allow_unsafe_data_ptr_accessrk   rl   _set_throw_on_mutable_data_ptr(_set_warn_deprecated_on_mutable_data_ptrr   r   r   
allow_metar1  _get_privateuse1_backend_nameindexrw   is_initializedcurrent_devicerf  r   r   r   rh  nonzero_memor  unique_memounique_consecutive_memonested_int_memorB  rH  r0   extract_debug_trace)clsr   r   r   r   rh  rM   rC   rC   rD   __new__  sL   	


zFakeTensor.__new__argsr   kwargsc                   s   t    d S ra   )superrN   )rM   r  r  	__class__rC   rD   rN     rX  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   r4  rf  _DISPATCH_META_HANDLERSr   not_implemented_logrH  r  r   arg_tree_leavesrl   _get_dispatch_modern   ro   )
r  rZ   r  r  r  handlerunrecognized_typesr   arg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 r3  )r   r   r   RuntimeError)r   t_is_cpu_zero_dimcommon_devicer  rZ   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   )rA  rk   r   )rZ   r  has_scalar_only_inputsr  r  rC   r  rD   _find_common_deviceM  s   	
"

zFakeTensor._find_common_devicer1   )coeffr  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)r  r   create_symbolic_nested_intr   rk   r   )rM   r  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   ro  )r   ro  rG   rH   )NN)r   r   r   r   r   r%  r   rg  rh  rg  rG   r   )r  r   r  r   rG   rH   )r   r   r   r   rG   r   
rZ   r;   r  r  r  r  r  r  rG   r   )rZ   r;   r  r  rG   r  )r  r  rG   r  )rG   r   ) r@   rA   rB   __doc__rW   rI  r  r  r  r  r  rk   rl   rn   ro   	_mode_keyr(  r   setterrp  staticmethodr  rN   r  classmethodr/   r   r  r  r  r  __classcell__rC   rC   r  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   rw  r	  is_conjis_negrd  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   is_contiguousr  r  r  r  r   rk   r   r  r   untyped_storagenbytesrw  r	  r  r  rd  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_bypassesr`  Fr   r4  static_shapesr   r   zOptional[str]_stackr{  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),logrH  idr  rN   r  torch._dynamo.configtorch._functorch.configr   config"fake_tensor_propagate_real_tensorspropagate_real_tensorsr   fake_tensor_converterr  allow_scalar_outputs(fake_tensor_allow_unsafe_data_ptr_accessrx  fake_tensor_allow_metar{  _dynamofake_tensor_cache_enabledcache_enabled$fake_tensor_cache_crosscheck_enabledcache_crosscheck_enabledr   r4  enter_stackr   	tracebackextract_stack_stack_tracer  rl   rn   ro   r  $torch.nested._internal.nested_tensornested	_internalnested_tensor_tensor_id_counterr  r  )rM   r  r   r   r  r   rk   r  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 )Nrs  )rk   r,  _is_compiledr*  r+  hasattrrs  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  r  r  r  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   r  rn   ro   dispatch	TypeErrorr  	exception)rM   rZ   r  r  r  rC   rC   rD   r    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   _only_lift_cpu_tensors_set_only_lift_cpu_tensorsrm   r  r  r   r  	__enter__rp   )rM   rk   prev_only_lift_cpu_tensorsmaybe_prev_fake_moder  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~   r  __exit__rk   rl   rp   r)  )rM   r-  r/  r1  liver,   maybe_prev_only_lift_cpu_tensorsr  rC   rD   r3    s   
zFakeTensorMode.__exit__c                 C  s   dS re   rC   r  rC   rC   rD   is_infra_mode0  rn  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  r  r  r6  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  r6  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_keycache_on_shape_env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  r  r  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   get_default_dtyperl   _get_default_deviceis_inference_mode_enabledr   settingsr  r  r  )rM   r  rZ   r  r  
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 viewliftzinductor::resize_storage_bytes_znon-builtinCompositeImplicitAutogradN)rk   Tagdata_dependent_outputtagsr  dynamic_output_shapeinplace_viewaten_unsafe_viewr  lift_fnsr?  _libraryutils
is_builtinis_viewrl   %_dispatch_has_kernel_for_dispatch_keyDispatchKeyrN  )rM   rZ   r  r  rC   rC   rD   rA    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  r  r  r  r  rC   rC   rD   r    s6   





z"FakeTensorMode._prep_args_for_hashry   rD  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   r  r  rD  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  rf  ra   rg  ri  rj  rC   rD   r|   (  r}   Fr  r  zdispatch_key_set mismatch)ranger  r  r  rZ  	enumerater  r  r  r  rh  r  r  r  r?  rk   rl   _dispatch_key_setr  )rM   r  ry   rZ   r  r  rD  idxr  idxsr  rE  entry_for_synth_outputsynth_outputsynth_key_setkey_setrC   rj  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.
        Nrc  Frk  c              
     s    g | ]}  |qS rC   )ru  )rx   out_elemr  rZ   ry   r  rM   r  rC   rD   r   l  s    z4FakeTensorMode._make_cache_entry.<locals>.<listcomp>T)r  r  r   r  rb  ru  )
rM   r  ry   rZ   r  r  rD  output_infoout_elementr  rC   rw  rD   rC  K  s:   

z FakeTensorMode._make_cache_entryrE  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   r  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   ri  r|  r  rC   rD   r|     r}   zEFakeTensorMode._get_output_tensor_from_cache_entry.<locals>.<genexpr>c                 3  r}  ra   rC   ri  r~  rC   rD   r|     r}   r&  )r  r   r   rw  T)r!  r  r  r2   rG   rz  ) r  r   r   r  r   r  r  r  r  r  
contextlibnullcontextr   suppress_guardsr;  rk   empty_stridedr  r   rw  r  rl   	_set_conjr  _set_negrZ  r   r  r  r  set_r   )rM   r  rE  ry   rZ   r  inplace_argr  r  r  r  maybe_suppressr/  view_arg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   rx  r  rZ   ry   rM   r  rC   rD   r     s    z;FakeTensorMode._output_from_cache_entry.<locals>.<listcomp>r   )r  r  r  r  )rM   r  rE  ry   rZ   r  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)	rB  	Exceptionr  r   r  r  zipr   r   )
rM   rD  rZ   r  r  r  true_outputrF  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  rH  r  getEffectiveLevelloggingDEBUGrK   rF   _DISPATCH_HANDLE_DIRECTLYr;  r  rG  rB  )rM   rZ   r  r  r  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_tensorsr  r   r  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)compute_hintzmismatch between fake value z and real value r  )r   r   r   r   r^  exprfree_symbols
var_to_valr_  unbacked_var_to_val_maybe_evaluate_staticEqStruer]   r  floatr   )r  r  )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  rw  mismatched_fake_kernelc                        t  jdS NoprU   rT   rU   rC   excrZ   rC   rD   <lambda>Y     z2FakeTensorMode._maybe_infer_fake.<locals>.<lambda>metadata_fnzFReal tensor propagation found a metadata mismatch between fake tensor z and real tensor z,  at outputz, for func: c                     r  r  r  rC   r  rC   rD   r  n  r  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 )r  r   r  r   rG   rH   )r  torch._subclasses.fake_utilsr  r   rk   r   r]   r   r  *generate_fake_kernels_from_real_mismatchesr   _infer_fake_from_real_tensorr*   rm  r  r  )
rM   rZ   r  r  r  r  r  js_fakes_realrC   )r  rZ   rM   r  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_unbackedr  r  c                     s   t d j dS )Nz>Mismatched aliasing spec between fake kernel and real kernel: r  r  rC   r  rC   rD   r    s   
zIFakeTensorMode._maybe_infer_fake_kernel_from_pytree_out.<locals>.<lambda>r  c                   s   t  | S ra   r  r   rZ   rM   rC   rD   r    s    zGReal tensor propagation found an aliasing mismatch between fake output z and real output z,  for func: c                   s$   g | ]\\}}}  |||qS rC   )r  )rx   
_fake_path	_fake_out	_real_outr  rC   rD   r     s    
zKFakeTensorMode._maybe_infer_fake_kernel_from_pytree_out.<locals>.<listcomp>rQ   )r  r  r   r  r  r   tree_flatten_with_pathtree_flattenr]   rk   r   r  r  r   r,   r  r   tree_unflatten)rM   rZ   r  r  r  r  r  r  fake_paths_leaves	fake_specreal_leavesr   fake_leaves	overridesrC   )r  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  r  rL   rC   rD   r     r   c                 s  s    | ]}|j V  qd S ra   )r  )rx   re  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   r  rC   rC   rD   r|     s    

z. should not have fake inputs without constantsc                       g | ]}  |r|jn|qS rC   r  r   r  rL   rC   rD   r   
      Tr   r1   r  Fr   r   c                 s  r  ra   r   rx   rF  rC   rC   rD   r|   C  r}   c                   r  rC   r  r  rL   rC   rD   r   L  r  c                 S  s   g | ]	}t |tr|qS rC   rd  r  rC   rC   rD   r   W  r   c                 3  rf  ra   )may_turn_constr  rL   rC   rD   r|   X  r}   c                   s    j | ddS )NTr  )r$  r   )	converterrM   rC   rD   r  ]  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   rh  r$   r   r^  pytyper  xreplacer  r  r   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  r  ra   )rh  r  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   r  )r  rM   symsrC   rD   r|     s    


zpropagate_real_tensors %sc                      g | ]} |qS rC   rC   r  )r  rC   rD   r     r  z9real-tensor fallback failed for %s: %s; silently ignoringz,SKIPPED propagate_real_tensors %s(%s, %s) %sr  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  rH  r  rh  r  r  r  r  r$   r^  r  Symbolr   set_unbacked_var_to_valr  lhsrhsr  )r   r  r  real_s)r  gorM   r  rC   rD   r    s0   

zOFakeTensorMode._dispatch_impl.<locals>.maybe_propagate_real_tensors.<locals>.goT)peek)r   r   r  r   rG   rH   )r  r  rH  rk   r   r  r  r  r   r   r   r-   r  r   r  r   )r  )
r  r  r  rZ   r  nil	real_argsreal_kwargsr  rM   )r  r  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   r  rC   rC   rD   r|   	  r}   zprims::prim_meta_implmissing_fake_kernelc                     s   dt  iS )Nr  )rT   rC   r   rC   rD   r  G	  s   r  c                     s    S ra   rC   rC   )ctxrC   rD   r  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   rW  rX  can_generate_trivial_fake_implcan_run_unsafe_fallbackr\   run_fallback_kernel)r  )	args_specr  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   r  )r  rE   rG   rE   ra   )r  r  rG   r   )Yr   r  _check_for_subclassr  rH  r  r   r  rV  rk   r  rT  _to_copyr  r   r   r   r   rA  r   r  r  r&   cloner$  r  r   prims
device_put%validate_and_convert_non_fake_tensorsrO  nondeterministic_seededrQ  rS  r   tree_map_onlyr   invalidate_written_to_constantsr  r  r  r   r  r  library_utilsrY  MutationCheckerZeroDivisionErrorcheckcheck_aliasing_constraintrJ  r   r  get_fast_op_implsr   r   r  cpp_meta_supports_symintr   r   	decomposer   r?  r  stride_incorrect_opr  r  r  _custom_ops_profiledatageneric_fake_kernelhas_fake_kernel"inferred_fake_kernel_from_real_outr   rW  simple_registry	singletonfind	fake_implkernelFakeImplCtxset_ctx_getterop_implementations_checkshas_metar;  rl  r  r'  +wrap_meta_outputs_with_default_device_logic)%rM   rZ   r  r  r  has_unrecognized_typesr  flat_arg_fake_tensorsis_lift_func!device_conversion_skip_const_propconst_flat_args
const_argsconst_kwargsrt   avoiding_device_initall_constantflat_outflat_out_tensorsr   real_flat_argsrY  mutation_checkerr  r  	fast_implr  r   rb  profilesr  maybe_fake_implrun_impl_checkop_implop_impl_outr  fallbacknot_implemented_errorrC   )r  r  r  r  r  r  r  rZ   r  r  r  r  r  r  r  rM   r  rD   rB    s  




*



 K

	"
"




P



zFakeTensorMode._dispatch_impl
debugprimsr	  rT  xlavision	torchtext
torchaudio	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_fallbackr  r   r  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   rO  rS  rQ  r   r  AssertionErrorr   fake_tensor_tlsr`   r   r   r   r$  r   )r   r  r  r   rt   )r  r  r(  r  rZ   rM   rC   rD   validate	  s2   




zFFakeTensorMode.validate_and_convert_non_fake_tensors.<locals>.validatec                   r  rC   rC   r  )rI  rC   rD   r   	  r  zHFakeTensorMode.validate_and_convert_non_fake_tensors.<locals>.<listcomp>N)r   rE   rG   rF  rC   )rM   rZ   r  r  r  validated_argsrC   )r  r  r(  r  rZ   rM   rI  rD   r  	  s    z4FakeTensorMode.validate_and_convert_non_fake_tensorsrb  r   r%  r+   c                   s2   j d  dd fdd}t||S )	NFrF  rE   rG   rF  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   )r  rF  rC   rD   r  	      zZFakeTensorMode.wrap_meta_outputs_with_default_device_logic.<locals>.wrap.<locals>.<lambda>)r   r   r   r  r  rk   _checkr   r   rE   r$  r'  )rF  r  r  r  r   r  rZ   r  rM   rF  rD   wrap	  s*   




zHFakeTensorMode.wrap_meta_outputs_with_default_device_logic.<locals>.wraprF  rE   rG   rF  )r  r,   )rM   rb  rZ   r  r   rO  rC   rM  rD   r&  	  s
   
!z:FakeTensorMode.wrap_meta_outputs_with_default_device_logicr  r  r  r  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   intermediate_offsets_or_lengths)valr   )symr  r   )r  !torch.nested._internal.nested_intrQ  r  r  r   r  r   EphemeralSourcer   r  create_symbol)rM   r  rk   rQ  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   rO  	view_copyrQ  _cpp_meta_supports_symintrD  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 ri  )numelCONSTANT_NUMEL_LIMITr   r  r   r   r  rC   rC   rD   r  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  r  ra   r   r  rC   rC   rD   r|   B
  r}   zAFakeTensorMode.invalidate_written_to_constants.<locals>.<genexpr>T)r  r  normalize_to_only_use_kwargsinputrM   )
r   r   
is_mutabler    rc   has_argumentr  r   r  r   )rM   rZ   r(  r  r  any_constantschema_infor   
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/  r0  r1  r2  rG   rH   )rG   r  )
r  r2   rZ   r;   r  r  r  r  rG   r  )rZ   r;   r  r  r  r  rG   rH   )r  r  r  r]  r  r2   rG   rH   )r  r2   ry   r  rZ   r;   r  r  r  r  rD  r   rG   rH   )r  r2   ry   r  rZ   r;   r  r  r  r  rD  r   rG   r  )r  r2   ry   r  rZ   r;   r  r  r  r  rD  r   rG   r  )r  r2   rE  r  ry   r  rZ   r;   r  r  rG   r   )r  r2   rE  r  ry   r  rZ   r;   r  r  rG   r  )rD  r  rZ   r;   r  r  r  r  r  r  rG   rH   )
rZ   r;   r  r)   r  r   r  r   rG   r  )rZ   r;   r  r   r  r   r  r   r  r   rG   r  )
rZ   r;   r  r  r  r  r  r  rG   r   rZ   r;   rG   r   )
rZ   r;   r  r   r  r  r  r.   rG   rE  )
rb  r   rZ   r;   r  r  r   r%  rG   r+   )r  r  rG   r  r  )
rZ   r;   r(  r^  r  r  r  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  r`  r4  r  r  rN   r  r  r(  r   r$  r/   r   r  r*  r3  r  r7  r8  r:  rG  r<  rA  r  rb  ru  rC  r  r?  r@  r%  r  r  rB  rh   rC  r  r  r&  r  rT  r/  r  r  r  as_strided_scatter
as_stridedas_strided_r0  detachview_as_realview_as_complexr  source_Storage_storage_offset(_sparse_coo_tensor_with_dims_and_tensorsr[  r  
lift_freshlift_fresh_copyrV  r  r  r  r  rC   rC   r  rD   r   V  s   
 	

_


	
+
"
*
.
 
<
3
B
)
!
a
L   @


11


r  r  r  orig_not_implemented_exceptionr  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 )NrF  rE   rG   Union[T, Tensor]c                   sB     | rtj| | jd}| jr||   | t|< |S | S )Nr)  )r  rk   
zeros_likerf  r   _coalesced_r  r  )rF  rt   )r   	inp_implsrC   rD   to_real_tensor
  s   
z+run_fallback_kernel.<locals>.to_real_tensorc                   r  rC   rC   r  )rw  rC   rD   r   
  r  z'run_fallback_kernel.<locals>.<listcomp>rF  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$  rN  )r   rv  rr  storagesrC   rD   map_out
  s   
z$run_fallback_kernel.<locals>.map_out)rF  rE   rG   rs  rP  )rk   rO  rS  rQ  r&   r   r  r  r   r   r   addr   rx  r,   )
r   rZ   r  r  rr  r  r  rb  rF  rz  rC   )r   rv  rr  ry  rw  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  rN  ra   )r   )rM   r   rC   rC   rD   rN   
  rb   zFakeCopyMode.__init__rC   NrZ   r;   r  r  r  r  r  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   
TensorBaser  r   r   r   r  __deepcopy__r  r   rf   r  r   r  DisableTorchFunctionSubclass)rM   rZ   r  r  r  r   memort   rC   rC   rD   __torch_function__
  s(   
$zFakeCopyMode.__torch_function__)r   r   rG   rH   )rC   N)
rZ   r;   r  r  r  r  r  r}  rG   r   )r@   rA   rB   rN   r  rC   rC   rC   rD   r|  
  s
    
r|  r  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&  )r  r   r   r   r4  rk   r   rf  r  rC   rC   rD   _device_handler
  s   

r  c                 C  s   t dd | D S )Nc                 s  r   ra   )r  r   rC   rC   rD   r|   
  r   z&_check_for_subclass.<locals>.<genexpr>)r   )r  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   r  
  s   
r  c                 C      t dd tt| d  D S )Nc                 s  r   ra   r  r  rC   rC   rD   r|   
      
<lambda>.<locals>.<genexpr>r   )r  r   r   r  r  rC   rC   rD   r  
      r  c                 C  r  )Nc                 s  r   ra   r  r  rC   rC   rD   r|   
  r  r  r   )r  r   r   r  r  rC   rC   rD   r  
  r  c                 C  s   t tt| d  S )Nr   )r  r   r   r  r  rC   rC   rD   r    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   )r  )rx   rf  rC   rC   rD   r|   !  r   z#dump_cache_stats.<locals>.<genexpr>c                 S  s
   | d  S rI   rC   )re  rC   rC   rD   r  "  s   
 z"dump_cache_stats.<locals>.<lambda>r{  z    %-*s %sr1   ru  )	r  infor   r  r  r  maxsortedrc   )r  widthrf  r   rC   rC   rD   dump_cache_stats  s   

r  r  r  torch._ops.OpOverloadr  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.)r  rJ  )rU   )r  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   rW  r   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   ro  r  rC   rC   rD   r   K      c                 S  s   | d | d  fS )Nr   r1   rC   r   rC   rC   rD   r  L  rK  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  rl  r  rm  r  sortr  rk   r  r   r  r   )r  r  r  r  
fake_shapefake_stridesr  expectedfake_strider  ro  rC   r  r  rD   r  &  s<   

$r  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   r  rC   rC   rD   r|   k  r  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   r  r  r  rC   rD   r   q  r  z6inferred_fake_kernel_from_real_out.<locals>.<listcomp>)r   r   r  r   r  r   r  )r  r  r  real_flat_outspec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   rg  )r   r   r   r+   rG   r   )r   r   rG   r   )r   r%  rG   rH   )r   r   rG   r2  )r   r   rG   r  )r   r   rZ   r;   r  r  r  r+   rr  r  rG   r   )r  r  rG   r%  )r  r  rG   r   )r   r   rG   r   rQ   )r  r   r  r  r  r  rG   r  )r  r   r  r  r  r   rG   r   )
__future__r   atexitr  r  	functoolsr  r  rF  	threadingr  typingr   collectionsr   r   r   r   r   r   r	   r
   r   r   typing_extensionsr   r   r   rk   torch._library.utilsrW  rX  r  r   r   r   r   torch._C._functorchr   r   "torch._library.fake_class_registryr   torch._loggingr   torch._prims_commonr   torch._subclasses.meta_utilsr   r   r   r   r   torch._utilsr   torch.fx.immutable_collectionsr   torch.fx.operator_schemasr     torch.multiprocessing.reductionsr!   torch.overridesr"   torch.typesr#   r$   torch.utils._backport_slotsr%   torch.utils._mode_utilsr&   torch.utils._python_dispatchr'   r(   torch.utils._pytreer)   r*   r+   r,   r-   r.   torch.utils._statsr/   torch.utils._tracebackr0   _fake_tensor_utilsr2   r3   r4   collections.abcr5   r6   r7   r8   r  r9   torch._guardsr:   
torch._opsr;   r  r<   r=   	getLoggerr@   r  _logginggetArtifactLoggerr  
ValueErrorrF  rT   r?   r;  r  DimList_pytreer   rE   _opsr  rT  r]  rK   rF   r  rS   rY   r[   r\   r]   localr^   rH  rh   contextmanagerrr   r   r   r   	lru_cacher   r   r   r   r   r1  r;  rA  rB  rI  r   r  r  r  r  r  r  r  r  r  r   r   _StoragePointerr  r|  r  r  r  r  r   r  r  r  r  r  r  r  r  r  torch._subclasses.fake_implsr  r  r  r  r  r%  r$  r  registerr  r  r  rC   rC   rC   rD   <module>   s2  ( 



	

	

	

 b

A  ?
+&            "
B
#





(
<