
    9j,                   0   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 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-m.Z. d dl/m0Z0 d dl1m2Z2m3Z3m4Z4m5Z5m6Z6 d dl7m8Z8m9Z9 d dl:m;Z; d dl<m=Z= d dl>m?Z? d dl@mAZA d dlBmCZCmDZD d dlEmFZF d dlGmHZHmIZI d dlJmKZKmLZLmMZMmNZNmOZOmPZP d dlQmRZR d dlSmTZT ddlUmVZVmWZWmXZX er(d dlYmZZZm[Z[m\Z\m]Z]m^Z^ d dlm_Z_ d dl`maZa d d lbmcZc d d!ldmeZemfZf  ej                  eh      Ziej                  j                  ehd"      Zl	 ej                  j                  ehd#      ZmeqZrej<                  j                  Zt ed&      Zuej                  j                  j                  ZxdZyd azej                  dvd'       Z| G d( d)      Z}e G d* d+e~             Ze G d, d-e~             Ze G d. d/e~             Ze G d0 d1e~             Ze G d2 d3e~             Ze G d4 d5e~             Z G d6 d7e	j
                        Z e       Zdwd8Zej                  dxd9       Zej                  dyd;       Z	 	 	 	 	 	 dzd<Zd{d=Zd|d>Zej                  d}d?       Zej                  d~d@       ZddAZddBZ G dC dD      Zej                  ddE       Zej                  	 	 	 	 dydF       Zd~dGZ G dH dI      Z G dJ dK      Z G dL dMe#      ZeeCdNdOf   Z edPQ       G dR dS             ZddTZ edPQ       G dU dV             Z G dW dX      Z edPdPY       G dZ d[             Z edPdPY       G d\ d]             Z edPdPY       G d^ d_             Zereez  Z edPdPY       G d` dae             Z edPdPY       G db dc             Z G dd d:eI      ZeZ	 	 	 	 	 	 ddeZ	 	 	 	 	 	 	 	 	 	 	 	 ddfZ	 	 	 	 	 	 	 	 ddgZ	 	 	 	 	 	 	 	 ddhZ G di djeA      ZddkZddlZddmZej                  jb                  jd                  jf                  eej                  j                  jh                  jf                  dn ej                  j                  jj                  jf                  do ej                  j                  jl                  jf                  dp iZ eej                  j                  jp                  jf                  ej                  j                  jr                  jf                  ej                  j                  jt                  jf                  ej                  jv                  jx                  jz                        Zd dqlmZmZmZmZmZmZmZmZ ddrZej                  dds       Z	 	 	 	 	 	 	 	 ddtZ	 	 	 	 	 	 	 	 dduZy# en$ r-Zod$ epeo      v r ej                  ehd%z         ZmneoY dZo[odZo[oww xY w)    )annotationsN)defaultdict)	dataclass)AnycastLiteralTYPE_CHECKING	TypeGuardTypeVarUnion)Self)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)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                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    ]/media/conek/DATA/Code/OCR/venv/lib/python3.12/site-packages/torch/_subclasses/fake_tensor.py_is_indexed_device_typerN   Z   s3    ..0      c                      e Zd ZddZddZy)IncrementRecursionCountc                    t         dz  a y Nr2   RECURSION_COUNTselfs    rM   __init__z IncrementRecursionCount.__init__k       1rO   c                    t         dz  a y rS   rT   rV   s    rM   __del__zIncrementRecursionCount.__del__o   rY   rO   NreturnNone)__name__
__module____qualname__rX   r[    rO   rM   rQ   rQ   j   s    rO   rQ   c                      e Zd ZU ded<   y)UnsupportedFakeTensorExceptionstrreasonNr_   r`   ra   __annotations__rb   rO   rM   rd   rd   t       KrO   rd   c                      e Zd ZU ded<   y)DynamicOutputShapeExceptionr=   funcNrg   rb   rO   rM   rk   rk   y       
rO   rk   c                      e Zd ZU ded<   y)DataDependentOutputExceptionr=   rl   Nrg   rb   rO   rM   ro   ro   ~   rm   rO   ro   c                      e Zd ZU ded<   y)UnsupportedOperatorExceptionr=   rl   Nrg   rb   rO   rM   rq   rq      rm   rO   rq   c                      e Zd ZU ded<   y)$UnsupportedMutationAliasingExceptionre   rf   Nrg   rb   rO   rM   rs   rs      ri   rO   rs   c                      e Zd ZU ded<   y)MetadataMismatchErrorre   rf   Nrg   rb   rO   rM   ru   ru      ri   rO   ru   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)ry   weakrefWeakSetrz   rV   s    rM   rX   zFakeTensorTLS.__init__   s    .2+5<__5F2rO   Nr\   )r_   r`   ra   rh   rX   rb   rO   rM   rw   rw      s     %0/+FFGrO   rw   c                 .    t         j                  | d      S NT)dictfromkeys)itemss    rM   ordered_setr      s    ==%%rO   c               #  *  K   t         j                  j                  t         j                  j                  j                        } 	 |  |  t         j                  j                  |        y y # |  t         j                  j                  |        w w xY wwr|   )rI   rJ   _unset_dispatch_mode_TorchDispatchModeKeyFAKE_set_dispatch_mode)olds    rM   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     rM   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     rM   	<genexpr>z$get_plain_tensors.<locals>.<genexpr>   s     G3GD#&Gs   )popr(   append__tensor_flatten__extendreversed)subclassouttodo
inner_keys_r   s        @rM   get_plain_tensorsr      sf     :D
xxz,T2JJt//1
AG(:2FGG  JrO   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   FunctionalTensorTrb   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   elemrI   _is_functional_tensorrJ   $_functionalization_reapply_views_tls
_functorch_unwrap_functional_tensorr   get_unwrapped)xr   attrsr   got_fakeattrvfake
unexpectedreapply_views	unwrappeds              rM   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!!rO   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   rb   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   rI   r   rJ   r   r   r   r   r   )tr   inner_tensor_namesr   modet_namer   mr   r   r   s              rM   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--rO   c                T    t         j                  j                  | j                        S r|   )rI   rJ   _SchemaInfo_schemarl   s    rM   get_schema_infor     s    88--rO   c                    ddl m} t        j                  j                  }||    j
                  j                  d      xr ||    j                  t        |      v S )Nr   decomposition_tableztorch._decomp)	torch._decompr   rI   _decompdecompositionsr`   
startswithr_   dir)rl   r   r   s      rM   torch_decomp_decompositionsr     sV    1]]11N t$//:: D
d
#
,
,N0C
CDrO   c                p    t         j                  |      }|D cg c]  }t        ||       s| c}S c c}w r|   )pytreetree_leavesr   )tytree	flat_valsr   s       rM   tree_flatten_onlyr   &  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   layoutrI   strided	is_sparse	is_nestedr   r   r   )r   s    rM   _is_plain_tensorr   +  sx    Q6 	
HH%	
 KK .{{.*1-. 'q). **1-

rO   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ddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ	 	 d	 	 	 	 	 	 	 	 	 	 	 ddZy)FakeTensorConverterc                .    | j                   j                  S r|   )meta_convertertensor_memorV   s    rM   r   zFakeTensorConverter.tensor_memo>  s     ""...rO   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   )rW   r   r   s      rM   rX   zFakeTensorConverter.__init__J  s     +i@ )+%rO   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)rW   fake_tensorweak_sts      rM   add_constant_storage_mappingz0FakeTensorConverter.add_constant_storage_mappingQ  s     +z2k6J6J6R !STT !5!5!D!D!FG
 $77757D))'2%%g.55gkk+6NOrO   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   )rW   tensorr   weak_tensor_reftens        rM   invalidate_constant_aliasesz/FakeTensorConverter.invalidate_constant_aliases`  s    fj) !KLL !6!6!89$777#<<WE 	$O!#C  "#	$ ))'2rO   c                    | j                   j                  j                  j                  |      }|y | j                  j                  |      S r|   )r   	describerlookup_tensorgetr   )rW   r   tids      rM   	_get_memozFakeTensorConverter._get_memoq  sC    !!++99==a@;##C((rO   c                    | j                   j                  j                  |      }|| j                   j                  |<   y r|   )r   r   get_tensor_idr   )rW   r   r   r   s       rM   set_tensor_memoz#FakeTensorConverter.set_tensor_memow  s4    !!++99!</0'',rO   NT)sourcesymbolic_contexttracec               
   |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      dd	lm} d }| j(                  st+        |      r|j-                         dk(  r|j.                  j                  d
k(  ru|j0                  t         j2                  t         j4                  t         j6                  t         j8                  t         j:                  fv r|t        ||      s|ddlm}m} ddlm } tC               5  |jE                         }d d d        tG        jH                  |      stG        jJ                  |      st        ||      r|jL                  }n ||      }|jO                  |||jP                  |      }|j0                  t         j2                  k(  r|jS                  |||      |_*        n6|j0                  t         j:                  k(  r|jW                  |||      |_*        |r| jY                  |       |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_tdevicer   r   s     rM   mk_fake_tensorz<FakeTensorConverter.from_real_tensor.<locals>.mk_fake_tensor  s7      
!M &	
 
 
s   *3)	shape_envcallbackr   r  r  zmeta converter nyi)RandomValueSourcecpu)CallMethodItemSourceFloatTensorSource)
DimDynamic)r   dynamic_dimr  )hintr   )r  zCallable[[], object]r  ztorch.device | strr]   r   )-rI   _guardsTracingContexttry_gettensor_to_context%torch.fx.experimental.symbolic_shapesr  r   r   r   tensor_sourcer   is_quantizedrd   nn	Parameterr   NotImplementedtorch._dynamo.sourcer  r   r   dimr  dtypeint64int32int16int8float64r  r  r  r'   itemmathisnanisinfbasecreate_unspecified_symbolDYNAMICcreate_symintnode	item_memocreate_symfloatnoder   )rW   r   r   make_constantr
  r   r  r  tracing_contextr  
