
    VhE?                     (   U d Z ddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlmZ ddlmZmZmZmZmZmZ ddlmZ ddlmZ ddlZddlmZ ddlmZ dd	lmZ d
dlm Z m!Z!m"Z"m#Z# d
dl$m%Z%m&Z&m'Z'm(Z( d
dl)m*Z*m+Z+m,Z, d
dl
m-Z-m.Z.m/Z/ d
dl0m1Z1 dZ2ee
jf                     e4d<   	 ddl5Z2e!jn                  Z7dZ8 ejr                  e:      Z; ed      Z<deejz                     deejz                     fdZ>de?de?fdZ@d ZAdej                  j                  dedededeDe   f
dZEdedeFfdZGedejz                  dejz                  fd        ZHedeeDe   eIed!f   eJeef   f   deKfd"       ZHdedeejz                  eKf   fd#ZHde?fd$ZLdgde?d%e
j                  d&e?ddfd'ZNdd(d)e.d*eOd+ed,ed-eOde-fd.ZP G d/ d0      ZQ G d1 d2      ZR G d3 d4      ZS G d5 d6      ZTd%e?de?fd7ZUd%e?de?fd8ZVd9e?de?fd:ZWd%e?de?fd;ZX	 	 	 dhd<ed=ed!ef   d>eOd?eeO   d@eeO   dAeOddfdBZYdCej                  deDejz                     ded!ef   fdDZ[	 	 didEeKdFeKdGeFdHeKde?f
dIZ\ej                  dJdfdKeeO   dLeeO   dMej                  dNee?ej                  f   dOeOdejz                  fdPZ` edQ      ZadeFfdRZbd=ee<eaf   dSedee<eaf   fdTZcddU dVdWeddXe?dYe?dSedZee?   d[eed!ef   ged!ef   f   dedfd\Zed=ed!ef   ded!ef   fd]Zfd=ed!ef   ded!ef   fd^Zgd=ed!ef   ded!ef   fd_Zhd=ed!ef   ded!ef   fd`Zid=ed!ef   ded!ef   fdaZjd=ed!ef   ded!ef   fdbZkd=ed!ef   ded!ef   fdcZld=ed!ef   ded!ef   fddZmdjdeeFddfdfZny# e6$ r dZ2Y w xY w)ka1  Testing utilities and infrastructure for Dynamo.

This module provides a comprehensive set of testing utilities including:
- Test result collection and validation
- Graph manipulation and comparison tools
- Test case management and execution helpers
- Specialized test decorators for different Python versions and features
- RNG state management
- Compilation counting and monitoring
- Debug utilities for bytecode transformation

The utilities in this module are used across Dynamo's test suite to ensure
consistent testing patterns and proper test isolation.
    N)Sequence)AnyCallableOptionaloverloadTypeVarUnion)	ParamSpec)patch)fx)	aot_eager)OutputGraph   )config
eval_frameoptimize_assertreset)create_instructiondebug_checksis_generatortransform_code_object)CheckFunctionManager	CompileIdGuardedCode)ConvertFrameReturnDynamoFrameTypewrap_guarded_code)samenp   _Pxreturnc                 v    | y | j                         j                         j                  | j                        S N)detachclonerequires_grad_requires_gradr"   s    E/home/dcms/DCMS/lib/python3.12/site-packages/torch/_dynamo/testing.pyclone_mer,   ?   s.    y88:,,Q__==    namec                 0    t        j                  dd|       S )Nz^_orig_mod[.] resub)r.   s    r+   remove_optimized_module_prefixr4   E       66"B--r-   c                     ddl m d d fd}  t        j                  |d      |       |i | j                  fS )Nr   )InstructionTranslatorc                 T    | j                         j                  j                  | S r%   )
current_txoutputregion_tracker)_gmargskwargsr7   gmr;   s      r+   extract_graph_backendz8extract_graph_and_tracker.<locals>.extract_graph_backendO   s)     .99;BBQQ
r-   T)backend	fullgraph)torch._dynamo.symbolic_convertr7   torchcompilegraph)fnr=   r>   r@   r7   r?   r;   s       @@@r+   extract_graph_and_trackerrH   I   sJ    D	BN E@EMM/4@DdUfU88^##r-   model
predictionlossexample_inputsc                    g }|j                  |       |j                  |       i }i }| j                         D ]f  \  }}t        | t        j                        rt        |      }|}	|j                  }
|j                  t        j                  |      }
|
||dz   <   |	||<   h |j                  |       |j                  |       i }| j                         D ]/  \  }}t        | t        j                        rt        |      }|||<   1 |j                  |       |D ]g  }t        |t        t        f      r|j                  d |D               2t        |t        j                        sM|j                  |j                         i |S )Nz.gradc              3   j   K   | ]+  }t        |t        j                        s|j                   - y wr%   )
isinstancerD   Tensorgrad).0inps     r+   	<genexpr>z"collect_results.<locals>.<genexpr>{   s!     X*S%,,:W388Xs   33)appendnamed_parametersrO   r   OptimizedModuler4   rQ   rD   
zeros_likenamed_bufferstuplelistextendrP   )rI   rJ   rK   rL   resultsgradsparamsr.   param
param_copyrQ   buffersbufferexamples                 r+   collect_resultsre   Z   sb    GNN:NN4 EF--/ 	"eeZ7781$7D
zz::##E*D $dWn!t	" NN5NN6G++- feZ7781$7D NN7! -gt}-NNXwXX'5<<0w||,- Nr-   outc                     t        | t        j                        r| j                  S t        | t        t
        f      rt        d | D              S | yt        | t              ryt        dt        |             )Nc              3   2   K   | ]  }t        |        y wr%   )requires_bwd_passrR   r"   s     r+   rT   z$requires_bwd_pass.<locals>.<genexpr>   s     5A$Q'5   FDon't know how to reduce)
