o
    i]G                     @   s  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mZ ddl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l0m1Z1m2Z2 dZ3ee
j4 e5d< zddl6Z3W n e7y   dZ3Y nw e!j8Z8dZ9e:e;Z<edZ=deej> deej> fddZ?de@de@fddZAdd ZBdd ZCdejDjEded ed!edeFe f
d"d#ZGd$edeHfd%d&ZIed$ej>dej>fd'd(ZJed$eeFe eKed)f eLeef f deMfd*d(ZJd$edeej>eMf fd+d(ZJde@fd,d-ZNdde@d/e
jOd0e@ddfd1d2ZPdd3d4e.d5eQd6ed7ed8eQde-fd9d:ZRG d;d< d<ZSG d=d> d>ZTG d?d@ d@ZUG dAdB dBZVG dCdD dDZWd/e@de@fdEdFZXd/e@de@fdGdHZYd/e@de@fdIdJZZdKe@de@fdLdMZ[d/e@de@fdNdOZ\			
ddPedQed)ef dReQdSeeQ dTeeQ dUeQddfdVdWZ]dXej^d!eFej> ded)ef fdYdZZ_	[	\dd]eMd^eMd_eHd`eMde@f
dadbZ`ejadcdfddeeQ deeeQ dfejbdgee@ejcf dheQdej>fdidjZdedkZedeHfdldmZfdQee=eef dnedee=eef fdodpZgddqdr dsdtehdue@dve@dnedwee@ dxeed)ef ged)ef f dehfdydzZidQee=eef dee=eef fd{d|ZjdQee=eef dee=eef fd}d~ZkdQee=eef dee=eef fddZldQee=eef dee=eef fddZmdQee=eef dee=eef fddZndQee=eef dee=eef fddZodQee=eef dee=eef fddZpdQee=eef dee=eef fddZqddeHddfddZrdee=eef de=jsde=jtdeefddZudS )a1  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)CallableSequence)Any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)CompileCounterIntsamenp   _Pxreturnc                 C   s    | d u rd S |    | jS N)detachclonerequires_grad_requires_gradr"    r*   W/sda-disk/www/egybert/egybert_env/lib/python3.10/site-packages/torch/_dynamo/testing.pyclone_me?   s   r,   namec                 C      t dd| S )Nz^_orig_mod[.] resub)r-   r*   r*   r+   remove_optimized_module_prefixE      r3   c                    sJ   ddl m  d d  fdd}tj|dd| |i | jfS )Nr   )InstructionTranslatorc                    s   |    jj| S r$   )
current_txoutputregion_tracker)_gmargskwargsr5   gmr8   r*   r+   extract_graph_backendO   s   z8extract_graph_and_tracker.<locals>.extract_graph_backendT)backend	fullgraph)torch._dynamo.symbolic_convertr5   torchcompilegraph)fnr:   r;   r>   r*   r<   r+   extract_graph_and_trackerI   s   
rF   c                 O   s2   t  }tj|d| |i |}||j|j|jfS )N)r?   )AotEagerAndRecordGraphsrB   rC   graphs	fw_graphs	bw_graphs)rE   r:   r;   r?   resultr*   r*   r+   extract_graphZ   s   rL   model
predictionlossexample_inputsc                 C   s  g }| | | | i }i }|  D ]'\}}t| tjr"t|}|}	|j}
|jd u r1t|}
|
||d < |	||< q| | | | i }| 	 D ]\}}t| tjrZt|}|||< qL| | |D ] }t|t
tfrz|dd |D  qft|tjr| |j qf|S )Nz.gradc                 s   s"    | ]}t |tjr|jV  qd S r$   )
isinstancerB   Tensorgrad).0inpr*   r*   r+   	<genexpr>   s     z"collect_results.<locals>.<genexpr>)appendnamed_parametersrQ   r   OptimizedModuler3   rS   rB   
zeros_likenamed_bufferstuplelistextendrR   )rM   rN   rO   rP   resultsgradsparamsr-   param
param_copyrS   buffersbufferexampler*   r*   r+   collect_results`   s:   








rg   outc                 C   sZ   t | tjr	| jS t | ttfrtdd | D S | d u rdS t | tr&dS tdt	| )Nc                 s       | ]}t |V  qd S r$   )requires_bwd_passrT   r"   r*   r*   r+   rV          z$requires_bwd_pass.<locals>.<genexpr>FDon't know how to reduce)
rQ   rB   rR   r(   r]   r\   anyintNotImplementedErrortyperh   r*   r*   r+   rj      s   
rj   c                 C      d S r$   r*   rr   r*   r*   r+   reduce_to_scalar_loss   s   rt   .c                 C   rs   r$   r*   rr   r*   r*   r+   rt      s   c                 C   s   t | tjr|  |   S t | ttfr"tdd | D t|  S t| j	dv r.t
| jS t| j	dkr:| j S t | trPtdd |  D t|   S tdt| )z/Reduce the output of a model to get scalar lossc                 s   ri   r$   rt   rk   r*   r*   r+   rV      rl   z(reduce_to_scalar_loss.<locals>.<genexpr>)MaskedLMOutputSeq2SeqLMOutput!CausalLMOutputWithCrossAttentionsSquashedNormalc                 s   ri   r$   ru   )rT   valuer*   r*   r+   rV      rl   rm   )rQ   rB   rR   sumnumelr]   r\   lenrq   __name__rt   logitsmeandictvalueskeysrp   rr   r*   r*   r+   rt      s   


c                  C   s0   t jt jtd} t j| st |  | S )Nz../debug)ospathjoindirname__file__existsmkdir)r   r*   r*   r+   	debug_dir   s   
r   r/   codeextrac              	   C   sl   t tjt | d!}|t|  dt|  d| d W d    d S 1 s/w   Y  d S )Nwz


)	openr   r   r   r   writedisBytecodeinfo)r-   r   r   fdr*   r*   r+   
debug_dump   s
   ("r   )skipframe
cache_sizehooks_r   c          	      C   s  dt t dtddfdd}tjj }tjjdj |W t| jr4t	 W  d   W  d   S t
| j t| j|\}}ti dddg d	d
it t | jg dd}tt|t| j|jtd
d
dW  d   W  d   S 1 sww   Y  W d   dS 1 sw   Y  dS )zused to debug jump updatesinstructionscode_optionsr#   Nc                 S   s$   |  dtd |  dtd d S )Nr   NOP)insertr   )r   r   r*   r*   r+   insert_nops   s   z&debug_insert_nops.<locals>.insert_nopsdebug_insert_nopsF_idr   )r   compiler_fnroot_txexportexport_constraintsframe_statelocal_scopeglobal_scopef_codetorch_function_mode_stackpackage)frame_idframe_compile_id)r]   r   rB   _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   rD   r*   r*   r+   r      s:   


Rr   c                   @   sH   e Zd ZdddZdejjdeej de	de
f fdd	Zdd
dZdS )CompileCounterr#   Nc                 C   s   d| _ |   d S Nr   )frame_countclearselfr*   r*   r+   __init__   s   zCompileCounter.__init__r=   rP   .c                 C   s:   |  j d7  _ |jjD ]}d|jv r|  jd7  _q|jS )Nr   call)r   rD   nodesopop_countforward)r   r=   rP   noder*   r*   r+   __call__   s   
zCompileCounter.__call__c                 C   s"   t jr	td| _nd| _d| _d S r   )r   debug_disable_compile_counterr   r   r   r   r*   r*   r+   r      s   
zCompileCounter.clearr#   N)r~   
__module____qualname__r   rB   r   GraphModuler]   rR   r   r   r   r   r*   r*   r*   r+   r      s    


	r   c                   @   sP   e Zd ZdeddfddZdejjdeej	 de
def fd	d
ZdddZdS )CompileCounterWithBackendr?   r#   Nc                 C   s   d| _ || _g | _|   d S r   )r   r?   rH   r   )r   r?   r*   r*   r+   r     s   z"CompileCounterWithBackend.__init__r=   rP   .c                 C   s\   ddl m} |  jd7  _|jjD ]}d|jv r|  jd7  _q| j| || j	||S )Nr   )lookup_backendr   )
backends.registryr   r   rD   r   r   r   rH   rW   r?   )r   r=   rP   r   r   r*   r*   r+   r     s   
z"CompileCounterWithBackend.__call__c                 C   s(   t jr	td| _nd| _d| _g | _d S r   )r   r   r   r   r   rH   r   r*   r*   r+   r     s
   
zCompileCounterWithBackend.clearr   )r~   r   r   strr   rB   r   r   r]   rR   r   r   r   r   r*   r*   r*   r+   r      s    

r   c                   @   >   e Zd Zd
ddZdejjdeej de	de
f fdd	ZdS )EagerAndRecordGraphsr#   Nc                 C   s
   g | _ d S r$   )rH   r   r*   r*   r+   r     s   
zEagerAndRecordGraphs.__init__r=   rP   .c                 C   s   | j | |jS r$   )rH   rW   r   )r   r=   rP   r*   r*   r+   r   "     zEagerAndRecordGraphs.__call__r   r~   r   r   r   rB   r   r   r]   rR   r   r   r   r*   r*   r*   r+   r     s    

r   c                   @   r   )rG   r#   Nc                 C   s   g | _ g | _g | _d S r$   )rH   rI   rJ   r   r*   r*   r+   r   *  s   
z AotEagerAndRecordGraphs.__init__r=   rP   .c                    st    j | dtjjdttj dtdtf f fdd}dtjjdttj dtdtf f fdd}t	||||d	S )
Nr=   rP   r#   .c                        j |  | jS r$   )rI   rW   r   r=   rP   r   r*   r+   fw_compiler4  r   z5AotEagerAndRecordGraphs.__call__.<locals>.fw_compilerc                    r   r$   )rJ   rW   r   r   r   r*   r+   bw_compiler:  r   z5AotEagerAndRecordGraphs.__call__.<locals>.bw_compiler)r   r   )
rH   rW   rB   r   r   r]   rR   r   r   r   )r   r=   rP   r   r   r*   r   r+   r   /  s*   

z AotEagerAndRecordGraphs.__call__r   r   r*   r*   r*   r+   rG   )  s    

rG   c                   @   s   e Zd ZdddZdd ZdS )InductorAndRecordGraphsr#   Nc                 C   s   g | _ g | _d S r$   )rH   inductor_graphsr   r*   r*   r+   r   I  s   
z InductorAndRecordGraphs.__init__c                    sr   dd l m  m} j| |j  fdd}tj|d|d |||W  d    S 1 s2w   Y  d S )Nr   c                     s   j | d   | i |S r   )r   rW   )r:   r;   old_compile_fx_innerr   r*   r+   patchedT  s   z1InductorAndRecordGraphs.__call__.<locals>.patched_compile_fx_inner)new)torch._inductor.compile_fx	_inductor
compile_fxrH   rW   r   r
   object)r   r=   rP   compile_fx_modr   r*   r   r+   r   M  s   
$z InductorAndRecordGraphs.__call__r   )r~   r   r   r   r   r*   r*   r*   r+   r   H  s    
r   c                 C   r.   )Nz(?m)^ *#.*\n?r/   r0   r   r*   r*   r+   strip_comment\  r4   r   c                 C   s   d dd | dD S )Nr   c                 S   s   g | ]}|  qS r*   )rstrip)rT   liner*   r*   r+   
<listcomp>a  s    z)remove_trailing_space.<locals>.<listcomp>)r   splitr   r*   r*   r+   remove_trailing_space`  s   r   c                 C   sL   |  d}g }d}|D ]}| dkr|rqd}nd}|| qd|S )Nr   Fr/   T)r   striprW   r   )r   linesrK   	saw_blankr   r*   r*   r+   _squash_blank_linesd  s   

