
    /j*                    &   d dl mZ d dlZd dlZd dlmZmZ d dlZd dlm	c m
Z d dlmZmZmZmZmZ d dlmZ erd dlmZmZmZ d dlmZ d dlmZ ej        j        j        Zd0dZd0dZd1dZ d2dZ!d3dZ"d4d#Z#	 	 	 	 	 d5d6d-Z$ G d. d/e          Z%dS )7    )annotationsN)AnyTYPE_CHECKING)
FakeTensorFakeTensorModeMetadataMismatchErrortree_flatten_onlyUnsupportedFakeTensorException)TorchDispatchMode)CallableMappingSequence)
OpOverload)PyTreeoutputsr   inputsreturnboolc                    d t          t          j        |          D             t          fdt          t          j        |           D                       S )Nc                ~    h | ]:}t           j                            |          !|                                j        ;S  torch_C_has_storage_typed_storage_cdata.0inps     a/home/longshao/multi-rider-rag/.venv/lib/python3.11/site-packages/torch/_subclasses/fake_utils.py	<setcomp>z'outputs_alias_inputs.<locals>.<setcomp>   sM       8  %%#      c              3     K   | ]>}t           j                            |          o|                                j        v V  ?d S Nr   )r   outinput_storagess     r!   	<genexpr>z'outputs_alias_inputs.<locals>.<genexpr>#   s`         	c""Ts'9'9';';'Bn'T     r#   r	   r   Tensorany)r   r   r'   s     @r!   outputs_alias_inputsr,      ss     $U\6::  N
     $U\7;;     r#   c                    d t          t          j        |          D             t          fdt          t          j        |           D                       S )Nc                ,    h | ]}t          |          S r   idr   s     r!   r"   z%outputs_are_inputs.<locals>.<setcomp>*   s    LLLSCLLLr#   c              3  :   K   | ]}t          |          v V  d S r%   r/   )r   r&   	input_idss     r!   r(   z%outputs_are_inputs.<locals>.<genexpr>+   s.      XXr#ww)#XXXXXXr#   r)   )r   r   r2   s     @r!   outputs_are_inputsr3   )   sS    LL$5elF$K$KLLLIXXXX/@w/W/WXXXXXXr#   c                   t                      }t          t          j        |           D ]W}t          j                            |          s"|                                j        }||v r dS |                    |           XdS )NTF)	setr	   r   r*   r   r   r   r   add)r   storagesr&   stors       r!   output_alias_each_otherr9   .   s    uuH w77  x$$S)) 	!!##*844T5r#   contextstrreal_outreal_infake_outfake_inNonec                p   t          ||          }t          ||          }||k    rt          |  d| d|           t          ||          }t          ||          }||k    rt          |  d| d|           t          |          }	t          |          }
|	|
k    rt          |  d|
 d|	           d S )Nz( mismatch in outputs_alias_inputs check  != z& mismatch in outputs_are_inputs check z, mismatch in outputs_alias_each_other check )r,   r   r3   r9   )r:   r<   r=   r>   r?   
r_aliasing
f_aliasingr_identity_eqf_identity_eqr_output_alias_each_otherf_output_alias_each_others              r!   _check_alias_inforI   :   s!    &h88J%h88JZ#\\
\\PZ\\
 
 	
 'x99M&x99M%%#``m``Q^``
 
 	
 !8 A A 7 A A $===# J J(J J.GJ J
 
 	
 >=r#   funcr   idxinte	Exceptionc                N   | t           j        j        u s| t           j        j        u r|dv rdt	          |          v rdS | t           j        j        u s| t           j        j        u r|dv rdt	          |          v rdS | t           j        j        u r|dv rdt	          |          v rdS dS )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)rJ   rK   rM   s      r!   is_sdpa_errorr]   X   s     D<DDDt4<<<6MMa  t D@HHHt8@@@6MMa  t8@@@6MMa  t5r#   ten_listlist[FakeTensor | Any]%list[FakeTensor | torch.Tensor | Any]c                   t          d | D             d          }|| S |j        }|j        j        }|j        }d |j                                        D             }d |j                                        D             }g }| D ]m}t          |t                    r|j
        t          j        k    r|                    |           C|                    |                                          }	|	dn|                    |	          }
|
|                    |           ddfd
 |                                          }fd|j        D             }fd|                                D             }r|                    |           t          j        g |j        |j                  }|                    |
