o
    j9:jfK                     @   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mZ ddl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l/m0Z0m1Z1 dZ2e
j3dB e4d< zddl5Z2W n e6y   dZ2Y nw e j7Z7dZ8e9e:Z;edZ<dej=dB dej=dB fddZ>de?de?fddZ@dd ZAdd ZBdejCjDded ed!edeEe f
d"d#ZFd$edeGfd%d&ZHed$ej=dej=fd'd(ZIed$eEe eJed)f B eKeef B deLfd*d(ZId$edej=eLB fd+d(ZIde?fd,d-ZMdde?d/e
jNd0e?ddfd1d2ZOdd3d4e-d5ePd6ed7ed8ePde,fd9d:ZQG d;d< d<ZRG d=d> d>ZSG d?d@ d@ZTG dAdB dBZUG dCdD dDZVd/e?de?fdEdFZWd/e?de?fdGdHZXd/e?de?fdIdJZYdKe?de?fdLdMZZd/e?de?fdNdOZ[			
ddPedQed)ef dRePdSePdB dTePdB dUePddfdVdWZ\dXej]d!eEej= ded)ef fdYdZZ^	[	\dd]eLd^eLd_eGd`eLde?f
dadbZ_ej`dcdfddeeP deeeP dfejadge?ejbB dhePdej=fdidjZcedkZddeGfdldmZedQee<edf dnedee<edf fdodpZfddqdr dsdtegdue?dve?dnedwe?dB dxeed)ef ged)ef f degfdydzZhdQee<edf dee<edf fd{d|ZidQee<edf dee<edf fd}d~ZjdQee<edf dee<edf fddZkdQee<edf dee<edf fddZldQee<edf dee<edf fddZmdQee<edf dee<edf fddZndQee<edf dee<edf fddZodQee<edf dee<edf fddZpddeGddfddZqdee<edf de<jrde<jsdedfddZtdauejvdeeEejj]  fddZwd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	GeneratorSequence)AnyoverloadTypeVar)	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)   \/home/nk/hobo-godmode/plappi-mvp/.venv/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      r2   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r4   gmr7   r)   r*   extract_graph_backendO   s   z8extract_graph_and_tracker.<locals>.extract_graph_backendT)backend	fullgraph)torch._dynamo.symbolic_convertr4   torchcompilegraph)fnr9   r:   r=   r)   r;   r*   extract_graph_and_trackerI   s   
rE   c                 O   s2   t  }tj|d| |i |}||j|j|jfS )N)r>   )AotEagerAndRecordGraphsrA   rB   graphs	fw_graphs	bw_graphs)rD   r9   r:   r>   resultr)   r)   r*   extract_graphZ   s   rK   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#   )
isinstancerA   Tensorgrad).0inpr)   r)   r*   	<genexpr>   s     z"collect_results.<locals>.<genexpr>)appendnamed_parametersrP   r   OptimizedModuler2   rR   rA   
zeros_likenamed_bufferstuplelistextendrQ   )rL   rM   rN   rO   resultsgradsparamsr,   param
param_copyrR   buffersbufferexampler)   r)   r*   collect_results`   s:   








rf   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rS   r!   r)   r)   r*   rU          z$requires_bwd_pass.<locals>.<genexpr>FDon't know how to reduce)
rP   rA   rQ   r'   r\   r[   anyintNotImplementedErrortyperg   r)   r)   r*   ri      s   
ri   c                 C      d S r#   r)   rq   r)   r)   r*   reduce_to_scalar_loss   s   rs   .c                 C   rr   r#   r)   rq   r)   r)   r*   rs      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   rh   r#   rs   rj   r)   r)   r*   rU      rk   z(reduce_to_scalar_loss.<locals>.<genexpr>)MaskedLMOutputSeq2SeqLMOutput!CausalLMOutputWithCrossAttentionsSquashedNormalc                 s   rh   r#   rt   )rS   valuer)   r)   r*   rU      rk   rl   )rP   rA   rQ   sumnumelr\   r[   lenrp   __name__rs   logitsmeandictvalueskeysro   rq   r)   r)   r*   rs      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   rA   _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   rC   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<   rO   .c                 C   s:   |  j d7  _ |jjD ]}d|jv r|  jd7  _q|jS )Nr   call)r   rC   nodesopop_countforward)r   r<   rO   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   rA   r
   GraphModuler\   rQ   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>   rG   r   )r   r>   r)   r)   r*   r     s   z"CompileCounterWithBackend.__init__r<   rO   .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   rC   r   r   r   rG   rV   r>   )r   r<   rO   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   rG   r   r)   r)   r*   r     s
   
zCompileCounterWithBackend.clearr   )r}   r   r   strr   rA   r
   r   r\   rQ   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#   )rG   r   r)   r)   r*   r     s   
zEagerAndRecordGraphs.__init__r<   rO   .c                 C   s   | j | |jS r#   )rG   rV   r   )r   r<   rO   r)   r)   r*   r   "     zEagerAndRecordGraphs.__call__r   r}   r   r   r   rA   r
   r   r\   rQ   r   r   r   r)   r)   r)   r*   r     s    

r   c                   @   r   )rF   r"   Nc                 C   s   g | _ g | _g | _d S r#   )rG   rH   rI   r   r)   r)   r*   r   *  s   
z AotEagerAndRecordGraphs.__init__r<   rO   .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<   rO   r"   .c                        j |  | jS r#   )rH   rV   r   r<   rO   r   r)   r*   fw_compiler4  r   z5AotEagerAndRecordGraphs.__call__.<locals>.fw_compilerc                    r   r#   )rI   rV   r   r   r   r)   r*   bw_compiler:  r   z5AotEagerAndRecordGraphs.__call__.<locals>.bw_compiler)r   r   )
rG   rV   rA   r
   r   r\   rQ   r   r   r   )r   r<   rO   r   r   r)   r   r*   r   /  s*   

z AotEagerAndRecordGraphs.__call__r   r   r)   r)   r)   r*   rF   )  s    

rF   c                   @   s   e Zd ZdddZdd ZdS )InductorAndRecordGraphsr"   Nc                 C   s   g | _ g | _d S r#   )rG   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   rV   )r9   r:   old_compile_fx_innerr   r)   r*   patchedT  s   z1InductorAndRecordGraphs.__call__.<locals>.patched_compile_fx_inner)new)torch._inductor.compile_fx	_inductor
compile_fxrG   rV   r   r	   object)r   r<   rO   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.   r/   r   r)   r)   r*   strip_comment\  r3   r   c                 C   s   d dd | dD S )Nr   c                 S   s   g | ]}|  qS r)   )rstrip)rS   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   striprV   r   )r   linesrJ   	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   r/   )r   normal_coder)   r)   r*   empty_line_normalizer{  s   r   r   rD   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 
   rA   randnrS   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   rD   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rQ|tjkr4tjdd|ftj|dtj}n&|j	dkrH	 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)   )rS   sr)   r)   r*   rU     rk   zrand_strided.<locals>.<genexpr>c                 s   s     | ]\}}|d  | V  qdS )r   Nr)   )rS   shaper  r)   r)   r*   rU     s    r   r      )r  r  )r  )r  r  r  )allrz   zipis_floating_pointrA   float4_e2m1fn_x2randintuint8viewitemsizer   float16tozeros
as_strided)r  r  r  r  r  needed_sizerd   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 )Nr9   r:   r"   c               	      s^   t  !}D ]\}}}|t||| q | i |W  d    S 1 s(w   Y  d S r#   )
contextlib	ExitStackenter_contextr	   r   )r9   r:   stackmoduleattrvalrD   r-  r)   r*   _fn  s
   
$z"_make_fn_with_patches.<locals>._fn)	functoolswrapsr    r9   r:   r+  )rD   r-  r6  r)   r5  r*   _make_fn_with_patches  s   "r9  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 )Ntest_)rp   r}   	__bases__r   dir
startswithgetattrcallablesetattrr9  hasattrunittestexpectedFailure)r=  r>  r?  r;  r<  r-  DummyTestClassr,   rD   new_namenew_fnr)   r)   r*   make_test_cls_with_patches  s$   



rM  c                 C   s   t jdkr| S t| S )N)r      sysversion_inforH  r   rD   r)   r)   r*   skipIfNotPy311  s   

rS  c                 C   s   t jdkr| S td| S )Nr      zRequires Python 3.12+rO  rR  r)   r)   r*   skipIfNotPy312  s   
rV  c                 C   s&   t jdks
t jdk rtd| S | S )N)r      rT  zRequires Python 3.12rO  rR  r)   r)   r*   skipIfOnlyNotPy312  s   rX  c                 C   s   t jdkr
t| S | S )NrT  )rP  rQ  rH  rI  rR  r)   r)   r*   xfailIfPy312  s   

rY  c                 C   s   t jdkrtd| S | S )NrT  zNot supported in Python 3.12+rO  rR  r)   r)   r*   skipIfPy312$  s   
rZ  c                 C   
   d| _ | S NT)_expected_failure_dynamicrR  r)   r)   r*   expectedFailureDynamic,     r^  c                 C   r[  r\  )!_expected_failure_codegen_dynamicrR  r)   r)   r*   expectedFailureCodegenDynamic2  r_  ra  c                 C   r[  r\  )!_expected_failure_dynamic_wrapperrR  r)   r)   r*   expectedFailureDynamicWrapper8  r_  rc  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   )rA   manual_seedrandomseedr   torch_xla.core.xla_modelcore	xla_modelset_rng_stater   
xla_device)rd  xmr)   r)   r*   reset_rng_state=  s   

rn  fr9   r:   c                 O   s   | |i |S r#   r)   )ro  r9   r:   r)   r)   r*   &_skipped_function_for_test_reconstructH  s   rp  c                   c   s    g a zt V  W da dS da w )a\  
    Context manager to capture graph modules compiled by invoke_subgraph_inductor_compile.

    Usage:
        with _testing_capture_invoke_subgraph_inductor_compile_gms() as captured_gms:
            # code that triggers invoke_subgraph_inductor_compile
            pass
        # captured_gms will contain the list of captured graph modules
    N)6_testing_invoke_subgraph_inductor_compile_captured_gmsr)   r)   r)   r*   5_testing_capture_invoke_subgraph_inductor_compile_gmsQ  s
   rr  )r.   )NNr   )Tr  )F)x__doc__r.  r   r7  loggingos.pathr   rf  r0   rP  typesrH  collections.abcr   r   r   typingr   r   r   typing_extensionsr   unittest.mockr	   rA   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    rQ   r+   r   r2   rE   rK   nnModuler\   rf   boolri   rs   r[   r   floatr   CodeTyper   rn   r   r   r   r   rF   r   r   r   r   r   r   r  r   r  r  float32r  r  r*  r+  r,  r9  rp   rM  rS  rV  rX  rY  rZ  r^  ra  rc  rn  r9   r:   rp  rq  contextmanagerrr  r)   r)   r)   r*   <module>   sl   

(
(

!

	

!&
""""""""