maybe_memor	  r   r  valuer  r  r  item_sourcesymbolr   s    `                  @rM   from_real_tensorz$FakeTensorConverter.from_real_tensor  s     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: #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   4K99L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   )rW   r   r   r  r8  r9  r1  r   s           rM   from_meta_and_devicez(FakeTensorConverter.from_meta_and_device  s}     88==F" 6qxx}}oXN 
 ^^A&
!q&}
 	Q$
rO   )r]   zRweakref.WeakValueDictionary[torch._subclasses.meta_utils.MetaTensorId, FakeTensor])r   r   r   r   r]   r^   )r   r   r]   r^   )r   r   r]   r^   )r   r   r]   FakeTensor | None)r   r   r   r   r]   r^   )FN)r   r   r   r   r/  r   r
  ShapeEnv | Noner   Source | Noner  SymbolicContext | Noner  r   r]   r   )NN)r   r   r   r   r  torch.devicer8  ztype[torch.Tensor] | Noner9  torch.DispatchKeySet | Noner]   r   )r_   r`   ra   propertyr   rh   rX   r   r   r   r   r5  r:  rb   rO   rM   r   r   =  s   /
/ / .-SSL,1% +P3")1 $%)S !%37S!S S 	S
 #S S 1S S 
Sv -159!  	
 * 3 
rO   r   c                    t         j                  j                  d      | j                  k(  rIt         j                  j
                  t        j                  d|       nt        j                  d|        y y )NTr2   r  )rI   acceleratorcurrent_acceleratorr   versionhipemptyzerosrC  s    rM   init_gpu_contextrJ  /  sX     ,,T2fkkA }}  ( KK&)Qv.	 BrO   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_invocationrI   rJ   _meta_in_tls_dispatch_includer   _DisableTorchDispatch_PreserveDispatchKeyGuard!_set_meta_in_tls_dispatch_include)r   prev_in_kernelmeta_in_tlss      rM   in_kernel_invocation_managerrT  :  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   )rI   rJ    _should_allow_numbers_as_tensorsnamesplitr   s    rM   should_allow_numbers_as_tensorsr[  R  sB    8844		$#))#.q1 rO   c                  J    e Zd Zej                  j                  dd      dk(  Zy)FakeTensorConfigTORCH_FAKE_TENSOR_DEBUG01N)r_   r`   ra   osenvironr   debugrb   rO   rM   r]  r]  X  s    JJNN4c:cAErO   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)SymNumberMemoDescriptorre   _namer   _is_nested_intFis_nested_intc                   || _         y r|   )rg  )rW   ri  s     rM   rX   z SymNumberMemoDescriptor.__init__q  s
    +rO   c                    || _         y r|   rf  )rW   ownerrY  s      rM   __set_name__z$SymNumberMemoDescriptor.__set_name__t  s	    
rO   c                     d| j                    S )Nr   rl  rW   objs     rM   _memozSymNumberMemoDescriptor._memow  s    4::,rO   c                "    d| j                    dS )Nr   _vcrl  rp  s     rM   _memo_vcz SymNumberMemoDescriptor._memo_vcz  s    4::,c""rO   c                "    d| j                    dS )Nr   _epochrl  rp  s     rM   _memo_epochz#SymNumberMemoDescriptor._memo_epoch  s    4::,f%%rO   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   rr  r   rI   r   noder  rg  ru  _versionrx  r   epochsetattr)rW   rq  objtypers       rM   __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$/rO   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}  rr  ru  rx  is_inferencerg  r{  r   r|  )rW   rq  r2  s      rM   __set__zSymNumberMemoDescriptor.__set__  s    
 =CC$/Cs+T2C))#.5!!#t':':CC%0&&T]]3/>C))#.0C0CD	 (;rO   )ri  r   r]   r^   )rm  re   rY  re   r]   r^   )rq  r   r]   re   r|   )rq  r   r~  ztype[FakeTensor] | Noner]   z$torch.SymInt | torch.SymFloat | None)rq  r   r2  zBtorch.SymInt | torch.SymFloat | torch.SymBool | int | float | Noner]   r^   )r_   r`   ra   rh   rX   rn  rr  ru  rx  r  r  rb   rO   rM   re  re  g  su    J 05 , #& CG(?	-,EE RE 
	ErO   re  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j$                  d(d       Zed)d       Ze	 	 	 	 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!	 	 	 d0d"Zd1d#Z  xZ!S )2r   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_memoTrh  type[Tensor] | Noner8  r@  r9  c                p    | j                   j                  rt        j                  d      S | j                  S Nr7  )r   rM  rI   r  fake_devicerV   s    rM   r  zFakeTensor.device  s,     >>..<<''###rO   c                    t         r|   NotImplementedErrorrW   r   s     rM   r  zFakeTensor.device      !!rO   c                    | j                   S r|   )r  rV   s    rM   r  zFakeTensor.fake_device  s       rO   c                0    | j                  |      | _        y r|   )_normalize_fake_devicer  )rW   r  s     rM   r  zFakeTensor.fake_device  s     77?rO   c                    t        d      )Nz+torch.compile doesn't support named tensors)rd   rV   s    rM   nameszFakeTensor.names  s     -9
 	
