
    ^jUE                      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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 d dlmZmZmZ d dlmZ d dlZd dlmc 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/m0Z0 d dl1m2Z2 d dl3m4Z4m5Z5m6Z6m7Z7m8Z8 d dl9m:Z:m;Z; d dl<m=Z= d dl>m?Z? d dl@mAZA d dlBmCZC d dlDmEZEmFZF d dlGmHZH d dlImJZJmKZKmLZL d dlMmNZNmOZOmPZPmQZQmRZRmSZS d dlTmUZU d dlVmWZW ddlXmYZYmZZZm[Z[ er(d dl\m]Z]m^Z^m_Z_m`Z`maZa d dlmbZb d dlcmdZd d d lemfZf d d!lgmhZhmiZi  ej                  ek      Zlej                  j                  ekd"      Zo	 ej                  j                  ekd#      ZpetZuej@                  j                  Zw ed&      Zxej                  j                  j                  Z{dZ|d a} G d' d(ed)*      Z~ ee~j                         Zej                  d|d+       Z G d, d-      Ze G d. d/e             Z G d0 d1e      Ze G d2 d3e             Ze G d4 d5e             Ze G d6 d7e             Ze G d8 d9e             Ze G d: d;e             Z G d< d=e	j                        Z e       Zd}d>Zej"                  d~d?       Zej"                  ddA       Z	 	 	 	 	 	 ddBZddCZddDZej                  ddE       Zej                  ddF       ZddGZddHZ G dI dJ      Zej                  ddK       Zej"                  	 	 	 	 ddL       ZddMZ G dN dO      Z G dP dQ      Z G dR dSe%      ZeeEdTdUf   Z edVW       G dX dY             ZddZZ edVW       G d[ d\             Z G d] d^      Z edVdV_       G d` da             Z edVdV_       G db dc             Z edVdV_       G dd de             Zereez  Z edVdV_       G df dge             Z edVdV_       G dh di             Z G dj d@eK      ZeZ	 	 	 	 	 	 ddkZ	 	 	 	 	 	 	 	 	 	 	 	 ddlZ	 	 	 	 	 	 	 	 ddmZ	 	 	 	 	 	 	 	 ddnZ G do dpeC      ZddqZddrZddsZej                  jr                  jt                  jv                  eej                  j                  jx                  jv                  dt ej                  j                  jz                  jv                  du ej                  j                  j|                  jv                  dv iZ eej                  j                  j                  jv                  ej                  j                  j                  jv                  ej                  j                  j                  jv                  ej                  j                  j                  j                        Zd dwlmZmZmZmZmZmZmZmZ ddxZej                  ddy       Z	 	 	 	 	 	 	 	 ddzZ	 	 	 	 	 	 	 	 dd{Zy# eq$ r-Zrd$ eser      v r ej                  ekd%z         ZpnerY dZr[rdZr[rww xY w)    )annotationsN)defaultdict)	dataclass)AnycastLiteralTYPE_CHECKING	TypeGuardTypeVarUnion)Self	TypedDictUnpack)ReferenceType)SymBoolSymFloatSymIntTensor)is_functorch_wrapped_tensoris_legacy_batchedtensor)FakeScriptObject)MissingOpProfile)dtrace_structured)
OpaqueBase)suggest_memory_format)	assert_eqassert_metadata_eqis_sparse_anyis_sparse_compressedMetaConverter)!_is_privateuse1_backend_availablerender_call)immutable_dict)normalize_function)StorageWeakRef)TorchFunctionMode)IntLikeTypepy_sym_types)no_dispatch)is_traceable_wrapper_subclassTorchDispatchModeTraceableWrapperSubclass)KeyPathkeystrPyTreetree_map	tree_map_TreeSpec)count)CapturedTraceback   )_CacheKeyState_PySymInputStub_SymIntOutputStub)Callable	GeneratorIterableMappingSequence)TracebackType)Source)
OpOverload)ShapeEnvSymbolicContexthierarchical_compilenot_implementedz 'not_implemented' not registeredz.not_implementedTc                      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<   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<   y)"_FakeTensorConstructorIgnoredStateobject_nonzero_memo_nonzero_memo_vc_nonzero_memo_epoch
_item_memo_item_memo_vc_item_memo_epoch_unique_memo_unique_memo_vc_unique_memo_epoch_unique_consecutive_memo_unique_consecutive_memo_vc_unique_consecutive_memo_epoch_nested_int_memo_nested_int_memo_vc_nested_int_memo_epoch_debug_traceN__name__
__module____qualname____annotations__     h/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/torch/_subclasses/fake_tensor.pyrG   rG   Z   sd     $$!''$**""r_   rG   F)totalc                N    | dddddt         j                  j                         fv S )Ncudahpuxpumpsmtia)torch_C_get_privateuse1_backend_name)device_types    r`   _is_indexed_device_typerl   u   s3    ..0  r_   c                      e Zd ZddZddZy)IncrementRecursionCountc                    t         dz  a y Nr5   RECURSION_COUNTselfs    r`   __init__z IncrementRecursionCount.__init__       1r_   c                    t         dz  a y rp   rq   rs   s    r`   __del__zIncrementRecursionCount.__del__   rv   r_   NreturnNone)rZ   r[   r\   ru   rx   r^   r_   r`   rn   rn      s    r_   rn   c                      e Zd ZU ded<   y)UnsupportedFakeTensorExceptionstrreasonNrY   r^   r_   r`   r}   r}          Kr_   r}   c                  0     e Zd Z	 	 	 	 	 	 	 	 d fdZ xZS )FakeTensorDeviceMismatchErrorc                \    || _         || _        || _        t        |   d| d| d       y )NzOExpected all tensors to be on the same device, but found at least two devices, z and !)funccommon_devicedevicesuperru   )rt   r   r   r   	__class__s       r`   ru   z&FakeTensorDeviceMismatchError.__init__   s@     	*%%2O5C	
r_   )r   r@   r   torch.devicer   r   rz   r{   )rZ   r[   r\   ru   __classcell__r   s   @r`   r   r      s3    

 $
 	

 

 
r_   r   c                      e Zd ZU ded<   y)DynamicOutputShapeExceptionr@   r   NrY   r^   r_   r`   r   r          
r_   r   c                      e Zd ZU ded<   y)DataDependentOutputExceptionr@   r   NrY   r^   r_   r`   r   r      r   r_   r   c                      e Zd ZU ded<   y)UnsupportedOperatorExceptionr@   r   NrY   r^   r_   r`   r   r      r   r_   r   c                      e Zd ZU ded<   y)$UnsupportedMutationAliasingExceptionr~   r   NrY   r^   r_   r`   r   r      r   r_   r   c                      e Zd ZU ded<   y)MetadataMismatchErrorr~   r   NrY   r^   r_   r`   r   r      r   r_   r   c                  *    e Zd ZU ded<   ded<   ddZy)FakeTensorTLSbool | Noneallow_non_fake_inputs_overridezweakref.WeakSet[FakeTensor]%non_strict_export_fake_tensor_trackerc                D    d | _         t        j                         | _        y N)r   weakrefWeakSetr   rs   s    r`   ru   zFakeTensorTLS.__init__   s    .2+5<__5F2r_   Nry   )rZ   r[   r\   r]   ru   r^   r_   r`   r   r      s     %0/+FFGr_   r   c                 .    t         j                  | d      S NT)dictfromkeys)itemss    r`   ordered_setr      s    ==%%r_   c               #  *  K   t         j                  j                  t         j                  j                  j                        } 	 |  |  t         j                  j                  |        y y # |  t         j                  j                  |        w w xY wwr   )rh   ri   _unset_dispatch_mode_TorchDispatchModeKeyFAKE_set_dispatch_mode)olds    r`   unset_fake_temporarilyr      sl     
((
'
'(F(F(K(K
LC-	?HH'', 3?HH'', s   ABA, 	#B,$BBFakeTensorModec              #  b   K   | j                   }	 d| _         d  || _         y # || _         w xY ww)NF)cache_enabled)	fake_mode	old_values     r`   disable_fake_tensor_cacher      s1     --I,"'	"+	)	s   /# /	,/c                   | g}|rf|j                         t              s|j                         /j                         \  }}|j	                  fdt        |      D               |rf|S )Nc              3  6   K   | ]  }t        |        y wr   )getattr).0keycurrs     r`   	<genexpr>z$get_plain_tensors.<locals>.<genexpr>   s     G3GD#&Gs   )popr*   append__tensor_flatten__extendreversed)subclassouttodo
inner_keys_r   s        @r`   get_plain_tensorsr      sf     :D
xxz,T2JJt//1
AG(:2FGG  Jr_   c                6   ddl m} t        | t              ryt	        |       rt        |       j                  |       \  }}d }|D ]e  }t        | |      xxt        d x%\   } t        |      }||}-||k7  s3t        d        xt        d x\    N }t        dt        |              |xs dS t        | |      rt        | j                        S t        | t              rht        j                  |       rSt        j                  j!                         }	t        j                  j"                  j%                  | |	      }
t        |
      S t        | t              r?t'        |       r4t        j                  j"                  j)                  |       }
t        |
      S y)Nr   FunctionalTensorTr^   z got mixed fake and real tensors!#expected Tensor or OpaqueBase, got F)#torch._subclasses.functional_tensorr   
isinstance
FakeTensorr*   typer   r   r   is_fakeAssertionErrorr   elemrh   _is_functional_tensorri   $_functionalization_reapply_views_tls
_functorch_unwrap_functional_tensorr   get_unwrapped)xr   attrsr   got_fakeattrvfake
unexpectedreapply_views	unwrappeds              r`   r   r      sg   D!Z $Q'7--a0q $ 	D!T""VX]"1:D'#'!T),-OPP # "Z\ "(=d:>N=OP 	  5 	A'	(qvv	Av	5#>#>q#AEEGHH''AA!]S	y!!	Av	#>q#AHH''55a8	y!!r_   c                .   ddl m} t        | t              r| j                  S t        |       r| j                         \  }}d }|D ]d  }t        | |      xxt        d x$\   } t        |      }||}-||us2t        d        xt        d x\    M }t        dt        |              |S t        | |      rt        | j                        S t        | t              rht        j                  |       rSt        j                   j#                         }	t        j                   j$                  j'                  | |	      }
t        |
      S t        | t              r?t)        |       r4t        j                   j$                  j+                  |       }
t        |
      S y )Nr   r   r^   z&All fake tensor modes must be the samer   )r   r   r   r   r   r*   r   r   r   maybe_get_fake_moder   r   r   r   rh   r   ri   r   r   r   r   r   )tr   inner_tensor_namesr   modet_namer   mr   r   r   s              r`   r   r     sd   D!Z {{$Q' ! 4 4 6A&*( 	F!V$"VX]+A.A| Q,-UVV # "Z\ "(=d:>N=OP 	 	A'	("166**	Av	5#>#>q#AEEGHH''AA!]S	"9--	Av	#>q#AHH''55a8	"9--r_   c                T    t         j                  j                  | j                        S r   )rh   ri   _SchemaInfo_schemar   s    r`   get_schema_infor   <  s    88--r_   c                    ddl m} t        j                  j                  }||    j
                  j                  d      xr ||    j                  t        |      v S )Nr   decomposition_tableztorch._decomp)	torch._decompr   rh   _decompdecompositionsr[   
startswithrZ   dir)r   r   r   s      r`   torch_decomp_decompositionsr   F  sV    1]]11N t$//:: D
d
#
,
,N0C
CDr_   c                p    t         j                  |      }|D cg c]  }t        ||       s| c}S c c}w r   )pytreetree_leavesr   )tytree	flat_valsr   s       r`   tree_flatten_onlyr   S  s/    ""4(I&?T*T2*>D???s   33c                    t        |       t        u xrk | j                  t        j                  k(  xrL | j
                  xs= | j                  xs/ t        |       xs" t        |       xs t        j                  |        S r   )
r   r   layoutrh   strided	is_sparse	is_nestedr   r   r   )r   s    r`   _is_plain_tensorr   X  sx    Q6 	
HH%	
 KK .{{.*1-. 'q). **1-

r_   c                      e Zd ZU e	 	 dd       Zded<   ded<   ded<   ddd	dd
ZddZddZddZ	ddZ
ddZ	 	 ddddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ	 	 d	 	 	 	 	 	 	 	 	 	 	 ddZy) FakeTensorConverterc                .    | j                   j                  S r   )meta_convertertensor_memors   s    r`   r  zFakeTensorConverter.tensor_memok  s     ""...r_   zMetaConverter[FakeTensor]r  z5dict[StorageWeakRef, list[ReferenceType[FakeTensor]]]constant_storage_mappingboolexportF	copy_datar  c               B    t        |      | _        || _        i | _        y )N)r
  )r    r  r  r  )rt   r
  r  s      r`   ru   zFakeTensorConverter.__init__w  s     +i@ )+%r_   c                4   t        |t              r|j                  t        d      t	        |j                  j                               }|| j                  vrg | j                  |<   | j                  |   j                  t        j                  |             y )Nz0fake_tensor must be a FakeTensor with a constant)
r   r   constantr   r%   _typed_storager  r   r   ref)rt   fake_tensorweak_sts      r`   add_constant_storage_mappingz0FakeTensorConverter.add_constant_storage_mapping~  s     +z2k6J6J6R !STT !5!5!D!D!FG
 $77757D))'2%%g.55gkk+6NOr_   c                   t        |t              rt        d      t        |j	                               }|| j
                  vry | j
                  |   D ]#  } |       }||j                          d |_        % | j
                  |= y )Nz(Expected a real tensor, not a FakeTensor)r   r   r   r%   r  r  _fix_weakrefr  )rt   tensorr  weak_tensor_reftens        r`   invalidate_constant_aliasesz/FakeTensorConverter.invalidate_constant_aliases  s    fj) !KLL !6!6!89$777#<<WE 	$O!#C  "#	$ ))'2r_   c                p   t        | j                  j                               D ]  \  }}g }d}|D ]8  } |       }||j                  |j	                  |       |-|j                  }: || j                  |= W|j
                  j                  dk(  r|| j                  |<   | j                  |        y)zFClear non-CPU constants while keeping cheap CPU constants for folding.Ncpu)listr  r   r  r   r   r   r  )rt   r  weak_tensor_refslive_tensor_refsr  r  r  s          r`   clear_non_cpu_constantsz+FakeTensorConverter.clear_non_cpu_constants  s    )-d.K.K.Q.Q.S)T 	;%G%@B&*H#3 ,%';#,,"6 ''8#"||H, 11':%%.9I--g600:#	;r_   c                    | j                   j                  j                  j                  |      }|y | j                  j                  |      S r   )r  	describerlookup_tensorgetr  )rt   r   tids      r`   	_get_memozFakeTensorConverter._get_memo  sC    !!++99==a@;##C((r_   c                    | j                   j                  j                  |      }|| j                   j                  |<   y r   )r  r   get_tensor_idr  )rt   r   r   r#  s       r`   set_tensor_memoz#FakeTensorConverter.set_tensor_memo  s4    !!++99!</0'',r_   NT)sourcesymbolic_contexttracec               D   |s|s~|r|t         j                  j                  j                         x}rR||j                  v rD|j                  |   }ddlm}	 t        ||	      st        dt        |             |j                  }| j                  |      }
