
    3jK#                         S SK r S SKJr  S SK Jr  S SKJrJr  S SKJrJ	r	J
r
Jr  S SKJr  SSKJr   " S	 S
\5      r\ R                   " S S5      5       rS\	R$                  S\S\4S jrS\S\4S jrS rS rg)    N)Callable)	dataclass)AnyProtocol)_C_opsautogradTensor)_pytree   )utilsc                   6    \ rS rSr% \S-  \S'   \S-  \S'   Srg)InfoProtocol   N_backward_fn_setup_context_fn __name__
__module____qualname____firstlineno__r   __annotations____static_attributes__r       Q/home/wildlama/miniconda3/lib/python3.13/site-packages/torch/_library/autograd.pyr   r      s    T/!$&r   r   c                   6    \ rS rSr% \S-  \S'   \S-  \S'   Srg)Info   Nr   r   r   r   r   r   r   r   r      s    T/!$&r   r   opinforeturnc                   ^ ^^^^	^
 ST R                    ST R                   ST R                   3n[        R                  " T R
                  5      m
[         " S S5      5       mU 4S jm	U
UU 4S jnUU 4S jn[        U[        R                  4[        U5      [        U5      S.5      mT R
                  n[        S	 / UR                  QUR                  Q7 5       5      (       a  [        T5      mUUU	4S
 jnU$ )NGeneratedBackwardFor__c                   H    \ rS rSr% \R
                  \S'   \\\	4   \S'   Sr
g)$make_autograd_impl.<locals>.Metadata   keysetkeyword_only_argsr   N)r   r   r   r   r   DispatchKeySetr   dictstrr   r   r   r   r   Metadatar'      s    !!!S>)r   r.   c                     > U S   nU S S n [         R                  " 5          UR                  nUR                  nTR                  " U[         R
                  -  /U Q70 UD6nUsS S S 5        $ ! , (       d  f       g = f)N)r   _AutoDispatchBelowAutogradr)   r*   
redispatch_after_autograd_keyset)argsmetadatar)   kwargsresultr    s        r   forward_no_grad+make_autograd_impl.<locals>.forward_no_grad"   sj    8CRy**,__F//F]]6B,E,E#EWWPVWF	 -,,s   AA,,
A:c                   > US   nUS S n[         R                  " 5          UR                  nUR                  nTR                  " U[         R
                  -  /UQ70 UD6nTR                  (       aK  [        R                  " TR                  X5      u  pT(       a  TR                  XXES9  OTR                  XUS9  UsS S S 5        $ ! , (       d  f       g = f)Nr0   )ctxinputskeyword_only_inputsoutput)r;   r<   r>   )
r   r1   r)   r*   r2   r3   r   r   fill_defaults_schema)	r;   r4   r5   r)   r6   r7   has_kwarg_only_argsr!   r    s	         r   forward#make_autograd_impl.<locals>.forward,   s    8CRy**,__F//F]]6B,E,E#EWWPVWF%%  %222::tL&**& +  **s*O/ -,,s   BC
Cc                   > TR                   (       aZ   U R                  nU R                  S S U l        TR                   " U /UQ76 nX l        [        U[        5      (       a  / UQS P7$ US 4$ [	        ST S35      e! WU l        f = f)Nr0   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_gradr7   r!   r    s       r   backward$make_autograd_impl.<locals>.backwardI   s    =(+(<(<%'*';';CR'@$**377'<$&%((&&4<)" .7 8
 	
	 (=$s   3A< <	B)rB   rK   c              3   b   #    U  H%  n[         R                  " UR                  5      v   M'     g 7fN)r   is_tensorlist_like_typetype).0as     r   	<genexpr>%make_autograd_impl.<locals>.<genexpr>d   s)      5A 	%%aff--5s   -/c                    > [         R                  " 5       (       a4  [         R                  " U6 (       a  TR                  " / UQT" X5      P76 nU$ T" / UQT" X5      P76 nU$ rN   )r   is_grad_enabled_any_requires_gradapply)r)   r4   r*   r7   	Generatedr.   r8   s       r   autograd_impl)make_autograd_impl.<locals>.autograd_impll   s_    B$9$94$@__PdPHV,OPF  %PdPHV,OPFr   )
_namespace_opname_overloadnamer   rA   r@   r   rP   r	   Functionstaticmethodany	argumentsreturnssupports_tensorlist)r    r!   namerB   rK   schemarZ   rY   r.   r8   rA   s   ``     @@@@r   make_autograd_implrg      s    'a

|1REUEUDVWD33BJJ?* * *:
" 			#G,$X.	
I ZZF
 56##5fnn5   (	2	 r   clsc                    ^^^^ U R                   mU R                  mU R                  m[         " S S5      5       mUU4S jnU4S jnUU4S jnXl         X l        X0l        U $ )a$  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                   p    \ rS rSr% \R
                  \S'   Sr\R
                  S-  \S'   Sr\	S-  \S'   Sr
g)%supports_tensorlist.<locals>.Metadata   
input_specNoutput_specresult_is_tupler   )r   r   r   r   r   TreeSpecr   rn   ro   boolr   r   r   r   r.   rk      s1    $$$/3W%%,3'++r   r.   c                   > US   nUS S n[        UT5      (       d  [        S5      e[        R                  " [	        U5      UR
                  5      nT" U /UQ76 n[        U[        5      Ul        UR                  (       d  U4n[        R                  " U[        5      u  pEXRl
        [        U S5      (       a  [        S5      eX l        [        U5      $ )Nr0   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)rF   NotImplementedErrorr   tree_unflattenlistrm   rG   ro   tree_flattennot_list_of_tensorrn   hasattrrH   rs   )r;   r4   r5   r7   flat_resultrn   r.   orig_forwards         r   new_forward(supports_tensorlist.<locals>.new_forward   s    8CRy(H--%/ 
 %%d4j(2E2EFc)D)#-fe#< ''YF#*#7#7@R#S *3''R  $[!!r   c                 L  > [        U S5      (       d  [        S5      eU R                  n[        R                  " [        U5      UR                  5      nU R                  n [        R                  " [        U R                  S S 5      UR                  5      U l        T" U /UQ76 nX0l        [        U[        5      (       d  U4n[        R                  " U[        5      u  pVXbR                  :w  a  [        SU SUR                   S35      e[        US /-   5      $ ! X0l        f = f)Nrs   zNYI: calling supports_tensorlist autograd.Function.backward directly. This will automatically get called by PyTorch autograd. Please file an issue if you need this.r0   zRExpected the return from backward to be of the same structure as the inputs. Got: z (return from backward), z	 (inputs))ry   rt   rs   r   ru   rv   rn   rE   rm   rF   rG   rw   not_list_of_optional_tensorrH   )r;   rI   r5   rJ   grad_inputsflat_grad_inputsgrad_inputs_specorig_backwards          r   new_backward)supports_tensorlist.<locals>.new_backward   s0   sN++%9  ##&&tE{H4H4HI !$ 4 4	9#*#9#9S))#2./1D1D$C  (4e4K#8 +u--&.K .5-A-A4.
* 222''7&88Q&&'y2 
 %.//% $9 s   !AD D#c                    > [         R                  " U [        S9u  pT" U5      nT" / UQUP76 nUR                  c  [	        S5      e[         R
                  " [        U5      UR                  5      nUR                  (       dW  [        U[        5      (       d  [	        S[        U5       35      e[        U5      S:w  a  [	        S[        U5       35      eUS   $ U$ )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   rw   rx   rn   AssertionErrorru   rv   ro   rF   rG   rP   len)r4   	flat_argsrm   r5   r7   r.   
orig_applys        r   	new_apply&supports_tensorlist.<locals>.new_apply   s     ' 4 4TCU V	J'1Y11' !HII''Vh6J6JK''fe,,$'A$v,%PQQ6{a$;CK=I  !9r   )rB   rK   rX   r   )rh   r|   r   r   r.   r   r   r{   s       @@@@r   rd   rd   v   s]     ;;LLLMJ, , ,
"2*0X" KLIJr   c                 ~    [        U [        5      (       a  g[        U [        5      (       a  [        S U  5       5      $ g)NFc              3   L   #    U  H  n[        U[        5      (       + v   M     g 7frN   rF   r
   rQ   ls     r   rS   %not_list_of_tensor.<locals>.<genexpr>   s     ;dz!V,,,ds   "$TrF   rG   rv   ra   trees    r   rx   rx      s3    $$;d;;;r   c                 ~    [        U [        5      (       a  g[        U [        5      (       a  [        S U  5       5      $ g)NFc              3   `   #    U  H$  oS L=(       a    [        U[        5      (       + v   M&     g 7frN   r   r   s     r   rS   .not_list_of_optional_tensor.<locals>.<genexpr>   s$     M1D=>Av)>%>>s   ,.Tr   r   s    r   r   r      s3    $$MMMMr   )dataclassescollections.abcr   r   typingr   r   torchr   r   r	   r
   torch.utilsr    r   r   r   
OpOverloadrg   rd   rx   r   r   r   r   <module>r      s     $ !   , ,  '8 '
 ' ' '
[4?? [, [8 [|jS jS jZr   