U
    ©Ê¹j§+  ã                   @   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/bwave/python/venv/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_finishNéd   é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�sŒt‚|	 ¡ 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`   Z	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    	 