|
|
S |j                  rt        d      t        |      t         j                  j                  u r|rt        d      |r|nd 	 	 	 	 	 	 dfd}| j!                  ||||||      }|t"        u rt        d      t        |t         j$                  j&                  j(                        rt        j*                  |j,                        n|}|j.                  rB|j0                  r6|j2                  |j4                  k7  r|j0                  r|j2                  |_        dd	lm} d }| j:                  st=        |      r|j?                         dk(  r|j@                  j                  d
k(  ru|j4                  t         jB                  t         jD                  t         jF                  t         jH                  t         jJ                  fv r|t        ||      s|ddlm&}m'} ddlm(} tS               5  |jU                         }d d d        tW        jX                  |      stW        jZ                  |      st        ||      r|j\                  }n ||      }|j_                  |||j`                  |      }|j4                  t         jB                  k(  r|jc                  |||      |_2        n6|j4                  t         jJ                  k(  r|jg                  |||      |_2        |r| ji                  |       |S # 1 sw Y   xY w)Nr   )StatefulSymbolicContextz&Expected StatefulSymbolicContext, got zquantized nyi in meta tensorsz,make_constant must be False for nn.Parameterc                l    t               5  t         |        |      cd d d        S # 1 sw Y   y xY w)Nr  )r)   r   )make_meta_tr   r  r   s     r`   mk_fake_tensorz<FakeTensorConverter.from_real_tensor.<locals>.mk_fake_tensor  s7      
!M &	
 
 
s   *3)	shape_envcallbackr(  r)  r*  zmeta converter nyi)RandomValueSourcer  )CallMethodItemSourceFloatTensorSource)
DimDynamic)r(  dynamic_dimr)  )hintr(  )r/  zCallable[[], object]r   ztorch.device | strrz   r   )5rh   _guardsTracingContexttry_gettensor_to_context%torch.fx.experimental.symbolic_shapesr,  r   r   r   tensor_sourcer$  is_quantizedr}   nn	Parameterr  NotImplemented_subclassesfunctional_tensorr   _from_functional_tensorr   requires_gradis_leaf
grad_dtypedtypetorch._dynamo.sourcer3  r  r   dimr   int64int32int16int8float64r4  r5  r6  r)   itemmathisnanisinfbasecreate_unspecified_symbolDYNAMICcreate_symintnode	item_memocreate_symfloatnoder  )rt   r   r   make_constantr1  r(  r)  r*  tracing_contextr,  
maybe_memor0  r   inner_tr3  valuer4  r5  r6  item_sourcesymbolr  s    `                   @r`   from_real_tensorz$FakeTensorConverter.from_real_tensor  s5     9"'--">">"F"F"HHH999'6'H'H'K$ &&68OP,DTJZE[D\]  .;;F^^A&
!>>01PQQ7ehh((($%STT%14
	-	7I		, !!#- " 
 . 01EFF !U..@@QQR ))!&&1 	 !!""gmm3$//CN: #1& U[[%++uzz5==QR"$ v'89 %TH !!::e$TZZ->f&78"(++K"6v">K"<<& * 2 2%5	 =  77ekk)$-$?$?"* %@ %CM
 WW-$-$A$A"* %B %CM
 --c2
?! !s   NNc                    |j                   j                  dk7  r#t        d|j                   j                   d      | j                  |      }||S t	        |||||      }| j                  ||       |S )Nmetaz$tensor's device must be `meta`, got z instead)pytypedispatch_keys)r   r   r   r$  r   r'  )rt   r   r   r   re  rf  r]  r   s           r`   from_meta_and_devicez(FakeTensorConverter.from_meta_and_devicel  s}     88==F" 6qxx}}oXN 
 ^^A&
!q&}
 	Q$
r_   )rz   zRweakref.WeakValueDictionary[torch._subclasses.meta_utils.MetaTensorId, FakeTensor])r
  r  r  r  rz   r{   )r  r   rz   r{   )r  r   rz   r{   ry   )r   r   rz   FakeTensor | None)r   r   r   r   rz   r{   )FN)r   r   r   r   r[  r  r1  ShapeEnv | Noner(  Source | Noner)  SymbolicContext | Noner*  r  rz   r   )NN)r   r   r   r   r   r   re  ztype[torch.Tensor] | Nonerf  torch.DispatchKeySet | Nonerz   r   )rZ   r[   r\   propertyr  r]   ru   r  r  r  r$  r'  rb  rg  r^   r_   r`   r  r  j  s   /
/ / .-SSL,1% +P3";*)1 $%)f !%37f!f f 	f
 #f f 1f f 
f\ -159!  	
 * 3 
r_   r  c                    t         j                  j                  d      | j                  k(  rIt         j                  j
                  t        j                  d|       nt        j                  d|        y y )NTr5   r   )rh   acceleratorcurrent_acceleratorr   versionhipemptyzerosro  s    r`   init_gpu_contextrv    sX     ,,T2fkkA }}  ( KK&)Qv.	 Br_   c              #    K   | j                   }t        j                  j                         }||k7  rt	        | d|       t        j                  j                         5  d| _         t        j                  j                         5  t        j                  j                  d       	 d  || _         	 d d d        d d d        y # || _         w xY w# 1 sw Y   xY w# 1 sw Y   y xY ww)N, T)in_kernel_invocationrh   ri   _meta_in_tls_dispatch_includer   _DisableTorchDispatch_PreserveDispatchKeyGuard!_set_meta_in_tls_dispatch_include)r   prev_in_kernelmeta_in_tlss      r`   in_kernel_invocation_managerr    s     
 33N((88:Kn$}B~.>?@@		'	'	) 	@)-	& XX//1 	@HH66t<@1?	.	@		@ 	@ 2@	.	@ 	@		@ 	@sN   AC( &C C'C+C3C;	C(	CCC	CC%!C(c                    t         j                  j                  | j                         j	                  d      d   j	                  d      d         S )Nz::.r   )rh   ri    _should_allow_numbers_as_tensorsnamesplitr   s    r`   should_allow_numbers_as_tensorsr    sB    8844		$#))#.q1 r_   c                  J    e Zd Zej                  j                  dd      dk(  Zy)FakeTensorConfigTORCH_FAKE_TENSOR_DEBUG01N)rZ   r[   r\   osenvironr"  debugr^   r_   r`   r  r    s    JJNN4c:cAEr_   r  c                  z    e Zd ZU ded<   ded<   ddddZddZdd	Zdd
ZddZ	 d	 	 	 	 	 ddZ		 	 	 	 	 	 ddZ
y)SymNumberMemoDescriptorr~   _namer  _is_nested_intFis_nested_intc                   || _         y r   )r  )rt   r  s     r`   ru   z SymNumberMemoDescriptor.__init__  s
    +r_   c                    || _         y r   r  )rt   ownerr  s      r`   __set_name__z$SymNumberMemoDescriptor.__set_name__  s	    
r_   c                     d| j                    S )Nr   r  rt   objs     r`   _memozSymNumberMemoDescriptor._memo  s    4::,r_   c                "    d| j                    dS )Nr   _vcr  r  s     r`   _memo_vcz SymNumberMemoDescriptor._memo_vc  s    4::,c""r_   c                "    d| j                    dS )Nr   _epochr  r  s     r`   _memo_epochz#SymNumberMemoDescriptor._memo_epoch  s    4::,f%%r_   Nc                   t        || j                  |            x}y t        |t        j                        r|j
                  j                  |S | j                  s(t        || j                  |            |j                  k7  s>| j                  sOt        || j                  |            |j                  j                  k7  rt        || j                  |      d        y |S r   )r   r  r   rh   r   noder8  r  r  _versionr  r   epochsetattr)rt   r  objtypers       r`   __get__zSymNumberMemoDescriptor.__get__  s     djjo..A7 a(QVV[[-DH
 ##T]]35G(HCLL(X##T--c23s}}7J7JJCC$/r_   c                   |Ut        || j                  |      d        t        || j                  |      d        t        || j                  |      d        y |j	                         r| j
                  rt        || j                  |      |       | j
                  s&t        || j                  |      |j                         t        || j                  |      |j                  j                         y y r   )	r  r  r  r  is_inferencer  r  r   r  )rt   r  r_  s      r`   __set__zSymNumberMemoDescriptor.__set__  s    
 =CC$/Cs+T2C))#.5!!#t':':CC%0&&T]]3/>C))#.0C0CD	 (;r_   )r  r  rz   r{   )r  r~   r  r~   rz   r{   )r  r   rz   r~   r   )r  r   r  ztype[FakeTensor] | Nonerz   z$torch.SymInt | torch.SymFloat | None)r  r   r_  zBtorch.SymInt | torch.SymFloat | torch.SymBool | int | float | Nonerz   r{   )rZ   r[   r\   r]   ru   r  r  r  r  r  r  r^   r_   r`   r  r    su    J 05 , #& CG(?	-,EE RE 
	Er_   r  c                  |    e Zd ZU dZded<   ded<   ded<   ded<    e       Zd	ed
<    e       Z e       Zd	ed<    e       Z	d	ed<    ed      Z
ded<   ded<   ej                  j                  j                  Zed%d       Zej$                  d&d       Zed%d       Zej$                  d'd       Zed(d       Ze	 	 	 	 	 	 	 d)dddddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d*d       Zd+ fdZed,d       Zeed e       f	 	 	 	 	 	 	 	 	 d-d              Ze	 	 	 	 	 	 d.d        Zd!d"	 	 	 d/d#Zd0d$Z xZ S )1r   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   Tensor | Noner  real_tensorz$SymNumberMemoDescriptor | int | Nonenonzero_memounique_memounique_consecutive_memoTr  type[Tensor] | Nonere  rl  rf  c                p    | j                   j                  rt        j                  d      S | j                  S Nrd  )r   ry  rh   r   fake_devicers   s    r`   r   zFakeTensor.device&  s,     >>..<<''###r_   c                    t         r   )NotImplementedError)rt   r   s     r`   r   zFakeTensor.device.  s    !!r_   c                    | j                   S r   )r  rs   s    r`   r  zFakeTensor.fake_device2  s       r_   c                0    | j                  |      | _        y r   )_normalize_fake_devicer  )rt   r   s     r`   r  zFakeTensor.fake_device6  s     77?r_   c                   | j                   dv rt        |        t        | j                         r| j                  | j                   dk7  rtt	        t
        | j                         j                         rLt        j                  | j                    dt	        t
        | j                         j                                } | S t        j                  | j                    d      } | S )zFNormalize device by initializing GPU context and setting device index.)rc   re   rf   :z:0)	r   rv  rl   indexr   rh   is_initializedr   current_devicero  s    r`   r  z!FakeTensor._normalize_fake_deviceI  s     ;;/)V$"6;;/FLL4H{{e#v{{(C(R(R(T{{m1WUFKK%@%O%O%Q$RS
  R&89r_   NF)r   r  r  rF  	_is_paramc                  t        t        t        t        f   |      }t        D ]  }|j                  |d         |r"t        t        |            }t        d|      t        |t              r|||urt        d      |}nE|6t        |t              st        dt        |             |t        d      |}|t        d      |t        d      d|fd|	fd	|
ffD cg c]1  \  }}|*|t        j                  t        j                   |            f3 }}}|r4|d
   \  }}|dd  D ]!  \  }}||k7  st#        d| d| d| d|        |}nt        d      t        j$                  | |||j&                  n|d|      }|j(                  s t        j*                  j-                  |       nt        j*                  j/                  |       |j                   j                  dk7  r"t1        d|j                   j                         |j2                  s|j                  dk(  rt1        d      ||_        ||_        ||_        ||_        ||_        t        |t              rt1        d      ||_        d |_         d |_!        d |_"        d |_#        d |_$        |r||_%        tL        jN                  rtQ        jR                         |_*        |S c c}}w )Nz8FakeTensor.__new__() got an unexpected keyword argument z5FakeTensor.__new__() got conflicting fake_mode valueszTFakeTensor.__new__() expected a FakeTensorMode or Tensor as the first argument, got zYFakeTensor.__new__() expected either (fake_mode, elem, ...) or (elem, fake_mode=..., ...)z;FakeTensor.__new__() missing required argument: 'fake_mode'z6FakeTensor.__new__() missing required argument: 'elem'r   r  r  r   r5   z4FakeTensor.__new__() got conflicting device values: =rx  zKFakeTensor.__new__() missing required argument: 'device' (or 'fake_device')T)dispatch_devicedevice_for_backend_keysrd  z%elem.device.type must be 'meta', got z7device.type must not be 'meta' when allow_meta is Falsez$real_tensor must not be a FakeTensor)+r   r   r~   rH   ,_FAKE_TENSOR_CONSTRUCTOR_IGNORED_STATE_ATTRSr   nextiter	TypeErrorr   r   r   r   r   r  rh   r   
ValueError_make_subclassrF  _allow_unsafe_data_ptr_accessri   _set_throw_on_mutable_data_ptr(_set_warn_deprecated_on_mutable_data_ptrr   
allow_metar  r   r  re  rf  r  r  rY  r  r  nested_int_memor  r  r  r4   extractrX   )clsfake_mode_or_elemr   r   r  r  re  rf  r   r  r  rF  r  state
state_dict	attr_namer   r  r_  specified_devices
first_nameresolved_devicecandidate_devicert   s                           r`   __new__zFakeTensor.__new__X  sD   $ $sF{+U3
E 	,INN9d+	,d:./JJ." 
 '8$:K)K WXX)I !,!"3V<#66:;L6M5NP  ##O  ) Q  <TUU
 6",. 
e
   :44U\\%5HIJ
 
 *;A*>'J*;AB*? &&"&66$N%,a'84&BRASU  %F. 
 $$"/"7D] $*
 66HH33D9HH==dC;;v% 78H8H7IJ  ##{{f$$M  "" *k:. !GHH& '+$#&DN!! 1 9 9 ;DO
