U
    ©Ê¹j¼  ã                   @   s¤   U d Z ddlmZmZ ddlZddlmZ ddlmZ ddd	d
gZee	 e
d< eeeef dœdd„ZG dd„ dejjƒZeeedœdd	„ZG dd
„ d
ejjƒZdS )z0Arbitrary dependency between two autograd lanes.é    )ÚListÚTupleN)ÚTensoré   )Ú	get_phonyÚforkÚForkÚjoinÚJoinÚ__all__)ÚinputÚreturnc                 C   s4   t  ¡ r| jrt | ¡\} }nt| jdd�}| |fS )z7Branches out from an autograd lane of the given tensor.F©Úrequires_grad)ÚtorchÚis_grad_enabledr   r   Úapplyr   Údevice©r   Úphony© r   úi/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/distributed/pipeline/sync/dependency.pyr      s    c                   @   sB   e Zd Zed eeeef dœdd„ƒZed eeedœdd„ƒZdS )r   )Úctxr   r   c                 C   s   t |jdd�}| ¡ | ¡ fS )NFr   )r   r   Údetach©r   r   r   r   r   r   Úforward   s    zFork.forward)r   Ú
grad_inputÚ	grad_gradr   c                 C   s   |S ©Nr   )r   r   r   r   r   r   Úbackward"   s    zFork.backwardN)Ú__name__Ú
__module__Ú__qualname__Ústaticmethodr   r   r   r   r   r   r   r   r      s   )r   r   r   c                 C   s$   t  ¡ r | js|jr t | |¡} | S )zMerges two autograd lanes.)r   r   r   r
   r   r   r   r   r   r	   '   s    c                   @   sB   e Zd Zed eeedœdd„ƒZed eeedf dœdd„ƒZdS )r
   )r   r   r   r   c                 C   s   |  ¡ S r   )r   r   r   r   r   r   0   s    zJoin.forwardN)r   r   r   c                 C   s   |d fS r   r   )r   r   r   r   r   r   4   s    zJoin.backward)r    r!   r"   r#   r   r   r   r   r   r   r   r   r
   /   s   )Ú__doc__Útypingr   r   r   r   r   r   r   ÚstrÚ__annotations__r   ZautogradÚFunctionr   r	   r
   r   r   r   r   Ú<module>   s   
