o
    j9:j;                    @  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m	Z	 d dlm
Z
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mZmZ d dlZd dlmZ d d	lmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z( d d
l)m*Z* d dl+m,Z, d dl-m.Z. d dl/m0Z0 d dl1m2Z2 d dl3m4Z4 erd dl5m6Z6m7Z7 d dlm8Z8 d dl9m:Z: d dl;m<Z<m=Z= d dl>m?Z?m@Z@ d dlAmBZB d}ddZCeDZEeddejFZGedZHedejFd ZIed!ejFd"d#ZJd~d&d'ZKdd)d*ZLdd+d,ZMdd0d1ZNeO ZPd2eP_Qedd4d5ZRd2d2d6dd=d>ZSdd@dAZTddDdEZUddFdGZVddHdIZWddMdNZXddQdRZYddTdUZZedVe[Z\edWe[Z]edXe[Z^e^d a_G dYdZ dZZ`ed"d[G d\d] d]Zaed"d[G d^d_ d_eeI Zbed"d[G d`da daebdb Zced"d[G dcdd ddebeI eeI ZdG dedf dfeeeJ ZeG dgdh dhed2diZfG djdk dkeeeJ Zged"d[G dldm dmeeI ZhddqdrZiddsdtZjddydzZkG d{d| d|eeI Zld dlmmnZo dS )    )annotationsN)abstractmethod)AbstractContextManagercontextmanager)	dataclass)AnyClassVarGenericNewTypeProtocolTYPE_CHECKING	TypeGuardTypeVar)override	TypedDictTypeIsUnpack)CreationMeta)_add_batch_dim_unwrap_functional_tensor_wrap_functional_tensorget_unwrappedis_batchedtensoris_functorch_wrapped_tensoris_gradtrackingtensoris_legacy_batchedtensormaybe_get_bdimmaybe_get_levelpeek_interpreter_stack)enable_python_dispatcher)trace_structured)
OpaqueBase)no_dispatch)is_traceable_wrapper_subclass)WeakIdKeyDictionary)Callable	Generator)CInterpreter)Source)
FakeTensorFakeTensorMode)ShapeEnvSymbolicContext)IntLikeTypetobjectreturnTypeIs[FakeTensor]c                 C  s   ddl m} t| |S )Nr   )r)   )torch._subclasses.fake_tensorr)   
isinstance)r.   r)    r4   c/home/nk/hobo-godmode/plappi-mvp/.venv/lib/python3.10/site-packages/torch/_subclasses/meta_utils.py_is_fake_tensor=   s   
r6   _TensorLikeTMetaTensorDesc[Any]_T_TensorT)bound_TensorT_covT)r;   	covariant"MetaTensorDesc[Any] | torch.Tensorboolc                 C  s   z| j W S  ty   Y dS w )NF)is_leafRuntimeErrorr.   r4   r4   r5   safe_is_leafJ   s
   rC   _TensorLikeT | Nonec                 C  s<   t jt jjj | jW  d    S 1 sw   Y  d S N)torch_logginghide_warnings	_internalsafe_grad_filtergradrB   r4   r4   r5   	safe_gradR   s   $rL   c                 C  s   t | }|d u rtd|S )Nz3Expected tensor to have a gradient but grad is None)rL   AssertionError)r.   rK   r4   r4   r5   _expect_safe_gradX   s   rN   abNonec                 C  s   | |krt |  d| d S )Nz != )rM   )rO   rP   r4   r4   r5   	assert_eq_   s   rR   FGenerator[None, None, None]c                  c  s0    t tdd} dt_z	d V  W | t_d S | t_w )Ndisable_inference_modeFT)getattrtlsrT   )priorr4   r4   r5   $disable_inference_mode_for_fake_propk   s   rX   skip_symbolic	skip_leaf Callable[[object, object], None]m1m2torch.TensorrZ   r[   c                  s:   t |tjrt |n|}d	 fdd||S )
Nr]   r8   r^   r_   r0   rQ   c                   s   | j |j  s | j|j  | j|j s  | j|j  | j|j ttdds6 | j|  n | jd  | j|   | j	|	   | j
d ut|d u | j
d ure| j
t| | jr | j|j  | j|   | j|   | j|  d S t| r | j|j  | j|   | j|  d S s | j|   | j|   | j|  | jr| jd u rtd|jd u rtd| j|j d S d S )NrT   Fz*m1.base must not be None for a view tensorz+m2._base must not be None for a view tensor)dtypeshaperequires_gradr@   	is_sparserU   rV   is_inferenceis_conjis_negrK   rL   rN   layout	dense_dim
sparse_dimis_coalescedis_sparse_compressedstridestorage_offsetis_view_is_viewbaserM   _base)r]   r^   rR   gor[   rZ   r4   r5   rs      sF   


zassert_metadata_eq.<locals>.go)r]   r8   r^   r_   r0   rQ   )r3   rF   TensorMetaTensorDescriberdescribe_tensor)rR   r]   r^   rZ   r[   r4   rr   r5   assert_metadata_equ   s   


-rw   TypeGuard[torch.Tensor]c                 C  s   t | tjo| jtju S rE   )r3   rF   rt   rg   
sparse_coorB   r4   r4   r5   is_sparse_coo   s   rz   rg   torch.layoutc                 C  s   | t jt jt jt jhv S rE   )rF   
sparse_csr
sparse_csc
sparse_bsr
sparse_bsc)rg   r4   r4   r5   is_sparse_compressed_layout   s   r   c                 C  s   t | tjo
t| jS rE   )r3   rF   rt   r   rg   rB   r4   r4   r5   rk      s   rk   c                 C  s   t | pt| S rE   )rz   rk   rB   r4   r4   r5   is_sparse_any      r   tytype[_T]objc                 C  s&   t || std|  dt| |S )Nz	expected z	 but got )r3   rM   type)r   r   r4   r4   r5   _checked_cast   s   
r   rp   torch.UntypedStoragec                 C     | j S rE   real_storage)rp   r4   r4   r5   _get_real_storage   s   r   r   c                 C  s
   || _ d S rE   r   )rp   r   r4   r4   r5   _set_real_storage   s   
r   MetaStorageIdMetaTensorId_DescriberIdc                   @  sV   e Zd ZdZddd dd	Zd!ddZd"ddZddd#ddZdddd$ddZdS )%ru   a  
    Given a Tensor/Storage, generate a MetaTensorDesc/MetaStorageDesc
    for it, which is enough information to reconstruct a meta tensor/fake tensor
    corresponding to a Tensor as faithfully as possible.

    This is a stateful conversion object because we keep track of the IDs
    of the tensors/storages passed to us, so we can consistently give
    the same ID when we see the same tensor/storage.
    F	copy_datar   r?   r0   rQ   c                C  sP   t | _tt d a td| _td| _t | _t | _	|| _
t | _t | _d S )N   r   )DESCRIBER_NEXT_IDidr   r   next_tensor_idr   next_storage_idr$   lookup_tensorlookup_storager   settraced_tensorstraced_storagesselfr   r4   r4   r5   __init__   s   

zMetaTensorDescriber.__init__r.   r_   r   c                 C  0   || j vr| j| j |< t| jd | _| j | S Nr   )r   r   r   r   r.   r4   r4   r5   get_tensor_id      

z!MetaTensorDescriber.get_tensor_idsr   r   c                 C  r   r   )r   r   r   r   r   r4   r4   r5   get_storage_id  r   z"MetaTensorDescriber.get_storage_idtracer   MetaStorageDescc                  sZ   t || jr|nd d |r+ jjvr+td fddd j j  S )N)r   sizedatadescribe_storagec                          jS rE   as_jsonr   r4   rr   r4   r5   <lambda>      z6MetaTensorDescriber.describe_storage.<locals>.<lambda>metadata_fn)r   r   r   r   r   r   r    add)r   r   r   r4   r   r5   r   	  s   z$MetaTensorDescriber.describe_storageTrecurser   r   r8   c          $   	     s  t |}| }|j}|j}|j}t|}	t|}
|j}t|}t	|}t
|}t|}d }d}|sNt|sN|r;|	rN|sN|
sN|sNj| |d}| }d }|s^t|s^|rZ|	r^| }d }d }d }|sh|rrjt||d}n9|r|jjdvr| rtd|
st| jt||d}|}ntj }jt|||d}tjj }d }|
rtjj }W d    n1 sw   Y  d }d }d }d }|	r#t |dst!d|" \}}i }i }|D ]9}t#||}| tj$d r  j||d||< n t%d r ddl&m'} ||||< n 	 t!d	t| qt|}dd
l(m)}  t*+|}!t#t,dd}"t-di d.|d|d|"rFdn|/ d|d|j0d|1 d|j2d|d|d|
d|d|d|d|d|3 d|4 dt5|tj6j7d|	d|d || v r| | j89 nd d!|d"|d#|jd$|: d%|d&|d't;t#|d(t< d)t#|d*i d+|jst=|r|> nd d,|jst=|r|? nd d-|jr|@ nd d.|r|jtjAtjBhv rj|C d|d/nd d0|r|jtjAtjBhv rj|D d|d/nd d1|r3|jtjEtjFhv r3j|G d|d/nd d2|rM|jtjEtjFhv rMj|H d|d/nd d3|rbt=|rbj|I d|d/nd d4tJ| }#d uruj|#|dnd d5| rtjjKL|nd d6|d7|s|rtM|nd d8|rtN|nd d9|r| r|jOd urj|jO|dnd d:tjPjQR|d;|!d<|d=|r|nd d>|d?|d@|dA|dB|dCjSr|nd  |r jTjUvrtVdD fdEdFdG jUW jT  S )HNr   r   xlalazyzVCannot safely fakify a view because this process drops the view information right now.__tensor_flatten__z>Traceable wrapper subclass must have __tensor_flatten__ methodr4   )maybe_unwrap_fake_script_objectz#expected Tensor or OpaqueBase, got )_tensor_symint_registryrT   Fr   storagerd   r@   rb   ndimr`   rc   	is_mkldnnis_functorch_wrappedr   r   r   rn   re   rf   is_parameterr#   	is_nested
nested_intis_functionalrg   devicer   rl   rm   dynamo_dynamic_indices_dynamo_dynamic_indicesdynamo_hint_overrides_dynamo_hint_overridesri   rh   rj   crow_indicesr   col_indicesccol_indicesrow_indicesvaluesrK   creation_meta	unwrappedlevelbdimrp   	fake_mode	view_funcattrsopaque_attrsctxr   functorch_stackautograd_meta_fromcurrent_levelr   rv   c                     r   rE   r   r4   r   r4   r5   r     r   z5MetaTensorDescriber.describe_tensor.<locals>.<lambda>r   )XrC   ro   rc   rg   r   r#   r   r   r   r   r   rF   _is_functional_tensorr   r   untyped_storagerm   rl   rv   r   r   r   rA   _sync_from_functional_tensor_C$_functionalization_reapply_views_tlsr   
_functorchr   pyfunctorch#temporarily_clear_interpreter_stackhasattrrM   r   rU   rt   r!   "torch._library.fake_class_registryr   $torch.nested._internal.nested_tensorr   ViewFuncfrom_tensorrV   MetaTensorDescr   rd   rb   dimr`   re   rf   r3   nn	Parameternoder   r   listr   rk   ri   rh   rj   r|   r~   r   r   r}   r   r   r   r   rL   	_autograd_get_creation_metar   r   rq   _subclassesfake_tensormaybe_get_fake_moder   r   r   r    r   )$r   r.   r   r   r@   rn   rc   rg   r   is_traceable_wrapper_subclass_vr   r   is_batchedtensor_vis_legacy_batchedtensor_vis_gradtrackingtensor_vr   r   rm   rl   r   r   r   reapply_viewsmaybe_functorch_stackr   r   r   type_v	raw_attrsattrinnerr   r   r   is_inference_mode_disabledrK   r4   r   r5   rv     s  










 !"#%&')+,27<AFKOQTWZ]^`abcghijlz#MetaTensorDescriber.describe_tensorNr   r?   r0   rQ   )r.   r_   r0   r   )r   r   r0   r   )r   r   r   r?   r0   r   )r.   r_   r   r?   r   r?   r0   r8   )	__name__