s   #6Kc                    t         |           t        j                  j	                         rEt        j
                  j                  j                  r t        j                  j                  |        y y y r   )r   ru   rh   compileris_exporting_exportconfig#detect_non_strict_fake_tensor_leaksfake_tensor_tlsr   add)rt   argskwargsr   s      r`   ru   zFakeTensor.__init__  sP    NN'')$$HHAAEEdK I *r_   c                $    |j                  |       S r   )from_tensor)r   r   s     r`   r  zFakeTensor.from_tensor  s    $$Q''r_   r^   c                   |t         j                  j                  j                  j                  u rit        |      dk7  st        |d   t              st        d      |d   j                  j                  rt        j                  d      S |d   j                  S t        j                  |      x}r ||      S |D cg c]  }t        |t              r|t        us|  }}|rt         j#                  d|       t$        S d }t'        j(                  |i |D ]   }	t        |	t              s|	j                  } n |t        d      t         j*                  j-                  t         j*                  j.                  j0                        }
|
rt         j#                  d||
       t$        S |j                  rt        d      |5   ||i |cd d d        S c c}w # 1 sw Y   y xY w)	Nr5   r   z@Expected exactly one FakeTensor argument for prim.device.defaultrd  z(FakeTensor unrecognized subclass(es): %sz,Could not find a FakeTensor in the argumentsz(FakeTensor mode already active: %s in %sz,fake_mode.in_kernel_invocation must be False)rh   opsprimr   defaultlenr   r   r   r   ry  r  _DISPATCH_META_HANDLERSr"  
issubclassr   not_implemented_logr  rB  r   arg_tree_leavesri   _get_dispatch_moder   r   )r  r   typesr  r  handlerr   unrecognized_typesr   argmaybe_cur_fake_modes              r`   __torch_dispatch__zFakeTensor.__torch_dispatch__  s    599>>((0004yA~ZQ%D$V  Aw  55||F++Aw*** .11$77774=  
Jq*$=!6/A
 
 %%:<N "!	))4:6: 	C#z*MM		
  !OPP $hh99HH**//
 %%:#
 "!)) !OPP 	)((	) 	)O
N	) 	)s   =GGG GG c           
        	
 d d}d t        t        j                  j                        t        t        j                  j
                        t        t        j                  j                        d	d	d	d
d
	fdd 	
f	d}|D ]
  } ||        t               rd}t        j                  d      t        d        |fS )NFc                     | j                   dk(  S )Nr  r   ro  s    r`   is_device_cpuz5FakeTensor._find_common_device.<locals>.is_device_cpuc  s    ;;%''r_   c                     | j                   dk(  S r  r  ro  s    r`   is_device_metaz6FakeTensor._find_common_device.<locals>.is_device_metaf  s    ;;&((r_   c                R     | j                         xr | j                         dk(  S Nr   )r   rK  )r   r  s    r`   cpu_zero_dimz4FakeTensor._find_common_device.<locals>.cpu_zero_dimi  s!     *;quuw!|;r_   c                R  	 t        | t              sy | j                   |       
y  |       }| j                  k(  r
r|
y 	v }|r|sy 
r|s| j                  |
y 	v r"t        t	        | j                  f            ry 	v r"t        t	        | j                  f            ry t
        j                  j                  j                  }|>|j                  v }|| j                  j                  v }|s|r| j                  |
y |r|sy t        	| j                        r   )r   r   r   anymaprh   r   r  fake_tensor_prefer_device_typer   r   )r   t_is_cpu_zero_dim&is_bypass_zero_dim_cpu_tensor_check_opprefer_device_typecommon_has_preferredt_has_preferred$bypass_zero_dim_cpu_tensor_check_opsr   r  r   is_cpu_zero_dimr  r  meta_rhs_mixed_device_fnsmixed_device_fnss         r`   merge_devicesz5FakeTensor._find_common_device.<locals>.merge_devicesl  sB    a,$ !".q/ ,Qxx=("&7O << 3 !)O 'M !"3 ''s==!((*CDE00s>M188+DEF "'!1!1!8!8!W!W!-'9]=O=O'O$"4"E+$%HHM&7O)/ 0mQXXNNr_   Tr  z!Could not find common device for )r   r   rz   r  r   r   rz   r  )r   rH   rz   r{   )r   aten_foreach_copyr  add_r   	nextafterr  rh   r   r   )r   	flat_argshas_scalar_only_inputsr  r  r  r   r  r  r  r  r  r  s   `    @@@@@@@@r`   _find_common_devicezFakeTensor._find_common_deviceF  s     !& '&&
 %0II%
!
 0;NN""0
,	(	)	<=	O =	O~  	C#	 +40]5J%)"!LL/M  #DTF!KLL444r_   r5   )coeffc                  | j                   !| j                  j                  d       | _         t        | j                   t        j
                        s!t        dt        | j                                | j                   |z  S )Nnt_tensor_idz1Expected nested_int_memo to be torch.SymInt, got )r  r   create_symbolic_nested_intr   rh   r   r   r   )rt   r  s     r`   get_nested_intzFakeTensor.get_nested_int  s|    
 '#'>>#L#L! $M $D  $..= CDI]I]D^C_`  ##e++r_   c                    | j                         dk(  r| j                         S | j                         dk(  r| D cg c]  }|j                          c}S | D cg c]  }|j                          c}S c c}w c c}w Nr   r5   )rK  rQ  tolist)rt   r   s     r`   r#  zFakeTensor.tolist  s^    88:?99;XXZ1_,01DDIIK11.23dDKKM33 23s   A3A8)rz   r   )r   r   rz   r{   r   r   rz   r{   )r   r   rz   r   )NNNNNNN)r  zFakeTensorMode | Tensor | Noner   r  r   torch.device | str | Noner  r  r  r  re  r  rf  rl  r   FakeTensorMode | Noner  r%  r  r%  rF  r   r  r  r  z*Unpack[_FakeTensorConstructorIgnoredState]rz   r   )r  rH   r  rH   rz   r{   )r   r   r   r   rz   r   
r   r@   r  Sequence[type]r  Sequence[object]r  Mapping[str, object]rz   rH   )r   r@   r  r)  rz   ztuple[torch.device, bool])r  zint | torch.SymIntrz   ztorch.SymInt)rz   r   )!rZ   r[   r\   __doc__r]   r  r  rY  r  r  r  rh   ri   r   r   	_mode_keyrm  r   setterr  staticmethodr  r  ru   r  classmethodr3   r#   r  r  r   r#  r   r   s   @r`   r   r     s    
 :Q9RL6R')I8O8QK5Q! A  .DAO
  .. ..33I$ $ ]]" " ! ! @ @$    =A",0"&%)&*59} ,01526%)}9} } *	}
  } #} $} 3} )} /} 0} #} } <}  
!} }bL ( ( 

 "$'5'7L)L) L) 	L)
 %L) 
L)  L)\ r5r5%5r5	"r5 r5n %&, ", 
	, 4r_   r   r7   r8   T)slotsc                      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Zy) TensorMetadatazK
    The Tensor metadata relevant to hashing FakeTensors when caching.
    ztorch.dtyperI  ztuple[_MetadataIntLike, ...]shapestrider   r   ztorch.layoutr   ztorch.memory_format | Nonememory_format_MetadataIntLikestorage_offsetz_MetadataIntLike | Nonestorage_bytesr  rF  r?  is_conjis_negr  r   r   is_coalesced
int | None	dense_dim
sparse_dimc                d   t        j                  |       D ]  }t        | |j                        }t	        |t
        t        t        j                  f      r'g }|j                  ||||       |j                          et	        |t              r|j                  ||       |j                  |        y r   )dataclassesfieldsr   r  r   tupler  rh   Size_prep_args_for_hashclearr   convert_sym_intr   )rt   resultr   r  fieldr_  id_hashed_objectss          r`   _flatten_intozTensorMetadata._flatten_into  s     !''- 	%ED%**-E%%uzz!:; 35!((?PQ!'')E6*%%fe4e$	%r_   N)rG  list[object]r   r   r  r6   rz   r{   )rZ   r[   r\   r+  r]   rJ  r^   r_   r`   r2  r2    s     ''((--$$**MLO%% % 	%
 
%r_   r2  c                   t        |       }| j                  st        |       s| j                  |      sd}| j	                         }t        | j                  | j                  | j                  t        j                  k(  r| j                         nd| j                  | j                  ||t        |       s| j                         j                         nd| j                  | j                   | j#                         | j%                         | j'                         | j(                  | j(                  r| j+                         ndt        |       r| j-                         ndt        |       r| j/                               S d      S )z1
    Extract the TensorMetadata of a tensor.
    )r5  Nr^   )r   _has_symbolic_sizes_stridesr   is_contiguousr7  r2  rI  r3  r   rh   r   r4  r   untyped_storagenbytesrF  r?  r9  r:  r  r   r;  r=  r>  )r   r5  r7  s      r`   extract_tensor_metadatarQ    s    *!,M 	
%%];%%'N		hh%--/
R		,9!,<""$$						
		KKT&q)t'*% $ 15% r_   c                  F    e Zd ZU dZded<   ded<   ddZddZddZdd	Zy
)_DispatchCacheKeyz0
    Key for the FakeTensor dispatch cache.
    tuple[object, ...]r   int	hashvaluec                2    || _         t        |      | _        y r   )r   hashrV  )rt   tups     r`   ru   z_DispatchCacheKey.__init__4  s    cr_   c                X    t        |t              xr | j                  |j                  k(  S r   )r   rS  r   )rt   others     r`   __eq__z_DispatchCacheKey.__eq__8  s"    %!23MEII8MMr_   c                    | j                   S r   )rV  rs   s    r`   __hash__z_DispatchCacheKey.__hash__;  s    ~~r_   c                h    | j                   D ]#  }t        |t              s|j                          % y r   )r   r   r7   strip_shape_env)rt   r   s     r`   r`  z!_DispatchCacheKey.strip_shape_env>  s-      	$A!_-!!#	$r_   N)rY  rT  rz   r{   )r[  rH   rz   r  )rz   rU  ry   )	rZ   r[   r\   r+  r]   ru   r\  r^  r`  r^   r_   r`   rS  rS  +  s)     
N#N$r_   rS  c                      e Zd Zy)SingletonConstantN)rZ   r[   r\   r^   r_   r`   rb  rb  H  s    r_   rb  )frozenr0  c                  >    e Zd ZU dZded<   ded<   ded<   eZded<   y	)
_DispatchCacheEntryOutputInfoa  
    Entry type for the FakeTensor dispatch cache for an output. Accounts for three
    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.
    3) if the tensor related fields are None, then it is a constant value (e.g.
    None or integer)
    r<  inplace_idxzTensorMetadata | Nonemetadataview_idxz
