
    3j,                   R   S SK Jr  S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	r	S SK
r
S SKrS SKrS SKrS SKJr  S SKJr  S SKJrJrJrJrJrJrJr  S SKJr  S SKJr  S SKrS SKJs  Jr  S SKJ r J!r!J"r"J#r#  S S	K$J%r%J&r&  S S
K'J(r(  S SK)J*r*  S SK+J,r,  S SK-J.r.  S SK/J0r0  S SK1J2r2J3r3J4r4J5r5J6r6  S SK7J8r8J9r9  S SK:J;r;  S SK<J=r=  S SK>J?r?  S SK@JArA  S SKBJCrCJDrD  S SKEJFrF  S SKGJHrHJIrI  S SKJJKrKJLrLJMrMJNrNJOrOJPrP  S SKQJRrR  S SKSJTrT  SSKUJVrVJWrWJXrX  \(       a(  S SKYJZrZJ[r[J\r\J]r]J^r^  S SKJ_r_  S SK`Jara  S S KbJcrc  S S!KdJereJfrf  \R                  " \h5      ri\R                  R                  \hS"5      rl \R                  R                  \hS#5      rm\qrr\R<                  R                  rt\" S&5      ru\R                  R                  R                  rxSryS qz\R                  SvS' j5       r| " S( S)5      r}\ " S* S+\~5      5       r\ " S, S-\~5      5       r\ " S. S/\~5      5       r\ " S0 S1\~5      5       r\ " S2 S3\~5      5       r\ " S4 S5\~5      5       r " S6 S7\	GR
                  5      r\" 5       rSwS8 jr\GR                  SxS9 j5       r\GR                  SyS; j5       r      SzS< jrS{S= jrS|S> jr\R                  S}S? j5       r\R                  S~S@ j5       rSSA jrSSB jr " SC SD5      r\R                  SSE j5       r\GR                      SySF j5       rS~SG jr " SH SI5      r " SJ SK5      r " SL SM\#5      r\\CSNSO4   r\" SPSQ9 " SR SS5      5       rSST jr\" SPSQ9 " SU SV5      5       r " SW SX5      r\" SPSPSY9 " SZ S[5      5       r\" SPSPSY9 " S\ S]5      5       r\" SPSPSY9 " S^ S_5      5       r\(       a  \\-  r\" SPSPSY9 " S` Sa\5      5       r\" SPSPSY9 " Sb Sc5      5       r " Sd S:\I5      r\r      SSe jr            SSf jr        SSg jr        SSh jr " Si Sj\A5      rSSk jrSSl jrSSm jr\R                  GRb                  GRd                  GRf                  \\R                  R                  GRh                  GRf                  Sn \R                  R                  GRj                  GRf                  So \R                  R                  GRl                  GRf                  Sp 0r\" \R                  R                  GRp                  GRf                  \R                  R                  GRr                  GRf                  \R                  R                  GRt                  GRf                  \R                  GRv                  GRx                  GRz                  5      rS SqKJrJrJrJrJrJrJrJr  SSr jr\GR                  SSs j5       r        SSt jr        SSu jrg! \n a.  roS$\p" \o5      ;   a  \R                  " \hS%-   5      rm SroCoGN\oeSroCoff = f)    )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                P    U SSSSS[         R                  R                  5       4;   $ )Ncudahpuxpumpsmtia)torch_C_get_privateuse1_backend_name)device_types    W/home/wildlama/miniconda3/lib/python3.13/site-packages/torch/_subclasses/fake_tensor.py_is_indexed_device_typerN   Z   s3    ..0      c                  (    \ rS rSrSS jrSS jrSrg)IncrementRecursionCountj   c                    [         S-  q g Nr2   RECURSION_COUNTselfs    rM   __init__ IncrementRecursionCount.__init__k       1rO   c                    [         S-  q g rT   rU   rW   s    rM   __del__IncrementRecursionCount.__del__o   r[   rO    NreturnNone)__name__
__module____qualname____firstlineno__rY   r]   __static_attributes__r_   rO   rM   rQ   rQ   j   s    rO   rQ   c                       \ rS rSr% S\S'   Srg)UnsupportedFakeTensorExceptiont   strreasonr_   Nrc   rd   re   rf   __annotations__rg   r_   rO   rM   ri   ri   t       KrO   ri   c                       \ rS rSr% S\S'   Srg)DynamicOutputShapeExceptiony   r=   funcr_   Nrm   r_   rO   rM   rq   rq   y       
rO   rq   c                       \ rS rSr% S\S'   Srg)DataDependentOutputException~   r=   rs   r_   Nrm   r_   rO   rM   rv   rv   ~   rt   rO   rv   c                       \ rS rSr% S\S'   Srg)UnsupportedOperatorException   r=   rs   r_   Nrm   r_   rO   rM   ry   ry      rt   rO   ry   c                       \ rS rSr% S\S'   Srg)$UnsupportedMutationAliasingException   rk   rl   r_   Nrm   r_   rO   rM   r|   r|      ro   rO   r|   c                       \ rS rSr% S\S'   Srg)MetadataMismatchError   rk   rl   r_   Nrm   r_   rO   rM   r   r      ro   rO   r   c                  4    \ rS rSr% S\S'   S\S'   S	S jrSrg)
FakeTensorTLS   bool | Noneallow_non_fake_inputs_overridezweakref.WeakSet[FakeTensor]%non_strict_export_fake_tensor_trackerc                F    S U l         [        R                  " 5       U l        g N)r   weakrefWeakSetr   rW   s    rM   rY   FakeTensorTLS.__init__   s    .2+5<__5F2rO   )r   r   Nr`   )rc   rd   re   rf   rn   rY   rg   r_   rO   rM   r   r      s     %0/+FFGrO   r   c                 .    [         R                  U S5      $ NT)dictfromkeys)itemss    rM   ordered_setr      s    ==%%rO   c               #  .  #    [         R                  R                  [         R                  R                  R                  5      n  U v   U b   [         R                  R                  U 5        g g ! U b   [         R                  R                  U 5        f f = f7fr   )rI   rJ   _unset_dispatch_mode_TorchDispatchModeKeyFAKE_set_dispatch_mode)olds    rM   unset_fake_temporarilyr      sk     
((
'
'(F(F(K(K
LC-	?HH'', 3?HH'', s   ABA- 	$B-%BBFakeTensorModec              #  ^   #    U R                   n SU l         S v   Xl         g ! Xl         f = f7f)NF)cache_enabled)	fake_mode	old_values     rM   disable_fake_tensor_cacher      s,     --I,"'	"+)s   -" -*-c                  ^ U /nU(       ar  UR                  5       m[        T5      (       d  UR                  T5        M:  TR                  5       u  p4UR	                  U4S j[        U5       5       5        U(       a  Mr  U$ )Nc              3  <   >#    U  H  n[        TU5      v   M     g 7fr   )getattr).0keycurrs     rM   	<genexpr>$get_plain_tensors.<locals>.<genexpr>   s     G2F3GD#&&2Fs   )popr(   append__tensor_flatten__extendreversed)subclassouttodo
inner_keys_r   s        @rM   get_plain_tensorsr      si     :D
xxz,T22JJt//1
G(:2FGG $ JrO   c                   SSK Jn  [        U [        5      (       a  g[	        U 5      (       a  [        U 5      R                  U 5      u  p#S nU Hj  n[        X5      ==[        S` =b(  u   n  [        U5      nUc  UnM/  XG:w  a  [        S5      eMA      =[        S` =b  u     MS    n[        S[        U5       35      e   U=(       d    S$ [        X5      (       a  [        U R                  5      $ [        U [        5      (       am  [        R                  " U 5      (       aR  [        R                  R!                  5       n	[        R                  R"                  R%                  X	5      n
[        U
5      $ [        U [        5      (       aD  ['        U 5      (       a4  [        R                  R"                  R)                  U 5      n
[        U
5      $ g)Nr   FunctionalTensorTr_   z got mixed fake and real tensors!#expected Tensor or OpaqueBase, got F)#torch._subclasses.functional_tensorr   
isinstance
FakeTensorr(   typer   r   r   is_fakeAssertionErrorr   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      sq   D!Z  $Q''7--a0 $D!""VX]"1:D'#'!),-OPP *	 # "Z\ "(=d:>N=OP    5 	A	(	(qvv	Av		5#>#>q#A#AEEGHH''AA!S	y!!	Av		#>q#A#AHH''55a8	y!!rO   c                |   SSK Jn  [        U [        5      (       a  U R                  $ [        U 5      (       a  U R                  5       u  p#S nU Hi  n[        X5      ==[        S` =b'  u   n  [        U5      nUc  UnM/  XGLa  [        S5      eM@      =[        S` =b  u     MR    n[        S[        U5       35      e   U$ [        X5      (       a  [        U R                  5      $ [        U [        5      (       am  [        R                  " U 5      (       aR  [        R                   R#                  5       n	[        R                   R$                  R'                  X	5      n
[        U
5      $ [        U [        5      (       aD  [)        U 5      (       a4  [        R                   R$                  R+                  U 5      n
[        U
5      $ g )Nr   r   r_   z&All fake tensor modes must be the samer   )r   r   r   r   r   r(   r   r   r   maybe_get_fake_moder   r   r   r   rI   r   rJ   r   r   r   r   r   )tr   inner_tensor_namesr   modet_namer   mr   r   r   s              rM   r   r      sn   D!Z  {{$Q'' ! 4 4 6&*(F!$"VX]+A.A| ,-UVV '	 # "Z\ "(=d:>N=OP  ) 	A	(	("166**	Av		5#>#>q#A#AEEGHH''AA!S	"9--	Av		#>q#A#AHH''55a8	"9--rO   c                T    [         R                  R                  U R                  5      $ r   )rI   rJ   _SchemaInfo_schemars   s    rM   get_schema_infor     s    88--rO   c                    SSK Jn  [        R                  R                  nX   R
                  R                  S5      =(       a    X   R                  [        U5      ;   $ )Nr   decomposition_tableztorch._decomp)	torch._decompr   rI   _decompdecompositionsrd   
startswithrc   dir)rs   r   r   s      rM   torch_decomp_decompositionsr     sR    1]]11N $//:: D

#
,
,N0C
CDrO   c                    [         R                  U5      nU Vs/ s H  n[        X05      (       d  M  UPM     sn$ s  snf r   )pytreetree_leavesr   )tytree	flat_valsr   s       rM   tree_flatten_onlyr   &  s1    ""4(I&?YT*T*>DY???s   ;;c                D   [        U 5      [        L =(       a    U R                  [        R                  :H  =(       ae    U R
                  =(       dM    U R                  =(       d:    [        U 5      =(       d(    [        U 5      =(       d    [        R                  " U 5      (       + $ 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                      \ rS rSr% \  SS j5       rS\S'   S\S'   S\S'   S	S	S
.SS jjrSS jrSS jr	SS jr
SS jr  SSSSS.               SS jjjr  S           SS jjrSrg) FakeTensorConverteri=  c                .    U R                   R                  $ r   )meta_convertertensor_memorW   s    rM   r   FakeTensorConverter.tensor_memo>  s     ""...rO   zMetaConverter[FakeTensor]r   z5dict[StorageWeakRef, list[ReferenceType[FakeTensor]]]constant_storage_mappingboolexportF	copy_datar   c               :    [        US9U l        X l        0 U l        g )N)r   )r   r   r   r   )rX   r   r   s      rM   rY   FakeTensorConverter.__init__J  s    +i@ )+%rO   c                D   [        U[        5      (       a  UR                  c  [        S5      e[	        UR                  R                  5       5      nX R                  ;  a  / U R                  U'   U R                  U   R                  [        R                  " U5      5        g )Nz0fake_tensor must be a FakeTensor with a constant)
r   r   constantr   r#   _typed_storager   r   r   ref)rX   fake_tensorweak_sts      rM   add_constant_storage_mapping0FakeTensorConverter.add_constant_storage_mappingQ  s     +z22k6J6J6R !STT !5!5!D!D!FG
 77757D))'2%%g.55gkk+6NOrO   c                "   [        U[        5      (       a  [        S5      e[        UR	                  5       5      nX R
                  ;  a  g U R
                  U    H&  nU" 5       nUc  M  UR                  5         S Ul        M(     U R
                  U	 g )Nz(Expected a real tensor, not a FakeTensor)r   r   r   r#   r   r   _fix_weakrefr   )rX   tensorr   weak_tensor_reftens        rM   invalidate_constant_aliases/FakeTensorConverter.invalidate_constant_aliases`  s    fj)) !KLL !6!6!89777#<<WEO!#C  "#  F ))'2rO   c                    U R                   R                  R                  R                  U5      nUc  g U R                  R                  U5      $ r   )r   	describerlookup_tensorgetr   )rX   r   tids      rM   	_get_memoFakeTensorConverter._get_memoq  sC    !!++99==a@;##C((rO   c                ~    U R                   R                  R                  U5      nX R                   R                  U'   g r   )r   r
  get_tensor_idr   )rX   r   r   r  s       rM   set_tensor_memo#FakeTensorConverter.set_tensor_memow  s2    !!++99!</0'',rO   NT)sourcesymbolic_contexttracec          	       ^^ U(       d  U(       d  U(       a  [         R                  R                  R                  5       =n(       aW  X(R                  ;   aH  UR                  U   nSSKJn	  [        Xi5      (       d  [        S[        U5       35      eUR                  nU R                  U5      n
U
b  U
$ UR                  (       a  [        S5      e[        U5      [         R                  R                  L a  U(       a  [        S5      eU(       a  UOS m      SUU4S jjnU R!                  UUUUUUS9nU["        L a  [        S5      eSS	KJn  S nU R(                  (       Gd  [+        U5      (       Ga  UR-                  5       S:X  Ga  UR.                  R                  S
:X  Ga  UR0                  [         R2                  [         R4                  [         R6                  [         R8                  [         R:                  4;   Ga+  UGb'  [        X]5      (       Gd  UGb  SSKJnJn  SSKJ n  [C        5          URE                  5       nS S S 5        [F        RH                  " U5      (       d  [F        RJ                  " U5      (       d  [        UU5      (       a  URL                  nOU" U5      nURO                  UUURP                  US9nUR0                  [         R2                  :X  a  URS                  UUUS9Ul*        O4UR0                  [         R:                  :X  a  URW                  UUUS9Ul*        U(       a  U RY                  U5        U$ ! , (       d  f       GN
= f)Nr   )StatefulSymbolicContextz&Expected StatefulSymbolicContext, got zquantized nyi in meta tensorsz,make_constant must be False for nn.Parameterc                p   > [        5          [        TU " 5       UTS9sS S S 5        $ ! , (       d  f       g = f)Nr   )r'   r   )make_meta_tdevicer   r   s     rM   mk_fake_tensor<FakeTensorConverter.from_real_tensor.<locals>.mk_fake_tensor  s,     !M &	 s   '
5)	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 | strra   r   )-rI   _guardsTracingContexttry_gettensor_to_context%torch.fx.experimental.symbolic_shapesr  r   r   r   tensor_sourcer  is_quantizedri   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   )rX   r   r   make_constantr  r  r  r  tracing_contextr  
maybe_memor  r   r!  valuer#  r$  r%  item_sourcesymbolr   s    `                  @rM   from_real_tensor$FakeTensorConverter.from_real_tensor  s     9"'--">">"F"F"HHH999'6'H'H'K$ &&6PP,DTJZE[D\]  .;;F^^A&
!>>01PQQ7ehh((($%STT%14
	-	7I		 	, !!#- " 
 . 01EFF: ##1& U[[%++uzz5==QR"$ v99 %TH ::e$$TZZ->->f&788"(++K"6v">K"<<& * 2 2%5	 =  77ekk)$-$?$?"* %@ %CM
 WW-$-$A$A"* %B %CM
 --c2
? s   2M
Mc                    UR                   R                  S:w  a#  [        SUR                   R                   S35      eU R                  U5      nUb  U$ [	        XX4US9nU R                  X'5        U$ )Nmetaz$tensor's device must be `meta`, got z instead)pytypedispatch_keys)r  r   r   r  r   r  )rX   r   r   r  rN  rO  rF  r   s           rM   from_meta_and_device(FakeTensorConverter.from_meta_and_device  sw     88==F" 6qxx}}oXN 
 ^^A&
!&}
 	Q$
rO   )r   r   r   )ra   zRweakref.WeakValueDictionary[torch._subclasses.meta_utils.MetaTensorId, FakeTensor])r   r   r   r   ra   rb   )r   r   ra   rb   )r  r   ra   rb   )r   r   ra   FakeTensor | None)r   r   r   r   ra   rb   )FN)r   r   r   r   rD  r   r  ShapeEnv | Noner  Source | Noner  SymbolicContext | Noner  r   ra   r   )NN)r   r   r   r   r  torch.devicerN  ztype[torch.Tensor] | NonerO  torch.DispatchKeySet | Nonera   r   )rc   rd   re   rf   propertyr   rn   rY   r   r  r  r  rJ  rP  rg   r_   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                    [         R                  R                  S5      U R                  :X  aF  [         R                  R
                  c  [         R                  " SU S9O[         R                  " SU S9  g g )NTr2   r  )rI   acceleratorcurrent_acceleratorr   versionhipemptyzerosrZ  s    rM   init_gpu_contextra  /  sX     ,,T2fkkA }}  ( KK&)Qv.	 BrO   c              #    #    U R                   n[        R                  R                  5       nX!:w  a  [	        U SU 35      e[        R                  R                  5          SU l         [        R                  R                  5          [        R                  R                  S5         S v   Xl          S S S 5        S S S 5        g ! Xl         f = f! , (       d  f       N"= f! , (       d  f       g = f7f)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_managerrk  :  s     
 33N((88:K$}B~.>?@@		'	'	))-	& XX//1HH66t<@1?. 2	 
*	) 2@. 21	 
*	)sN   AC0 &C C'C+C2C:	C0CC
C	C
C-)C0c                    [         R                  R                  U R                  5       R	                  S5      S   R	                  S5      S   5      $ )Nz::.r   )rI   rJ    _should_allow_numbers_as_tensorsnamesplitr   s    rM   should_allow_numbers_as_tensorsrr  R  sB    8844		$#))#.q1 rO   c                  R    \ rS rSr\R
                  R                  SS5      S:H  rSrg)FakeTensorConfigiX  TORCH_FAKE_TENSOR_DEBUG01r_   N)	rc   rd   re   rf   osenvironr  debugrg   r_   rO   rM   rt  rt  X  s    JJNN4c:cAErO   rt  c                      \ rS rSr% S\S'   S\S'   SS.SS jjrSS	 jrSS
 jrSS jrSS jr	 S     SS jjr
      SS jrSrg)SymNumberMemoDescriptorig  rk   _namer   _is_nested_intFis_nested_intc                   Xl         g r   )r~  )rX   r  s     rM   rY    SymNumberMemoDescriptor.__init__q  s    +rO   c                    X l         g r   r}  )rX   ownerrp  s      rM   __set_name__$SymNumberMemoDescriptor.__set_name__t  s    
rO   c                     SU R                    3$ )Nr   r  rX   objs     rM   _memoSymNumberMemoDescriptor._memow  s    4::,rO   c                "    SU R                    S3$ )Nr   _vcr  r  s     rM   _memo_vc SymNumberMemoDescriptor._memo_vcz  s    4::,c""rO   c                "    SU R                    S3$ )Nr   _epochr  r  s     rM   _memo_epoch#SymNumberMemoDescriptor._memo_epoch  s    4::,f%%rO   Nc                   [        XR                  U5      5      =nc  g [        U[        R                  5      (       a  UR
                  R                  b  U$ U R                  (       d(  [        XR                  U5      5      UR                  :w  dC  U R                  (       dN  [        XR                  U5      5      UR                  R                  :w  a  [        XR                  U5      S 5        g U$ r   )r   r  r   rI   r   noder'  r~  r  _versionr  r   epochsetattr)rX   r  objtypers       rM   __get__SymNumberMemoDescriptor.__get__  s     jjo..A7 a((QVV[[-DH
 ##]]35G(HCLL(X##--c23s}}7J7JJCC$/rO   c                   UcR  [        XR                  U5      S 5        [        XR                  U5      S 5        [        XR                  U5      S 5        g UR	                  5       (       a  U R
                  (       a  [        XR                  U5      U5        U R
                  (       d%  [        XR                  U5      UR                  5        [        XR                  U5      UR                  R                  5        g g r   )	r  r  r  r  is_inferencer~  r  r   r  )rX   r  rG  s      rM   __set__SymNumberMemoDescriptor.__set__  s    
 =CC$/Cs+T2C))#.5!!##t':':CC%0&&]]3/>C))#.0C0CD	 (;rO   )r~  r}  )r  r   ra   rb   )r  rk   rp  rk   ra   rb   )r  r   ra   rk   r   )r  r   r  ztype[FakeTensor] | Nonera   z$torch.SymInt | torch.SymFloat | None)r  r   rG  zBtorch.SymInt | torch.SymFloat | torch.SymBool | int | float | Nonera   rb   )rc   rd   re   rf   rn   rY   r  r  r  r  r  r  rg   r_   rO   rM   r|  r|  g  su    J 05 , #& CG(?	-,EE RE 
	ErO   r|  c                    ^  \ rS rSr% SrS\S'   S\S'   S\S'   S\S	'   \" 5       rS
\S'   \" 5       r\" 5       r	S
\S'   \" 5       r
S
\S'   \" SS9rS\S'   S\S'   \R                  R                  R                  r\S&S j5       r\R&                  S'S j5       r\S&S j5       r\R&                  S(S j5       r\S)S j5       r\R&                  S*S j5       r\S+S j5       r\    S,               S-S jj5       rS.U 4S jjr\S/S j5       r\\S\" 5       4         S0S jj5       5       r\      S1S  j5       rS!S".   S2S# jjr S3S$ jr!S%r"U =r#$ )4r   i  aT  
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.
rV  _fake_devicer   r   Tensor | Noner   real_tensorz$SymNumberMemoDescriptor | int | Nonenonzero_memounique_memounique_consecutive_memoTr  type[Tensor] | NonerN  rW  rO  c                |    U R                   R                  (       a  [        R                  " S5      $ U R                  $ NrM  )r   rd  rI   r  fake_devicerW   s    rM   r  FakeTensor.device  s,     >>..<<''###rO   c                    [         er   NotImplementedErrorrX   r   s     rM   r  r        !!rO   c                    U R                   $ r   )r  rW   s    rM   r  FakeTensor.fake_device  s       rO   c                0    U R                  U5      U l        g r   )_normalize_fake_devicer  )rX   r  s     rM   r  r    s     77?rO   c                    [        S5      e)Nz+torch.compile doesn't support named tensors)ri   rW   s    rM   namesFakeTensor.names  s     -9
 	
rO   c                    [         er   r  r  s     rM   r  r    r  rO   c                   U R                   S;   a  [        U 5        [        U R                   5      (       a  U R                  c  U R                   S:w  az  [	        [
        U R                   5      R                  5       (       aM  [
        R                  " U R                    S[	        [
        U R                   5      R                  5        35      n U $ [
        R                  " U R                    S35      n U $ )zFNormalize device by initializing GPU context and setting device index.)rD   rF   rG   :z:0)	r   ra  rN   indexr   rI   is_initializedr  current_devicerZ  s    rM   r  !FakeTensor._normalize_fake_device   s     ;;/)V$"6;;//FLL4H{{e#v{{(C(R(R(T(T{{m1WUFKK%@%O%O%Q$RS
  R&89rO   c                T   [         R                  " U UUR                  SUS9nUR                  (       d   [        R
                  R                  U5        O[        R
                  R                  U5        UR                  R                  S:w  a"  [        SUR                  R                   35      e[        U[        R                  5      (       a  UO[        R                  " U5      nUR                  (       d  UR                  S:X  a  [        S5      eX8l        Xl        XHl        Xhl        Xxl        [        U[$        5      (       a  [        S5      eXXl        S Ul        S Ul        S Ul        S Ul        S Ul        [2        R4                  (       a  [6        R8                  " 5       Ul        U$ )NT)dispatch_devicedevice_for_backend_keysrM  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   rN  rO  r   r  r  rB  r  r  nested_int_memort  rz  r1   extract_debug_trace)	clsr   r   r  r   r  rN  rO  rX   s	            rM   __new__FakeTensor.__new__  sW    $$ $*
 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U ]  5         [        R                  R	                  5       (       aJ  [        R
                  R                  R                  (       a   [        R                  R                  U 5        g g g r   )superrY   rI   compileris_exporting_exportconfig#detect_non_strict_fake_tensor_leaksfake_tensor_tlsr   add)rX   argskwargs	__class__s      rM   rY   FakeTensor.__init__[  sS    NN''))$$HHAAEEdK I *rO   c                $    UR                  U 5      $ r   )from_tensor)r   r   s     rM   r  FakeTensor.from_tensorc  s    $$Q''rO   r_   c                :   U[         R                  R                  R                  R                  L au  [        U5      S:w  d  [        US   [        5      (       d  [        S5      eUS   R                  R                  (       a  [         R                  " S5      $ US   R                  $ [        R                  U5      =n(       a  U" U5      $ U Vs/ s H'  n[        U[        5      (       a  M  U[        Ld  M%  UPM)     nnU(       a  [         R#                  SU5        [$        $ S n[&        R(                  " U0 UD6 H&  n	[        U	[        5      (       d  M  U	R                  n  O   Uc  [        S5      e[         R*                  R-                  [         R*                  R.                  R0                  5      n
U
(       a  [         R#                  SUU
5        [$        $ UR                  (       a  [        S5      eU   U" U0 UD6sS S S 5        $ s  snf ! , (       d  f       g = f)	Nr2   r   z@Expected exactly one FakeTensor argument for prim.device.defaultrM  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   rd  r  _DISPATCH_META_HANDLERSr  
issubclassr   not_implemented_logrz  r1  r   arg_tree_leavesrJ   _get_dispatch_moder   r   )r  rs   typesr  r  handlerr   unrecognized_typesr   argmaybe_cur_fake_modes              rM   __torch_dispatch__FakeTensor.__torch_dispatch__g  s    599>>((0004yA~ZQ%D%D$V  Aw  55||F++Aw*** .11$77774=  
!Jq*$=A!6/Au 	 
 %%:<N "!	))4:6:C#z**MM	 ;
  !OPP $hh99HH**//
 %%:#
 "!)) !OPP(( YO
N Ys   H,H7H5H
Hc           
       ^ ^^^^^	^
^^ S mSnS m[        [        R                  R                  5      m[        [        R                  R
                  5      m[        [        R                  R                  5      mS	S jm	S	S jm
S
U	4S jjmSUUUU UU	U
UU4	S jjnU H  nU" U5        M     [        T 5      (       a  Tc  Sn[        R                  " S5      mTc  [        ST  35      eTU4$ )NFc                     U R                   S:H  $ )Nr"  r   rZ  s    rM   is_device_cpu5FakeTensor._find_common_device.<locals>.is_device_cpu  s    ;;%''rO   c                     U R                   S:H  $ r  r  rZ  s    rM   is_device_meta6FakeTensor._find_common_device.<locals>.is_device_meta  s    ;;&((rO   c                \   > T" U R                   5      =(       a    U R                  5       S:H  $ Nr   )r  r3  )r   r  s    rM   cpu_zero_dim4FakeTensor._find_common_device.<locals>.cpu_zero_dim  s!     *;quuw!|;rO   c                  >	 [        U [        5      (       d  g Tc  U R                  mT" U 5      m
g T" U 5      nU R                  T:X  a
  T
(       a  Um
g T	T;   nU(       a  U(       d  g T
(       a  U(       d  U R                  mUm
g T	T;   a'  [        [	        TTU R                  45      5      (       a  g T	T;   a'  [        [	        TTU R                  45      5      (       a  g [
        R                  R                  R                  nUbS  UTR                  ;   nX0R                  R                  ;   nU(       d  U(       a  U R                  mUm
g U(       a  U(       d  g [        ST	 ST SU R                   35      e)Nz,Unhandled FakeTensor Device Propagation for z, found two different devices rc  )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  rs   is_cpu_zero_dimr  r  meta_rhs_mixed_device_fnsmixed_device_fnss         rM   merge_devices5FakeTensor._find_common_device.<locals>.merge_devices  se    a,,$ !".q/ ,Qxx=("&7O << 3 !)O 'M !"3 ''s==!((*CDEE00s>M188+DEF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  rV  ra   r   r   r   ra   r   )r   objectra   rb   )r   aten_foreach_copyr  add_r   	nextafterrr  rI   r  r   )rs   	flat_argshas_scalar_only_inputsr  r  r  r  r  r	  r  r  r
  r  s   `    @@@@@@@@rM   _find_common_deviceFakeTensor._find_common_device  s     !& '&&
 %0II%
!
 0;NN""0
,	(	)	<?	 ?	B C#  +400]5J%)"!LL/M  #DTF!KLL444rO   r2   )coeffc               
   U R                   c  U R                  R                  S S9U l         [        U R                   [        R
                  5      (       d!  [        S[        U R                   5       35      eU R                   U-  $ )Nnt_tensor_idz1Expected nested_int_memo to be torch.SymInt, got )r  r   create_symbolic_nested_intr   rI   r   r   r   )rX   r  s     rM   get_nested_intFakeTensor.get_nested_int.  s    
 '#'>>#L#L! $M $D  $..== CDI]I]D^C_`  ##e++rO   c                   U R                  5       S:X  a  U R                  5       $ U R                  5       S:X  a   U  Vs/ s H  oR                  5       PM     sn$ U  Vs/ s H  oR                  5       PM     sn$ s  snf s  snf Nr   r2   )r3  r:  tolist)rX   r   s     rM   r!  FakeTensor.tolist>  sb    88:?99;XXZ1_,01DDIIKD11.23ddKKMd33 23s   A9A>)r  r  r   rO  r  r   rB  r  r  rN  r  r  r  )ra   rV  )r   rV  ra   rb   r  rV  ra   rb   )ra   	list[str])r   r$  ra   rb   )r  rV  ra   rV  )NNNN)r   r   r   r   r  rV  r   r  r  r  rN  r  rO  rW  ra   r   )r  r  r  r  ra   rb   )r   r   r   r   ra   r   
rs   r=   r  Sequence[type]r  Sequence[object]r  Mapping[str, object]ra   r  )rs   r=   r  r'  ra   ztuple[torch.device, bool])r  zint | torch.SymIntra   ztorch.SymInt)ra   r   )$rc   rd   re   rf   __doc__rn   r|  r  rB  r  r  r  rI   rJ   r   r   	_mode_keyrX  r  setterr  r  staticmethodr  r  rY   r  classmethodr0   r!   r  r  r  r!  rg   __classcell__r  s   @rM   r   r     sk    
 :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 %&, ", 
	, 4 4rO   r   r4   r5   T)slotsc                      \ rS rSr% SrS\S'   S\S'   S\S'   S\S	'   S
\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'           S!S jrSrg )"TensorMetadataiJ  zC
The Tensor metadata relevant to hashing FakeTensors when caching.
ztorch.dtyper4  ztuple[_MetadataIntLike, ...]shapestriderV  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   r   is_coalesced
int | None	dense_dim
sparse_dimc                z   [         R                  " U 5       H  n[        XR                  5      n[	        U[
        [        [        R                  45      (       a&  / nUR                  XX65        UR                  5         Mh  [	        U[        5      (       a  UR                  X5        M  UR                  U5        M     g r   )dataclassesfieldsr   rp  r   tuplelistrI   Size_prep_args_for_hashclearr   convert_sym_intr   )rX   resultr   statefieldrG  id_hashed_objectss          rM   _flatten_intoTensorMetadata._flatten_intob  s     !''-ED**-E%%uzz!:;; 35!((Q!'')E6**%%f4e$ .rO   r_   N)rH  list[object]r   r   rI  r3   ra   rb   )rc   rd   re   rf   r)  rn   rL  rg   r_   rO   rM   r2  r2  J  s     ''((--$$**MLO%% % 	%
 
%rO   r2  c                >   [        U 5      nU R                  (       d$  [        U 5      (       d  U R                  US9(       d  SnU R	                  5       n[        U R                  U R                  U R                  [        R                  :X  a  U R                  5       OSU R                  U R                  UU[        U 5      (       d  U R                  5       R                  5       OSU R                  U R                   U R#                  5       U R%                  5       U R'                  5       U R(                  U R(                  (       a  U R+                  5       OS[        U 5      (       a  U R-                  5       OS[        U 5      (       a  U R/                  5       5      $ S5      $ )z)
Extract the TensorMetadata of a tensor.
)r5  Nr_   )r   _has_symbolic_sizes_stridesr   is_contiguousr7  r2  r4  r3  r   rI   r   r4  r  untyped_storagenbytesr  r.  r9  r:  r  r   r;  r=  r>  )r   r5  r7  s      rM   extract_tensor_metadatarT  x  s)    *!,M 	
%%];%%'N		hh%--/
R		,9!,<,<""$$						
		KKT&q))t'**% $ 15% rO   c                  V    \ rS rSr% SrS\S'   S\S'   SS jrSS jrSS	 jrSS
 jr	Sr
g)_DispatchCacheKeyi  z(
Key for the FakeTensor dispatch cache.
tuple[object, ...]r   int	hashvaluec                0    Xl         [        U5      U l        g r   )r   hashrY  )rX   tups     rM   rY   _DispatchCacheKey.__init__  s    crO   c                b    [        U[        5      =(       a    U R                  UR                  :H  $ r   )r   rV  r   )rX   others     rM   __eq___DispatchCacheKey.__eq__  s"    %!23MEII8MMrO   c                    U R                   $ r   )rY  rW   s    rM   __hash___DispatchCacheKey.__hash__  s    ~~rO   c                x    U R                    H*  n[        U[        5      (       d  M  UR                  5         M,     g r   )r   r   r4   strip_shape_env)rX   r   s     rM   rf  !_DispatchCacheKey.strip_shape_env  s+     A!_--!!# rO   )rY  r   N)r\  rW  ra   rb   )r_  r  ra   r   )ra   rX  r`   )rc   rd   re   rf   r)  rn   rY   r`  rc  rf  rg   r_   rO   rM   rV  rV    s)     
N#N$rO   rV  c                      \ rS rSrSrg)SingletonConstanti  r_   N)rc   rd   re   rf   rg   r_   rO   rM   ri  ri    s    rO   ri  )frozenr0  c                  F    \ rS rSr% SrS\S'   S\S'   S\S'   \rS\S	'   S
rg)_DispatchCacheEntryOutputInfoi  a  
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_valuer_   N)	rc   rd   re   rf   r)  rn   ri  rp  rg   r_   rO   rM   rl  rl    s%    	 ##!2NJ2rO   rl  c                  2    \ rS rSr% SrS\S'   SrS\S'   Srg	)
_DispatchCacheValidEntryi  z
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_tupler_   N)rc   rd   re   rf   r)  rn   rt  rg   r_   rO   rM   rr  rr    s     76!OT!rO   rr  c                  $    \ rS rSr% SrS\S'   Srg)_DispatchCacheBypassEntryi  z(
Entry type for a negative cache entry.
rk   rl   r_   Nrc   rd   re   rf   r)  rn   rg   r_   rO   rM   rv  rv         KrO   rv  c                  $    \ rS rSr% SrS\S'   Srg)_BypassDispatchCachei  z4
Signals cases that should skip FakeTensor caching.
rk   rl   r_   Nrw  r_   rO   rM   rz  rz    rx  rO   rz  c                  B    \ rS rSr% SrS\S'   S\S'   S\S'   S\S'   S	rg
)DispatchCacheInfoi  z?
Information about the state of the FakeTensor dispatch cache.
rX  hitsmissesdict[str, int]bypassessizer_   Nrw  r_   rO   rM   r|  r|    s     IK
IrO   r|  c                  V  ^  \ rS rSr% 0 rS\S'   SrS\S'   SrS\S'   \" \	5      r
S\S	'   SrS\S
'   SrS\S'   S\S'   S\S'   S\S'   S\S'   SrS\S'   SrS\S'   SSSSSS.           SGU 4S jjjrSHS jrSIS jr\SJS j5       r\SKS j5       r\S\" 5       4         SLS  jj5       rSMU 4S! jjr        SNU 4S" jjr\SJS# j5       r\SOS$ j5       r\SHS% j5       r          SLS& jr          SPS' jr        SQS( jr           SRS) jr!              SSS* jr"              STS+ jr#              SUS, jr$            SVS- jr%            SWS. jr&            SXS/ jr'S\" 5       4         SLS0 jjr(          SYS1 jr)            SZS2 jr*          S[S3 jr+\," S4S5S6S7S8S9S:S;5      r-S\S< jr.          S]S= jr/          S^S> jr0SS?.   S_S@ jjr1\," \2Rf                  Rh                  \2Rj                  Rl                  \2Rn                  Rl                  \2Rp                  Rl                  \2Rr                  Rl                  \2Rt                  Rl                  \2Rv                  Rl                  \2Rx                  Rl                  \2Rz                  Rl                  \2R|                  R~                  \2R                  Rl                  5      rA\," \2R                  Rl                  \2R                  Rl                  \2R                  R                  5      rFS\SA jrG\," \2R                  Rl                  \2R                  Rl                  5      rJS`SB jrK          SaSC jrLSSSSSD.           SbSE jjrMSFrNU =rO$ )cr   i  ,dict[_DispatchCacheKey, _DispatchCacheEntry]cacher   rX  
cache_hitscache_missesr  cache_bypassesr  Fr   rd  static_shapesrS  r  z
str | None_stackr  rm  nt_tensor_id_counternt_tensor_id_initial_countTN)allow_fallback_kernelsallow_non_fake_inputsr  r  r   c                 > [         R                  S[        U 5      5        [        TU ]  5         Xl        SS KnSS KnUR                  R                  R                  U l        [        U R                  US9U l        Ub  X@l        O	US L U l        SU l        UR                  R                  R                   U l        UR                  R                  R$                  U l        UR(                  R                  R*                  =(       a    U R                  (       + U l        UR(                  R                  R.                  U l        X l        SU l        / U l        X0l        [:        R<                  " 5       U l        S U l         URB                  RD                  RF                  U l$        SS K%nURL                  RN                  RP                  RR                  U l*        U RT                  U l+        g )Nzcreate_mode 0x%xr   r   F),logrz  idr  rY   r  torch._dynamo.configtorch._functorch.configr   r  "fake_tensor_propagate_real_tensorspropagate_real_tensorsr   fake_tensor_converterr  allow_scalar_outputs(fake_tensor_allow_unsafe_data_ptr_accessr  fake_tensor_allow_metar  _dynamofake_tensor_cache_enabledr   $fake_tensor_cache_crosscheck_enabledcache_crosscheck_enabledr  rd  enter_stackr  	tracebackextract_stack_stack_tracer  rJ   r   r   r*  $torch.nested._internal.nested_tensornested	_internalnested_tensor_tensor_id_counterr  r  )rX   r  r  r  r  r   rI   r  s          rM   rY   FakeTensorMode.__init__#  s   $ 			$bh/&<##& ##FF 	# &911&
"
 $!.!*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                &    U R                   U l        g r   )r  r  rW   s    rM   reset_nt_tensor_id_counter)FakeTensorMode.reset_nt_tensor_id_counter  s    $($C$C!rO   c                L    [        U[        5      =(       a    UR                  U L $ r   )r   r   r   rX   r   s     rM   is_our_fakeFakeTensorMode.is_our_fake  s    !Z(@Q[[D-@@rO   c                   [         R                  R                  5       (       aQ  [         R                  R                  5       (       a  [	        S5      e[         R                  R                  5       (       + $ [         R                  R                  5       =(       dF    [        [         S5      =(       a    [         R                  R                  5       =(       d
    [        5       (       + $ )Nz&Cannot have both xpu and cuda compiledrE   )	rI   rF   _is_compiledrD   r   is_availablehasattrrE   r   rW   s    rM   avoid_device_init FakeTensorMode.avoid_device_init  s    99!!##zz&&(($%MNNyy--/// JJ##% 3u%B%))*@*@*B302
 	
rO   c                    U R                   c4  SR                  [        R                  " U R                  5      5      U l         U R                   $ )N )r  joinr  format_listr  rW   s    rM   stackFakeTensorMode.stack  s7    ;;'')"7"78I8I"JKDK{{rO   r_   c                   [         R                  R                  [         R                  R                  R                  5      b  [        SU 35      e U R                  XX45      $ ! [         a    [        R                  S5        e f = f)Nz2FakeTensorMode should not be set when dispatching zfake tensor raised TypeError)
rI   rJ   r  r   r   r   dispatch	TypeErrorr  	exception)rX   rs   r  r  r  s        rM   r  !FakeTensorMode.__torch_dispatch__  su     88&&uxx'E'E'J'JKW DTFK 	==d;; 	MM89	s   A$ $!Bc                  > SS K nS nU R                  (       aO  UR                  R                  5       nUR                  R	                  S5        UR                  R                  5         UR                  R                  U R                  5      nXLa+  U R                  R                  SX245        [        TU ]-  5       $ UR                  R                  U 5        U R                  R                  SS U45        U $ )Nr   TF)r  r  rJ   _only_lift_cpu_tensors_set_only_lift_cpu_tensors_ensureCUDADeviceGuardSetr   r*  r  r   r  	__enter__r   )rX   rI   prev_only_lift_cpu_tensorsmaybe_prev_fake_moder  s       rM   r  FakeTensorMode.__enter__  s    3%)"!!).)H)H)J&HH//5
 HH..0$xx<<T^^L+##+H 7$&& HH''-##UD2L$MNrO   c                   > U R                   R                  5       u  pEnU(       aV  [        TU ]  XU5        Ub  [        R
                  R                  U5        Ub   [        R
                  R                  U5        g g g r   )r  r   r  __exit__rI   rJ   r   r  )rX   exc_typeexc_valexc_tbliver   maybe_prev_only_lift_cpu_tensorsr  s          rM   r  FakeTensorMode.__exit__  st       " 	G%E GX7 $/++,@A/;334TU < rO   c                    gr   r_   r  s    rM   is_infra_modeFakeTensorMode.is_infra_mode  s    rO   c                    [        [        R                  [        R                  [	        [        R
                  5      [        [        R                  5      5      $ )z(
Query the state of the dispatch cache.
)r|  r   r  r  r   r  r  r  r  s    rM   
cache_infoFakeTensorMode.cache_info  s?    
 !%%''../$$%	
 	
rO   c                    SU l         SU l        U R                  R                  5         U R                  R                  5         g)z
Clear the dispatch cache.
r   N)r  r  r  rF  r  r  s    rM   cache_clearFakeTensorMode.cache_clear  s3    
   "		rO   c                \   SnSn [        U R                  5      nU R                  XQX45      nUc  U R                  XX45      $ Uc  [        S5      eUR!                  5       (       a5  UR                  c  [        S5      eUR                  R"                  n[$        n	O[        R&                  n[(        n	UR+                  US5      n
U
b  [	        U
[,        5      (       a7  [        R                  U
R                  ==   S-  ss'   U R                  XX45      $ U R/                  XZXaU5      n[        =R0                  S-  sl        U R2                  (       a)  [5        U 5         U R7                  XX#U5        SSS5        U$ U$ U R                  XX45      n U R9                  XVXXK5      n
U	" XU
5        [        =R:                  S-  sl        U$ ! [         a  n[	        U[
        R                  R                  5      (       a8  UR                  5       S:X  a$  [        R                  SUS   UR                  5        [        R                  UR                  ==   S-  ss'    SnAGN,SnAff = f! , (       d  f       U$ = f! [         a  n[	        U[
        R                  R                  5      (       a8  UR                  5       S:X  a$  [        R                  SUS   UR                  5        [        R                  UR                  ==   S-  ss'   U	" X[-        UR                  5      5        Us SnA$ SnAff = f)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_keyrz  r   rI   _opsHigherOrderOperatorrp  hc_logrz  rl   r   r  _dispatch_implr   cache_on_shape_envfake_tensor_cache_set_cache_key_for_shape_envr  _set_cache_keyr  rv  _output_from_cache_entryr  r  r   _crosscheck_cache_output_make_cache_entryr  )rX   rs   r  r  r  rI  r   er  set_cache_keyentryoutputs               rM   _cached_dispatch_impl$FakeTensorMode._cached_dispatch_impl  s    	9"4>>2E//%t<C ;
 &&tDAA= !TUU##%%&$P  OO55E8M"((E*M		#t$%!:;; --ell;q@;**4EE 225DQF%%*%,, /t411&VT 5M6M $$T$?	**5t6RE$ 	e%(##q(#] $ 	9 4!?!?@@IIK#44LGHH
 ))!((3q833	9b 54M $ 	
 4!?!?@@IIK#44LGHH
 ))!((3q83%&?&IJM	sC   'G I!I3 
IBII!
I03
L+=B#L& L+&L+c           	        [         R                  R                  R                  R	                  5       SLnU[         R
                  " 5       [         R                  R                  5       [         R                  " 5       U R                  (       a  U R                  R                  OSU/nUR                  (       a  UR                  U R                  5        / nU(       a  U R                  XcX5        U(       a  U R                  XdX5        [        [!        U5      5      nU H1  n	["        R$                  " U	[&        R(                  " [*        US95        M3     UR-                  5         U$ )zs
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  rE  rV  rB  r   finalize	functoolspartialevict_fake_tensor_cache_keyrF  )
rX   rI  rs   r  r  
is_tracing
key_valuesrK  r   id_hashed_objs
             rM   r  FakeTensorMode._cache_keyf  s    XX**77FFHPTT
 ##% HH((* ++- (,~~DNN##4 %

(  djj)*,$$ZuP$$ZRj 12.My001LRUV / 	!
rO   c                   SSK Jn  [        U[        R                  R
                  5      (       a  X;   a  g[        R                  R                  UR                  ;   a  [        S5      e[        R                  R                  UR                  ;   a  U[        R                  R                  L au  [        UUUSS9u  pVUS    H]  n[        U[        R                  5      (       d  M$  UR                  [        R                   [        R"                  4;   d  MT  [        S5      e   g[        S5      e[        R                  R$                  UR                  ;   a  [        S	5      eU[        R&                  R(                  L a  [        S
5      eXR*                  ;   a  [        S5      eUR-                  5       S:X  a  [        S5      e[        R.                  R0                  R3                  U5      (       d  [        S5      eUR4                  (       aa  [        R6                  R9                  UR-                  5       [        R6                  R:                  R<                  5      (       a  [        S5      egg)zI
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tagsrz  dynamic_output_shaper  r  r   r"   r4  r   r8  inplace_view_unsafe_viewr  lift_fnsrp  _libraryutils
is_builtinis_viewrJ   %_dispatch_has_kernel_for_dispatch_keyDispatchKeyr  )rX   rs   r  r  r  r   
new_kwargsr  s           rM   _validate_cache_key"FakeTensorMode._validate_cache_key  s    	J
 tUZZ;;<</
 99**dii7&'>??99))TYY6tzz((( 2!15	! (	2E "%665;;



K < 33IJJ 3 &'=>>99!!TYY.&~664$$,,,&}55== &v..99;;;&'HII~~##..t44&}55
 <<EHHJJIIK--GG
 
 ''BCC
<rO   c                   SSK Jn  SSKJn  [	        U[
        [        [        45      (       a7  UR                  [        U5      5        UR                  S[        U5       35        [	        U[        5      (       aA  U R                  XR                  5       X45        U R                  XR                  5       X45        gU GH  n[	        U[        5      (       a  U R                  U5      (       d  [!        S5      eUR"                  b  [!        S5      e[%        U5      (       a  [!        UR&                   S35      e[)        U5      nUR+                  XU5        M  [	        U[,        5      (       a  [!        S	5      e[	        U[.        5      (       a  UR1                  X5        M  [	        U[2        [4        45      (       a  [!        S
5      e[	        U[
        [        [        45      (       a  U R                  XX45        GM<  [	        U[6        R8                  5      (       a  [!        S5      e[	        U[:        R<                  R>                  5      (       aH  UR                  [        U5      5        UR                  [A        U5      5        UR                  U5        GM  [	        Xv5      (       a8  UR                  [C        U5      5        UR                  URD                  5        GM  [	        Xu5      (       aR  UR                  [        U5      5        UR                  [C        U5      5        UR                  URF                  5        GM  UR                  [        U5      5        UR                  U5        GM     g)a  
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   rC  rB  r   r   r   r  rE  keysvaluesr   r  rz  r   r   r   rT  rL  r   r   rG  r   r   r  FunctionTyperI   r  GraphModuler  r[  subgraphorig_callable)	rX   rH  r  rI  rK  r  r  r  rn  s	            rM   rE  "FakeTensorMode._prep_args_for_hash  ss   	
 	JdT5$/00MM$t*%MMGCI;/0dD!!$$VYY[%S$$V[[]EUC#z**'',,.~>><<+./CDD %%.#**W/EFF237&&vU;C((*+<==C((%%f2C'8!455*+;<<C$t!455((eOC!3!344*+>??C!5!566 d3i(bg&!((-C99 d3i( "((6C@@d3i(d3i(!(():):;
 d3i(c"U rO   c                   [        U[        [        S 5      45      (       a  g [        X5        [        U[        5      (       d  [        S5      eUR                  b  [        S5      eUR                  (       a  [        S5      e[        U5      (       a  [        S5      eUR                  5        H&  n[        U5      [        U5      :X  d  M  [        S5      e   g )Nznon-FakeTensor outputr  zsparse outputzsparse compressed outputzkwarg aliases output)r   rX  r   %_validate_symbolic_output_for_cachingr   rz  r   r   r   r   r  )rX   rI  r   rs   r  r  r  kvals           rM    _validate_output_for_cache_entry/FakeTensorMode._validate_output_for_cache_entry*  s     fsDJ/00 	.e< &*--&'>?? ??&&';<< &77''&'ABB MMOD$x2f:%*+ABB $rO   c                  ^ [        U[        [        R                  [	        S 5      45      (       a  [        S S S US9$ [        [        U5      5       H*  n[        XG   5      [        U5      :X  d  M  [        US S S9s  $    S n[        U[        R                  R                  5      (       ar  UR                  (       aa  [        U5       V	V
s/ s H  u  p[        U
[        5      (       d  M  U	PM      nn	n
[        U5      S:w  a  [        S[        U5       35      eUS   n[        U5      n[!        U4S jUR"                   5       5      Ul        [!        U4S jUR$                   5       5      Ul        TR'                  UR(                  5      Ul        UR*                  c  S OTR'                  UR*                  5      Ul        [        S UUS9n[-        U4SS	9nSS
KJn   U R3                  TXX45      n[        R6                  R9                  U5      n[        R6                  R9                  U5      nUU:w  a  [5        S5      eU$ s  sn
n	f ! U a    [5        S5      S ef = f)Nrm  rn  ro  rp  )rm  rn  ro  r2   z1Expected exactly one tensor arg for view op, got r   c              3  F   >#    U  H  nTR                  U5      v   M     g 7fr   convert_outputr   r   rI  s     rM   r   BFakeTensorMode._get_output_info_for_cache_entry.<locals>.<genexpr>t  s     O1u33A66   !c              3  F   >#    U  H  nTR                  U5      v   M     g 7fr   r.  r0  s     rM   r   r1  u  s     QA 4 4Q 7 7r2  Frs  rt  )GuardOnDataDependentSymNodezdata dependent symnodezdispatch_key_set mismatch)r   rX  rI   r   r   rl  ranger  r  r  r=   r  	enumerater   r   rT  rB  r3  r4  r/  r7  r8  rr  r,  r5  r  rz  rJ   _dispatch_key_set)rX   rI  r   rs   r  r  r  idxro  ir   idxsrn  r  entry_for_synth_outputr5  synth_outputsynth_key_setkey_sets    `                 rM    _get_output_info_for_cache_entry/FakeTensorMode._get_output_info_for_cache_entryT  s#    fsELL$t*=>>0 4$v 
 T#C$)}6
*4 #dT  $ dEJJ1122t||"+D/K/$!Z65JA/DK4yA~$GD	{S  AwH*62OOOQQQ"'"6"6x7N7N"O %%- %%h&<&<= 	 .
 ":5"
 	V		K88-DL 22<@((,,V4G#&'BCCg LJ + 	K
 ''?@dJ	Ks   	H?(H?I Ic                f  ^ SSK Jn  SSKJm  U R	                  X4U5        [        U[        R                  R                  5      (       ae  X7;   a`  [        U[        5      (       d  Ub  [        SU S[        U5       35      eUb+  [        U4S jU 5       5      nU(       a  [        SU S	35      e[        U[        [        R                  [        S5      45      (       a  [!        SSSUS
9n	[#        U	4SS9$ [        U[        5      (       a   U H  n
U R%                  UUUUUU
5        M     OU R%                  UUUUUU5        [        U[        5      (       a9  U Vs/ s H  nU R'                  UUUUUU5      PM     nn[#        [        U5      SS9$ U R'                  UUUUUU5      n	[#        U	4SS9$ s  snf )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     >#    U  H>  n[        U[        R                  [        R                  45      =(       a    T" U5      v   M@     g 7fr   )r   rI   r   r   )r   orC  s     rM   r   3FakeTensorMode._make_cache_entry.<locals>.<genexpr>  s@      $ $ q5<<">? 51!45#s   AA	zunbacked symbol in HOP z outputr,  Fr4  T)r  r  r,  rC  r  r   rI   r  r  rB  r   r   r  rz  rX  r   rl  rr  r)  r@  )rX   rI  r   rs   r  r  r  r  non_cacheableoutput_infoout_elementout_elemrs  rC  s                @rM   r   FakeTensorMode._make_cache_entry  s    	JS  V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$$ !'
 !'H 55 !'  
 ,"<0 $  ??K ,)^U 5
s    F.c                  ^^^ UR                   cD  UR                  c7  UR                  c*  UR                  [        L a  [        S5      eUR                  $ UR                   b0  XRR                      n[        U[        5      (       d  [        S5      eU$ UR                  nUc  g [        U5      (       a  [        S5      eSU4S jjm[        UU4S jUR                   5       5      n[        UU4S jUR                   5       5      n	T" UR                  T5      n
UR                  b  T" UR                  T5        [        R                  nU R                   b  U R                   R"                  n[%        U 5         U" 5          [&        R(                  " UU	UR*                  UR,                  SUR.                  S9nS S S 5        S S S 5        UR0                  (       a   [&        R2                  R5                  WS	5        UR6                  (       a   [&        R2                  R9                  WS	5        [        U[&        R:                  R<                  5      (       a  UR>                  (       a  U[A        [B        UR                  5         n[        U[        5      (       d  [        S
5      eURE                  5       n[%        U 5         U" 5          WRG                  XX5        S S S 5        S S S 5        [        U WURH                  5      $ ! , (       d  f       GNM= f! , (       d  f       GNW= f! , (       d  f       NQ= f! , (       d  f       NZ= f)Nz2entry.constant_value must not be SingletonConstantz inplace_arg must be a FakeTensorz)Sparse tensors are not supported in cachec                   > [        U [        5      (       a4  UR                  c  [        S5      eU R	                  TUR                  5      $ [        U [
        5      (       a  [        S5      eU $ )Nz6state.shape_env must not be None for _SymIntOutputStubz Unexpected _PySymInputStub value)r   r5   r  r   r  r4   )rG  rI  r   s     rM   check_valueGFakeTensorMode._get_output_tensor_from_cache_entry.<locals>.check_value&  s`    %!233??*(P  }}S%//::e_55()KLLrO   c              3  6   >#    U  H  nT" UT5      v   M     g 7fr   r_   r   r   rN  rI  s     rM   r   EFakeTensorMode._get_output_tensor_from_cache_entry.<locals>.<genexpr>2  s     D^k!U++^   c              3  6   >#    U  H  nT" UT5      v   M     g 7fr   r_   rQ  s     rM   r   rR  3  s     Fo{1e,,orS  rM  )r4  r   r  r  Tzview_arg must be a FakeTensor)rG  r6  rI  r3   ra   r%   )%rm  rn  ro  rp  ri  r   r   r   r   rB  r3  r4  r7  r8  
contextlibnullcontextr  suppress_guardsrk  rI   empty_stridedr4  r   r  r9  rJ   	_set_conjr:  _set_negr  r=   r  r   rX  rR  set_r  )rX   rI  r  r   rs   r  inplace_argrn  r3  r4  r7  maybe_suppressr_  view_argstoragerN  s    ` `           @rM   #_get_output_tensor_from_cache_entry2FakeTensorMode._get_output_tensor_from_cache_entry  sr    %&&##'88$H  '''(001Kk:66$%GHH >>"" !LMM
	 DX^^DDFhooFF$X%<%<eD!!-..6 "" 	 >>%!^^;;N)$/1A''nn&44E 2B/ HHud+??HHeT*dEJJ1122t||Denn56Hh
33$%DEE..0G-d3^5E

7EB 6F3 $x771 2B1A//* 6F5E33sH   6L>8K<6L:L1L L1<
L	L
L 
L.	*L11
L?c           
         UR                   (       a8  UR                   Vs/ s H  nU R                  XX4U5      PM     nn[        U5      $ U R                  XR                  S   X4U5      $ s  snf )z/
Create a new FakeTensor from the cache entry.
r   )rt  rs  r`  rB  )rX   rI  r  r   rs   r  rH  outputss           rM   r  'FakeTensorMode._output_from_cache_entryX  s       
 $)#5#5	 $6K 884 $6	   >!;;))!,c s   A*c                   ^ SU4S jjm U R                  X#XE5      n T" Xa5        g! [         a  n[        SU SU SU SU 35      UeSnAff = f! [         a  n[        SU SU SU 35      UeSnAff = f)zn
Helper to validate that the output synthesized from the cache matches
the output created by normal dispatch.
c                  > [        U [        5      (       a  [        U[        5      (       d  [        S[        U5       35      e[	        U 5      [	        U5      :w  a#  [        S[	        U 5       S[	        U5       35      e[        X5       H  u  p#T" X#5        M     g [        U [        5      (       a,  [        U[        5      (       a  X:w  a  [        SU  SU 35      eg U c  Ub  [        SU 35      eg [        U [        5      (       aB  [        U 5      [        U5      Ld  U R                  UR                  La  [        SU  SU 35      eg [        U [        R                  5      (       aG  [        U[        R                  5      (       d  [        S[        U5       35      e[        [        X5        g [        S[        U 5       35      e)	NzExpected tuple, got zTuple length mismatch: z != zInt mismatch: zExpected None, got zSymType mismatch: Expected Tensor, got zUnsupported type )r   rB  r   r   r  ziprX  r&   r  rI   r   r   r   r  )ablr  assert_helpers       rM   rl  >FakeTensorMode._crosscheck_cache_output.<locals>.assert_helper~  s   !U##!!U++(+?Qy)IJJq6SV#(+B3q6($sSTvh)WXXIDA!!' &As##!!S))QV(>!D)DEE .4=(+>qc)BCC !A|,,7$q')QVV166-A(+=aSQC)HII .BAu||,,!!U\\22(+@a	)JKK"9a3"%6tAwi#@AArO   z*FakeTensor cache crosscheck failure: func=z, args=z	, kwargs=z: Dispatch raised=N)ri  r   rj  r   ra   rb   )r  	Exceptionr  )	rX   r  rs   r  r  r  true_outputr  rl  s	           @rM   r  'FakeTensorMode._crosscheck_cache_outputq  s    	B0	--d4HK	+.  	<TF CvYvh.@E 	  	<TF CvYvh0 	s+   ' A 
AA		A
A5A00A5c                6   U=(       d    0 n[        5          [        R                  SXU5        S S S 5        U[        ;   a  [        U   " U5      $ [        R	                  5       [
        R                  ::  a(  [        R                  SS[        -  U5        [        5       nU[        ;   a  [        U 5         U" U0 UD6sS S S 5        $ U R                  (       a  U R                  XX45      $ U R                  XX45      $ ! , (       d  f       N= f! , (       d  f       NT= f)Nz%s %s %sz'%sFakeTensorMode.__torch_dispatch__: %s )r'   r  rz  r  getEffectiveLevelloggingDEBUGrV   rQ   _DISPATCH_HANDLE_DIRECTLYrk  r   r  r  )rX   rs   r  r  r  incrs         rM   r  FakeTensorMode.dispatch  s     2]IIj$f5  ***4066  "gmm3II93;PRV +,D ,,-d3T,V, 43 --d4HH&&tDAA/ ]" 43s   C92D
9
D

Dc                  ^ ^^^^
^ SSK mSSKJn  SU U4S jjn[        T[        R
                  5      (       aW   U" TTSSSSSS9  [        [        TR                  5       TR                  5       5      5       H  u  nu  p U" X5        M     TS4$ Tck  Tbh  [        R                  R                  R                  (       a  [        S	UUU4S jS9  [        T TT5      S4$ [        ST ST S[        U5       ST 35      e U" TT5        TS4$ ! [         ar  m
[        R                  R                  R                  (       a#  [        S	U
U4S
 jS9  [        T TT5      S4s Sm
@
$ [        ST ST S[        U5       ST 35      T
eSm
@
ff = f! [         aw  m
[        R                  R                  R                  (       a%  [        S	U
U4S jS9  [        T TT5      S4s Sm
@
s  $ [        SU SU	 S[        U5       SU ST 3
5      T
eSm
@
ff = f! [         a&  m
[        ST ST S[        U5       ST 35      T
eSm
@
ff = f)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                  > [        U [        [        45      (       a  TR                  c  [	        S5      eU R
                  R                  R                  TR                  R                  R                  5       -
  TR                  R                  R                  5       -
  (       dh  TR                  R                  TR                  U R
                  R                  U5      SS9TR                  R                  La  [        SU  SU S35      eg g [        U [         ["        [$        45      (       a  X:w  a  [        SU  SU S35      eg g )Nz3self.shape_env must not be None for symbolic valuesT)compute_hintmismatch between fake value  and real value rr  )r   r   r   r  r   r  exprfree_symbolsbacked_var_to_valr  real_tensor_prop_unbacked_vals_maybe_evaluate_staticEqStruer   rX  floatr   )r   realrX   sympys     rM   _check_fake_real_vals?FakeTensorMode._maybe_infer_fake.<locals>._check_fake_real_vals  s9   $ 233>>)(M  		33nn66;;=>nnCCHHJK
 ==!HHTYY^^T: >   %ww||,
 4:4&@PQUPVVWX ,K sE4(  </6tf<LTFRST   rO   Real tensor propagation foundFT)contextsizesstridesr7  r  mismatched_fake_kernelc                 4   > [        T5      T R                  S.$ Noprl   rk   rl   excrs   s   rM   <lambda>2FakeTensorMode._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5      T R                  S.$ r  r  r  s   rM   r  r  	  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5      ST  ST 3S.$ )Nr}  r~  r  rk   )r   rs   r  s   rM   r  r  !	  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   ra   rb   )r  torch._subclasses.fake_utilsrz  r   rI   r   r   r   r  *generate_fake_kernels_from_real_mismatchesr   _infer_fake_from_real_tensorr+   r7  rh  r  )rX   rs   pathr   r  rz  r  js_fakes_realr  r  s   `` ``     @@rM   _maybe_infer_fake FakeTensorMode._maybe_infer_fake  s    	I	 	< dELL))(;!#'"'2 (1TYY[$))+1N'O##F)&9 (P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  F?	H 
FAFF"!FF
HAHH#$HH
H?!H::H?c                  ^ ^^^ SSK Jn  SmT R                  (       a  [        T R                  R                  5      mSUU 4S jjn[
        R                  U5      u  p[
        R                  U5      u  p U" SXSXB5        [        [        X5       VVVs/ s H  u  u  pnT R!                  TXU5      PM     snnn6 u  nn[#        U5      (       a  T(       a  U" 5         [
        R%                  X5      $ ! [         ao  m[        R                  R                  R                  (       a,  [        SUU4S jS9  U" 5         [        UU 4S	 jU5      s Sm@$ [        S
U SU ST 35      TeSm@ff = fs  snnnf )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R                  R                  5      R	                  T 5      5      TR                  l        g r   )rC  setr  pending_fresh_unbacked_symbols
difference)pending_unbackedrX   s   rM   _clear_pending_unbackedXFakeTensorMode._maybe_infer_fake_kernel_from_pytree_out.<locals>._clear_pending_unbackedK	  s4    <@DNNAABMM$=DNN9rO   r  r  c                 :   > [        T5      ST R                   3S.$ )Nz>Mismatched aliasing spec between fake kernel and real kernel: r  r  r  s   rM   r  IFakeTensorMode._maybe_infer_fake_kernel_from_pytree_out.<locals>.<lambda>^	  s!    !$i\]`]g]g\hi)rO   r  c                   > [        TTU 5      $ r   )r  )r   rs   rX   s    rM   r  r  j	  s    :4qIrO   zGReal tensor propagation found an aliasing mismatch between fake output z and real output z,  for func: r`   )r  r  r  rC  r  r   tree_flatten_with_pathtree_flattenr   rI   r   r  r  r   r-   rh  r  r  tree_unflatten)rX   rs   fake_inreal_infake_outreal_outr  r  fake_paths_leaves	fake_specreal_leavesr   
_fake_path	_fake_out	_real_outfake_leaves	overridesr  r  s   ``               @@rM   (_maybe_infer_fake_kernel_from_pytree_out7FakeTensorMode._maybe_infer_fake_kernel_from_pytree_out7	  st    	C  >>#DNN$Q$QR	 	 (.'D'DX'N$,,X6	/H> "% ;>%;;6+ZY &&tZIN;"
Y 	NN/#%$$[<<Q % 	&&QQ!,! ()I8  ,##+*,=hZ H""&) 	)	:s+   5
C1 "E-1
E*;AE%
E*E%%E*c                t  ^ ^^^^,^-^.^/^0^1^2^3^4^5^6^7 SSK Jn  [        R                  TT45      u  m0m,[	        T05      nU(       aI  T0 Vs/ s H   n[        U5      (       d  M  [        U5      PM"     nn[        R                  SU5        [        $ T0 V	s/ s H  n	T R                  U	5      (       d  M  U	PM     n
n	[        S U
 5       5      =(       d    [        S T0 5       5      m2T R                  m.TT R                  ;   nSnT R                  (       a  T[        R                   R"                  R$                  R&                  L a  ST;   a  TS   R                  S:w  a  S	nT[        R                   R(                  R*                  R&                  L a  S	nT[        R                   R"                  R$                  R&                  L =(       a@    [-        TS   [        R.                  5      =(       a    TS   R0                  R                  S
:H  =(       d    UnU(       a  U
(       a%  [3        T5      (       a  T2(       d  U
(       d  U(       d  [5        S U
 5       5      (       d  [7        T S35      eT0 Vs/ s H'  nT R                  U5      (       a  UR8                  OUPM)     nn[        R;                  UT,5      u  nnT" U0 UD6n[        U5      [.        L aJ  T R=                  U5      (       a4  [?        5          URA                  5       nS S S 5        T.RC                  T US	S9$ U(       aY  [E        T5      S:w  d  [E        T5      S:w  a  [7        ST ST 35      e[        TS   5      [.        L a  T.RC                  T TS   5      $ T RG                  TT.T0T,5      u  m0n
@@[5        S U
 5       5      n[-        T[        RH                  RJ                  5      (       Ga  [        RL                  RN                  TRP                  ;  Ga  [        RL                  RR                  TRP                  ;  d  T["        RT                  R&                  L GaA  U(       Ga9  [E        U
5      S:w  Ga)  T2(       Gd!  U(       Gd  T["        RV                  R&                  La  T0 Vs/ s H'  nT R                  U5      (       a  UR8                  OUPM)     nn[        R;                  UT,5      u  nn[?        5          T" U0 UD6nS S S 5        [        RY                  W5      nU V	s/ s H  n	[-        U	[.        5      (       d  M  U	PM     nn	[5        U 4S jU 5       5      nU(       a   [        R[                  [.        U.U 4S jU5      $ U H  nT.R]                  U5        M     [        R;                  T0T,5      u  mm[-        T[        RH                  R^                  5      (       aa  TU;   a[  T R`                  c  [b        Rd                  OT R`                  Rf                  nT    U" 5          UT   " T0 TD6sS S S 5        sS S S 5        $ T Ri                  TU
TT5            S)U 4S jjnSSK5J6m-J7m1  [q        5       m3T3m6T Rr                  (       a  [5        S U
 5       5      (       a  [        U1U U74S jT0 5       5      (       d  [t        R                  ST5        T0 Vs/ s H  nU" U5      PM     nn[        R;                  UT,5      u  m4m5[v        Rx                  " T5      nU(       d  [v        Rz                  " TUT,5      n T" T40 T5D6m6U(       d2  WR                  5         [v        R                  " TR                  T0T65        OQT Rr                  (       a@  [t        R                  STU
T0T R`                  (       a  T R`                  R                  OS 5        S*UU-U1UUU3U4U5U6U 4
S jjnT2(       a.  [        5       R                  T5      nUb  U" U" T /TQ70 TD65      $ SSKEJFn  TU;  a  T R                  T5      (       d  T2(       a  TT R                  ;   d  SSKEJIn   TU ;   aK  T2(       d'  [        T5      (       a4  [5        S U
 5       5      (       a  T    U" U T   " T0 TD65      sS S S 5        $ T    TR                  " T0 TD6n!U![        La  U" U!5      sS S S 5        $  S S S 5        STR                  R                  ;   aE  [        TS 5      (       a4  [        T5      (       d$  T    U" TR                  " T0 TD65      sS S S 5        $ [        R                  R                  R                  n"U"b'  TU"R                  ;   a  U"R                  " TT /TQ70 TD6$ T Rr                  (       ak  T6T3Laf  [v        Rx                  " T5      (       dK  T R`                  b>  [v        R                  " T5      (       d#  [        T TT65      n#[        S!U4S" jS#9  U" U#5      $ [        R                  R                  R                  R                  TR                  5       5      R                  R                  n$U$(       a~   [        R                  R                  R                  T T5      m/[        R                  R                  R                  U/4S$ j5         T    U$" T0 TD6n#U" U#5      sS S S 5        sS S S 5        $ [         H5  u  n&n'U&" T5      (       d  M  U'" T T/TQ70 TD6n(U([        Ld  M-  U" U(5      s  $     S+   S,U,U0UU2U 4S& jjjn)[        T5      (       d  U)" 5       n*U" U*5      $  [        T 5         T" T0 TD6n!S S S 5        U" T R                  W!TT0TR                  S5      S(95      $ s  snf s  sn	f s  snf ! , (       d  f       GN= fs  snf ! , (       d  f       GN= fs  sn	f ! , (       d  f       O= fS S S 5        GM  ! , (       d  f       GN= fs  snf ! [|         a"  n[t        R                  STU5         S nAGNS nAff = f! , (       d  f       GN= f! , (       d  f       GNw= f! , (       d  f       GN*= f! , (       d  f       O= fS S S 5        GM  ! , (       d  f       GN= f! [         am  n%T Rr                  (       aU  T6T3LaP  [v        Rx                  " T5      (       d5  T R`                  b(  [        T TT65      n#[        S!U4S% jS#9  U" U#5      s S n%A%$ U%eS n%A%ff = f! , (       d  f       GN= f! [         a  n+U)" U+5      s S n+A+$ S n+A+f[         a    [t        R                  S'T5        e f = f)-Nr   r  z,FakeTensorMode unrecognized subclass(es): %sc              3  8   #    U  H  oR                   v   M     g 7fr   )rP  )r   r:  s     rM   r   0FakeTensorMode._dispatch_impl.<locals>.<genexpr>	  s      !
3Ha))3H   c              3  B   #    U  H  n[        U[        5      v   M     g 7fr   )r   r   )r   ri  s     rM   r   r  	  s     :	1Av&&	   Fr  r"  TrM  c              3  <   #    U  H  oR                   S Lv   M     g 7fr   r  r   r   s     rM   r   r  	  s     M7L!zz-7L   z. should not have fake inputs without constantsrD  r2   z1Expected exactly one arg for lift func, got args=z kwargs=c              3  <   #    U  H  oR                   S Lv   M     g 7fr   r  r   r  s     rM   r   r  	       Q;Pa::T1;Pr  c              3  F   >#    U  H  nTR                  U5      v   M     g 7fr   )may_turn_const)r   r   rX   s     rM   r   r  
  s!     P?O!t22155?Or2  c                &   > TR                  TU SS9$ )NTr  )rJ  )r   	converterrX   s    rM   r  /FakeTensorMode._dispatch_impl.<locals>.<lambda>"
  s    i88qPT8UrO   c                  > [        U [        5      (       a  U R                  $ [        U [        5      (       a  TR                  c  [        S5      eU R                  R                  U R                  R                  R                  TR                  R                  5      R                  TR                  R                  5      5      $ [        U [        5      (       a  U R                  $ U $ )Nz2self.shape_env must not be None for symbolic types)r   r   r  r&   r  r   r  rN  r  xreplacer  r  r   real_obj)r   rX   s    rM   maybe_to_real_tensor;FakeTensorMode._dispatch_impl.<locals>.maybe_to_real_tensor?
  s     !Z((}}$A|,,>>)(L  vv}}FFKK(()I)IJSSEE 
 A/00zz!rO   )compute_unbacked_bindingsfree_unbacked_symbolsc              3  <   #    U  H  oR                   S Lv   M     g 7fr   )r  r  s     rM   r   r  ]
  s     M7L!MM-7Lr  c              3     >#    U  HW  n[        U[        5      =(       a;    T" U5      =m=(       a*    TR                  S L=(       a    [        U4S jT 5       5      v   MY     g 7f)Nc              3  V   >#    U  H  nUTR                   R                  ;  v   M      g 7fr   )r  r  )r   srX   s     rM   r   :FakeTensorMode._dispatch_impl.<locals>.<genexpr>.<genexpr>c
  s'      !%A !N!NN!%s   &))r   r&   r  r  )r   ri  r  rX   symss     rM   r   r  ^
  sg       #A 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           	     f  >
^^ SS K m[        R                  ST5        SUUUU4S jjmTTLGa  [        R                  R
                  R                  (       d  TR                  TTT4T	T
4U T5        OTR                  TTT4T	T
4U T5      n [        U [        5      (       dr  [        T[        5      (       d]  [        U 5      [        T5      LaF  [        T[        [        R                  U 5      5      [        [        R                  T5      5      5        O[        TU T5        T" TR                  U SS9  U $ )Nr   zmaybe_propagate_real_tensors %sc                2  > [        U [        5      (       a  [        R                  S[	        U 5      [	        U5      5        Xl        [        U R                  5       UR                  5       5       H  u  p#T" X#5        M     [        U R                  5       UR                  5       5       H  u  p#T" X#5        M     T" U R                  5       UR                  5       5        g [        U [        5      (       Ga$  T" U 5      (       Ga  [        U R                  R                  TR                  5      (       aI  TR                  c  [        S5      eTR                  R!                  U R                  R                  U5        g [        U R                  R                  =nTR"                  5      (       ak  [        UR$                  TR                  5      (       aE  UR&                  S:X  a4  TR                  c  [        S5      eTR                  R!                  X!5        g g g g g g )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  rz  r  r  rh  r  r4  r7  r&   r  r  Symbolr  r   "set_real_tensor_prop_unbacked_valsr  lhsrhs)r   real_tr  real_sr  gorX   r  s       rM   r  OFakeTensorMode._dispatch_impl.<locals>.maybe_propagate_real_tensors.<locals>.go
  s   a,,II?A6
 %+M%(6;;=%A	1 &B%(V]]_%E	1 &Fq'')6+@+@+BC<005J15M5M!!&&++u||<<>>1"0 U#  IIFFKK ##31UXX>>&quuell;;EEQJ>>1"0 Q#  II!T ' < ? 6N0rO   T)peek)r   r  r  r   ra   rb   )r  r  rz  rI   r   r  r  r  r   r   r   r.   rB  r   r  r  )r  r  r  r  r  r  rs   r  nil	real_argsreal_kwargsr  rX   s    @@rM   maybe_propagate_real_tensorsCFakeTensorMode._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4&x88Xd8n< f11(;<f11(;< b(H5
 *$..(NOrO   )
meta_tabler   c              3  B   #    U  H  n[        U5      (       + v   M     g 7fr   )r   r  s     rM   r   r     s     P:OQa 000:Or  zprims::prim_meta_implmissing_fake_kernelc                    > S[        T 5      0$ Nr  r  r   s   rM   r  r  /  s    c$i)rO   r  c                    > T $ r   r_   )ctxs   rM   r  r  =  s    SrO   c                    > S[        T 5      0$ r  r  r   s   rM   r  r  N  s     #d)-rO   c                   > [         R                  R                  R                  T5      (       a  g T(       d  TR	                  T5      (       d  [        T5      eU c  [        T5      n [        TTTTU 5      $ r   )rI   r  r  can_generate_trivial_fake_implcan_run_unsafe_fallbackry   run_fallback_kernel)error	args_specr  rs   has_symbolic_sizesrX   s    rM   maybe_run_unsafe_fallback@FakeTensorMode._dispatch_impl.<locals>.maybe_run_unsafe_fallbacka  sc     ~~##BB4HH!)E)Ed)K)K2488}4T:&tT9iOOrO   z*failed while attempting to run meta for %srZ  )r   rB   ra   z)T | Tensor | torch._C.ScriptObject | None)r  rB   ra   rB   r   )r  zRuntimeError | Nonera   rR  )ir  r  r   r  _check_for_subclass_check_for_subclass_argr   r  rz  r1  r  r  r  r  r  rI   r  r  _to_copyr  prims
device_putr   r   r  rr  allr   r   r  r  r'   clonerJ  r  %validate_and_convert_non_fake_tensorsr  r=   r	  nondeterministic_seededr  r  detach__nested_tensor_from_tensor_listr   tree_map_onlyr  r  r  rU  rV  ignore_fresh_unbacked_symbolsinvalidate_written_to_constantsr,  r  r  r  r  r  library_utilsr  MutationCheckerZeroDivisionErrorcheckcheck_aliasing_constraintr}  r  get_fast_op_implsr  r   r  cpp_meta_supports_symint#_unbacked_special_fake_handling_opsr   r   	decomposer   rp  r  stride_incorrect_opr  r  r  _custom_ops_profiledatageneric_fake_kernelhas_fake_kernel"inferred_fake_kernel_from_real_outr   r  simple_registry	singletonfind	fake_implkernelFakeImplCtxset_ctx_getterr   op_implementations_checkshas_metark  r  rn  r  +wrap_meta_outputs_with_default_device_logic)8rX   rs   r  r  r  r  has_unrecognized_typesr   r  r   flat_arg_fake_tensorsis_lift_funcavoiding_device_init!device_conversion_skip_const_propri  const_flat_args
const_argsconst_kwargsr   all_constantflat_outflat_out_tensorsr  #maybe_ignore_fresh_unbacked_symbolsr  real_flat_argsr  mutation_checkerr  r  	fast_implr  r   r  profilesrH  maybe_fake_implr  run_impl_checkop_implop_impl_outr  fallbacknot_implemented_errorr  r  r  r  r  r  r  r  r  r  r  r  s8   `` ``                                       @@@@@@@@@@@@rM   r  FakeTensorMode._dispatch_impl	  sp    	J%22D&>B	9 "5Y!?!!*"!*A.Ea.HQ  "  %%>@R "!,5 MIq9I9I!9LI 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1&)5M7LMMM$fJK  CLBKQd..q11

q8)   (.'<'<_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3		11B 		&&dii744<<CWCW;W)*a/&(D@@HHH CLBKQd..q11

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

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

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

)FF 	 nn..::4F^^--<<[I4,d=f=F7? LP4II8 (A#NGd##%dDB4B6Bn47DD (A *.	P&	P	P 	P" ~~02H/99
	-d3$)&) 4 ,<<46::h+? = 
 	
U" !Nb #]j   N< =<d J %  		O 	X T
 " H LP4IIII $  // +)44T::2?dHUF%-% 8??G'r 43" 	D,-BCC 	MMFM	sL  m,m,m1.m1*.m6-m;.n	nn$n$9on)	o1oo "p?#p2p/;Aq/ qq%	q.	q/ )s; 4	s)=s; ;
n

n!)
n7	3o
o
p&pp
p
p,/
p>
q	qq/ 
q,'q/ ,q/ /
s&9A s!s&s!!s&)
s83s; 8s; ;
t7tt7%t7
debugprimsr	  r  xlavision	torchtext
torchaudio	quantizedc                    U R                   (       d  gUR                  U R                  ;   =(       d    UR                  5       S:H  $ )NFzfbgemm::gmm)r  	namespace+_can_run_unsafe_fallback_allowed_namespacesrp  rX   rs   s     rM   r  &FakeTensorMode.can_run_unsafe_fallback  s:    **
 NNdNNN ,yy{m+	
rO   c                l   ^ ^^^^^ / mSUUUUUU 4S jjnT Vs/ s H
  oe" U5      PM     nnUT4$ s  snf )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                  > [        U [        5      (       d  U $ T
R                  U 5      (       Gd  [        T	S5      (       aX  [        R
                  R                  T	R                  ;   a0  [        R                  TT5      u  p[        S[        T	X5       35      e[        R                  c  T
R                  O[        R                  nU(       do  [        U [        5      (       a*  U R                   T
La  [        SU R                    ST
 35      e[        R                  TT5      u  p[        S[        T	X5       35      eTR#                  T
U 5      nOU nTR%                  U5        U$ )Nr  zECan't call metadata mutating ops on non-Fake Tensor inputs. Found in z"Mixing fake modes NYI x.fake_mode=z	 vs self=zuPlease convert all Tensors to FakeTensors first or instantiate FakeTensorMode with 'allow_non_fake_inputs'. Found in )r   r   r  r  rI   r	  r  r  r   r  r   r    r  r   r  r   r   rJ  r   )r   r  r  r  r   r  r  r.  r  rs   rX   s        rM   validateFFakeTensorMode.validate_and_convert_non_fake_tensors.<locals>.validate  sW   a(( ##A&&4((UYY-C-Ctyy-P#)#8#8I#NLD(_`klprv`  `A  B 
 'EEM ..(GG &
 -!!Z00Q[[5L,@YW[V\]  $*#8#8I#NLD(BBMdTXBaAbd 
  00q9!((-JrO   )r   rB   ra   T | FakeTensorr_   )	rX   rs   r  r  r  rQ  ri  validated_argsr.  s	   `````   @rM   r  4FakeTensorMode.validate_and_convert_non_fake_tensors  sA     35 	  	D 099y!(1+y9444 :s   1c                b   ^ ^^^^^^ T R                   mS mSmSUUUUUUU 4S jjn[        XQ5      $ )NFc                  >^  [        T [        5      (       d  T $ Tc  [        R                  TT5      u  mmTR	                  T 5      nU(       a9  [
        R                  " T R                  T:H  UU 4S j5        [        [        T 5      $ Tb5  T(       a  TR                  TT 5      $ TR                  TT T=(       d    T5      $ T $ )Nc                 (   > STR                    ST  3$ )Nz-FakeTensor is wrapped to wrong device, found z, expected rZ  )r  r  s   rM   r  ZFakeTensorMode.wrap_meta_outputs_with_default_device_logic.<locals>.wrap.<locals>.<lambda>  s    KAHH:U`an`oprO   )r   r   r   r  r  rI   _checkr  r   rB   rJ  rP  )	r  r  r  r  r  r  rs   r  rX   s	   ` rM   wrapHFakeTensorMode.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   ra   rS  )r  r-   )	rX   r  rs   r  r  r[  r  r  r  s	   ` ``` @@@rM   r,  :FakeTensorMode.wrap_meta_outputs_with_default_device_logic  s5     ..	 !& 	  	D   rO   r  c                  SS K nSSKJn  Uc=  U R                  nU R                  (       d  [        S5      eU =R                  S-  sl        UR                  " U" US5      5      nUR                  R                  R                  S5      nU R                  c  [        S5      eU R                  R                  U R                  R                  UUS9UUS9nU$ )	Nr   )NestedIntNodez4should only be called while FakeTensorMode is activer2   intermediate_offsets_or_lengthszself.shape_env must not be None)valr  )symr'  r  )r  !torch.nested._internal.nested_intr`  r  r  r   r   r  r  EphemeralSourcer  rA  create_symbol)rX   r  rI   r`  r'  srcrets          rM   r  )FakeTensorMode.create_symbolic_nested_int  s    
 	4C44L##$J  %%*%||M,:;mm""223TU>>! !BCCnn..,, -   / 
 
rO   c                p    [         R                  R                  UR                  ;   a  gXR                  ;   $ r   )rI   r	  	view_copyr  _cpp_meta_supports_symintrM  s     rM   r  'FakeTensorMode.cpp_meta_supports_symint9  s*    99$))+5555rO   c                    UR                  5       [        :*  =(       aM    [        U5      (       + =(       a6    U R                  U5      (       + =(       a    UR                  R
                  S:g  $ r  )numelCONSTANT_NUMEL_LIMITr   r  r  r   r  s     rM   r  FakeTensorMode.may_turn_const@  sS    GGI-- (!!$$($$Q''( '		
rO   c                   [        S U 5       5      n[        U5      nU(       a  UR                  5       (       a  [        UUUSS9u  pxUR	                  5        H  u  pU	S:w  d  UR                  U	5      (       a  U	OSn	U R                  U
5      (       d  M=  UR                  U	5      (       d  MU  U
R                  c  Md  U R                  R                  U
R                  5        M     g g g )Nc              3  <   #    U  H  oR                   S Lv   M     g 7fr   r  r  s     rM   r   AFakeTensorMode.invalidate_written_to_constants.<locals>.<genexpr>O  r  r  Tr  inputrX   )
r  r   
is_mutabler"   r   has_argumentr  r   r  r  )rX   rs   r.  r  r  any_constantschema_infor   r  kr   s              rM   r  .FakeTensorMode.invalidate_written_to_constantsH  s     Q;PQQ%d+K2244.-1	MA #((*w,+*B*B1*E*EAF$$Q''#..q11

...JJ1::V + 5<rO   )r  r  r  r  c          	         U R                   nUc  U R                  nU(       a  Ub  [        S5      eS nU R                  R	                  U UUUUUS9$ )Nz2cannot set both static_shapes and symbolic_context)r  r  r  r  )r  r  r   r  rJ  )rX   r  r  r  r  r  r  s          rM   r  FakeTensorMode.from_tensora  sn     &*^^	  ..M+$H  I))::- ; 
 	
rO   )r  r*  r  r  r  r  r  r  r  r   r  r  rd  r  r  r  r  r  )r  r   r  r   r  rS  r  r   r   r   ra   rb   r`   )r   r  ra   zTypeGuard[FakeTensor])ra   r   )ra   rk   r%  )ra   r   )r  ztype[BaseException] | Noner  zBaseException | Noner  zTracebackType | Nonera   rb   )ra   r|  )
rI  r3   rs   r=   r  r'  r  r(  ra   rV  )rs   r=   r  r'  r  r(  ra   rb   )
rH  rN  r  z:Mapping[str, object] | Sequence[object] | Iterable[object]rI  r3   rK  rN  ra   rb   )rI  r3   r   rV  rs   r=   r  r'  r  r(  r  rR  ra   rb   )rI  r3   r   rV  rs   r=   r  r'  r  r(  r  r   ra   rl  )rI  r3   r   rV  rs   r=   r  r'  r  r(  r  rR  ra   rr  )rI  r3   r  rl  r   rV  rs   r=   r  r'  ra   rR  )rI  r3   r  rr  r   rV  rs   r=   r  r'  ra   1FakeTensor | None | tuple[FakeTensor | None, ...])r  r~  rs   r=   r  r&  r  r'  r  r(  ra   rb   )
rs   r=   r  r*   r   r  r  r  ra   ztuple[object | None, bool])rs   r=   r  r  r  r  r  r  r  r  ra   zobject | None)
rs   r=   r  r&  r  r'  r  r(  ra   rR  rs   r=   ra   r   )
rs   r=   r  r   r  r'  r  r/   ra   z%tuple[list[object], list[FakeTensor]])
r  r  rs   r=   r  r'  r  rV  ra   r,   )r  r<  ra   r%   r  )
rs   r=   r.  zSequence[FakeTensor]r  r'  r  r(  ra   rb   )r  r   r  r   r  rT  r  rU  r  r   ra   r   )Prc   rd   re   rf   r  rn   r  r  r   rX  r  r  rd  r  r  rY   r  r  rX  r  r  r0   r!   r  r  r  r-  r  r  r  r  r  r  rE  r)  r@  r  r`  r  r  r  r  r  r  r   rL  r  r  r,  r  r  r_  r5  rX  r  as_strided_scatter
as_stridedas_strided_r`  detachview_as_realview_as_complexr[  source_Storage_storage_offset(_sparse_coo_tensor_with_dims_and_tensorsrl  viewr  slicer   r  r  
lift_freshlift_fresh_copyr  r  r  r  rg   r.  r/  s   @rM   r   r     s   :<E7<JL#%0%5NN5 E3N!&$& !##"&((
 (,&+%)%) ![D !%[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                4   SSK JnJn  [        R                  R
                  R                  R                  5       SLnU(       a  U" U5       H  n[        S5      e   gU" U5       H0  nUR                   H  nXpR                  ;  d  M  [        S5      e   M2     g)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  rz  r  r  )rI  r  r  r  r  r   r  rI  s           rM   r'  r'    s    Z U&&33BBDDPJ  'A&'GHH (  'A..!4!44./OPP ) (rO   c                >  ^ ^^^ [         R                  R                  UR                  ;   a  Te0 m[	        5          SU U4S jjnU Vs/ s H
  oe" U5      PM     nn[
        R                  X#5      u  pxU" U0 UD6n	S S S 5        [        5       mU HU  n
[        U
[        5      (       d  M  [        U
5      (       a  M,  TR                  U
R                  5       R                  5        MW     SU UUU4S jjn[
        R                  UW	5      $ s  snf ! , (       d  f       N= f)Nc                   > TR                  U 5      (       a^  [        R                  " X R                  S9nU R                  (       a  UR                  U R                  5       5        U T[        U5      '   U$ U $ )NrZ  )r  rI   
zeros_liker  r   _coalesced_r;  r  )r  r   r   	inp_implss     rM   to_real_tensor+run_fallback_kernel.<locals>.to_real_tensor  sZ    $$Q''&&q?;;OOANN$45%&	"S'"
HrO   c                L  > [        U 5      T;  aE  [        U [        5      (       a0  [        U 5      (       d   U R	                  5       R
                  T;   a  Te[        U [        5      (       a9  [        U 5      T;   a  T[        U 5         $ TR                  R                  TU 5      $ U $ r   )r  r   r   r   r   _cdatar  rJ  )r  r   r  orig_not_implemented_exceptionstoragess    rM   map_out$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   ra   z
T | Tensorr]  )rI   r	  r  r  r'   r   r  r  r   r   r   r  r   r  r-   )r   rs   r  r  r  r  ri  r  r  r  r  r  r  r  s   `   `       @@rM   r   r     s     yy*,, I 
	 	 1::	1^A&		:,,YB$!&! 
  &)UHa   ##Q--/667    ??7A&&C ; 
s   D	D	!D	D
Dc                ,    UR                  5         X U'   g r   )rf  r  r   r  s      rM   r  r    s    
 #JrO   c                    X U'   g r   r_   r  s      rM   r  r    s    
 #JrO   c                  B    \ rS rSrSS jr  S         SS jjrSrg)	FakeCopyModei  c                    Xl         g r   r   )rX   r   s     rM   rY   FakeCopyMode.__init__  s    "rO   Nc                0   U(       a  UO0 nU[         R                  R                  R                  L aV  [	        US   [
        5      (       d  [        S[        US   5       35      eU" U R                  R                  US   SS940 UD6$ U[
        R                  L a  [        U5      S:w  d  [        U5      S:w  a$  [        S[        U5       S[        U5       S35      e[        [
        US   5      n[        [        [        [        4   US	   5      n[!        U5      U;   a  U[!        U5         $ U R                  R                  USS9nXv[!        U5      '   U$ [         R                  R#                  5          U" U0 UD6sS S S 5        $ ! , (       d  f       g = f)
Nr   rg  T)r     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   rX  r   r  DisableTorchFunctionSubclass)rX   rs   r  r  r  r  memor   s           rM   __torch_function__FakeCopyMode.__torch_function__  so    "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"FJ668T,V, 988s   5F
Fr  )r   r   ra   rb   )r_   N)
rs   r=   r  r&  r  r'  r  zMapping[str, object] | Nonera   r   )rc   rd   re   rf   rY   r  rg   r_   rO   rM   r  r    sI    # "$.2 - -  - 	 -
 , - 
 -  -rO   r  c                    [        U 5      S:w  d  [        U S   [        5      (       d  [        S5      eU S   R                  R
                  (       a  [        R                  " S5      $ U S   R                  $ )Nr2   r   z<Expected exactly one FakeTensor argument for _device_handlerrM  )	r  r   r   r   r   rd  rI   r  r  r  s    rM   _device_handlerr  9  sc     4yA~ZQ<<J
 	
 Aw--||F##Aw"""rO   c                &    [        S U  5       5      $ )Nc              3  8   #    U  H  n[        U5      v   M     g 7fr   )r  )r   r   s     rM   r   &_check_for_subclass.<locals>.<genexpr>U  s     =9a&q))9r  )r  )r  s    rM   r  r  T  s    =9===rO   c                    [        U [        5      (       + =(       aT    [        U [        5      =(       a=    [        U 5      [        L=(       a%    [        U 5      [        R
                  R                  L$ r   )r   r   r   r   rI   r/  r0  r   s    rM   r  r  X  sQ    q*%% 	.q&!	.G6!	. G588---	rO   c                d    [        S [        [        U S   5      R                  5        5       5      $ )Nc              3  8   #    U  H  n[        U5      v   M     g 7fr   rX  r   r  s     rM   r   <lambda>.<locals>.<genexpr>c  s      441A4r  r   )rB  r   r   r  r  s    rM   r  r  c  s*    e 4VT!W-2244 /rO   c                d    [        S [        [        U S   5      R                  5        5       5      $ )Nc              3  8   #    U  H  n[        U5      v   M     g 7fr   r  r  s     rM   r   r  f  s      661A6r  r   )rB  r   r   r4  r  s    rM   r  r  f  s*     6VT!W-4466 1rO   c                V    [        [        [        U S   5      R                  5       5      $ r  )rX  r   r   r7  r  s    rM   r  r  i  s     VT!W,,.9rO   )_device_not_kwarg_ops_is_tensor_constructor_like_tensor_constructorscontains_tensor_typesr  r+  r*  r  c                l    U [         R                  ;   a   [         R                  R                  U 5        g g r   )r   r  r   r  s    rM   r  r    s)    
n"""  % #rO   c                    [         R                  S5        [         R                  S[        R                  5        [         R                  S[        R                  5        [        R
                  n U (       ah  [         R                  S5        [        S U  5       5      n[        U R                  5       S S9 H#  u  p#[         R                  SUS	-   U S
3U5        M%     g g )NzFakeTensor cache stats:z  cache_hits: %sz  cache_misses: %sz  cache_bypasses:c              3  8   #    U  H  n[        U5      v   M     g 7fr   )r  )r   rz  s     rM   r   #dump_cache_stats.<locals>.<genexpr>  s     -HqCFFHr  c                    U S   * $ rT   r_   )r:  s    rM   r  "dump_cache_stats.<locals>.<lambda>  s
    AaD5rO   r  z    %-*s %sr2   r  )	r  infor   r  r  r  maxsortedr   )r  widthrz  r   s       rM   dump_cache_statsr    s    HH&'HH!:!:;HH!>#>#>?,,H$%-H--8>>+ADAHH]EAI!Aw: B rO   c           	     0  ^ SU4S jjnUR                  5       S:w  a  U" SUR                  5        35        [        UR                  5       5       Vs/ s H6  n[        R                  R
                  R                  U R                  5      PM8     nnS/UR                  5       -  n[        UR                  5       5       VVs/ s H  u  pxX4PM
     n	nnU	R                  S S9  Sn
U
nU	 HM  u  pX:w  a'  U" SUR                   S	UR                  5        S
35        XU'   XR                  U   -  n
XU   -  nMO     U    [        R                  " UUUR                  UR                  UR                  S9sS S S 5        $ s  snf s  snnf ! , (       d  f       g = f)Nc                <   > [        STR                   SU  S35      e)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  r}  )rl   r  s    rM   unsupported1_infer_fake_from_real_tensor.<locals>.unsupported  s1    **,((9VH EKL
 	
rO   r   z'a return has a non-zero storage offset rm  c                    U S   U S   * 4$ r   r_   r  s    rM   r  ._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  r4  r   )rl   rk   ra   rb   )r7  r6  r3  rI   r  r&  allocate_sizer  r7  r4  sortr3  rX  r  r4  r   )r   r  r  r  r   
fake_shapefake_stridesr9  r  r  expectedfake_strides    `          rM   r  r    s{   
  A%5h6M6M6O5PQ	
 x||~&&A 	  ..t~~>&   4(,,.(L&/0A&BC&BFCx&BGCLL,L-HK=:8>>:J)T\TcTcTeSffgh (SnnS11!sO3  
""??..??
 
5 D 
s   =E<F<6F
Fc                *   U R                   c  [        S5      e[        R                  U5      u  p4[	        S U 5       5      (       d  [        SUR                   35      eU Vs/ s H  n[        XU5      PM     nn[        R                  Xd5      $ s  snf )Nzmode.shape_env must not be Nonec              3  V   #    U  H  n[        U[        R                  5      v   M!     g 7fr   )r   rI   r   r  s     rM   r   5inferred_fake_kernel_from_real_out.<locals>.<genexpr>  s     BMqz!U\\**Ms   ')zPpropagate_real_tensors: we don't support operators that return non-Tensors. Got )	r  r   r   r  r  r  r   r  r  )r   r  r  real_flat_outspecr   fake_flat_outs          rM   r"  r"    s     ~~>??
 !--h7MBMBBB  "

|-
 	

 IVV11$A>MV  55 Ws   #B)rL   rk   ra   r   )r   rB   ra   zdict[T, Literal[True]])ra   z/Generator[TorchDispatchMode | None, None, None])r   r   ra   zGenerator[None, None, None])r   r   r   (list[Tensor | int | SymInt | OpaqueBase]ra   r  )r   r  ra   zTypeGuard[Tensor])r   r  ra   zFakeTensorMode | None)rs   r=   ra   ztorch._C._SchemaInfor  )r   ztype[T]r   r,   ra   zlist[T])r   r  ra   r   r#  )r   r   ra   r2  )rI  r3   r  r   ra   rb   )r   r   rs   r=   r  r'  r  r,   r  r  ra   r   )r  r  r   rV  r  _DispatchCacheEntryra   rb   )r  r'  ra   rV  )r  r'  ra   r   )r   r  ra   r   )r   rV  ra   rb   r`   )r   r   r  torch._ops.OpOverloadr  torch.Tensorra   r  )r   r   r  r  r  r   ra   r   )
__future__r   atexitrU  r@  r  rt  r;  rx  	threadingr  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?   	getLoggerrc   r  _logginggetArtifactLoggerr  r  
ValueErrorr  rk   rC  DimList_pytreer   rB   r  r  r  rp  rV   r  rN   rQ   r  ri   rq   rv   ry   r|   r   localr   r  r   contextmanagerr   r   r   r   r   r   r   r   r   r   ra  rk  rr  rt  r|  r   r6  r2  rT  rV  ri  rl  rr  rv  r  rn  rz  r|  r   r  _StoragePointerr'  r   r  r  r  r  r  r  r  r  r  r  r4  r7  r  r;  r=  r>  profiler_record_function_exit_RecordFunctionrv  torch._subclasses.fake_implsr  r  r  r  r  r+  r*  r  r  registerr  r  r"  r_   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!		)	)(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%//;M0MN	s   (W2 2X&8!X!X!!X&