r   gm_strc                 C   s   t | }t|}t|S r$   )r   r   r   )r   strippedno_trailingr*   r*   r+   normalize_gms  s   r   c                 C   s   t dd| }|S )z-
    Normalize code: remove empty lines.
    z[\r\n]+r   r0   )r   normal_coder*   r*   r+   empty_line_normalizer{  s   r   r   rE   nargsexpected_opsexpected_ops_dynamicexpected_frame_countc                 C   s   t js	|d ur	|}t }dd t|D }dd t|D }|| }	|| }
t  t||}|| }|| }|| }|| }t  | t||	 | t||	 | t||
 | t||
 | |j	| |d urv| |j
| d S d S )Nc                 S      g | ]}t d d qS 
   rB   randnrT   r   r*   r*   r+   r         z!standard_test.<locals>.<listcomp>c                 S   r   r   r   r   r*   r*   r+   r     r   )r   assume_static_by_defaultr   ranger   r   
assertTruer   assertEqualr   r   )r   rE   r   r   r   r   actualargs1args2correct1correct2opt_fnval1aval2aval1bval2br*   r*   r+   standard_test  s,   r  r=   c                 C   s   | j S r$   )r   r   r*   r*   r+   dummy_fx_compile  s   r  T皙?speeduppvalue
is_correctpvalue_thresholdc                 C   s.   |sdS ||kr| ddS | dd|dS )NERRORz.3fzx SAMEzx p=z.2fr*   )r  r  r  r  r*   r*   r+   format_speedup  s
   r  cpusizestridedtypedevice
