U
    ,-e                     @   s   d dl mZ d dlmZmZmZmZ d dlZd dlZd dl	Z	d dl
mZ eee dddZejjdd	d
Zeeeee f dddZdd Zdd ZdddedddZedd ZedddZedddZedddZdS )     )contextmanager)AnyListTuplecastN)Timer)filenamereturnc              	      s   d}d}d  d}g }t | }| |}t|D ]p\}}|dkrFq4||}	|	dkrZq4|d |	 }
||d   d   fdd|
jd	d
D }|d| q4W 5 Q R X |S )Nz<GRAPH_EXPORT>z</GRAPH_EXPORT> r      c                    s   g | ]}|t  d  qS N)len).0xpfx \/var/www/html/Darija-Ai-Train/env/lib/python3.8/site-packages/torch/utils/jit/log_extract.py
<listcomp>   s     zextract_ir.<locals>.<listcomp>T)keepends)openreadsplit	enumeratefind
splitlinesappendjoin)r   ZBEGINZENDcurrentZgraphsfZ
split_strsiZ	split_strZend_locslinesr   r   r   
extract_ir   s$    

r$   )inp_typec                 C   sb   |   }|  }|  }|  }|d k	s,t|d k	s8t|d k	sDt|d k	sPttj||||dS )N)sizestridedevicedtype)sizesstridesr(   r)   AssertionErrortorchZempty_strided)r%   r&   r'   r(   r)   r   r   r   make_tensor_from_type   s    r.   )irr	   c                 C   s
  t jj| dd}|  g }| D ]}t| t jjrN|t	
dd q$t| t jjrt|t	dd q$t| t jjrtt jj| }|t| q$t| t jjr|t	dddk q$td|  q$t jd|}t j|j ||fS )	NT)Zparse_tensor_constantsg?d   r   r   z,A default value is not implemented for type forward)r-   _CZparse_irZmakeMultiOutputIntoTupleinputs
isinstancetypeZ	FloatTyper   randomuniformZIntTyperandint
TensorTyper   r.   ZBoolTypeNotImplementedErrorZ_create_function_from_graphZ!_jit_pass_erase_shape_informationgraph)r/   r;   r3   ZinpZ
tensorTypefuncr   r   r   load_graph_and_inputs)   s"    r=   c                 C   s$   t d| |dd}| }|jd S )Nzfn(*inputs))fnr3   )stmtglobals  )r   Zblocked_autorangeZmedian)r>   r3   	test_runsttimesr   r   r   	time_cuda>   s    rE   c                 C   s6   t  }t|D ]}| |  qt  }|| | d S )NrA   )timeperf_counterrange)r>   r3   rB   r"   _er   r   r   time_cpuC   s
    
rK   
      )warmup_runsrB   )r	   c          	      C   sx   t | \}}t|D ]}||  qd }|D ] }t|tjr*|jjdk} qLq*|d k	sXt|rht|||n
t	|||}|S )Ncpu)
r=   rH   r4   r-   ZTensorr(   r5   r,   rK   rE   )	r/   r3   rN   rB   r;   rI   Zis_cpuinputoutr   r   r   run_testJ   s    
rR   c               	   o   s*   t jd}z
d V  W 5 t j| X d S )NF)r-   r2   Z_get_graph_executor_optimize)argskwargsZold_optimizer   r   r   no_fuserY   s    
rU   c              
   C   s(   t   t| |W  5 Q R  S Q R X d S r   )rU   rR   r/   r3   r   r   r   run_baseline_no_fusiona   s    rW   c              
   C   sb   zN|rdgndg}t j|}t jd t| |W  5 Q R  W S Q R X W 5 t j| X d S )N)ZDYNAMICrL   )ZSTATICrL   Zfuser1)r-   jitZset_fusion_strategyfuserrR   )r/   r3   ZdynamicZ	old_stratZstratr   r   r   run_nncf   s    $rZ   c              
   C   s.   t jd t| |W  5 Q R  S Q R X d S )NZfuser2)r-   rX   rY   rR   rV   r   r   r   run_nvfusero   s    r[   )
contextlibr   typingr   r   r   r   r6   r-   rF   Ztorch.utils.benchmarkr   strr$   r2   r9   r.   r=   rE   rK   floatrR   rU   rW   rZ   r[   r   r   r   r   <module>   s    
	