Any | Noneconstant_valueN)rZ   r[   r\   r+  r]   rb  ri  r^   r_   r`   re  re  L  s%    	 ##!2NJ2r_   re  c                  *    e Zd ZU dZded<   dZded<   y)_DispatchCacheValidEntryz
    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)rZ   r[   r\   r+  r]   rm  r^   r_   r`   rk  rk  _  s     76!OT!r_   rk  c                      e Zd ZU dZded<   y)_DispatchCacheBypassEntryz0
    Entry type for a negative cache entry.
    r~   r   NrZ   r[   r\   r+  r]   r^   r_   r`   ro  ro  m       Kr_   ro  c                      e Zd ZU dZded<   y)_BypassDispatchCachez<
    Signals cases that should skip FakeTensor caching.
    r~   r   Nrp  r^   r_   r`   rs  rs  z  rq  r_   rs  c                  :    e Zd ZU dZded<   ded<   ded<   ded<   y)	DispatchCacheInfozG
    Information about the state of the FakeTensor dispatch cache.
    rU  hitsmissesdict[str, int]bypassessizeNrp  r^   r_   r`   ru  ru    s     IK
Ir_   ru  c                      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	 	 	 	 	 	 	 	 	 	 	 dE fdZdFdZdGdZedHd       ZedId       Zed e       f	 	 	 	 	 	 	 	 	 dJd       ZdK fd Z	 	 	 	 	 	 	 	 dL fd!ZedHd"       ZedMd#       ZedFd$       Z	 	 	 	 	 	 	 	 	 	 dJd%Z	 	 	 	 	 	 	 	 	 	 dNd&Z	 	 	 	 	 	 	 	 dOd'Z	 	 	 	 	 	 	 	 	 	 dPd(Z 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dQd)Z!	 	 	 	 	 	 	 	 	 	 	 	 	 	 dRd*Z"	 	 	 	 	 	 	 	 	 	 	 	 	 	 dSd+Z#	 	 	 	 	 	 	 	 	 	 	 	 dTd,Z$	 	 	 	 	 	 	 	 	 	 	 	 dUd-Z%	 	 	 	 	 	 	 	 	 	 	 	 dVd.Z&d e       f	 	 	 	 	 	 	 	 	 dJd/Z'	 	 	 	 	 	 	 	 	 	 dWd0Z(	 	 	 	 	 	 	 	 	 	 	 	 dXd1Z)	 	 	 	 	 	 	 	 	 	 dYd2Z* e+d3d4d5d6d7d8d9d:      Z,dZd;Z-	 	 	 	 	 	 	 	 	 	 d[d<Z.	 	 	 	 	 	 	 	 	 	 d\d=Z/dd>	 	 	 d]d?Z0 e+e1jd                  jf                  e1jh                  jj                  e1jl                  jj                  e1jn                  jj                  e1jp                  jj                  e1jr                  jj                  e1jt                  jj                  e1jv                  jj                  e1jx                  jj                  e1jz                  j|                  e1j~                  jj                        Z@ e+e1j                  jj                  e1j                  jj                  e1j                  j                        ZEdZd@ZF e+e1j                  jj                  e1j                  jj                        ZId^dAZJ	 	 	 	 	 	 	 	 	 	 d_dBZKdddddC	 	 	 	 	 	 	 	 	 	 	 d`dDZL xZMS )ar   ,dict[_DispatchCacheKey, _DispatchCacheEntry]cacher   rU  
cache_hitscache_missesrx  cache_bypassesr  Fr  ry  static_shapesri  r1  z
str | None_stackr  r  nt_tensor_id_counternt_tensor_id_initial_countTN)allow_fallback_kernelsallow_non_fake_inputsr1  r  r  c                  t         j                  dt        |              t        |           || _        dd l}dd l}|j                  j                  j                  | _        t        | j                  |      | _        ||| _        n	|d u | _        d| _        |j                  j                  j                   | _        |j                  j                  j$                  | _        |j(                  j                  j*                  xr | j                   | _        |j(                  j                  j.                  | _        || _        d| _        g | _        || _        t;        j<                         | _        d | _         |jB                  jD                  jF                  | _$        dd l%}|jL                  jN                  jP                  jR                  | _*        | jT                  | _+        y )Nzcreate_mode 0x%xr   r	  F),logr  idr   ru   r  torch._dynamo.configtorch._functorch.configr   r  "fake_tensor_propagate_real_tensorspropagate_real_tensorsr  fake_tensor_converterr  allow_scalar_outputs(fake_tensor_allow_unsafe_data_ptr_accessr  fake_tensor_allow_metar  _dynamofake_tensor_cache_enabledr   $fake_tensor_cache_crosscheck_enabledcache_crosscheck_enabledr  ry  enter_stackr1  	tracebackextract_stack_stack_tracer  ri   r   r   r,  $torch.nested._internal.nested_tensornested	_internalnested_tensor_tensor_id_counterr  r  )rt   r  r  r1  r  r  rh   r   s          r`   ru   zFakeTensorMode.__init__  s   $ 			$bh/&<##& ##FF 	# &911&
"
 $!.D!*d!2D %*! ##LL 	*  **11HHMM  :: 0/// 	
 MM  EE 	% &;" %*! VX"%335 77<<3 LL""00CC 	' %)$C$C!r_   c                &    | j                   | _        y r   )r  r  rs   s    r`   reset_nt_tensor_id_counterz)FakeTensorMode.reset_nt_tensor_id_counter  s    $($C$C!r_   c                B    t        |t              xr |j                  | u S r   )r   r   r   rt   r   s     r`   is_our_fakezFakeTensorMode.is_our_fake  s    !Z(@Q[[D-@@r_   c                   t         j                  j                         rHt         j                  j                         rt	        d      t         j                  j                          S t         j                  j                         xs< t        t         d      xr t         j                  j                         xs
 t                S )Nz&Cannot have both xpu and cuda compiledrd   )	rh   re   _is_compiledrc   r   is_availablehasattrrd   r!   rs   s    r`   avoid_device_initz FakeTensorMode.avoid_device_init$  s    99!!#zz&&($%MNNyy--/// JJ##% 3u%B%))*@*@*B302
 	
r_   c                    | j                   3dj                  t        j                  | j                              | _         | j                   S )N )r  joinr  format_listr  rs   s    r`   stackzFakeTensorMode.stack1  s7    ;;'')"7"78I8I"JKDK{{r_   r^   c                   t         j                  j                  t         j                  j                  j                        t        d|       	 | j                  ||||      S # t        $ r t        j                  d        w xY w)Nz2FakeTensorMode should not be set when dispatching zfake tensor raised TypeError)
rh   ri   r  r   r   r   dispatchr  r  	exception)rt   r   r  r  r  s        r`   r  z!FakeTensorMode.__torch_dispatch__7  sy     88&&uxx'E'E'J'JKW DTFK 	==udF;; 	MM89	s   A% % Bc                   dd l }d }| j                  rO|j                  j                         }|j                  j	                  d       |j                  j                          |j                  j                  | j                        }| |ur,| j                  j                  d||f       t        | -         S |j                  j                  |        | j                  j                  dd |f       | S )Nr   TF)r  r  ri   _only_lift_cpu_tensors_set_only_lift_cpu_tensors_ensureCUDADeviceGuardSetr   r,  r  r   r   	__enter__r   )rt   rh   prev_only_lift_cpu_tensorsmaybe_prev_fake_moder   s       r`   r  zFakeTensorMode.__enter__L  s    3%)"!!).)H)H)J&HH//5
 HH..0$xx<<T^^L++##+-GH 7$&& HH''-##UD2L$MNr_   c                    | j                   j                         \  }}}|rUt        |   |||       |t        j
                  j                  |       | t        j
                  j                  |       y y y r   )r  r   r   __exit__rh   ri   r   r  )rt   exc_typeexc_valexc_tbliver   maybe_prev_only_lift_cpu_tensorsr   s          r`   r  zFakeTensorMode.__exit__g  sy       " 	G#%E GXw7 $/++,@A/;334TU < r_   c                     yr   r^   r  s    r`   is_infra_modezFakeTensorMode.is_infra_modey  s    r_   c                    t        t        j                  t        j                  t	        t        j
                        t        t        j                              S )z8
        Query the state of the dispatch cache.
        )ru  r   r~  r  r   r  r  r}  r  s    r`   
cache_infozFakeTensorMode.cache_info}  s?    
 !%%''../$$%	
 	
r_   c                    d| _         d| _        | j                  j                          | j                  j                          y)z+
        Clear the dispatch cache.
        r   N)r~  r  r  rE  r}  r  s    r`   cache_clearzFakeTensorMode.cache_clear  s3    
   "		r_   c                2   d}d}	 t        | j                        }| j                  ||||      }|| j                  ||||      S |t        d      |j!                         r4|j                  t        d      |j                  j"                  }t$        }	nt        j&                  }t(        }	|j+                  |d      }
|
t	        |
t,              r9t        j                  |
j                  xx   dz  cc<   | j                  ||||      S | j/                  ||
|||      }t        xj0                  dz  c_        | j2                  r+t5        |       5  | j7                  |||||       ddd       |S |S | j                  ||||      }	 | j9                  ||||||      }
 |	|||
       t        xj:                  dz  c_        |S # t        $ r}t	        |t
        j                  j                        r7|j                         dk(  r$t        j                  d|d   |j                         t        j                  |j                  xx   dz  cc<   Y d}~ d}~ww xY w# 1 sw Y   |S xY w# t        $ r}t	        |t
        j                  j                        r7|j                         dk(  r$t        j                  d|d   |j                         t        j                  |j                  xx   dz  cc<    |	||t-        |j                               |cY d}~S d}~ww xY w)z
        Lookup a cache entry for the given arguments. If none exists, dispatch
        and cache the result (if the result is eligible for caching).
        Ninvoke_subgraphz6Fake tensor cache failed: identifier = %s, reason = %sr5   z1state must not be None after cache key generationz:state.shape_env must not be None when caching on shape_env)r6   r1  
_cache_keyrs  r   rh   _opsHigherOrderOperatorr  hc_logr  r   r   r  _dispatch_implr   cache_on_shape_envfake_tensor_cache_set_cache_key_for_shape_envr}  _set_cache_keyr"  ro  _output_from_cache_entryr~  r  r   _crosscheck_cache_output_make_cache_entryr  )rt   r   r  r  r  r  r   er}  set_cache_keyentryoutputs               r`   _cached_dispatch_implz$FakeTensorMode._cached_dispatch_impl  s    	9"4>>2E//%tV<C ;
 &&tUD&AA= !TUU##%&$P  OO55E8M"((E*M		#t$%!:; --ell;q@;**4fEE 225%dDQF%%*%,, /t4 U11&$tVTUM6M $$T5$?	**5#tT66RE$ 	eS%(##q(#] $ 	9 4!?!?@IIK#44LGHH
 ))!((3q833	9bUM $ 	
 4!?!?@IIK#44LGHH
 ))!((3q83%&?&IJM	sC   )G  II$  	I	B III!$	L-BLLLc                   t         j                  j                  j                  j	                         du}|t        j
                         t         j                  j                         t        j                         | j                  r| j                  j                  nd|g}|j                  r|j                  | j                         g }|r| j                  ||||       |r| j                  ||||       t        t!        |            }|D ]1  }	t#        j$                  |	t'        j(                  t*        |             3 |j-                          |S )z
        Create a cache key given the dispatch args. Raises _BypassDispatchCache
        for any situation that precludes caching.
        Nr   )rh   fxexperimentalproxy_tensorget_proxy_modeget_default_dtyperi   _get_default_deviceis_inference_mode_enabledr1  settingsknown_symbolsr   r  rD  rS  rB  r   finalize	functoolspartialevict_fake_tensor_cache_keyrE  )
rt   r  r   r  r  
is_tracing
key_valuesrI  r   id_hashed_objs
             r`   r  zFakeTensorMode._cache_key  s$    XX**77FFHPTT
 ##% HH((* ++- (,~~DNN##4 %

(  djj)*,$$Zu>OP$$Z@QRj 12. 	My001LRUV	 	!
r_   c                   ddl m} t        |t        j                  j
                        r||v ryt        j                  j                  |j                  v rt        d      t        j                  j                  |j                  v r|t        j                  j                  u rot        |||d      \  }}|d   D ]T  }t        |t        j                        s|j                  t        j                   t        j"                  fv sKt        d       yt        d      t        j                  j$                  |j                  v rt        d	      |t        j&                  j(                  u rt        d
      || j*                  v rt        d      |j-                         dk(  rt        d      t        j.                  j0                  j3                  |      st        d      |j4                  r\t        j6                  j9                  |j-                         t        j6                  j:                  j<                        rt        d      yy)za
        Validate that the cache key generated by _cache_key will be
        reasonable.
        r   registered_hop_fake_fnsNzdata dependent outputTr  r  normalize_to_only_use_kwargsindiceszdynamic output shapezinplace viewzunsafe viewliftzinductor::resize_storage_bytes_znon-builtinCompositeImplicitAutograd)torch._higher_order_ops.utilsr  r   rh   r  r  Tagdata_dependent_outputtagsrs  dynamic_output_shaper  r  r   r$   rI  r  rO  inplace_view_unsafe_viewr  lift_fnsr  _libraryutils
is_builtinis_viewri   %_dispatch_has_kernel_for_dispatch_keyDispatchKeyr  )rt   r   r  r  r  r   
new_kwargsr  s           r`   _validate_cache_keyz"FakeTensorMode._validate_cache_key*  s    	J
 tUZZ;;<//
 99**dii7&'>??99))TYY6tzz((( 2!15	!: (	2 KE "%65;;



K < 33IJJK &'=>>99!!TYY.&~664$$,,,&}554== &v..99;;;&'HII~~##..t4&}55
 <<EHHJJIIK--GG
 ''BCC
<r_   c                \   ddl m} ddlm} t	        |t
        t        t        f      r7|j                  t        |             |j                  dt        |              t	        |t              rE| j                  ||j                         ||       | j                  ||j                         ||       y|D ]s  }t	        |t              ru| j                  |      st!        d      |j"                  t!        d      t%        |      rt!        |j&                   d      t)        |      }|j+                  || |       t	        |t,              rt!        d	      t	        |t.              r|j1                  ||       t	        |t2        t4        f      rt!        d
      t	        |t
        t        t        f      r| j                  ||||       t	        |t6        j8                        rt!        d      t	        |t:        j<                  j>                        rG|j                  t        |             |j                  tA        |             |j                  |       t	        ||      r7|j                  tC        |             |j                  |jD                         t	        ||      rQ|j                  t        |             |j                  tC        |             |j                  |jF                         I|j                  t        |             |j                  |       v y)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.
        r   )FunctionalCallableWithEpilogue)SubgraphCallableWrapperlength_Nznot our fakeconstant attributez tensorznon-fake tensorzsymbolic shapezfunction argument)$*torch._higher_order_ops.auto_functionalizer  r  r  r   r  rB  r   r   r   r  rD  keysvaluesr   r  rs  r  r   r   rQ  rJ  r   r   rF  r   r   r  FunctionTyperh   r  GraphModuler  rX  subgraphorig_callable)	rt   rG  r  r  rI  r  r  r  rg  s	            r`   rD  z"FakeTensorMode._prep_args_for_hashp  sf   	
 	JdT5$/0MM$t*%MMGCI;/0dD!$$VTYY[%ARS$$VT[[]ECTU &	#C#z*'',.~>><<+./CDD %.#**W/EFF237&&vtU;C(*+<==C(%%fc2C'8!45*+;<<C$t!45((e=NOC!3!34*+>??C!5!56 d3i(bg&!((-C!89d3i(!((6C!?@d3i(d3i(!(():):;
 d3i(c"M&	#r_   c                   t        |t        t        d       f      ry t        ||       t        |t              st        d      |j                  t        d      |j                  rt        d      t        |      rt        d      |j                         D ]$  }t        |      t        |      k(  st        d       y )Nznon-FakeTensor outputr  zsparse outputzsparse compressed outputzkwarg aliases output)r   rU  r   %_validate_symbolic_output_for_cachingr   rs  r  r   r   r
  r  )rt   r  r   r   r  r  r  kvals           r`    _validate_output_for_cache_entryz/FakeTensorMode._validate_output_for_cache_entry  s     fsDJ/0 	.eV< &*-&'>?? ??&&';<< &77'&'ABB MMO 	CD$x2f:%*+ABB	Cr_   c                   t        |t        t        j                  t	        d       f      rt        d d d |      S t        t        |            D ],  }t        ||         t        |      k(  st        |d d       c S  d }t        |t        j                  j                        rd|j                  rXt        |      D 	
