
    ȅi                   (   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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K0J1r1J2r2J3r3J4r4J5r5  S SK6J7r7  S SK8J9r9  S SK:J;r;  S SK<J=r=  S SK>J?r?  S SK@JArAJBrB  S SKCJDrD  S SKEJFrFJGrG  S SKHJIrIJJrJJKrKJLrLJMrMJNrN  S SKOJPrP  S SKQJRrR  SSKSJTrTJUrUJVrV  \(       a(  S SKWJXrXJYrYJZrZJ[r[J\r\  S SKJ]r]  S SK^J_r_  S SK`Jara  S S KbJcrcJdrd  \R                  " \f5      rg\R                  R                  \fS!5      rj \R                  R                  \fS"5      rk\orp\R>                  R                  rr\" S%5      rs\R                  R                  R                  rvSrwS qx " S& S'5      ry\ " S( S)\z5      5       r{\ " S* S+\z5      5       r|\ " S, S-\z5      5       r}\ " S. S/\z5      5       r~\ " S0 S1\z5      5       r\ " S2 S3\z5      5       r " S4 S5\	GR                  5      r\" 5       rStS6 jr\GR
                  SuS7 j5       r\GR
                  SvS9 j5       r      SwS: jrSxS; jrSyS< jr\GR                  SzS= j5       r\GR                  S{S> j5       rS|S? jrS}S@ jr " SA SB5      r\GR                  S~SC j5       r\GR
                      SvSD j5       rS{SE jr " SF SG5      r " SH SI5      r " SJ SK\$5      r\\ASLSM4   r\" SNSO9 " SP SQ5      5       rSSR jr\" SNSO9 " SS ST5      5       r " SU SV5      r\" SNSNSW9 " SX SY5      5       r\" SNSNSW9 " SZ S[5      5       r\" SNSNSW9 " S\ S]5      5       r\(       a  \\\4   r\" SNSNSW9 " S^ S_\5      5       r\" SNSNSW9 " S` Sa5      5       r " Sb S8\G5      r\r      SSc jr            SSd jr        SSe jr        SSf jr " Sg Sh\?5      rSSi jrSSj jrSSk jr\R                  GR\                  GR^                  GR`                  \\R                  R                  GRb                  GR`                  Sl \R                  R                  GRd                  GR`                  Sm \R                  R                  GRf                  GR`                  Sn 0r\" \R                  R                  GRj                  GR`                  \R                  R                  GRl                  GR`                  \R                  R                  GRn                  GR`                  \R                  GRp                  GRr                  GRt                  5      rS SoKJrJrJrJrJrJrJrJr  SSp jr\GR                  SSq j5       r        SSr jr        SSs jrg! \l a.  rmS#\n" \m5      ;   a  \R                  " \fS$-   5      rk SrmCmGN\meSrmCmff = f)    )annotationsN)defaultdict)	dataclass)AnycastLiteralOptionalTYPE_CHECKING	TypeGuardTypeVarUnion)Self)ReferenceType)SymBoolSymFloatSymIntTensor)is_functorch_wrapped_tensoris_legacy_batchedtensor)FakeScriptObject)MissingOpProfile)dtrace_structured)suggest_memory_format)	assert_eqassert_metadata_eqis_sparse_anyis_sparse_compressedMetaConverter)render_call)immutable_dict)normalize_function)StorageWeakRef)TorchFunctionMode)IntLikeTypepy_sym_types)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                  (    \ rS rSrSS jrSS jrSrg)IncrementRecursionCounte   c                    [         S-  q g Nr1   RECURSION_COUNTselfs    W/home/james-whalen/.local/lib/python3.13/site-packages/torch/_subclasses/fake_tensor.py__init__ IncrementRecursionCount.__init__f       1    c                    [         S-  q g rF   rG   rI   s    rK   __del__IncrementRecursionCount.__del__j   rN   rO    NreturnNone)__name__
__module____qualname____firstlineno__rL   rQ   __static_attributes__rS   rO   rK   rC   rC   e   s    rO   rC   c                       \ rS rSr% S\S'   Srg)UnsupportedFakeTensorExceptiono   strreasonrS   NrW   rX   rY   rZ   __annotations__r[   rS   rO   rK   r]   r]   o       KrO   r]   c                       \ rS rSr% S\S'   Srg)DynamicOutputShapeExceptiont   r<   funcrS   Nra   rS   rO   rK   re   re   t       
rO   re   c                       \ rS rSr% S\S'   Srg)DataDependentOutputExceptiony   r<   rg   rS   Nra   rS   rO   rK   rj   rj   y   rh   rO   rj   c                       \ rS rSr% S\S'   Srg)UnsupportedOperatorException~   r<   rg   rS   Nra   rS   rO   rK   rm   rm   ~   rh   rO   rm   c                       \ rS rSr% S\S'   Srg)$UnsupportedMutationAliasingException   r_   r`   rS   Nra   rS   rO   rK   rp   rp      rc   rO   rp   c                       \ rS rSr% S\S'   Srg)MetadataMismatchError   r_   r`   rS   Nra   rS   rO   rK   rs   rs      rc   rO   rs   c                  4    \ rS rSr% S\S'   S\S'   S	S jrSrg)
FakeTensorTLS   z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)rx   weakrefWeakSetry   rI   s    rK   rL   FakeTensorTLS.__init__   s    .2+5<__5F2rO   )rx   ry   NrT   )rW   rX   rY   rZ   rb   rL   r[   rS   rO   rK   rv   rv      s     %0/+FFGrO   rv   c                 .    [         R                  U S5      $ NT)dictfromkeys)itemss    rK   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{   )torch_C_unset_dispatch_mode_TorchDispatchModeKeyFAKE_set_dispatch_mode)olds    rK   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     rK   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     rK   	<genexpr>$get_plain_tensors.<locals>.<genexpr>   s     G2F3GD#&&2Fs   )popr'   append__tensor_flatten__extendreversed)subclassouttodo
inner_keys_r   s        @rK   get_plain_tensorsr      si     :D
xxz,T22JJt//1
G(:2FGG $ JrO   c                8   SSK Jn  [        U [        5      (       a  g[	        U 5      (       ai  [        U 5      R                  U 5      u  p#U Vs/ s H  n[        X5      PM     nn[        S U 5       5      n[        S U 5       5      nXg:X  d   S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s  snf )Nr   FunctionalTensorTc              3  8   #    U  H  n[        U5      v   M     g 7fr{   is_faker   xs     rK   r   is_fake.<locals>.<genexpr>        =+<awqzz+<   c              3  8   #    U  H  n[        U5      v   M     g 7fr{   r   r   s     rK   r   r      r   r   z got mixed fake and real tensors!F)#torch._subclasses.functional_tensorr   
isinstance
FakeTensorr'   typer   r   allanyr   elemr   r   _is_functional_tensorr   $_functionalization_reapply_views_tls
_functorch_unwrap_functional_tensorr   get_unwrapped)
r   r   attrsr   attrflattened_tensorsall_fakeany_fakereapply_views	unwrappeds
             rK   r   r      s<   D!Z  $Q''7--a0:?@%$WQ-%@=+<===+<==#G%GG#	A	(	(qvv	Av		5#>#>q#A#AEEGHH''AA!S	y!!	Av		#>q#A#AHH''55a8	y!! As   Fc           	     0  ^ SSK Jn  [        U [        5      (       a  U R                  $ [        U 5      (       aY  U R                  5       u  p#U Vs/ s H  n[        [        X5      5      PM     nnUS   m[        U4S jU 5       5      (       d   eT$ [        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 s  snf )Nr   r   c              3  ,   >#    U  H	  nTUL v   M     g 7fr{   rS   )r   r   ms     rK   r   &maybe_get_fake_mode.<locals>.<genexpr>   s     )5a165s   )r   r   r   r   r   r'   r   maybe_get_fake_moder   r   r   r   r   r   r   r   r   r   r   r   )	tr   inner_tensor_namesr   t_namemodesr   r   r   s	           @rK   r   r      s<   D!Z  {{$Q'' ! 4 4 6BT
BT 23BT 	 
 !H)5)))))	A	(	("166**	Av		5#>#>q#A#AEEGHH''AA!S	"9--	Av		#>q#A#AHH''55a8	"9--
s   Fc                T    [         R                  R                  U R                  5      $ r{   )r   r   _SchemaInfo_schemarg   s    rK   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   r   _decompdecompositionsrX   
startswithrW   dir)rg   r   r   s      rK   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       rK   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   layoutr   strided	is_sparse	is_nestedr   r   r   )r   s    rK   _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_memorI   s    rK   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   )rJ   r   r   s      rK   rL   FakeTensorConverter.__init__0  s    +i@ )+%rO   c                2   [        U[        5      (       a  UR                  c   e[        UR                  R	                  5       5      nX R
                  ;  a  / U R
                  U'   U R
                  U   R                  [        R                  " U5      5        g r{   )	r   r   constantr"   _typed_storager   r   r|   ref)rJ   fake_tensorweak_sts      rK   add_constant_storage_mapping0FakeTensorConverter.add_constant_storage_mapping7  s{     +z22{7K7K7WWW !5!5!D!D!FG
 77757D))'2%%g.55gkk+6NOrO   c                   [        U[        5      (       a   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 r{   )r   r   r"   r   r   _fix_weakrefr   )rJ   tensorr   weak_tensor_reftens        rK   invalidate_constant_aliases/FakeTensorConverter.invalidate_constant_aliasesE  s}    fj1111 !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   )rJ   r   tids      rK   	_get_memoFakeTensorConverter._get_memoU  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   )rJ   r   vr
  s       rK   set_tensor_memo#FakeTensorConverter.set_tensor_memo[  s2    !!++99!</0'',rO   NT)sourcesymbolic_contexttracec          	     t  ^^ U(       d  U(       dx  U(       aq  [         R                  R                  R                  5       =n(       aB  X(R                  ;   a3  UR                  U   nSSKJn	  [        Xi5      (       d   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   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R.                  [         R0                  [         R2                  [         R4                  [         R6                  [         R8                  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  [A        5          URC                  5       nS S S 5        [D        RF                  " U5      (       d  [D        RH                  " U5      (       d  [        UU5      (       a  URJ                  nOU" U5      nURM                  UUURN                  US9nUR.                  [         R0                  :X  a  URQ                  UUUS9Ul)        O4UR.                  [         R8                  :X  a  URU                  UUUS9Ul)        U(       a  U RW                  U5        U$ ! , (       d  f       GN
= f)Nr   )StatefulSymbolicContextzquantized nyi in meta tensorsc                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     rK   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Union[torch.device, str]rU   r   ),r   _guardsTracingContexttry_gettensor_to_context%torch.fx.experimental.symbolic_shapesr  r   tensor_sourcer  is_quantizedr]   r   nn	Parameterr   NotImplementedtorch._dynamo.sourcer  r   r   dimr  dtypeint64int32int16int8float64r!  r"  r#  r&   itemmathisnanisinfbasecreate_unspecified_symbolDYNAMICcreate_symintnode	item_memocreate_symfloatnoder   )rJ   r   r   make_constantr  r  r  r  tracing_contextr  
maybe_memor  r   r  valuer!  r"  r#  item_sourcesymbolr   s    `                  @rK   from_real_tensor$FakeTensorConverter.from_real_tensore  s     9"'--">">"F"F"HHH999'6'H'H'K$ &&6PPPP-;;F^^A&
!>>01PQQ7ehh((($$$%14
	-	7O		 	, !!#- " 
 . 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   L((
L7c                    UR                   R                  S:X  d   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  )rJ   r   r   r  rL  rM  rD  r   s           rK   from_meta_and_device(FakeTensorConverter.from_meta_and_device  sw     xx}}& 	
2188==/J	
&
 ^^A&
!&}
 	Q$
rO   )r   r   r   )rU   zRweakref.WeakValueDictionary[torch._subclasses.meta_utils.MetaTensorId, FakeTensor])r   r   r   r   rU   rV   )r   r   rU   rV   )r  r   rU   rV   )r   r   rU   Optional[FakeTensor])r   r   r  r   rU   rV   )FN)r   r   r   r   rB  r   r  Optional[ShapeEnv]r  Optional[Source]r  Optional[SymbolicContext]r  r   rU   r   )NN)r   r   r   r   r  torch.devicerL  zOptional[type[torch.Tensor]]rM  Optional[torch.DispatchKeySet]rU   r   )rW   rX   rY   rZ   propertyr   rb   rL   r   r  r  r  rH  rN  r[   rS   rO   rK   r   r   #  s   /
/ / .-SSL,1% +P3 )1 $(,O $(6:O!O O 	O
 &O !O 4O O 
On 048<!  	
 - 6 
 rO   r   c                   [         R                  R                  5       (       d#  [         R                  R                  5       (       aF  [         R                  R
                  c  [         R                  " SU S9O[         R                  " SU S9  g g )Nr1   r  )r   cudais_availablexpuversionhipemptyzerosrX  s    rK   init_gpu_contextr`    s_     zz  EII$:$:$<$< }}  ( KK&)Qv.	 %=rO   c              #    #    U R                   n[        R                  R                  5       nX!:X  d   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_invocationr   r   _meta_in_tls_dispatch_include_DisableTorchDispatch_PreserveDispatchKeyGuard!_set_meta_in_tls_dispatch_include)r   prev_in_kernelmeta_in_tlss      rK   in_kernel_invocation_managerrj    s     
 33N((88:K(L[MN;K*LL(		'	'	))-	& XX//1HH66t<@1?. 2	 
*	) 2@. 21	 
*	)sN   AC,&C C
#B?'C
.C6	C,?CC


C	C
C)%C,c                    [         R                  R                  U R                  5       R	                  S5      S   R	                  S5      S   5      $ )Nz::.r   )r   r    _should_allow_numbers_as_tensorsnamesplitr   s    rK   should_allow_numbers_as_tensorsrq  0  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)FakeTensorConfigi6  TORCH_FAKE_TENSOR_DEBUG01rS   N)	rW   rX   rY   rZ   osenvironr	  debugr[   rS   rO   rK   rs  rs  6  s    JJNN4c:cAErO   rs  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)SymNumberMemoDescriptoriE  r_   _namer   _is_nested_intFis_nested_intc                   Xl         g r{   )r}  )rJ   r  s     rK   rL    SymNumberMemoDescriptor.__init__O  s    +rO   c                    X l         g r{   r|  )rJ   ownerro  s      rK   __set_name__$SymNumberMemoDescriptor.__set_name__R  s    
rO   c                     SU R                    3$ )Nr   r  rJ   objs     rK   _memoSymNumberMemoDescriptor._memoU  s    4::,rO   c                "    SU R                    S3$ )Nr   _vcr  r  s     rK   _memo_vc SymNumberMemoDescriptor._memo_vcX  s    4::,c""rO   c                "    SU R                    S3$ )Nr   _epochr  r  s     rK   _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   r   r   noder%  r}  r  _versionr  r   epochsetattr)rJ   r  objtypers       rK   __get__SymNumberMemoDescriptor.__get__b  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  )rJ   r  rE  s      rK   __set__SymNumberMemoDescriptor.__set__x  s     =CC$/Cs+T2C))#.5!!##t':':CC%0&&]]3/>C))#.0C0CD	 (;rO   )r}  r|  )r  r   rU   rV   )r  r_   ro  r_   rU   rV   )r  r   rU   r_   r{   )r  r   r  zOptional[type[FakeTensor]]rU   -Optional[Union[torch.SymInt, torch.SymFloat]])r  r   rE  r  rU   rV   )rW   rX   rY   rZ   rb   rL   r  r  r  r  r  r  r[   rS   rO   rK   r{  r{  E  sp    J 05 , #& FJ(B	6,EE&S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(S jj5       rS)U 4S jjr\S*S j5       r\\S\" 5       4         S+S jj5       5       r\      S,S j5       rSS.   S-S  jjrS.S! jrS"r U =r!$ )/r   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.
rT  fake_devicer   r   Optional[Tensor]r   real_tensorz$SymNumberMemoDescriptor | int | Nonenonzero_memounique_memounique_consecutive_memoTr~  Optional[type[Tensor]]rL  rU  rM  c                |    U R                   R                  (       a  [        R                  " S5      $ U R                  $ NrK  )r   rc  r   r  r  rI   s    rK   r  FakeTensor.device  s,     >>..<<''###rO   c                    [         er{   NotImplementedErrorrJ   r   s     rK   r  r        !!rO   c                    [        S5      e)Nz+torch.compile doesn't support named tensors)r]   rI   s    rK   namesFakeTensor.names  s     -9
 	
rO   c                    [         er{   r  r  s     rK   r  r    r  rO   c                .   [         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:X  d   UR                  R                  5       e[        U[        R                  5      (       a  UO[        R                  " U5      nUR                  (       d  UR                  S:w  d   eUR                  S;   a  [        U5        UR                  SSSSS	[        R
                  R                  5       4;   a  UR                  c  UR                  S:w  ay  [        [        UR                  5      R!                  5       (       aL  [        R                  " UR                   S
[        [        UR                  5      R#                  5        35      nO#[        R                  " UR                   S35      nX8l        Xl        XHl        Xhl        Xxl        [        U[.        5      (       a   eXXl        S Ul        S Ul        S Ul        S Ul        S Ul        [<        R>                  (       a  [@        RB                  " 5       Ul"        U$ )NT)dispatch_devicedevice_for_backend_keysrK  )rY  r[  rY  hpur[  mpsmtia:z:0)#r   _make_subclassrequires_grad_allow_unsafe_data_ptr_accessr   r   _set_throw_on_mutable_data_ptr(_set_warn_deprecated_on_mutable_data_ptrr  r   r   
allow_metar`  _get_privateuse1_backend_nameindexr   is_initializedcurrent_devicer  r   r   rL  rM  r   r  r  r@  r  r  nested_int_memors  ry  r0   extract_debug_trace)	clsr   r   r  r   r  rL  rM  rJ   s	            rK   __new__FakeTensor.__new__  s    $$ $*
 66HH33D9HH==dC{{6);4;;+;+;;)%fell;;fAU ##;;&(((;;/)V$ KK668 ${{e#v{{(C(R(R(T(T{{m1WUFKK%@%O%O%Q$RS R&89!" *k:6666& '+$#!! 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{   )superrL   r   compileris_exporting_exportconfig#detect_non_strict_fake_tensor_leaksfake_tensor_tlsry   add)rJ   argskwargs	__class__s      rK   rL   FakeTensor.__init__0  sS    NN''))$$HHAAEEdK I *rO   c                $    UR                  U 5      $ r{   )from_tensor)r   r   s     rK   r  FakeTensor.from_tensor8  s    $$Q''rO   rS   c                   U[         R                  R                  R                  R                  L al  [        U5      S:X  a  [        US   [        5      (       d   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   e[         R(                  R+                  [         R(                  R,                  R.                  5      n
U
(       a  [        R!                  SUU
5        ["        $ UR                  (       a   eU   U" U0 UD6sS S S 5        $ s  snf ! , (       d  f       g = f)Nr1   r   rK  z(FakeTensor unrecognized subclass(es): %sz(FakeTensor mode already active: %s in %s)r   opsprimr  defaultlenr   r   r   rc  r  _DISPATCH_META_HANDLERSr	  
issubclassr   not_implemented_logry  r/  r   arg_tree_leavesr   _get_dispatch_moder   r   )r  rg   typesr  r  handlerr   unrecognized_typesr   argmaybe_cur_fake_modes              rK   __torch_dispatch__FakeTensor.__torch_dispatch__<  s    599>>((000t9>ja*&E&EEEAw  55||F++Aw*** .11$77774=  
!Jq*$=A!6/Au 	 
 %%:<N "!	))4:6:C#z**MM	 ;
 $$$ $hh99HH**//
 %%:#
 "!1111(( YK
J Ys   G,#G,.G,G11
G?c                x  ^ ^^^^^	^
 S mSnS m	[        [        R                  R                  5      m
[        [        R                  R                  5      mSS jmS	U4S jjmS
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   rX  s    rK   check_cpu_device8FakeTensor._find_common_device.<locals>.check_cpu_device  s    ;;%''rO   c                \   > T" U R                   5      =(       a    U R                  5       S:H  $ Nr   )r  r1  )r   r  s    rK   cpu_zero_dim4FakeTensor._find_common_device.<locals>.cpu_zero_dim  s!    #AHH->!%%'Q,>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 [
        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 rb  )r   r   r  r   mapr   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_opsr  common_devicer  rg   is_cpu_zero_dimmixed_device_fnss         rK   merge_devices5FakeTensor._find_common_device.<locals>.merge_devices  s?    a,,$ !".q/ ,Qxx=("&7O << 3 !)O 'M !"3 ''s+mQXX-FGHH "'!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  rT  rU   r   r   r   rU   r   )r   objectrU   rV   )r   aten_foreach_copyr  	nextafterrq  r   r  )rg   	flat_argshas_scalar_only_inputsr  r  r  r  r   r  r  r  s   `    @@@@@@rK   _find_common_deviceFakeTensor._find_common_device  s     !& '&&

 0;NN""0
,	(	?;	 ;	z C#  +400]5J%)"!LL/M(T,MdV*TT(444rO   r1   )coeffc                   U R                   c  U R                  R                  S S9U l         [        U R                   [        R
                  5      (       d   eU R                   U-  $ )Nnt_tensor_id)r  r   create_symbolic_nested_intr   r   r   )rJ   r  s     rK   get_nested_intFakeTensor.get_nested_int  s`    
 '#'>>#L#L! $M $D  $..====##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   r1   )r1  r8  tolist)rJ   r   s     rK   r  FakeTensor.tolist  sb    88:?99;XXZ1_,01DDIIKD11.23ddKKMd33 23s   A9A>)r  r   rM  r  r   r@  r  r  rL  r  r  r  )rU   rT  )r   rT  rU   rV   )rU   	list[str])r   r  rU   rV   )NNNN)r   r   r   r   r  rT  r   r  r  r  rL  r  rM  rU  rU   r   )r  r  r  r  rU   rV   )r   r   r   r   rU   r   
rg   r<   r  Sequence[type]r  Sequence[object]r  Mapping[str, object]rU   r  )rg   r<   r
  r  rU   ztuple[torch.device, bool])r  zUnion[int, torch.SymInt]rU   torch.SymInt)rU   r   )"rW   rX   rY   rZ   __doc__rb   r{  r  r@  r  r  r  r   r   r   r   	_mode_keyrV  r  setterr  staticmethodr  rL   r  classmethodr/   r    r  r  r  r  r[   __classcell__r  s   @rK   r   r     s1    !!
 :Q9RL6R')I8O8QK5Q! A  .DAO
 #"11 ..33I$ $ ]]" "& 
 

 \\" "  &*(,)-8<G!G G 	G
 #G &G 'G 6G 
G GvL ( ( 

 "$'5'7G)G) G) 	G)
 %G) 
G)  G)R f5f5%5f5	"f5 f5V +,
, (
, 
	
,4 4rO   r   r3   r4   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 )"TensorMetadatai	  zC
The Tensor metadata relevant to hashing FakeTensors when caching.
ztorch.dtyper2  ztuple[_MetadataIntLike, ...]shapestriderT  r  ztorch.layoutr   zOptional[torch.memory_format]memory_format_MetadataIntLikestorage_offsetzOptional[_MetadataIntLike]storage_bytesr   r  r,  is_conjis_negr  r   Optional[bool]is_coalescedOptional[int]	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   ro  r   tuplelistr   Size_prep_args_for_hashclearr   convert_sym_intr   )rJ   resultmodestatefieldrE  id_hashed_objectss          rK   _flatten_intoTensorMetadata._flatten_into!  s     !''-ED**-E%%uzz!:;; 35!((Q!'')E6**%%f4e$ .rO   rS   N)r?  list[object]r@  r   rA  r2   rU   rV   )rW   rX   rY   rZ   r  rb   rD  r[   rS   rO   rK   r(  r(  	  s     ''((00$$--MLO  %% % 	%
 
%rO   r(  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.
)r+  NrS   )r   _has_symbolic_sizes_stridesr   is_contiguousr-  r(  r2  r)  r   r   r   r*  r  untyped_storagenbytesr  r,  r/  r0  r  r   r2  r4  r5  )r   r+  r-  s      rK   extract_tensor_metadatarL  7  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   hashrQ  )rJ   tups     rK   rL   _DispatchCacheKey.__init__f  s    crO   c                b    [        U[        5      =(       a    U R                  UR                  :H  $ r{   )r   rN  r   )rJ   others     rK   __eq___DispatchCacheKey.__eq__j  s"    %!23MEII8MMrO   c                    U R                   $ r{   )rQ  rI   s    rK   __hash___DispatchCacheKey.__hash__m  s    ~~rO   c                x    U R                    H*  n[        U[        5      (       d  M  UR                  5         M,     g r{   )r   r   r3   strip_shape_env)rJ   r  s     rK   r^  !_DispatchCacheKey.strip_shape_envp  s+     A!_--!!# rO   )rQ  r   N)rT  rO  rU   rV   )rW  r  rU   r   )rU   rP  rT   )rW   rX   rY   rZ   r  rb   rL   rX  r[  r^  r[   rS   rO   rK   rN  rN  ]  s)     
N#N$rO   rN  c                      \ rS rSrSrg)SingletonConstantiz  rS   N)rW   rX   rY   rZ   r[   rS   rO   rK   ra  ra  z  s    rO   ra  )frozenr&  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)
r3  inplace_idxzOptional[TensorMetadata]metadataview_idxzOptional[Any]constant_valuerS   N)	rW   rX   rY   rZ   r  rb   ra  rh  r[   rS   rO   rK   rd  rd  ~  s%    	 &&$5NM5rO   rd  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_tuplerS   N)rW   rX   rY   rZ   r  rb   rl  r[   rS   rO   rK   rj  rj    s     76!OT!rO   rj  c                  $    \ rS rSr% SrS\S'   Srg)_DispatchCacheBypassEntryi  z(
Entry type for a negative cache entry.
r_   r`   rS   NrW   rX   rY   rZ   r  rb   r[   rS   rO   rK   rn  rn         KrO   rn  c                  $    \ rS rSr% SrS\S'   Srg)_BypassDispatchCachei  z4
Signals cases that should skip FakeTensor caching.
r_   r`   rS   Nro  rS   rO   rK   rr  rr    rp  rO   rr  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.
rP  hitsmissesdict[str, int]bypassessizerS   Nro  rS   rO   rK   rt  rt    s     IK
IrO   rt  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   rP  
cache_hitscache_missesrw  cache_bypassesr  Fr   rc  static_shapesrQ  r  zOptional[str]_stackr  rl  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),logry  idr  rL   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  rc  enter_stackr  	tracebackextract_stack_stack_tracer  r   r   r   r   $torch.nested._internal.nested_tensornested	_internalnested_tensor_tensor_id_counterr  r  )rJ   r  r  r  r  r   r   r  s          rK   rL   FakeTensorMode.__init__  s   $ 			$bh/&<##& ##FF 	# &911&
"
 $!.!*d!2D %*! ##LL 	*  **11HHMM  :: 0/// 	
 MM  EE 	% &;" %*!  	 #%335 77<<3 LL""00CC 	' %)$C$C!rO   c                &    U R                   U l        g r{   )r  r  rI   s    rK   reset_nt_tensor_id_counter)FakeTensorMode.reset_nt_tensor_id_counterA  s    $($C$C!rO   c                L    [        U[        5      =(       a    UR                  U L $ r{   )r   r   r   rJ   r   s     rK   is_our_fakeFakeTensorMode.is_our_fakeP  s    !Z(@Q[[D-@@rO   c                   [         R                  R                  5       (       aH  [         R                  R                  5       (       a   e[         R                  R	                  5       (       + $ [         R                  R	                  5       =(       d5    [        [         S5      =(       a    [         R                  R	                  5       (       + $ )Nr  )r   r[  _is_compiledrY  rZ  hasattrr  rI   s    rK   avoid_device_init FakeTensorMode.avoid_device_initX  s    99!!##zz..0000yy--/// JJ##% Du%B%))*@*@*B
 	
rO   c                    U R                   c4  SR                  [        R                  " U R                  5      5      U l         U R                   $ )N )r  joinr  format_listr  rI   s    rK   stackFakeTensorMode.stackc  s7    ;;'')"7"78I8I"JKDK{{rO   rS   c                   [         R                  R                  [         R                  R                  R                  5      b   U5       e U R                  XX45      $ ! [         a    [        R                  S5        e f = f)Nzfake tensor raised TypeError)	r   r   r  r   r   dispatch	TypeErrorr  	exception)rJ   rg   r  r  r  s        rK   r  !FakeTensorMode.__torch_dispatch__i  sn     HH''(F(F(K(KLT		T	==d;; 	MM89	s   A !A>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  r   _only_lift_cpu_tensors_set_only_lift_cpu_tensors_ensureCUDADeviceGuardSetr   r   r  r   r  	__enter__r   )rJ   r   prev_only_lift_cpu_tensorsmaybe_prev_fake_moder  s       rK   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__r   r   r   r  )rJ   exc_typeexc_valexc_tbliver   maybe_prev_only_lift_cpu_tensorsr  s          rK   r  FakeTensorMode.__exit__  st       " 	G%E GX7 $/++,@A/;334TU < rO   c                    gr   rS   r  s    rK   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.
)rt  r   r}  r~  r   r  r  r|  r  s    rK   
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  r=  r|  r  s    rK   cache_clearFakeTensorMode.cache_clear  s3    
   "		rO   c                8   SnSn [        U R                  5      nU R                  XQX45      nUc  U R                  XX45      $ Uc   eUR                  5       (       a,  UR                  c   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[        =R.                  S-  sl        U R0                  (       a)  [3        U 5         U R5                  XX#U5        SSS5        U$ U$ U R                  XX45      n U R7                  XVXXK5      n
U	" XU
5        [        =R8                  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 = %sr1   )r2   r  
_cache_keyrr  r   r   _opsHigherOrderOperatorro  hc_logry  r`   r   r  _dispatch_implcache_on_shape_envfake_tensor_cache_set_cache_key_for_shape_envr|  _set_cache_keyr	  rn  _output_from_cache_entryr}  r  r   _crosscheck_cache_output_make_cache_entryr~  )rJ   rg   r  r  r  rA  r   er|  set_cache_keyentryoutputs               rK   _cached_dispatch_impl$FakeTensorMode._cached_dispatch_impl  s    	9"4>>2E//%t<C ;
 &&tDAA   ##%%??...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(#U $ 	9 4!?!?@@IIK#44LGHH
 ))!((3q833	9Z 54M $ 	
 4!?!?@@IIK#44LGHH
 ))!((3q83%&?&IJM	sC   'F1 I:I! 1
I;BII
I!
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   )r   fxexperimentalproxy_tensorget_proxy_modeget_default_dtyper   _get_default_deviceis_inference_mode_enabledr  settingsknown_symbolsr   r  r<  rN  r9  r|   finalize	functoolspartialevict_fake_tensor_cache_keyr=  )
rJ   rA  rg   r  r  
is_tracing
key_valuesrC  r   id_hashed_objs
             rK   r  FakeTensorMode._cache_key   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   r   r  r  Tagdata_dependent_outputtagsrr  dynamic_output_shaper  r  r   r!   r2  r   r6  inplace_view_unsafe_viewr  lift_fnsro  _libraryutils
is_builtinis_viewr   %_dispatch_has_kernel_for_dispatch_keyDispatchKeyr  )rJ   rg   r  r  r  r   
new_kwargsr  s           rK   _validate_cache_key"FakeTensorMode._validate_cache_keyW  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   r:  r9  r   r   r   r  r<  keysvaluesr   r  rr  r   r   r   rL  rD  r   r   r>  r   r   r  FunctionTyper   r  GraphModuler  rS  subgraphorig_callable)	rJ   r?  r  rA  rC  r  r  r  rf  s	            rK   r<  "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   rP  r   %_validate_symbolic_output_for_cachingr   rr  r   r   r   r  r  )rJ   rA  r   rg   r  r  r  kvals           rK    _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      (       a]  UR                  (       aL  [        U5       V	V
s/ s H  u  p[        U
[        5      (       d  M  U	PM      nn	n
[        U5      S:X  d   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 R1                  TXX45      n[        R4                  R7                  U5      n[        R4                  R7                  U5      nUU:w  a  [3        S5      eU$ s  sn
n	f ! U a    [3        S
5      S ef = f)Nre  rf  rg  rh  )re  rf  rg  r1   r   c              3  F   >#    U  H  nTR                  U5      v   M     g 7fr{   convert_outputr   r  rA  s     rK   r   BFakeTensorMode._get_output_info_for_cache_entry.<locals>.<genexpr>+  s     O1u33A66   !c              3  F   >#    U  H  nTR                  U5      v   M     g 7fr{   r%  r'  s     rK   r   r(  ,  s     QA 4 4Q 7 7r)  Frk  rl  )GuardOnDataDependentSymNodezdata dependent symnodezdispatch_key_set mismatch)r   rP  r   r   r   rd  ranger  r  r  r<   r
  	enumerater   rL  r9  r)  r*  r&  r-  r.  rj  r*  r,  r  rr  r   _dispatch_key_set)rJ   rA  r   rg   r  r  r  idxrg  ir   idxsrf  r  entry_for_synth_outputr,  synth_outputsynth_key_setkey_sets    `                 rK    _get_output_info_for_cache_entry/FakeTensorMode._get_output_info_for_cache_entry  s    fsELL$t*=>>0 4$v 
 T#C$)}6
*4 #dT  $ dEJJ1122t||"+D/K/$!Z65JA/DKt9>!>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a LD + 	K
 ''?@dJ	Ks   	H*(H*H0 0Ic                *  ^ SSK Jn  SSKJm  U R	                  X4U5        [        U[        R                  R                  5      (       aG  X7;   aB  [        U[        5      (       d   e[        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_symbolsc              3     >#    U  H>  n[        U[        R                  [        R                  45      =(       a    T" U5      v   M@     g 7fr{   )r   r   r   r   )r   or:  s     rK   r   3FakeTensorMode._make_cache_entry.<locals>.<genexpr>u  s@         A 1u||U\\:; 1-a01s   AA	zunbacked symbol in HOP z outputNr#  Fr+  T)r  r  r*  r:  r  r   r   r  r  r9  r   rr  rP  r   r   rd  rj  r   r7  )rJ   rA  r   rg   r  r  r  r  non_cacheableoutput_infoout_elementout_elemrk  r:  s                @rK   r   FakeTensorMode._make_cache_entryX  s    	JS  V4 tUZZ;;<</fe,,,,      M
 *-DTF'+RSSfsELL$t*=>>7 4$vK ,)^U  fe$$%55  & 11 fe$$ !'
 !'H 55 !'  
 ,"<0 $  ??K ,)^U 5
s   : Fc                H  ^^^ UR                   c;  UR                  c.  UR                  c!  UR                  [        Ld   eUR                  $ UR                   b'  XRR                      n[        U[        5      (       d   eU$ UR                  nUc  g [        U5      (       a   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R.                  (       a   [$        R0                  R3                  WS5        UR4                  (       a   [$        R0                  R7                  WS5        [        U[$        R8                  R:                  5      (       a  UR<                  (       az  U[?        [@        UR                  5         n[        U[        5      (       d   eURC                  5       n[#        U 5         U" 5          WRE                  XX5        S S S 5        S S S 5        [        U WURF                  5      $ ! , (       d  f       GND= f! , (       d  f       GNN= f! , (       d  f       NQ= f! , (       d  f       NZ= f)Nc                   > [        U [        5      (       a+  UR                  c   eU R                  TUR                  5      $ [        U [        5      (       a   eU $ r{   )r   r4   r  r  r3   )rE  rA  r   s     rK   check_valueGFakeTensorMode._get_output_tensor_from_cache_entry.<locals>.check_value  sP     %!233222}}S%//::%e_====rO   c              3  6   >#    U  H  nT" UT5      v   M     g 7fr{   rS   r   r  rE  rA  s     rK   r   EFakeTensorMode._get_output_tensor_from_cache_entry.<locals>.<genexpr>  s     D^k!U++^   c              3  6   >#    U  H  nT" UT5      v   M     g 7fr{   rS   rH  s     rK   r   rI    s     Fo{1e,,orJ  rK  )r2  r   r  r  T)rE  r,  rA  r2   rU   zUnion[IntLikeType])$re  rf  rg  rh  ra  r   r   r   r9  r)  r*  r-  r.  
contextlibnullcontextr  suppress_guardsrj  r   empty_stridedr2  r   r  r/  r   	_set_conjr0  _set_negr  r<   r
  r   rP  rJ  set_r  )rJ   rA  r  r   rg   r  inplace_argrf  r)  r*  r-  maybe_suppressr^  view_argstoragerE  s    ` `           @rK   #_get_output_tensor_from_cache_entry2FakeTensorMode._get_output_tensor_from_cache_entry  sl    %&&''/@@@@'''(001Kk:6666 >> ****	#	,:		 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33..0G-d3^5E

7EB 6F3 $x77/ 2B1A//( 6F5E33sH   !K0)8K!K0L$L7L
K-	(K00
K?
L	L
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   )rl  rk  rW  r9  )rJ   rA  r  r   rg   r  r?  outputss           rK   r  'FakeTensorMode._output_from_cache_entry  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      (       aN  [        U[        5      (       d   e[        U 5      [        U5      :X  d   e[        X5       H  u  p#T" X#5        M     g [        U [        5      (       a  [        U[        5      (       a  X:X  d   eg U c  Ub   eg [        U [
        5      (       a3  [        U 5      [        U5      L a  U R                  UR                  L d   eg [        U [        R                  5      (       a2  [        U[        R                  5      (       d   e[        [        X5        g [        S[        U 5       35      e)NzUnsupported type )r   r9  r  ziprP  r%   r   r  r   r   r   r   r  )ablr  assert_helpers       rK   rb  >FakeTensorMode._crosscheck_cache_output.<locals>.assert_helper)  s   !U##!!U++++1vQ'''IDA!!' &As##!!S))af44fy yA|,,Aw$q')aff.>>>.>Au||,,!!U\\2222"9a3"%6tAwi#@AArO   z*FakeTensor cache crosscheck failure: func=z, args=z	, kwargs=z: Dispatch raised=N)r_  r   r`  r   rU   rV   )r  	Exceptionr  )	rJ   r  rg   r  r  r  true_outputr  rb  s	           @rK   r  'FakeTensorMode._crosscheck_cache_output  s    	B$	--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  ry  r  getEffectiveLevelloggingDEBUGrH   rC   _DISPATCH_HANDLE_DIRECTLYrj  r   r  r  )rJ   rg   r  r  r  incrs         rK   r  FakeTensorMode.dispatchJ  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                z  > [        U [        [        45      (       a  TR                  c   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 )NT)compute_hintmismatch between fake value  and real value rh  )r   r   r   r  r  exprfree_symbols
var_to_valr  unbacked_var_to_val_maybe_evaluate_staticEqStruers   rP  floatr   )fakerealrJ   sympys     rK   _check_fake_real_vals?FakeTensorMode._maybe_infer_fake.<locals>._check_fake_real_valsw  s-   $ 233~~111		33nn//4467nn88==?@
 ==!HHTYY^^T: >   %ww||,
 4:4&@PQUPVVWX ,@ sE4(  </6tf<LTFRST   rO   Real tensor propagation foundFT)contextsizesstridesr-  r  mismatched_fake_kernelc                 4   > [        T5      T R                  S.$ Nopr`   r_   r`   excrg   s   rK   <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   rK   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.$ )Nrs  rt  r  r_   )r~  rg   r  s   rK   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   rU   rV   )r  torch._subclasses.fake_utilsrp  r   r   r   rs   r   r  *generate_fake_kernels_from_real_mismatchesr   _infer_fake_from_real_tensorr*   r.  r^  ry  )rJ   rg   pathr~  r  rp  r  js_fakes_realr  r  s   `` ``     @@rK   _maybe_infer_fake FakeTensorMode._maybe_infer_fakek  s    	I	 	6 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{   )r:  setr  pending_fresh_unbacked_symbols
difference)pending_unbackedrJ   s   rK   _clear_pending_unbackedXFakeTensorMode._maybe_infer_fake_kernel_from_pytree_out.<locals>._clear_pending_unbacked  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   rK   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   rg   rJ   s    rK   r  r  	  s    :4qIrO   zGReal tensor propagation found an aliasing mismatch between fake output z and real output z,  for func: rT   )r  r  r  r:  r  r   tree_flatten_with_pathtree_flattenrs   r   r   r  r  r   r,   r^  r  r   tree_unflatten)rJ   rg   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   ``               @@rK   (_maybe_infer_fake_kernel_from_pytree_out7FakeTensorMode._maybe_infer_fake_kernel_from_pytree_out  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                (  ^ ^^^^,^-^.^/^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
   T S35       eT0 Vs/ s H'  nT R                  U5      (       a  UR6                  OUPM)     nn[        R9                  UT,5      u  nnT" U0 UD6n[        U5      [.        L aJ  T R;                  U5      (       a4  [=        5          UR?                  5       nS S S 5        T.RA                  T US	S9$ U(       aT  [C        T5      S:X  a  [C        T5      S:X  d   T ST 35       e[        TS   5      [.        L a  T.RA                  T TS   5      $ T RE                  TT.T0T,5      u  m0n
@@[5        S U
 5       5      n[-        T[        RF                  RH                  5      (       Ga  [        RJ                  RL                  TRN                  ;  Gaj  [        RJ                  RP                  TRN                  ;  GaA  U(       Ga9  [C        U
5      S:w  Ga)  T2(       Gd!  U(       Gd  T["        RR                  R&                  La  T0 Vs/ s H'  nT R                  U5      (       a  UR6                  OUPM)     nn[        R9                  UT,5      u  nn[=        5          T" U0 UD6nS S S 5        [        RU                  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   [        RW                  [.        U.U 4S jU5      $ U H  nT.RY                  U5        M     [        R9                  T0T,5      u  mm[-        T[        RF                  RZ                  5      (       aa  TU;   a[  T R\                  c  [^        R`                  OT R\                  Rb                  nT    U" 5          UT   " T0 TD6sS S S 5        sS S S 5        $ T Re                  TU
TT5            S(U 4S jjnSSK3J4m-J5m1  [m        5       m3T3m6T Rn                  (       a  [5        S U
 5       5      (       a  [        U1U U74S jT0 5       5      (       d  [p        R                  ST5        T0 Vs/ s H  nU" U5      PM     nn[        R9                  UT,5      u  m4m5[r        Rt                  " T5      nU(       d  [r        Rv                  " TUT,5      n T" T40 T5D6m6U(       d2  WR{                  5         [r        R|                  " TR~                  T0T65        OQT Rn                  (       a@  [p        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KCJDn  TU;  a  T R                  T5      (       d  T2(       a  TT R                  ;   d  SSKCJGn   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 Rn                  (       ak  T6T3Laf  [r        Rt                  " T5      (       dK  T R\                  b>  [r        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Nb= 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 ! [x         a"  n[p        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 Rn                  (       aU  T6T3LaP  [r        Rt                  " 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    [p        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{   )rH  )r   r1  s     rK   r   0FakeTensorMode._dispatch_impl.<locals>.<genexpr>C	  s      !
3Ha))3Hr   c              3  B   #    U  H  n[        U[        5      v   M     g 7fr{   )r   r   )r   r_  s     rK   r   r  E	  s     :	1Av&&	   Fr  r   TrK  c              3  <   #    U  H  oR                   S Lv   M     g 7fr{   r  r   r   s     rK   r   r  o	  s     M7L!zz-7L   z. should not have fake inputs without constantsrB  r1   rh  c              3  <   #    U  H  oR                   S Lv   M     g 7fr{   r  r   r  s     rK   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   rJ   s     rK   r   r  	  s!     P?O!t22155?Or)  c                &   > TR                  TU SS9$ )NTr  )rH  )r   	converterrJ   s    rK   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   eU R
                  R                  U R
                  R                  R                  TR                  R                  5      R                  TR                  R                  5      5      $ [        U [        5      (       a  U R                  $ U $ r{   )r   r   r  r%   r  r  rL  ru  xreplacerw  rx  r   real_obj)r   rJ   s    rK   maybe_to_real_tensor;FakeTensorMode._dispatch_impl.<locals>.maybe_to_real_tensor	  s     !Z((}}$A|,,~~111vv}}FFKK(()B)BCLL:: 
 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     rK   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  T   >#    U  H  oTR                   R                  ;  v   M     g 7fr{   )r  rx  )r   srJ   s     rK   r   :FakeTensorMode._dispatch_impl.<locals>.<genexpr>.<genexpr>	  s      VQUAT^^%G%GGQUs   %()r   r%   r  r   )r   r_  r  rJ   symss     rK   r   r  	  se       #A q,/ W!6q!99Wd2W VQUVVW
 #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                "  > [        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      (       a@  TR                  c   eTR                  R                  U R                  R                  U5        g [        U R                  R                  =nTR                   5      (       al  [        UR"                  TR                  5      (       aF  UR$                  S:X  a5  TR                  c   eTR                  R                  U['        U5      5        g g g g g g )Nz%maybe_propagate_real_tensors %s -> %sr1   )r   r   r  ry  r  r  r^  ry  r*  r-  r%   r  ru  Symbolr  set_unbacked_var_to_valrz  lhsrhsrP  )r   real_tr  real_sr  gorJ   r  s       rK   r  OFakeTensorMode._dispatch_impl.<locals>.maybe_propagate_real_tensors.<locals>.go+
  sw   a,,II?A6
 %+M%(6;;=%A	1 &B%(V]]_%E	1 &Fq'')6+@+@+BC<005J15M5M!!&&++u||<<#~~999>>qvv{{FS"#31UXX>>&quuell;;EEQJ#~~999>>q#f+N	 ' < ? 6N0rO   T)peek)r   r  r  r   rU   rV   )r  r  ry  r   r   r  r  r  r   r   r   r-   r9  r   r  r  )r  r  r  r  r  r  rg   r  nil	real_argsreal_kwargsr  rJ   s    @@rK   maybe_propagate_real_tensorsCFakeTensorMode._dispatch_impl.<locals>.maybe_propagate_real_tensors&
  s   II7>O O2 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     rK   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   rK   r  r  
  s    c$i)rO   r  c                    > T $ r{   rS   )ctxs   rK   r  r  
  s    SrO   c                    > S[        T 5      0$ r  r  r   s   rK   r  r  
  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{   )r   r  r  can_generate_trivial_fake_implcan_run_unsafe_fallbackrm   run_fallback_kernel)error	args_specr
  rg   has_symbolic_sizesrJ   s    rK   maybe_run_unsafe_fallback@FakeTensorMode._dispatch_impl.<locals>.maybe_run_unsafe_fallback
  sc     ~~##BB4HH!)E)Ed)K)K2488}4T:&tT9iOOrO   z*failed while attempting to run meta for %srX  )r   rA   rU   z1Optional[Union[T, Tensor, torch._C.ScriptObject]])r  rA   rU   rA   r{   )r  zOptional[RuntimeError]rU   rP  )gr  r  r   r  _check_for_subclass_check_for_subclass_argr   r  ry  r/  r  r   r  r  r  r   r  r  _to_copyr  prims
device_putr   r   r  rq  r   r   r  r  r&   clonerH  r  %validate_and_convert_non_fake_tensorsr  r<   r   nondeterministic_seededr  r  _nested_tensor_from_tensor_listr   tree_map_onlyr  r  r  rL  rM  ignore_fresh_unbacked_symbolsinvalidate_written_to_constantsr*  r  r  r  r  r  library_utilsr	  MutationCheckerZeroDivisionErrorcheckcheck_aliasing_constraintr|  rx  get_fast_op_implsr	  r   r  cpp_meta_supports_symint#_unbacked_special_fake_handling_opsr   r   	decomposer   ro  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_metarj  r  rd  r  +wrap_meta_outputs_with_default_device_logic)8rJ   rg   r  r  r  r  has_unrecognized_typesr   r  r   flat_arg_fake_tensorsis_lift_funcavoiding_device_init!device_conversion_skip_const_propr_  const_flat_args
const_argsconst_kwargsr   all_constantflat_outflat_out_tensorsr  #maybe_ignore_fresh_unbacked_symbolsr  real_flat_argsr	  mutation_checkerr  r  	fast_implr  r   r  profilesr?  maybe_fake_implr  run_impl_checkop_implop_impl_outr  fallbacknot_implemented_errorr  r  r  r  r
  r  r  r  r  r  r  r  s8   `` ``                                       @@@@@@@@@@@@rK   r  FakeTensorMode._dispatch_impl%	  sN    	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GM CLBKQd..q11

q8)   (.'<'<_i'X$J
3l3CCyF"t':':3'?'? !]))+C # 11$41PP v;!#D	QJ4&&8JJ6DG}& 11$Q@@ .2-W-W)Y	.
*) & Q;PQQtUZZ2233		11B		&&dii7)*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		>	"	

 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>%6:nn22$G	 G	 G	T )+//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 -1	P)	P!	P 	P" ~~02H/99
	-d3$)&) 4 ,<<46::h+? = 
 	
]" !N` #]X   N< =<X J %  		O 	D T
 " H LP4IIII $  // +)44T::2?dHUF%-% 8??G'n 43" 	D,-BCC 	MMFM	sL  mmm.m&.m)m.m'1	m,m>8m>nn&	nn1.n6 <o%#o7p	Aq	 ,p7/p?	p7	q	 s 	ss 
m$,
m;
n	n
n.6
o" oo"%
o47
p	
p
p)	%p7,q	 7
qq	 q	 	
s A r;3s 9r;;s 
ss s 
ts,&t,%t
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_namespacesro  rJ   rg   s     rK   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(       d_  [        U [        5      (       a  U R                   T
La  [        S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 NYIzuPlease convert all Tensors to FakeTensors first or instantiate FakeTensorMode with 'allow_non_fake_inputs'. Found in )r   r   r  r  r   r   r  r  r   r  AssertionErrorr   r  rx   r  r   r   rH  r   )r   r  r  r  r   r  r  r"  r
  rg   rJ   s        rK   validateFFakeTensorMode.validate_and_convert_non_fake_tensors.<locals>.validate7  s>   a(( ##A&&4((UYY-C-Ctyy-P#)#8#8I#NLD(_`klprv`  `A  B 
 'EEM ..(GG &
 -!!Z00Q[[5L,-DEE#)#8#8I#NLD(BBMdTXBaAbd 
  00q9!((-JrO   )r   rA   rU   Union[T, FakeTensor]rS   )	rJ   rg   r  r
  r  rF  r_  validated_argsr"  s	   `````   @rK   r  4FakeTensorMode.validate_and_convert_non_fake_tensors)  sA     35	 	@ 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 rX  )r   r  s   rK   r  ZFakeTensorMode.wrap_meta_outputs_with_default_device_logic.<locals>.wrap.<locals>.<lambda>x  s    KAHH:U`an`oprO   )r   r   r   r  r  r   _checkr  r   rA   rH  rN  )	r  r  r   r  r  r
  rg   r  rJ   s	   ` rK   wrapHFakeTensorMode.wrap_meta_outputs_with_default_device_logic.<locals>.wrapg  s     a(($ 224C!* **1-KHH-p Aqz!&) %55dA>>$99a!8= 
 rO   r  rA   rU   rH  )r  r,   )	rJ   r  rg   r
  r  rP  r   r  r  s	   ` ``` @@@rK   r   :FakeTensorMode.wrap_meta_outputs_with_default_device_logicZ  s5     ..	 !& 	  	D   rO   r  c                  SS K nSSKJn  Uc9  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   eU R                  R                  U R                  R                  UUS9UUS9nU$ )Nr   )NestedIntNodez1should only called while FakeTensorMode is activer1   intermediate_offsets_or_lengths)valr  )symr%  r  )r  !torch.nested._internal.nested_intrU  r  r  r   r  r  EphemeralSourcer  r?  create_symbol)rJ   r  r   rU  r%  srcrets          rK   r  )FakeTensorMode.create_symbolic_nested_int  s    
 	4C44L##X%XX#%%*%||M,:;mm""223TU~~)))nn..,, -   / 
 
rO   c                p    [         R                  R                  UR                  ;   a  gXR                  ;   $ r   )r   r   	view_copyr  _cpp_meta_supports_symintrA  s     rK   r  'FakeTensorMode.cpp_meta_supports_symint  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     rK   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     rK   r   AFakeTensorMode.invalidate_written_to_constants.<locals>.<genexpr>  r  r  Tr  inputrJ   )
r   r   
is_mutabler!   r   has_argumentr  r   r  r  )rJ   rg   r"  r  r  any_constantschema_infor   r  kr  s              rK   r  .FakeTensorMode.invalidate_written_to_constants  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  rH  )rJ   r  r  r  r  r  r  s          rK   r  FakeTensorMode.from_tensor  sn     )-	  ..M#+ D+ I))::- ; 
 	
rO   )r  r   r  r  r  r  r  r  r  r   r  r  rc  r  r  r  r  r  )r  r   r  r   r  rQ  r  r1  r   r   rU   rV   rT   )r   r  rU   zTypeGuard[FakeTensor])rU   r   )rU   r_   r  )rU   r   )r  ztype[BaseException] | Noner  zBaseException | Noner  zTracebackType | NonerU   rV   )rU   rt  )
rA  r2   rg   r<   r  r  r  r  rU   rN  )rg   r<   r  r  r  r  rU   rV   )
r?  rF  r  z?Union[Mapping[str, object], Sequence[object], Iterable[object]]rA  r2   rC  rF  rU   rV   )rA  r2   r   rN  rg   r<   r  r  r  r  r  rP  rU   rV   )rA  r2   r   rN  rg   r<   r  r  r  r  r  r   rU   rd  )rA  r2   r   rN  rg   r<   r  r  r  r  r  rP  rU   rj  )rA  r2   r  rd  r   rN  rg   r<   r  r  rU   rP  )rA  r2   r  rj  r   rN  rg   r<   r  r  rU   =Union[Optional[FakeTensor], tuple[Optional[FakeTensor], ...]])r  rs  rg   r<   r  r  r  r  r  r  rU   rV   )
rg   r<   r  r)   r~  r  r  r  rU   ztuple[Optional[object], bool])rg   r<   r  r  r  r  r  r  r  r  rU   zOptional[object])
rg   r<   r  r  r  r  r  r  rU   rP  rg   r<   rU   r   )
rg   r<   r  r   r
  r  r  r.   rU   z%tuple[list[object], list[FakeTensor]])
r  r  rg   r<   r
  r  r  rT  rU   r+   )r  r3  rU   r  r  )
rg   r<   r"  zSequence[FakeTensor]r  r  r  r  rU   rV   )r  r   r  r1  r  rR  r  rS  r  r   rU   r   )PrW   rX   rY   rZ   r|  rb   r}  r~  r   rP  r  r  rc  r  r  rL   r  r  rV  r  r  r/   r    r  r  r  r#  r  r  r  r  r  r  r<  r   r7  r  rW  r  r  r  r  r  r  r   r@  r  r  r   r  r  r^  r+  rO  r  as_strided_scatter
as_stridedas_strided_r_  detachview_as_realview_as_complexrR  source_Storage_storage_offset(_sparse_coo_tensor_with_dims_and_tensorsra  viewr  slicer   r  r  
lift_freshlift_fresh_copyr  r  r  r  r[   r$  r%  s   @rK   r   r     s   :<E7<JL#%0%5NN5 E3N!&$&!! !##"&((
 (,&+(,(, !]D !%]D  $	]D
 &]D &]D  !]D" 
#]D ]D~DA 
 
  
  "$'5'7  	
 % 
 $6V,V &V %	V
 
V$   	
 	
  ZZ Z 	Z
 %Z 
Zx55 5 	5
 %5 
5nDDDD DD %	DD
 
DDLE#E# NE# 	E#
 (E# 
E#N(C(C (C 	(C
 (C %(C %(C 
(CTHH H 	H
 H %H H 
'HT^^ ^ 	^
 ^ %^ %^ 
"^@I8I8 -I8 	I8
 I8 I8 
I8V ( 	
   
G2,M, , 	,
 , %, 
,d "$'5'7BB B 	B
 %B 
BBll&-l5;lCIl	&l\J=J= J= 	J=
 J= J= 
J=Xg
g
 g
 	g

 %g
 
g
\ 3>	3/	
/5/5 '/5 $	/5
 /5 
//5b/!/! /! $	/!
 /! 
/!d 04,	4 !,

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

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

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

 !
 4
 
 

 
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  r   r  r  r  r  rr  rv  r  )rA  r  r  r  r  r   r  rG  s           rK   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 $ )NrX  )r  r   
zeros_liker  r   _coalesced_r2  r  )r  r   r   	inp_implss     rK   to_real_tensor+run_fallback_kernel.<locals>.to_real_tensorP  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  rH  )r  r   r  orig_not_implemented_exceptionstoragess    rK   map_out$run_fallback_kernel.<locals>.map_outj  s    a5	!q&!!!!$$  "))X500a  !u	! A'' 66GG	STUUHrO   )r  rA   rU   zUnion[T, Tensor]rR  )r   r   r  r  r&   r   r  r  r   r   r   r  r   r  r,   )r   rg   r
  r  r  r  r_  r  r  r  r  r  r  r  s   `   `       @@rK   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{   )r^  r|  r   r  s      rK   r  r  }  s    
 #JrO   c                    X U'   g r{   rS   r  s      rK   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   )rJ   r   s     rK   rL   FakeCopyMode.__init__  s    "rO   Nc                   U(       a  UO0 nU[         R                  R                  R                  L a>  [	        US   [
        5      (       d   eU" U R                  R                  US   SS940 UD6$ U[
        R                  L a  [        U5      S:X  a  [        U5      S:X  d   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   T)r     r1   )r   r   
TensorBaser  r   r   r   r  __deepcopy__r  r   r   rP  r   r  DisableTorchFunctionSubclass)rJ   rg   r  r  r  r  memor   s           rK   __torch_function__FakeCopyMode.__torch_function__  s1    "r 588&&,,,d1gv....**47$*GKQ  V(((t9>c&kQ&666&$q'*FS*_-tAw7D&zT!BvJ''..,,V4,HC"FJ668T,V, 988s   ;E
Er  )r   r   rU   rV   )rS   N)
rg   r<   r  r  r  r  r  zOptional[Mapping[str, object]]rU   r   )rW   rX   rY   rZ   rL   r  r[   rS   rO   rK   r  r    sI    # "$15-- - 	-
 /- 
- -rO   r  c                    [        U 5      S:X  a  [        U S   [        5      (       d   eU S   R                  R                  (       a  [
        R                  " S5      $ U S   R                  $ )Nr1   r   rK  )r  r   r   r   rc  r   r  r  r  s    rK   _device_handlerr    sW     t9>ja*====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   s     rK   r   &_check_for_subclass.<locals>.<genexpr>  s     =9a&q))9r   )r   )r
  s    rK   r  r    s    =9===rO   c                    [        U [        5      (       + =(       aT    [        U [        5      =(       a=    [        U 5      [        L=(       a%    [        U 5      [        R
                  R                  L$ r{   )r   r   r   r   r   r-  r.  r   s    rK   r  r    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{   rP  r   r  s     rK   r   <lambda>.<locals>.<genexpr>  s      441A4r   r   )r9  r   r   ry  r  s    rK   r  r    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     rK   r   r    s      661A6r   r   )r9  r   r   r*  r  s    rK   r  r    s*     6VT!W-4466 1rO   c                V    [        [        [        U S   5      R                  5       5      $ r  )rP  r   r   r-  r  s    rK   r  r    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    rK   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   ro  s     rK   r   #dump_cache_stats.<locals>.<genexpr>  s     -HqCFFHr   c                    U S   * $ rF   rS   )r1  s    rK   r  "dump_cache_stats.<locals>.<lambda>  s
    AaD5rO   r  z    %-*s %sr1   r  )	r  infor   r}  r~  r  maxsortedr   )rx  widthro  r  s       rK   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|  )r`   r  s    rK   unsupported1_infer_fake_from_real_tensor.<locals>.unsupported  s1    **,((9VH EKL
 	
rO   r   z'a return has a non-zero storage offset rl  c                    U S   U S   * 4$ r  rS   r  s    rK   r  ._infer_fake_from_real_tensor.<locals>.<lambda>2  s    !qte}rO   r  r1   z(a return was not dense in memory (sizes z	 strides ))r  r2  r   )r`   r_   rU   rV   )r-  r-  r1  r   r  r  allocate_sizer  r.  r*  sortr)  rO  r  r2  r   )r@  r  r  r  r   
fake_shapefake_stridesr0  r  r  expectedfake_strides    `          rK   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   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 )Nc              3  V   #    U  H  n[        U[        R                  5      v   M!     g 7fr{   )r   r   r   r  s     rK   r   5inferred_fake_kernel_from_real_out.<locals>.<genexpr>Q  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  real_flat_outspecr   fake_flat_outs          rK   r  r  H  s     >>%%%
 !--h7MBMBBB  "

|-
 	

 IVV11$A>MV  55 Ws   B)r   rA   rU   zdict[T, Literal[True]])rU   z/Generator[TorchDispatchMode | None, None, None])r   r   rU   zGenerator[None, None, None])r   r   r    list[Union[Tensor, int, SymInt]]rU   r  )r   r  rU   zTypeGuard[Tensor])r   r  rU   zOptional[FakeTensorMode])rg   r<   rU   ztorch._C._SchemaInfort  )r   ztype[T]r   r+   rU   zlist[T])r   r  rU   r   )r  rT  rU   rV   )r   r   rU   r(  )rA  r2   r  r   rU   rV   )r   r   rg   r<   r
  r  r  r+   r  r  rU   r   )r|  r{  r   rN  r  _DispatchCacheEntryrU   rV   )r  r  rU   rT  )r
  r  rU   r   )r   r  rU   r   )r   rN  rU   rV   rT   )r@  r   r  torch._ops.OpOverloadr  torch.TensorrU   r  )r@  r   r  r  r  r   rU   r   )
__future__r   atexitrL  r7  r  rj  r9  rw  	threadingr  r  typingr|   collectionsr   r   r   r   r   r	   r
   r   r   r   typing_extensionsr   r   r   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._prims_commonr   torch._subclasses.meta_utilsr   r   r   r   r   torch._utilsr   torch.fx.immutable_collectionsr    torch.fx.operator_schemasr!    torch.multiprocessing.reductionsr"   torch.overridesr#   torch.typesr$   r%   torch.utils._mode_utilsr&   torch.utils._python_dispatchr'   r(   torch.utils._pytreer)   r*   r+   r,   r-   r.   torch.utils._statsr/   torch.utils._tracebackr0   _fake_tensor_utilsr2   r3   r4   collections.abcr5   r6   r7   r8   r9   r:   torch._guardsr;   
torch._opsr<   r*  r=   r>   	getLoggerrW   r  _logginggetArtifactLoggerr  r  
ValueErrorr  r_   r:  DimList_pytreer   rA   r  r  r  re  rH   rC   r  r]   re   rj   rm   rp   rs   localrv   r  r   contextmanagerr   r   r   r   r   r|  r   r   r   r   r   r`  rj  rq  rs  r{  r   r,  r(  rL  rN  ra  rd  rj  rn  r  rd  rr  rt  r   r  _StoragePointerr  r  r  r  r  r  r  r  r  r  r  ry  r*  r-  r  r2  r4  r5  profiler_record_function_exit_RecordFunctionrl  torch._subclasses.fake_implsr  r  r  r  r  r  r  r  r  registerr  r  r  rS   rO   rK   <module>r     s   "       	      # !	 	 	 # !  , , 3 3 T ? 8 , 5  % 9 8 ; - 1 / W V $ 4 R R PP#$%O!		)	)(4J	K..::8EVW 			CLzz~~   \   ,   <   <   <   L  GIOO G  /& - - , ,>%"02 . . 	D 	D@
$h hV 
 
 @@ @ @,B B>E >EB}4 }4@ &79LLM  *% *% *%Z#L $ $ $8	 	 $d#6 6 $6$ $d#
" 
" $
" $d#  $  8:S ST $d#9  $ $d#  $(o
& o
d9 :Q:Q#-:Q	:Q|='='
='  =' 	='
 %1=' ='@7	  
	7	  
	 -$  -F#0> 
IINN!!?	IINN " 
IINN!! $ 
IINN!!)) ,  (	IINN''	IINN$$	IINN%% 
II,,<< 	 	 	&
 	; 	;9

9
39
?K9
9
x6
636?B66ug  )SV3%//;M0MN	s   "W X#!X
XX