a
    d!                     @   s  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
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 Z!dd Z"dd Z#dd Z$dd Z%dd Z&dd Z'dd Z(d8ej)dddZ*d d! Z+G d"d# d#Z,G d$d% d%Z-d9d&d'Z.ej/d(d)d*Z0d:d-d.Z1d/d0 Z2e
j3d1d fd2d3Z4d4d5 Z5d6d7 Z6dS );    N)patch)fx   )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   ^/var/www/html/stable-diffusion-webui/venv/lib/python3.9/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unittest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   s   t | tjsJ | jjS r   )
isinstancer   OptimizedModule	_orig_modnamed_parametersmodr   r   r   %named_parameters_for_optimized_module-   s    r-   c                 C   s   t | tjsJ | jjS r   )r'   r   r(   r)   named_buffersr+   r   r   r   "named_buffers_for_optimized_module2   s    r/   c                 C   s&   d}|  |sJ | t|d  } | S )Nz
_orig_mod.)
startswithlen)nameprefixr   r   r   remove_optimized_module_prefix7   s    r4   c                 C   s(  g }| | | | t }t }|  D ]N\}}t| tjrHt|}|}	|j}
|jd u rft	|}
|
||d < |	||< q,| | | | t }| 
 D ]$\}}t| tjrt|}|||< q| | |D ]P}t|ttfr
|D ]}t|tjr| |j qqt|tjr| |j q|S )Nz.grad)appenddictr*   r'   r   r(   r4   gradtorchZ
zeros_liker.   tuplelistTensor)modelZ
predictionZlossexample_inputsresultsZgradsparamsr2   paramZ
param_copyr7   buffersbufferZexampleinpr   r   r   collect_results>   s<    








rD   c                 C   sP   t | tjr| jS t | ttfr2tdd | D S | d u r>dS tdt| d S )Nc                 S   s   g | ]}t |qS r   )requires_bwd_pass.0r   r   r   r   
<listcomp>j       z%requires_bwd_pass.<locals>.<listcomp>FDon't know how to reduce)	r'   r8   r;   r   r:   r9   anyNotImplementedErrortypeoutr   r   r   rE   f   s    rE   c                 C   s   t | tjr|  |   S t | ttfrDtdd | D t|  S t| j	dv r\t
| jS t| j	dkrt| j S t | trtdd |  D t|   S tdt| dS )z/Reduce the output of a model to get scalar lossc                 S   s   g | ]}t |qS r   reduce_to_scalar_lossrF   r   r   r   rH   v   rI   z)reduce_to_scalar_loss.<locals>.<listcomp>)ZMaskedLMOutputZSeq2SeqLMOutputZ!CausalLMOutputWithCrossAttentionsZSquashedNormalc                 S   s   g | ]}t |qS r   rP   )rG   valuer   r   r   rH      rI   rJ   N)r'   r8   r;   sumZnumelr:   r9   r1   rM   __name__rQ   Zlogitsmeanr6   valueskeysrL   rN   r   r   r   rQ   p   s    


rQ   c                  C   s0   t jt jtd} t j| s,t |  | S )Nz../debug)r   pathjoindirname__file__existsmkdir)rX   r   r   r   	debug_dir   s    
r^    )codec              	   C   sj   t tjt | d@}|t|  dt|  d| d W d    n1 s\0    Y  d S )Nwz


)	openr   rX   rY   r^   writedisBytecodeinfo)r2   r`   extrafdr   r   r   
debug_dump   s    (rj   c                 C   s:   dd }t | jrdS t| j t| j|}t|t jS )zused to debug jump updatesc                 S   s$   |  dtd |  dtd d S )Nr   NOP)insertr	   )ZinstructionsZcode_optionsr   r   r   insert_nops   s    z&debug_insert_nops.<locals>.insert_nopsN)r   f_coder
   r   r   r   Zcheck_fn)frameZ
cache_sizehooksrm   r`   r   r   r   debug_insert_nops   s    