cg c]  \  }	}
t        |
t              s|	 }}	}
t        |      dk7  rt        dt        |             |d   }t        |      }t!        fd|j"                  D              |_        t!        fd|j$                  D              |_        j'                  |j(                        |_        |j*                  d nj'                  |j*                        |_        t        d ||      }t-        |fd	      }dd
lm} 	 | j3                  ||||      }t        j6                  j9                  |      }t        j6                  j9                  |      }||k7  rt5        d      |S c c}
}	w # |$ r t5        d      d w xY w)Nrf  rg  rh  ri  )rf  rg  rh  r5   z1Expected exactly one tensor arg for view op, got r   c              3  @   K   | ]  }j                  |        y wr   convert_outputr   r   r  s     r`   r   zBFakeTensorMode._get_output_info_for_cache_entry.<locals>.<genexpr>  s     O1u33A6O   c              3  @   K   | ]  }j                  |        y wr   r  r  s     r`   r   zBFakeTensorMode._get_output_info_for_cache_entry.<locals>.<genexpr>  s     QA 4 4Q 7Qr  Frl  rm  )GuardOnDataDependentSymNodezdata dependent symnodezdispatch_key_set mismatch)r   rU  rh   r   r   re  ranger  r  r  r@   r  	enumerater   r   rQ  rB  r3  r4  r  r7  r8  rk  r=  r  r  rs  ri   _dispatch_key_set)rt   r  r   r   r  r  r  idxrh  ir   idxsrg  r  entry_for_synth_outputr  synth_outputsynth_key_setkey_sets    `                 r`    _get_output_info_for_cache_entryz/FakeTensorMode._get_output_info_for_cache_entry  s)    fsELL$t*=>0 4$v 
 T# 	C$s)}6
*4 #dT 	 dEJJ112t||"+D/K$!QZ65JAKDK4yA~$GD	{S  AwH*62OOOQQQ"'"6"6x7N7N"O %%- %%h&<&<= 	 .
 ":5"
 	V		K88-sD$L 22<@((,,V4G#&'BCCg LJ + 	K
 ''?@dJ	Ks   >H/H/
H5 5Ic                   ddl m}m} ddlm | j                  |||       t        |t        j                  j                        rG||v rCt        |t              r|n|f}	t        fd|	D              xs ||v }
|
rt        d| d| d      t        |t        t        j                  t        d      f      rt!        ddd|	      }t#        |fd
      S t        |t              r|D ]  }| j%                  ||||||        n| j%                  ||||||       t        |t              r9|D cg c]  }| j'                  ||||||       }}t#        t        |      d      S | j'                  ||||||      }t#        |fd
      S c c}w )z
        Make a cache entry object for the given 'output' Tensor. Raises
        _BypassDispatchCache if the output tensor has characteristics that
        prevent caching it.
        r   )hops_that_skip_faketensor_cacher  )has_free_unbacked_symbolsc              3     K   | ]8  }t        |t        j                  t        j                  f      xr  |       : y wr   )r   rh   r   r   )r   or*  s     r`   r   z3FakeTensorMode._make_cache_entry.<locals>.<genexpr>M  sA        q5<<">? 51!45s   >Azunbacked symbol in HOP z output                     or z# in hops_that_skip_faketensor_cacheNr  Fr  T)r  r)  r  r=  r*  r  r   rh   r  r  rB  r  rs  rU  r   r   re  rk  r  r'  )rt   r  r   r   r  r  r  r)  r  outsnon_cacheableoutput_infoout_elementout_elemrl  r*  s                  @r`   r  z FakeTensorMode._make_cache_entry*  s   	
 	T  tV4 tUZZ;;<//'66VID  "  ;
 ::  *-dV 4v@B 
 fsELL$t*=>7 4$vK ,)^U  fe$% 55 11 fe$ !'
  55
L 
 ,"<0 $  ??K ,)^U 5
s   -Fc           
        |j                   A|j                  5|j                  )|j                  t        u rt        d      |j                  S |j                   ,||j                      }t        |t              st        d      |S |j                  }|y t        |      rt        d      dfdt        fd|j                  D              }t        fd|j                  D              }	 |j                        }
|j                   |j                         t        j                  }| j                   | j                   j"                  }t%        |       5   |       5  t'        j(                  ||	|j*                  |j,                  d|j.                        }d d d        d d d        |j0                  r t&        j2                  j5                  d	       |j6                  r t&        j2                  j9                  d	       t        |t&        j:                  j<                        r|j>                  r|tA        tB        |j                           }t        |t              st        d
      |jE                         }t%        |       5   |       5  jG                  ||
||	       d d d        d d d        t        | |jH                        S # 1 sw Y   1xY w# 1 sw Y   6xY w# 1 sw Y   BxY w# 1 sw Y   FxY w)Nz2entry.constant_value must not be SingletonConstantz inplace_arg must be a FakeTensorz)Sparse tensors are not supported in cachec                    t        | t              r3|j                  t        d      | j	                  |j                        S t        | t
              rt        d      | S )Nz6state.shape_env must not be None for _SymIntOutputStubz Unexpected _PySymInputStub value)r   r8   r1  r   r  r7   )r_  r  r   s     r`   check_valuezGFakeTensorMode._get_output_tensor_from_cache_entry.<locals>.check_value  sZ    %!23??*(P  }}S%//::e_5()KLLr_   c              3  0   K   | ]  } |        y wr   r^   r   r   r4  r  s     r`   r   zEFakeTensorMode._get_output_tensor_from_cache_entry.<locals>.<genexpr>  s     Dk!U+D   c              3  0   K   | ]  } |        y wr   r^   r6  s     r`   r   zEFakeTensorMode._get_output_tensor_from_cache_entry.<locals>.<genexpr>  s     F{1e,Fr7  rd  )rI  r   r   rF  Tzview_arg must be a FakeTensor)r_  r6  r  r6   rz   r'   )%rf  rg  rh  ri  rb  r   r   r   r   rB  r3  r4  r7  r8  
contextlibnullcontextr1  suppress_guardsr  rh   empty_stridedrI  r   rF  r9  ri   	_set_conjr:  _set_negr  r@   r  r   rU  rO  set_r   )rt   r  r  r   r   r  inplace_argrg  r3  r4  r7  maybe_suppressrt  view_argstorager4  s    ` `           @r`   #_get_output_tensor_from_cache_entryz2FakeTensorMode._get_output_tensor_from_cache_entry  s    %&&##'88$H  '''(u001Kk:6$%GHH >>" !LMM
	 DX^^DDFhooFF$X%<%<eD!!-..6 "" 	 >>%!^^;;N)$/ 	1A 	''nn&44E	 	 HHud+??HHeT*dEJJ112t||Denn56Hh
3$%DEE..0G-d3 C^5E C

7NE6BC C $x771	 	 	 	*C C C CsH   !K):K#KK8K,+K8K	KK),K5	1K88Lc           
         |j                   r7|j                  D cg c]  }| j                  |||||       }}t        |      S | j                  ||j                  d   |||      S c c}w )z?
        Create a new FakeTensor from the cache entry.
        r   )rm  rl  rD  rB  )rt   r  r  r   r   r  r/  outputss           r`   r  z'FakeTensorMode._output_from_cache_entry  s       
 $)#5#5	   88;T4G  >!;;u))!,c4 s   A&c                    dfd	 | j                  ||||      }	  ||       y# t        $ r}t        d| d| d| d|       |d}~ww xY w# t        $ r}t        d| d| d|       |d}~ww xY w)z
        Helper to validate that the output synthesized from the cache matches
        the output created by normal dispatch.
        c                >   t        | t              rt        |t              st        dt        |             t	        |       t	        |      k7  r#t        dt	        |        dt	        |             t        | |      D ]  \  }} ||        y t        | t              r't        |t              r| |k7  rt        d|  d|       y | |t        d|       y t        | t              r@t        |       t        |      us| j                  |j                  urt        d|  d|       y t        | t        j                        rCt        |t        j                        st        dt        |             t        t        | |       y t        dt        |              )	NzExpected tuple, got zTuple length mismatch: z != zInt mismatch: zExpected None, got zSymType mismatch: Expected Tensor, got zUnsupported type )r   rB  r   r   r  ziprU  r(   r  rh   r   r   r   RuntimeError)ablr  assert_helpers       r`   rO  z>FakeTensorMode._crosscheck_cache_output.<locals>.assert_helper	  sz   !U#!!U+(+?Qy)IJJq6SV#(+B3q6($sSTvh)WXX1I (DAq!!Q'(As#!!S)Q!V(>!D)DEE .4=(+>qc)BCC !A|,7$q')QVV166-A(+=aSQC)HII .BAu||,!!U\\2(+@a	)JKK"9a3"%6tAwi#@AAr_   z*FakeTensor cache crosscheck failure: func=z, args=z	, kwargs=z: Dispatch raised=N)rL  r   rM  r   rz   r{   )r  	ExceptionrK  )	rt   r  r   r  r  r  true_outputr  rO  s	           @r`   r  z'FakeTensorMode._crosscheck_cache_output	  s    	B0	--dE4HK	+v.  	<TF CvYvh.@E 	  	<TF CvYvh0 	s+   ( 	A 	AA		A	A4A//A4c                   |xs i }t               5  t        j                  d|||       d d d        |t        v rt        |   |      S t        j	                         t
        j                  k  r(t        j                  ddt        z  |       t               }|t        v rt        |       5   ||i |cd d d        S | j                  r| j                  ||||      S | j                  ||||      S # 1 sw Y   xY w# 1 sw Y   IxY w)Nz%s %s %sz'%sFakeTensorMode.__torch_dispatch__: %s )r)   r  r  r  getEffectiveLevelloggingDEBUGrr   rn   _DISPATCH_HANDLE_DIRECTLYr  r   r  r  )rt   r   r  r  r  incrs         r`   r  zFakeTensorMode.dispatch5	  s     2] 	6IIj$f5	6 ***4066  "gmm3II93;PRV +,D ,,-d3 -T,V,- - --dE4HH&&tUD&AA/	6 	6"- -s   C.(C:.C7:Dc                `   
 ddl ddlm} d fd}t        t        j
                        rZ	  |ddddd       t        t        j                         j                                     D ]  \  }\  }}		  |||	        dfS get        j                  j                  j                  r!t        d	fd       t               dfS t        d d dt        |       d       	  |       dfS # t        $ ro
t        j                  j                  j                  r%t        d	
fd
       t               dfcY d

S t        d d dt        |       d       
d

ww xY w# t        $ rt
t        j                  j                  j                  r't        d	
fd       t               dfcY d

c S t        d| d|	 dt        |       d| d 
      
d

ww xY w# t        $ r&
t        d d dt        |       d       
d

ww xY 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_tensorsc                p   t        | t        t        f      rj                  t	        d      | j
                  j                  j                  j                  j                  j                         z
  j                  j                  j                         z
  sjj                  j                  j                  | j
                  j                  |      d      j                  j                  urt        d|  d| d      y y t        | t         t"        t$        f      r| |k7  rt        d|  d| d      y y )Nz3self.shape_env must not be None for symbolic valuesT)compute_hintmismatch between fake value  and real value rS  )r   r   r   r1  r   r  exprfree_symbolsbacked_var_to_valr	  real_tensor_prop_unbacked_vals_maybe_evaluate_staticEqStruer   rU  floatr  )r   realrt   sympys     r`   _check_fake_real_valsz?FakeTensorMode._maybe_infer_fake.<locals>._check_fake_real_valsb	  s3   $ 23>>)(M  		33nn66;;=>nnCCHHJK
 ==!HHTYY^^T: >   %ww||,
 4:4&@PQUPVVWX ,K sE4( 4</6tf<LTFRST   r_   Real tensor propagation foundFT)contextsizesstridesr7  rF  mismatched_fake_kernelc                 4    t               j                  dS Nopr   r~   r   excr   s   r`   <lambda>z2FakeTensorMode._maybe_infer_fake.<locals>.<lambda>	  s    "%d)&)jj- r_   metadata_fnzFReal tensor propagation found a metadata mismatch between fake tensor z and real tensor z,  at outputz, for func: c                 4    t               j                  dS rq  rt  ru  s   r`   rw  z2FakeTensorMode._maybe_infer_fake.<locals>.<lambda>	  s    &)$i*-**1 r_   zIReal tensor propagation found an output size mismatch between fake shape z and real shape z, at outputz.size(z), for func: c                 ,    t              d  d dS )Nr]  r^  rr  r~   )r   r   rh  s   r`   rw  z2FakeTensorMode._maybe_infer_fake.<locals>.<lambda>	  s$    !$i$@FVW[V\"]) r_   zQReal tensor propagation found an output value mismatch between fake output value z and real output value )r   r   rh  r   rz   r{   )ri  torch._subclasses.fake_utilsrZ  r   rh   r   r   r   r  *generate_fake_kernels_from_real_mismatchesr   _infer_fake_from_real_tensorr.   r  rJ  rz  )rt   r   pathr   rh  rZ  rj  js_fakes_realrv  ri  s   `` ``     @@r`   _maybe_infer_fakez FakeTensorMode._maybe_infer_fakeV	  s    	I	< dELL)(;!#'"'2 (1TYY[$))+1N'O ##FF)&&9T U{1 \d.&&QQ!,! 4D$EtKK'#f$5dV <#D\N,tf> %dD1 U{u ) ##**UU%0% 8dDI4OO+##'&(9$ @!!'l4&B 	& - ''..YY)4)  <D$MtSS/&&,X-=fX F$$*4L>s-vO 	B ) +))-.EdV L  &t~\$A 	sa   D =	E>6	G> 	E;AE6E;!E66E;>	G;AG6
G;$G66G;>	H-!H((H-c                    ddl m} d j                  rt         j                  j                        d fd}t
        j                  |      \  }}	t
        j                  |      \  }
}	  |d||||       t        t        ||
      D cg c]  \  \  }}} j!                  |||       c}}} \  }}t#        |      r	r |        t
        j%                  ||	      S # t        $ rkt        j                  j                  j                  r-t        dfd        |        t         fd	|      cY dS t        d
