
    Vh+(                     `   d dl Z d dlZd dlmZmZmZ d dlZd dlmc m	Z
 d dlmZ d dlmZmZmZmZmZ d dlmZ ej*                  j,                  j.                  Zd Zd Zd Zd	 Zd
 Zdeeeef      deeeej<                  ef      fdZ	 	 	 	 	 ddej<                  defdZ  G d de      Z!y)    N)AnyCallableUnion)
OpOverload)
FakeTensorFakeTensorModeMetadataMismatchErrortree_flatten_onlyUnsupportedFakeTensorException)TorchDispatchModec                 $   t        t        j                  |      D ch c];  }t        j                  j	                  |      r|j                         j                  = c}t        fdt        t        j                  |       D              S c c}w )Nc              3      K   | ]A  }t         j                  j                  |      xr |j                         j                  v  C y wN)torch_C_has_storage_typed_storage_cdata).0outinput_storagess     L/home/dcms/DCMS/lib/python3.12/site-packages/torch/_subclasses/fake_utils.py	<genexpr>z'outputs_alias_inputs.<locals>.<genexpr>   sD       	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      su     %U\\6:88  % 	##N
  $U\\7;  s   A Bc                     t        t        j                  |      D ch c]  }t        |       c}t	        fdt        t        j                  |       D              S c c}w )Nc              3   8   K   | ]  }t        |      v   y wr   )id)r   r   	input_idss     r   r   z%outputs_are_inputs.<locals>.<genexpr>%   s     Xr#w)#Xs   )r
   r   r   r"   r   )r   r   r   r#   s      @r   outputs_are_inputsr$   #   sE    $5ellF$KLSCLIX/@w/WXXX Ms   Ac                     t               }t        t        j                  |       D ]S  }t        j                  j                  |      s#|j                         j                  }||v r y|j                  |       U y)NTF)	setr
   r   r   r   r   r   r   add)r   storagesr   stors       r   output_alias_each_otherr*   (   sh    uH w7 xx$$S)!!#**8T     c                     t        ||      }t        ||      }||k7  rt        |  d| d|       t        ||      }t        ||      }||k7  rt        |  d| d|       t        |      }	t        |      }
|	|
k7  rt        |  d|
 d|	       y )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$   r*   )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_infor9   4   s    %h8J%h8JZ#i?
|4PZ|\
 	
 'x9M&x9M%#i=m_DQ^P_`
 	
 !8 A 7 A $==#iC().G-HJ
 	
 >r+   c                    | t         j                  j                  u s| t         j                  j                  u r|dv rdt	        |      v ry| t         j
                  j                  u s| t         j                  j                  u r|dv rdt	        |      v ry| t         j                  j                  u r|dv rdt	        |      v ryy)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_errorrK   L   s     D<<DDDt44<<<6Ma  D@@HHHt88@@@6Ma 88@@@6Ma r+   ten_listreturnc                 <   t        d | D        d      }|| S |j                  }|j                  j                  }|j                  }|j
                  j                         D ci c]  \  }}||
 }}}|j                  j                         D ci c]  \  }}||
 }}}g }	| D ]]  }
t        |
t              r|
j                  t        j                  k(  s|	j                  |
       C|j                  |
j                               }|dn|j                  |      }||	j                  |
       dfd} ||
j!                               }|
j"                  D cg c]
  } ||       }}|
j%                         D cg c]
  } ||       }}r|	j                  |
       t        j&                  g |