|||           |                    |                                           o|S )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  D   K   | ]}t          |t                    |V  d S r%   )
isinstancer   )r   items     r!   r(   z+try_convert_fake_to_real.<locals>.<genexpr>   s1      CC$jz&B&BCCCCCCCr#   Nc                    i | ]\  }}||	S r   r   r   kvs      r!   
<dictcomp>z,try_convert_fake_to_real.<locals>.<dictcomp>   s    KKKtq!aKKKr#   c                    i | ]\  }}||	S r   r   rf   s      r!   ri   z,try_convert_fake_to_real.<locals>.<dictcomp>   s    HHHDAq1aHHHr#   Fstorch.SymInt | intr   rL   c                    t          | t          j                  s| S sn| j                                        | j        j        S r%   )rc   r   SymIntnodehas_hinthint)rk   unhinteds    r!   
map_symintz,try_convert_fake_to_real.<locals>.map_symint   s@    a.. '/FxxQV__5F5FH6;r#   c                &    g | ]} |          S r   r   r   rk   rs   s     r!   
<listcomp>z,try_convert_fake_to_real.<locals>.<listcomp>   s!    ///!

1///r#   c                &    g | ]} |          S r   r   ru   s     r!   rv   z,try_convert_fake_to_real.<locals>.<listcomp>   s!    444A**Q--444r#   )dtypedevice)storage_offsetsizestride)rk   rl   r   rL   )next	fake_modefake_tensor_convertermeta_converter	describerstorage_memoitemslookup_storagerc   r   layoutr   stridedappendgetuntyped_storagerz   shaper|   emptyrx   ry   set_clone)r^   fake_tensorr~   r   descstorage_to_keykey_to_real_storager&   tkeyreal_storagestor_offsetr{   r|   
new_tensorrs   rr   s                  @@r!   try_convert_fake_to_realr   t   s8    CC(CCCT K %I4CN#DKK~'B'H'H'J'JKKKNHHD,?,E,E,G,GHHH
C '' ''!Z(( 	AH,E,EJJqMMM  !2!2!4!455"{tt0C0G0G0L0LJJqMMM	 	 	 	 	 	 !j!1!1!3!344////qw///4444444 	JJqMMM['8
 
 


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

:##%%&&&&Jr#    TFtorch.Tensorr   sizesstridesrz   requires_gradc                ^   |r"| j         |j         k    rt          | d          t          j                            |           r@|                                 }|                                }||k    rt          | d          t          j        j                            | |||d           d S )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)	r   r   r   r   r   rz   _primsutilscompare_tensor_meta)	r<   r>   r:   r   r   rz   r   r_offsetf_offsets	            r!   _check_fake_real_tensorsr      s      !X%;;;' / / /   xX&& P**,,**,,x'7(N(N(NOOO	L** +     r#   c                  <     e Zd Z	 dddddd fdZ	 	 dddZ xZS )CrossRefFakeModeNT)r   check_aliasingonly_check_ops_with_metaignore_op_fn#Callable[[OpOverload], bool] | Noner   r   r   r   r   r@   c                   t                                                       ||nd | _        || _        || _        || _        d S )Nc                    dS )NFr   )fns    r!   <lambda>z+CrossRefFakeMode.__init__.<locals>.<lambda>   s    U r#   )super__init__r   r   r   r   )selfr   r   r   r   	__class__s        r!   r   zCrossRefFakeMode.__init__   sS     	(4LL:J:J 	 +,(@%%%r#   r   rJ   r   typesSequence[type]argsSequence[object]kwargsMapping[str, object] | Noneobjectc           	     v   |pi }d }d}i }|t           j        j        t           j        j        t           j        j        fvrC|                     |          s-| j        r%t          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/          j        |	j        d          ||f          \  }}t5          j                    5   ||i |}d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   n# t8          $ r Y nw xY wd| d}
 ||i |}|t)          j        |          }t)          j        |          }t=          |          t=          |          k    r1t?          |
 d	t=          |           d
t=          |                     | j         rtC          |
|||f|||f           tE          tG          t)          j        |          t)          j        |                              D ]\  }\  }}tI          |t          j                  }|tI          |t          j                  k    rt?          |
 d          |rx	 tK          ||d| j&        dd           p# tN          $ rO}tQ          |||          rY d }~t=          |          dk    r|
 d| n	|
 d| d| }tS          |          |d }~ww xY w|S )Nr   r   )ShapeEnv)	shape_envT)static_shapeszWhen comparing the output of z* on FakeTensor and concrete Tensors, foundz mismatch in number of returns rB   z$ mismatched number of tensor outputs)r   r   rz   r      z mismatched tensor metadata: z' mismatched tensor metadata for output[z]: )*rU   
lift_freshrW   lift_fresh_copyr   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lenAssertionErrorr   rI   	enumerateziprc   r   r   rN   r]   r   )r   rJ   r   r   r   fake_r	fake_argsfake_kwargsr   r~   r:   rr_flatf_flatrK   r_outf_outr_is_tenrM   error_messages                       r!   __torch_dispatch__z#CrossRefFakeMode.__torch_dispatch__   s    2&(	,.
 '$,	7  %%d++ 1 $/88>> 	.di??	&di77	/ty@@ GFFFFF#hhjj999 AY-3-A!))*?tTTTv. .*I{
 "022 A A!%y!@K!@!@A A A A A A A A A A A A A A AA A A A A A A A A A A A A A A 2   D    	 D$!&!!'**F'//F6{{c&kk))$]]s6{{]]PSTZP[P[]]   " !QvK8P   (1F&q))6+=f+E+EFF( ( J J#^eU &eU\::z%>>>>("HHH    JJ0!!"&$($6+/*.     % J J J(sA66 %$HHHH  #6{{a//  'HHQHHH$+!_!_TW!_!_\]!_!_ &
 4MBBIJJ& sy   E3 )AE';	EE'E	E'E	E'E3 'E++E3 .E+/E3 3
F ?F K
L5&L0<4L00L5r%   )
r   r   r   r   r   r   r   r   r   r@   )r   N)
rJ   r   r   r   r   r   r   r   r   r   )__name__
__module____qualname__r   r   __classcell__)r   s   @r!   r   r      s         =AA ##)-A A A A A A A A( "$.2\ \ \ \ \ \ \ \ \r#   r   )r   r   r   r   r   r   )r   r   r   r   )r:   r;   r<   r   r=   r   r>   r   r?   r   r   r@   )rJ   r   rK   rL   rM   rN   r   r   )r^   r_   r   r`   )r   TFTT)r<   r   r>   r   r:   r;   r   r   r   r   rz   r   r   r   r   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opsrU   r,   r3   r9   rI   r]   r   r   r   r   r#   r!   <module>r      s   " " " " " "      % % % % % % % %  $ $ $ $ $ $ $ $ $              ; : : : : :  +;;;;;;;;;;%%%%%%****** z~	 	 	 	Y Y Y Y
	 	 	 	
 
 
 
<   8A A A AN     Bm m m m m( m m m m mr#   