rO   c                    t         r|   r  r  s     rM   r  zFakeTensor.names  r  rO   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.)rD   rF   rG   :z:0)	r   rJ  rN   indexr   rI   is_initializedr  current_devicerC  s    rM   r  z!FakeTensor._normalize_fake_device   s     ;;/)V$"6;;/FLL4H{{e#v{{(C(R(R(T{{m1WUFKK%@%O%O%Q$RS
  R&89rO   c                *   t        j                  | ||j                  d|      }|j                  s t        j
                  j                  |       nt        j
                  j                  |       |j                  j                  dk7  r"t        d|j                  j                         t        |t        j                        r|nt	        j                  |      }|j                  s|j                  dk(  rt        d      ||_        ||_        ||_        ||_        ||_        t        |t$              rt        d      ||_        d |_        d |_        d |_        d |_        d |_        t2        j4                  rt7        j8                         |_        |S )NT)dispatch_devicedevice_for_backend_keysr7  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   _make_subclassrequires_grad_allow_unsafe_data_ptr_accessrI   rJ   _set_throw_on_mutable_data_ptr(_set_warn_deprecated_on_mutable_data_ptrr  r   r   r   
allow_metar  r   r   r8  r9  r   r  r  r-  r  r  nested_int_memor]  rc  r1   extract_debug_trace)	clsr   r   r  r   r  r8  r9  rW   s	            rM   __new__zFakeTensor.__new__  s]    $$ $*
 66HH33D9HH==dC;;v% 78H8H7IJ  &fell;fAU ##{{f$$M  "" *k:. !GHH& '+$#!! 1 9 9 ;DrO   c                    t         |           t        j                  j	                         rEt        j
                  j                  j                  r t        j                  j                  |        y y y r|   )superrX   rI   compileris_exporting_exportconfig#detect_non_strict_fake_tensor_leaksfake_tensor_tlsrz   add)rW   argskwargs	__class__s      rM   rX   zFakeTensor.__init__[  sP    NN'')$$HHAAEEdK I *rO   c                $    |j                  |       S r|   )from_tensor)r   r   s     rM   r  zFakeTensor.from_tensorc  s    $$Q''rO   rb   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)	Nr2   r   z@Expected exactly one FakeTensor argument for prim.device.defaultr7  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)rI   opsprimr  defaultlenr   r   r   r   rM  r  _DISPATCH_META_HANDLERSr   
issubclassr   not_implemented_logrc  r  r   arg_tree_leavesrJ   _get_dispatch_moder   r   )r  rl   typesr  r  handlerr   unrecognized_typesr   argmaybe_cur_fake_modes              rM   __torch_dispatch__zFakeTensor.__torch_dispatch__g  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   rC  s    rM   is_device_cpuz5FakeTensor._find_common_device.<locals>.is_device_cpu  s    ;;%''rO   c                     | j                   dk(  S r  r  rC  s    rM   is_device_metaz6FakeTensor._find_common_device.<locals>.is_device_meta  s    ;;&((rO   c                R     | j                         xr | j                         dk(  S Nr   )r  r  )r   r  s    rM   cpu_zero_dimz4FakeTensor._find_common_device.<locals>.cpu_zero_dim  s!     *;quuw!|;rO   c                `  	 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        d	 d d| j                         )Nz,Unhandled FakeTensor Device Propagation for z, found two different devices rL  )r   r   r  anymaprI   r   r  fake_tensor_prefer_device_typer   RuntimeError)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_opscommon_devicer  rl   is_cpu_zero_dimr  r  meta_rhs_mixed_device_fnsmixed_device_fnss         rM   merge_devicesz5FakeTensor._find_common_device.<locals>.merge_devices  s^    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)/ >tfDbcpbqqstut|t|s}~ rO   Tr  z!Could not find common device for )r  r?  r]   r   r   r   r]   r   )r   objectr]   r^   )r   aten_foreach_copyr  add_r   	nextafterr[  rI   r  r   )rl   	flat_argshas_scalar_only_inputsr  r  r  r  r  r  r  r  r  r  s   `    @@@@@@@@rM   _find_common_devicezFakeTensor._find_common_device  s     !& '&&
 %0II%
!
 0;NN""0
,	(	)	<?	 ?	B  	C#	 +40]5J%)"!LL/M  #DTF!KLL444rO   r2   )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   rI   r   r   r   )rW   r  s     rM   get_nested_intzFakeTensor.get_nested_int.  s|    
 '#'>>#L#L! $M $D  $..= CDI]I]D^C_`  ##e++rO   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   r2   )r  r%  tolist)rW   r   s     rM   r  zFakeTensor.tolist>  s^    88:?99;XXZ1_,01DDIIK11.23dDKKM33 23s   A3A8)r]   r?  )r   r?  r]   r^   r  r?  r]   r^   )r]   	list[str])r   r  r]   r^   )r  r?  r]   r?  )NNNN)r   r   r   r   r  r?  r   r  r  r  r8  r  r9  r@  r]   r   )r  r  r  r  r]   r^   )r   r   r   r   r]   r   
rl   r=   r  Sequence[type]r  Sequence[object]r  Mapping[str, object]r]   r  )rl   r=   r  r  r]   ztuple[torch.device, bool])r  zint | torch.SymIntr]   ztorch.SymInt)r]   r   )"r_   r`   ra   __doc__rh   re  r  r-  r  r  r  rI   rJ   r   r   	_mode_keyrA  r  setterr  r  staticmethodr  r  rX   r  classmethodr0   r!   r  r  r  r  __classcell__r  s   @rM   r   r     sf    
 :Q9RL6R')I8O8QK5Q! A  .DAO
  .. ..33I$ $ ]]" " ! ! @ @& 
 

 \\" "    #'%)&*597!7 7 	7
  7 #7 $7 37 
