U
    ©Ê¹j­¤  ã                	   @   sB  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m	Z	m
Z
mZmZmZ d dlZd dlmZ dddd	d
dddgZG dd„ deƒZdd„ Zdd„ Zdd„ Zdd„ ZG dd„ dƒZG dd„ dƒZed	dddgƒZG dd
„ d
eƒZG dd„ deƒZG dd„ deƒZG dd„ dƒZd d!„ Zd"Z d#Z!d$d%„ Z"d/d'd(„Z#d0d-d.„Z$dS )1é    N)ÚdefaultdictÚ
namedtuple)Ú
attrgetter)ÚAnyÚDictÚListÚOptionalÚTuple)Ú
DeviceTypeÚ	EventListÚFormattedTimesMixinÚIntervalÚKernelÚFunctionEventÚFunctionEventAvgÚStringTableÚMemRecordsAccc                       s�   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	e
dd„ ƒZd$dd„Zdd„ Zdd„ Zeedœdd„Zd%d d!„Zd"d#„ Z‡  ZS )&r   z&A list of Events (for pretty printing)c                    s`   |  dd¡}|  dd ¡}|  dd¡}|  dd¡}tƒ j||Ž || _|| _|| _d| _|| _d S )NÚuse_cudaTÚ
use_deviceÚprofile_memoryFÚ
with_flops)ÚpopÚsuperÚ__init__Ú	_use_cudaÚ_use_deviceÚ_profile_memoryÚ_tree_builtÚ_with_flops)ÚselfÚargsÚkwargsr   r   r   r   ©Ú	__class__© ú[/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/autograd/profiler_util.pyr      s    zEventList.__init__c                 C   s"   |   ¡  |  ¡  |  ¡  d| _d S )NT)Ú_populate_cpu_childrenÚ_remove_dup_nodesÚ_set_backward_stacktracesr   ©r   r$   r$   r%   Ú_build_tree(   s    zEventList._build_treec                 C   s   |   ¡ S ©N)Útabler)   r$   r$   r%   Ú__str__.   s    zEventList.__str__c                    sÖ   t ƒ ‰ tt| ƒƒD ]†}| | jd k	r| | jj| | jkrt| | jjƒdkr| | j| | j_| | j| | j_| | jD ]}| | j|_q|ˆ  |¡ qtˆ ƒdkr¨qÒ‡ fdd„t| ƒD ƒ}|  	¡  |  
|¡ q d S )Né   r   c                    s   g | ]\}}|ˆ kr|‘qS r$   r$   )Ú.0ÚindZev©Z	to_deleter$   r%   Ú
<listcomp>A   s      z/EventList._remove_dup_nodes.<locals>.<listcomp>)ÚsetÚrangeÚlenÚ
cpu_parentÚnameÚcpu_childrenÚkernelsÚaddÚ	enumerateÚclearÚextend)r   ÚidxÚchZnew_evtsr$   r1   r%   r'   1   s$    ÿþýzEventList._remove_dup_nodesc                 C   sÞ   dd„ | D ƒ}t |tdƒd�}tj|dd„ d�}|D ]¤\}}t |dd„ d�}g }d}|D ]~}	t|ƒdkrÌ|d	 }
|	jj|
jjks�|	jj|
jjkrš| ¡  q\|
 	|	¡ |	j
d
ks¾td|	j› �ƒ‚|	 |
¡ qÌq\| |	¡ qXq4d
S )a4  Populates child events into each underlying FunctionEvent object.
        One event is a child of another if [s1, e1) is inside [s2, e2). Where
        s1 and e1 would be start and end of the child event's interval. And
        s2 and e2 start and end of the parent event's interval

        Example: In event list [[0, 10], [1, 3], [3, 4]] would have make [0, 10]
        be a parent of two other intervals.

        If for any reason two intervals intersect only partially, this function
        will not record a parent child relationship between then.
        c                 S   s"   g | ]}|j s|jtjkr|‘qS r$   )Úis_asyncÚdevice_typer
   ÚCPU©r/   Úevtr$   r$   r%   r2   U   s    þz4EventList._populate_cpu_children.<locals>.<listcomp>Úthread)Úkeyc                 S   s   | j | jfS r+   )rE   Únode_id©Úeventr$   r$   r%   Ú<lambda>b   ó    z2EventList._populate_cpu_children.<locals>.<lambda>c                 S   s   | j j| j j gS r+   )Ú
time_rangeÚstartÚendrH   r$   r$   r%   rJ   t   rK   r   éÿÿÿÿNz(There is already a CPU parent event for )Úsortedr   Ú	itertoolsÚgroupbyr5   rL   rM   rN   r   Úappend_cpu_childr6   ÚAssertionErrorrF   Úset_cpu_parentÚappend)r   Zsync_eventsÚeventsÚthreadsZ	thread_idZthread_eventsZthread_events_Zcurrent_eventsZcur_endrI   Úparentr$   r$   r%   r&   E   sD    þþ ÿþÿþ

