
    ȅi*                       S SK Jr  S SKrS SKrS SKJrJr  S SKrS SKJ	s  J
r  S SKJrJrJrJrJr  S SKJr  \(       a  S SKJrJrJr  S SKJr  S SKJr  \R6                  R8                  R:                  rSS	 jrSS
 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\5      r%g)    )annotationsN)AnyTYPE_CHECKING)
FakeTensorFakeTensorModeMetadataMismatchErrortree_flatten_onlyUnsupportedFakeTensorException)TorchDispatchMode)CallableMappingSequence)
OpOverload)PyTreec                :  ^ [        [        R                  U5       Vs1 s HC  n[        R                  R	                  U5      (       d  M)  UR                  5       R                  iME     snm[        U4S j[        [        R                  U 5       5       5      $ s  snf )Nc              3     >#    U  HH  n[         R                  R                  U5      =(       a    UR                  5       R                  T;   v   MJ     g 7fN)torch_C_has_storage_typed_storage_cdata).0outinput_storagess     V/home/james-whalen/.local/lib/python3.13/site-packages/torch/_subclasses/fake_utils.py	<genexpr>'outputs_alias_inputs.<locals>.<genexpr>#   sC      ;C 	c"Ts'9'9';'B'Bn'TT;s   AA)r	   r   Tensorr   r   r   r   any)outputsinputsinpr   s      @r   outputs_alias_inputsr$      s|     %U\\6::C88  % 	$##:N
  $U\\7;  s   (B
Bc                   ^ [        [        R                  U5       Vs1 s H  n[        U5      iM     snm[	        U4S j[        [        R                  U 5       5       5      $ s  snf )Nc              3  @   >#    U  H  n[        U5      T;   v   M     g 7fr   )id)r   r   	input_idss     r   r   %outputs_are_inputs.<locals>.<genexpr>+   s     X/Wr#w)#/Ws   )r	   r   r   r'   r    )r!   r"   r#   r(   s      @r   outputs_are_inputsr*   )   sK    $5ellF$KL$KSC$KLIX/@w/WXXX Ms   A#c                
   [        5       n[        [        R                  U 5       H[  n[        R                  R                  U5      (       d  M)  UR                  5       R                  nX1;   a    gUR                  U5        M]     g)NTF)	setr	   r   r   r   r   r   r   add)r!   storagesr   stors       r   output_alias_each_otherr0   .   sd    uH w7xx$$S))!!#**T 8     c                   [        X5      n[        X45      nXV:w  a  [        U  SU SU 35      e[        X5      n[        X45      nXx:w  a  [        U  SU SU 35      e[        U5      n	[        U5      n
X:w  a  [        U  SU
 SU	 35      eg )Nz( mismatch in outputs_alias_inputs check  != z& mismatch in outputs_are_inputs check z, mismatch in outputs_alias_each_other check )r$   r   r*   r0   )contextreal_outreal_infake_outfake_in
r_aliasing
f_aliasingr_identity_eqf_identity_eqr_output_alias_each_otherf_output_alias_each_others              r   _check_alias_infor?   :   s     &h8J%h8J#i?
|4PZ|\
 	
 'x9M&x9M%#i=m_DQ^P_`
 	
 !8 A 7 A =#iC().G-HJ
 	
 >r1   c                   U [         R                  R                  L d  U [         R                  R                  L a  US;   a  S[	        U5      ;   a  gU [         R
                  R                  L d  U [         R                  R                  L a  US;   a  S[	        U5      ;   a  gU [         R                  R                  L a  US;   a  S[	        U5      ;   a  gg)N)      DevicesT)      F)aten#_scaled_dot_product_flash_attentiondefault_flash_attention_forwardrepr'_scaled_dot_product_efficient_attention_efficient_attention_forward#_scaled_dot_product_cudnn_attention)funcidxes      r   is_sdpa_errorrQ   X   s     D<<DDDt44<<<6Ma  D@@HHHt88@@@6Ma 88@@@6Ma r1   c                l  ^ [        S U  5       S5      nUc  U $ UR                  nUR                  R                  nUR                  nUR
                  R                  5        VVs0 s H  u  pVXe_M	     nnnUR                  R                  5        VVs0 s H  u  pVXe_M	     nnn/ n	U  GHq  n
[        U
[        5      (       a  U
R                  [        R                  :w  a  U	R                  U
5        MJ  UR                  U
R                  5       5      nUc  SOUR                  U5      nUc  U	R                  U
5        M  SmSU4S jjnU" U
R!                  5       5      nU
R"                   Vs/ s H
  o" U5      PM     nnU
R%                  5        Vs/ s H
  o" U5      PM     nnT(       a  U	R                  U
5        GM  [        R&                  " / U
R(                  U
R*                  S9nUR-                  UUUUS9  U	R                  UR/                  5       5        GMt     U	$ s  snnf s  snnf s  snf s  snf )aU  
Attempt to convert fake tensors to a corresponding real tensor with the correct underlying storage by looking up
the FakeTensorMode meta to real storage mapping. On failure to find the storage mapping, the FakeTensor will
remain in the list.

Note: this is not currently optimized (makes copies of the meta converter internal dictionaries)
c              3  T   #    U  H  n[        U[        5      (       d  M  Uv   M      g 7fr   )
isinstancer   )r   items     r   r   +try_convert_fake_to_real.<locals>.<genexpr>   s     C($jz&B(s   (	(NFc                   > [        U [        R                  5      (       d  U $ T(       d  TOU R                  R	                  5       mU R                  R
                  $ r   )rT   r   SymIntnodehas_hinthint)sunhinteds    r   
map_symint,try_convert_fake_to_real.<locals>.map_symint   s;    a..'/xQVV__5FH66;;r1   )dtypedevice)storage_offsetsizestride)r\   ztorch.SymInt | intreturnint)next	fake_modefake_tensor_convertermeta_converter	describerstorage_memoitemslookup_storagerT   r   layoutr   stridedappendgetuntyped_storagerb   shaperd   emptyr`   ra   set_clone)ten_listfake_tensorrh   rj   desckvstorage_to_keykey_to_real_storager   tkeyreal_storager^   stor_offsetr\   rc   rd   
new_tensorr]   s                      @r   try_convert_fake_to_realr   t   s    C(CTK %%I44CCN##D'5'B'B'H'H'JK'Jtqad'JNK,0,?,?,E,E,GH,GDA14,GH
C!Z((AHH,EJJqM  !2!2!45"{t0C0G0G0LJJqM	 !!1!1!34'(ww/w!
1w/)*4A*Q-4JJqM[[''88


 	&	 	 	
 	

:##%&O R JY LH. 04s   %H H&+H,H1c                f   U(       a(  U R                   UR                   :w  a  [        U S35      e[        R                  R	                  U 5      (       a3  U R                  5       nUR                  5       nXx:w  a  [        U S35      e[        R                  R                  R                  U UUUSS9  g )Nz mismatched requires_grad-ness of outputs. This usually means that you have added autograd support for your operator at a dispatch key other than Autograd, which will lead to problemsz mismatched storage offsetT)check_sizescheck_stridesallow_rhs_unbacked)	requires_gradr   r   r   r   rb   _primsutilscompare_tensor_meta)	r5   r7   r4   sizesstridesrb   r   r_offsetf_offsets	            r   _check_fake_real_tensorsr      s     !!X%;%;;') . /  xxX&&**,**,'7)3M(NOO	LL** + r1   c                  t   ^  \ rS rSr SSSSS.         SU 4S jjjjr  S	         S
S jjrSrU =r$ )CrossRefFakeMode   T)r   check_aliasingonly_check_ops_with_metac               `   > [         TU ]  5         Ub  UOS U l        X l        X0l        X@l        g )Nc                    g)NF )fns    r   <lambda>+CrossRefFakeMode.__init__.<locals>.<lambda>   s    Ur1   )super__init__ignore_op_fnr   r   r   )selfr   r   r   r   	__class__s        r   r   CrossRefFakeMode.__init__   s7     	(4L:J 	 +,(@%r1   c           
        U=(       d    0 nS nSn0 nU[         R                  R                  [         R                  R                  [         R                  R
                  4;  GaY  U R                  U5      (       GdB  U R                  (       a/  [        R                  R                  R                  U5      (       Ga  [        R                  R                  UR                  ;  a  [        R                  R                  UR                  ;  a  [        R                  R                   UR                  ;  a  SSKJn   ['        U" 5       S9 n	[(        R*                  " [        R,                  [.        R0                  " U	R2                  SS9X445      u  pg[4        R6                  " 5          U" U0 UD6nS S S 5        S S S 5        SU S3n
U" U0 UD6nUGb4  [(        R:                  " U5      n[(        R:                  " U5      n[=        U5      [=        U5      :X  d!   U
 S	[=        U5       S
[=        U5       35       eU R>                  (       a  [A        XX44XVU45        [C        [E        [(        R:                  " U5      [(        R:                  " U5      5      5       Hm  u  nu  nn[G        U[        R,                  5      nU[G        U[        R,                  5      :X  d
   U
 S35       eU(       d  MT   [I        UUSU RJ                  SSS9  Mo     U$ ! , (       d  f       GN_= f! , (       d  f       GNi= f! [8         a     GNyf = f! [L         aH  n[O        XU5      (       a   S nAM  [=        U5      S:X  a  U
 SU 3O	U
 SU SU 3n[Q        U5      UeS nAff = f)Nr   r   )ShapeEnv)	shape_envT)static_shapeszWhen comparing the output of z* on FakeTensor and concrete Tensors, foundz mismatch in number of returns r3   z$ mismatched number of tensor outputs)r   r   rb   r      z mismatched tensor metadata: z' mismatched tensor metadata for output[z]: ))rF   
lift_freshrH   lift_fresh_copyrv   source_Storage_storage_offsetr   r   r   _subclasses
fake_implshas_metaTagdynamic_output_shapetagsinplace_viewdata_dependent_output%torch.fx.experimental.symbolic_shapesr   r   pytreetree_map_onlyr   	functoolspartialfrom_tensorwarningscatch_warningsr
   tree_leaveslenr   r?   	enumerateziprT   r   r   	ExceptionrQ   r   )r   rN   typesargskwargsfake_r	fake_argsfake_kwargsr   rh   r4   rr_flatf_flatrO   r_outf_outr_is_tenrP   error_messages                       r   __torch_dispatch__#CrossRefFakeMode.__torch_dispatch__   s/    2&(	,.
 ''$$,,		77 %%d++11$$//88>>		..dii?		&&dii7		//tyy@ G#hj9Y-3-A-A!)))*?*?tT.*I
 "002!%y!@K!@ 3 : ,D6 2  	 $!&!''*F''/Fv;#f+- ):3v;-tCPVK=Y- ""!K8P (1F&&q)6+=+=f+EF(#^eU &eU\\::eU\\#BB iCDB 8J0!!"&$($6$6+/*.(4 a 32 :9 2 J % J(A66$  #6{a/  'i'DQCH$+9,STWSXX[\][^!_ &
 4MBIJsg   :L) AL$	L-L5L) 'L:
L	L
L&!L) &L) )
L76L7:
NN,NN)r   r   r   r   r   )
r   z#Callable[[OpOverload], bool] | Noner   boolr   r   r   r   re   None)r   N)
rN   r   r   zSequence[type]r   zSequence[object]r   zMapping[str, object] | Nonere   object)__name__
__module____qualname____firstlineno__r   r   __static_attributes____classcell__)r   s   @r   r   r      s     =AA ##)-A9A 	A
 A #'A 
A A( "$.2ZZ Z 	Z
 ,Z 
Z Zr1   r   )r!   r   r"   r   re   r   )r!   r   re   r   )r4   strr5   r   r6   r   r7   r   r8   r   re   r   )rN   r   rO   rf   rP   r   re   r   )rx   zlist[FakeTensor | Any]re   z%list[FakeTensor | torch.Tensor | Any]) TFTT)r5   ztorch.Tensorr7   r   r4   r   r   r   r   r   rb   r   r   r   re   r   )&
__future__r   r   r   typingr   r   r   torch.utils._pytreer   _pytreer   torch._subclasses.fake_tensorr   r   r   r	   r
   torch.utils._python_dispatchr   collections.abcr   r   r   
torch._opsr   r   _opsopsrF   r$   r*   r0   r?   rQ   r   r   r   r   r1   r   <module>r      s,   "   %  $ $  ; ;;%* zz~~	Y
	


 
 	

 
 

<8A$A*AN   	
    
Bk( kr1   