7 7VL ( ( 

 "$'5'7L)L) L) 	L)
 %L) 
L)  L)\ t5t5%5t5	"t5 t5r %&, ", 
	, 4rO   r   r4   r5   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.dtyper  ztuple[_MetadataIntLike, ...]shapestrider?  r  ztorch.layoutr   ztorch.memory_format | Nonememory_format_MetadataIntLikestorage_offsetz_MetadataIntLike | Nonestorage_bytesr   r  r  is_conjis_negr  r   rx   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   rY  r   tuplelistrI   Size_prep_args_for_hashclearr   convert_sym_intr   )rW   resultr   statefieldr2  id_hashed_objectss          rM   _flatten_intozTensorMetadata._flatten_intob  s     !''- 	%ED%**-E%%uzz!:; 35!((?PQ!'')E6*%%fe4e$	%rO   N)r  list[object]r   r   r  r3   r]   r^   )r_   r`   ra   r  rh   r  rb   rO   rM   r  r  J  s     ''((--$$**MLO%% % 	%
 
%rO   r  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.
    )r  Nrb   )r   _has_symbolic_sizes_stridesr   is_contiguousr
  r  r  r  r   rI   r   r  r  untyped_storagenbytesr  r  r  r  r  r   r  r  r  )r   r  r
  s      rM   extract_tensor_metadatar&  x  s    *!,M 	
%%];%%'N		hh%--/
R		,9!,<""$$						
		KKT&q)t'*% $ 15% rO   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   hashr+  )rW   tups     rM   rX   z_DispatchCacheKey.__init__  s    crO   c                X    t        |t              xr | j                  |j                  k(  S r|   )r   r(  r   )rW   others     rM   __eq__z_DispatchCacheKey.__eq__  s"    %!23MEII8MMrO   c                    | j                   S r|   )r+  rV   s    rM   __hash__z_DispatchCacheKey.__hash__  s    ~~rO   c                h    | j                   D ]#  }t        |t              s|j                          % y r|   )r   r   r4   strip_shape_env)rW   r   s     rM   r5  z!_DispatchCacheKey.strip_shape_env  s-      	$A!_-!!#	$rO   N)r.  r)  r]   r^   )r0  r  r]   r   )r]   r*  r\   )	r_   r`   ra   r  rh   rX   r1  r3  r5  rb   rO   rM   r(  r(    s)     
N#N$rO   r(  c                      e Zd Zy)SingletonConstantN)r_   r`   ra   rb   rO   rM   r7  r7    s    rO   r7  )frozenr  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)r_   r`   ra   r  rh   r7  r>  rb   rO   rM   r:  r:    s%    	 ##!2NJ2rO   r:  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)r_   r`   ra   r  rh   rB  rb   rO   rM   r@  r@    s     76!OT!rO   r@  c                      e Zd ZU dZded<   y)_DispatchCacheBypassEntryz0
    Entry type for a negative cache entry.
    re   rf   Nr_   r`   ra   r  rh   rb   rO   rM   rD  rD         KrO   rD  c                      e Zd ZU dZded<   y)_BypassDispatchCachez<
    Signals cases that should skip FakeTensor caching.
    re   rf   NrE  rb   rO   rM   rH  rH    rF  rO   rH  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.
    r*  hitsmissesdict[str, int]bypassessizeNrE  rb   rO   rM   rJ  rJ    s     IK
IrO   rJ  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   r*  
cache_hitscache_missesrM  cache_bypassesr|  Fr   rM  static_shapesr<  r
  z
str | None_stackr  rV  nt_tensor_id_counternt_tensor_id_initial_countTN)allow_fallback_kernelsallow_non_fake_inputsr
  rV  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),logrc  idr  rX   rZ  torch._dynamo.configtorch._functorch.configr   r  "fake_tensor_propagate_real_tensorspropagate_real_tensorsr   fake_tensor_converterrV  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[  rM  enter_stackr
  	tracebackextract_stack_stack_tracerW  rJ   r   r   r  $torch.nested._internal.nested_tensornested	_internalnested_tensor_tensor_id_counterrY  rX  )rW   rZ  r[  r
  rV  r   rI   r  s          rM   rX   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!rO   c                &    | j                   | _        y r|   )rY  rX  rV   s    rM   reset_nt_tensor_id_counterz)FakeTensorMode.reset_nt_tensor_id_counter  s    $($C$C!rO   c                B    t        |t              xr |j                  | u S r|   )r   r   r   rW   r   s     rM   is_our_fakezFakeTensorMode.is_our_fake  s    !Z(@Q[[D-@@rO   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 compiledrE   )	rI   rF   _is_compiledrD   r   is_availablehasattrrE   r   rV   s    rM   avoid_device_initz FakeTensorMode.avoid_device_init  s    99!!#zz&&($%MNNyy--/// JJ##% 3u%B%))*@*@*B302
 	
rO   c                    | j                   3dj                  t        j                  | j                              | _         | j                   S )N )rW  joinrl  format_listrn  rV   s    rM   stackzFakeTensorMode.stack  s7    ;;'')"7"78I8I"JKDK{{rO   rb   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)
rI   rJ   r  r   r   r   dispatch	TypeErrorr]  	exception)rW   rl   r  r  r  s        rM   r  z!FakeTensorMode.__torch_dispatch__  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)ro  r}  rJ   _only_lift_cpu_tensors_set_only_lift_cpu_tensors_ensureCUDADeviceGuardSetr   r  rk  r   r  	__enter__r   )rW   rI   prev_only_lift_cpu_tensorsmaybe_prev_fake_moder  s       rM   r  zFakeTensorMode.__enter__  s    3%)"!!).)H)H)J&HH//5
 HH..0$xx<<T^^L++##+-GH 7$&& HH''-##UD2L$MNrO   c                    | j                   j                         \  }}}|rUt        |   |||       |t        j
                  j                  |       | t        j
                  j                  |       y y y r|   )rk  r   r  __exit__rI   rJ   r   r  )rW   exc_typeexc_valexc_tbliver   maybe_prev_only_lift_cpu_tensorsr  s          rM   r  zFakeTensorMode.__exit__  sy       " 	G#%E GXw7 $/++,@A/;334TU < rO   c                     yr   rb   r  s    rM   is_infra_modezFakeTensorMode.is_infra_mode  s    rO   c                    t        t        j                  t        j                  t	        t        j
                        t        t        j                              S )z8
        Query the state of the dispatch cache.
        )rJ  r   rS  rT  r   rU  r  rR  r  s    rM   
cache_infozFakeTensorMode.cache_info  s?    
 !%%''../$$%	
 	
rO   c                    d| _         d| _        | j                  j                          | j                  j                          y)z+
        Clear the dispatch cache.
        r   N)rS  rT  rU  r  rR  r  s    rM   cache_clearzFakeTensorMode.cache_clear  s3    
   "		rO   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 = %sr2   z1state must not be None after cache key generationz:state.shape_env must not be None when caching on shape_env)r3   r
  
_cache_keyrH  r   rI   _opsHigherOrderOperatorrY  hc_logrc  rf   r   rU  _dispatch_implr   cache_on_shape_envfake_tensor_cache_set_cache_key_for_shape_envrR  _set_cache_keyr   rD  _output_from_cache_entryrS  rj  r   _crosscheck_cache_output_make_cache_entryrT  )rW   rl   r  r  r  r  r   erR  set_cache_keyentryoutputs               rM   _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   )rI   fxexperimentalproxy_tensorget_proxy_modeget_default_dtyperJ   _get_default_deviceis_inference_mode_enabledr
  settingsknown_symbolsr   r|  r  r(  r  r}   finalize	functoolspartialevict_fake_tensor_cache_keyr  )
rW   r  rl   r  r  
is_tracing
key_valuesr  r   id_hashed_objs
             rM   r  zFakeTensorMode._cache_keyf  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	 	!
rO   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   rI   r  r  Tagdata_dependent_outputtagsrH  dynamic_output_shaper  r  r   r"   r  r   r#  inplace_view_unsafe_viewr  lift_fnsrY  _libraryutils
is_builtinis_viewrJ   %_dispatch_has_kernel_for_dispatch_keyDispatchKeyr  )rW   rl   r  r  r  r   
new_kwargsr  s           rM   _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
<rO   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)FunctionalizeCtxWrapper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  r  r   r   r   r  r  keysvaluesr   rx  rH  r   r   r   r&  r  r   r   r  r   r   r  FunctionTyperI   r  GraphModuler^  r-  subgraphorig_callable)	rW   r  r  r  r  r  r  r  r<  s	            rM   r  z"FakeTensorMode._prep_args_for_hash  sj   	
 	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"U*	#rO   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   r*  r   %_validate_symbolic_output_for_cachingr   rH  r   r   r   r  r^  )rW   r  r   rl   r  r  r  kvals           rM    _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rO   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r;  r<  r=  r>  )r;  r<  r=  r2   z1Expected exactly one tensor arg for view op, got r   c              3  @   K   | ]  }j                  |        y wr|   convert_outputr   r   r  s     rM   r   zBFakeTensorMode._get_output_info_for_cache_entry.<locals>.<genexpr>t  s     O1u33A6O   c              3  @   K   | ]  }j                  |        y wr|   r  r  s     rM   r   zBFakeTensorMode._get_output_info_for_cache_entry.<locals>.<genexpr>u  s     QA 4 4Q 7Qr  FrA  rB  )GuardOnDataDependentSymNodezdata dependent symnodezdispatch_key_set mismatch)r   r*  rI   r   r   r:  ranger  r^  r  r=   r  	enumerater   r   r&  r  r  r  r  r
  r  r@  r  r  r  rH  rJ   _dispatch_key_set)rW   r  r   rl   r  r  r  idxr=  ir   idxsr<  r  entry_for_synth_outputr  synth_outputsynth_key_setkey_sets    `                 rM    _get_output_info_for_cache_entryz/FakeTensorMode._get_output_info_for_cache_entryT  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                2   ddl m} ddlm | j	                  |||       t        |t        j                  j                        rW||v rSt        |t              s|t        d| dt        |             |%t        fd|D              }|rt        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   r  )has_free_unbacked_symbolsNzExpected tuple output for HOP z, got c              3     K   | ]8  }t        |t        j                  t        j                  f      xr  |       : y wr|   )r   rI   r   r   )r   or  s     rM   r   z3FakeTensorMode._make_cache_entry.<locals>.<genexpr>  sA      $  q5<<">? 51!45$s   >Azunbacked symbol in HOP z outputr  Fr  T)r  r  r  r  r  r   rI   r  r  r  r   r   r  rH  r*  r   r:  r@  r  r  )rW   r  r   rl   r  r  r  r  non_cacheableoutput_infoout_elementout_elemrA  r  s                @rM   r  z FakeTensorMode._make_cache_entry  s    	JS  tV4 tUZZ;;<//fe,1C$4TF&fO  ! # $ $$ !
 !.1Hg/VWW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   r5   r
  r   r  r4   )r2  r  r   s     rM   check_valuezGFakeTensorMode._get_output_tensor_from_cache_entry.<locals>.check_value&  sZ    %!23??*(P  }}S%//::e_5()KLLrO   c              3  0   K   | ]  } |        y wr|   rb   r   r   r  r  s     rM   r   zEFakeTensorMode._get_output_tensor_from_cache_entry.<locals>.<genexpr>2  s     Dk!U+D   c              3  0   K   | ]  } |        y wr|   rb   r
  s     rM   r   zEFakeTensorMode._get_output_tensor_from_cache_entry.<locals>.<genexpr>3  s     F{1e,Fr  r7  )r  r   r  r  Tzview_arg must be a FakeTensor)r2  r	  r  r3   r]   r%   )%r;  r<  r=  r>  r7  r   r   r   r   r  r  r  r
  r  
