
    קgk"                        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j        Zej        Zej        ZdS )    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<   dS )InfoProtocol_backward_fn_setup_context_fnN__name__
__module____qualname__r   r   __annotations__     S/var/www/html/ai-engine/env/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   r   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        t          d |t
                    r j        g | | |          R  }n g | | |          R  }|S )Nc                     | j         S rG   )requires_grad)xs    r   <lambda>z;make_autograd_impl.<locals>.autograd_impl.<locals>.<lambda>m   s    ao 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   s     	QG$9--t5G%
 %
 	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   schemarW   rV   r*   r4   r<   s   ``     @@@@r   make_autograd_implrc      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   ri   r   rj   boolr   r   r   r*   rg      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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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 )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	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   )	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 I I	:8J''1Y1111#///4<<)=>>' 	fe,,,,,v;;!####!9r   )r=   rE   rU   r   )rd   rv   r}   r   r*   r   r|   ru   s       @@@@r   r`   r`   w   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   rq   r]   trees    r   rT   rT      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   rx   rx      sN    $ u$ NMMMMMMMM4r   )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 e e eP     
"			r   