ÿ
þ
z EventList._populate_cpu_childrenc                    s    ‡ fdd„‰ i }| D ]8}ˆ |ƒd kr|j d k	r|j|jf}||kr|j ||< q| D ]H}ˆ |ƒ}|d k	rR|jd k	stt‚|j|jf}||kr”|| |_ qRg |_ qRd S )Nc                    s(   | d krd S | j dkr| S ˆ | jƒS d S ©Nr.   )Úscoper6   ©rD   ©Ú	bw_parentr$   r%   r^   Œ   s
    
z6EventList._set_backward_stacktraces.<locals>.bw_parent)ÚstackÚsequence_nrrE   Ú
fwd_threadrT   )r   Z
fwd_stacksrD   ÚtÚpr$   r]   r%   r(   ‹   s    z#EventList._set_backward_stacktracesc                 C   s   t dd„ | D ƒƒS )Nc                 S   s   g | ]
}|j ‘qS r$   ©Úself_cpu_time_total©r/   rI   r$   r$   r%   r2   §   s     z1EventList.self_cpu_time_total.<locals>.<listcomp>)Úsumr)   r$   r$   r%   re   ¥   s    zEventList.self_cpu_time_totalNéd   éK   é7   éP   Fc                 C   s    t | ||||||| j| j|d�
S )a²  Prints an EventList as a nicely formatted table.

        Args:
            sort_by (str, optional): Attribute used to sort entries. By default
                they are printed in the same order as they were registered.
                Valid keys include: ``cpu_time``, ``cuda_time``, ``cpu_time_total``,
                ``cuda_time_total``, ``cpu_memory_usage``, ``cuda_memory_usage``,
                ``self_cpu_memory_usage``, ``self_cuda_memory_usage``, ``count``.
            top_level_events_only(bool, optional): Boolean flag to determine the
                selection of events to display. If true, the profiler will only
                display events at top level like top-level invocation of python
                `lstm`, python `add` or other functions, nested events like low-level
                cpu/cuda ops events are omitted for profiler result readability.

        Returns:
            A string containing the table.
        )	Úsort_byÚ	row_limitÚmax_src_column_widthÚmax_name_column_widthÚmax_shapes_column_widthÚheaderr   r   Útop_level_events_only)Ú_build_tabler   r   )r   rl   rm   rn   ro   rp   rq   rr   r$   r$   r%   r,   ©   s    özEventList.tablec           	      C   s  ddl }| jsdn| j}t|dƒ�è}g }d}| d¡ | D ]–}|jdkrJq:| d |j|jj|j ¡ |j	sp|j
nd|j› d|j
› d	�¡¡ |jD ]>}| d
|j› d|jj› d|j
› d|› d|› d�¡ |d7 }q�q:t| ƒdkrü| | ¡ d |j¡ | ¡  | d¡ W 5 Q R X dS )zäExports an EventList as a Chrome tracing tools file.

        The checkpoint can be later loaded and inspected under ``chrome://tracing`` URL.

        Args:
            path (str): Path where the trace will be written.
        r   NÚcudaÚwú[zc{{"name": "{}", "ph": "X", "ts": {}, "dur": {}, "tid": {}, "pid": "CPU functions", "args": {{}}}}, z
" node_id:z, thread_id:z "z
{"name": "z", "ph": "s", "ts": z	, "tid": z , "pid": "CPU functions", "id": z, "cat": "cpu_to_z", "args": {}}, r.   é   ú])Úosr   ÚopenÚwriteÚ
trace_nameÚformatrL   rM   Ú
elapsed_usÚ	is_remoterE   rG   r9   r5   ÚseekÚtellÚSEEK_SETÚtruncate)	r   Úpathry   Údevice_nameÚfZchrome_eventsZnext_idrD   Úkr$   r$   r%   Úexport_chrome_traceÑ   s8    

ÿôÿ
*ÿzEventList.export_chrome_tracec                 C   s
   dddgS )Nre   Úself_cuda_time_totalÚself_privateuse1_time_totalr$   r)   r$   r$   r%   Úsupported_export_stacks_metrics
  s    ýz)EventList.supported_export_stacks_metrics)r„   Úmetricc           	   	   C   sÎ   ||   ¡ kr tdt|   ¡ ƒ ƒ‚t dd¡}t|dƒ�Ž}| D ]‚}|jr<t|jƒdkr<t||ƒ}t|ƒdkr<d}t	|jƒD ]}|| 
|¡7 }|d7 }qx|d d… d	 tt|ƒƒ }| |d
 ¡ q<W 5 Q R X d S )Nzmetric should be one of: z ;	
Z____ru   r   Ú ú;rO   ú Ú
)r‹   Ú
ValueErrorÚstrÚ	maketransrz   r_   r5   ÚgetattrÚintÚreversedÚ	translater{   )	r   r„   rŒ   Ztranslate_tabler†   rD   Zmetric_valueZ	stack_strÚentryr$   r$   r%   Úexport_stacks  s$    
ÿÿ