__module____qualname____doc__r   r   r   r   rv   r4   r4   r4   r5   ru      s    


ru   )frozenc                   @  s0   e Zd ZU ded< ded< ded< dddZdS )r   r   r   intr   torch.UntypedStorage | Noner   describer_idr   r0   dict[str, object]c                 C  s*   | j |t| jtr| jdS t| jdS )N)r   r
  r   )r   r3   r   r  repr)r   r
  r4   r4   r5   r     s   zMetaStorageDesc.as_jsonNr
  r   r0   r  )r  r  r  __annotations__r   r4   r4   r4   r5   r   
  s
   
 r   c                   @  s.   e Zd Ze		ddd
dZedddZdS )r   Nr.   r:   new_basesymint_visitor_fnCallable[[int], int] | Nonetensor_visitor_fn)Callable[[torch.Tensor], _TensorT] | Noner0   c                 C     d S rE   r4   r   r.   r  r  r  r4   r4   r5   apply  s   zViewFunc.applyr_   ViewFunc[Any]c                 C  s   t | rt S t| jS rE   )r6   _FakeTensorViewFunc_CustomViewFunc_view_func_unsaferB   r4   r4   r5   r   %  s   
zViewFunc.from_tensorNN)
r.   r:   r  r:   r  r  r  r  r0   r:   )r.   r_   r0   r  )r  r  r  r   r  staticmethodr   r4   r4   r4   r5   r     s    r   c                   @  s    e Zd Ze		ddddZdS )r  Nr.   r_   r  r  r  r  +Callable[[torch.Tensor], FakeTensor] | Noner0   r)   c                 C  s   t jjj||||S rE   )rF   r   r   r)   r  r  r4   r4   r5   r  /  s   
z_FakeTensorViewFunc.applyr  )
r.   r_   r  r_   r  r  r  r  r0   r)   )r  r  r  r   r  r4   r4   r4   r5   r  -  s
    r  r)   c                   @  s*   e Zd ZU ded< e		ddddZdS )r  zjCallable[[torch.Tensor, Callable[[int], int] | None, Callable[[torch.Tensor], _TensorT] | None], _TensorT]funcNr.   r_   r  r  r  r  r  r0   r:   c                 C  s   |  |||S rE   )r  r  r4   r4   r5   r  K  s   	z_CustomViewFunc.applyr  )