contextlibnullcontextr
  suppress_guardsrT  rI   empty_stridedr  r   r  r  rJ   	_set_conjr  _set_negr  r=   r  r   r*  r$  set_r  )rW   r  r  r   rl   r  inplace_argr<  r  r  r
  maybe_suppressrH  view_argstorager  s    ` `           @rM   #_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   )rB  rA  r  r  )rW   r  r  r   rl   r  r  outputss           rM   r  z'FakeTensorMode._output_from_cache_entryX  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   r  r   r   r  zipr*  r&   rz  rI   r   r   r   r  )ablr  assert_helpers       rM   r"  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ArO   z*FakeTensor cache crosscheck failure: func=z, args=z	, kwargs=z: Dispatch raised=N)r  r   r   r   r]   r^   )r  	Exceptionr  )	rW   r  rl   r  r  r  true_outputr  r"  s	           @rM   r  z'FakeTensorMode._crosscheck_cache_outputq  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]  rc  r  getEffectiveLevelloggingDEBUGrU   rQ   _DISPATCH_HANDLE_DIRECTLYrT  r   r  r  )rW   rl   r  r  r  incrs         rM   r  zFakeTensorMode.dispatch  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 r&  )r   r   r   r
  r   rz  exprfree_symbolsbacked_var_to_valr  real_tensor_prop_unbacked_vals_maybe_evaluate_staticEqStrueru   r*  floatr   )r   realrW   sympys     rM   _check_fake_real_valsz?FakeTensorMode._maybe_infer_fake.<locals>._check_fake_real_vals  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   rO   Real tensor propagation foundFT)contextsizesstridesr
  r  mismatched_fake_kernelc                 4    t               j                  dS Noprf   re   rf   excrl   s   rM   <lambda>z2FakeTensorMode._maybe_infer_fake.<locals>.<lambda>  s    "%d)&)jj- rO   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 rD  rG  rH  s   rM   rJ  z2FakeTensorMode._maybe_infer_fake.<locals>.<lambda>	  s    &)$i*-**1 rO   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 )Nr0  r1  rE  re   )r   rl   r;  s   rM   rJ  z2FakeTensorMode._maybe_infer_fake.<locals>.<lambda>!	  s$    !$i$@FVW[V\"]) rO   zQReal tensor propagation found an output value mismatch between fake output value z and real output value )r   r   r;  r   r]   r^   )r<  torch._subclasses.fake_utilsr-  r   rI   r   ru   r   r  *generate_fake_kernels_from_real_mismatchesr   _infer_fake_from_real_tensorr+   r  r  rO  )rW   rl   pathr   r;  r-  r=  js_fakes_realrI  r<  s   `` ``     @@rM   _maybe_infer_fakez FakeTensorMode._maybe_infer_fake  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  setr
  pending_fresh_unbacked_symbols