| d| d       dww xY wc c}}}w )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_infoNc                     t        t        j                  j                        j	                               j                  _        y r   )r  setr1  pending_fresh_unbacked_symbols
difference)pending_unbackedrt   s   r`   _clear_pending_unbackedzXFakeTensorMode._maybe_infer_fake_kernel_from_pytree_out.<locals>._clear_pending_unbacked	  s4    <@DNNAABMM$=DNN9r_   rk  ro  c                 :    t              d j                   dS )Nz>Mismatched aliasing spec between fake kernel and real kernel: rr  rt  ru  s   r`   rw  zIFakeTensorMode._maybe_infer_fake_kernel_from_pytree_out.<locals>.<lambda>	  s#    !$i\]`]g]g\hi) r_   rx  c                    t        |       S r   )r  )r   r   rt   s    r`   rw  zIFakeTensorMode._maybe_infer_fake_kernel_from_pytree_out.<locals>.<lambda>	  s    :4qI r_   zGReal tensor propagation found an aliasing mismatch between fake output z and real output z,  for func: ry   )r}  r  r1  r  r  r   tree_flatten_with_pathtree_flattenr   rh   r   r  r~  r   r0   rJ  r  r  tree_unflatten)rt   r   fake_inreal_infake_outreal_outr  r  fake_paths_leaves	fake_specreal_leavesr   
_fake_path	_fake_out	_real_outfake_leaves	overridesrv  r  s   ``               @@r`   (_maybe_infer_fake_kernel_from_pytree_outz7FakeTensorMode._maybe_infer_fake_kernel_from_pytree_out	  sx    	C  >>#DNN$Q$QR	 (.'D'DX'N$9,,X6Q	/7Hg> "% ;>%{; 6+ZY &&tZIN"
Y 	N/#%$$[)<<Q % 	&&QQ!,! ()I8  ,##+*,=hZ H""&) 	)	:s+   0C% !E%	E.AE9E?EEc                   ,-./01234567 ddl m} t        j                  f      \  0,t	        0      }|r@0D cg c]  }t        |      st        |       }}t        j                  d|       t        S 0D 	cg c]  }	 j                  |	      s|	 }
}	t        d |
D              xs t        d 0D              2 j                  . j                  v }d} j                  rzt        j                   j"                  j$                  j&                  u rdv rd   j                  dk7  rd	}t        j                   j(                  j*                  j&                  u rd	}t        j                   j"                  j$                  j&                  u xr; t-        d   t        j.                        xr d   j0                  j                  d
k(  xs |}|r|
rt3              r̉2s|
s|st5        d |
D              st7         d      0D cg c]!  } j                  |      r|j8                  n|# }}t        j;                  |,      \  }} |i |}t        |      t.        u rH j=                  |      r7t?               5  |jA                         }d d d        .jC                   |d	      S |rVtE              dk7  stE              dk7  rt7        d d       t        d         t.        u r.jC                   d         S  jG                  .0,      \  0}
t5        d |
D              }t-        t        jH                  jJ                        rt        jL                  jN                  jP                  vrXt        jL                  jR                  jP                  vst"        jT                  j&                  u r|rtE        |
      dk7  r2s |st"        jV                  j&                  ur0D cg c]!  } j                  |      r|j8                  n|# }}t        j;                  |,      \  }}t?               5   |i |}d d d        t        jY                        }|D 	cg c]  }	t-        |	t.              s|	 }}	t5         fd|D              }|rt        j[                  t.        . fd|      S |D ]  }.j]                  |        t        j;                  0,      \  t-        t        jH                  j^                        r^|v rZ j`                  tb        jd                  n j`                  jf                  } 5   |       5   |   i cd d d        cd d d        S  ji                  |
       	 	 	 	 d) fd}ddl5m6-m71 tq               336 jr                  rt5        d |
D              rt        1 7fd0D              stt        j                  d       0D cg c]
  } ||       }}t        j;                  |,      \  45tw        jx                        }|stw        jz                  |,      }	  4i 56|syj                          tw        j                  j                  06       nG jr                  r;tt        j                  d|
0 j`                  r j`                  j                  nd        d*-13456 f
d}2r-t               j                        }| | | gi       S ddlEmF} |vr j                        s2r j                  v s}ddlEmI}  | v r<2st              r/t5        d |
D              r 5   | |    i       cd d d        S  5   j                  i }!|!t        ur ||!      cd d d        S 	 d d d        dj                  j                  v r;t        d       r/t              s$ 5   | j                  i       cd d d        S t        j                  j                  j                  }"|"%|"j                  v r |"j                   gi S  jr                  r_63ur[tw        jx                        sF j`                  :tw        j                        s%t         6      }#t        d!fd"#        ||#      S t        j                  j                  j                  j                  j                               j                  j                  }$|$r}	 t        j                  j                  j                         /t        j                  j                  j                  /fd$      5   5   |$i }# ||#      cd d d        cd d d        S t        D ]-  \  }&}' |&      s |' gi }(|(t        us% ||(      c S  	 d+	 	 	 d,,02 fd&})t              s |)       }* ||*      S 	 t               5   i }!d d d         | j                  !0j                  d      (            S c c}w c c}	w c c}w # 1 sw Y   xY wc c}w # 1 sw Y   xY wc c}	w # 1 sw Y   nxY wd d d        # 1 sw Y   xY wc c}w # t|        $ r"}tt        j                  d|       Y d }~gd }~ww xY w# 1 sw Y   OxY w# 1 sw Y   %xY w# 1 sw Y   xY w# 1 sw Y   nxY wd d d        n# 1 sw Y   nxY w{# t        $ rb}% jr                  rO63urKtw        jx                        s6 j`                  *t         6      }#t        d!fd%#        ||#      cY d }%~%S |%d }%~%ww xY w# 1 sw Y   uxY w# t        $ r}+ |)|+      cY d }+~+S d }+~+wt        $ r tt        j                  d'        w xY w)-Nr   r  z,FakeTensorMode unrecognized subclass(es): %sc              3  4   K   | ]  }|j                     y wr   )rM  )r   r!  s     r`   r   z0FakeTensorMode._dispatch_impl.<locals>.<genexpr>1
  s      !
./A))!
   c              3  <   K   | ]  }t        |t                y wr   )r   r   )r   rL  s     r`   r   z0FakeTensorMode._dispatch_impl.<locals>.<genexpr>3
  s     :1Av&:s   Fr   r  Trd  c              3  8   K   | ]  }|j                   d u  y wr   r.  r   r   s     r`   r   z0FakeTensorMode._dispatch_impl.<locals>.<genexpr>]
  s     M!qzz-M   z. should not have fake inputs without constantsr[  r5   z1Expected exactly one arg for lift func, got args=z kwargs=c              3  8   K   | ]  }|j                   d u  y wr   r.  r   r  s     r`   r   z0FakeTensorMode._dispatch_impl.<locals>.<genexpr>
       Qa1::T1Qr  c              3  @   K   | ]  }j                  |        y wr   )may_turn_const)r   r   rt   s     r`   r   z0FakeTensorMode._dispatch_impl.<locals>.<genexpr>
  s     P!t2215Pr  c                ,    j                  | d      S )NTr  )rb  )r   	converterrt   s    r`   rw  z/FakeTensorMode._dispatch_impl.<locals>.<lambda>
  s    i88qPT8U r_   c                   t        | t              r| j                  S t        | t              rj                  t        d      | j                  j                  | j                  j                  j                  j                  j                        j                  j                  j                              S t        | t              r| j                  S | S )Nz2self.shape_env must not be None for symbolic types)r   r   r  r(   r1  r   r  re  r_  xreplacera  rb  r   real_obj)r   rt   s    r`   maybe_to_real_tensorz;FakeTensorMode._dispatch_impl.<locals>.maybe_to_real_tensor
  s     !Z(}}$A|,>>)(L  vv}}FFKK(()I)IJSSEE 
 A/0zz!r_   )compute_unbacked_bindingsfree_unbacked_symbolsc              3  8   K   | ]  }|j                   d u  y wr   )r  r  s     r`   r   z0FakeTensorMode._dispatch_impl.<locals>.<genexpr>
  s     M!AMM-Mr  c              3     K   | ]F  }t        |t              xr0  |      xxr$ j                  d uxr t        fdD               H y w)Nc              3  N   K   | ]  }|j                   j                  v  y wr   )r1  rb  )r   srt   s     r`   r   z:FakeTensorMode._dispatch_impl.<locals>.<genexpr>.<genexpr>
  s(       !N!NNs   "%)r   r(   r1  r  )r   rL  r  rt   symss     r`   r   z0FakeTensorMode._dispatch_impl.<locals>.<genexpr>
  sf        q,/ !6q!99d2  !% s   AAzpropagate_real_tensors %sz9real-tensor fallback failed for %s: %s; silently ignoringz,SKIPPED propagate_real_tensors %s(%s, %s) %sc           	     D  
 dd l t        j                  d       dfdurt        j                  j
                  j                  sj                  f	
f|        nj                  f	
f|       } t        | t              slt        t              s\t        |       t              urFt        t        t        j                  |             t        t        j                                     nt        |         j                  | d       | S )Nr   zmaybe_propagate_real_tensors %sc                   t        | t              rt        j                  dt	        |       t	        |             || _        t        | j                         |j                               D ]  \  }} ||        t        | j                         |j                               D ]  \  }} ||         | j                         |j                                y t        | t              r |       rt        | j                  j                  j                        rHj                  t        d      j                  j!                  | j                  j                  |       y t        | j                  j                  x}j"                        ret        |j$                  j                        rD|j&                  dk(  r4j                  t        d      j                  j!                  ||       y y y y y y )Nz%maybe_propagate_real_tensors %s -> %sz3self.shape_env must not be None for symbolic Symbolr5   z/self.shape_env must not be None for symbolic Eq)r   r   r  r  r  r  rJ  rz  r4  r7  r(   r  r_  Symbolr1  r   "set_real_tensor_prop_unbacked_valsrd  lhsrhs)r   real_tr  real_sr  gort   ri  s       r`   r  zOFakeTensorMode._dispatch_impl.<locals>.maybe_propagate_real_tensors.<locals>.go+  s   a,II?A6
 %+AM%(6;;=%A &	61f&%(V]]_%E &	61f&q'')6+@+@+BC<05J15M!!&&++u||<>>1"0 U#  IIFFKK ##31UXX>&quuell;EEQJ>>1"0 Q#  II!VT ' < ? 6N0r_   T)peek)r   rH   r  r   rz   r{   )ri  r  r  rh   r   r  r~  r  r   r   r   r1   rB  r   r  r1  )r  r  ri  r  r  r  r   r  nil	real_argsreal_kwargsr  rt   s    @@r`   maybe_propagate_real_tensorszCFakeTensorMode._dispatch_impl.<locals>.maybe_propagate_real_tensors&  s   II7>U UB s"''..YYAAv"K0    $LLv"K0   H #8V4&x8Xd8n< f11(;<f11(;< b(H5
 *$..(NOr_   )
meta_tabler   c              3  4   K   | ]  }t        |         y wr   )r   r  s     r`   r   z0FakeTensorMode._dispatch_impl.<locals>.<genexpr>  s     PQa 00Pr  zprims::prim_meta_implmissing_fake_kernelc                     dt               iS Nrs  r|  r   s   r`   rw  z/FakeTensorMode._dispatch_impl.<locals>.<lambda>  s    c$i) r_   rx  c                      S r   r^   )ctxs   r`   rw  z/FakeTensorMode._dispatch_impl.<locals>.<lambda>  s    S r_   c                     dt               iS r  r|  r   s   r`   rw  z/FakeTensorMode._dispatch_impl.<locals>.<lambda>  s     #d)- r_   c                $   t         j                  j                  j                        r-t        j                  j                  j                  gi S sj                        st              | t              } t        |       S r   )rh   r  r  can_generate_trivial_fake_implgenerate_trivial_fake_implcan_run_unsafe_fallbackr   run_fallback_kernel)errorr  	args_specr  r   has_symbolic_sizesr  rt   s    r`   maybe_run_unsafe_fallbackz@FakeTensorMode._dispatch_impl.<locals>.maybe_run_unsafe_fallback  s     ~~##BB4H~~++FF#)  ")E)Ed)K2488}4T:&tT9iOOr_   z*failed while attempting to run meta for %sro  )r   rE   rz   z)T | Tensor | torch._C.ScriptObject | None)r  rE   rz   rE   r   )r  zRuntimeError | Nonerz   rh  )ir  r  r   r  _check_for_subclass_check_for_subclass_argr   r  r  rB  r  r  r  r  r  rh   r  r  _to_copyr  prims
device_putr   r   r   r  allr   r  r  r  r)   clonerb  r  %validate_and_convert_non_fake_tensorsr  r@   r  nondeterministic_seededr  r  detach__nested_tensor_from_tensor_listr   tree_map_onlyr  r  r1  r9  r:  ignore_fresh_unbacked_symbolsinvalidate_written_to_constantsr=  r  r  rH   r  r  library_utilsr  MutationCheckerZeroDivisionErrorcheckcheck_aliasing_constraintr  rb  get_fast_op_implsr"  r   r  cpp_meta_supports_symint#_unbacked_special_fake_handling_opsr   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   r  simple_registry	singletonfind	fake_implkernelFakeImplCtxset_ctx_getterr   op_implementations_checkshas_metar  r  rP  r  +wrap_meta_outputs_with_default_device_logic)8rt   r   r  r  r  r  has_unrecognized_typesr   r  r   flat_arg_fake_tensorsis_lift_funcavoiding_device_init!device_conversion_skip_const_proprL  const_flat_args
const_argsconst_kwargsr   all_constantflat_outflat_out_tensorsr  #maybe_ignore_fresh_unbacked_symbolsr  real_flat_argsr  mutation_checkerrv  r  	fast_implr  r   r  profilesrG  maybe_fake_implr  run_impl_checkop_implop_impl_outr  fallbacknot_implemented_errorr  r  r  r  r  r  r  r  r  r  r  r  s8   `` ``                                       @@@@@@@@@@@@r`   r  zFakeTensorMode._dispatch_impl
  s    	J%22D&>B	9 "5Y!?!!*".Ea.HQ" "  %%>@R "!,5 Mq9I9I!9L M M  !