r.   r_   r  r_   r  r  r  r  r0   r:   )r  r  r  r  r   r  r4   r4   r4   r5   r  @  s   
 	r  c                   @     e Zd Zd
ddZd	S )_MetaTensorCallbackargCallable[[], torch.Tensor]r   torch.device | strr0   r<   c               C  r  rE   r4   )r   r!  r   r4   r4   r5   __call__]  s   z_MetaTensorCallback.__call__N)r!  r"  r   r#  r0   r<   r  r  r  r$  r4   r4   r4   r5   r   \      r   c                   @  s   e Zd ZU ded< dS )_MetaTensorCallbackKwargsr#  r   N)r  r  r  r  r4   r4   r4   r5   r'  b  s   
 r'  )totalc                   @  r  )_MetaTensorCallbackOptDevicer!  r"  kwargs!Unpack[_MetaTensorCallbackKwargs]r0   r<   c                K  r  rE   r4   )r   r!  r*  r4   r4   r5   r$  k  s   z%_MetaTensorCallbackOptDevice.__call__N)r!  r"  r*  r+  r0   r<   r%  r4   r4   r4   r5   r)  j  r&  r)  c                   @  s  e Zd ZU ded< ded< ded< ded< d	ed
< ded< ded< ejZded< dZded< dZded< dZ	ded< dZ
ded< dZded< dZded< dZded< dZded< dZded< dZded< dZded< dZded < dZded!< dZded"< dZded#< dZded$< dZded%< dZd&ed'< d(Zded)< dZd*ed+< dZded,< dZded-< dZd.ed/< dZd0ed1< dZd0ed2< dZ d0ed3< dZ!d0ed4< dZ"d0ed5< dZ#d0ed6< dZ$ded7< dZ%d0ed8< dZ&d9ed:< dZ'd;ed<< dZ(d=ed>< dZ)d0ed?< h d@Z*dAedB< dZ+dCedD< dZ,dEedF< dZ-dGedH< dZ.dIedJ< dZ/dedK< dZ0dedL< dZ1dMedN< dZ2dOedP< dZ3dOedQ< dZdVdWZ4e5d[dXdYZ6dS )\r   r   r   r  r   torch.dtyper`   ztorch.devicer   tuple[int, ...]r   z	list[int]r   zdict[int, int]r   r{   rg   Fr?   rd   r@   rb   rc   r   r   r   r   r   rn   r   Nz
int | Noner   r#   r   re   rf   r   tuple[int, ...] | Nonerl   r   rm   zMetaStorageDesc | Noner   ri   rh   zbool | Nonerj   zMetaTensorDesc[Any] | Noner   r   r   r   r   r   r   rp   z%dict[str, MetaTensorDesc[Any]] | Noner   zdict[str, OpaqueBase] | Noner   zCreationMeta | Noner   rK   >
   r   r   r   r   r   r   r   r   r   r   zClassVar[set[str]]_UNSERIALIZABLEzobject | Noner   ztype | Noner   zFakeTensorMode | Noner   zViewFunc[Any] | Noner   r   r   zlist[CInterpreter] | Noner   torch.Tensor | Noner   r   r
  r   r0   r  c                   s:   d fdd  fdd	t D }|d
