o
    I&is,                     @   s  U 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mZ d dlmZ dZee	j ed< zd dlZW n eyU   dZY nw d dl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' ddl(m)Z) ej*Z*dZ+e,e-Z.dd Z/dd Z0dd Z1dd Z2de3fddZ4dd Z5dd Z6dd Z7de3fddZ8dSd!e	j9ddfd"d#Z:dee' fd$d%Z;G d&d' d'Z<G d(d) d)Z=G d*d+ d+Z>de3fd,d-Z?de3fd.d/Z@de3fd0d1ZAdTd2d3ZBd4ejCfd5d6ZDdUd9d:ZEejFd;d fd<eeG d=eeG d>ejHd?ee3ejIf d@eGf
dAdBZJdCdD ZKddEdFdGZLdHdI ZMdJdK ZNdLdM ZOdNdO ZPdVdQdRZQdS )W    N)ListOptionalSequenceUnion)patchnp)fx)OutputGraph   )config
eval_frameoptimize_assertreset)create_instructiondebug_checksis_generatortransform_code_object)CheckFunctionManagerGuardedCode)same   c                 C   s    | d u rd S |    | jS N)detachcloneZrequires_grad_requires_grad)x r   @C:\wamp64\www\opt\env\Lib\site-packages\torch/_dynamo/testing.pyclone_me(   s   r   c                    s   t   fdd}|S )Nc                     s"   dt jv r
td | i |S )NZPYTEST_CURRENT_TESTzdoes not work under pytest)osenvironunittestZSkipTest)argskwargsfnr   r   wrapped/   s   

zskip_if_pytest.<locals>.wrapped	functoolswraps)r%   r&   r   r$   r   skip_if_pytest.   s   r*   c                 C      t | tjsJ | jjS r   )
isinstancer   OptimizedModule	_orig_modnamed_parametersmodr   r   r   %named_parameters_for_optimized_module8      r2   c                 C   r+   r   )r,   r   r-   r.   named_buffersr0   r   r   r   "named_buffers_for_optimized_module=   r3   r5   returnc                 C   s   t dd| S )Nz^_orig_mod[.] )resub)namer   r   r   remove_optimized_module_prefixB   s   r;   c                 C   s&  g }| | | | t }t }|  D ]'\}}t| tjr$t|}|}	|j}
|jd u r3t	|}
|
||d < |	||< q| | | | t }| 
 D ]\}}t| tjr]t|}|||< qO| | |D ]'}t|ttfr|D ]}t|tjr| |j qtqit|tjr| |j qi|S )Nz.grad)appenddictr/   r,   r   r-   r;   gradtorchZ
zeros_liker4   tuplelistTensor)modelZ
predictionZlossexample_inputsresultsZgradsparamsr:   paramZ
param_copyr>   buffersbufferZexampleinpr   r   r   collect_resultsF   sB   








rK   c                 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   s    | ]}t |V  qd S r   )requires_bwd_pass.0r   r   r   r   	<genexpr>r   s    z$requires_bwd_pass.<locals>.<genexpr>FDon't know how to reduce)
r,   r?   rB   r   rA   r@   anyintNotImplementedErrortypeoutr   r   r   rL   n   s   
rL   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      g | ]}t |qS r   reduce_to_scalar_lossrM   r   r   r   
<listcomp>       z)reduce_to_scalar_loss.<locals>.<listcomp>)ZMaskedLMOutputZSeq2SeqLMOutputZ!CausalLMOutputWithCrossAttentionsZSquashedNormalc                 S   rW   r   rX   )rN   valuer   r   r   rZ      r[   rP   )r,   r?   rB   sumZnumelrA   r@   lenrT   __name__rY   Zlogitsmeanr=   valueskeysrS   rU   r   r   r   rY   z   s   


rY   c                  C   s0   t jt jtd} t j| st |  | S )Nz../debug)r   pathjoindirname__file__existsmkdir)rc   r   r   r   	debug_dir   s   
ri   r7   codec              	   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   rc   rd   ri   writedisBytecodeinfo)r:   rj   extrafdr   r   r   
debug_dump   s
   ("rt   c                 C   s`   dd }t | jrdS t| j t| j|}ti ddddddit t | jd	}t|t|j	S )zused to debug jump updatesc                 S   s$   |  dtd |  dtd d S )Nr   NOP)insertr   )Zinstructionscode_optionsr   r   r   insert_nops   s   z&debug_insert_nops.<locals>.insert_nopsNFZ_idr   )	rw   Zcompiler_fnZroot_txZexportZexport_constraintsZframe_stateZlocal_scopeZglobal_scopef_code)
r   ry   r   r   r	   localsglobalsr   r   Zcheck_fn)frameZ
cache_sizehooks_rx   rj   graphr   r   r   debug_insert_nops   s"   

