U
    9%e)                     @   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Zd dl	Z	d dl
mZ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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/dJej0dd d!Z1d"d# Z2G d$d% d%Z3G d&d' d'Z4G d(d) d)Z5d*d+ Z6d,d- Z7d.d/ Z8dKd0d1Z9ej:d2d3d4Z;dLd7d8Z<ej=d9d fee> ee> ej?ee@ejAf e>d:d;d<ZBd=d> ZCdd?d@dAZDdBdC ZEdDdE ZFdFdG ZGdHdI ZHdS )M    N)SequenceUnion)patch)fx)OutputGraph   )config
eval_frameoptimize_assertreset)create_instructiondebug_checksis_generatortransform_code_object)CheckFunctionManagerGuardedCode)same   c                 C   s    | d krd S |    | jS N)detachcloneZrequires_grad_requires_grad)x r   T/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/torch/_dynamo/testing.pyclone_me!   s    r   c                    s   t   fdd}|S )Nc                     s   dt jkrtd | |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   s   t | tjst| jjS r   )
isinstancer	   OptimizedModuleAssertionError	_orig_modnamed_parametersmodr   r   r   %named_parameters_for_optimized_module1   s    r/   c                 C   s   t | tjst| jjS r   )r(   r	   r)   r*   r+   named_buffersr-   r   r   r   "named_buffers_for_optimized_module6   s    r1   c                 C   s   t dd| S )Nz^_orig_mod[.] )resub)namer   r   r   remove_optimized_module_prefix;   s    r6   c                 C   s(  g }| | | | t }t }|  D ]N\}}t| tjrHt|}|}	|j}
|jd k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)   r6   gradtorchZ
zeros_liker0   tuplelistTensor)modelZ
predictionZlossexample_inputsresultsZgradsparamsr5   paramZ
param_copyr9   buffersbufferZexampleZinpr   r   r   collect_results?   s<    








rE   c                 C   s^   t | tjr| jS t | ttfr2tdd | D S | d kr>dS t | trLdS tdt	| d S )Nc                 s   s   | ]}t |V  qd S r   )requires_bwd_pass.0r   r   r   r   	<genexpr>k   s     z$requires_bwd_pass.<locals>.<genexpr>FDon't know how to reduce)
r(   r:   r=   r   r<   r;   anyintNotImplementedErrortypeoutr   r   r   rF   g   s    
rF   c                 C   s   t | tjr|  |   S t | ttfrDtdd | D t|  S t| j	dk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_lossrG   r   r   r   
<listcomp>y   s     z)reduce_to_scalar_loss.<locals>.<listcomp>)ZMaskedLMOutputZSeq2SeqLMOutputZ!CausalLMOutputWithCrossAttentionsZSquashedNormalc                 S   s   g | ]}t |qS r   rQ   )rH   valuer   r   r   rS      s     rJ   N)r(   r:   r=   sumZnumelr<   r;   lenrN   __name__rR   ZlogitsZmeanr8   valueskeysrM   rO   r   r   r   rR   s   s    


rR   c                  C   s0   t jt jtd} t j| s,t |  | S )Nz../debug)r   pathjoindirname__file__existsmkdir)rZ   r   r   r   	debug_dir   s    
r`   r2   codec              	   C   sV   t tjt | d6}|t|  dt|  d| d W 5 Q R X d S )Nwz


)	openr   rZ   r[   r`   writedisBytecodeinfo)r5   rb   extrafdr   r   r   
debug_dump   s    (rl   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   )	ro   Zcompiler_fnZroot_txZexportZexport_constraintsZframe_stateZlocal_scopeZglobal_scopef_code)
r   rq   r   r   r   localsglobalsr   r   Zcheck_fn)frameZ
cache_sizehooks_rp   rb   graphr   r   r   debug_insert_nops   s"    

rx   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kr|  jd7  _q|jS )Nr   call)r|   rw   nodesopr}   forward)r   r   r?   noder   r   r   __call__   s
    
