
    shj                   
   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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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/J0r0J1r1J2r2J3r3  S SK4J5r5  S SK6J7r7  S SK8J9r9  S SK:J;r;  S SK<J=r=  S SK>J?r?J@r@  S SKAJBrB  S SKCJDrD  S SKEJFrFJGrG  S SKHJIrIJJrJJKrKJLrLJMrMJNrN  S SKOJPrP  S SKQJRrR  SSKSJTrTJUrUJVrV  \(       a&  S SKWJXrXJYrYJZrZJ[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 " S# S$5      rn\n" 5       ro\prq\R>                  R                  rs\" S%5      rt\R                  R                  R                  rwSrxS qy " S& S'5      rz\ " S( S)\{5      5       r|\ " S* S+\{5      5       r}\ " S, S-\{5      5       r~\ " S. S/\{5      5       r\ " S0 S1\{5      5       r " S2 S3\	GR                  5      r\" 5       rShS4 jr\GR
                  SiS5 j5       r      SjS6 jrSkS7 jrSlS8 jr\GR                  " S5      SmS9 j5       r\GR                  " S5      SnS: j5       rSoS; jrSpS< jr " S= S>5      r\GR                  " S5      SqS? j5       r\GR
                      SrSA j5       rSnSB jr " SC SD5      r " SE SF5      r " SG SH\$5      r\\?SISJ4   r\B\ " SK SL5      5       5       rSsSM jr\B\ " SN SO5      5       5       r\B\" SPSQ9 " SR SS5      5       5       r\B\" SPSQ9 " ST SU5      5       5       r\B\" SPSQ9 " SV SW\5      5       5       r\B\" SPSQ9 " SX SY5      5       5       r " SZ S@\G5      r\r            StS[ jr " S\ S]\=5      rSuS^ jrSvS_ jrSwS` jr\R                  GRN                  GRP                  GRR                  \\R                  R                  GRT                  GRR                  Sa \R                  R                  GRV                  GRR                  Sb \R                  R                  GRX                  GRR                  Sc 0r\" \R                  R                  GR\                  GRR                  \R                  R                  GR^                  GRR                  \R                  R                  GR`                  GRR                  5      rS SdKJrJrJrJrJrJrJrJr  \GRv                  SxSe j5       r        SySf jr        SzSg jrg! \k a  rlS"\m" \l5      ;   a
  S SKrj SrlClGN	\leSrlClff = f){    )annotationsN)defaultdict)	dataclass)AnyCallablecastLiteralOptionalTYPE_CHECKINGTypeVarUnion)Self	TypeGuard)ReferenceType)SymBoolSymFloatSymIntTensor)is_functorch_wrapped_tensoris_legacy_batchedtensor)FakeScriptObject)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)dataclass_slots)no_dispatch)is_traceable_wrapper_subclassTorchDispatchMode)KeyPathkeystrPyTreetree_map	tree_map_TreeSpec)count)CapturedTraceback   )_CacheKeyState_PySymInputStub_SymIntOutputStub)	GeneratorIterableMappingSequence)TracebackType)Source)
OpOverload)ShapeEnvSymbolicContextnot_implementedz 'not_implemented' not registeredc                      \ rS rSrSrg)_UnassignedK    N)__name__
__module____qualname____firstlineno____static_attributes__rC       q/Users/tiagomarins/Projetos/claudeai/copy_bank/venv/lib/python3.13/site-packages/torch/_subclasses/fake_tensor.pyrA   rA   K   s    rI   rA   Tc                  (    \ rS rSrSS jrSS jrSrg)IncrementRecursionCounta   c                    [         S-  q g Nr2   RECURSION_COUNTselfs    rJ   __init__ IncrementRecursionCount.__init__b       1rI   c                    [         S-  q g rP   rQ   rS   s    rJ   __del__IncrementRecursionCount.__del__f   rW   rI   rC   NreturnNone)rD   rE   rF   rG   rU   rY   rH   rC   rI   rJ   rM   rM   a   s    rI   rM   c                       \ rS rSr% S\S'   Srg)UnsupportedFakeTensorExceptionk   strreasonrC   NrD   rE   rF   rG   __annotations__rH   rC   rI   rJ   r_   r_   k       KrI   r_   c                       \ rS rSr% S\S'   Srg)DynamicOutputShapeExceptionp   r<   funcrC   Nrc   rC   rI   rJ   rg   rg   p       
rI   rg   c                       \ rS rSr% S\S'   Srg)DataDependentOutputExceptionu   r<   ri   rC   Nrc   rC   rI   rJ   rl   rl   u   rj   rI   rl   c                       \ rS rSr% S\S'   Srg)UnsupportedOperatorExceptionz   r<   ri   rC   Nrc   rC   rI   rJ   ro   ro   z   rj   rI   ro   c                       \ rS rSr% S\S'   Srg)MetadataMismatchError   ra   rb   rC   Nrc   rC   rI   rJ   rr   rr      re   rI   rr   c                  *    \ rS rSr% S\S'   SS jrSrg)FakeTensorTLS   Optional[bool]allow_non_fake_inputs_overridec                    S U l         g Nrx   rS   s    rJ   rU   FakeTensorTLS.__init__   s
    .2+rI   r{   Nr[   )rD   rE   rF   rG   rd   rU   rH   rC   rI   rJ   ru   ru      s     %323rI   ru   c                 .    [         R                  U S5      $ NT)dictfromkeys)itemss    rJ   ordered_setr      s    ==%%rI   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rz   )torch_C_unset_dispatch_mode_TorchDispatchModeKeyFAKE_set_dispatch_mode)olds    rJ   unset_fake_temporarilyr      sk     
((
'
'(F(F(K(K
LC-	?HH'', 3?HH'', s   ABA- 	$B-%BB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rz   )getattr).0keycurrs     rJ   	<genexpr>$get_plain_tensors.<locals>.<genexpr>   s     G2F3GD#&&2Fs   )popr(   append__tensor_flatten__extendreversed)subclassouttodo
inner_keys_r   s        @rJ   get_plain_tensorsr      si     :D
xxz,T22JJt//1
G(:2FGG $ JrI   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rz   is_faker   xs     rJ   r   is_fake.<locals>.<genexpr>        =+<awqzz+<   c              3  8   #    U  H  n[        U5      v   M     g 7frz   r   r   s     rJ   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
             rJ   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rz   rC   )r   r   ms     rJ   r   &maybe_get_fake_mode.<locals>.<genexpr>   s     )5a165s   )r   r   r   r   	fake_moder(   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	           @rJ   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      $ rz   )r   r   _SchemaInfo_schemari   s    rJ   get_schema_infor      s    88--rI   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decompositionsrE   
startswithrD   dir)ri   r   r   s      rJ   torch_decomp_decompositionsr      sR    1]]11N $//:: D

#
,
,N0C
CDrI   c                    [         R                  U5      nU Vs/ s H  n[        X05      (       d  M  UPM     sn$ s  snf rz   )pytreetree_leavesr   )tytree	flat_valsr   s       rJ   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      (       + $ rz   )
r   r   layoutr   strided	is_sparse	is_nestedr   r   r   r   s    rJ   _is_plain_tensorr      sx    Q6 	
HH%	
 KK .{{.*1-. 'q). **1-

rI   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 jrSrg)FakeTensorConverteri  c                .    U R                   R                  $ rz   )meta_convertertensor_memorS   s    rJ   r   FakeTensorConverter.tensor_memo  s     ""...rI   r   r   z)dict[StorageWeakRef, list[ReferenceType]]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   )rT   r   r   s      rJ   rU   FakeTensorConverter.__init__  s    +i@ )+%rI   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 rz   )	r   r   constantr"   _typed_storager   r   weakrefref)rT   fake_tensorweak_sts      rJ   add_constant_storage_mapping0FakeTensorConverter.add_constant_storage_mapping"  s{     +z22{7K7K7WWW !5!5!D!D!FG
 77757D))'2%%g.55gkk+6NOrI   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 rz   )r   r   r"   r   r   _fix_weakrefr   )rT   tensorr   weak_tensor_reftens        rJ   invalidate_constant_aliases/FakeTensorConverter.invalidate_constant_aliases0  s}    fj1111 !6!6!89777#<<WEO!#C  "#	  F ))'2rI   c                    U R                   R                  R                  R                  U5      nUc  g U R                  R                  U5      $ rz   )r   	describerlookup_tensorgetr   )rT   r   tids      rJ   	_get_memoFakeTensorConverter._get_memo?  sC    !!++99==a@;##C((rI   c                ~    U R                   R                  R                  U5      nX R                   R                  U'   g rz   )r   r  get_tensor_idr   )rT   r   vr  s       rJ   set_tensor_memo#FakeTensorConverter.set_tensor_memoE  s2    !!++99!</0'',rI   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     rJ   mk_fake_tensor<FakeTensorConverter.from_real_tensor.<locals>.mk_fake_tensort  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]r\   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   )rT   r   r   make_constantr  r  r  r  tracing_contextr  
