U
    9%e+                     @   s   d dl Z d dlmZ d dlZd dlZd dlmZmZmZm	Z	m
Z
 d dlmZmZmZmZmZmZ dgZG dd dZdd ZdS )	    N)warn)_disable_profiler_legacy_enable_profiler_legacy
DeviceTypeProfilerConfigProfilerState)_filter_name_filter_stack_entry_rewrite_name	EventListFunctionEventMEMORY_EVENT_NAMEprofilec                   @   s   e Zd ZdZd)ddddddd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dZejje_dd Zejje_d+eedd d!Zd,d#d$Zejje_d%d& Zejje_ed'd( ZdS )-r   z&DEPRECATED: use torch.profiler insteadTF)use_cudarecord_shapes
with_flopsprofile_memory
with_stackwith_modulesc                C   s   || _ | j sd S || _d | _d| _|| _|| _|  j| jO  _|| _|| _|| _| jrnt	j
 sntd d| _| jr~tj| _ntj| _d S )NFz/CUDA is not available, disabling CUDA profiling)enabledr   function_eventsenteredr   r   r   r   r   torchcudaZis_availabler   r   CUDAprofiler_kindCPU)selfr   r   r   r   r   r   r    r   ]/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/torch/autograd/profiler_legacy.py__init__   s$    
zprofile.__init__c              	   C   s(   t | j| j| j| j| j| jtjj	
 S N)r   r   r   r   r   r   r   r   Z_CZ	_profilerZ_ExperimentalConfigr   r   r   r   config>   s    
zprofile.configc                 C   s*   | j s
d S | jrtdd| _|   | S )Nz)Profiler context manager is not reentrantT)r   r   RuntimeError_start_tracer"   r   r   r   	__enter__J   s    zprofile.__enter__c                 C   s   t |   d S r!   )r   r#   r"   r   r   r   r%   S   s    zprofile._start_tracec                 C   sN   | j s
d S | jrtj  t }t|}t|| j| j| j	d| _
| j
  dS )N)r   r   r   F)r   r   r   r   Zsynchronizer   _parse_legacy_recordsr   r   r   r   Z_build_tree)r   exc_typeexc_valexc_tbrecordsZparsed_resultsr   r   r   __exit__V   s    

zprofile.__exit__c                 C   s   | j d krdS t| j S )Nz$<unfinished profiler_legacy.profile>)r   reprr"   r   r   r   __repr__g   s    
zprofile.__repr__c                 C   s   | j d krdS t| j S )Nz,<unfinished profile.profiler_legacy.profile>)r   strr"   r   r   r   __str__l   s    
zprofile.__str__c                 C   s   | j d krtdd S )NzProfiler didn't finish running)r   r$   r"   r   r   r   _check_finishq   s    
zprofile._check_finishNd   K   7   P   c              	   C   s0   |    | jd k	st| jj|||||||dS )N)sort_by	row_limitmax_src_column_widthmax_name_column_widthmax_shapes_column_widthheadertop_level_events_only)r1   r   AssertionErrortable)r   r6   r7   r8   r9   r:   r;   r<   r   r   r   r>   u   s    
zprofile.tablec                 C   s"   |    | jd k	st| j|S r!   )r1   r   r=   export_chrome_trace)r   pathr   r   r   r?      s    zprofile.export_chrome_traceself_cpu_time_total)r@   metricc                 C   s6   |    | jd k	std| js(td| j||S )NExpected profiling resultsz(export_stacks() requires with_stack=True)r1   r   r=   r   export_stacks)r   r@   rB   r   r   r   rD      s    zprofile.export_stacksr   c                 C   s(   |    | jd k	std| j||S NrC   )r1   r   r=   key_averages)r   Zgroup_by_input_shapeZgroup_by_stack_nr   r   r   rF      s    zprofile.key_averagesc                 C   s$   |    | jd k	std| j S rE   )r1   r   r=   total_averager"   r   r   r   rG      s    zprofile.total_averagec                 C   s   |    | jdk	st| jjS )zkReturns total time spent on CPU obtained as a sum of
        all self times across all the events.
        N)r1   r   r=   rA   r"   r   r   r   rA      s    zprofile.self_cpu_time_total)T)Nr2   r3   r4   r5   NF)rA   )Fr   )__name__
__module____qualname____doc__r    r#   r&   r%   r,   r.   r0   r1   r>   r   r?   r/   rD   rF   rG   propertyrA   r   r   r   r   r      sF    !	       





c                 C   s(  dd }d}d }g }g }t j|  D ] }| }|d kr"|dkr"|}q"|d k	rT| rXt| D ]}i }	i }
i }t }d }|D ]}||}t| s||kr|| q|| dkr |d k	r| | ko| | ko|	 |	 k}|r|| q||||< d|	|< d|
|< n| dkr`||ksHtd| d|| }|	| }|
| }|
 px| | k}| }| }t| |	 t| d	d
t| dd
| ||||| | dd | D | ||||| tjd	|d}|sB| rB||}|dkrB|| | | || ||= |	|= |
|= n| dkrt|	}t|
}||kst|	 D ]}|	|  | 7  < q|
 D ]}|
|  |  7  < q|dkrtdt!d dddg | |  d	d
}|| |}q|q\|j"dd d |S )Nc                 S   s   |   |  fS )zt
        Returns a tuple to be used by _parse_legacy_records for correlating start and
        end records.
        )handlenode_id)recordr   r   r   _get_record_key   s    z._parse_legacy_records.<locals>._get_record_keyr   Z__start_profilepushpopzExpected record with key zo to exist in range_starts.
                    This means that the pop event did not have a corresponding push.T)nameZwith_wildcardFc                 S   s   g | ]}t |r|qS r   )r	   ).0entryr   r   r   
<listcomp>   s     z)_parse_legacy_records.<locals>.<listcomp>)idrN   rS   
trace_namethreadstart_usend_usZ
fwd_threadZinput_shapesstackscopecpu_memory_usagecuda_memory_usageis_async	is_remotesequence_nrZdevice_type	is_legacyflopsZmemory_alloc)
rW   rS   rX   rY   rZ   r[   r\   r^   r_   rc   c                 S   s   | j j| j j gS r!   )Z
time_rangestartend)Zevtr   r   r   <lambda>3      z'_parse_legacy_records.<locals>.<lambda>)key)#	itertoolschainrS   ra   r=   setr   addkindrN   r`   	thread_idrd   r   rM   r
   Zcpu_elapsed_usZfwd_thread_idZshapesr\   r]   rb   r   r   Zhas_cudaZcuda_elapsed_usZappend_kernelZdeviceappendlenkeysr^   r_   r   sort)Zthread_recordsrP   Znext_idZstart_recordZ	functionsZrecord_stackrO   rS   Zthread_record_listZcpu_memory_allocsZcuda_memory_allocsZrange_startsZfiltered_handlesZprev_recordZ
record_keyZ	duplicatere   r^   r_   r`   Zis_remote_eventZstart_flopsZfedurationZnum_open_handles_cpuZnum_open_handles_cudarM   r   r   r   r'      s    










r'   )rj   warningsr   r   Z
torch.cudaZtorch.autogradr   r   r   r   r   Ztorch.autograd.profiler_utilr   r	   r
   r   r   r   __all__r   r'   r   r   r   r   <module>   s    	 