o
    Neõ.  ã                   @   sÈ   d dl mZ d dlZd dlmZ d dlmZ d dlmZ d dlm	Z	m
Z
 ddd	d
dddœdddddddœddddœddddœddddœdddddddœddddd d!d"d#d$d%œ	d&œZG d'd(„ d(ejƒZdS ))é    )Úprint_functionN)Údefaultdict)Úcore)Ú	framework)Ú_C_opsÚ_legacy_C_opsÚgraph_send_recvÚXZ	Src_indexZ	Dst_indexZOutZ	Dst_count)Úfinal_op_nameÚxZ	src_indexZ	dst_indexÚoutZ	dst_countÚmatmulZtrans_xZtrans_yÚY)r
   Ztranspose_xZtranspose_yr   Úyr   Útrunc)r
   r   r   ÚabsÚdigammaÚdiagonalZInputÚoffsetÚaxis1Úaxis2)r
   r   r   r   r   r   Ú	roi_alignZROIsZRoisNumÚpooled_heightÚpooled_widthÚspatial_scaleÚsampling_ratioÚaligned)	r
   r   ZboxesZ	boxes_numr   r   r   r   r   )r   Z	matmul_v2r   r   r   r   r   c                       sZ   e Zd ZdZ‡ fdd„Z		ddd„Z		ddd	„Z		dd
d„Zdd„ Zdd„ Z	‡  Z
S )ÚTraceraë  
    :api_attr: imperative
    
    Tracer is used to execute and record the operators executed, to construct the 
    computation graph in dygraph model. Tracer has two mode, :code:`train_mode`
    and :code:`eval_mode`. In :code:`train_mode`, Tracer would add backward network 
    automatically and perform AutoGrad by method :code:`loss.backward()`. 
    In :code:`eval_mode`, Tracer would not add backward network.

    This is a low level API, users don't need to use it directly.
    c                    s   t t| ƒ ¡  d| _d S ©NT)Úsuperr   Ú__init__Ú_train_mode©Úself©Ú	__class__© úKD:\Projects\ConvertPro\env\Lib\site-packages\paddle/fluid/dygraph/tracer.pyr    l   s   
zTracer.__init__FNc                 C   sÂ  t j| }t  ¡ }t  ¡ }	t  ¡ }
|| }|	| }|
| }g }tt|ƒƒD ]¬}d }|| }|| }|| ¡ v r<|| }nQ|| ¡ v rG|| }nFd|dd … v rf|d d… }|| ¡ v s]J ‚t|| ƒ}|}n'd|dd … v r|d d… }t|ƒ || ¡ v rƒ|| }n
|| ¡ v r|| }|d u r—| 	|¡ q%|dkr®t
|tƒr¨| 	|d ¡ q%| 	|¡ q%|dkr¿t
|tƒs¹J ‚| 	|¡ q%|dksÅJ ‚t
|tƒsÌJ ‚| 	|¡ q%g }| ¡ D ]\}}| 	|¡ | 	|¡ qØ|g |¢|¢R Ž }|dkrt| ¡ ƒd	ksÿJ ‚t| ¡ ƒd }tt|ƒƒD ]}||  || | ¡ qd S t
|tƒrtt|ƒƒD ]R}|| }|| ¡ v r{t
|| tƒr[tt|| ƒƒD ]}|| |  || | d
¡ qGq*t
|| tƒrq|| d  || d
¡ q*||  || d
¡ q*d S t
|tƒr°t| ¡ ƒd	ksJ ‚t| ¡ ƒd }tt|ƒƒD ]}|| |  || d
¡ qžd S t| ¡ ƒd	ks»J ‚t| ¡ ƒd }t
|| tƒr×|| d  |d
¡ d S ||  |d
¡ d S )NÚNuméýÿÿÿZVarÚtensorr   ÚlistÚintZload_combineé   F)r   Ú__dict__Úget_core_ops_args_infoÚget_core_ops_args_type_infoÚget_core_ops_returns_infoÚrangeÚlenÚkeysÚprintÚappendÚ
isinstancer+   r,   ÚitemsZ_share_underline_tensor_toÚtupleÚreconstruct_from_)r#   Úop_typeÚinputsÚoutputsÚattrsÚstop_gradientÚinplace_mapÚfunction_ptrÚcore_ops_args_infoÚcore_ops_args_type_infoÚcore_ops_returns_infoÚop_argsÚop_args_typeÚ
op_returnsÚarg_listÚiÚarg_to_appendÚarg_nameÚarg_typeZout_nameZnum_outsZ
attrs_listÚkÚvÚreturnsÚkeyÚjÚretnamer&   r&   r'   Úeager_legacy_trace_opq   s¢   






ÿÿÿÿ€óÿzTracer.eager_legacy_trace_opc                 C   sä  |t  ¡ v sJ ‚t | d }tj| }t ¡ }t ¡ }	t ¡ }
|| }|	| }|
| }g }tt|ƒƒD ]~}|| }|| }|t |  ¡ v sGJ ‚t | | }|| ¡ v rX|| }n|| ¡ v rc|| }n|| ¡ v rr|dkrr|| }nd }|dkr~| 	|¡ q3|dkr•t
|tƒr| 	|d ¡ q3| 	|¡ q3|dkr¦t
|tƒs J ‚| 	|¡ q3|d u s¬J ‚| 	|¡ q3||Ž }t
|tƒrtt|ƒƒD ]K}|| }|t |  ¡ v sÒJ ‚t | | }|| ¡ v rt
|| tƒrtt|| ƒƒD ]}|| |  || | d¡ qïqÂ|| d  || d¡ qÂd S t
|tƒrAt| ¡ ƒdks!J ‚t| ¡ ƒd }tt|ƒƒD ]}|| |  || d¡ q/d S t| ¡ ƒdksLJ ‚t| ¡ ƒd }t
|| tƒrh|| d  |d¡ d S ||  |d¡ d S )Nr
   Ú r*   r   r+   Fr-   )Úname_mappingr4   r   r.   r/   r0   r1   r2   r3   r6   r7   r+   r9   r:   )r#   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   Zeager_arg_namerL   rK   rJ   rO   Zeager_retnamerR   rQ   rP   r&   r&   r'   Úeager_trace_opÖ   sx   




ÿÿ€ôÿzTracer.eager_trace_opc              	   C   sŒ   t  ¡ s/|t ¡ v r#t| d }|tjv sJ ‚|  ||||||¡ d S |  ||||||¡ d S |  ||||t  	¡ | j
o=| |rA|ni ¡ d S )Nr
   )r   Z_in_legacy_dygraphrU   r4   r   r.   rV   rS   ÚtraceZ_current_expected_placeZ	_has_grad)r#   Útyper<   r=   r>   r?   r@   r&   r&   r'   Útrace_op(  s   ÿÿ
ýzTracer.trace_opc                 C   ó
   d| _ d S r   ©r!   r"   r&   r&   r'   Ú
train_modeA  ó   
zTracer.train_modec                 C   rZ   )NFr[   r"   r&   r&   r'   Ú	eval_modeD  r]   zTracer.eval_mode)FN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r    rS   rV   rY   r\   r^   Ú__classcell__r&   r&   r$   r'   r   _   s    

új
úW
úr   )Ú
__future__r   ÚsixÚcollectionsr   Zpaddle.fluidr   r   Zpaddler   r   rU   r   r&   r&   r&   r'   Ú<module>   sf   ú	úýýýú	÷ÍG