o
    "i'                      @   s   d dl Z d dl mZ d dlmZ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Dict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   U/home/ubuntu/SoloSpeech/.venv/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}t|tj	ft
|t
|d	 j}td
d g |j|jR D rRt   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   r   strr   r   r   r   r   Metadata   s   
 
r%   c                    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 )N)ctxinputskeyword_only_inputsoutput)r'   r(   r*   )
r	   _AutoDispatchBelowAutogradr!   r"   
redispatch_after_autograd_keysetr   r   fill_defaults_schema)r'   argsmetadatar!   kwargsresult)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_gradr3   )r   r   r   r   backward>   s   

z$make_autograd_impl.<locals>.backward)r5   r<   c                 s   s    | ]	}t |jV  qd S N)r   is_tensorlist_like_typetype).0ar   r   r   	<genexpr>Y   s
    

z%make_autograd_impl.<locals>.<genexpr>c                    s    j g || |R  }|S r=   )apply)r!   r0   r"   r3   )	Generatedr%   r   r   autograd_impla   s   z)make_autograd_impl.<locals>.autograd_impl)
_namespace_opname_overloadnamer   r4   r/   r   r?   r   Functionstaticmethodany	argumentsreturnssupports_tensorlist)r   r   namer5   r<   schemarE   r   )rD   r%   r4   r   r   r   make_autograd_impl   s(   	rQ   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   rT   r   rU   boolr   r   r   r   r%   s   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)r7   NotImplementedError	unflattenlistrS   r8   rU   flattennot_list_of_tensorrT   hasattrr9   rX   )r'   r0   r1   r3   flat_resultrT   )r%   orig_forwardr   r   new_forwardy   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 )NrX   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^   rY   rX   rZ   r[   rT   r6   rS   r7   r8   r\   not_list_of_optional_tensorr9   )r'   r:   r1   r;   grad_inputsflat_grad_inputs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)is_leafr   r   )	r\   r]   rT   rZ   r[   rU   r7   r8   len)r0   	flat_argsrS   r1   r3   )r%   
orig_applyr   r   	new_apply   s   z&supports_tensorlist.<locals>.new_apply)r5   r<   rC   r   )rR   ra   rg   rl   r   )r%   rk   rf   r`   r   rN   h   s   ,rN   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=   r7   r   r@   lr   r   r   rB      s    z%not_list_of_tensor.<locals>.<genexpr>Tr7   r8   r[   rK   treer   r   r   r]      
   

r]   c                 C   rm   )NFc                 s   s$    | ]}|d uot |t V  qd S r=   rn   ro   r   r   r   rB      s   " z.not_list_of_optional_tensor.<locals>.<genexpr>Trq   rr   r   r   r   rb      rt   rb   )dataclassesr   typingr   r   r   r   r    r	   r
   r   r   r   r   r   r   
OpOverloadrQ   rN   r]   rb   tree_flattenr\   tree_unflattenrZ   TreeSpecrV   r   r   r   r   <module>   s    Qh