rO   rD   rP   r)   r[   rZ   anyintNotImplementedErrortyperf   s    r+   ri   ri      sb    #u||$   	C$	'5555		C	
8$s)
DDr-   c                      y r%    rq   s    r+   reduce_to_scalar_lossrt      s    >Ar-   .c                      y r%   rs   rq   s    r+   rt   rt      s     r-   c                 Z   t        | t        j                        r!| j                         | j	                         z  S t        | t
        t        f      rt        d | D              t        |       z  S t        |       j                  dv rt        | j                        S t        |       j                  dk(  r| j                  j                         S t        | t              r:t        d | j                         D              t        | j                               z  S t!        dt        |             )z/Reduce the output of a model to get scalar lossc              3   2   K   | ]  }t        |        y wr%   rt   rj   s     r+   rT   z(reduce_to_scalar_loss.<locals>.<genexpr>   s     9(+9rk   )MaskedLMOutputSeq2SeqLMOutput!CausalLMOutputWithCrossAttentionsSquashedNormalc              3   2   K   | ]  }t        |        y wr%   rx   )rR   values     r+   rT   z(reduce_to_scalar_loss.<locals>.<genexpr>   s     JE(/Jrk   rl   )rO   rD   rP   sumnumelr[   rZ   lenrp   __name__rt   logitsmeandictvalueskeysro   rq   s    r+   rt   rt      s    #u||$wwy399;&&	C$	'9S99CHDD	c		   

 %SZZ00	c		/	/xx||~	C	JSZZ\JJSHHJN
 
 	
 8$s)
DDr-   c                      t         j                  j                  t         j                  j                  t              d      } t         j                  j                  |       st        j                  |        | S )Nz../debug)ospathjoindirname__file__existsmkdir)r   s    r+   	debug_dirr      sC    77<<1:>D77>>$
Kr-   codeextrac           	      J   t        t        j                  j                  t	               |       d      5 }|j                  t        j                  |      j                          dt        j                  |      j                          d| d       d d d        y # 1 sw Y   y xY w)Nwz


)	openr   r   r   r   writedisBytecodeinfo)r.   r   r   fds       r+   
debug_dumpr      s}    	bggll9;-s	3 
r
||D!&&()cll4.@.D.D.F-GtE7RTU	

 
 
s   ABB")skipframe
cache_sizehooks_r   c                   dt         t           dt        ddfd}t        j                  j                  j                         }t        j                  j                  j                  d      5  |5  t        | j                        rt               cddd       cddd       S t        | j                         t        | j                  |      }t        i dddddd	it               t               | j                  g 

      }t        t!        |t#        | j                  |      j$                  t'        d	d	                  cddd       cddd       S # 1 sw Y   nxY wddd       y# 1 sw Y   yxY w)zused to debug jump updatesinstructionscode_optionsr#   Nc                 p    | j                  dt        d             | j                  dt        d             y )Nr   NOP)insertr   )r   r   s     r+   insert_nopsz&debug_insert_nops.<locals>.insert_nops   s.    A1%89A1%89r-   debug_insert_nopsF_idr   )
