
    |Yh"                        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	e          Ze j         G d
 d                      Zde	j        dedefdZdedefdZd Z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__     i/var/www/tools.fuzzalab.pt/emblema-extractor/venv/lib/python3.11/site-packages/torch/_library/autograd.pyr   r      s4         8$$$$))))))r   r   c                   <    e Zd ZU ee         ed<   ee         ed<   dS )Infor   r   Nr   r   r   r   r   r      s4         8$$$$))))))r   r   opinforeturnc                    	
 d j          d j         d j         }t          j         j                  
t           G d d                       fd	
 fd} fd}t          |t          j	        ft          |          t          |          d           j        }t          d	 g |j        |j        R D                       rt                    	fd
}|S )NGeneratedBackwardFor__c                   >    e Zd ZU ej        ed<   eeef         ed<   dS )$make_autograd_impl.<locals>.Metadatakeysetkeyword_only_argsN)	r   r   r   r   DispatchKeySetr   dictstrr   r   r   r   Metadatar$      s5         !!!!S>)))))r   r*   c                      | d         }| d d         } t          j                    5  |j        }|j        } j        |t           j        z  g| R i |}|cd d d            S # 1 swxY w Y   d S )N)r   _AutoDispatchBelowAutogradr%   r&   
redispatch_after_autograd_keyset)argsmetadatar%   kwargsresultr   s        r   forward_no_gradz+make_autograd_impl.<locals>.forward_no_grad!   s    8CRCy*,, 	 	_F/F"R]6B,E#EWWWWPVWWF		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   .A""A&)A&c                    |d         }|d d         }t          j                    5  |j        }|j        } j        |t           j        z  g|R i |}j        rRt          j        j	        ||          \  }}r                    | |||           n                    | ||           |cd d d            S # 1 swxY w Y   d S )Nr,   )ctxinputskeyword_only_inputsoutput)r6   r7   r9   )
r   r-   r%   r&   r.   r/   r   r   fill_defaults_schema)	r6   r0   r1   r%   r2   r3   has_kwarg_only_argsr   r   s	         r   forwardz#make_autograd_impl.<locals>.forward+   sB   8CRCy*,, 	 	_F/F"R]6B,E#EWWWWPVWWF% P  %22:tVLLf& P**&QW +     **s4*OOO/	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   BB;;B?B?c                     j         r^	 | j        }| j        d d         | _         j         | g|R  }|| _        n# || _        w xY 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)r6   gradsprev_needs_input_gradr3   r   r   s       r   backwardz$make_autograd_impl.<locals>.backwardH   s     		 =(+(<%'*';CRC'@$**37777'<$$'<$<<<<&%(( '&&4<8" 8 8 8
 
 	
s	   ); 	A)r=   rE   c              3   H   K   | ]}t          j        |j                  V  d S N)r   is_tensorlist_like_typetype).0as     r   	<genexpr>z%make_autograd_impl.<locals>.<genexpr>c   sC         	%af--     r   c                     t          j                    r(t          j        | r j        g | | |          R  }n g | | |          R  }|S rG   )r   is_grad_enabled_any_requires_gradapply)r%   r0   r&   r3   	Generatedr*   r4   s       r   autograd_implz)make_autograd_impl.<locals>.autograd_implk   s|     	QB$94$@ 	Q$Y_PdPHHV=N,O,OPPPFF$_PdPHHV=N,O,OPPPFr   )
_namespace_opname_overloadnamer   r<   r;   r   rI   r
   Functionstaticmethodany	argumentsreturnssupports_tensorlist)r   r   namer=   rE   schemarR   rQ   r*   r4   r<   s   ``     @@@@r   make_autograd_implr^      s   WWW
WWREUWWD3BJ??* * * * * * * Y*          :
 
 
 
 
 
" 		#G,,$X..	
 	
 I ZF
  56#5fn55     3 (	22	       r   clsc                     | j         | j        | j        t           G d d                      fd}fd}f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                   N    e Zd ZU eed<   dZee         ed<   dZee         ed<   dS )%supports_tensorlist.<locals>.Metadata
