U
    ‰dž  ã                   @   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 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Ú__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   ÚForkÚapplyr   Údevice©r   Úphony© r   úN/tmp/pip-unpacked-wheel-ua33x9lu/torch/distributed/pipeline/sync/dependency.pyÚfork   s    r   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   r	   c                 C   s$   t  ¡ r | js|jr t | |¡} | S )zMerges two autograd lanes.)r   r   r   ÚJoinr   r   r   r   r   Újoin'   s    r#   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   r"   )Ú__doc__Útypingr   r   r   r   r   r   r   ÚstrÚ__annotations__r   ZautogradZFunctionr   r#   r"   r   r   r   r   Ú<module>   s   