zEventList.export_stacksr   c                 C   sŽ   | j s
t‚ttƒ}ttdf dœdd„}| D ]}|||||ƒ  |¡ q,t| ¡ | j	| j
| j| jd�}|D ]}|jd|… |_|sjd|_qj|S )aH  Averages all function events over their keys.

        Args:
            group_by_input_shapes: group entries by
                (event name, input shapes) rather than just event name.
                This is useful to see which input shapes contribute to the runtime
                the most and may help with size-specific optimizations or
                choosing the best candidates for quantization (aka fitting a roof line)

            group_by_stack_n: group by top n stack trace entries

        Returns:
            An EventList containing FunctionEventAvg objects.
        .)Úreturnc                 S   sZ   t | jƒt | jƒt | jƒt | jƒg}|r8| t | jƒ¡ |dkrR|| jd |… 7 }t|ƒS ©Nr   )	r’   rF   rG   rA   Ú	is_legacyrV   Úinput_shapesr_   Útuple)rI   Úgroup_by_input_shapesÚgroup_by_stack_nrF   r$   r$   r%   Úget_key6  s    üz'EventList.key_averages.<locals>.get_key©r   r   r   r   Nr�   )r   rT   r   r   r	   r’   r:   r   Úvaluesr   r   r   r   r_   r�   )r   rŸ   r    Ústatsr¡   rD   Zavg_listr$   r$   r%   Úkey_averages$  s"    
ûzEventList.key_averagesc                 C   s(   t ƒ }| D ]}||7 }d|_q
d|_|S )zVAverages all events.

        Returns:
            A FunctionEventAvg object.
        NZTotal)r   rF   )r   Z
total_statrD   r$   r$   r%   Útotal_averageS  s    zEventList.total_average)Nrh   ri   rj   rk   NF)Fr   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r*   r-   r'   r&   r(   Úpropertyre   r,   rˆ   r‹   r’   r™   r¥   r¦   Ú__classcell__r$   r$   r"   r%   r      s,   F
       ø
(9
/c                 C   sD   d}d}| |kr | | d›d�S | |kr8| | d›d�S | d›d�S )ú+Defines how to format time in FunctionEventg    €„.Ag     @�@z.3fÚsÚmsÚusr$   )Útime_usZUS_IN_SECONDZUS_IN_MSr$   r$   r%   Ú_format_timea  s    r²   c                 C   s6   |dkr"| dkst d| › �ƒ‚dS | d | d›d�S )r­   r   zExpected time_us == 0 but got ÚNaNg      Y@ú.2fú%)rT   )r±   Ztotal_time_usr$   r$   r%   Ú_format_time_sharel  s    r¶   c                 C   s„   d}d| }d| }t | ƒ|kr4| d | d›d�S t | ƒ|krT| d | d›d�S t | ƒ|krt| d | d›d�S t| ƒd S dS )	z&Returns a formatted memory size stringi   ç      ð?r´   z Gbz Mbz Kbz bN)Úabsr’   )ÚnbytesZKBÚMBÚGBr$   r$   r%   Ú_format_memoryt  s    r¼   c                    s   t ‡ fdd„ƒS )Nc                    s   t t| ˆ ƒƒS r+   )r²   r”   r)   ©r7   r$   r%   rJ   „  rK   z!_attr_formatter.<locals>.<lambda>)r«   r½   r$   r½   r%   Ú_attr_formatterƒ  s    r¾   c                   @   s|   e Zd ZdZedƒZedƒZedƒZedƒZedƒZ	edƒZ
edƒZed	ƒZed
ƒZedd„ ƒZedd„ ƒZedd„ ƒZdS )r   z{Helpers for FunctionEvent and FunctionEventAvg.

    The subclass should define `*_time_total` and `count` attributes.
    Úcpu_timeÚ	cuda_timeÚprivateuse1_timeÚcpu_time_totalÚcuda_time_totalÚprivateuse1_time_totalre   r‰   rŠ   c                 C   s   | j dkrdS d| j | j  S ©Nr   g        r·   )ÚcountrÂ   r)   r$   r$   r%   r¿   —  s    zFormattedTimesMixin.cpu_timec                 C   s   | j dkrdS d| j | j  S rÅ   )rÆ   rÃ   r)   r$   r$   r%   rÀ   ›  s    zFormattedTimesMixin.cuda_timec                 C   s   | j dkrdS d| j | j  S rÅ   )rÆ   rÄ   r)   r$   r$   r%   rÁ   Ÿ  s    z$FormattedTimesMixin.privateuse1_timeN)r§   r¨   r©   rª   r¾   Úcpu_time_strÚcuda_time_strÚprivateuse1_time_strÚcpu_time_total_strÚcuda_time_total_strÚprivateuse1_time_total_strÚself_cpu_time_total_strÚself_cuda_time_total_strÚself_privateuse1_time_total_strr«   r¿   rÀ   rÁ   r$   r$   r$   r%   r   ‡  s    

