
    JTh-%                     p    S SK r S SKJr  S SKrS SKrS SKJr  / SQr " S S5      rS r	S r
 " S	 S
5      rg)    N)OrderedDict)Any)RemovableHandleunserializable_hookwarn_if_has_hooksBackwardHookc                       \ rS rSr% Sr\\S'   Sr\\S'   SS.S\S	\S
S4S jjr	SS jr
S rSS jrSS jrS\S\S\S
S4S jrSrg)r   
   aA  
A handle which provides the capability to remove a hook.

Args:
    hooks_dict (dict): A dictionary of hooks, indexed by hook ``id``.
    extra_dict (Union[dict, List[dict]]): An additional dictionary or list of
        dictionaries whose keys will be deleted when the same keys are
        removed from ``hooks_dict``.
idr   next_idN)
extra_dict
hooks_dictr   returnc                b   [         R                  " U5      U l        [        R                  U l        [        =R                  S-  sl        SU l        [        U[        5      (       a  [         R                  " U5      4U l        g [        U[        5      (       a  [        S U 5       5      U l        g g )N    c              3   N   #    U  H  n[         R                  " U5      v   M     g 7fNweakrefref.0ds     I/var/www/auris/envauris/lib/python3.13/site-packages/torch/utils/hooks.py	<genexpr>+RemovableHandle.__init__.<locals>.<genexpr>!   s     'K
1A
   #%)r   r   hooks_dict_refr   r   r   extra_dict_ref
isinstancedictlisttuple)selfr   r   s      r   __init__RemovableHandle.__init__   s    %kk*5!))1$%'j$''#*;;z#:"<D
D))"''K
'K"KD *    c                     U R                  5       nUb  U R                  U;   a  XR                  	 U R                   H-  nU" 5       nUc  M  U R                  U;   d  M!  X0R                  	 M/     g r   )r   r   r    )r%   r   r   r   s       r   removeRemovableHandle.remove#   s]    ((*
!dgg&;77#&&CJ%$''Z*?ww' 'r(   c                     U R                   c  U R                  5       U R                  4$ U R                  5       U R                  [        S U R                    5       5      4$ )Nc              3   .   #    U  H  o" 5       v   M     g 7fr   r   )r   r   s     r   r   /RemovableHandle.__getstate__.<locals>.<genexpr>1   s     9_K^C#%%K^s   )r    r   r   r$   r%   s    r   __getstate__RemovableHandle.__getstate__-   sQ    &'')47733'')477E9_4K^K^9_4_``r(   c                 v   US   c$  [         R                  " [        5       5      U l        O[         R                  " US   5      U l        US   U l        [        [        R                  U R                  S-   5      [        l        [        U5      S:  d  US   c  SU l	        g [        S US    5       5      U l	        g )Nr   r         r   c              3   N   #    U  H  n[         R                  " U5      v   M     g 7fr   r   r   s     r   r   /RemovableHandle.__setstate__.<locals>.<genexpr>?   s     'I1Ar   )r   r   r   r   r   maxr   r   lenr    r$   )r%   states     r   __setstate__RemovableHandle.__setstate__3   s    8")++km"<D")++eAh"7D("%o&=&=tww{"Ku:>U1X-"$D"''Ia'I"IDr(   c                     U $ r   r   r/   s    r   	__enter__RemovableHandle.__enter__A   s    r(   typevaluetbc                 $    U R                  5         g r   )r*   )r%   r?   r@   rA   s       r   __exit__RemovableHandle.__exit__D   s    r(   )r    r   r   )r   N)r   r   )__name__
__module____qualname____firstlineno____doc__int__annotations__r   r   r&   r*   r0   r:   r=   rC   __static_attributes__r   r(   r   r   r   
   sp     	GGS=A 	L3 	Ls 	Ld 	L(aJS  # $ r(   r   c                     SU l         U $ )z
Mark a function as an unserializable hook with this decorator.

This suppresses warnings that would otherwise arise if you attempt
to serialize a tensor that has a hook.
T)__torch_unserializable__)fs    r   r   r   H   s     "&AHr(   c                     U R                   (       aY  U R                    HH  nU R                   U   n[        US5      (       a  M%  [        R                  " S[	        U5       S35        MJ     g g )NrN   zbackward hook z on tensor will not be serialized.  If this is expected, you can decorate the function with @torch.utils.hooks.unserializable_hook to suppress this warning)_backward_hookshasattrwarningswarnrepr)tensorkhooks      r   r   r   S   s^    ''A))!,D4!;<<tDzl ;9 9 : ( r(   c                   B    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
rg)r   ]   a  
A wrapper class to implement nn.Module backward hooks.

