
    9jK#                         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y)    N)Callable)	dataclass)AnyProtocol)_C_opsautogradTensor)_pytree   )utilsc                   .    e Zd ZU edz  ed<   edz  ed<   y)InfoProtocolN_backward_fn_setup_context_fn__name__
__module____qualname__r   __annotations__     W/media/conek/DATA/Code/OCR/venv/lib/python3.12/site-packages/torch/_library/autograd.pyr   r      s    T/!$&r   r   c                   .    e Zd ZU edz  ed<   edz  ed<   y)InfoNr   r   r   r   r   r   r   r      s    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                  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   dict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)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,   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)r5   gradsprev_needs_input_gradr2   r   r   s       r   backwardz$make_autograd_impl.<locals>.backwardI   s    =(+(<(<%'*';';CR'@$***377'<$&%(&&4<)" .7 8
 	
	 (=$s   3A3 3	A<)r<   rD   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>d   s'       	%%aff-s   )+c                     t        j                         r/t        j                  | r j                  g | | |       }|S  g | | |       }|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   sd    B$9$94$@$Y__PdPHV=N,OPF  %PdPHV=N,O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    '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                   h    e Zd ZU ej                  ed<   dZej                  dz  ed<   dZedz  ed<   y)%supports_tensorlist.<locals>.Metadata
input_specNoutput_specresult_is_tuple)	r   r   r   r   TreeSpecr   rc   rd   boolr   r   r   r)   ra      s1    $$$/3W%%,3'++r   r)   c                    |d   }|d d }t        |      st        d      t        j                  t	        |      |j
                        } | g| }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CRy(H-%/ 
 %%d4j(2E2EFc)D)#-fe#< ''YF#*#7#7@R#S [*3'R  $[!!r   c                 8   t        | d      st        d      | j                  }t        j                  t        |      |j                        }| j                  }	 t        j                  t        | j                  d d       |j                        | _         | g| }|| _        t        |t              s|f}t        j                  |t              \  }}||j                  k7  rt        d| d|j                   d      t        |d gz         S # || _        w xY w)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   s3   sN+%9  ##&&tE{H4H4HI !$ 4 4	9#*#9#9S))#2./1D1D$C  (4e4K#8C +u-&.K .5-A-A4.
** x222''7&88Q&&'y2 
 %.//% $9C s   AD 	Dc                     t        j                  | t              \  }} |      } g || }|j                  t	        d      t        j
                  t        |      |j                        }|j                  sQt        |t              st	        dt        |             t        |      dk7  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     ' 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   )r<   rD   rO   r   )r^   rq   rx   r   r)   r~   rw   rp   s       @@@@r   rZ   rZ   v   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rF   r?   r
   rI   ls     r   rK   z%not_list_of_tensor.<locals>.<genexpr>   s     ;z!V,,;s   Tr?   r@   rk   rW   trees    r   rm   rm      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rF   r   r   s     r   rK   z.not_list_of_optional_tensor.<locals>.<genexpr>   s&     M11D=>Av)>%>>Ms   !#Tr   r   s    r   rs   rs      s-    $$MMMMr   )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Zr   