
    %Vji0(                     N   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!dS )    N)AnyCallableUnion)
OpOverload)
FakeTensorFakeTensorModeMetadataMismatchErrortree_flatten_onlyUnsupportedFakeTensorException)TorchDispatchModec                     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     V/root/voice-cloning/.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)outputsinputsr   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%   r,   s     @r   outputs_are_inputsr-   #   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_otherr3   (   s    uuH w77  x$$S)) 	!!##*844T5r   c                 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	   r-   r3   )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_inforA   4   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   c                 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)funcidxes      r   is_sdpa_errorrS   L   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returnc                    t          d | D             d          }|| S |j        }|j        j        }|j        }d |j                                        D             }d |j                                        D             }g }| D ]l}t          |t                    r|j
        t          j        k    s|                    |           C|                    |                                          }	|	dn|                    |	          }
|
|                    |           dfd |                                          }fd|j        D             }fd|                                D             }r|                    |           t          j        g |j        |j        	          }|                    |
|||
           |                    |                                           n|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>t   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   r[   s      r   r^   z,try_convert_fake_to_real.<locals>.<dictcomp>~   s    HHHDAq1aHHHr   Fc                     t          | t          j                  s| S sn| j                                        | j        j        S r   )rX   r   SymIntnodehas_hinthint)sunhinteds    r   
map_symintz,try_convert_fake_to_real.<locals>.map_symint   s@    a.. '/FxxQV__5F5FH6;r   c                 &    g | ]} |          S r   r   r   re   rg   s     r   
<listcomp>z,try_convert_fake_to_real.<locals>.<listcomp>   s!    ///!

1///r   c                 &    g | ]} |          S r   r   ri   s     r   rj   z,try_convert_fake_to_real.<locals>.<listcomp>   s!    444A**Q--444r   )dtypedevice)storage_offsetsizestride)next	fake_modefake_tensor_convertermeta_converter	describerstorage_memoitemslookup_storagerX   r   layoutr   stridedappendgetuntyped_storagern   shaperp   emptyrl   rm   set_clone)rT   fake_tensorrr   rt   descstorage_to_keykey_to_real_storager   tkeyreal_storagestor_offsetro   rp   
new_tensorrg   rf   s                  @@r   try_convert_fake_to_realr   h   s3    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(( 	EM0I0I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    TFr7   r9   c                 ^   |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)	requires_gradr	   r   r   r   rn   _primsutilscompare_tensor_meta)	r7   r9   r6   sizesstridesrn   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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                    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   c           	      Z   |pi }d }|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    s,J |
 dt=          |           d	t=          |                       | j        rtA          |
|||f|||	f           tC          tE          t)          j        |          t)          j        |                              D ]\  }\  }}tG          |t          j                  }|tG          |t          j                  k    sJ |
 d
            |rx	 tI          ||d| j%        dd           k# tL          $ rO}tO          |||          rY d }~t=          |          dk    r|
 d| n	|
 d| d| }tQ          |          |d }~ww xY w|S )Nr   )ShapeEnv)	shape_envT)static_shapeszWhen comparing the output of z* on FakeTensor and concrete Tensors, foundz mismatch in number of returns r5   z$ mismatched number of tensor outputs)r   r   rn   r      z mismatched tensor metadata: z' mismatched tensor metadata for output[z]: ))rH   
lift_freshrJ   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lenr   rA   	enumerateziprX   r   r   	ExceptionrS   r	   )r   rP   typesargskwargsfake_rr   rr   	fake_argsfake_kwargsr6   rr_flatf_flatrQ   r_outf_outr_is_tenrR   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v;;#f++---YY3v;;YYCPVKKYY .-- " !QvK8P   (1F&q))6+=f+E+EFF( ( J J#^eU &eU\:::eU\#B#BBBBDDD CBB  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   E/ %AE#7	E E#E	E#E	E#E/ #E''E/ *E'+E/ /
E<;E<3K
L'L".4L""L'r   )r   N)
__name__
__module____qualname__r   r   r   boolr   r   __classcell__)r   s   @r   r   r      s         CGA !%A A AHj\4%78$>?A A A A A A R R R R R R R R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opsrH   r&   r-   r3   rA   rS   listr"   r   r   r   r   r   r   <module>r      s        ' ' ' ' ' ' ' ' ' '  $ $ $ $ $ $ $ $ $ ! ! ! ! ! !              ; : : : : : z~	 	 	Y Y Y
	 	 	
 
 
0  8A5S)*A	%
EL#-
./A A A AN 
 l   Bc c c c c( c c c c cr   