o
    he"                     @   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   k/var/www/html/construction_image-detection-poc/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}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/   r1   )
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   backwardH   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>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 r=   )requires_grad)xr   r   r   <lambda>m   s    z;make_autograd_impl.<locals>.autograd_impl.<locals>.<lambda>)r   is_grad_enabledr   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)
_namespace_opname_overloadnamer   r4   r3   r   r?   r	   Functionstaticmethodany	argumentsreturnssupports_tensorlist)r   r   namer5   r<   schemarK   r   )rJ   r$   r-   r4   r   r   r   make_autograd_impl   s*   
		rW   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   rZ   r   r[   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)r7   NotImplementedError	unflattenlistrY   r8   r[   flattenrH   rZ   hasattrr9   r^   )r.   r)   r*   r,   flat_resultrZ   )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 )Nr^   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))rc   r_   r^   r`   ra   rZ   r6   rY   r7   r8   rb   not_list_of_optional_tensorr9   )r.   r:   r*   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   )	rb   rH   rZ   r`   ra   r[   r7   r8   len)r)   	flat_argsrY   r*   r,   )r$   
orig_applyr   r   	new_apply   s   z&supports_tensorlist.<locals>.new_apply)r5   r<   rI   r   )rX   rf   rl   rq   r   )r$   rp   rk   re   r   rT   w   s   ,rT   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   ra   rQ   treer   r   r   rH      
   

rH   c                 C   rr   )NFc                 s   s$    | ]}|d uot |t V  qd S r=   rs   rt   r   r   r   rB      s   " z.not_list_of_optional_tensor.<locals>.<genexpr>Trv   rw   r   r   r   rg      ry   rg   )dataclassesr   typingr   r   r   r   torchr   r   r	   r
   torch.utilsr    r   r   r   
OpOverloadrW   rT   rH   rg   tree_flattenrb   tree_unflattenr`   TreeSpecr\   r   r   r   r   <module>   s    `h