|i |S )Nkstrvr/   r0   c                   s    dv rd S  t jv rt|S t|tjtjtjfrt|S t|tjr(t|S t|t	t
fr9 fdd|D S t|tt frC|jS t|trLt|S  dkr^t|tr^dd | D S |S )N)r   r   c                   s   g | ]} |qS r4   r4   ).0v1)jsonr1  r4   r5   
<listcomp>      z8MetaTensorDesc.as_json.<locals>.json.<locals>.<listcomp>r   c                 S  s   i | ]\}}||j qS r4   )r   )r4  k1r5  r4   r4   r5   
<dictcomp>  s    z8MetaTensorDesc.as_json.<locals>.json.<locals>.<dictcomp>)r   r/  r  r3   rF   r   r`   rg   SymInttupler   r   r   r   r2  dictitems)r1  r3  )r6  )r1  r5   r6    s"   

z$MetaTensorDesc.as_json.<locals>.jsonc                   sL   i | ]"}t |j|ju s$|jd krt |jr|j |jt |jqS r   )rU   namedefault)r4  fieldr6  r   r4   r5   r:    s    

z*MetaTensorDesc.as_json.<locals>.<dictcomp>r
  )r1  r2  r3  r/   r0   r/   )dataclassesfieldsupdate)r   r
  r   r4   rC  r5   r     s   zMetaTensorDesc.as_jsonc                 C  r   rE   )r   r   r4   r4   r5   ra   
  s   zMetaTensorDesc.shaper  )r0   r-  )7r  r  r  r  rF   stridedrg   rd   r@   rb   rc   r   r   r   r   r   rn   r   r   r#   r   re   rf   r   rl   rm   r   ri   rh   rj   r   r   r   r   r   r   r   rp   r   r   r   rK   r/  r   r   r   r   r   r   r   r   r   r   propertyra   r4   r4   r4   r5   r   s  st   
 

$r   dstsrcr0  c                 C  s    t |tjur	d S | | d S rE   )r   rF   rt   copy_)rJ  rK  r4   r4   r5   
_safe_copy  s   rM  c                 C  s   t | tjur	d S |  S rE   )r   rF   rt   clone)rK  r4   r4   r5   _safe_clone!  s   rO  symbolic_context5torch.fx.experimental.symbolic_shapes.SymbolicContext	grad_descMetaTensorDesc[torch.Tensor]c                   s   ddl m m} d fd	d
}t|  sdS || |sdS t| |rK|jdu r)dS | j D ]\}}||jvr: dS t| rJ|||j| sJ dS q.dS )a  Check if a symbolic_context is compatible with a grad tensor.

    Returns False when the view base structure in symbolic_context doesn't
    match the grad, which means we need a fresh symbolic context.  This
    happens in FSDP2 where param._local_tensor is a view of an N-D padded
    base while grad._local_tensor is a view of a 1-D flat gradient buffer.

    We check at both the outer level and the inner (subclass attr) level.
    r   )StatelessSymbolicContextSubclassSymbolicContextr   "StatelessSymbolicContext[Any, Any]grad_trS  r0   r?   c                   sf   | j }|jr|d u rdS |js|d urdS |jr1|d ur1t| r1|jd ur1t|j|jjkr1dS dS )NFT)view_base_contextrn   r3   rp   lendynamic_sizesr   )r   rW  vbcrT  r4   r5   _view_base_compatible9  s   
z7_grad_context_compatible.<locals>._view_base_compatibleTFN)r   rV  rW  rS  r0   r?   )%torch.fx.experimental.symbolic_shapesrT  rU  r3   r   inner_contextsr>  )rP  rR  rU  r]  r   	inner_ctxr4   r\  r5   _grad_context_compatible'  s(   




ra  c                   @  s   e Zd ZdddEddZdFd	d
ZdGddZdHddZdIddZdJddZdKddZ	dLd d!Z
edMd#d$Ze	%dNdOd)d*ZedPd+d,ZdQd7d8ZdRd=d>Z	%dNd%d%d%d?d@dSdCdDZd%S )TMetaConverterFr   r   r?   r0   rQ   c                C  sB   t  | _t  | _d| _d| _d | _d| _|| _t	|d| _
d S )Nr   r   )weakrefWeakValueDictionarystorage_memotensor_memohitmissdel_hookarg_cntr   ru   	describerr   r4   r4   r5   r   j  s   zMetaConverter.__init__c                 C  s   | j dko	| jdkS )Nr   )rg  rh  rG  r4   r4   r5   
successful  s   zMetaConverter.successfulr.   r8   r0  c                 C     | j |jd S rE   )rf  getr   r   r4   r4   r5   get_tensor_memo  r   zMetaConverter.get_tensor_memor:   c                 C  s.   | j |jd }|d u rtd|j d|S )NzTensor memo for id z is None)rf  rn  r   rM   )r   r.   r   r4   r4   r5   _checked_get_tensor_memo  s   z&MetaConverter._checked_get_tensor_memor3  c                 C     || j |j< d S rE   )rf  r   )r   r.   r3  r4   r4   r5   set_tensor_memo  r   zMetaConverter.set_tensor_memor   r   r	  c                 C  rm  rE   )re  rn  r   r   r4   r4   r5   get_storage_memo  r   zMetaConverter.get_storage_memor   c                 C  rq  rE   )re  r   )r   r   r3  r4   r4   r5   set_storage_memo  r   zMetaConverter.set_storage_memocallback0Callable[[Callable[[], torch.Tensor]], _TensorT]c              	     s   |    }d u rV| fdd }| jrNt , t   jd u r(tdt| j	  W d    n1 s:w   Y  W d    n1 sIw   Y  | 
 | |S |S )Nc                     s   t j jt jddS Nmetar`   r   )rF   emptyr   uint8r4   r   r4   r5   r     s    z,MetaConverter.meta_storage.<locals>.<lambda>z.s.data must not be None when copy_data is True)rs  r   r   rF   no_gradr"   r   rM   r   rN  rt  )r   r   ru  memor_sr4   r|  r5   meta_storage  s&   

 zMetaConverter.meta_storager_   c                 C  s   t t|S rE   )typingcastr:   )clsr.   r4   r4   r5   _checked_cast_tensor_t  s   z$MetaConverter._checked_cast_tensor_tNr"  r   torch.device | str | Nonec                 C  s   |  | S rE   )r  )r  r.   r   r4   r4   r5   _identity_callable  s   z MetaConverter._identity_callablec                 C  s$   t jjdd}||}tt|S )Nz9Internal error: Tried to backward() through example inputr   )rF   r   