maybe_memor  r   r  valuer  r  r  item_sourcesymbolr   s    `                  @rJ   from_real_tensor$FakeTensorConverter.from_real_tensorO  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U5      nU R	                  X%5        U$ )Nmetaz$tensor's device must be `meta`, got z instead)r  r   r  r   r  )rT   r   r   r  r?  r   s         rJ   from_meta_and_device(FakeTensorConverter.from_meta_and_device  sr     HHMMV#	J1!((--I	J# ^^A&
!v.Q$
rI   )r   r   r   )r\   zweakref.WeakValueDictionary)r   r   r   r   r\   r]   )r   r   r\   r]   )r   r   r\   r]   )r   r   r\   Optional[FakeTensor])r   r   r
  r   r\   r]   )FN)r   FakeTensorModer   r   r=  r   r  Optional[ShapeEnv]r  Optional[Source]r  Optional[SymbolicContext]r  r   r\   r   )r   rJ  r   r   r  torch.devicer\   r   )rD   rE   rF   rG   propertyr   rd   rU   r   r   r  r  rC  rG  rH   rC   rI   rJ   r   r     s    /	$/ / "!GGL,1% +P3)1 $(,M $(6:M!M M 	M
 &M !M 4M M 
M`',2<H	rI   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 )Nr2   r  )r   cudais_availablexpuversionhipemptyzerosrQ  s    rJ   init_gpu_contextrY    s_     zz  EII$:$:$<$< }}  ( KK&)Qv.	 %=rI   rJ  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      rJ   in_kernel_invocation_managerrc    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    rJ   should_allow_numbers_as_tensorsrj    sB    8844		$#))#.q1 rI   c                  R    \ rS rSr\R
                  R                  SS5      S:H  rSrg)FakeTensorConfigi  TORCH_FAKE_TENSOR_DEBUG01rC   N)	rD   rE   rF   rG   osenvironr  debugrH   rC   rI   rJ   rl  rl    s    JJNN4c:cAErI   rl  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)SymNumberMemoDescriptori&  ra   _namer   _is_nested_intFis_nested_intc                   Xl         g rz   )rv  )rT   rx  s     rJ   rU    SymNumberMemoDescriptor.__init__0  s    +rI   c                    X l         g rz   ru  )rT   ownerrh  s      rJ   __set_name__$SymNumberMemoDescriptor.__set_name__3  s    
rI   c                     SU R                    3$ )Nr   r|  rT   objs     rJ   _memoSymNumberMemoDescriptor._memo6  s    4::,rI   c                "    SU R                    S3$ )Nr   _vcr|  r  s     rJ   _memo_vc SymNumberMemoDescriptor._memo_vc9  s    4::,c""rI   c                "    SU R                    S3$ )Nr   _epochr|  r  s     rJ   _memo_epoch#SymNumberMemoDescriptor._memo_epoch@  s    4::,f%%rI   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$ rz   )r   r  r   r   r   noder   rv  r  _versionr  r   epochsetattr)rT   r  objtypers       rJ   __get__SymNumberMemoDescriptor.__get__C  s     jjo..A7 a((QVV[[-DH
 ##]]35G(HCLL(X##--c23s}}7J7JJCC$/rI   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 rz   )	r  r  r  r  is_inferencerv  r  r   r  )rT   r  r@  s      rJ   __set__SymNumberMemoDescriptor.__set__Y  s     =CC$/Cs+T2C))#.5!!##t':':CC%0&&]]3/>C))#.0C0CD	 (;rI   )rv  ru  )rx  r   r\   r]   )r}  ra   rh  ra   r\   r]   )r  r   r\   ra   rz   )r  r   r  zOptional[type[FakeTensor]]r\   -Optional[Union[torch.SymInt, torch.SymFloat]])r  r   r@  r  r\   r]   )rD   rE   rF   rG   rd   rU   r~  r  r  r  r  r  rH   rC   rI   rJ   rt  rt  &  sp    J 05 , #& FJ(B	6,EE&SE	ErI   rt  c                     ^  \ rS rSr% SrS\S'   S\S'   S\S'   S\S	'   \" 5       r\" 5       r\" 5       r	\" 5       r