input_specNoutput_specresult_is_tuple)	r   r   r   spec_tr   rd   r   re   boolr   r   r   r*   rb      sG         (,Xf%,,,*.$.....r   r*   c                    |d         }|d d         }t          |          st          d          t          t          |          |j                  } | g|R  }t          |t
                    |_        |j        s|f}t          |t                    \  }}||_	        t          | d          rt          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)r@   NotImplementedError	unflattenlistrc   rA   re   flattennot_list_of_tensorrd   hasattrrB   ri   )r6   r0   r1   r3   flat_resultrd   r*   orig_forwards         r   new_forwardz(supports_tensorlist.<locals>.new_forward   s    8CRCy(H-- 	%/  
 dX%899c)D)))#-fe#<#< ' 	YF#*63E#F#F [*3'' 	R   $[!!!r   c                    t          | d          st          d          | j        }t          t	          |          |j                  }| j        }	 t          t	          | j        d d                   |j                  | _         | g|R  }|| _        n# || _        w xY wt          |t                    s|f}t          |t                    \  }}||j        k    rt          d| d|j         d          t          |d gz             S )Nri   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))ro   rj   ri   rk   rl   rd   r?   rc   r@   rA   rm   not_list_of_optional_tensorrB   )r6   rC   r1   rD   grad_inputsflat_grad_inputsgrad_inputs_specorig_backwards          r   new_backwardz)supports_tensorlist.<locals>.new_backward   s]   sN++ 	%9   #$u++x';<< !$ 4	9#,S)#2#.//1D$ $C  (-4e444K#8C  #8C 8888+u-- 	)&.K .54.
 .
** x2222'72 2&2 2 2  
 %.///s   =B 	B c                  0   t          | t                    \  }} |          } g ||R  }|j        J t          t	          |          |j                  }|j        s4t          |t                    sJ t          |          dk    sJ |d         S |S )N)is_leafr   r   )	rm   rn   rd   rk   rl   re   r@   rA   len)r0   	flat_argsrc   r1   r3   r*   
orig_applys        r   	new_applyz&supports_tensorlist.<locals>.new_apply   s     '6H I I I	:8J''1Y1111#///4<<)=>>' 	fe,,,,,v;;!####!9r   )r=   rE   rP   r   )r_   rr   ry   r   r*   r~   rx   rq   s       @@@@r   r[   r[   u   s     ;LLMJ/ / / / / / / Y/
" " " " " "2*0 *0 *0 *0 *0X
 
 
 
 
 
 CKCLCIJr   c                     t          | t                    rdS t          | t                    rt          d | D                       S dS )NFc              3   B   K   | ]}t          |t                     V  d S rG   r@   r   rJ   ls     r   rL   z%not_list_of_tensor.<locals>.<genexpr>   s/      ;;z!V,,,;;;;;;r   Tr@   rA   rl   rX   trees    r   rn   rn      sM    $ u$ <;;d;;;;;;4r   c                     t          | t                    rdS t          | t                    rt          d | D                       S dS )NFc              3   J   K   | ]}|d uot          |t                     V  d S rG   r   r   s     r   rL   z.not_list_of_optional_tensor.<locals>.<genexpr>   s8      MM11D=>Av)>)>%>MMMMMMr   Tr   r   s    r   rt   rt      sN    $ u$ NMMMMMMMM4r   )dataclassesr   typingr   r   r   r   torchr   r	   r
   r   torch.utilsr    r   r   r   
OpOverloadr^   r[   rn   rt   tree_flattenrm   tree_unflattenrk   TreeSpecrf   r   r   r   <module>r      s       ! ! ! ! ! ! 4 4 4 4 4 4 4 4 4 4 4 4 , , , , , , , , , , , ,            * * * * *8 * * *
 * * * * * * * *
[4? [, [8 [ [ [ [|eS eS e e e eP     
"			r   