r   c                   @   s8   e Zd Zdd Zdejjdeej fddZ	dd Z
d	S )
CompileCounterc                 C      d| _ d| _d S Nr   frame_countop_countselfr   r   r   __init__      
zCompileCounter.__init__gmrD   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   r   rD   noder   r   r   __call__   s   
zCompileCounter.__call__c                 C   r   r   r   r   r   r   r   clear   r   zCompileCounter.clearN)r_   
__module____qualname__r   r?   r   GraphModuler   rB   r   r   r   r   r   r   r      s    r   c                   @   0   e Zd Zdd Zdejjdeej fddZ	dS )CompileCounterWithBackendc                 C   s   d| _ d| _|| _g | _d S r   )r   r   backendgraphs)r   r   r   r   r   r      s   
z"CompileCounterWithBackend.__init__r   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   r<   r   )r   r   rD   r   r   r   r   r   r      s   
z"CompileCounterWithBackend.__call__N
r_   r   r   r   r?   r   r   r   rB   r   r   r   r   r   r      s     r   c                   @   r   )EagerAndRecordGraphsc                 C   s
   g | _ d S r   )r   r   r   r   r   r      s   
zEagerAndRecordGraphs.__init__r   rD   c                 C   s   | j | |S r   )r   r<   )r   r   rD   r   r   r   r      s   zEagerAndRecordGraphs.__call__Nr   r   r   r   r   r      s     r   c                 C   s   t | } tdd| S )Nz(?m)^ *#.*\n?r7   )strr8   r9   rj   r   r   r   strip_comment   s   r   c                 C   s   d dd | dD S )Nrl   c                 S   s   g | ]}|  qS r   )rstrip)rN   liner   r   r   rZ      r[   z)remove_trailing_space.<locals>.<listcomp>)rd   splitr   r   r   r   remove_trailing_space   s   r   c                 C   s   t t| S r   )r   r   )Zgm_strr   r   r   normalize_gm   s   r   c                 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 |d urv| |j
| d S d S )Nc                 S      g | ]}t d d qS 
   r?   randnrN   r~   r   r   r   rZ          z!standard_test.<locals>.<listcomp>c                 S   r   r   r   r   r   r   r   rZ      r   r
   )r   Zassume_static_by_defaultr   ranger   r   
assertTruer   assertEqualr   r   )r   r%   nargsZexpected_opsZexpected_ops_dynamicactualZargs1Zargs2Zcorrect1Zcorrect2Zopt_fnZval1aZval2aZval1bZval2br   r   r   standard_test   s,   r   r   c                 C   s   | j S r   )r   )r   rD   r   r   r   dummy_fx_compile  s   r   T皙?c                 C   s.   |sdS ||kr| ddS | dd|dS )NERRORz.3fzx SAMEzx p=z.2fr   )ZspeedupZpvalueZ
is_correctZpvalue_thresholdr   r   r   format_speedup  s
   r   cpusizestridedtypedevice
extra_sizec                 C   sX   t dd t| |D d | }|jrtj|||d}n	tj|g||d}t|| |S )Nc                 s   s     | ]\}}|d  | V  qdS )r
   Nr   )rN   shaper   r   r   r   rO   %  s    zrand_strided.<locals>.<genexpr>r
   )r   r   )r   r   r   )r]   zipZis_floating_pointr?   r   ZzerosZ
as_strided)r   r   r   r   r   Zneeded_sizerI   r   r   r   rand_strided  s   r   c                    s   t   fdd}|S )Nc               	      s^   t  !}D ]\}}}|t||| q | i |W  d    S 1 s(w   Y  d S r   )
contextlib	ExitStackenter_contextr   object)r"   r#   stackmoduleattrvalr%   patchesr   r   _fn1  s
   
$z"_make_fn_with_patches.<locals>._fnr'   )r%   r   r   r   r   r   _make_fn_with_patches0  s   r   )
xfail_propc          
      G   s   t | | j | ji }|j|_t| D ]N}|drTt| |}t|s.t||t| | q| | }t	|g|R  }	||	_|d urMt
||rMt|	}	t|||	 qt
||sbt||t| | q|S )NZtest_)rT   r_   	__bases__r   dir
startswithgetattrcallablesetattrr   hasattrr!   ZexpectedFailure)
clsZ
cls_prefixZ	fn_suffixr   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!   skipr$   r   r   r   skipIfNotPy311T  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   expectedFailureCodegenDynamicb  r   r   c                 C   r   r   )Z!_expected_failure_dynamic_wrapperr$   r   r   r   expectedFailureDynamicWrapperh  r   r   Fc                 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)Zuse_xlaZxmr   r   r   reset_rng_statem  s   

r   )r7   )NN)Tr   )F)Rr   ro   r(   loggingZos.pathr   r   r8   r   typesr!   typingr   r   r   r   Zunittest.mockr   r   
ModuleType__annotations__numpyModuleNotFoundErrorr?   r   Ztorch._dynamo.output_graphr	   r7   r   r   r   r   Zbytecode_transformationr   r   r   r   Zguardsr   r   utilsr   unsupportedthree	getLoggerr_   logr   r*   r2   r5   r   r;   rK   rL   rY   ri   CodeTypert   r   r   r   r   r   r   r   r   r   r   r   Zfloat32rR   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s   
 

(	


