o
    ZhE?                     @   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 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
j3 e4d< zddl5Z2W n e6y   dZ2Y nw e!j7Z7dZ8e9e:Z;edZ<deej= deej= fddZ>de?de?fddZ@dd ZAdejBjCdedededeDe f
d d!ZEd"edeFfd#d$ZGed"ej=dej=fd%d&ZHed"eeDe eIed'f eJeef f deKfd(d&ZHd"edeej=eKf fd)d&ZHde?fd*d+ZLdde?d-e
jMd.e?ddfd/d0ZNdd1d2e.d3eOd4ed5ed6eOde-fd7d8ZPG d9d: d:ZQG d;d< d<ZRG d=d> d>ZSG d?d@ d@ZTd-e?de?fdAdBZUd-e?de?fdCdDZVdEe?de?fdFdGZWd-e?de?fdHdIZX			
ddJedKed'ef dLeOdMeeO dNeeO dOeOddfdPdQZYdRejZdeDej= ded'ef fdSdTZ[	U	VddWeKdXeKdYeFdZeKde?f
d[d\Z\ej]d]dfd^eeO d_eeO d`ej^daee?ej_f dbeOdej=fdcddZ`edeZadeFfdfdgZbdKee<eaf dhedee<eaf fdidjZcddkdl dmdneddoe?dpe?dhedqee? dreed'ef ged'ef f dedfdsdtZedKed'ef ded'ef fdudvZfdKed'ef ded'ef fdwdxZgdKed'ef ded'ef fdydzZhdKed'ef ded'ef fd{d|ZidKed'ef ded'ef fd}d~ZjdKed'ef ded'ef fddZkdKed'ef ded'ef fddZldKed'ef ded'ef fddZmddeFddfddZnd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)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                 C   s    | d u rd S |    | jS N)detachcloneZrequires_grad_requires_gradr!    r(   D/var/www/auris/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      r1   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#   )Z
current_txoutputregion_tracker)Z_gmargskwargsr3   gmr5   r(   r)   extract_graph_backendO   s   z8extract_graph_and_tracker.<locals>.extract_graph_backendT)backendZ	fullgraph)Ztorch._dynamo.symbolic_convertr3   torchcompilegraph)fnr6   r7   r:   r(   r8   r)   extract_graph_and_trackerI   s   
r@   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#   )
isinstancer<   Tensorgrad).0inpr(   r(   r)   	<genexpr>{   s     z"collect_results.<locals>.<genexpr>)appendZnamed_parametersrE   r   ZOptimizedModuler1   rG   r<   Z
zeros_likeZnamed_bufferstuplelistextendrF   )rA   rB   rC   rD   resultsZgradsparamsr+   paramZ
param_copyrG   buffersbufferZexampler(   r(   r)   collect_resultsZ   s:   








rT   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rH   r!   r(   r(   r)   rJ          z$requires_bwd_pass.<locals>.<genexpr>FDon't know how to reduce)
rE   r<   rF   r&   rM   rL   anyintNotImplementedErrortyperU   r(   r(   r)   rW      s   
rW   c                 C      d S r#   r(   r_   r(   r(   r)   reduce_to_scalar_loss   s   ra   .c                 C   r`   r#   r(   r_   r(   r(   r)   ra      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   rV   r#   ra   rX   r(   r(   r)   rJ      rY   z(reduce_to_scalar_loss.<locals>.<genexpr>)ZMaskedLMOutputZSeq2SeqLMOutputZ!CausalLMOutputWithCrossAttentionsZSquashedNormalc                 s   rV   r#   rb   )rH   valuer(   r(   r)   rJ      rY   rZ   )rE   r<   rF   sumZnumelrM   rL   lenr^   __name__ra   Zlogitsmeandictvalueskeysr]   r_   r(   r(   r)   ra      s   


c                  C   s0   t jt jtd} t j| st |  | S )Nz../debug)ospathjoindirname__file__existsmkdir)rl   r(   r(   r)   	debug_dir   s   
rr   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


)	openrk   rl   rm   rr   writedisBytecodeinfo)r+   rs   rt   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g |T t| jr4t	 W  d   W  d   S t
| j t| j|}ti ddddd	d
it t | jg d
}tt|t| j|jtd
d
dW  d   W  d   S 1 stw   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_nopsFZ_idr   )
r   Zcompiler_fnZroot_txZexportZexport_constraintsZframe_stateZlocal_scopeZglobal_scopef_codeZtorch_function_mode_stack)Zframe_idZframe_compile_id)rM   r   r<   Z_dynamoutilsZget_metrics_contextZdynamo_timedr   r   r   r   r   r   localsglobalsr   r   r   Zguard_managerr   )	r   r   r   r   r~   r   Zmetrics_contextrs   r>   r(   r(   r)   r      s8   


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      d| _ d| _d S Nr   frame_countop_countselfr(   r(   r)   __init__      
zCompileCounter.__init__r9   rD   .c                 C   s:   |  j d7  _ |jjD ]}d|jv r|  jd7  _q|jS )Nr   call)r   r>   nodesopr   forward)r   r9   rD   noder(   r(   r)   __call__   s   
zCompileCounter.__call__c                 C   r   r   r   r   r(   r(   r)   clear   r   zCompileCounter.clearr"   N)rf   
__module____qualname__r   r<   r   GraphModulerM   rF   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| _ d| _|| _g | _d S r   )r   r   r;   graphs)r   r;   r(   r(   r)   r      s   
z"CompileCounterWithBackend.__init__r9   rD   .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   )
Zbackends.registryr   r   r>   r   r   r   r   rK   r;   )r   r9   rD   r   r   r(   r(   r)   r      s   
z"CompileCounterWithBackend.__call__c                 C   s   d| _ d| _g | _d S r   )r   r   r   r   r(   r(   r)   r   	     
zCompileCounterWithBackend.clearr   )rf   r   r   strr   r<   r   r   rM   rF   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#   )r   r   r(   r(   r)   r     s   
zEagerAndRecordGraphs.__init__r9   rD   .c                 C   s   | j | |jS r#   )r   rK   r   )r   r9   rD   r(   r(   r)   r        zEagerAndRecordGraphs.__call__r   rf   r   r   r   r<   r   r   rM   rF   r   r   r   r(   r(   r(   r)   r     s    

