a
    h"                     @   s   d dl Z d dl mZ d dlmZmZ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e	jeedddZeedddZdd Zdd ZejZejZejZdS )    N)	dataclass)AnyCallableOptionalProtocol)_C_opsautogradTensor)_pytree   )utilsc                   @   s&   e Zd ZU ee ed< ee ed< dS )InfoProtocol_backward_fn_setup_context_fnN__name__
__module____qualname__r   r   __annotations__ r   r   E/var/www/auris/lib/python3.9/site-packages/torch/_library/autograd.pyr      s   
r   c                   @   s&   e Zd ZU ee ed< ee ed< dS )Infor   r   Nr   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 rt   fdd}|S )NZ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   Z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 s`0    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rtj	||\}} rzj| |||d nj| ||d |W  d    S 1 s0    Y  d S )Nr"   )ctxinputsZkeyword_only_inputsoutput)r+   r,   r-   )
r   r#   r   r   r$   r%   r   r   Zfill_defaults_schema)r+   r&   r'   r   r(   r)   )has_kwarg_only_argsr   r   r   r   forward+   s    
z#make_autograd_impl.<locals>.forwardc                    sv    j rbz2| j}| jd d | _ j | g|R  }W || _n|| _0 t|trZg |d R S |d fS td dd S )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   backwardH   s    

z$make_autograd_impl.<locals>.backward)r0   r7   c                 s   s   | ]}t |jV  qd S N)r   Zis_tensorlist_like_typetype).0ar   r   r   	<genexpr>c   s   z%make_autograd_impl.<locals>.<genexpr>c                    sJ   t  r.t j| r. jg || |R  }ng || |R  }|S r8   )r   Zis_grad_enabledZ_any_requires_gradapply)r   r&   r   r)   )	Generatedr!   r*   r   r   autograd_implk   s    z)make_autograd_impl.<locals>.autograd_impl)
_namespaceZ_opnameZ_overloadnamer   r/   r.   r   r9   r	   ZFunctionstaticmethodany	argumentsreturnssupports_tensorlist)r   r   namer0   r7   Zschemar?   r   )r>   r!   r*   r/   r   r   r   make_autograd_impl   s*    
	rG   )clsr   c                    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                   @   s6   e Zd ZU eed< dZee ed< dZee ed< dS )z%supports_tensorlist.<locals>.Metadata
input_specNoutput_specresult_is_tuple)	r   r   r   spec_tr   rJ   r   rK   boolr   r   r   r   r!      s   
r!   c                    s   |d }|d d }t | s&tdtt||j}| g|R  }t |t|_|js^|f}t|t\}}||_	t
| drt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)r2   NotImplementedError	unflattenlistrI   r3   rK   flattennot_list_of_tensorrJ   hasattrr4   rN   )r+   r&   r'   r)   Zflat_resultrJ   )r!   orig_forwardr   r   new_forward   s&    

z(supports_tensorlist.<locals>.new_forwardc                    s   t | dstd| j}tt||j}| j}z6tt| jd d |j| _ | g|R  }W || _n|| _0 t|t	s~|f}t
|t\}}||jkrtd| d|j dt	|d g S )NrN   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))rT   rO   rN   rP   rQ   rJ   r1   rI   r2   r3   rR   not_list_of_optional_tensorr4   )r+   r5   r'   r6   Zgrad_inputsZflat_grad_inputsZgrad_inputs_spec)orig_backwardr   r   new_backward   s6    


z)supports_tensorlist.<locals>.new_backwardc                     sx   t | td\}} |}g ||R  }|jd us8J tt||j}|jstt|ts\J t|dkslJ |d S |S )N)Zis_leafr   r   )	rR   rS   rJ   rP   rQ   rK   r2   r3   len)r&   Z	flat_argsrI   r'   r)   )r!   
orig_applyr   r   	new_apply   s    z&supports_tensorlist.<locals>.new_apply)r0   r7   r=   r   )rH   rV   rY   r\   r   )r!   r[   rX   rU   r   rE   u   s    ,rE   c                 C   s.   t | trdS t | tr*tdd | D S dS )NFc                 s   s   | ]}t |t V  qd S r8   r2   r
   r:   lr   r   r   r<          z%not_list_of_tensor.<locals>.<genexpr>Tr2   r3   rQ   rB   treer   r   r   rS      s
    

rS   c                 C   s.   t | trdS t | tr*tdd | D S dS )NFc                 s   s"   | ]}|d uot |t V  qd S r8   r]   r^   r   r   r   r<      r`   z.not_list_of_optional_tensor.<locals>.<genexpr>Tra   rb   r   r   r   rW      s
    

rW   )Zdataclassesr   typingr   r   r   r   Ztorchr   r   r	   r
   Ztorch.utilsr    r   r   r   Z
OpOverloadrG   rE   rS   rW   Ztree_flattenrR   Ztree_unflattenrP   ZTreeSpecrL   r   r   r   r   <module>   s   ^h