_functionsDelayedErrorr  r  r:   )r  r.   errfnerrr4   r4   r5   _backward_error  s   zMetaConverter._backward_error
outer_sizer.  outer_stride	shape_envShapeEnv | NonerP  <torch.fx.experimental.symbolic_shapes.SymbolicContext | None&_MetaTensorCallbackOptDevice[_TensorT]sourcetorch._guards.Sourcec              
   C  s&  ddl m} ddlm}	 |jd u r| |||||S i }
|j D ]U\}}d }|d urXt||	s9tdt	| ||j
vrFtd|d|j
|  }d urXttjjjj|}|||}tj||jd}| ||j|j||||}||
|< q!|jr|
|j |j	d u rtd|j	|
|j||S )	Nr   
AttrSourcerU  z&Expected SubclassSymbolicContext, got ztensor attr z missing from inner_contextsr   $t.type must not be None for subclass)torch._dynamo.sourcer  r^  rU  r   meta_tensorr>  r3   rM   r   r_  r   rF   fxexperimentalsymbolic_shapesr,   	functoolspartialr   _empty_create_subclassr   rl   r   rF  __tensor_unflatten__r   )r   r.   r  r  r  rP  ru  r  r  rU  inner_tensorsr   meta_tensor_desccurrent_contextcurrent_context_current_sourceinner_callbacknew_empty_tensorr4   r4   r5   r    s`   







	

z$MetaConverter._empty_create_subclass	callback__MetaTensorCallback[_TensorT]Source | NoneSymbolicContext | Nonec           "        s  t j|jdd u rddlm} |dtj d}tj	 
tjjjr-t| jd7  _tj	d ur>	jfd^	fddfd_fdd}fd`	fdddafd#d$	fdbfd&d'}	d u rd( tj jrj}
fd)d*}jrՈjd u rtd+t ) t  t|std,tj|_W d    n1 sw   Y  W d    n1 sw   Y  t|std-|t j! j"rd.|_"j"r|
s#|$ }t%  |t j! W d    n	1 sw   Y  n5t&j'rj}
j'tj(tj)hv r_j*d u r5td/j+d u r?td0j,d u rItd1j-j* j+ }j,j.|d |d2  nd3j'tj/tj(hv rzj0d u rutd4j0j1nj2d u rtd5j2j1fd6d*}jr؈jd u rtd+t + t  t|std,tj|_W d    n	1 sw   Y  W d    n	1 sw   Y  t|std-j"rd.|_"j"r|
s3|}nWj4rj5sdd7l6m7} |d8t8d9g d: n=j9rj}
\
}
fd;d*}jrt X t D j:d u r@td<j;d u rJtd=t|sStd,tj<j:j;j1jd>|_jd u rktd+t=|jj W d    n	1 s}w   Y  W d    n	1 sw   Y  t|std-j"rd.|_"j"r|
s3|}nj>rۈj?rdd7l6m7} |d?t8d9g d: dc 	fd@dA}nrj@rjjAdBvrjBd u rtdCj>rtdDCjB	}#tD|}tEjF| n:j?rjGd u r!tdEd }	rId urIddFlHmI} tJ|s@tdGtA jKd urIjK}	rP	L nt  CjG	tjMjNOdH|}W d    n	1 spw   Y  dddMdN}tjPtjjjQ}tjRtjjjQdO z|j1j1krn+||j1j1r#tS|}n|j1|j1r#tT|}n	#|Uj1}jrt  |	|}W d    n	1 sw   Y  j"|_"n{jGj"j"krt%  |	|}W d    n	1 sw   Y  nXj"stdPt % tV  #|U|j.}W d    n	1 s,w   Y  W d    n	1 s<w   Y  j"|_"t%  |	|}W d    n	1 sZw   Y  jWd u ritdQtjjXY|jW W tjRtjjjQ| ntjRtjjjQ| w j|_Znj}
j[sj\sj>sj]rt^W  d    S \
}j5r
dR}ni
fdSd*}jr)t N t : j:d u rtd<j;d u rtd=t|std,tj<j:j;j1jd>|_t=|jj W d    n	1 sw   Y  W d    n	1 s$w   Y  t|s2td-j"rBj"|_"|
sB3|}j_}|d u rNtdT|j`javr|j4sg|; kr|b |krc||d  jrt|s|td,|jd u rtdUte|d |jd  njf|dV}t }ddWlgmh}mi} ||}|d ur||}t   { | |j||
 W d    n	1 sw   Y  jr-t G t 3 t|std,|jd u rtdUj;d u rtd=|jjtk|jbj:j; W d    n	1 sw   Y  W d    n	1 s(w   Y  W d    n	1 s8w   Y  W d    n	1 sHw   Y  jld urddXlmO} |dY}}	d uryd urytmjlsyjl|	}Cjl	|||_ltjn|jo tjp|jq W d    n	1 sw   Y  j\ojr k} tstt|d.| dZ dd[lHmu}! j_d ur|!j_j:dkr|d vd jwrd.|_xjyd urt|std\|jzj{jyd]|_|}| ~S )eNr  r   )ConstantSource__meta_utils_unknown_tensora   This indicates you set no_dispatch() before calling into this function.  This is an error: we may be creating fake tensors and will perform operations on them which need fake tensor mode to be active.  You will segfault if you are in a no_dispatch() block.r   r.   r8   rK  r  rP  r  r0   Dtuple[tuple[IntLikeType, ...], tuple[IntLikeType, ...], IntLikeType]c              	     s&  ddl m  jd u rtdd urj}t fddjD p2t fddjD p2 j}|d urD|ju rDjjjfS |d urV|sV|d u rVjjjfS t	fddjD }t	fddjD }
j}j|||fd	d
tjD ||jdS jjjfS )Nr   is_symbolict.stride must not be Nonec                 3      | ]} |V  qd S rE   r4   r4  szr  r4   r5   	<genexpr>T      zVMetaConverter.meta_tensor.<locals>.sym_sizes_strides_storage_offset.<locals>.<genexpr>c                 3  r  rE   r4   r4  sdr  r4   r5   r  U  r  c                 3      | ]}  |V  qd S rE   #_maybe_specialize_sym_int_with_hintr  r  r4   r5   r  d  
    
c                 3  r  rE   r  r  r  r4   r5   r  h  r  c                   s   g | ]}| j v qS r4   r?  )r4  drB   r4   r5   r7  s  r8  zWMetaConverter.meta_tensor.<locals>.sym_sizes_strides_storage_offset.<locals>.<listcomp>)rP  hint_overrides)r^  r  rl   rM   r   anyr   rm   r  r<  r  -_create_symbolic_sizes_strides_storage_offsetranger   r   )r.   rK  rP  r   has_symbolict_sizet_stridet_storage_offsetr  )r  r.   r5    sym_sizes_strides_storage_offsetE  sH   

zCMetaConverter.meta_tensor.<locals>.sym_sizes_strides_storage_offsetinner_t	inner_srcr_   c                   s&    | ||\}}}t j||| jddS rw  rF   empty_stridedr`   )r  r  rP  inner_sizesinner_strides_inner_storage_offset)r  r4   r5   empty_create{  s   

z/MetaConverter.meta_tensor.<locals>.empty_creater  tuple[IntLikeType, ...]r  r  torch._guards.Source | Noner:   c              	     s   ddl m} | jd u rtd| jd u rtd|d ur|n| j}|d ur'|n| j}|d ur<t||s<tdt| |d u rDtd| ||| |}|j	|krctd| j d| d	|j	 | |krytd| j d
| d	|  |S )Nr   r  %t.attrs must not be None for subclassr  z.Expected SubclassSymbolicContext or None, got zsource must not be NonezExpected return value from z.__tensor_unflatten__() to have shape equal to z, but got: z/__tensor_unflatten__() to have stride equal to )
r^  rU  r   rM   r   r   rl   r3   r  ra   )r.   r  r  rP  r  rU  sub)ru  r   r  r4   r5   empty_create_subclass  sR   





