o
    j9:jK#                     @   s   d dl Z d dlmZ d dl mZ d dlmZmZ d dlmZm	Z	m
Z
mZ d dlmZ ddlmZ G d	d
 d
eZe jG dd dZde	jdedefddZdedefddZdd Zdd ZdS )    N)Callable)	dataclass)AnyProtocol)_C_opsautogradTensor)_pytree   )utilsc                   @   &   e Zd ZU edB ed< edB ed< dS )InfoProtocolN_backward_fn_setup_context_fn__name__
__module____qualname__r   __annotations__ r   r   ^/home/nk/hobo-godmode/plappi-mvp/.venv/lib/python3.10/site-packages/torch/_library/autograd.pyr      s   
 r   c                   @   r   )InfoNr   r   r   r   r   r   r   r      s   
 r   opinforeturnc                    s   dj  dj dj }tjtG dd dfddfdd}fd	d
}t|tj	ft
|t
|d j}tdd g |j|jR D rXt   fdd}|S )NGeneratedBackwardFor__c                   @   s(   e Zd ZU ejed< eeef ed< dS )z$make_autograd_impl.<locals>.Metadatakeysetkeyword_only_argsN)	r   r   r   r   DispatchKeySetr   dictstrr   r   r   r   r   Metadata   s   
 
r#   c                     sn   | d }| d d } t   |j}|j} j|t j@ g| R i |}|W  d    S 1 s0w   Y  d S )N)r   _AutoDispatchBelowAutogradr   r   
redispatch_after_autograd_keyset)argsmetadatar   kwargsresult)r   r   r   forward_no_grad"   s   
$z+make_autograd_impl.<locals>.forward_no_gradc                    s   |d }|d d }t  @ |j}|j}j|t j@ g|R i |}jrEtj	||\}} r=j| |||d nj| ||d |W  d    S 1 sQw   Y  d S )Nr$   )ctxinputskeyword_only_inputsoutput)r-   r.   r0   )
r   r%   r   r   r&   r'   r   r   fill_defaults_schema)r-   r(   r)   r   r*   r+   )has_kwarg_only_argsr   r   r   r   forward,   s   
$z#make_autograd_impl.<locals>.forwardc                    sr    j r1z| j}| jd d | _ j | g|R  }W || _n|| _w t|tr-g |d R S |d fS td d)Nr$   zTrying to backward through zQ but no autograd formula was registered. Please use register_autograd to add one.)r   needs_input_grad
isinstancetupleRuntimeError)r-   gradsprev_needs_input_gradr+   )r   r   r   r   backwardI   s   

z$make_autograd_impl.<locals>.backward)r4   r;   c                 s   s    | ]	}t |jV  qd S N)r   is_tensorlist_like_typetype).0ar   r   r   	<genexpr>d   s
    

z%make_autograd_impl.<locals>.<genexpr>c                    sL   t  rt j| r jg || |R  }|S g || |R  }|S r<   )r   is_grad_enabled_any_requires_gradapply)r   r(   r   r+   )	Generatedr#   r,   r   r   autograd_impll   s
   z)make_autograd_impl.<locals>.autograd_impl)
_namespace_opname_overloadnamer   r3   r2   r   r>   r   Functionstaticmethodany	argumentsreturnssupports_tensorlist)r   r   namer4   r;   schemarF   r   )rE   r#   r,   r3   r   r   r   make_autograd_impl   s*   
	rR   clsc                    sb   | j | j| jtG dd d  fdd}fdd} fdd}|| _ || _|| _| S )	a4  Allows a given autograd.Function class to support List[Tensor] inputs/outputs.

    Regular autograd.Function has a constraint that it only directly supports autograd for
    Tensors. Applying @supports_tensorlist enables an autograd.Function to support
    autograd for List[Tensor] inputs and outputs.
    c                   @   s:   e Zd ZU ejed< dZejdB ed< dZedB ed< dS )z%supports_tensorlist.<locals>.Metadata
input_specNoutput_specresult_is_tuple)	r   r   r   r
   TreeSpecr   rU   rV   boolr   r   r   r   r#      s   
 
r#   c                    s   |d }|d d }t | stdtt||j}| g|R  }t |t|_|js0|f}t|t	\}}||_
t| drDtd|| _t|S )Nr$   zNYI: calling supports_tensorlist autograd.Function.forward directly. You should probably be calling .apply instead. Please file an issue if not._pt_metadataz@Please don't set ctx._pt_metadata; PyTorch uses it to store info)r6   NotImplementedErrorr
   tree_unflattenlistrT   r7   rV   tree_flattennot_list_of_tensorrU   hasattrr8   rY   )r-   r(   r)   r+   flat_resultrU   )r#   orig_forwardr   r   new_forward   s&   

z(supports_tensorlist.<locals>.new_forwardc                    s   t | ds	td| j}tt||j}| j}ztt| jd d |j| _ | g|R  }W || _n|| _w t	|t
sA|f}t|t\}}||jkrZtd| d|j dt
|d g S )NrY   zNYI: calling supports_tensorlist autograd.Function.backward directly. This will automatically get called by PyTorch autograd. Please file an issue if you need this.r$   zRExpected the return from backward to be of the same structure as the inputs. Got: z (return from backward), z	 (inputs))r_   rZ   rY   r
   r[   r\   rU   r5   rT   r6   r7   r]   not_list_of_optional_tensorr8   )r-   r9   r)   r:   grad_inputsflat_grad_inputsgrad_inputs_spec)orig_backwardr   r   new_backward   s6   


z)supports_tensorlist.<locals>.new_backwardc                     s   t j| td\}} |}g ||R  }|jd u rtdt t||j}|jsLt|t	s9tdt
| t|dkrHtdt| |d S |S )N)is_leafz%metadata.output_spec must not be Nonezresult must be tuple, got r   z%result tuple must have length 1, got r   )r
   r]   r^   rU   AssertionErrorr[   r\   rV   r6   r7   r>   len)r(   	flat_argsrT   r)   r+   )r#   
orig_applyr   r   	new_apply   s   

z&supports_tensorlist.<locals>.new_apply)r4   r;   rD   r   )rS   rb   rh   rn   r   )r#   rm   rg   ra   r   rO   v   s   ,rO   c                 C   .   t | trdS t | trtdd | D S dS )NFc                 s   s    | ]	}t |t V  qd S r<   r6   r	   r?   lr   r   r   rA      s    z%not_list_of_tensor.<locals>.<genexpr>Tr6   r7   r\   rL   treer   r   r   r^      
   

r^   c                 C   ro   )NFc                 s   s$    | ]}|d uot |t V  qd S r<   rp   rq   r   r   r   rA      s   " z.not_list_of_optional_tensor.<locals>.<genexpr>Trs   rt   r   r   r   rc      rv   rc   )dataclassescollections.abcr   r   typingr   r   torchr   r   r   r	   torch.utilsr
    r   r   r   
OpOverloadrR   rO   r^   rc   r   r   r   r   <module>   s   ^m