c                   @   s   e Zd Zdd„ Zdd„ ZdS )r   c                 C   s   || _ || _d S r+   )rM   rN   )r   rM   rN   r$   r$   r%   r   ¥  s    zInterval.__init__c                 C   s   | j | j S r+   )rN   rM   r)   r$   r$   r%   r~   ©  s    zInterval.elapsed_usN)r§   r¨   r©   r   r~   r$   r$   r$   r%   r   ¤  s   r7   ÚdeviceÚdurationc                   @   sØ   e Zd ZdZddddddddddddejdddddfdd„Zdd	„ Zd
d„ Zdd„ Z	e
dd„ ƒZe
dd„ ƒZe
dd„ ƒZe
dd„ ƒZe
dd„ ƒZe
dd„ ƒZe
dd„ ƒZe
dd„ ƒZe
dd„ ƒZe
d d!„ ƒZd"d#„ ZdS )$r   z.Profiling information about a single function.Nr   FrO   c                 C   s¦   || _ || _|| _|| _t||ƒ| _|| _|| _g | _d| _	g | _
d | _|| _|| _|| _|	| _|
| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _d S rZ   )ÚidrG   r7   r|   r   rL   rE   ra   r9   rÆ   r8   r6   r�   Úconcrete_inputsr_   r[   r   Úcpu_memory_usageÚcuda_memory_usageÚprivateuse1_memory_usager@   r   r`   rA   Údevice_indexrœ   Úflops)r   rÒ   r7   rE   Ústart_usÚend_usra   r�   r_   r[   r   rÔ   rÕ   rÖ   r@   r   r`   rG   rA   r×   rœ   rØ   r|   rÓ   r$   r$   r%   r   ³  s4    zFunctionEvent.__init__c                 C   s(   | j tjkst‚| j t|||ƒ¡ d S r+   )rA   r
   rB   rT   r9   rV   r   )r   r7   rÐ   rÑ   r$   r$   r%   Úappend_kernelè  s    zFunctionEvent.append_kernelc                 C   s>   | j tjkst‚t|tƒst‚|j tjks.t‚| j |¡ dS )z­Append a CPU child of type FunctionEvent.

        One is supposed to append only direct children to the event to have
        correct self cpu time being reported.
        N)rA   r
   rB   rT   Ú