r   compiler_fnroot_txexportexport_constraintsframe_statelocal_scopeglobal_scopef_codetorch_function_mode_stack)frame_idframe_compile_id)r[   r   rD   _dynamoutilsget_metrics_contextdynamo_timedr   r   r   r   r   r   localsglobalsr   r   r   guard_managerr   )	r   r   r   r   r   r   metrics_contextr   rF   s	            r+   r   r      s*   
:$s) :3 :4 : mm))==?O				)	)*=	> 
 
%%'
 
 
 	U\\"$U\\;?#
 <<&(
 !$U\\59GG1q9
)
 
 
 
 
 
 
s1   +E".E	E" BE:	E"E	E""E+c                   |    e Zd Zd	dZdej
                  j                  deej                     de	de
f   fdZd	dZy)
CompileCounterr#   Nc                      d| _         d| _        y Nr   frame_countop_countselfs    r+   __init__zCompileCounter.__init__       r-   r?   rL   .c                     | xj                   dz  c_         |j                  j                  D ]&  }d|j                  v s| xj                  dz  c_        ( |j
                  S )Nr   call)r   rF   nodesopr   forward)r   r?   rL   nodes       r+   __call__zCompileCounter.__call__   sR     	AHHNN 	#D "	# zzr-   c                      d| _         d| _        y r   r   r   s    r+   clearzCompileCounter.clear   r   r-   r#   N)r   
__module____qualname__r   rD   r   GraphModuler[   rP   r   r   r   r   rs   r-   r+   r   r      sE    ((&&8<U\\8J	#s(	r-   r   c                       e Zd ZdeddfdZdej                  j                  deej                     de
def   fdZd
d	Zy)CompileCounterWithBackendrA   r#   Nc                 <    d| _         d| _        || _        g | _        y r   )r   r   rA   graphs)r   rA   s     r+   r   z"CompileCounterWithBackend.__init__   s    24r-   r?   rL   .c                    ddl m} | xj                  dz  c_        |j                  j                  D ]&  }d|j
                  v s| xj                  dz  c_        ( | j                  j                  |         || j                        ||      S )Nr   )lookup_backendr   )
backends.registryr   r   rF   r   r   r   r   rU   rA   )r   r?   rL   r   r   s        r+   r   z"CompileCounterWithBackend.__call__   su     	6AHHNN 	#D "	# 	2+~dll+B??r-   c                 .    d| _         d| _        g | _        y r   )r   r   r   r   s    r+   r   zCompileCounterWithBackend.clear	  s    r-   r   )r   r   r   strr   rD   r   r   r[   rP   r   r   r   r   rs   r-   r+   r   r      sW    5 5 5
@((&&
@8<U\\8J
@	#s(	
@r-   r   c                   t    e Zd ZddZdej
                  j                  deej                     de	de
f   fdZy)	EagerAndRecordGraphsr#   Nc                     g | _         y r%   )r   r   s    r+   r   zEagerAndRecordGraphs.__init__  s	    24r-   r?   rL   .c                 P    | j                   j                  |       |j                  S r%   )r   rU   r   )r   r?   rL   s      r+   r   zEagerAndRecordGraphs.__call__  s      	2zzr-   r   r   r   r   r   rD   r   r   r[   rP   r   r   r   rs   r-   r+   r   r     s@    5((&&8<U\\8J	#s(	r-   r   c                   t    e Zd ZddZdej
                  j                  deej                     de	de
f   fdZy)	AotEagerAndRecordGraphsr#   Nc                 .    g | _         g | _        g | _        y r%   )r   	fw_graphs	bw_graphsr   s    r+   r   z AotEagerAndRecordGraphs.__init__  s    245757r-   r?   rL   .c                 p     j                   j                  |       dt        j                  j                  dt
        t        j                     dt        dt        f   f fd}dt        j                  j                  dt
        t        j                     dt        dt        f   f fd}t        ||||      S )Nr?   rL   r#   .c                 R    j                   j                  |        | j                  S r%   )r   rU   r   r?   rL   r   s     r+   fw_compilerz5AotEagerAndRecordGraphs.__call__.<locals>.fw_compiler'  !     NN!!"%::r-   c                 R    j                   j                  |        | j                  S r%   )r   rU   r   r   s     r+   bw_compilerz5AotEagerAndRecordGraphs.__call__.<locals>.bw_compiler-  r   r-   )r   r   )