extra_sizec                 C   s   |}t dd | D r|tdd t| |D d 7 }|jr;|jdkr2	 tj|tj|dj|d}ntj|||d}n	tj	|g||d}t
|| |S )Nc                 s   s    | ]}|d kV  qdS )r   Nr*   )rT   sr*   r*   r+   rV     rl   zrand_strided.<locals>.<genexpr>c                 s   s     | ]\}}|d  | V  qdS )r   Nr*   )rT   shaper  r*   r*   r+   rV     s    r   )r  r  )r  )r  r  r  )allr{   zipis_floating_pointitemsizerB   r   float16tozeros
as_strided)r  r  r  r  r  needed_sizere   r*   r*   r+   rand_strided  s   
r&  _Tc                   C   s   t j S r$   )r   r   r*   r*   r*   r+   check_dynamic_shape_capture  s   r(  patchesc                    s.   t  dtjdtjdtf fdd}|S )Nr:   r;   r#   c               	      s^   t  !}D ]\}}}|t||| q | i |W  d    S 1 s(w   Y  d S r$   )
contextlib	ExitStackenter_contextr
   r   )r:   r;   stackmoduleattrvalrE   r)  r*   r+   _fn  s
   
$z"_make_fn_with_patches.<locals>._fn)	functoolswrapsr!   r:   r;   r'  )rE   r)  r2  r*   r1  r+   _make_fn_with_patches  s   "r5  c                 C   s   | S r$   r*   r)   r*   r*   r+   <lambda>  s    r6  )
xfail_prop	decoratorcls
cls_prefix	fn_suffixr7  r8  c                G   s   t | | j | ji }|j|_t| D ]P}|drVt| |}t|s.t||t| | q| | }	t	|g|R  }
|	|
_|d urMt
||rMt|
}
t||	||
 qt