difference)pending_unbackedrW   s   rM   _clear_pending_unbackedzXFakeTensorMode._maybe_infer_fake_kernel_from_pytree_out.<locals>._clear_pending_unbackedK	  s4    <@DNNAABMM$=DNN9rO   r>  rB  c                 :    t              d j                   dS )Nz>Mismatched aliasing spec between fake kernel and real kernel: rE  rG  rH  s   rM   rJ  zIFakeTensorMode._maybe_infer_fake_kernel_from_pytree_out.<locals>.<lambda>^	  s#    !$i\]`]g]g\hi) rO   rK  c                    t        |       S r|   )rR  )r   rl   rW   s    rM   rJ  zIFakeTensorMode._maybe_infer_fake_kernel_from_pytree_out.<locals>.<lambda>j	  s    :4qI rO   zGReal tensor propagation found an aliasing mismatch between fake output z and real output z,  for func: r\   )rP  rY  r
  r  r\  r   tree_flatten_with_pathtree_flattenru   rI   r   r  rQ  r   r-   r  rW  r  tree_unflatten)rW   rl   fake_inreal_infake_outreal_outrY  r_  fake_paths_leaves	fake_specreal_leavesr   
_fake_path	_fake_out	_real_outfake_leaves	overridesrI  r^  s   ``               @@rM   (_maybe_infer_fake_kernel_from_pytree_outz7FakeTensorMode._maybe_infer_fake_kernel_from_pytree_out7	  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 }~ed }~ww xY w# 1 sw Y   Mx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y# 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|   )r"  )r   r  s     rM   r   z0FakeTensorMode._dispatch_impl.<locals>.<genexpr>	  s      !
./A))!
   c              3  <   K   | ]  }t        |t                y wr|   )r   r   )r   r  s     rM   r   z0FakeTensorMode._dispatch_impl.<locals>.<genexpr>	  s     :1Av&:s   Fr  r  Tr7  c              3  8   K   | ]  }|j                   d u  y wr|   r  r   r   s     rM   r   z0FakeTensorMode._dispatch_impl.<locals>.<genexpr>	  s     M!qzz-M   z. should not have fake inputs without constantsr/  r2   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     rM   r   z0FakeTensorMode._dispatch_impl.<locals>.<genexpr>	       Qa1::T1Qrx  c              3  @   K   | ]  }j                  |        y wr|   )may_turn_const)r   r   rW   s     rM   r   z0FakeTensorMode._dispatch_impl.<locals>.<genexpr>
  s     P!t2215Pr  c                ,    j                  | d      S )NTry  )r5  )r   	converterrW   s    rM   rJ  z/FakeTensorMode._dispatch_impl.<locals>.<lambda>"
  s    i88qPT8U rO   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&   r
  r   rz  r8  r2  xreplacer4  r5  r   real_obj)r   rW   s    rM   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!rO   )compute_unbacked_bindingsfree_unbacked_symbolsc              3  8   K   | ]  }|j                   d u  y wr|   )r  r{  s     rM   r   z0FakeTensorMode._dispatch_impl.<locals>.<genexpr>]
  s     M!AMM-Mrx  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|   )r
  r5  )r   srW   s     rM   r   z:FakeTensorMode._dispatch_impl.<locals>.<genexpr>.<genexpr>c
  s(       !N!NNs   "%)r   r&   r
  r  )r   r  r  rW   symss     rM   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 Symbolr2   z/self.shape_env must not be None for symbolic Eq)r   r   r]  rc  r^  r  r  rO  r  r
  r&   rz  r2  Symbolr
  r   "set_real_tensor_prop_unbacked_valsr7  lhsrhs)r   real_tr  real_sr  gorW   r<  s       rM   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0rO   T)peek)r   r  r  r   r]   r^   )r<  r]  rc  rI   r   r  rQ  rq  r   r   r   r.   r  r   rc  r
  )rg  r  r<  r  r  r  rl   r  nil	real_argsreal_kwargsrh  rW   s    @@rM   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OrO   )
meta_tabler   c              3  4   K   | ]  }t        |         y wr|   )r   r{  s     rM   r   z0FakeTensorMode._dispatch_impl.<locals>.<genexpr>   s     PQa 00Prt  zprims::prim_meta_implmissing_fake_kernelc                     dt               iS NrF  rO  r   s   rM   rJ  z/FakeTensorMode._dispatch_impl.<locals>.<lambda>/  s    c$i) rO   rK  c                      S r|   rb   )ctxs   rM   rJ  z/FakeTensorMode._dispatch_impl.<locals>.<lambda>=  s    S rO   c                     dt               iS r  rO  r   s   rM   rJ  z/FakeTensorMode._dispatch_impl.<locals>.<lambda>N  s     #d)- rO   c                    t         j                  j                  j                        ry sj	                        st              | t              } t        |       S r|   )rI   r  r  can_generate_trivial_fake_implcan_run_unsafe_fallbackrq   run_fallback_kernel)error	args_specr  rl   has_symbolic_sizesrW   s    rM   maybe_run_unsafe_fallbackz@FakeTensorMode._dispatch_impl.<locals>.maybe_run_unsafe_fallbacka  s]     ~~##BB4H!)E)Ed)K2488}4T:&tT9iOOrO   z*failed while attempting to run meta for %srC  )r   rB   r]   z)T | Tensor | torch._C.ScriptObject | None)rg  rB   r]   rB   r|   )r  zRuntimeError | Noner]   r;  )ir  r  r   rc  _check_for_subclass_check_for_subclass_argr   r  rc  r  rx  r  rc  r  r}  rI   r  r  _to_copyr  prims
device_putr   r   r  r[  allr   r   rd  r~  r'   cloner5  r  %validate_and_convert_non_fake_tensorsr  r=   r  nondeterministic_seededr  r  detach__nested_tensor_from_tensor_listr   tree_map_onlyr   r  r
  r  r  ignore_fresh_unbacked_symbolsinvalidate_written_to_constantsr  r  r  r  rb  r]  library_utilsr  MutationCheckerZeroDivisionErrorcheckcheck_aliasing_constraintrf  r5  get_fast_op_implsr   r   r  cpp_meta_supports_symint#_unbacked_special_fake_handling_opsr   r   	decomposer   rY  r|  stride_incorrect_opr  rg  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_metarT  r  r#  r  +wrap_meta_outputs_with_default_device_logic)8rW   rl   r  r  r  r  has_unrecognized_typesr   r  r   flat_arg_fake_tensorsis_lift_funcavoiding_device_init!device_conversion_skip_const_propr  const_flat_args
const_argsconst_kwargsr   all_constantflat_outflat_out_tensorsr   #maybe_ignore_fresh_unbacked_symbolsr  real_flat_argsr  mutation_checkerrI  r  	fast_implr  r   r  profilesr  maybe_fake_implr  run_impl_checkop_implop_impl_outr  fallbacknot_implemented_errorr  r  r  r  r  r  r  r  r  r  rh  r  s8   `` ``                                       @@@@@@@@@@@@rM   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+? = 
 	