3H!
 
 ;:	:: 	 ..	t}},  %!!		//777&8$))U2'+$uyy11999'+$ EIINN++333 .47ELL1.Q##v--" "	 	* !6+D1&)5M7LMM$fJK  CL=>d..q1

q8O  (.'<'<_i'X$J
3l3CCyF"t':':3'? !] &))+C& 11$41PP 6{a3t9>$GvXV\U]^  DG}& 11$Q@@ .2-W-W)Y	.
*) & Q;PQQtUZZ223		11B 		&&dii744<<CWCW;W)*a/&(D@@HHH CL=>d..q1

q8O  (.'<'<_i'X$J  8J7,78 ))#.H+3Maz!V7LMMP?OPPL++U  ( ;55c:;
 ,,Y	Bf tUZZ;;<//
 >>) &&^^AA 0  F:< F4.t4dEfEF F F 	,,T3H$PVW		6	(	

 h''M7LMM  #  II148?HI!215INI%+%:%:>9%U"I{&11$7J#0#@#@.)$ 
:k:  &&(77

IxX(( II>%>> ==O	 O	d )+//5I$3Id4TT4TV4TUU 	- 
"11$7"tt/W/W'W : **" 05P:OPP  71+D14B6B 
  ;"DNND3F3N*7:	; ; +; ***./'- 3'D''88 
 =='';;x}}$3x33D$PPPP ''#!,,T2* !006;D$Q!)! 4F;;  ..88BBGGIIK

)FF 	 nn..::4F^^--<<[I @4 @,d=f=F7?@ @ @8 (A 	E#NGd#%dDB4B6Bn47DD	E *.	P&	P	P 	P( ~02H/99
	-d3 *$)&)* ,<<46::h+? = 
 	
[" !Nb& &j8 8  N<F F F F Fd J %  		O 	X 
; ;" H@ @ @ @ @ $  // +)44T:2?dHUF%-% 8??G'x* *" 	D,-BCC 	MMFM	s@  h<h<ii&ii<&i	i1i*i*ji/"	j5jj %k"k(kAl .l1k,	l
	l 6n
 	m=
n
 ii'/i8	4jj	k j==kkkk),k5	1l8	l l
l 	m:Am5-m:3m55m:=nn
 
	on o $o
debugprimsr  r  xlavision	torchtext
torchaudio	quantizedc                v    | j                   sy|j                  | j                  v xs |j                         dk(  S )NFzfbgemm::gmm)r  	namespace+_can_run_unsafe_fallback_allowed_namespacesr  rt   r   s     r`   r  z&FakeTensorMode.can_run_unsafe_fallback+  s:    **
 NNdNNN ,yy{m+	
r_   c                d     g d fd}D cg c]
  } ||       }}|fS c c}w )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.
        c                   t        | t              s| S 
j                  |       st        	d      rXt        j
                  j                  	j                  v r2t        j                        \  }}t        dt        	||             t        j                  
j                  nt        j                  }|skt        | t              r)| j                   
urt        d| j                    d
       t        j                        \  }}t        dt        	||             j#                  
|       }n| }j%                  |       |S )Nr  zECan't call metadata mutating ops on non-Fake Tensor inputs. Found in z"Mixing fake modes NYI x.fake_mode=z	 vs self=zuPlease convert all Tensors to FakeTensors first or instantiate FakeTensorMode with 'allow_non_fake_inputs'. Found in )r   r   r  r  rh   r  r  r  r   r  r   r"   r  r   r  r   r   rb  r   )r   r  r  r  r   r  r  r  r  r   rt   s        r`   validatezFFakeTensorMode.validate_and_convert_non_fake_tensors.<locals>.validateD  sU   a( ##A&4(UYY-C-Ctyy-P#)#8#8I#NLD&(_`klprvx~`  `A  B 
 'EEM ..(GG &
 -!!Z0Q[[5L,@YW[V\]  $*#8#8I#NLD&(BBMdTXZ`BaAbd 
  00q9!((-Jr_   )r   rE   rz   T | FakeTensorr^   )	rt   r   r  r  r  r"  rL  validated_argsr  s	   `````   @r`   r  z4FakeTensorMode.validate_and_convert_non_fake_tensors6  s@     35 	  	D 099!(1+99444 :s   -c                `      j                   d dd fd}t        ||      S )NFc                R    t         t              s S t        j                        \  j	                         }|r7t        j                   j                  k(   fd       t        t               S +rj                         S j                   xs       S  S )Nc                 (    dj                    d  S )Nz-FakeTensor is wrapped to wrong device, found z, expected ro  )r   r  s   r`   rw  zZFakeTensorMode.wrap_meta_outputs_with_default_device_logic.<locals>.wrap.<locals>.<lambda>  s    KAHH:U`an`op r_   )r   r   r   r  r  rh   _checkr   r   rE   rb  rg  )	r  r  r   r  r   r  r   r  rt   s	   ` r`   wrapzHFakeTensorMode.wrap_meta_outputs_with_default_device_logic.<locals>.wrapv  s     a($ 224C!* **1-KHH-p Aqz!&) %55dA>>$99a!8= 
 r_   r  rE   rz   r#  )r  r0   )	rt   r  r   r  r   r)  r   r  r  s	   ` ``` @@@r`   r  z:FakeTensorMode.wrap_meta_outputs_with_default_device_logici  s7     ..	 !& 	  	D a  r_   r  c                  dd l }ddlm} |8| j                  }| j                  st        d      | xj                  dz  c_         |j                   ||d            }|j                  j                  j                  d      }| j                  t        d      | j                  j                  | j                  j                  ||      ||      }|S )	Nr   )NestedIntNodez4should only be called while FakeTensorMode is activer5   intermediate_offsets_or_lengthszself.shape_env must not be None)valr(  )symr8  r(  )r  !torch.nested._internal.nested_intr,  r  r  r   r   r  r(  EphemeralSourcer1  rX  create_symbol)rt   r  rh   r,  r8  srcrets          r`   r  z)FakeTensorMode.create_symbolic_nested_int  s    
 	4C44L##$J  %%*%u||M,:;mm""223TU>>! !BCCnn..,, -   / 
 
r_   c                l    t         j                  j                  |j                  v ry|| j                  v S r   )rh   r  	view_copyr  _cpp_meta_supports_symintr  s     r`   r  z'FakeTensorMode.cpp_meta_supports_symint  s,    99$))+t5555r_   c                    |j                         t        k  xr; t        |       xr- | j                  |       xr |j                  j
                  dk7  S r  )numelCONSTANT_NUMEL_LIMITr   r  r   r   r  s     r`   r  zFakeTensorMode.may_turn_const  sS    GGI-- (!!$$($$Q''( '		
r_   c                   t        d |D              }t        |      }|r|j                         rt        |||d      \  }}|j	                         D ]u  \  }	}
|	dk7  s|j                  |	      r|	nd}	| j                  |
      s2|j                  |	      sD|
j                  Q| j                  j                  |
j                         w y y y )Nc              3  8   K   | ]  }|j                   d u  y wr   r.  r  s     r`   r   zAFakeTensorMode.invalidate_written_to_constants.<locals>.<genexpr>  r  r  Tr  inputrt   )
r  r   
is_mutabler$   r   has_argumentr  r  r  r  )rt   r   r  r  r  any_constantschema_infor   r  kr   s              r`   r  z.FakeTensorMode.invalidate_written_to_constants  s     Q;PQQ%d+K224.-1	MAz #((* W1w,+*B*B1*EAF$$Q'#..q1

...JJ1::VW 5<r_   )r  r(  r)  r*  c                   | j                   }|| j                  }|r|t        d      d }| j                  j	                  | |||||      S )Nz2cannot set both static_shapes and symbolic_context)r1  r(  r)  r*  )r1  r  r   r  rb  )rt   r  r  r(  r)  r*  r1  s          r`   r  zFakeTensorMode.from_tensor  sn     &*^^	  ..M+$H  I))::- ; 
 	
r_   )r  r  r  r  r1  ri  r  r   r  r  rz   r{   ry   )r   rH   rz   zTypeGuard[FakeTensor])rz   r  )rz   r~   r'  )rz   r   )r  ztype[BaseException] | Noner  zBaseException | Noner  zTracebackType | Nonerz   r{   )rz   ru  )
r  r6   r   r@   r  r)  r  r*  rz   rS  )r   r@   r  r)  r  r*  rz   r{   )
rG  rK  r  z:Mapping[str, object] | Sequence[object] | Iterable[object]r  r6   rI  rK  rz   r{   )r  r6   r   rS  r   r@   r  r)  r  r*  r  rh  rz   r{   )r  r6   r   rS  r   r@   r  r)  r  r*  r  r   rz   re  )r  r6   r   rS  r   r@   r  r)  r  r*  r  rh  rz   rk  )r  r6   r  re  r   rS  r   r@   r  r)  rz   rh  )r  r6   r  rk  r   rS  r   r@   r  r)  rz   1FakeTensor | None | tuple[FakeTensor | None, ...])r  rD  r   r@   r  r(  r  r)  r  r*  rz   r{   )
r   r@   r  r-   r   rH   rh  rH   rz   ztuple[object | None, bool])r   r@   r  rH   r  rH   r  rH   r  rH   rz   zobject | None)
r   r@   r  r(  r  r)  r  r*  rz   rh  r   r@   rz   r  )
r   r@   r  r  r  r)  r  r2   rz   z%tuple[list[object], list[FakeTensor]])
r  rH   r   r@   r  r)  r   r   rz   r/   )r  r<  rz   r'   r  )
r   r@   r  zSequence[FakeTensor]r  r)  r  r*  rz   r{   )r  r   r  r   r(  rj  r)  rk  r*  r  rz   r   )NrZ   r[   r\   r}  r]   r~  r  r   rU  r  r  ry  r  r  ru   r  r  rm  r  r  r3   r#   r  r  r  r/  r  r  r  r  r  r  rD  r  r'  r  rD  r  r  r  r  r  r  r   r  r  r  r  r  r  rt  r5  r<  r  as_strided_scatter
as_stridedas_strided_ru  detachview_as_realview_as_complexr?  source_Storage_storage_offset(_sparse_coo_tensor_with_dims_and_tensorsr7  viewr  slicer   r  r  
lift_freshlift_fresh_copyr  r  r  r  r   r   s   @r`   r   r     s   :<E7<JL#%0%5NN5 E3N!&$& !##"&((
 (,&+%)%) ![D !%[D  $	[D
 #[D #[D  ![D" 
#[DzDA 

 

  
  "$'5'7  	
 % 
 &6V,V &V %	V
 
V$   	
 	
  ^^ ^ 	^
 %^ 
^@55 5 	5
 %5 
5nDDDD DD %	DD
 
DDLA#A# IA# 	A#
 (A# 
A#F(C(C (C 	(C
 (C %(C "(C 
(CTKK K 	K
 K %K K 
'KZii i 	i
 i %i "i 
"iVQ8Q8 -Q8 	Q8
 Q8 Q8 
Q8f ( 	
   
;22A2 2 	2
 2 %2 
2p "$'5'7BB B 	B
 %B 
BBoo&-o5;oCIo	#obJ=J= J= 	J=
 J= J= 
J=XF
F
 F
 	F

 %F
 
F
Z 3>	3/	
1515 '15 $	15
 15 
/15f/!/! /! $	/!
 /! 
/!d -1)	< !,

  ""''  

!!$$		//55==! +6		!!

+'6
 4??22D4H4H4P4PQH
WW  4W 	W
 %W 
W: &* $37

 #	

 
 1
 
 

r_   c                   ddl m}m} t        j                  j
                  j                  j                         du}|r ||      D ]  }t        d       y ||      D ],  }|j                  D ]  }|| j                  vst        d       . y)a  
    Validate symbolic content in output and raise _BypassDispatchCache if
    caching should be bypassed.

    Args:
        state: Cache key state containing known symbols
        output: Output to validate
        proxy_mode_active: Whether PROXY dispatch mode is currently active

    Raises: _BypassDispatchCache: If output contains symbolic content that
        prevents caching

    Details:

    If our output contains any symbols that didn't appear in the input then we
    need to bypass. Usually this will be unbacked symbols which can't be
    properly reconstructed but there could be "weird" cases where backed symbols
    spontaneously appear (from non-input state)?

    If we're proxy (symbol) tracing and the output contains ANY symbols then we
    need to bypass. The problem is that ProxyTorchDispatchMode relies on SymNode
    object identity and being able to see the construction of SymNodes.

    We could improve the proxy tracing case in a few ways:

    1. If the output SymNodes are directly copied from inputs then this is
       actually fine - they're already tracked. This would probably be the
       biggest bang/buck.

    2. If the output (tensors) are all direct copies of the inputs then this is
       also fine - since they're inputs they must be tracked. We already compute
       this we just don't plumb it around enough.

    3. If the output SymNodes are already tracked by the proxy then this is also
       actually fine - they're properly tracked. This probably wouldn't be
       common since for most outputs we use torch.empty_strided() and recompute
       strides.

    4. We could use the proxy to track "how" the SymNodes were computed and when
       using the cache we could "replay" them properly to teach the proxy how to
       build them.
    r   )_iterate_exprs_iterate_nodesNzProxy mode with SymNode outputzunrepresented symbol in output)r=  rS  rT  rh   r  r  r  r  rs  r`  r  )r  r  rS  rT  r  r   r  ra  s           r`   r  r    s    Z U&&33BBDDPJ  ' 	IA&'GHH	I  ' 	QA.. Q!4!44./OPPQ	Qr_   c                    t         j                  j                  |j                  v ri t	               5  d fd}|D cg c]
  } ||       }}t
        j                  ||      \  }} ||i |}	d d d        t               |D ]H  }