||sdt||t| | q|S )Ntest_)rq   r~   	__bases__r   dir
startswithgetattrcallablesetattrr5  hasattrunittestexpectedFailure)r9  r:  r;  r7  r8  r)  DummyTestClassr-   rE   new_namenew_fnr*   r*   r+   make_test_cls_with_patches  s$   



rI  c                 C   s   t jdkr| S t| S )N)r       sysversion_inforD  r   rE   r*   r*   r+   skipIfNotPy311  s   

rO  c                 C   s   t jdkr| S td| S )Nr       zRequires Python 3.12+rK  rN  r*   r*   r+   skipIfNotPy312  s   
rR  c                 C   s&   t jdks
t jdk rtd| S | S )N)r       rP  zRequires Python 3.12rK  rN  r*   r*   r+   skipIfOnlyNotPy312  s   rT  c                 C   s   t jdkr
t| S | S )NrP  )rL  rM  rD  rE  rN  r*   r*   r+   xfailIfPy312  s   

rU  c                 C   s   t jdkrtd| S | S )NrP  zNot supported in Python 3.12+rK  rN  r*   r*   r+   skipIfPy312   s   
rV  c                 C   
   d| _ | S NT)_expected_failure_dynamicrN  r*   r*   r+   expectedFailureDynamic(     rZ  c                 C   rW  rX  )!_expected_failure_codegen_dynamicrN  r*   r*   r+   expectedFailureCodegenDynamic.  r[  r]  c                 C   rW  rX  )!_expected_failure_dynamic_wrapperrN  r*   r*   r+   expectedFailureDynamicWrapper4  r[  r_  Fuse_xlac                 C   sV   t d td trtjd | r)dd lm  m} |dt	|
  d S d S )Ni9  r   )rB   manual_seedrandomseedr   torch_xla.core.xla_modelcore	xla_modelset_rng_stater   
xla_device)r`  xmr*   r*   r+   reset_rng_state9  s   

rj  fr:   r;   c                 O   s   | |i |S r$   r*   )rk  r:   r;   r*   r*   r+   &_skipped_function_for_test_reconstructD  s   rl  )r/   )NNr   )Tr  )F)v__doc__r*  r   r3  loggingos.pathr   rb  r1   rL  typesrD  collections.abcr   r   typingr   r   r   r   r   typing_extensionsr	   unittest.mockr
   rB   r    torch._dynamo.backends.debuggingr   torch._dynamo.output_graphr   r/   r   r   r   r   bytecode_transformationr   r   r   r   guardsr   r   r   r   r   r   r   r   r   r   
ModuleType__annotations__numpyModuleNotFoundErrorunsupportedthree	getLoggerr~   logr!   rR   r,   r   r3   rF   rL   nnModuler]   rg   boolrj   rt   r\   r   floatr   CodeTyper   ro   r   r   r   r   rG   r   r   r   r   r   r   r  r   r  r  float32r  r  r&  r'  r(  r5  rq   rI  rO  rR  rT  rU  rV  rZ  r]  r_  rj  r:   r;   rl  r*   r*   r*   r+   <module>   sb   

( 
(

!

	

&
""""""""