U" !Nb& &j8 8  N<F F F F Fd J %  		O 	X 
; ;" H@ @ @ @ @ $  // +)44T:2?dHUF%-% 8??G'r* *" 	D,-BCC 	MMFM	s@  h:h:h?h?&ii	<&i	i1i(i(ji-"	j5jj %k"k(kAl .k?1k*	k?
	l 4n ?	m;n 	ii%-i6	2jj	k j;;k kkk'*k3	/k?6	l ?ll 	m8Am3+m81m33m8;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)rZ  	namespace+_can_run_unsafe_fallback_allowed_namespacesrY  rW   rl   s     rM   r  z&FakeTensorMode.can_run_unsafe_fallback  s:    **
 NNdNNN ,yy{m+	
rO   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   rx  r|  rI   r  r  r  r   rd  r   r    r  ry   r[  r   r   r5  r   )r   r  r  r[  r   r  r  r  r  rl   rW   s        rM   validatezFFakeTensorMode.validate_and_convert_non_fake_tensors.<locals>.validate  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!((-JrO   )r   rB   r]   T | FakeTensorrb   )	rW   rl   r  r  r  r  r  validated_argsr  s	   `````   @rM   r  z4FakeTensorMode.validate_and_convert_non_fake_tensors  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 rC  )r  r  s   rM   rJ  zZFakeTensorMode.wrap_meta_outputs_with_default_device_logic.<locals>.wrap.<locals>.<lambda>  s    KAHH:U`an`op rO   )r   r   r   r  rx  rI   _checkr  r   rB   r5  r:  )	r  rx  r  r  r  r  rl   r  rW   s	   ` rM   wrapzHFakeTensorMode.wrap_meta_outputs_with_default_device_logic.<locals>.wrap  s     a($ 224C!* **1-KHH-p Aqz!&) %55dA>>$99a!8= 
 rO   r  rB   r]   r  )rc  r-   )	rW   r  rl   r  r  r  r  r  r  s	   ` ``` @@@rM   r  z:FakeTensorMode.wrap_meta_outputs_with_default_device_logic  s7     ..	 !& 	  	D a  rO   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 activer2   intermediate_offsets_or_lengthszself.shape_env must not be None)valr   )symr  r   )ro  !torch.nested._internal.nested_intr  rX  rk  r   r   rg  r   EphemeralSourcer
  r,  create_symbol)rW   r  rI   r  r  srcrets          rM   r  z)FakeTensorMode.create_symbolic_nested_int  s    
 	4C44L##$J  %%*%u||M,:;mm""223TU>>! !BCCnn..,, -   / 
 
rO   c                l    t         j                  j                  |j                  v ry|| j                  v S r   )rI   r  	view_copyr  _cpp_meta_supports_symintr  s     rM   r  z'FakeTensorMode.cpp_meta_supports_symint9  s,    99$))+t5555rO   c                    |j                         t        k  xr; t        |       xr- | j                  |       xr |j                  j
                  dk7  S r  )numelCONSTANT_NUMEL_LIMITr   rx  r  r   rw  s     rM   r~  zFakeTensorMode.may_turn_const@  sS    GGI-- (!!$$($$Q''( '		
rO   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     rM   r   zAFakeTensorMode.invalidate_written_to_constants.<locals>.<genexpr>O  r|  rx  Tr  inputrW   )
r  r   
is_mutabler"   r   has_argumentrx  r   rc  r   )rW   rl   r  r  r  any_constantschema_infor   r  kr   s              rM   r  z.FakeTensorMode.invalidate_written_to_constantsH  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<rO   )rV  r   r  r  c                   | j                   }|| j                  }|r|t        d      d }| j                  j	                  | |||||      S )Nz2cannot set both static_shapes and symbolic_context)r
  r   r  r  )r
  rV  r   rc  r5  )rW   r   rV  r   r  r  r
  s          rM   r  zFakeTensorMode.from_tensora  sn     &*^^	  ..M+$H  I))::- ; 
 	
rO   )rZ  r   r[  r   r
  r<  rV  rx   r   r   r]   r^   r\   )r   r  r]   zTypeGuard[FakeTensor])r]   r   )r]   re   r  )r]   r   )r  ztype[BaseException] | Noner  zBaseException | Noner  zTracebackType | Noner]   r^   )r]   rJ  )