t        |
t              st        |
      r j                  |
j                         j                         J d fd}t
        j                  |	      S c c}w # 1 sw Y   xY w)Nc                    j                  |       r\t        j                  | | j                        }| j                  r|j                  | j                                | t        |      <   |S | S )Nro  )r  rh   
zeros_liker  r   _coalesced_r;  r  )r  r   r   	inp_implss     r`   to_real_tensorz+run_fallback_kernel.<locals>.to_real_tensore  sY    $$Q'&&q?;;OOANN$45%&	"S'"
Hr_   c                "   t        |       vr9t        | t              r)t        |       s| j	                         j
                  v rt        | t              r7t        |       v rt        |          S j                  j                  |       S | S r   )r  r   r   r   r  _cdatar  rb  )r  r   rY  orig_not_implemented_exceptionstoragess    r`   map_outz$run_fallback_kernel.<locals>.map_out  s    a5	!q&!!!$  "))X500a !u	! A'' 66GG	STUUHr_   )r  rE   rz   z
T | Tensorr*  )rh   r  r  r  r)   r   r  r  r   r   r   r  r  r\  r0   )r   r   r  r  r]  rZ  rL  r  r  r  r  r_  rY  r^  s   `   `       @@r`   r  r  Q  s     yy*,, I 
 "	 1::1^A&:	:,,Y	Bf$!&!"  &)UH 8a  #Q--/6678   ??7A&&C ;" "s   C:C5#C:5C::Dc                .    |j                          || |<   y r   )r`  r}  r   r  s      r`   r  r    s    
 E#Jr_   c                    || |<   y r   r^   ra  s      r`   r  r    s    
 E#Jr_   c                  4    e Zd ZddZ	 	 d	 	 	 	 	 	 	 	 	 ddZy)FakeCopyModec                    || _         y r   )r   )rt   r   s     r`   ru   zFakeCopyMode.__init__  s	    "r_   Nc                   |r|ni }|t         j                  j                  j                  u rTt	        |d   t
              st        dt        |d                 || j                  j                  |d   d      fi |S |t
        j                  u rt        |      dk7  st        |      dk7  r$t        dt        |       dt        |       d      t        t
        |d         }t        t        t        t        f   |d	         }t!        |      |v r|t!        |         S | j                  j                  |d      }||t!        |      <   |S t         j                  j#                         5   ||i |cd d d        S # 1 sw Y   y xY w)
Nr   rI  T)r     z3Expected 2 args and 0 kwargs for __deepcopy__, got z
 args and z kwargsr5   )rh   ri   
TensorBaser  r   r   r   r   r   r  __deepcopy__r  r   r   rU  r   r  DisableTorchFunctionSubclass)rt   r   r  r  r  r  memor   s           r`   __torch_function__zFakeCopyMode.__torch_function__  sw    "r 588&&,,,d1gv.$'<T$q']O%LMM**47$*GKQ  V(((4yA~V!1$I#d)T^_bci_j^kkrs  &$q'*FS*_-tAw7D&zT!BvJ''..,,V4,HC"DFJ668 -T,V,- - -s   ,E>>F)r   r   rz   r{   )r^   N)
r   r@   r  r(  r  r)  r  zMapping[str, object] | Nonerz   r   )rZ   r[   r\   ru   rl  r^   r_   r`   rd  rd    sD    # "$.2 - -  - 	 -
 , - 
 -r_   rd  c                    t        |       dk7  st        | d   t              st        d      | d   j                  j
                  rt        j                  d      S | d   j                  S )Nr5   r   z<Expected exactly one FakeTensor argument for _device_handlerrd  )	r  r   r   r   r   ry  rh   r   r  r  s    r`   _device_handlerro    s`     4yA~ZQ<J
 	
 Aw--||F##Aw"""r_   c                &    t        d | D              S )Nc              3  2   K   | ]  }t        |        y wr   )r  )r   r   s     r`   r   z&_check_for_subclass.<locals>.<genexpr>  s     =a&q)=   )r  )r  s    r`   r  r    s    =9===r_   c                    t        | t              ryt        | t              syt        |       }|t        u ryt	        |t
        j                  j                        xr |j                  t        j                  u }|ryy)NFT)	r   r   r   r   r  rh   r@  rA  r  )r   x_type#is_metadata_only_parameter_subclasss      r`   r  r    sp    !Z a !WF 	6588--. 	C%%)B)BB ( +r_   c                d    t        d t        t        | d         j                         D              S )Nc              3  2   K   | ]  }t        |        y wr   rU  r   r  s     r`   r   z<lambda>.<locals>.<genexpr>  s      4A4rr  r   )rB  r   r   rz  rn  s    r`   rw  rw    s,    e 4VT!W-2244 / r_   c                d    t        d t        t        | d         j                         D              S )Nc              3  2   K   | ]  }t        |        y wr   rx  ry  s     r`   r   z<lambda>.<locals>.<genexpr>  s      6A6rr  r   )rB  r   r   r4  rn  s    r`   rw  rw    s,     6VT!W-4466 1 r_   c                V    t        t        t        | d         j                               S r  )rU  r   r   r7  rn  s    r`   rw  rw    s"    VT!W,,.9 r_   )_device_not_kwarg_ops_is_tensor_constructor_like_tensor_constructorscontains_tensor_typesr  r  r  r  c                h    | t         j                  v r t         j                  j                  |        y y r   )r   r}  r   r  s    r`   r  r  %  s)    
n"""  % #r_   c                    t         j                  d       t         j                  dt        j                         t         j                  dt        j                         t        j
                  } | rjt         j                  d       t        d | D              }t        | j                         d       D ]#  \  }}t         j                  d|d	z   | d
|       % y y )NzFakeTensor cache stats:z  cache_hits: %sz  cache_misses: %sz  cache_bypasses:c              3  2   K   | ]  }t        |        y wr   )r  )r   rB  s     r`   r   z#dump_cache_stats.<locals>.<genexpr>2  s     -qCF-rr  c                    | d    S rp   r^   )r!  s    r`   rw  z"dump_cache_stats.<locals>.<lambda>3  s    AaD5 r_   r  z    %-*s %sr5   r  )	r  infor   r~  r  r  maxsortedr   )ry  widthrB  r   s       r`   dump_cache_statsr  *  s    HH&'HH!:!:;HH!>#>#>?,,H$%-H--8>>+A 	;DAqHH]EAI!Aw:	; r_   c                &   dfd}|j                         dk7  r |d|j                                 t        |j                               D cg c]5  }t        j                  j
                  j                  | j                        7 }}dg|j                         z  }t        |j                               D cg c]	  \  }}||f }	}}|	j                  d        d}
|
}|	D ]P  \  }}||
k7  r' |d|j                   d	|j                          d
       |||<   |
|j                  |   z  }
|||   z  }R | 5  t        j                  |||j                  |j                  |j                        cd d d        S c c}w c c}}w # 1 sw Y   y xY w)Nc                <    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.)rK  r  )r   rs  s    r`   unsupportedz1_infer_fake_from_real_tensor.<locals>.unsupported:  s1    **,((9VH EKL
 	
r_   r   z'a return has a non-zero storage offset r  c                    | d   | d    fS r"  r^   )r   s    r`   rw  z._infer_fake_from_real_tensor.<locals>.<lambda>]  s    !qte} r_   r  r5   z(a return was not dense in memory (sizes z	 strides ))r   rI  r   )r   r~   rz   r{   )r7  r  rK  rh   r  r  allocate_sizer1  r  r4  sortr3  r<  r   rI  r   )r   rs  r  r  r   
fake_shapefake_stridesr   r  rn  expectedfake_strides    `          r`   r  r  7  s   
  A%5h6M6M6O5PQ	
 x||~& 	  ..t~~>J  4(,,.(L&/0A&BCFC3xCGCLL,L-HK 43=:8>>:J)T\TcTcTeSffgh (ShnnS11!JsO34 
 
""??..??

 
5 D
 
s   :E<;F:8FFc                   | j                   t        d      t        j                  |      \  }}t	        d |D              st        d|j                         |D cg c]  }t        | ||       }}t        j                  ||      S c c}w )Nzmode.shape_env must not be Nonec              3  P   K   | ]  }t        |t        j                           y wr   )r   rh   r   r  s     r`   r   z5inferred_fake_kernel_from_real_out.<locals>.<genexpr>}  s     Bqz!U\\*Bs   $&zPpropagate_real_tensors: we don't support operators that return non-Tensors. Got )	r1  r   r   r  r  rK  r   r  r  )r   rs  r  real_flat_outspecr   fake_flat_outs          r`   r  r  s  s     ~~>??
 !--h7M4BMBB  "

|-
 	

 IVV11$A>VMV  55 Ws   B
)rk   r~   rz   r  )r   rE   rz   zdict[T, Literal[True]])rz   z/Generator[TorchDispatchMode | None, None, None])r   r   rz   zGenerator[None, None, None])r   z!Tensor | TraceableWrapperSubclassr   (list[Tensor | int | SymInt | OpaqueBase]rz   r  )r   rH   rz   zTypeGuard[Tensor])r   rH   rz   r&  )r   r@   rz   ztorch._C._SchemaInforE  )r   ztype[T]r   r/   rz   zlist[T])r   rH   rz   r  r$  )r   r   rz   r2  )r  r6   r  r   rz   r{   )r   r   r   r@   r  r)  r  r/   r]  rK  rz   r   )r}  r|  r   rS  r  _DispatchCacheEntryrz   r{   )r  r)  rz   r   )r  r)  rz   r  )r   rH   rz   r  )r   rS  rz   r{   ry   )r   r   rs  torch._ops.OpOverloadr  torch.Tensorrz   r  )r   r   rs  r  r  r   rz   r   )
__future__r   atexitr9  r@  r  rU  rR  r  	threadingr  r  typingr   collectionsr   r   r   r   r   r	   r
   r   r   typing_extensionsr   r   r   r   rh   torch._library.utilsr  r  r  r   r   r   r   torch._C._functorchr   r   "torch._library.fake_class_registryr   torch._library.fake_profiler   torch._loggingr   torch._opaque_baser   torch._prims_commonr   torch._subclasses.meta_utilsr   r   r   r   r    torch._utilsr!   r"   torch.fx.immutable_collectionsr#   torch.fx.operator_schemasr$    torch.multiprocessing.reductionsr%   torch.overridesr&   torch.typesr'   r(   torch.utils._mode_utilsr)   torch.utils._python_dispatchr*   r+   r,   torch.utils._pytreer-   r.   r/   r0   r1   r2   torch.utils._statsr3   torch.utils._tracebackr4   _fake_tensor_utilsr6   r7   r8   collections.abcr9   r:   r;   r<   r=   r>   torch._guardsr?   
torch._opsr@   r=  rA   rB   	getLoggerrZ   r  _logginggetArtifactLoggerr  r  r  r  r~   r  DimList_pytreer   rE   r  r  r  r:  rr   rG   	frozensetr]   r  r}  rl   rn   rK  r}   r   r   r   r   r   r   localr   r  r   contextmanagerr   r   r   r   r   r   r   r   r   r  rv  r  r  r  r  r   r6  r2  rQ  rS  rb  re  rk  ro  r  rP  rs  ru  r   rH   _StoragePointerr  r  r  r  rd  ro  r  r  r  r   r  rz  r4  r7  r  r;  r=  r>  profiler_record_function_exit_RecordFunctionrW  torch._subclasses.fake_implsr}  r~  r  r  r  r  r  r  r  registerr  r  r  r^   r_   r`   <module>r     s   "       	      # ! O O O 5 5 !  , , 3 3 T ? 8 , ) 5  H 9 8 ; - 1 / 
 W V $ 4 R R PP#$%Og!		)	)(4J	K..::8EVW 			CLzz~~ % * 09&660 ,    \  
L 
  ,   <   <   <   L  GIOO G  /& - - , ,/ 
2 .	& F F . . 	D 	D@
$W Wt 
 
 @@ @ @.B B@E @EFR4 R4j &79LLM  *% *% *%Z#L $ $ $8	 	 $d#3 3 $3$ $d#
" 
" $
" $d#  $ 25NN $d#9  $ $d#  $(u
& u
p; :Q:Q#-:Q	:Q|>'>'
>'  >' 	>'
 %1>' >'B7	  
	7	  
	$-$ $-N#6>2 
IINN!!?	IINN " 
IINN!! $ 
IINN!!)) ,  (	IINN''	IINN$$	IINN%% 
II,,<< 	 	 	&
 	; 	;9

9
39
?K9
9
x6
636?B66Yq  )SV3/g//;M0MN 	s   )X Y
"YY