r   c                   @   r   )AotEagerAndRecordGraphsr"   Nc                 C   s   g | _ g | _g | _d S r#   )r   	fw_graphs	bw_graphsr   r(   r(   r)   r     r   z AotEagerAndRecordGraphs.__init__r9   rD   .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 )
Nr9   rD   r"   .c                        j |  | jS r#   )r   rK   r   r9   rD   r   r(   r)   fw_compiler'  r   z5AotEagerAndRecordGraphs.__call__.<locals>.fw_compilerc                    r   r#   )r   rK   r   r   r   r(   r)   bw_compiler-  r   z5AotEagerAndRecordGraphs.__call__.<locals>.bw_compiler)r   r   )
r   rK   r<   r   r   rM   rF   r   r   r   )r   r9   rD   r   r   r(   r   r)   r   "  s*   

z AotEagerAndRecordGraphs.__call__r   r   r(   r(   r(   r)   r     s    

r   c                 C   r,   )Nz(?m)^ *#.*\n?r-   r.   rs   r(   r(   r)   strip_comment;  r2   r   c                 C   s   d dd | dD S )Nrv   c                 S   s   g | ]}|  qS r(   )rstrip)rH   liner(   r(   r)   
<listcomp>@  s    z)remove_trailing_space.<locals>.<listcomp>)rm   splitr   r(   r(   r)   remove_trailing_space?  s   r   gm_strc                 C   s   t t| S r#   )r   r   )r   r(   r(   r)   normalize_gmC  s   r   c                 C   s   t dd| }|S )z-
    Normalize code: remove empty lines.
    z[\r\n]+rv   r.   )rs   Znormal_coder(   r(   r)   empty_line_normalizerI  s   r   r   r?   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 
   r<   randnrH   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   r?   r   r   r   r   actualZargs1Zargs2Zcorrect1Zcorrect2Zopt_fnZval1aZval2aZval1bZval2br(   r(   r)   standard_testQ  s,   r   r9   c                 C   s   | j S r#   )r   r   r(   r(   r)   dummy_fx_compiler  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_speedupx  s
   r   cpusizestridedtypedevice
extra_sizec                 C   s   t dd t| |D d | }|jr0|jdkr'	 tj|tj|dj|d}ntj|||d}n	tj|g||d}t	|| |S )Nc                 s   s     | ]\}}|d  | V  qdS )r   Nr(   )rH   shaper   r(   r(   r)   rJ     s    zrand_strided.<locals>.<genexpr>r   )r   r   )r   )r   r   r   )
rd   zipZis_floating_pointitemsizer<   r   Zfloat16toZzerosZ
as_strided)r   r   r   r   r   Zneeded_sizerS   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 )Nr6   r7   r"   c               	      s^   t  !}D ]\}}}|t||| q | i |W  d    S 1 s(w   Y  d S r#   )
contextlib	ExitStackenter_contextr
   object)r6   r7   stackmoduleattrvalr?   r   r(   r)   _fn  s
   
