o
    h                     @   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 dZee	 e
d< d	ed
eeef fddZG dd dejjZd	eded
ef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   s:   t  r| jrt| \} }| |fS 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   `/var/www/html/ai/venv/lib/python3.10/site-packages/torch/distributed/pipeline/sync/dependency.pyr      s
   r   c                	   @   sL   e Zd Zedd dedeeef fddZedd dededef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
grad_input	grad_gradc                 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   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   r	   c                	   @   sL   e Zd Zedd dededefddZedd dedeedf fd	d
ZdS )r
   r   r   r   r   c                 C   s   |  S r   )r   r   r   r   r   r   0      zJoin.forwardr   Nc                 C   s   |d fS r   r   )r   r   r   r   r   r   4   r$   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   autogradFunctionr   r	   r
   r   r   r   r   <module>   s   