isinstancer   r8   rV   )r   Úchildr$   r$   r%   rS   ì  s    zFunctionEvent.append_cpu_childc                 C   s8   | j tjkst‚t|tƒst‚|j tjks.t‚|| _dS )a#  Set the immediate CPU parent of type FunctionEvent

        One profiling FunctionEvent should have only one CPU parent such that
        the child's range interval is completely inside the parent's. We use
        this connection to determine the event is from top-level op or not.
        N)rA   r
   rB   rT   rÜ   r   r6   )r   rY   r$   r$   r%   rU   ÷  s    zFunctionEvent.set_cpu_parentc                 C   s0   | j s| jtjkrdS | jtdd„ | jD ƒƒ S )Nr   c                 S   s   g | ]
}|j ‘qS r$   )rÔ   ©r/   rÝ   r$   r$   r%   r2   
  s     z7FunctionEvent.self_cpu_memory_usage.<locals>.<listcomp>)r@   rA   r
   rB   rÔ   rg   r8   r)   r$   r$   r%   Úself_cpu_memory_usage  s
    ÿz#FunctionEvent.self_cpu_memory_usagec                 C   s0   | j s| jtjkrdS | jtdd„ | jD ƒƒ S )Nr   c                 S   s   g | ]
}|j ‘qS r$   )rÕ   rÞ   r$   r$   r%   r2     s     z8FunctionEvent.self_cuda_memory_usage.<locals>.<listcomp>)r@   rA   r
   rB   rÕ   rg   r8   r)   r$   r$   r%   Úself_cuda_memory_usage  s
    ÿz$FunctionEvent.self_cuda_memory_usagec                 C   s0   | j s| jtjkrdS | jtdd„ | jD ƒƒ S )Nr   c                 S   s   g | ]
}|j ‘qS r$   )rÖ   rÞ   r$   r$   r%   r2     s     z?FunctionEvent.self_privateuse1_memory_usage.<locals>.<listcomp>)r@   rA   r
   rB   rÖ   rg   r8   r)   r$   r$   r%   Úself_privateuse1_memory_usage  s
    ÿz+FunctionEvent.self_privateuse1_memory_usagec                 C   s0   | j s| jtjkrdS | jtdd„ | jD ƒƒ S )Nr   c                 S   s   g | ]
}|j ‘qS r$   )rÂ   rÞ   r$   r$   r%   r2   "  s     z5FunctionEvent.self_cpu_time_total.<locals>.<listcomp>)r@   rA   r
   rB   rÂ   rg   r8   r)   r$   r$   r%   re     s
    ÿz!FunctionEvent.self_cpu_time_totalc                 C   s~   | j s| jrdS | jtjkr`| jsJtdd„ | jD ƒƒtdd„ | jD ƒƒ S tdd„ | jD ƒƒS n| jtj	kspt
‚| j ¡ S d S )Nr   c                 s   s   | ]}|j V  qd S r+   ©rÑ   ©r/   Zkinfor$   r$   r%   Ú	<genexpr>,  s     z0FunctionEvent.cuda_time_total.<locals>.<genexpr>c                 s   s   | ]}|j V  qd S r+   ©rÃ   ©r/   r?   r$   r$   r%   rä   ,  s    c                 s   s   | ]}|j V  qd S r+   râ   rã   r$   r$   r%   rä   1  s     )r@   r   rA   r
   rB   rœ   rg   r9   r8   ÚCUDArT   rL   r~   r)   r$   r$   r%   rÃ   %  s    ÿ
zFunctionEvent.cuda_time_totalc                 C   sP   | j s| jrdS | jtjkr6| jtdd„ | jD ƒƒ S | jtjksFt	‚| jS d S )Nr   c                 S   s   g | ]
}|j ‘qS r$   rå   rÞ   r$   r$   r%   r2   <  s     z6FunctionEvent.self_cuda_time_total.<locals>.<listcomp>)
r@   r   rA   r
   rB   rÃ   rg   r8   rç   rT   r)   r$   r$   r%   r‰   6  s    ÿz"FunctionEvent.self_cuda_time_totalc                 C   s   | j tjkr| j ¡ S dS d S r›   )rA   r
   rB   rL   r~   r)   r$   r$   r%   rÂ   B  s    
zFunctionEvent.cpu_time_totalc                 C   sP   | j s| jsdS | jtjkr6| jtdd„ | jD ƒƒ S | jtjksFt	‚| jS d S )Nr   c                 S   s   g | ]
}|j ‘qS r$   ©rÄ   rÞ   r$   r$   r%   r2   O  s     z=FunctionEvent.self_privateuse1_time_total.<locals>.<listcomp>)
r@   r   rA   r
   rB   rÄ   rg   r8   rç   rT   r)   r$   r$   r%   rŠ   I  s    ÿz)FunctionEvent.self_privateuse1_time_totalc                 C   s~   | j s| jsdS | jtjkr`| jsJtdd„ | jD ƒƒtdd„ | jD ƒƒ S tdd„ | jD ƒƒS n| jtj	kspt
‚| j ¡ S d S )Nr   c                 s   s   | ]}|j V  qd S r+   râ   rã   r$   r$   r%   rä   \  s     z7FunctionEvent.privateuse1_time_total.<locals>.<genexpr>c                 s   s   | ]}|j V  qd S r+   rè   ræ   r$   r$   r%   rä   \  s    c                 s   s   | ]}|j V  qd S r+   râ   rã   r$   r$   r%   rä   a  s     )r@   r   rA   r
   rB   rœ   rg   r9   r8   ÚPrivateUse1rT   rL   r~   r)   r$   r$   r%   rÄ   U  s    ÿ
