o
    Zhe"                     @   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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ejZejZejZdS )    N)	dataclass)AnyCallableOptionalProtocol)_C_opsautogradTensor)_pytree   )utilsc                   @   &   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   F/var/www/auris/lib/python3.10/site-packages/torch/_library/autograd.pyr      s   
 r   c                   @   r   )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 rXt   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 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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                    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   backwardH   s   

z$make_autograd_impl.<locals>.backward)r1   r8   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                    sV   t  rttdd |tr jg || |R  }|S g || |R  }|S )Nc                 S   s   | j S r9   )Zrequires_grad)xr   r   r   <lambda>m   s    z;make_autograd_impl.<locals>.autograd_impl.<locals>.<lambda>)r   Zis_grad_enabledr   Ztree_any_onlyr
   not_list_of_tensorapply)r   r'   r   r*   )	Generatedr"   r+   r   r   autograd_implk   s   z)make_autograd_impl.<locals>.autograd_impl)Z
_namespaceZ_opnameZ_overloadnamer   r0   r/   r   r:   r	   Functionstaticmethodany	argumentsreturnssupports_tensorlist)r   r   namer1   r8   ZschemarC   r   )rB   r"   r+   r0   r   r   r   make_autograd_impl   s*   
		rK   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                   @   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   rN   r   rO   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rBt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)r3   NotImplementedError	unflattenlistrM   r4   rO   flattenr@   rN   hasattrr5   rR   )r,   r'   r(   r*   Zflat_resultrN   )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	s?|f}t
|t\}}||jkrWtd| d|j dt	|d g S )NrR   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))rW   rS   rR   rT   rU   rN   r2   rM   r3   r4   rV   not_list_of_optional_tensorr5   )r,   r6   r(   r7   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sJ tt||j}|js:t|ts.J t|dks6J |d S |S )N)Zis_leafr   r   )	rV   r@   rN   rT   rU   rO   r3   r4   len)r'   Z	flat_argsrM   r(   r*   )r"   
orig_applyr   r   	new_apply   s   z&supports_tensorlist.<locals>.new_apply)r1   r8   rA   r   )rL   rY   r\   r_   r   )r"   r^   r[   rX   r   rI   w   s   ,rI   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 r9   r3   r
   r;   lr   r   r   r=      s    z%not_list_of_tensor.<locals>.<genexpr>Tr3   r4   rU   rF   treer   r   r   r@      
   

r@   c                 C   r`   )NFc                 s   s$    | ]}|d uot |t V  qd S r9   ra   rb   r   r   r   r=      s   " z.not_list_of_optional_tensor.<locals>.<genexpr>Trd   re   r   r   r   rZ      rg   rZ   )dataclassesr   typingr   r   r   r   Ztorchr   r   r	   r
   Ztorch.utilsr    r   r   r   Z
OpOverloadrK   rI   r@   rZ   Ztree_flattenrV   Ztree_unflattenrT   ZTreeSpecrP   r   r   r   r   <module>   s    `h