r   rU   rD   r   r   r[   rP   r   r   r   )r   r?   rL   r   r   s   `    r+   r   z AotEagerAndRecordGraphs.__call__"  s     	2	$$	6:5<<6H	c3h		$$	6:5<<6H	c3h	 ##	
 	
r-   r   r   rs   r-   r+   r   r     s@    8

((&&
8<U\\8J
	#s(	
r-   r   c                 0    t        j                  dd|       S )Nz(?m)^ *#.*\n?r0   r1   )r   s    r+   strip_commentr   ;  r5   r-   c                     dj                  | j                  d      D cg c]  }|j                          c}      S c c}w )Nr   )r   splitrstrip)r   lines     r+   remove_trailing_spacer   ?  s.    99

40@AdkkmABBAs   =gm_strc                 *    t        t        |             S r%   )r   r   )r   s    r+   normalize_gmr   C  s     !v!677r-   c                 4    t        j                  dd|       }|S )z-
    Normalize code: remove empty lines.
    z[\r\n]+r   r1   )r   normal_codes     r+   empty_line_normalizerr   I  s     &&T40Kr-   r   rG   nargsexpected_opsexpected_ops_dynamicexpected_frame_countc                    t         j                  s||}t               }t        |      D cg c]  }t	        j
                  dd       }}t        |      D cg c]  }t	        j
                  dd       }	} || }
 ||	 }t                 t        |      |      } || } ||	 } || } ||	 }t                | j                  t        ||
             | j                  t        ||
             | j                  t        ||             | j                  t        ||             | j                  |j                  |       || j                  |j                  |       y y c c}w c c}w )N
   )r   assume_static_by_defaultr   rangerD   randnr   r   
assertTruer   assertEqualr   r   )r   rG   r   r   r   r   actualr   args1args2correct1correct2opt_fnval1aval2aval1bval2bs                    r+   standard_testr  Q  s?    **/C/O+F*/,7QU[[R 7E7*/,7QU[[R 7E75zH5zH	G$_V$R(FENEENEENEENE	GOOD)*OOD)*OOD)*OOD)*V'')=>,7  ! 87s   E"E'r?   c                     | j                   S r%   )r   )r?   rL   s     r+   dummy_fx_compiler  r  s     ::r-   speeduppvalue
is_correctpvalue_thresholdc                 0    |sy||kD  r| ddS | dd|dS )NERRORz.3fzx SAMEzx p=z.2frs   )r  r  r  r  s       r+   format_speedupr  x  s7       #f%%c]$vcl++r-   cpusizestridedtypedevice
extra_sizec                 ~   t        d t        | |      D              dz   |z   }|j                  r`|j                  dk(  r8	 t	        j
                  |t        j                  |      j                  |      }n2t	        j
                  |||      }nt	        j                  |g||      }t	        j                  || |      S )Nc              3   2   K   | ]  \  }}|d z
  |z    yw)r   Nrs   )rR   shaper  s      r+   rT   zrand_strided.<locals>.<genexpr>  s     H]UFUQY& Hrk   r   )r  r   )r  )r  r  r   )
r   zipis_floating_pointitemsizerD   r  float16tozeros
as_strided)r  r  r  r   r!  needed_sizerc   s          r+   rand_stridedr-    s     	Hc$6GHH
	
	 
 >>Q [[EMM&QTT U F [[E&IF;-uVLFD&11r-   _Tc                  $    t         j                   S r%   )r   r  rs   r-   r+   check_dynamic_shape_capturer0    s    ....r-   patchesc                      t        j                         dt        j                  dt        j                  dt
        f fd       }|S )Nr=   r>   r#   c            	          t        j                         5 }D ],  \  }}}|j                  t        j                  |||             .  | i |cd d d        S # 1 sw Y   y xY wr%   )
contextlib	ExitStackenter_contextr   object)r=   r>   stackmoduleattrvalrG   r1  s         r+   _fnz"_make_fn_with_patches.<locals>._fn  sh    !!# 	'u%, E!c##ELLs$CDE t&v&		' 	' 	's   9AA")	functoolswrapsr!   r=   r>   r.  )rG   r1  r<  s   `` r+   _make_fn_with_patchesr?    sB    __R'277 'bii 'B ' ' Jr-   c                     | S r%   rs   r*   s    r+   <lambda>rA    s    a r-   )
xfail_prop	decoratorcls
cls_prefix	fn_suffixrB  rC  c          	         t        | | j                   | j                  i       }|j                  |_        t	        |       D ]  }|j                  d      rt        | |      }t        |      st        ||t        | |             C| | }	t        |g| }
|	|
_        |!t        ||      rt        j                  |
      }