It handles:
  - Ignoring non-Tensor inputs and replacing them by None before calling the user hook
  - Generating the proper Node to capture a set of Tensor's gradients
  - Linking the gradients captures for the outputs with the gradients captured for the input
  - Calling the user hook once both output and input gradients are available
c                 n    X l         X0l        Xl        S U l        SU l        S U l        SU l        S U l        g )N)
user_hooksuser_pre_hooksmodulegrad_outputs	n_outputsoutput_tensors_indexn_inputsinput_tensors_index)r%   r_   r]   r^   s       r   r&   BackwardHook.__init__h   s8    $, $(!#' r(   c                 T    S /U-  n[        X5       H	  u  pVXdU'   M     [        U5      $ r   )zipr$   )r%   indicesvaluessizeresidxvals          r   _pack_with_noneBackwardHook._pack_with_nones   s1    ftmG,HCH - Szr(   c                 J    U Vs/ s H  o2U   PM	     nn[        U5      $ s  snf r   )r$   )r%   rh   ri   rl   rk   s        r   _unpack_noneBackwardHook._unpack_nonez   s'    &-.gsc{g.Sz /s    c                 4   ^  U 4S jnUR                  U5        g )Nc           	        > TR                   c  g TR                  TR                  U TR                  5      nTR                   Hc  nU" TR
                  UTR                   5      nUc  M&  [        U5      [        U5      :w  a#  [        S[        U5       S[        U5       35      eUnMe     S Tl         TR                  TR                  U5      $ )Nz<Backward hook returned an invalid number of grad_input, got , but expected )	r`   rn   rd   rc   r]   r_   r8   RuntimeErrorrq   )
grad_input_rk   rX   outr%   s        r   rX   )BackwardHook._set_user_hook.<locals>.hook   s      ( &&t'?'?T]][C4;;T->->?;s8s3x'& (..1#hZs3xj(R S S  ( !%D$$T%=%=sCCr(   register_hook)r%   grad_fnrX   s   `  r   _set_user_hookBackwardHook._set_user_hook   s    	D0 	d#r(   c                 \   / n/ nSn[        U5       HV  u  pg[        U[        R                  5      (       d  M&  UR	                  U5        UR	                  U5        XWR
                  -  nMX     U(       a  [        R                  " 5       (       d  US 4$ [        R                  R                  R                  R                  R                  " U6 n[        U5      S:X  a  [        S5      eU V	s/ s H=  oR                  c  M  U	R                  R                  5       S:X  d  M1  U	R                  PM?     n
n	[        U
5      S:X  a  [        S5      eU" U
S   5        [!        U5      n[#        X85       H	  u  pXU'   M     [%        U5      [&        L a  ['        U5      nX4$ [%        U5      " U6 nX4$ s  sn	f )NFr   zCCannot set Module backward hook for a Module with no input Tensors.BackwardHookFunctionBackwardzaError while setting up backward hooks. Please open an issue with a code sample to reproduce this.)	enumerater!   torchTensorappendrequires_gradis_grad_enablednnmodules
_functionsBackwardHookFunctionapplyr8   rv   r}   namer#   rg   r?   r$   )r%   fnargstensors_idxtensorsr   iargnew_tensorstgrad_fnsarg_listrl   rm   ry   s                  r   _apply_on_tensorsBackwardHook._apply_on_tensors   s    oFA#u||,,""1%s#!2!22	 & %"7"7"9"9:hh&&11FFLLgV{q dee'2  D{!iiIPQPYPYP^P^P`  eC  QCIAII{  Dx=A  P Q Q 	8A;:K5HCSM 6 :/C  t*h'C Ds   *F)>F)F)c                 h   ^  U 4S jnT R                  X!5      u  p4[        U5      T l        UT l        U$ )Nc                 (   > TR                  U 5        g r   )r~   )r}   r%   s    r   r   )BackwardHook.setup_input_hook.<locals>.fn   s    (r(   )r   r8   rc   rd   )r%   r   r   rk   	input_idxs   `    r   setup_input_hookBackwardHook.setup_input_hook   s4    	) //9D	#, 
r(   c                    ^  U 4S jnSn[        U[        5      (       d  U4nSnT R                  X!5      u  pE[        U5      T l        UT l        U(       d  US   nU$ )Nc                 4   > U4S jnU R                  U5        g )Nc                   >^	 T
R                  T
R                  UT
R                  5      T
l        T
R                  (       ar  [        T
R                  5      nT
R                   HM  nU" T
R                  T
R                  5      nUc  M%  [        U5      nXR:w  a  [        SU SU 35      eUT
l        MO     T
R                  m	T
R                  c  T
R                  / / T
R                  5      nT
R                   H]  nU" T
R                  UT
R                  5      nUc  M&  [        U[        5      (       a  [        S U 5       5      (       a  MT  [        S5      e   S T
l        T	b.  T
R                  c   e[        U	4S jT
R                   5       5      $ g )NzABackward pre hook returned an invalid number of grad_output, got ru   c              3   (   #    U  H  oS L v   M
     g 7fr   r   )r   els     r   r   KBackwardHook.setup_output_hook.<locals>.fn.<locals>.hook.<locals>.<genexpr>   s     RlhkbdY]S]hks   zoBackward hook for Modules where no input requires gradient should always return None or None for all gradients.c              3   .   >#    U  H
  nTU   v   M     g 7fr   r   )r   r   local_grad_outputss     r   r   r      s      Z@Y1!3A!6@Ys   )rn   rb   ra   r`   r^   r8   r_   rv   rd   rc   r]   r!   r$   all)rx   grad_outputexpected_lenuser_pre_hookhook_grad_outputs
actual_lengrad_inputs	user_hookrk   r   r%   s            @r   rX   8BackwardHook.setup_output_hook.<locals>.fn.<locals>.hook   s   $($8$89R9R9D9=%I! &&#&t'8'8#9L)-)<)<,9$++tGXGX,Y),4$%():%;
%5". 066@\Q]P^0` #a a,=) *= &*%6%6" ++3"&"6"6r2t}}"MK%)__	'[$BSBST?JsE4J4JsRlhkRlOlOl". 0o #p p &5
 )-D%%144@@@  Z@Y@Y ZZZ 2r(   r{   )r}   rX   r%   s     r   r   *BackwardHook.setup_output_hook.<locals>.fn   s    "[H !!$'r(   TFr   )r!   r$   r   r8   ra   rb   )r%   r   r   is_tuplerk   
output_idxs   `     r   setup_output_hookBackwardHook.setup_output_hook   s_    %	(N $&&7DH00:T$.!a&C
r(   )r`   rd   r_   rc   ra   rb   r]   r^   N)rE   rF   rG   rH   rI   r&   rn   rq   r~   r   r   r   rL   r   r(   r   r   r   ]   s+    	(
$6# J3r(   r   )r   collectionsr   r   rS   typingr   __all__r   r   r   r   r   r(   r   <module>r      s:     #   
Y; ;|:^ ^r(   