r  r3   rl   r=   r  r  r  r  r]   r(  )rl   r=   r  r  r  r  r]   r^   )
r  r   r  z:Mapping[str, object] | Sequence[object] | Iterable[object]r  r3   r  r   r]   r^   )r  r3   r   r(  rl   r=   r  r  r  r  r  r;  r]   r^   )r  r3   r   r(  rl   r=   r  r  r  r  r  r   r]   r:  )r  r3   r   r(  rl   r=   r  r  r  r  r  r;  r]   r@  )r  r3   r  r:  r   r(  rl   r=   r  r  r]   r;  )r  r3   r  r@  r   r(  rl   r=   r  r  r]   1FakeTensor | None | tuple[FakeTensor | None, ...])r  r  rl   r=   r  r  r  r  r  r  r]   r^   )
rl   r=   rS  r*   r   r  r;  r  r]   ztuple[object | None, bool])rl   r=   re  r  rf  r  rg  r  rh  r  r]   zobject | None)
rl   r=   r  r  r  r  r  r  r]   r;  rl   r=   r]   r   )
rl   r=   r  r   r  r  r  r/   r]   z%tuple[list[object], list[FakeTensor]])
r  r  rl   r=   r  r  r  r?  r]   r,   )r  r  r]   r%   r  )
rl   r=   r  zSequence[FakeTensor]r  r  r  r  r]   r^   )r   r   rV  rx   r   r=  r  r>  r  r   r]   r   )Nr_   r`   ra   rR  rh   rS  rT  r   r*  rU  r|  rM  rX  rY  rX   ru  rx  rA  r}  r  r0   r!   r  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  rW  rq  r  r   r  r  r  r  r  r  rH  r  r  r  as_strided_scatter
as_stridedas_strided_rI  detachview_as_realview_as_complexr  source_Storage_storage_offset(_sparse_coo_tensor_with_dims_and_tensorsr	  viewr  slicer   r  r  
lift_freshlift_fresh_copyr  r~  r  r  r  r  s   @rM   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E#E# IE# 	E#
 (E# 
E#N(C(C (C 	(C
 (C %(C "(C 
(CTKK K 	K
 K %K K 
'KZbb b 	b
 b %b "b 
"bH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C
C
 C
 	C

 %C
 
C
T 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
 
 

rO   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  r%  r&  rI   r  r  r  r  rH  r3  r  )r  r  r%  r&  r  r   r  r4  s           rM   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rO   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 )NrC  )rx  rI   
zeros_liker  r   _coalesced_r  r^  )r  r   r   	inp_implss     rM   to_real_tensorz+run_fallback_kernel.<locals>.to_real_tensor  sY    $$Q'&&q?;;OOANN$45%&	"S'"
HrO   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   _cdatarc  r5  )r  r   r+  orig_not_implemented_exceptionstoragess    rM   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HrO   )r  rB   r]   z
T | Tensorr  )rI   r  r  r  r'   r   rd  r[  r   r   r   r  r   r.  r-   )r   rl   r  r  r/  r,  r  r  r  r  r  r1  r+  r0  s   `   `       @@rM   r  r    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|   )r5  rR  r   r  s      rM   r  r    s    
 E#JrO   c                    || |<   y r|   rb   r3  s      rM   r  r    s    
 E#JrO   c                  4    e Zd ZddZ	 	 d	 	 	 	 	 	 	 	 	 ddZy)FakeCopyModec                    || _         y r|   )r   )rW   r   s     rM   rX   zFakeCopyMode.__init__  s	    "rO   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   r  T)rV     z3Expected 2 args and 0 kwargs for __deepcopy__, got z
 args and z kwargsr2   )rI   rJ   
TensorBaser  r   r   r   r   r   r  __deepcopy__r  r   r   r*  r   r^  DisableTorchFunctionSubclass)rW   rl   r  r  r  r   memor   s           rM   __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   r]   r^   )rb   N)
rl   r=   r  r  r  r  r  zMapping[str, object] | Noner]   r   )r_   r`   ra   rX   r>  rb   rO   rM   r6  r6    sD    # "$.2 - -  - 	 -
 , - 
 -rO   r6  c                    t        |       dk7  st        | d   t              st        d      | d   j                  j
                  rt        j                  d      S | d   j                  S )Nr2   r   z<Expected exactly one FakeTensor argument for _device_handlerr7  )	r  r   r   r   r   rM  rI   r  r  r  s    rM   _device_handlerrA  9  s`     4yA~ZQ<J
 	
 Aw--||F##Aw"""rO   c                &    t        d | D              S )Nc              3  2   K   | ]  }t        |        y wr|   )r  )r   r   s     rM   r   z&_check_for_subclass.<locals>.<genexpr>U  s     =a&q)=   )r  )r  s    rM   r  r  T  s    =9===rO   c                    t        | t               xrJ t        | t              xr8 t        |       t        uxr% t        |       t        j
                  j                  uS r|   )r   r   r   r   rI   r  r  r   s    rM   r  r  X  sQ    q*%% 	.q&!	.G6!	. G588---	rO   c                d    t        d t        t        | d         j                         D              S )Nc              3  2   K   | ]  }t        |        y wr|   r*  r   r  s     rM   r   z<lambda>.<locals>.<genexpr>c  s      4A4rD  r   )r  r   r   rO  r@  s    rM   rJ  rJ  c  s,    e 4VT!W-2244 / rO   c                d    t        d t        t        | d         j                         D              S )Nc              3  2   K   | ]  }t        |        y wr|   rI  rJ  s     rM   r   z<lambda>.<locals>.<genexpr>f  s      6A6rD  r   )r  r   r   r  r@  s    rM   rJ  rJ  f  s,     6VT!W-4466 1 rO   c                V    t        t        t        | d         j                               S r  )r*  r   r   r
  r@  s    rM   rJ  rJ  i  s"    VT!W,,.9 rO   )_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   rR  r   r  s    rM   r  r    s)    
n"""  % #rO   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   r  s     rM   r   z#dump_cache_stats.<locals>.<genexpr>  s     -qCF-rD  c                    | d    S rS   rb   )r  s    rM   rJ  z"dump_cache_stats.<locals>.<lambda>  s    AaD5 rO   r  z    %-*s %sr2   r  )	r]  infor   rS  rT  rU  maxsortedr   )rN  widthr  r   s       rM   dump_cache_statsrZ    s    HH&'HH!:!:;HH!>#>#>?,,H$%-H--8>>+A 	;DAqHH]EAI!Aw:	; rO   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.)r  rf  )rf   rF  s    rM   unsupportedz1_infer_fake_from_real_tensor.<locals>.unsupported  s1    **,((9VH EKL
 	
rO   r   z'a return has a non-zero storage offset rV  c                    | d   | d    fS r  rb   rF  s    rM   rJ  z._infer_fake_from_real_tensor.<locals>.<lambda>  s    !qte} rO   r  r2   z(a return was not dense in memory (sizes z	 strides ))r  r  r   )rf   re   r]   r^   )r
  r  r  rI   r  r  allocate_sizer
  r  r  sortr  r  r  r  r   )r   rF  rh  r]  r   
fake_shapefake_stridesr  r  rA  expectedfake_strides    `          rM   rR  rR    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   rI   r   rw  s     rM   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 )	r
  r   r   rc  r  r  r   rR  rd  )r   rF  rh  real_flat_outspecr   fake_flat_outs          rM   r  r    s     ~~>??
 !--h7M4BMBB  "

|-
 	

 IVV11$A>VMV  55 Ws   B
)rL   re   r]   r   )r   rB   r]   zdict[T, Literal[True]])r]   z/Generator[TorchDispatchMode | None, None, None])r   r   r]   zGenerator[None, None, None])r   r   r   (list[Tensor | int | SymInt | OpaqueBase]r]   rk  )r   r  r]   zTypeGuard[Tensor])r   r  r]   zFakeTensorMode | None)rl   r=   r]   ztorch._C._SchemaInfor  )r   ztype[T]r   r,   r]   zlist[T])r   r  r]   r   r  )r   r   r]   r  )r  r3   r  r   r]   r^   )r   r   rl   r=   r  r  r  r,   r/  r  r]   r   )rR  rQ  r   r(  r  _DispatchCacheEntryr]   r^   )r  r  r]   r?  )r  r  r]   r   )r   r  r]   r   )r   r(  r]   r^   r\   )r   r   rF  torch._ops.OpOverloadrh  torch.Tensorr]   rn  )r   r   rF  rm  rh  r   r]   r   )
__future__r   atexitr  r  r  r(  r&  ra  	threadingrl  r  typingr}   collectionsr   r   r   r   r   r	   r
   r   r   typing_extensionsr   r   rI   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)   torch.utils._pytreer*   r+   r,   r-   r.   r/   torch.utils._statsr0   torch.utils._tracebackr1   _fake_tensor_utilsr3   r4   r5   collections.abcr6   r7   r8   r9   r:   r;   torch._guardsr<   
torch._opsr=   r  r>   r?   	getLoggerr_   r]  _logginggetArtifactLoggerr  r  
ValueErrorr  re   r  DimList_pytreer   rB   r  r  r  r  rU   rR  rN   rQ   r  rd   rk   ro   rq   rs   ru   localrw   r  r   contextmanagerr   r   r   r   r   r   r   r   r   r   rJ  rT  r[  r]  re  r   r	  r  r&  r(  r7  r:  r@  rD  rl  r#  rH  rJ  r   r  _StoragePointerr  r  r  r  r6  rA  r  r  r  r  r  rO  r  r
  r  r  r  r  profiler_record_function_exit_RecordFunctionr*  torch._subclasses.fake_implsrN  rO  rP  rQ  r  r  r  r  r  registerrZ  rR  r  rb   rO   rM   <module>r     s   "       	      # ! O O O " !  , , 3 3 T ? 8 , ) 5  H 9 8 ; - 1 / W V $ 4 R R PP#$%Og!		)	)(4J	K..::8EVW 			CLzz~~     \   ,   <   <   <   L  GIOO G  /& - - , ,F-" F F . . 	D 	D@
$o od 
 
 @@ @ @.B B@E @EFZ4 Z4z &79LLM  *% *% *%Z#L $ $ $8	 	 $d#3 3 $3$ $d#
" 
" $
" $d#  $ 25NN $d#9  $ $d#  $(o
& o
d; :Q:Q#-:Q	:Q|>'>'
>'  >' 	>'
 %1>' >'B7	  
	7	  
	$-$ $-N#6> 
IINN!!?	IINN " 
IINN!! $ 
IINN!!)) ,  (	IINN''	IINN$$	IINN%% 
II,,<< 	 	 	&
 	; 	;9

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