\" S
S9r\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   ig  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.
rN  fake_devicerJ  r   Optional[Tensor]r   real_tensorTrw  c                |    U R                   R                  (       a  [        R                  " S5      $ U R                  $ NrF  )r   r\  r   r  r  rS   s    rJ   r  FakeTensor.device  s*    >>..<<''###rI   c                    [         erz   NotImplementedErrorrT   r   s     rJ   r  r        !!rI   c                    [        S5      e)Nz+torch.compile doesn't support named tensors)r_   rS   s    rJ   namesFakeTensor.names  s    ,9
 	
rI   c                    [         erz   r  r  s     rJ   r  r    r  rI   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[        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X6l        Xl        XFl        [        U[*        5      (       a   eXVl        S Ul        S Ul        S Ul        S Ul        S Ul        [8        R:                  (       a  [<        R>                  " 5       Ul         U$ )NT)dispatch_devicedevice_for_backend_keysrF  )rR  rT  rR  hpurT  mps: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_metarY  _get_privateuse1_backend_nameindexr   is_initializedcurrent_devicer  r   r   r   r  nonzero_memor;  unique_memounique_consecutive_memonested_int_memorl  rr  r1   extract_debug_trace)clsr   r   r  r   r  rT   s          rJ   __new__FakeTensor.__new__  s    $$ $*
 66HH33D9HH==dC{{6);4;;+;+;;)%fell;;fAU ##;;&(((;;/)V$ KKueUXX-S-S-UVW${{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rI   c                "   > [         TU ]  5         g rz   )superrU   )rT   argskwargs	__class__s      rJ   rU   FakeTensor.__init__  s    rI   c                $    UR                  U 5      $ rz   )from_tensor)r   r   s     rJ   r  FakeTensor.from_tensor  s    $$Q''rI   rC   c                
   U[         R                  R                  R                  R                  :X  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)Nr2   r   rF  z(FakeTensor unrecognized subclass(es): %sz(FakeTensor mode already active: %s in %s)r   opsprimr  defaultlenr   r   r   r\  r  _DISPATCH_META_HANDLERSr  
issubclassr   not_implemented_logrr  r*  r   arg_tree_leavesr   _get_dispatch_moder   r   )r  ri   typesr  r  handlerr   unrecognized_typesr   argmaybe_cur_fake_modes              rJ   __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/G44
Hc                   ^ ^^^ S mSnS mSS jmS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                h    U R                   R                  S:H  =(       a    U R                  5       S:H  $ )Nr  r   )r  r   r,  r   s    rJ   cpu_zero_dim4FakeTensor._find_common_device.<locals>.cpu_zero_dimZ  s$    88==E):aeegl:rI   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 U(       a  g T(       a  U R                  mUmg [        ST ST SU R                   35      e)Nz,Unhandled FakeTensor Device Propagation for z, found two different devices r[  )r   r   r  RuntimeError)r   t_is_cpu_zero_dimcommon_devicer  ri   is_cpu_zero_dims     rJ   merge_devices5FakeTensor._find_common_device.<locals>.merge_devices]  s     a,,$ !".q/ ,Qxx=("&7O !  !"3 >tfDbcpbqqstut|t|s}~ rI   Tr  z!Could not find common device for r   r   r\   r   )r   objectr\   r]   )rj  r   r  )ri   	flat_argshas_scalar_only_inputsr  r  r  r  r  s   `    @@@rJ   _find_common_deviceFakeTensor._find_common_deviceM  s     !&	; 	  	D C#  +400]5J%)"!LL/M(T,MdV*TT(444rI   r2   )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   )rT   r  s     rJ   get_nested_intFakeTensor.get_nested_int  s`    
 '#'>>#L#L! $M $D  $..====##e++rI   c                   U R                  5       S:X  a  U R                  5       $ U R                  5       S:X  a   U  Vs/ s H  oR                  5       PM     sn$ U  Vs/ s H  oR                  5       PM     sn$ s  snf s  snf Nr   r2   )r,  r3  tolist)rT   r   s     rJ   r  FakeTensor.tolist  sb    88:?99;XXZ1_,01DDIIKD11.23ddKKMd33 23s   A9A>)
r  r   r  r   r;  r  r  r  r  r  )r\   rN  )r   rN  r\   r]   )r\   	list[str])r   r  r\   r]   )NN)r   rJ  r   r   r  rN  r   r  r  r  r\   r   )r  r  r  r  r\   r]   )r   r   r   rJ  r\   r   
ri   r<   r  Sequence[type]r  Sequence[object]r  Mapping[str, object]r\   r  )ri   r<   r  r  r\   ztuple[torch.device, bool])r  zUnion[int, torch.SymInt]r\   torch.SymInt)r\   r   )"rD   rE   rF   rG   __doc__rd   rt  r  r;  r  r  r  r   r   r   r   	_mode_keyrO  r  setterr  staticmethodr  rU   r  classmethodr0   r    r  r  r  r  rH   __classcell__r  s   @rJ   r   r   g  s    !!
 +,L')I)+K57
 .DAO ..33I$ $ ]]" "& 
 

 \\" "  &*(,;!; ; 	;
 #; &; 
; ;^ ( ( 

 "$'5'7G)G) G) 	G)
 %G) 
G)  G)R >5>5%5>5	">5 >5F +,
, (
, 
	
,4 4rI   r   r4   r5   c                      \ 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.dtyper-  ztuple[_MetadataIntLike, ...]shapestriderN  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   rw   is_coalescedOptional[int]	dense_dim
sparse_dimc                V   [         R                  " U 5       H  n[        XR                  5      n[	        U[
        [        [        R                  45      (       a  UR                  XU5        MV  [	        U[        5      (       a  UR                  X5        M~  UR                  U5        M     g rz   )dataclassesfieldsr   rh  r   tuplelistr   Size_prep_args_for_hashr   convert_sym_intr   )rT   resultmodestatefieldr@  s         rJ   _flatten_intoTensorMetadata._flatten_into  sx     !''-ED**-E%%uzz!:;; ((>E6**%%f4e$ .rI   rC   N)r  list[object]r  rJ  r  r3   r\   r]   )rD   rE   rF   rG   r   rd   r!  rH   rC   rI   rJ   r  r    s     ''((00$$--MLO  %% % 	%
 
%rI   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  NrC   )r   _has_symbolic_sizes_stridesr   is_contiguousr  r  r-  r	  r   r   r   r
  r  untyped_storagenbytesr  r'  r  r  r  r   r  r  r  )r   r  r  s      rJ   extract_tensor_metadatar)    s*    4I3KM 	
%%];%%'N		hh%--/
R		,9!,<,<""$$						
		KKT&q))t'**% $ 15% rI   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 rz   )r   hashr.  )rT   tups     rJ   rU   _DispatchCacheKey.__init__  s    crI   c                b    [        U[        5      =(       a    U R                  UR                  :H  $ rz   )r   r+  r   )rT   others     rJ   __eq___DispatchCacheKey.__eq__  s"    %!23MEII8MMrI   c                    U R                   $ rz   )r.  rS   s    rJ   __hash___DispatchCacheKey.__hash__  s    ~~rI   c                x    U R                    H*  n[        U[        5      (       d  M  UR                  5         M,     g rz   )r   r   r4   strip_shape_env)rT   r
  s     rJ   r;  !_DispatchCacheKey.strip_shape_env  s+     A!_--!!# rI   )r.  r   N)r1  r,  r\   r]   )r4  r  r\   r   )r\   r-  r[   )rD   rE   rF   rG   r   rd   rU   r5  r8  r;  rH   rC   rI   rJ   r+  r+    s)     
N#N$rI   r+  T)frozenc                  8    \ rS rSr% SrS\S'   S\S'   S\S'   Srg	)
_DispatchCacheEntryOutputInfoi  a:  
Entry type for the FakeTensor dispatch cache for an output. Accounts for two
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.
r  inplace_idxzOptional[TensorMetadata]metadataview_idxrC   NrD   rE   rF   rG   r   rd   rH   rC   rI   rJ   r?  r?    s     &&rI   r?  c                  2    \ rS rSr% SrS\S'   SrS\S'   Srg	)
_DispatchCacheEntryi'  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_tuplerC   N)rD   rE   rF   rG   r   rd   rG  rH   rC   rI   rJ   rE  rE  '  s     76!OT!rI   rE  c                  $    \ rS rSr% SrS\S'   Srg)_BypassDispatchCachei6  z4
Signals cases that should skip FakeTensor caching.
ra   rb   rC   NrC  rC   rI   rJ   rI  rI  6  s     KrI   rI  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.
r-  hitsmissesdict[str, int]bypassessizerC   NrC  rC   rI   rJ   rK  rK  @  s     IK
IrI   rK  c                    ^  \ 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      rAS\SA jrB\," \2R                  Rl                  \2R                  Rl                  5      rES`SB jrF          SaSC jrGSSSSSD.           SbSE jjrHSFrIU =rJ$ )crJ  iV  z,dict[_DispatchCacheKey, _DispatchCacheEntry]cacher   r-  
cache_hitscache_missesrN  cache_bypassesr  Fr   r\  static_shapesrK  r  zOptional[str]_stackr  re  nt_tensor_id_counternt_tensor_id_initial_countTN)allow_fallback_kernelsallow_non_fake_inputsr  rV  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),logrr  idr  rU   rZ  torch._dynamo.configtorch._functorch.configr   config"fake_tensor_propagate_real_tensorspropagate_real_tensorsr   fake_tensor_converterrV  allow_scalar_outputs(fake_tensor_allow_unsafe_data_ptr_accessr  fake_tensor_allow_metar  _dynamofake_tensor_cache_enabledcache_enabled$fake_tensor_cache_crosscheck_enabledcache_crosscheck_enabledr[  r\  enter_stackr  	tracebackextract_stack_stack_tracerW  r   r   r   r  $torch.nested._internal.nested_tensornested	_internalnested_tensor_tensor_id_counterrY  rX  )rT   rZ  r[  r  rV  r   r   r  s          rJ   rU   FakeTensorMode.__init__n  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!rI   c                &    U R                   U l        g rz   )rY  rX  rS   s    rJ   reset_nt_tensor_id_counter)FakeTensorMode.reset_nt_tensor_id_counter  s    $($C$C!rI   c                L    [        U[        5      =(       a    UR                  U L $ rz   )r   r   r   rT   r   s     rJ   is_our_fakeFakeTensorMode.is_our_fake  s    !Z(@Q[[D-@@rI   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   rT  _is_compiledrR  rS  hasattrr  rS   s    rJ   avoid_device_init FakeTensorMode.avoid_device_init  s    99!!##zz..0000yy--/// JJ##% Du%B%))*@*@*B
 	
rI   c                    U R                   c4  SR                  [        R                  " U R                  5      5      U l         U R                   $ )N )rW  joinrn  format_listrp  rS   s    rJ   stackFakeTensorMode.stack  s7    ;;'')"7"78I8I"JKDK{{rI   rC   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)rT   ri   r  r  r  s        rJ   r  !FakeTensorMode.__torch_dispatch__  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                  (       a5  UR                  R                  5       nUR                  R	                  S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)rq  r  r   _only_lift_cpu_tensors_set_only_lift_cpu_tensorsr   r  rm  r   r  	__enter__r   )rT   r   prev_only_lift_cpu_tensorsmaybe_prev_fake_moder  s       rJ   r  FakeTensorMode.__enter__  s    3%)"!!).)H)H)J&HH//5$xx<<T^^L+##+H 7$&& HH''-##UD2L$MNrI   c                   > U R                   R                  5       u  nnnU(       aV  [        TU ]  XU5        Ub  [        R
                  R                  U5        Ub   [        R
                  R                  U5        g g g rz   )rm  r   r  __exit__r   r   r   r  )rT   abcliver   maybe_prev_only_lift_cpu_tensorsr  s          rJ   r  FakeTensorMode.__exit__  su       "		
 ,GQ1% $/++,@A/;334TU < rI   c                    gr~   rC   r  s    rJ   is_infra_modeFakeTensorMode.is_infra_mode0  s    rI   c                    [        [        R                  [        R                  [	        [        R
                  5      [        [        R                  5      5      $ )z(
Query the state of the dispatch cache.
)rK  rJ  rS  rT  r   rU  r  rR  r  s    rJ   
cache_infoFakeTensorMode.cache_info4  s?    
 !%%''../$$%	
 	
rI   c                    SU l         SU l        U R                  R                  5         U R                  R                  5         g)z
Clear the dispatch cache.
r   N)rS  rT  rU  clearrR  r  s    rJ   cache_clearFakeTensorMode.cache_clear@  s3    
   "		rI   c                <   [         n [        U R                  5      nU R                  XaX45      nUR	                  5       (       a&  UR                  c   eUR                  R
                  nO[        R                  nUR                  US5      n	U	bQ  U R                  XiXqU5      n[        =R                  S-  sl
        U R                  (       a  U R                  XQX#U5        OeU R                  XU5        U R                  XX45      nU R                  XgXXE5      n	UR!                  5         XU'   [        =R"                  S-  sl         U[         L a  U R                  XX45      nU$ ! [$         a/  n
[        R&                  U
R(                  ==   S-  ss'    Sn
A
NQS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).
Nr2   )_UNASSIGNEDr3   r  
_cache_keycache_on_shape_envfake_tensor_cacherJ  rR  r  _output_from_cache_entryrS  rl  _crosscheck_cache_output_validate_cache_key_dispatch_impl_make_cache_entryr;  rT  rI  rU  rb   )rT   ri   r  r  r  outputr  r   rR  entryes              rJ   _cached_dispatch_impl$FakeTensorMode._cached_dispatch_implJ  si    %	9"4>>2E//%t<C''))22299&,,IIc4(E 66uSPTU))Q.)00 11&VT((V<,,T$G..u4vV##%"c
++q0+ [ ((dCF $ 	9))!((3q833	9s   CE"  A$E" "
F,%FFc                n   U[         R                  " 5       [         R                  R                  5       [         R                  " 5       U R
                  (       a  U R
                  R                  OS/nU(       a  U R                  XSU5        U(       a  U R                  XTU5        [        [        U5      5      $ )zs
Create a cache key given the dispatch args. Raises _BypassDispatchCache
for any situation that precludes caching.
N)
r   get_default_dtyper   _get_default_deviceis_inference_mode_enabledr  settingsr  r+  r  )rT   r  ri   r  r  
key_valuess         rJ   r  FakeTensorMode._cache_keyu  s      ##% HH((* ++- (,~~DNN##4

" $$Zu=$$Z? z!233rI   c                P   [         R                  R                  UR                  ;   a  [	        S5      e[         R                  R
                  UR                  ;   a  [	        S5      e[         R                  R                  UR                  ;   a  [	        S5      eU[        R                  R                  :X  a  [	        S5      eXR                  ;   a  [	        S5      eUR                  5       S:X  a  [	        S5      e[         R                  R                  R                  U5      (       d  [	        S5      eUR                  (       aa  [         R                   R#                  UR                  5       [         R                   R$                  R&                  5      (       a  [	        S5      eg	g	)
zI
Validate that the cache key generated by _cache_key will be
reasonable.
zdata dependent outputzdynamic output shapezinplace viewzunsafe viewliftzinductor::resize_storage_bytes_znon-builtinCompositeImplicitAutogradN)r   Tagdata_dependent_outputtagsrI  dynamic_output_shapeinplace_viewaten_unsafe_viewr  lift_fnsrh  _libraryutils
is_builtinis_viewr   %_dispatch_has_kernel_for_dispatch_keyDispatchKeyr  )rT   ri   r  r  s       rJ   r  "FakeTensorMode._validate_cache_key  s-    99**dii7&'>??99))TYY6&'=>>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
<rI   c                   [        U[        5      (       aA  U R                  XR                  5       U5        U R                  XR	                  5       U5        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R                  5       R                  5       [        5      (       a  [        S5      e[        U5      nUR                  XU5        M  [        U[         5      (       a  [        S5      e[        U[        5      (       a  UR#                  X5        GM  [        U[$        [&        45      (       a  [        S5      e[        U[(        [*        [        45      (       a  U R                  XU5        GMy  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.
Nznot our fakeconstant attributez tensorzsymbolic nbytesznon-fake tensorzsymbolic shape)r   r   r  keysvaluesr   r|  rI  r   r   r   r'  r(  r   r)  r!  r   r  r   r   r  r  r   r   )rT   r  r  r  r  rA  s         rJ   r  "FakeTensorMode._prep_args_for_hash  s    dD!!$$VYY[%@$$V[[]EBC#z**'',,.~>><<+./CDD %%.#**W/EFF c113::<fEE./@AA237&&vU;C((*+<==C((%%f2C'8!455*+;<<C$t!455((e<
 d3i(c"7 rI   c                V   [        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   r   rI  r   r   r   r  r^  )rT   r  r   ri   r  r  r  kvals           rJ    _validate_output_for_cache_entry/FakeTensorMode._validate_output_for_cache_entry  s     &*--&'>?? ??&&';<< &77''&'ABB MMOD$x2f:%*+ABB $rI   c                  ^ [        [        U5      5       H*  n[        XG   5      [        U5      :X  d  M  [        US S S9s  $    S n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U R!                  TXX45      n["        R$                  R'                  U5      n["        R$                  R'                  U5      nUU:w  a  [)        S5      eU$ s  sn
n	f )	Nr@  rA  rB  r2   r   c              3  F   >#    U  H  nTR                  U5      v   M     g 7frz   convert_outputr   r
  r  s     rJ   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rz   r  r  s     rJ   r   r  (  s     QA 4 4Q 7 7r  FrF  rG  zdispatch_key_set mismatch)ranger  r^  r?  r  	enumerater   r   r)  r  r	  r
  r  r  r  rE  r  r   r   _dispatch_key_setrI  )rT   r  r   ri   r  r  r  idxrB  ir   idxsrA  r  entry_for_synth_outputsynth_outputsynth_key_setkey_sets    `                rJ    _get_output_info_for_cache_entry/FakeTensorMode._get_output_info_for_cache_entry  s    T#C$)}6
*4 #dT  $ <<"+D/K/$!Z65JA/DKt9>!>AwH*62OOOQQQ"'"6"6x7N7N"O %%- %%h&<&<= 	 .
 "55"
 44)
 22<@((,,V4G#&'BCCO Ls   %F?F?c                   Uc  [        SSSS9n[        U4SS9$ [        U[        5      (       a  U H  nU R	                  XX4XX5        M     OU R	                  XX4XV5        [        U[        5      (       a6  U V	s/ s H  n	U R                  XX4XY5      PM     n
n	[        [        U
5      SS9$ U R                  XX4XV5      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.
Nr  Fr  T)r?  rE  r   r  r  r  )rT   r  r   ri   r  r  r  output_infoout_elementout_elemrF  s              rJ   r   FakeTensorMode._make_cache_entryK  s	    >7 4$K ')^U  fe$$%55F  &
 11D fe$$
 !'	 !'H 55F !'	   '"<0$ 
 ??DK ')^U s   8Cc                f  ^^^ 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   [        R*                  R-                  WS5        UR.                  (       a   [        R*                  R1                  WS5        UR2                  (       az  U[5        [6        UR8                  5         n[        U[        5      (       d   eUR;                  5       n[        U 5         U" 5          WR=                  XX5        S S S 5        S S S 5        [        U WUR>                  5      $ ! , (       d  f       GN= f! , (       d  f       GN%= 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 $ rz   )r   r5   r  r  r4   )r@  r  r   s     rJ   check_valueGFakeTensorMode._get_output_tensor_from_cache_entry.<locals>.check_value  sP     %!233222}}S%//::%e_====rI   c              3  6   >#    U  H  nT" UT5      v   M     g 7frz   rC   r   r
  r  r  s     rJ   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rz   rC   r  s     rJ   r   r    s     Fo{1e,,or  rF  )r-  r   r  r  T)r@  r  r  r3   r\   zUnion[IntLikeType]) r@  r   r   rA  r   r  r	  r
  r  r  
contextlibnullcontextr  suppress_guardsrc  r   empty_stridedr-  r   r  r  r   	_set_conjr  _set_negr  r   r-  rB  r'  set_r  )rT   r  r  r   ri   r  inplace_argrA  r	  r
  r  maybe_suppressrW  view_argstorager  s    ` `           @rJ   #_get_output_tensor_from_cache_entry2FakeTensorMode._get_output_tensor_from_cache_entry~  s    (001Kk:6666 >> ****	#	,:		 DX^^DDFhooFF$X%<%<eD!!-..6>H>T>T>>%!^^;;N)$/1A''nn&44E 2B/ HHud+??HHeT*<<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   I?!8I-I?+J"3JJ"-
I<	7I??
J
J	J""
J0c           
         UR                   (       a:  UR                   Vs/ s H  nU R                  UUUUU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   )rG  rF  r  r  )rT   r  r  r   ri   r  r  outputss           rJ   r  'FakeTensorMode._output_from_cache_entry  s        $)#5#5	 $6K 88 $6  	 >!;;))!,c 	s   A,c                    U R                  X#XE5      n Ub  Ub|  [        U[        5      (       a?  [        U5      [        U5      :X  d   e[        Xa5       H  u  p[        [        X5        M     g[        U[        5      (       a   e[        [        Xa5        gUb   eUb   e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.
z*FakeTensor cache crosscheck failure: func=z, args=z	, kwargs=z: Dispatch raised=N)	r  	Exceptionr  r   r  r  zipr   r   )
rT   r  ri   r  r  r  true_outputr  r  r  s
             rJ   r  'FakeTensorMode._crosscheck_cache_output  s&   	--d4HK	'f.@k511{+s6{::: #K 8*9a; !9  *&%8888&y+F"***~%~!  	<TF CvYvh.@E 	"  	<TF CvYvh0 	s;   B" AC /'C 
C "
C	,CC	
C0C++C0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]  rr  r  getEffectiveLevelloggingDEBUGrR   rM   _DISPATCH_HANDLE_DIRECTLYrc  rj  r  r  )rT   ri   r  r  r  incrs         rJ   r  FakeTensorMode.dispatch  s     2]IIj$f5  ***4066  "gmm3II93;PRV +,D ,,-d3T,V, 43 --d4HH&&tDAA/ ]" 43s   C92D
9
D

Dc                  ^ ^^
^ SSK mSSKJn  SU U4S jjn[        U[        R
                  5      (       aW   U" UUSSSSSS9  [        [        UR                  5       UR                  5       5      5       H  u  nu  p U" X5        M     US4$  U" X45        US4$ ! [         ar  m
[        R                  R                  R                  (       a#  [        S	U
U4S
 jS9  [        T TU5      S4s Sm
@
$ [        SU SU 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U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U SU 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_hintzmismatch between fake value z and real value r  )r   r   r   r  r  exprfree_symbols
var_to_valr  unbacked_var_to_val_maybe_evaluate_staticEqStruerr   r-  floatr   )fakerealrT   sympys     rJ   _check_fake_real_vals?FakeTensorMode._maybe_infer_fake.<locals>._check_fake_real_vals/  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   rI   Real tensor propagation foundFT)contextsizesstridesr  r  mismatched_fake_kernelc                 4   > [        T5      T R                  S.$ Noprb   ra   rb   excri   s   rJ   <lambda>2FakeTensorMode._maybe_infer_fake.<locals>.<lambda>Y  s    "%d)&)jj-rI   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.$ r2  r5  r6  s   rJ   r8  r9  n  s    &)$i*-**1rI   zIReal tensor propagation found an output size mismatch between fake shape z and real shape z, at outputz.size(z), for func: zQReal tensor propagation found an output value mismatch between fake output value z and real output value )r'  r   r(  r   r\   r]   )r)  torch._subclasses.fake_utilsr  r   r   r   rr   r   ra  *generate_fake_kernels_from_real_mismatchesr   _infer_fake_from_real_tensorr+   r  r  rP  )rT   ri   pathr'  r(  r  r*  js_fakes_realr7  r)  s   ``        @@rJ   _maybe_infer_fake FakeTensorMode._maybe_infer_fake#  s    	I	 	6 dELL))(;!#'"'2 (1TYY[$))+1N'O##F)&9 (P: U{%d1 U{[ ) ##**UU%0% 8dDI4OO+##'&(9$ @!!'l4&B 	& - ((//ZZ)4)  <D$MtSS/&&,X-=fX F$$*4L>s-vO 	( ) +))-.EdV L  &t~\$A 	sa   B >DF 
D%AD+D1!DD
F$AF*F2$FF
G(!G		G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 rz   )r  setr  pending_fresh_unbacked_symbols
difference)pending_unbackedrT   s   rJ   _clear_pending_unbackedXFakeTensorMode._maybe_infer_fake_kernel_from_pytree_out.<locals>._clear_pending_unbacked  s4    <@DNNAABMM$=DNN9rI   r,  r0  c                 :   > [        T5      ST R                   3S.$ )Nz>Mismatched aliasing spec between fake kernel and real kernel: r3  r5  r6  s   rJ   r8  IFakeTensorMode._maybe_infer_fake_kernel_from_pytree_out.<locals>.<lambda>  s!    !$i\]`]g]g\hi)rI   r:  c                   > [        TTU 5      $ rz   )r?  )r   ri   rT   s    rJ   r8  rP    s    :4qIrI   zGReal tensor propagation found an aliasing mismatch between fake output z and real output z,  for func: r[   )r=  rG  r  r  rJ  r   tree_flatten_with_pathtree_flattenrr   r   r   ra  r>  r   r-   r  rD  r   tree_unflatten)rT   ri   fake_inreal_infake_outreal_outrG  rM  fake_paths_leaves	fake_specreal_leavesr   
_fake_path	_fake_out	_real_outfake_leaves	overridesr7  rL  s   ``               @@rJ   (_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 [         R                  TT45      u  m-m)[        T-5      nU(       aJ  T- Vs/ s H   n[        U5      (       d  M  [	        U5      PM"     nn[
        R                  " SU5        [        $ T- Vs/ s H  nT R                  U5      (       d  M  UPM     n	n[        S U	 5       5      =(       d    [        S T- 5       5      m/T R                  m+TT R                  ;   n
T[        R                  R                  R                  R                   L =(       a@    [#        TS   [        R$                  5      =(       a    TS   R&                  R                  S:H  nU
(       a  U	(       a%  [)        T5      (       a  T/(       d  U	(       d  U(       d  [+        S U	 5       5      (       d
   T S35       eT- Vs/ s H'  nT R                  U5      (       a  UR,                  OUPM)     nn[         R/                  UT)5      u  pT" U0 UD6n[	        U5      [$        L aJ  T R1                  U5      (       a4  [3        5          UR5                  5       nS S S 5        T+R7                  T USS	9$ U
(       aT  [9        T5      S:X  a  [9        T5      S
:X  d   T ST 35       e[	        TS   5      [$        L a  T+R7                  T TS   5      $ SnT R:                  (       aw  T[        R                  R                  R                  R                   :X  a  ST;   a  TS   S:w  a  SnT[        R                  R<                  R>                  R                   :X  a  SnT RA                  TT+T-T)5      u  m-n	@@[+        S U	 5       5      n[        RB                  RD                  TRF                  ;  GaK  [        RB                  RH                  TRF                  ;  Ga"  U(       Ga  [9        U	5      S:w  Ga
  T/(       Gd  U(       d  T- Vs/ s H'  nT R                  U5      (       a  UR,                  OUPM)     nn[         R/                  UT)5      u  p[3        5          T" U0 UD6nS S S 5        [         RK                  W5      nU Vs/ s H  n[#        U[$        5      (       d  M  UPM     nn[+        U 4S jU 5       5      nU(       a   [         RM                  [$        U+U 4S jU5      $ U H  nT+RO                  U5        M     [         R/                  T-T)5      u  mmT RQ                  TU	TT5            S&U 4S jjnSSK)J*m*J+m.  [Y        5       m0T0m3T RZ                  (       a  [+        S U	 5       5      (       a  [        U.U U44S jT- 5       5      (       d  [\        R                  ST5        T- Vs/ s H  nU" U5      PM     nn[         R/                  UT)5      u  m1m2[^        R`                  " T5      nU(       d  [^        Rb                  " TUT)5      n T" T10 T2D6m3U(       d2  WRg                  5         [^        Rh                  " TRj                  T-T35        OQT RZ                  (       a@  [\        R                  STU	T-T Rl                  (       a  T Rl                  Rn                  OS 5        S'UU*U.UUU0U1U2U3U 4
S jjnT/(       a.  [q        5       Rs                  T5      nUb  U" U" T /TQ70 TD65      $ SSK:J;n  TU;  a  T Ry                  T5      (       d  SSK:J=n  TU;   aK  T/(       d'  [}        T5      (       a4  [+        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 RZ                  (       ak  T3T0Laf  [^        R`                  " T5      (       dK  T Rl                  b>  [^        R                  " T5      (       d#  [        T TT35      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)U-UU/U 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T-TRs                  S5      S%95      $ s  snf s  snf s  snf ! , (       d  f       GN= fs  snf ! , (       d  f       GN= fs  snf s  snf ! [d         a"  n[\        R                  STU5         S nAGNS nAff = f! , (       d  f       GNn= f! , (       d  f       GNH= f! , (       d  f       GN= f! , (       d  f       O= fS S S 5        GMw  ! , (       d  f       GN= f! , (       d  f       GN= f! [         a  n(U&" U(5      s S n(A($ S n(A(f[         a    [\        R                  S$T5        e f = f)*Nz,FakeTensorMode unrecognized subclass(es): %sc              3  8   #    U  H  oR                   v   M     g 7frz   )r%  )r   r  s     rJ   r   0FakeTensorMode._dispatch_impl.<locals>.<genexpr>  s      !
3Ha))3Hr   c              3  B   #    U  H  n[        U[        5      v   M     g 7frz   )r   r   )r   r  s     rJ   r   re    s     :	1Av&&	   r   rF  c              3  <   #    U  H  oR                   S Lv   M     g 7frz   r  r   r   s     rJ   r   re    s      0E1

$&0E   z. should not have fake inputs without constantsTr=  r2   r  Fr  r  c              3  <   #    U  H  oR                   S Lv   M     g 7frz   r  r   r  s     rJ   r   re  C       Q;Pa::T1;Prj  c              3  F   >#    U  H  nTR                  U5      v   M     g 7frz   )may_turn_const)r   r   rT   s     rJ   r   re  X  s!     P?O!t22155?Or  c                &   > TR                  TU SS9$ )NTrk  )rC  )r   	converterrT   s    rJ   r8  /FakeTensorMode._dispatch_impl.<locals>.<lambda>]  s    i88qPT8UrI   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 $ rz   )r   r   r  r%   r  r  pytyper  xreplacer   r!  r   real_obj)r   rT   s    rJ   maybe_to_real_tensor;FakeTensorMode._dispatch_impl.<locals>.maybe_to_real_tensork  s     !Z((}}$A|,,~~111vv}}FFKK(()B)BCLL:: 
 A/00zz!rI   )compute_unbacked_bindingsfree_unbacked_symbolsc              3  <   #    U  H  oR                   S Lv   M     g 7frz   )r  rm  s     rJ   r   re    s     M7L!MM-7Lrj  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rz   )r  r!  )r   srT   s     rJ   r   :FakeTensorMode._dispatch_impl.<locals>.<genexpr>.<genexpr>  s      VQUAT^^%G%GGQUs   %()r   r   r  r   )r   r  r{  rT   symss     rJ   r   re    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           	     h  >
^^ 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      (       ds  [        T[        5      (       d^  [        U 5      [        T5      :w  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 -> %sr2   )r   r   r]  rr  r^  r  r  rP  r
  r  r%   r  r  Symbolr  set_unbacked_var_to_valr#  lhsrhsr-  )r   real_tr  real_sr{  gorT   r)  s       rJ   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0rI   T)peek)r   r  r  r   r\   r]   )r)  r]  rr  r   r   ra  r>  ra  r   r   r   r.   r  r   rS  r  )rW  r  r)  r  rz  r{  ri   r  nil	real_argsreal_kwargsrX  rT   s    @@rJ   maybe_propagate_real_tensorsCFakeTensorMode._dispatch_impl.<locals>.maybe_propagate_real_tensors  s   II7>O O0 s" ((//ZZAAv"K0    $LLv"K0   H #8V44&x88X$x.8 f11(;<f11(;< b(H5
 *$..(NOrI   )
meta_tabler   c              3  B   #    U  H  n[        U5      (       + v   M     g 7frz   )r   rm  s     rJ   r   re  	  s     P:OQa 000:Org  zprims::prim_meta_implmissing_fake_kernelc                    > S[        T 5      0$ )Nr4  )ra   r   s   rJ   r8  rs  G	  s    c$i)rI   r:  c                    > T $ rz   rC   )ctxs   rJ   r8  rs  T	  s    rI   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      $ rz   )r   r  r  can_generate_trivial_fake_implcan_run_unsafe_fallbackro   run_fallback_kernel)error	args_specr  ri   has_symbolic_sizesrT   s    rJ   maybe_run_unsafe_fallback@FakeTensorMode._dispatch_impl.<locals>.maybe_run_unsafe_fallbacka	  sc     ~~##BB4HH!)E)Ed)K)K2488}4T:&tT9iOOrI   z*failed while attempting to run meta for %srQ  )r   rK   r\   z1Optional[Union[T, Tensor, torch._C.ScriptObject]])rW  rK   r\   rK   rz   )r  zOptional[RuntimeError]r\   rI  )\r   rS  _check_for_subclass_check_for_subclass_argr   r  rr  r*  r|  r   rd  r  r   r  r  _to_copyr  r   r   r  rj  r   r   rT  rp  r'   clonerC  r  r  prims
device_put%validate_and_convert_non_fake_tensorsr  nondeterministic_seededr  r  r   tree_map_onlyr   invalidate_written_to_constantsr%  rz  r{  r  rc  r]  library_utilsr  MutationCheckerZeroDivisionErrorcheckcheck_aliasing_constraintru  r  r!  get_fast_op_implsr  r   r  cpp_meta_supports_symintr   r   	decomposer   rh  r  stride_incorrect_opr  rh  ra  _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_getterop_implementations_checkshas_metarc  r  r  r  +wrap_meta_outputs_with_default_device_logic)5rT   ri   r  r  r  has_unrecognized_typesr   r  r   flat_arg_fake_tensorsis_lift_func!device_conversion_skip_const_propr  const_flat_args
const_argsconst_kwargsr   avoiding_device_initall_constantflat_outflat_out_tensorsr   rx  real_flat_argsr  mutation_checkerr7  r  	fast_implr  r   r  profilesr  maybe_fake_implrun_impl_checkop_implop_impl_outr  fallbacknot_implemented_errorr  rz  rr  r  r  r{  r  r  r  r  rX  r  s5   `` ``                                    @@@@@@@@@@@@rJ   r  FakeTensorMode._dispatch_impl  s
     &22D&>B	9 "5Y!?!!*"!*A.Ea.HQ  "  %%>@R "!,5 MIq9I9I!9LI M  !
3H!
 
 ;:	:: 	 ..	t}},EIINN++333 .47ELL1.Q##v- 	* !6+D11&)5 0E   GEFG  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@@  %!!		//777&8$-'+$uyy11999'+$ .2-W-W)Y	.
*) & Q;PQQII--TYY>		&&dii7)*a/&( 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,,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$H	 H	 H	V )+//5I$3Id4TT4TV4TUU 	;z!$*G*G*M*M9 **" 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 	 ..**66tTBC))88Et($9&93F; HLtEE (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> #]n   Nx J %  		O 	z T
 " F HLtEEEEL 43" 	D,-BCC 	MMFM	s   iii	)i	.ii?.i%	i*;i<i<!jj ;j5#kk*l-k+=	ll+ 	ll+ 
i"*
i9
j2j--j25
k
k
k(+
k9	5l
l
l(#l+ (l+ +
m'5m<m'%m'
debugprimsr  r  xlavision	torchtext
torchaudio	quantizedc                    U R                   (       d  gUR                  U R                  ;   =(       d    UR                  5       S:H  $ )NFzfbgemm::gmm)rZ  	namespace+_can_run_unsafe_fallback_allowed_namespacesrh  rT   ri   s     rJ   r  &FakeTensorMode.can_run_unsafe_fallback	  s:    **
 NNdNNN ,yy{m+	
rI   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      (       d  [        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$ )NzECan'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   rT  AssertionErrorr   fake_tensor_tlsrx   r[  r   r   rC  r   )r   r  r  r[  r   r  rr  r  r  ri   rT   s        rJ   validateFFakeTensorMode.validate_and_convert_non_fake_tensors.<locals>.validate	  s2   a(( ##A&&99))TYY6#)#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!((-JrI   )r   rK   r\   Union[T, FakeTensor]rC   )	rT   ri   rr  r  r  r  r  validated_argsr  s	   `````   @rJ   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 rQ  )r  r  s   rJ   r8  ZFakeTensorMode.wrap_meta_outputs_with_default_device_logic.<locals>.wrap.<locals>.<lambda>	  s    KAHH:U`an`oprI   )r   r   r   r  r|  r   _checkr  r   rK   rC  rG  )	r  r|  r  rr  r  r  ri   r  rT   s	   ` rJ   wrapHFakeTensorMode.wrap_meta_outputs_with_default_device_logic.<locals>.wrap	  s     a(($ 224C!* **1-KHH-p Aqz!&) %55dA>>$99a!8=  rI   r  rK   r\   r  )rd  r-   )	rT   r  ri   r  r  r  r  rr  r  s	   ` ``` @@@rJ   r  :FakeTensorMode.wrap_meta_outputs_with_default_device_logic	  s5     ..	 !&	 	B   rI   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 activer2   intermediate_offsets_or_lengths)valr  )symr   r  )rq  !torch.nested._internal.nested_intr  rX  rm  r   rh  r  EphemeralSourcer  r:  create_symbol)rT   r  r   r  r   srcrets          rJ   r  )FakeTensorMode.create_symbolic_nested_int
  s    
 	4C44L##X%XX#%%*%||M,:;mm""223TU~~)))nn..,, -   / 
 
rI   c                p    [         R                  R                  UR                  ;   a  gXR                  ;   $ r~   )r   r  	view_copyr  _cpp_meta_supports_symintr  s     rJ   r  'FakeTensorMode.cpp_meta_supports_symint,
  s*    99$))+5555rI   c                    UR                  5       [        :*  =(       aN    [        U5      (       + =(       a7    U R                  U5      (       + =(       a    UR                  R
                  S:X  + $ r  )numelCONSTANT_NUMEL_LIMITr   r|  r  r   r{  s     rJ   rp  FakeTensorMode.may_turn_const3
  sS    GGI-- ,!!$$,$$Q'', HHMMV+		
rI   c                   [        S U 5       5      n[        U5      nU(       a  UR                  5       (       a  [        X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rz   r  rm  s     rJ   r   AFakeTensorMode.invalidate_written_to_constants.<locals>.<genexpr>B
  rn  rj  T)r  r  normalize_to_only_use_kwargsinputrT   )
r   r   
is_mutabler!   r   has_argumentr|  r   rd  r   )rT   ri   r  r  r  any_constantschema_infor   
new_kwargskr
  s              rJ   r  .FakeTensorMode.invalidate_written_to_constants;
  s     Q;PQQ%d+K2244.TMA #((*w,+*B*B1*E*EAF$$Q''#..q11

...JJ1::V +	 5<rI   )rV  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  rV  rd  rC  )rT   r   rV  r  r  r  r  s          rJ   r  FakeTensorMode.from_tensorQ
  sn     )-	  ..M (DCD(I))::- ; 
 	
rI   )r  r  rW  rp  rZ  r  r[  re  rl  rj  rm  rd  r\  rX  rY  rc  r  rV  )rZ  r   r[  r   r  rK  rV  rw   r   r   r\   r]   r[   )r   r  r\   zTypeGuard[FakeTensor])r\   r   )r\   ra   r  )r\   r   )r  zOptional[type[BaseException]]r  zOptional[BaseException]r  zOptional[TracebackType]r\   r]   )r\   rK  )
r  r3   ri   r<   r  r  r  r  r\   r+  )ri   r<   r  r  r  r  r\   r]   )r  r#  r  z?Union[Mapping[str, object], Sequence[object], Iterable[object]]r  r3   r\   r]   )r  r3   r   r+  ri   r<   r  r  r  r  r  rI  r\   r]   )r  r3   r   r+  ri   r<   r  r  r  r  r  r   r\   r?  )r  r3   r   r+  ri   r<   r  r  r  r  r  rI  r\   rE  )r  r3   r  r?  r   r+  ri   r<   r  r  r\   rI  )r  r3   r  rE  r   r+  ri   r<   r  r  r\   =Union[Optional[FakeTensor], tuple[Optional[FakeTensor], ...]])r  r  ri   r<   r  r  r  r  r  r  r\   r]   )
ri   r<   r@  r*   r'  r  r(  r  r\   ztuple[Optional[object], bool])ri   r<   rU  r  rV  r  rW  r  rX  r  r\   zOptional[object])
ri   r<   r  r  r  r  r  r  r\   rI  ri   r<   r\   r   )
ri   r<   rr  r   r  r  r  r/   r\   z%tuple[list[object], list[FakeTensor]])
r  r  ri   r<   r  r  r  rN  r\   r,   )r  r  r\   r  r  )
ri   r<   r  zSequence[FakeTensor]r  r  r  r  r\   r]   )r   r   rV  rw   r  rL  r  rM  r  r   r\   r   )KrD   rE   rF   rG   rR  rd   rS  rT  r   r-  rU  r  r\  rX  rY  rU   rx  r|  rO  r  r  r0   r    r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rD  ra  r  r   r  r  r  r  r  r  rW  r  r   r  as_strided_scatter
as_stridedas_strided_rX  detachview_as_realview_as_complexr  source_Storage_storage_offset(_sparse_coo_tensor_with_dims_and_tensorsr  r  
lift_freshlift_fresh_copyr  rp  r  r  rH   r  r  s   @rJ   rJ  rJ  V  s]   :<E7<JL#%0%5NN5 E3N!&$&!! !##"&((
 (,&+(,(, !]D !%]D  $	]D
 &]D &]D  !]D" 
#]D ]D~DA 
 
  
 
 "$'5'7  	
 % 
 $(V(V #V #	V
 
V(   	
 	
  )) ) 	)
 %) 
)V 4 4  4 	 4
 % 4 
 4D(D(D (D %	(D
 
(DT,#,# N,# 	,#
 
,#\CC C 	C
 C %C %C 
C@:: : 	:
 : %: : 
':x11 1 	1
 1 %1 %1 
1f@8@8 -@8 	@8
 @8 @8 
@8D # 	
   
G:#M# # 	#
 # %# 
#R "$'5'7BB B 	B
 %B 
BB__&-_5;_CI_	&_BJ=J= J= 	J=
 J= J= 
J=Xv
v
 v
 	v

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

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

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

 !
 4
 
 

 
rI   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 $ )NrQ  )r|  r   
zeros_liker  r   _coalesced_r  r^  )r  r   r   	inp_implss     rJ   to_real_tensor+run_fallback_kernel.<locals>.to_real_tensor
  sZ    $$Q''&&q?;;OOANN$45%&	"S'"
HrI   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 $ rz   )r^  r   r   r   r   _cdatard  rC  )r  r   r(  orig_not_implemented_exceptionstoragess    rJ   map_out$run_fallback_kernel.<locals>.map_out
  s    a5	!q&!!!!$$  "))X500a  !u	! A'' 66GG	STUUHrI   )r  rK   r\   zUnion[T, Tensor]r  )r   r  r  r  r'   r   rT  rI  r   r   r   addr   r,  r-   )r   ri   r  r  r-  r)  r  r  r  r  r  r/  r(  r.  s   `   `       @@rJ   r  r  p
  s     yy*,,I 
	 	 1::	1^A&		:,,YB$!&! 
  &)UHa   ##Q--/667    ??7A&&C ; 
s   D	D	!D	D
D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 rz   r   )rT   r   s     rJ   rU   FakeCopyMode.__init__
  s    "rI   Nc                   U(       a  UO0 nU[         R                  R                  R                  :X  a>  [	        US   [
        5      (       d   eU" U R                  R                  US   SS940 UD6$ U[
        R                  :X  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)rV     r2   )r   r   
TensorBaser  r   r   r   r  __deepcopy__r  r   r   r-  r   r^  DisableTorchFunctionSubclass)rT   ri   r  r  r  r   memor   s           rJ   __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r5  )r   rJ  r\   r]   )rC   N)
ri   r<   r  r  r  r  r  zOptional[Mapping[str, object]]r\   r   )rD   rE   rF   rG   rU   r=  rH   rC   rI   rJ   r3  r3  
  sI    # "$15-- - 	-
 /- 
- -rI   r3  c                    [        U 5      S:X  a  [        U S   [        5      (       d   eU S   R                  R                  (       a  [
        R                  " S5      $ U S   R                  $ )Nr2   r   rF  )r  r   r   r   r\  r   r  r  r  s    rJ   _device_handlerrA  
  sW     t9>ja*====Aw--||F##Aw"""rI   c                &    [        S U  5       5      $ )Nc              3  8   #    U  H  n[        U5      v   M     g 7frz   )r  r   s     rJ   r   &_check_for_subclass.<locals>.<genexpr>
  s     =9a&q))9r   )r   )r  s    rJ   r  r  
  s    =9===rI   c                    [        U [        5      (       + =(       aT    [        U [        5      =(       a=    [        U 5      [        L=(       a%    [        U 5      [        R
                  R                  L$ rz   )r   r   r   r   r   r(  r)  r   s    rJ   r  r  
  sQ    q*%% 	.q&!	.G6!	. G588---	rI   c                d    [        S [        [        U S   5      R                  5        5       5      $ )Nc              3  8   #    U  H  n[        U5      v   M     g 7frz   r-  r   r  s     rJ   r   <lambda>.<locals>.<genexpr>
  s      441A4r   r   )r  r   r   rP  r@  s    rJ   r8  r8  
  s*    e 4VT!W-2244 /rI   c                d    [        S [        [        U S   5      R                  5        5       5      $ )Nc              3  8   #    U  H  n[        U5      v   M     g 7frz   rI  rJ  s     rJ   r   rK  
  s      661A6r   r   )r  r   r   r
  r@  s    rJ   r8  r8  
  s*     6VT!W-4466 1rI   c                V    [        [        [        U S   5      R                  5       5      $ )Nr   )r-  r   r   r  r@  s    rJ   r8  r8    s     VT!W,,.9rI   )_device_not_kwarg_ops_is_tensor_constructor_like_tensor_constructorscontains_tensor_typesr  r  r  r  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rz   )r  )r   r  s     rJ   r   #dump_cache_stats.<locals>.<genexpr>!  s     -HqCFFHr   c                    U S   * $ rP   rC   )r  s    rJ   r8  "dump_cache_stats.<locals>.<lambda>"  s
    AaD5rI   r   z    %-*s %sr2   r  )	r]  inforJ  rS  rT  rU  maxsortedr   )rO  widthr  r
  s       rJ   dump_cache_statsr]    s    HH&'HH!:!:;HH!>#>#>?,,H$%-H--8>>+ADAHH]EAI!Aw: B rI   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  ru  )rb   r4  s    rJ   unsupported1_infer_fake_from_real_tensor.<locals>.unsupported)  s1    **,((9VH EKL
 	
rI   r   z'a return has a non-zero storage offset re  c                    U S   U S   * 4$ r  rC   rF  s    rJ   r8  ._infer_fake_from_real_tensor.<locals>.<lambda>L  s    !qte}rI   rX  r2   z(a return was not dense in memory (sizes z	 strides ))r  r-  r   )rb   ra   r\   r]   )r  r  r,  r   r  r  allocate_sizer  r  r
  sortr	  r   r  r-  r   )r  r4  rX  r`  r   
fake_shapefake_stridesr  r  r/  expectedfake_strides    `          rJ   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rz   )r   r   r   ri  s     rJ   r   5inferred_fake_kernel_from_real_out.<locals>.<genexpr>k  s     BMqz!U\\**Ms   ')zPpropagate_real_tensors: we don't support operators that return non-Tensors. Got )r  r   rS  r   r  r   r?  rT  )r  r4  rX  real_flat_outspecr   fake_flat_outs          rJ   r  r  b  s     >>%%%
 !--h7MBMBBB  "

|-
 	

 IVV11$A>MV  55 Ws   B)r   rK   r\   zdict[T, Literal[True]])r\   z2Generator[Optional[TorchDispatchMode], None, None])r   r   r    list[Union[Tensor, int, SymInt]]r\   rq  )r   r  r\   zTypeGuard[Tensor])r   r  r\   zOptional[FakeTensorMode])ri   r<   r\   ztorch._C._SchemaInfor  )r   ztype[T]r   r,   r\   zlist[T])r   r  r\   r   )r  rN  r\   r]   )r   rJ  r\   zGenerator[None, None, None])r   r   r\   r  )r   rJ  ri   r<   r  r  r  r,   r-  r  r\   r   )r  r  r\   rN  )r  r  r\   r   )r   r  r\   r   r[   )r  rJ  r4  torch._ops.OpOverloadrX  torch.Tensorr\   rs  )r  rJ  r4  rr  rX  r   r\   r   )
__future__r   atexitr  r  	functoolsr  r4  rp  	threadingrn  typingr   collectionsr   r   r   r   r   r	   r
   r   r   r   typing_extensionsr   r   r   r   torch._library.utilsr  r  r  r   r   r   r   torch._C._functorchr   r   "torch._library.fake_class_registryr   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._backport_slotsr&   torch.utils._mode_utilsr'   torch.utils._python_dispatchr(   r)   torch.utils._pytreer*   r+   r,   r-   r.   r/   torch.utils._statsr0   torch.utils._tracebackr1   _fake_tensor_utilsr3   r4   r5   collections.abcr6   r7   r8   r9   r  r:   torch._guardsr;   
torch._opsr<   r%  r=   r>   	getLoggerrD   r]  _logginggetArtifactLoggerr  
ValueErrorr  ra   rA   r  r  DimList_pytreer   rK   _opsr  r  r  rR   rM   r  r_   rg   rl   ro   rr   localru   r  r   contextmanagerr   r   r   r   	lru_cacher   r   r   r   r   rY  rc  rj  rl  rt  r   r  r  r)  r+  r?  rE  r  rI  rK  rJ  r  _StoragePointerr  r3  rA  r  r  r  r  r  rP  r
  r  r  r  r  r  r  torch._subclasses.fake_implsrO  rP  rQ  rR  r  r  r  r  registerr]  r?  r  rC   rI   rJ   <module>r     s   "       	     # ! X X X - !  , , 3 3 T ? , 5  % 9 8 ; - 1 7 / W V $ 4 R R FF#$%O!..::8EVW	 	 m
			CLzz~~   \   ,   <   <   L  3IOO 3  /& - ->%"02 T. . T	D 	D@
$^ ^B T
 
 @@ @ @,B B>E >EBz4 z4z	 &79LLM  
(% (%  (%V#L 
$ $  $4 
$    
$
" 
"  
" 
$9    
$   (S
& S
l0 ='='
='  =' 	='
 %1=' ='D -$  -F#0> 
IINN!!?	IINN " 
IINN!! $ 
IINN!!)) ,  (	IINN''	IINN$$	IINN%% 	 	 	 	; 	;9

9
39
?K9
9
x6
636?B66}X  )SV3--	s   U U.U)'U))U.