rq   c                   @   s.   e Zd Zdd ZejjdddZdd ZdS )	CompileCounterc                 C   s   d| _ d| _d S Nr   frame_countop_countselfr   r   r   __init__   s    zCompileCounter.__init__gmc                 C   s:   |  j d7  _ |jjD ]}d|jv r|  jd7  _q|jS )Nr   call)ru   graphnodesoprv   forward)rx   r{   r=   noder   r   r   __call__   s
    
zCompileCounter.__call__c                 C   s   d| _ d| _d S rs   rt   rw   r   r   r   clear   s    zCompileCounter.clearN)	rT   
__module____qualname__ry   r8   r   GraphModuler   r   r   r   r   r   rr      s   rr   c                   @   s&   e Zd Zdd ZejjdddZdS )CompileCounterWithBackendc                 C   s   d| _ d| _|| _d S rs   )ru   rv   backend)rx   r   r   r   r   ry      s    z"CompileCounterWithBackend.__init__rz   c                 C   sP   ddl m} |  jd7  _|jjD ]}d|jv r"|  jd7  _q"|| j||S )Nr   )lookup_backendr|   )Zbackends.registryr   ru   r}   r~   r   rv   r   )rx   r{   r=   r   r   r   r   r   r      s    
z"CompileCounterWithBackend.__call__N)rT   r   r   ry   r8   r   r   r   r   r   r   r   r      s   r   c                 C   s@  t jr|d ur|}t }|d u rjt }z0tj|}|| td |j  |j	}W n t
yh   Y n0 dd t|D }dd t|D }	|| }
||	 }t  t||}|| }||	 }|| }||	 }t  | t||
 | t||
 | t|| | t|| | |jd |d ur<| |j	| d S )Nz
fx.symbolic_trace graph:c                 S   s   g | ]}t d d qS 
   r8   randnrG   _r   r   r   rH      rI   z!standard_test.<locals>.<listcomp>c                 S   s   g | ]}t d d qS r   r   r   r   r   r   rH      rI   r   )r   dynamic_shapesrr   r8   r   Zsymbolic_traceprintr}   Zprint_tabularrv   	Exceptionranger   r   
assertTruer   assertEqualru   )rx   r!   nargsZexpected_opsZexpected_ops_dynamicactualexpectedr{   Zargs1Zargs2Zcorrect1Zcorrect2Zopt_fnZval1aZval2aZval1bZval2br   r   r   standard_test   s>    


r   rz   c                 C   s   | j S r   )r   )r{   r=   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   c                    s   t   fdd}|S )Nc                     s   t jrtd | i |S )Nzrequires static shapes)r   r   r   r   r   r    r   r   _fn   s    
z#requires_static_shapes.<locals>._fnr#   )r!   r   r   r    r   requires_static_shapes   s    r   cpuc                 C   sX   t dd t| |D d | }|jr8tj|||d}ntj|g||d}t|| |S )Nc                 s   s   | ]\}}|d  | V  qdS )r   Nr   )rG   shapestrider   r   r   	<genexpr>  rI   zrand_strided.<locals>.<genexpr>r   )dtypedevice)sizer   r   )rS   zipZis_floating_pointr8   r   zerosZ
as_strided)r   r   r   r   
extra_sizeZneeded_sizerB   r   r   r   rand_strided   s    r   c                    s   t   fdd}|S )Nc               	      s^   t  B}D ]\}}}|t||| q | i |W  d    S 1 sP0    Y  d S r   )
contextlib	ExitStackenter_contextr   object)r   r   stackmoduleattrvalr!   patchesr   r   r     s    
z"_make_fn_with_patches.<locals>._fnr#   )r!   r   r   r   r   r   _make_fn_with_patches  s    r   c                 G   s~   G dd d| }| | j  |_ t| D ]P}|dr(t| |}t|sJq(| | }t|g|R  }||_ t||| q(|S )Nc                   @   s   e Zd ZdS )z2make_test_cls_with_patches.<locals>.DummyTestClassN)rT   r   r   r   r   r   r   DummyTestClass  s   r   Ztest_)rT   dirr0   getattrcallabler   setattr)clsZ
cls_prefixZ	fn_suffixr   r   r2   r!   new_namer   r   r   make_test_cls_with_patches  s    

r   )r_   )NN)Tr   )7r   re   r$   loggingos.pathr   typesr   Zunittest.mockr   r8   r   r_   r   r   r   r   Zbytecode_transformationr	   r
   r   r   Zguardsr   r   utilsr   unsupportedZthree	getLoggerrT   logr   r&   r-   r/   r4   rD   rE   rQ   r^   CodeTyperj   rq   rr   r   r   r   r   r   r   float32r   r   r   r   r   r   r   <module>   sH   

(

$