z8MetaConverter.meta_tensor.<locals>.empty_create_subclassr  5torch.fx.experimental.symbolic_shapes.ShapeEnv | Noneru  r  rQ  c                   s   ddl m} ddlm}m}m} d }| jr)| jd u rtd | j||d||}|j	g| j
 }	| jrq| jd u r<tdi }
| j D ]\}}t|tsUtdt|  |||||||
|< qC||	d g| j
 |
||d}|S ||	d g| j
 |d	}|S )
Nr   r  )
DimDynamicrT  rU  't.base must not be None for view tensorrq   r  zExpected attr to be str, got )rZ  constraint_sizesr_  tensor_sourcerX  )rZ  r  rX  )r  r  r^  r  rT  rU  rn   rp   rM   DYNAMICr   r#   r   r>  r3   r2  r   )r.   r  r  ru  r  r  rT  rU  rX  t_dynamic_sizesr_  r   r   t_symbolic_context)all_dynamic_symbolic_contextr4   r5   r    sL   





z?MetaConverter.meta_tensor.<locals>.all_dynamic_symbolic_contextrp   c              	     s  t   
|	\}}}|js7t| s7  | |||W  d    W  d    S 1 s2w   Y  ddlm  ddlmm} d fdd	}i |jr|j	d u r]t
d
|jd u rft
d|||d}| \}	}
|	D ]}||j	v rt|||j	| j< qufd fdd}|jd u rt
d|j|| ||}t|| | t|| | t|| | |W  d    S 1 sw   Y  d S )Nr   )EphemeralSource)rT  sym_eqr   r  r0   r-   c                   sn   ddl m  d uotot fddjD }|s!d u r#| S d}j| |d d}j|| |dS )Nr   r  c                 3  s    | ]}| j u V  qd S rE   )STATIC)r4  xr  r4   r5   r  N  r  z_MetaConverter.meta_tensor.<locals>.view_from_base.<locals>.symint_visitor_fn.<locals>.<genexpr>r  )positive)hintr  )r^  r  r3   allrZ  create_symbolcreate_symintnode)r   all_static_sizes
sym_sourcesymbol)r  rT  r  rP  r  r5   r  G  s   		zLMetaConverter.meta_tensor.<locals>.view_from_base.<locals>.symint_visitor_fnr  r  r  r  	visited_tr_   r  r  ru  r  c                   s^   | d u rd S j | }|}|d ur|S j | } d}||||||||S )Nr  )rk  r   rn  rv   r  )r  r  ru  
visited_idfake_visited_tvisited_desctemp_source)r  r  real_to_fake_mappingr   r4   r5   r    s"   	
zLMetaConverter.meta_tensor.<locals>.view_from_base.<locals>.tensor_visitor_fnz,t.view_func must not be None for view replay)r   r  r0   r-   )r  r_   r  r  ru  r  r0   r_   )r   r#   r  
as_stridedr  r  r^  rT  r  r   rM   r   r   rU   r   r   r  rF   _checkr   rl   rm   )rp   r.   r  sizesstridesrm   r  r  fake_tr   _r   r  )r  ru  r  maybe_suppressr   r  r  rP  )r  rT  r  r  r5   view_from_base*  sf   



	
+ $z1MetaConverter.meta_tensor.<locals>.view_from_basec                     s$   t jjj j j j jt jddS )Nrx  )r`   rg   r   )	rF   opsaten_sparse_coo_tensor_with_dimsri   rh   r   r`   ry   r4   rB   r4   r5   r     s    z+MetaConverter.meta_tensor.<locals>.<lambda>.t.data must not be None when copy_data is TruezExpected r to be a FakeTensorz)the callback you passed in doesn't detachTz5t.sparse_dim must not be None for sparse block layoutz4t.dense_dim must not be None for sparse block layoutz1t.values must not be None for sparse block layout   r4   z9t.crow_indices must not be None for sparse csr/bsr layoutz9t.ccol_indices must not be None for sparse csc/bsc layoutc                
     s&   t jjjdjj jjddS )Nr   rx  )rg   r`   r   )rF   r  r  #_sparse_compressed_tensor_with_dimsrh   ra   rg   r`   r4   )	blocksizeindex_dtyper.   r4   r5   r     s    )unimplementedz;attempted to apply meta conversion to strided nested tensorzThis is not supported.)gb_typecontextexplanationhintsc                        t j jddS rw  r  r4   r  r  r.   r4   r5   r   K  s    
