U
    *-e                     @   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   k/var/www/html/Darija-Ai-Train/env/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   