z$FunctionEvent.privateuse1_time_totalc                 C   s   | j S r+   r½   r)   r$   r$   r%   rF   f  s    zFunctionEvent.keyc                 C   sš   | j s
dn| j }| j s| jn| j}| j s.| jn| j}d | j| j| j| j	| j
| jj| jjtdd„ | jD ƒƒ||| j| jt| jƒ| j||| j| j| j| j¡S )Nrt   zí<FunctionEvent id={} name={} device_type={} node_id={} cpu_time={} start_us={} end_us={} cpu_children={} {}_time={} name={} thread={} input_shapes={} cpu_memory_usage={} {}_memory_usage={} is_async={} is_remote={} seq_nr={} is_legacy={}>c                 S   s   g | ]
}|j ‘qS r$   )rÒ   rÞ   r$   r$   r%   r2     s     z*FunctionEvent.__repr__.<locals>.<listcomp>)r   rÈ   rÉ   rÕ   rÖ   r}   rÒ   r7   rA   rG   rÇ   rL   rM   rN   r’   r8   rE   r�   rÔ   r@   r   r`   rœ   )r   r…   Údevice_timeZdevice_memory_usager$   r$   r%   Ú__repr__j  s<    ÿÿýêÿzFunctionEvent.__repr__)r§   r¨   r©   rª   r
   rB   r   rÛ   rS   rU   r«   rß   rà   rá   re   rÃ   r‰   rÂ   rŠ   rÄ   rF   rë   r$   r$   r$   r%   r   °  sX   	è
5









c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )r   z:Used to average stats over multiple FunctionEvent objects.c                 C   s¢   d | _ d| _d| _d| _d| _d | _d| _d| _d| _d| _	d| _
d| _d | _d | _d | _d| _d| _d| _d| _d| _d| _d | _d | _tj| _d| _d| _d S )Nr   F)rF   rÆ   rG   r@   r   r   rÂ   rÃ   rÄ   re   r‰   rŠ   r�   r_   r[   rÔ   rÕ   rÖ   rß   rà   rá   r8   r6   r
   rB   rA   rœ   rØ   r)   r$   r$   r%   r   “  s4    zFunctionEventAvg.__init__c                 C   s’  | j d krj|j | _ |j| _|j| _|j| _|j| _|j| _|j| _|j| _|j| _|j	| _	|j
| _
|j| _t|ttfƒs|t‚|j | j ksŒt‚|  j|j7  _|  j|j7  _|  j|j7  _|  j|j7  _|  j|j7  _|  j|j7  _|  j|j7  _|  j|j7  _|  j|j7  _|  j|j7  _|  j|j7  _|  j|j7  _|  j|j7  _| jd k�rr|j| _n|jd k	�rŽ|  j|j7  _| S r+   )rF   rG   r@   r   r6   r8   r�   r_   r[   rA   rœ   r   rÜ   r   r   rT   rÂ   rÃ   rÄ   re   r‰   rŠ   rÔ   rÕ   rÖ   rß   rà   rá   rÆ   rØ   ©r   Úotherr$   r$   r%   r:   ¯  sB    

zFunctionEventAvg.addc                 C   s
   |   |¡S r+   )r:   rì   r$   r$   r%   Ú__iadd__Ö  s    zFunctionEventAvg.__iadd__c                 C   sr   | j s
dn| j }| j s| jn| j}| j s.| jn| j}| j s@| jn| j}d | j| j	| j
||||t| jƒ| j||¡S )Nrt   z‰<FunctionEventAvg key={} self_cpu_time={} cpu_time={}  self_{}_time={} {}_time={} input_shapes={} cpu_memory_usage={} {}_memory_usage={}>)r   rÎ   rÏ   rÈ   rÉ   rÕ   rÖ   r}   rF   rÍ   rÇ   r’   r�   rÔ   )r   r…   Zself_device_timerê   Zdevice_memoryr$   r$   r%   rë   Ù  s2    ÿýÿÿýóÿzFunctionEventAvg.__repr__N)r§   r¨   r©   rª   r   r:   rî   rë   r$   r$   r$   r%   r   �  s
   'c                   @   s   e Zd Zdd„ ZdS )r   c                 C   s(   t |ƒdkrtj |¡n|| |< | | S rZ   )r5   ÚtorchZ_CZ	_demangle)r   rF   r$   r$   r%   Ú__missing__ü  s     zStringTable.__missing__N)r§   r¨   r©   rð   r$   r$   r$   r%   r   û  s   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )r   z<Acceleration structure for accessing mem_records in intervalc                 C   sH   || _ g | _g | _t|ƒdkrDtdd„ t|ƒD ƒƒ}t|Ž \| _| _d S )Nr   c                 S   s    g | ]\}}|d    ¡ |f‘qS )r   )rÙ   )r/   ÚiÚrr$   r$   r%   r2     s     z*MemRecordsAcc.__init__.<locals>.<listcomp>)Ú_mem_recordsÚ_start_usesÚ_indicesr5   rP   r;   Úzip)r   Zmem_recordsÚtmpr$   r$   r%   r     s    zMemRecordsAcc.__init__c                 c   sB   t  | j|¡}t  | j|¡}t||ƒD ]}| j| j|  V  q&d S r+   )ÚbisectÚbisect_leftrô   Úbisect_rightr4   ró   rõ   )r   rÙ   rÚ   Z	start_idxZend_idxrñ   r$   r$   r%   Úin_interval  s    zMemRecordsAcc.in_intervalN)r§   r¨   r©   rª   r   rû   r$   r$   r$   r%   r     s   c                    s&   ddddddg}t ‡ fdd„|D ƒƒS )	N)úautograd/__init__Z_make_grads)rü   Úbackward)ztorch/tensorrý   )ú_internal/common_utilsZprof_callable)rþ   Zprof_func_call)rþ   Zprof_meth_callc                 3   s(   | ] }|d  ˆ ko|d ˆ k V  qdS )r   r.   Nr$   )r/   r†   ©r˜   r$   r%   rä     s     z&_filter_stack_entry.<locals>.<genexpr>)Úall)r˜   Zfiltered_entriesr$   rÿ   r%   Ú_filter_stack_entry  s    úr  z[memory]z[OutOfMemory]c                 C   s   t tddddddg}| |kS )Nz profiler::_record_function_enterz$profiler::_record_function_enter_newzprofiler::_record_function_exitzaten::is_leafzaten::output_nrzaten::_version)ÚMEMORY_EVENT_NAMEÚOUT_OF_MEMORY_EVENT_NAME)r7   Zfiltered_out_namesr$   r$   r%   Ú_filter_name&  s    ø
r  Fc                 C   s$   t ƒ }||  } |r |  d¡r d} | S )NzProfilerStep#zProfilerStep*)r   Ú
startswith)r7   Zwith_wildcardZstring_tabler$   r$   r%   Ú_rewrite_name9  s    
r  rh   ri   rj   rk   c
           0         s:  t | ƒdkrdS tdd„ | D ƒƒ}
tdd„ | D ƒƒ}tdd„ | D ƒƒ}tdd„ | D ƒƒ}| d j}|sv|sn|rvtdƒ‚td	d„ | D ƒƒ}ˆd
k	r´tt| ‡fdd„dd�|
|||d�} tdd„ | D ƒƒd }|d
k	rÜt||ƒ}tdd„ | D ƒƒd }|d
k	�rt||ƒ}d}|}d
}g }| D ].}|jd
k	�rt |jƒdk�r| 	|j¡ �qt |ƒdk}|�r†tdd„ |D ƒƒd }|d
k	�r†t||ƒ}ddddddg}|
�r®| 
ddddg¡ |�rè| ¡ }| 
d |› �d |› d!�|› d"�|› d#�g¡ |�r:| 
d$d%g¡ |�r| 
d&d'g¡ |�r:| ¡ }| 
|› d(�d |› d(�g¡ | 	d)¡ td*d„ | D ƒƒ}|�rf| 	d+¡ d,‰ dg‰dg‰ˆ  g‰d-}dH‡ ‡‡‡fd/d0„	}d1d2„ }||ƒ |d3d
… D ]}||ƒ �q²|�rÚ| 	d4¡ ||ƒ |�rö| 	d5¡ ||d6d7� |�r`g }| D ]}|jdk�r| 	|j¡ �qt |ƒdk�r\|t|ƒƒ\} }!| 	d8|!› �¡ ||ƒ nd9}ˆd }"ˆd }#ˆd }$d
}g ‰‡fd:d;„}%td<d„ | D ƒƒ}&d}'d}(| D ]l}|jtjk�râ|j�r|�sÖ|'|j7 }'n
|(|j7 }(n2|jtjk�rü|'|j7 }'n|jtjk�rª|(|j7 }(�qª|d
k	�r6|%d=|$ ƒ |%|ƒ |	�rP|%d=|$ ƒ |%d>ƒ |%|#ƒ |%|"j|Ž ƒ |%|#ƒ d?d@„ })d}*| D �]Z}|*|k�r” �qÜ|	�r¬|jd
k	�r¬�q~n|*d37 }*|j}+|d
k	�rêt |+ƒ|dA k�rê|+d
|dA … dB }+|+t|j|&ƒ|j|j�st|j|&ƒnd|j|jg},|
�rB|, 
|j t|j|'ƒ|j!|j"g¡ |�rh|, 
|j#t|j|(ƒ|j$|j%g¡ |�rÈ|, 
t&|j'ƒt&|j(ƒg¡ |�r¨|, 
t&|j)ƒt&|j*ƒg¡ |�rÈ|, 
t&|j+ƒt&|j,ƒg¡ |, 	|j-¡ |�ræ|, 	|j.¡ |�r|, 	t/|j0ƒd
|… ¡ |�r6|jdk�r"|, 	dC¡ n|, 	|j|  dD›¡ |�rjd}-t |jƒdk�r`|)|jd |ƒ}-|, 	|-¡ |%|"j|,Ž ƒ |�r~dgt |ƒd3  }.|jd3|… D ] }/|%|"j|.|)|/|ƒg Ž ƒ �qž|. 	d¡ |%|"j|.Ž ƒ �q~|%|#ƒ |%dEt1|&ƒ› �ƒ |
�r|%dFt1|'ƒ› �ƒ |�r0|%d | ¡ › dGt1|(ƒ› �ƒ d 2ˆ¡S )IzVPrints a summary of events (which can be a list of FunctionEvent or FunctionEventAvg).r   r�   c                 s   s   | ]}|j d kV  qdS ©r   N)r‰   rf   r$   r$   r%   rä   R  s     z_build_table.<locals>.<genexpr>c                 s   s   | ]}|j d kV  qdS r  )rà   rf   r$   r$   r%   rä   S  s     c                 s   s   | ]}|j d kV  qdS r  )rŠ   rf   r$   r$   r%   rä   T  s    c                 s   s   | ]}|j d kV  qdS r  )rá   rf   r$   r$   r%   rä   W  s    zAuse_device is None, but there is private device performance data.c                 s   s&   | ]}|j d k	ot|j ƒdkV  qd S r›   )r�   r5   rf   r$   r$   r%   rä   `  s   ÿNc                    s
   t | ˆ ƒS r+   )r”   r\   )rl   r$   r%   rJ   g  rK   z_build_table.<locals>.<lambda>T)rF   Úreverser¢   c                 S   s   g | ]}t |jƒ‘qS r$   )r5   rF   rC   r$   r$   r%   r2   n  s     z _build_table.<locals>.<listcomp>é   c                 S   s   g | ]}t t|jƒƒ‘qS r$   )r5   r’   r�   rC   r$   r$   r%   r2   r  s     é   c                 S   s   g | ]}t d d„ |D ƒƒ‘qS )c                 S   s   g | ]}t |ƒ‘qS r$   ©r5   )r/   r˜   r$   r$   r%   r2   �  s     z+_build_table.<locals>.<listcomp>.<listcomp>)Úmax)r/   r_   r$   r$   r%   r2   �  s     ÚNamez
