
    Ǆgk"                     8   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	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j0                  Zej4                  Zej8                  Zy)    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<   y)InfoProtocol_backward_fn_setup_context_fnN__name__
__module____qualname__r   r   __annotations__     _/home/mcse/projects/flask_80/flask-venv/lib/python3.12/site-packages/torch/_library/autograd.pyr   r      s    8$$))r   r   c                   .    e Zd ZU ee   ed<   ee   ed<   y)Infor   r   Nr   r   r   r   r   r      s    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                  D              rt              	fd
}|S )NGeneratedBackwardFor__c                   @    e Zd ZU ej                  ed<   eeef   ed<   y)$make_autograd_impl.<locals>.Metadatakeysetkeyword_only_argsN)	r   r   r   r	   DispatchKeySetr   r   strr   r   r   r   Metadatar%      s    !!!S>)r   r*   c                      | d   }| d d } t        j                         5  |j                  }|j                  } j                  |t         j
                  z  g| i |}|cd d d        S # 1 sw Y   y xY w)N)r	   _AutoDispatchBelowAutogradr&   r'   
redispatch_after_autograd_keyset)argsmetadatar&   kwargsresultr   s        r   forward_no_gradz+make_autograd_impl.<locals>.forward_no_grad!   su    8CRy**, 	__F//F"R]]6B,E,E#EWWPVWF		 	 	s   AA++A4c                    |d   }|d d }t        j                         5  |j                  }|j                  } j                  |t         j
                  z  g|i |}j                  rPt        j                  j                  ||      \  }}rj                  | |||       nj                  | ||       |cd d d        S # 1 sw Y   y xY w)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+   s    8CRy**, 	__F//F"R]]6B,E,E#EWWPVWF%%  %222::tVLf&**&QW +  **s4*O/	 	 	s   BCCc                     j                   rV	 | j                  }| j                  d d | _         j                   | g| }|| _        t        |t              rg |d S |d fS t	        d d      # | _        w xY w)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    =(+(<(<%'*';';CR'@$***377'<$&%(&&4<)" .7 8
 	
	 (=$s   3A3 3	A<)r=   rE   c              3   Z   K   | ]#  }t        j                  |j                         % y wN)r   is_tensorlist_like_typetype).0as     r   	<genexpr>z%make_autograd_impl.<locals>.<genexpr>c   s'       	%%aff-s   )+c                     t        j                         r>t        j                  t        d |t
              r j                  g | | |       }|S  g | | |       }|S )Nc                     | j                   S rG   )requires_grad)xs    r   <lambda>z;make_autograd_impl.<locals>.autograd_impl.<locals>.<lambda>m   s
    aoo r   )r	   is_grad_enabledr   tree_any_onlyr   not_list_of_tensorapply)r&   r0   r'   r3   	Generatedr*   r4   s       r   autograd_implz)make_autograd_impl.<locals>.autograd_implk   sq    G$9$9-t5G%
 %Y__PdPHV=N,OPF  %PdPHV=N,OPFr   )
_namespace_opname_overloadnamer   r<   r;   r   rI   r   Functionstaticmethodany	argumentsreturnssupports_tensorlist)r   r   namer=   rE   schemarW   rV   r*   r4   r<   s   ``     @@@@r   make_autograd_implrc      s    'a

|1REUEUDVWD33BJJ?* * *:
" 			#G,$X.	
I ZZF
 56##5fnn5  (	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                   @    e Zd ZU eed<   dZee   ed<   dZee   ed<   y)%supports_tensorlist.<locals>.Metadata
input_specNoutput_specresult_is_tuple)	r   r   r   spec_tr   ri   r   rj   boolr   r   r   r*   rg      s%    (,Xf%,*.$.r   r*   c                 d   |d   }|d d }t        |      st        d      t        t        |      |j                        } | g| }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listrh   rA   rj   flattenrT   ri   hasattrrB   rn   )r6   r0   r1   r3   flat_resultri   r*   orig_forwards         r   new_forwardz(supports_tensorlist.<locals>.new_forward   s    8CRy(H-%/ 
 dX%8%89c)D)#-fe#< ''YF#*63E#F [*3'R  $[!!r   c                    t        | d      st        d      | j                  }t        t	        |      |j
                        }| j                  }	 t        t	        | j                  d d       |j                        | _         | g| }|| _        t        |t              s|f}t        |t              \  }}||j                  k7  rt        d| d|j                   d      t        |d gz         S # || _        w xY w)Nrn   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))rs   ro   rn   rp   rq   ri   r?   rh   r@   rA   rr   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 4	9#,S))#2./1D1D$C  (4e4K#8C +u-&.K .54.
** x222''7&88Q&&'y2 
 %.//% $9C s   :C2 2	C;c                     t        | t              \  }} |      } g || }|j                  J t        t	        |      |j                        }|j
                  s't        |t              sJ t        |      dk(  sJ |d   S |S )N)is_leafr   r   )	rr   rT   ri   rp   rq   rj   r@   rA   len)r0   	flat_argsrh   r1   r3   r*   
orig_applys        r   	new_applyz&supports_tensorlist.<locals>.new_apply   s     '6H I	:J'1Y11##///4<)=)=>''fe,,,v;!###!9r   )r=   rE   rU   r   )rd   rv   r}   r   r*   r   r|   ru   s       @@@@r   r`   r`   w   sc     ;;LLLMJ/ / /
"2*0X
 CKCLCIJr   c                 j    t        | t              ryt        | t              rt        d | D              S y)NFc              3   >   K   | ]  }t        |t                 y wrG   r@   r   rJ   ls     r   rL   z%not_list_of_tensor.<locals>.<genexpr>   s     ;z!V,,;s   Tr@   rA   rq   r]   trees    r   rT   rT      s-    $$;d;;;r   c                 j    t        | t              ryt        | t              rt        d | D              S y)NFc              3   J   K   | ]  }|d uxr t        |t                 y wrG   r   r   s     r   rL   z.not_list_of_optional_tensor.<locals>.<genexpr>   s&     M11D=>Av)>%>>Ms   !#Tr   r   s    r   rx   rx      s-    $$MMMMr   )dataclassesr   typingr   r   r   r   r   torchr	   r
   r   r   torch.utilsr    r   r   r   
OpOverloadrc   r`   rT   rx   tree_flattenrr   tree_unflattenrp   TreeSpecrk   r   r   r   <module>r      s     ! : : , ,  *8 *
 * * *
]4?? ], ]8 ]@eS eS eP 

""				r   