j(                  |
j*                        }|j-                  ||||       |	j                  |j/                                ` |	S c c}}w c c}}w c c}w c c}w )ai  
    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   B   K   | ]  }t        |t              s|  y wr   )
isinstancer   )r   items     r   r   z+try_convert_fake_to_real.<locals>.<genexpr>t   s     C$jz&BCs   NFc                     t        | t        j                        s| S sn| j                  j	                         | j                  j
                  S r   )rP   r   SymIntnodehas_hinthint)sunhinteds    r   
map_symintz,try_convert_fake_to_real.<locals>.map_symint   s8    a.'/xQVV__5FH66;;r+   )dtypedevice)storage_offsetsizestride)next	fake_modefake_tensor_convertermeta_converter	describerstorage_memoitemslookup_storagerP   r   layoutr   stridedappendgetuntyped_storager\   shaper^   emptyrZ   r[   set_clone)rL   fake_tensorr`   rb   desckvstorage_to_keykey_to_real_storager   tkeyreal_storagerY   stor_offsetrW   r]   r^   
new_tensorrX   s                      @r   try_convert_fake_to_realr{   h   s    C(CTK %%I44CCN##D'5'B'B'H'H'JKtq!adKNK,0,?,?,E,E,GHDAq1a4HH
C ''!Z(EMM0IJJqM  !2!2!45"{t0C0G0G0LJJqM	 !!1!1!34'(ww/!
1//)*4A*Q-44JJqM[[''88


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

:##%&O''R JY LH. 04s   $HHH>Hr/   r1   c                 V   |r'| j                   |j                   k7  rt        | d      t        j                  j	                  |       r3| j                         }|j                         }||k7  rt        | d      t        j                  j                  j                  | |||d       y )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   r\   _primsutilscompare_tensor_meta)	r/   r1   r.   sizesstridesr\   r   r_offsetf_offsets	            r   _check_fake_real_tensorsr      s     !!X%;%;;') . /  xxX&**,**,x'7)3M(NOO	LL** + r+   c                   P     e Zd Z	 ddddddeeegef   df   f fdZddZ xZ	S )	CrossRefFakeModeNT)r~   check_aliasingonly_check_ops_with_metaignore_op_fnc                d    t         |           ||nd | _        || _        || _        || _        y )Nc                      y)NF )fns    r   <lambda>z+CrossRefFakeMode.__init__.<locals>.<lambda>   s    r+   )super__init__r   r~   r   r   )selfr   r~   r   r   	__class__s        r   r   zCrossRefFakeMode.__init__   s=     	(4L:J 	 +,(@%r+   c           	         |xs i }d }|t         j                  j                  t         j                  j                  t         j                  j
                  fvrI| j                  |      s7| j                  r*t        j                  j                  j                  |      rt        j                  j                  |j                  vrt        j                  j                  |j                  vrt        j                  j                   |j                  vrddlm} 	 t'         |             5 }t)        j*                  t        j,                  t/        j0                  |j2                  d      ||f      \  }}	t5        j6                         5   ||i |	}d d d        d d d        d| d}
 ||i |}|'t)        j:                  |      }t)        j:                  |      }t=        |      t=        |      k(  s!J |
 dt=        |       d	t=        |              | j>                  rtA        |
|||f|	f       tC        tE        t)        j:                  |      t)        j:                  |                  D ]h  \  }\  }}tG        |t        j,                        }|tG        |t        j,                        k(  s
J |
 d
       |sM	 tI        ||d| jJ                  dd       j |S # 1 sw Y   LxY w# 1 sw Y   QxY w# t8        $ r Y `w xY w# tL        $ rB}tO        |||      rY d }~t=        |      dk(  r|
 d| n	|
 d| d| }tQ        |      |d }~ww xY w)Nr   )ShapeEnv)	shape_envT)static_shapeszWhen comparing the output of z* on FakeTensor and concrete Tensors, foundz mismatch in number of returns r-   z$ mismatched number of tensor outputs)r   r   r\   r      z mismatched tensor metadata: z' mismatched tensor metadata for output[z]: ))r@   
lift_freshrB   lift_fresh_copyrn   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   r9   	enumerateziprP   r   r~   	ExceptionrK   r	   )r   rH   typesargskwargsfake_rr   r`   	fake_argsfake_kwargsr.   rr_flatf_flatrI   r_outf_outr_is_tenrJ   error_messages                       r   __torch_dispatch__z#CrossRefFakeMode.__torch_dispatch__   sS   2
 ''$$,,		77 %%d+11$$//88>		..dii?		&&dii7		//tyy@ G#hj9 AY-3-A-A!)))*?*?tTv.*I{
 "002 A!%y!@K!@AA ,D6 2  	 $!&!''*F''/Fv;##  Y9#f+d3v;-XY  ""!QvK8P (1F&&q)6+=+=f+EF( J#^eU &eU\\::5<<$  DYBCD  J0!!"&$($6$6+/*.J4 aA AA A 2 J % J(sA6$  #6{a/  'i'DQCH$+9,STWSXX[\][^!_ &
 4MBIJsa   K6 +AK)		KK)K6 =LK&	!K))K3.K6 6	LL	MM!+MMr   )r   N)
__name__
__module____qualname__r   r   r   boolr   r   __classcell__)r   s   @r   r   r      sF     CGA !%AHj\4%78$>?A Rr+   r   ) TFTT)"r   r   typingr   r   r   r   torch.utils._pytreer   _pytreer   
torch._opsr   torch._subclasses.fake_tensorr   r   r	   r
   r   torch.utils._python_dispatchr   _opsopsr@   r   r$   r*   r9   rK   listr   r{   r   r   r   r+   r   <module>r      s      ' '  $ $ !  ; zz~~	Y
	
08A5S)*A	%
ELL#-
./AN 
llBc( cr+   