Self CPU %zSelf CPUzCPU total %z	CPU totalzCPU time avgz	Self CUDAzSelf CUDA %z
CUDA totalzCUDA time avgzSelf z %z totalz	 time avgzCPU MemzSelf CPU MemzCUDA MemzSelf CUDA Memz Memz
# of Callsc                 s   s   | ]}|j d kV  qdS )rO   N)rG   rC   r$   r$   r%   rä   ¹  s     zNode IDrw   é   ú>c                    s\   ˆd  d| t | ƒ d dˆ   7  < ˆd  d|  dˆ   7  < ˆd  | ˆ  7  < d S )Nr   z{: Ú}r�   ú-)r’   )ÚpaddingÚtext_dir)ÚSPACING_SIZEÚheader_sep_lstÚline_length_lstÚrow_format_lstr$   r%   Ú
add_columnÄ  s
    ÿz _build_table.<locals>.add_columnc                 S   sz   ddddddg}| dkst ‚tdtt | ¡d tt|ƒd	 ƒƒƒ}|dkrV|t|ƒk sZt ‚td
t |¡d ƒ|t	|ƒ fS )NZFLOPsZKFLOPsZMFLOPsZGFLOPsZTFLOPsZPFLOPsr   é   r.   é
   g      À)
rT   r  ÚminÚmathÚlog10Úfloatr5   ÚpowÚfloorr•   )rØ   Zflop_headersZ	log_flopsr$   r$   r%   Úauto_scale_flopsË  s    ú&z&_build_table.<locals>.auto_scale_flopsr.   zInput ShapeszSource Locationú<)r  zTotal Fc                    s   ˆ   | ¡ ˆ   d¡ d S )Nr�   )rV   )r®   )Úresultr$   r%   rV   ú  s    
z_build_table.<locals>.appendc                 S   s   g | ]
}|j ‘qS r$   rd   rf   r$   r$   r%   r2   þ  s     ú=z1This report only display top-level ops statisticsc                 S   sD   t | ƒ|kr@t | ƒ| }| |d … } t | ƒdkr@d| dd …  } | S )Nr  ú...r  )r„   Úsrc_column_widthÚoffsetr$   r$   r%   Ú	trim_path  s    z_build_table.<locals>.trim_pathr  r%  z--z8.3fzSelf CPU time total: zSelf CUDA time total: z time total: )r  )3r5   Úanyr   ÚRuntimeErrorr   rP   r  r  r_   rV   r=   ÚupperrØ   rg   rA   r
   rB   rœ   r‰   rŠ   rç   ré   r}   r6   rF   r¶   re   rÍ   r@   rÂ   rÊ   rÇ   rÎ   rË   rÈ   rÏ   rÌ   rÉ   r¼   rÔ   rß   rÕ   rà   rÖ   rá   rÆ   rG   r’   r�   r²   Újoin)0rW   rl   rq   rm   rn   ro   rp   r   r   rr   Zhas_cuda_timeZhas_cuda_memZhas_privateuse1_timeZhas_privateuse1_memr   Zhas_input_shapesZname_column_widthZshapes_column_widthZDEFAULT_COLUMN_WIDTHZflops_column_widthr&  ÚstacksrD   Z	has_stackÚheadersZprivateuse1Zappend_node_idZMAX_STACK_ENTRYr  r!  Ú_Z	raw_flopsZflops_scaleZflops_headerZ
row_formatZ
header_sepÚline_lengthrV   Zsum_self_cpu_time_totalZsum_self_cuda_time_totalZsum_self_privateuse1_time_totalr(  Zevent_limitr7   Z
row_valuesZ	src_fieldZempty_headersr˜   r$   )r  r  r  r#  r  rl   r%   rs   B  sä   ÿÿ
ÿþû


ÿ

úüÿ
üÿþÿþÿ
þÿ








ÿö ÿùÿ ÿùÿüÿüÿüÿÿ
ÿÿ
ÿrs   )F)	NNrh   ri   rj   rk   FFF)%rø   rQ   r  Úcollectionsr   r   Úoperatorr   Útypingr   r   r   r   r	   rï   Ztorch.autogradr
   Ú__all__Úlistr   r²   r¶   r¼   r¾   r   r   r   r   r   r   r   r  r  r  r  r  rs   r$   r$   r$   r%   Ú<module>   s\   ø  J	 ak	
         ö