zCompileCounter.__call__c                 C   s   d| _ d| _d S rz   r{   r~   r   r   r   clear   s    zCompileCounter.clearN)	rW   
__module____qualname__r   r:   r   GraphModuler   r   r   r   r   r   ry      s   ry   c                   @   s&   e Zd Zdd ZejjdddZdS )CompileCounterWithBackendc                 C   s   d| _ d| _|| _g | _d S rz   )r|   r}   backendgraphs)r   r   r   r   r   r      s    z"CompileCounterWithBackend.__init__r   c                 C   s\   ddl m} |  jd7  _|jjD ]}d|jkr"|  jd7  _q"| j| || j	||S )Nr   )lookup_backendr   )
Zbackends.registryr   r|   rw   r   r   r}   r   r7   r   )r   r   r?   r   r   r   r   r   r      s    
z"CompileCounterWithBackend.__call__NrW   r   r   r   r:   r   r   r   r   r   r   r   r      s   r   c                   @   s&   e Zd Zdd ZejjdddZdS )EagerAndRecordGraphsc                 C   s
   g | _ d S r   )r   r~   r   r   r   r      s    zEagerAndRecordGraphs.__init__r   c                 C   s   | j | |S r   )r   r7   )r   r   r?   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?r2   )strr3   r4   ra   r   r   r   strip_comment   s    r   c                 C   s   d dd | dD S )Nrd   c                 S   s   g | ]}|  qS r   )rstrip)rH   liner   r   r   rS      s     z)remove_trailing_space.<locals>.<listcomp>)r[   splitra   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   sB  t js|d k	r|}t }|d krlt }z0tj|}|| td |j  |j	}W n t
k
rj   Y nX dd t|D }dd t|D }	|| }
||	 }t  t||}|| }||	 }|| }||	 }t  | t||
 | t||
 | t|| | t|| | |jd |d k	r>| |j	| d S )Nz
fx.symbolic_trace graph:c                 S   s   g | ]}t d d qS 
   r:   randnrH   rv   r   r   r   rS      s     z!standard_test.<locals>.<listcomp>c                 S   s   g | ]}t d d qS r   r   r   r   r   r   rS     s     r   )r   Zassume_static_by_defaultry   r:   r   Zsymbolic_traceprintrw   Zprint_tabularr}   	Exceptionranger   r
   
assertTruer   assertEqualr|   )r   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   r   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   cpu)sizestridedtypedevice
extra_sizec                 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   )rH   shaper   r   r   r   rI   (  s     zrand_strided.<locals>.<genexpr>r   )r   r   )r   r   r   )rU   zipZis_floating_pointr:   r   ZzerosZ
as_strided)r   r   r   r   r   Zneeded_sizerD   r   r   r   rand_strided   s    r   c                    s   t   fdd}|S )Nc               
      sN   t  <}D ]\}}}|t||| q | |W  5 Q R  S Q R X d S r   )
contextlib	ExitStackenter_contextr   object)r   r    stackmoduleattrvalr"   patchesr   r   _fn4  s    
z"_make_fn_with_patches.<locals>._fnr$   )r"   r   r   r   r   r   _make_fn_with_patches3  s    r   )
xfail_propc          
      G   s   G dd d| }| | j  |_ |j |_t| D ]j}|dr0t| |}t|sRq0| | }t|f| }	||	_ |d k	rt||rt	|	}	t
|||	 q0|S )Nc                   @   s   e Zd ZdS )z2make_test_cls_with_patches.<locals>.DummyTestClassN)rW   r   r   r   r   r   r   DummyTestClass@  s   r   Ztest_)rW   r   dir
startswithgetattrcallabler   hasattrr   ZexpectedFailuresetattr)
clsZ
cls_prefixZ	fn_suffixr   r   r   r5   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   skipIfNotPy311V  s    
r   c                 C   s
   d| _ | S NT)Z_expected_failure_dynamicr!   r   r   r   expectedFailureDynamic^  s    r   c                 C   s
   d| _ | S r   )Z!_expected_failure_codegen_dynamicr!   r   r   r   expectedFailureCodegenDynamicd  s    r   c                 C   s
   d| _ | S r   )Z!_expected_failure_dynamic_wrapperr!   r   r   r   expectedFailureDynamicWrapperj  s    r   )r2   )NN)Tr   )Ir   rg   r%   loggingos.pathr   r3   r   typesr   typingr   r   Zunittest.mockr   r:   r   Ztorch._dynamo.output_graphr   r2   r   r	   r
   r   Zbytecode_transformationr   r   r   r   Zguardsr   r   utilsr   unsupportedthree	getLoggerrW   logr   r'   r/   r1   r6   rE   rF   rR   r`   CodeTyperl   rx   ry   r   r   r   r   r   r   r   r   r   Zfloat32rL   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sp   

(	
$