$z"_make_fn_with_patches.<locals>._fn)	functoolswrapsr    r6   r7   r   )r?   r   r   r(   r   r)   _make_fn_with_patches  s   "r   c                 C   s   | S r#   r(   r'   r(   r(   r)   <lambda>  s    r   )
xfail_prop	decoratorcls
cls_prefix	fn_suffixr   r   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 )NZtest_)r^   rf   	__bases__r   dir
startswithgetattrcallablesetattrr   hasattrunittestexpectedFailure)r   r   r   r   r   r   ZDummyTestClassr+   r?   new_nameZnew_fnr(   r(   r)   make_test_cls_with_patches  s$   



r   c                 C   s   t jdkr| S t| S )N)r      sysversion_infor   r~   r?   r(   r(   r)   skipIfNotPy311  s   

r  c                 C      t jdkr| S td| S )Nr      zRequires Python 3.12+r  r  r(   r(   r)   skipIfNotPy312  s   
r
  c                 C   s   t jdkr
t| S | S )Nr  )r  r  r   r   r  r(   r(   r)   xfailIfPy312  s   

r  c                 C   s   t jdkrtd| S | S )Nr  zNot supported in Python 3.12+r  r  r(   r(   r)   skipIfPy312  s   
r  c                 C   r  )N)r   r   zRequires Python 3.10+r  r  r(   r(   r)   requiresPy310  s   
r  c                 C   
   d| _ | S NT)Z_expected_failure_dynamicr  r(   r(   r)   expectedFailureDynamic     r  c                 C   r  r  )Z!_expected_failure_codegen_dynamicr  r(   r(   r)   expectedFailureCodegenDynamic  r  r  c                 C   r  r  )Z!_expected_failure_dynamic_wrapperr  r(   r(   r)   expectedFailureDynamicWrapper  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   )r<   Zmanual_seedrandomseedr   Ztorch_xla.core.xla_modelcoreZ	xla_modelZset_rng_stater   Z
xla_device)r  Zxmr(   r(   r)   reset_rng_state  s   

r  )r-   )NNr   )Tr   )F)o__doc__r   ry   r   loggingZos.pathrk   r  r/   r  typesr   collections.abcr   typingr   r   r   r   r   r   Ztyping_extensionsr	   Zunittest.mockr
   r<   r   Z torch._dynamo.backends.debuggingr   Ztorch._dynamo.output_graphr   r-   r   r   r   r   Zbytecode_transformationr   r   r   r   Zguardsr   r   r   r   r   r   r   r   r   
ModuleType__annotations__numpyModuleNotFoundErrorunsupportedthree	getLoggerrf   logr    rF   r*   r   r1   r@   nnModulerM   rT   boolrW   ra   rL   rh   floatrr   CodeTyper}   r\   r   r   r   r   r   r   r   r   r   r   r   r   r   Zfloat32r   r   r   r   r   r   r^   r   r  r
  r  r  r  r  r  r  r  r(   r(   r(   r)   <module>   sJ    

( 
'

!

	

&
""""""	""