
    BjK#                         d dl Z d dlmZ d dl mZ d dl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dS )    N)Callable)	dataclass)AnyProtocol)_C_opsautogradTensor)_pytree   )utilsc                   0    e Zd ZU edz  ed<   edz  ed<   dS )InfoProtocolN_backward_fn_setup_context_fn__name__
__module____qualname__r   __annotations__     Z/var/www/html/Carbon-Document/venv/lib/python3.11/site-packages/torch/_library/autograd.pyr   r      s2         T/!!!$&&&&&r   r   c                   0    e Zd ZU edz  ed<   edz  ed<   dS )InfoNr   r   r   r   r   r   r   r      s2         T/!!!$&&&&&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)r5   r6   r8   )
r   r,   r$   r%   r-   r.   r   r   fill_defaults_schema)	r5   r/   r0   r$   r1   r2   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)r5   gradsprev_needs_input_gradr2   r   r   s       r   backwardz$make_autograd_impl.<locals>.backwardI   s     		 =(+(<%'*';CRC'@$**37777'<$$'<$<<<<&%(( '&&4<8" 8 8 8
 
 	
s	   ); 	A)r<   rD   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>d   sC         	%af--     r   c                     t          j                    r(t          j        | r j        g | | |          R  }n g | | |          R  }|S rF   )r   is_grad_enabled_any_requires_gradapply)r$   r/   r%   r2   	Generatedr)   r3   s       r   autograd_implz)make_autograd_impl.<locals>.autograd_impll   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   rH   r	   Functionstaticmethodany	argumentsreturnssupports_tensorlist)r   r   namer<   rD   schemarQ   rP   r)   r3   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                   V    e Zd ZU ej        ed<   dZej        dz  ed<   dZedz  ed<   dS )%supports_tensorlist.<locals>.Metadata
input_specNoutput_specresult_is_tuple)	r   r   r   r   TreeSpecr   rc   rd   boolr   r   r   r)   ra      sM         $$$$/3W%,333'++++++r   r)   c                    |d         }|d d         }t          |          st          d          t          j        t	          |          |j                  } | g|R  }t          |t                    |_        |j        s|f}t          j        |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?   NotImplementedErrorr   tree_unflattenlistrb   r@   rd   tree_flattennot_list_of_tensorrc   hasattrrA   rh   )r5   r/   r0   r2   flat_resultrc   r)   orig_forwards         r   new_forwardz(supports_tensorlist.<locals>.new_forward   s    8CRCy(H-- 	%/  
 %d4jj(2EFFc)D)))#-fe#<#< ' 	YF#*#7@R#S#S [*3'' 	R   $[!!!r   c                 6   t          | d          st          d          | j        }t          j        t          |          |j                  }| j        }	 t          j        t          | j        d d                   |j                  | _         | g|R  }|| _        n# || _        w xY wt          |t                    s|f}t          j        |t                    \  }}||j        k    rt          d| d|j         d          t          |d gz             S )Nrh   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))rn   ri   rh   r   rj   rk   rc   r>   rb   r?   r@   rl   not_list_of_optional_tensorrA   )r5   rB   r0   rC   grad_inputsflat_grad_inputsgrad_inputs_specorig_backwards          r   new_backwardz)supports_tensorlist.<locals>.new_backward   sf   sN++ 	%9   #&tE{{H4HII !$ 4	9#*#9S)#2#.//1D$ $C  (-4e444K#8C  #8C 8888+u-- 	)&.K .5-A4.
 .
** x2222'72 2&2 2 2  
 %.///s   AB! !	B*c                     t          j        | t                    \  }} |          } g ||R  }|j        t	          d          t          j        t          |          |j                  }|j        snt          |t                    st	          dt          |                     t          |          dk    rt	          dt          |                     |d         S |S )N)is_leafz%metadata.output_spec must not be Nonezresult must be tuple, got r   z%result tuple must have length 1, got r   )r   rl   rm   rc   AssertionErrorrj   rk   rd   r?   r@   rH   len)r/   	flat_argsrb   r0   r2   r)   
orig_applys        r   	new_applyz&supports_tensorlist.<locals>.new_apply   s     ' 4TCU V V V	:8J''1Y1111' !HIII'Vh6JKK' 	fe,, R$%P$v,,%P%PQQQ6{{a$ICKKII   !9r   )r<   rD   rO   r   )r^   rq   rx   r   r)   r~   rw   rp   s       @@@@r   rZ   rZ   v   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 rF   r?   r
   rI   ls     r   rK   z%not_list_of_tensor.<locals>.<genexpr>   s/      ;;z!V,,,;;;;;;r   Tr?   r@   rk   rW   trees    r   rm   rm      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 rF   r   r   s     r   rK   z.not_list_of_optional_tensor.<locals>.<genexpr>   s8      MM11D=>Av)>)>%>MMMMMMr   Tr   r   s    r   rs   rs      sN    $ u$ NMMMMMMMM4r   )dataclassescollections.abcr   r   typingr   r   torchr   r   r	   r
   torch.utilsr    r   r   r   
OpOverloadr]   rZ   rm   rs   r   r   r   <module>r      s{       $ $ $ $ $ $ ! ! ! ! ! !                 , , , , , , , , , , , ,            ' ' ' ' '8 ' ' '
 ' ' ' ' ' ' ' '
[4? [, [8 [ [ [ [|jS jS j j j jZ      r   