t        ||	 ||
             t        ||      rt        ||t        | |              |S )Ntest_)rp   r   	__bases__r   dir
startswithgetattrcallablesetattrr?  hasattrunittestexpectedFailure)rD  rE  rF  rB  rC  r1  DummyTestClassr.   rG   new_namenew_fns              r+   make_test_cls_with_patchesrU    s     ZL7KN"0"9"9NC >??7#d#BB<gc4.@A	{+H*288F&FO%'"j*A!11&9NHi.?@.ND'#t*<=>  r-   c                 V    t         j                  dk\  r| S t        j                  |       S )N)r       sysversion_inforP  r   rG   s    r+   skipIfNotPy311r\    s$    
7"	==r-   c                 b    t         j                  dk\  r| S  t        j                  d      |       S )Nr       zRequires Python 3.12+rX  r[  s    r+   skipIfNotPy312r`    s,    
7"	18==01"55r-   c                 V    t         j                  dk\  rt        j                  |       S | S )Nr^  )rY  rZ  rP  rQ  r[  s    r+   xfailIfPy312rb    s&    
7"''++Ir-   c                 b    t         j                  dk\  r t        j                  d      |       S | S )Nr^  zNot supported in Python 3.12+rX  r[  s    r+   skipIfPy312rd    s,    
7"=x}}<=bAAIr-   c                 b    t         j                  dk\  r| S  t        j                  d      |       S )N)r    r  zRequires Python 3.10+rX  r[  s    r+   requiresPy310rf    s,    
7"	5x}}45b99r-   c                     d| _         | S NT)_expected_failure_dynamicr[  s    r+   expectedFailureDynamicrj    s    #'B Ir-   c                     d| _         | S rh  )!_expected_failure_codegen_dynamicr[  s    r+   expectedFailureCodegenDynamicrm        +/B(Ir-   c                     d| _         | S rh  )!_expected_failure_dynamic_wrapperr[  s    r+   expectedFailureDynamicWrapperrq    rn  r-   use_xlac                    t        j                  d       t        j                  d       t        rt        j                  j                  d       | r3dd lmc m} |j                  dt        |j                                      y y )Ni9  r   )rD   manual_seedrandomseedr   torch_xla.core.xla_modelcore	xla_modelset_rng_stater   
xla_device)rr  xms     r+   reset_rng_stater}    sX    	d
KK	
		t--
s2==?34 r-   )r0   )NNr   )Tg?)F)o__doc__r4  r   r=  loggingos.pathr   ru  r2   rY  typesrP  collections.abcr   typingr   r   r   r   r   r	   typing_extensionsr
   unittest.mockr   rD   r    torch._dynamo.backends.debuggingr   torch._dynamo.output_graphr   r0   r   r   r   r   bytecode_transformationr   r   r   r   guardsr   r   r   r   r   r   r   r   r   
ModuleType__annotations__numpyModuleNotFoundErrorunsupportedthree	getLoggerr   logr!   rP   r,   r   r4   rH   nnModuler[   re   boolri   rt   rZ   r   floatr   CodeTyper   rn   r   r   r   r   r   r   r   r   r   r  r   r  r  float32r  r   r-  r.  r0  r?  rp   rU  r\  r`  rb  rd  rf  rj  rm  rq  r}  rs   r-   r+   <module>r     s    
     	 
   $ D D '    6 2 8 8  A @ I I  "&HU %
 $$	g!t_>& >8ELL+A >. . .$"%88??%(+%36%HK%	#Y%P	E3 	E4 	E 
 Au|| A A 
 A 
	tCy%S/4S>9	:
 

Es EuU\\5-@'A E,3 
S 
 
s 
D 
 QR$
$
(+$
47$
<?$
JM$
$
N & 6 
 
>. . .C C C8 8 8   #'*. !8
8c8 8 3-	8
 #3-8 8 
8B
(,U\\(:c3h !	
,
,
, 
, 	
,
 	
,  ',2
3-2SM2 ;;2 #u||#$	2
 2 \\28 T]/T /
	hr2v. 	# 	(2r6BR 	" !%DO	  	
  #s(+,hsCx.@@A 
>xS) hsCx.@ 6xS) 6hsCx.@ 6Xc3h' HS#X,> HS#X& 8CH+= :hsCx( :Xc3h-? :xS1 hsCx6H hsCx&8 Xc3h=O hsCx&8 Xc3h=O 
5T 5d 5g  	Bs   +N NN