z.t.size must not be None when copy_data is Truez0t.stride must not be None when copy_data is Truery  z;attempted to apply meta conversion to view functorch tensorc              	     s  j rMjd u rtdjd u rtdjd u rtdj}j}j}tjjj	 
t|||}W d    |S 1 sFw   Y  |S jrƈjd u rYtdjd u rbtdtjj}|  j}W d    n1 syw   Y  j}|kr|}n#tjjj	 
tjj||}W d    n1 sw   Y  j}jrt|rd|_|S jr|sĈ|}|S jrjd u rtdjd u rtdj	}
t|j}|S jd u rtd	j j fd
d}jr^t D t ' tjjjjjd|_ j!d u r.tdt"|j j! W d    n1 s@w   Y  W d    |S W d    |S 1 sYw   Y  |S )Nz.t.unwrapped must not be None for batchedtensorz*t.level must not be None for batchedtensorz)t.bdim must not be None for batchedtensorz3t.unwrapped must not be None for gradtrackingtensorz/t.level must not be None for gradtrackingtensorT2t.unwrapped must not be None for functional tensorz6t.current_level must not be None for functional tensorr  c                     r	  rw  r  r4   r
  r4   r5   r         zDMetaConverter.meta_tensor.<locals>._to_fake_tensor.<locals>.<lambda>ry  r  )#r   r   rM   r   r   rF   r   r   %temporarily_restore_interpreter_stackr   r  r   r   r   _DisableFuncTorch_wrap_for_gradr@   rb   rC   r  r   r   r  r   rl   r   r   r}  r"   r  r`   r   real_tensorr   rM  )r.   ftlvlr   r   disable_functorchr@   )GRAD_TENSOR_SENTINEL_VALUE_to_fake_tensorru  r   r  r  rP  r
  r5   r  y  s   





WW

8

6


!
	*z2MetaConverter.meta_tensor.<locals>._to_fake_tensorr   r  z0Expected non-functorch wrapped functional tensorr  r\  z'Expected StatelessSymbolicContext, got rq   complex_dtyper,  
real_dtyper?   c                 S  s   t | ot | |kS rE   )utilsis_complex_dtypecorresponding_real_dtype)r  r  r4   r4   r5   	is_c_of_r*  s
   
z,MetaConverter.meta_tensor.<locals>.is_c_of_rFz.t.requires_grad must be True for non-leaf viewz0t.creation_meta must not be None for view tensorr  c                     r	  rw  r  r4   r
  r4   r5   r     r  zt.storage must not be Nonez5r.real_tensor must not be None when copy_data is True)ru  )in_kernel_invocation_managerr   r  rK   rY   )guard_or_falsez,Expected r to be a FakeTensor for nested int)nt_tensor_id)r.   r8   rK  r  rP  r  r0   r  )r  r8   r  r  rP  r  r0   r_   )r.   r8   r  r  r  r  rP  r  r  r  r0   r:   )
r.   r8   r  r  r  r  ru  r  r0   rQ  )rp   r:   r.   r8   r  r  r0   r:   r.   r8   r0   r:   )r  r,  r  r,  r0   r?   )r  r  r   r  r  rY  rf  rF   r   _dispatch_tls_local_exclude_sethasDispatchKeyPythonrM   rj  
contextlibnullcontextsuppress_guardsro  inference_moderd   rc   r@   r   r   r}  r"   r6   rO  r  rC   _coalesced_r?   rj   rb   r  rN  enable_gradr   rg   r~   r   ri   rh   r   r   ra   r|   r   r`   r   r  r   r#   torch._dynamo.excr  r2  r   r   rl   r  rM  r   rn   r   r   r   r  _to_functional_tensor_mirror_autograd_meta_tor   rp   r^  rT  r3   rX  ignore_fresh_unbacked_symbols_dynamor  r  &_dispatch_tls_is_dispatch_key_excludedADInplaceOrView'_dispatch_tls_set_dispatch_key_excludedview_as_realview_as_complexviewr   r   r   _set_creation_metafake_devicer   r   r   NotImplementedr   r   re  rm   rt  r   r   r  r2   r  r   set_r   rK   ra  	_set_conjre   _set_negrf   r   rw   rR   r  resize_r   	_is_paramr   r   create_symbolic_nested_intnested_int_memorr  rp  )"r   r.   r  r  r  rP  r  msgr  r  r@   r   	batch_dimr  _storage_offsetr   base_symbolic_contextrT  rp   r  old_excludemidrm   r   r  maybe_fake_mgrr  r   mb_fake_moder  grad_sourcegrad_symbolic_contextr[   r  r4   )r  r  r  r  ru  r  r  r  r   r  r  r  r  r  rP  r.   r5   r    s`  :GX 


 


 



 

	q





 


      
[
 





  

          

zMetaConverter.meta_tensorT)ru  r  rP  r   $_MetaTensorCallback[_TensorT] | Noner   c                  s  |d u r j }n|}t|tjr7|jjdks&|js&| r/|jd ur/|jj	r/  j
d7  _
tS   jd7  _ntj|rF  j
d7  _
tS |S d u rNd} jj||d|rld u r`tdtd fddd	 t *}|tjj  t }	|	d ur|tjj   |||}
W d    n1 sw   Y  t|tjju rd
|
_ t!|ddrd
|
_"t#|dr|j$|
_$|
S )Nr   r   Fr   z*source must not be None when trace is Truedescribe_sourcec                     s    j jjjdS )N)r
  r   r  )rk  r   r@  r4   r   r  t_descr4   r5   r     s   z(MetaConverter.__call__.<locals>.<lambda>r   T
_is_buffer
persistent)%r  r3   rF   rt   r   r   is_quantizedro   rq   rc   rh  r7  rg  	overridesis_tensor_likerk  rv   rM   r    r$  	ExitStackenter_context	_dispatchpythonsuspend_functionalizationr   r   r   r   r  r   r   r<  rU   rM  r   rN  )r   r.   r  ru  r  rP  r   r  
exit_stackstr   r4   rK  r5   r$  j  sb   


zMetaConverter.__call__r  )r0   r?   )r.   r8   r0   r0  r  )r.   r8   r3  r:   r0   rQ   )r   r   r0   r	  )r   r   r3  r   r0   rQ   )r   r   ru  rv  r0   r   )r.   r_   r0   r:   rE   )r.   r"  r   r  r0   r:   )r.   r:   r0   r:   )r.   r8   r  r.  r  r.  r  r  rP  r  ru  r  r  r  r0   r:   )r.   r8   r  r  r  r  r  r  rP  r  r0   r:   )r.   r_   r  r  ru  rI  r  r  rP  r  r   r?   r0   r:   )r  r  r  r   rl  ro  rp  rr  rs  rt  r  classmethodr  r  r  r  r  r$  r4   r4   r4   r5   rb  i  sB    








I        irb  )r.   r/   r0   r1   )r.   r>   r0   r?   )r.   r7   r0   rD   )r.   r7   r0   r7   )rO   r9   rP   r9   r0   rQ   )r0   rS   )rR   r\   r]   r>   r^   r_   rZ   r?   r[   r?   r0   rQ   )r.   r/   r0   rx   )rg   r{   r0   r?   )r   r   r   r/   r0   r9   )rp   r   r0   r   )rp   r   r   r   r0   rQ   )rJ  r_   rK  r0  r0   rQ   )rK  r_   r0   r0  )rP  rQ  rR  rS  r0   r?   )p
__future__r   r$  rD  r  	threadingr  rc  abcr   r   r   r   r   r   r	   r
   r   r   r   r   typing_extensionsr   r   r   r   rF   torch._C._autogradr   torch._C._functorchr   r   r   r   r   r   r   r   r   r   r   torch._dispatch.pythonr   torch._loggingr    torch._opaque_baser!   torch.utils._mode_utilsr"   torch.utils._python_dispatchr#   torch.utils.weakr$   collections.abcr%   r&   r'   torch._guardsr(   r2   r)   r*   r^  r+   r,   torch.typesr-   r6   r   DimListrt   r7   r9   r:   r<   rC   rL   rN   rR   localrV   rT   rX   rw   rz   r   rk   r   r   r   r   r  r   r   r   r   ru   r   r   r  r  r   r'  r)  r   rM  rO  ra  rb  torch._prims_common_prims_commonr  r4   r4   r4   r5   <module>   s    (
4





?









  (	 
(

B          u