
    <Цi4%                     t    S SK r S SKJr  S SKrS SKrS SKJrJr  / SQr " S S5      r	S r
S r " S	 S
5      rg)    N)OrderedDict)AnyTuple)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     P/var/www/html/ai-image-ml/venv/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   r0   s    r   	__enter__RemovableHandle.__enter__A   s    r)   typevaluetbc                 $    U R                  5         g r   )r+   )r&   r@   rA   rB   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+   r1   r;   r>   rD   __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 )NrO   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&   ri   rj   rm   rl   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 )	ra   ro   re   rd   r^   r`   r9   RuntimeErrorrr   )
grad_input_rl   rY   outr&   s        r   rY   )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_fnrY   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applyr9   rw   r~   namer$   rh   r@   r%   )r&   fnargstensors_idxtensorsr   iargnew_tensorstgrad_fnsarg_listrm   rn   rz   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   r9   rd   re   )r&   r   r   rl   	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 rv   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   )ro   rc   rb   ra   r_   r9   r`   rw   re   rd   r^   r"   r%   all)ry   grad_outputexpected_lenuser_pre_hookhook_grad_outputs
actual_lengrad_inputs	user_hookrl   r   r&   s            @r   rY   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~   rY   r&   s     r   r   *BackwardHook.setup_output_hook.<locals>.fn   s    "[H !!$'r)   TFr   )r"   r%   r   r9   rb   rc   )r&   r   r   is_tuplerl   
output_idxs   `     r   setup_output_hookBackwardHook.setup_output_hook   s_    %	(N $&&7DH00:T$.!a&C
r)   )ra   re   r`   rd   rb   rc   r^   r_   N)rF   rG   rH   rI   rJ   r'   ro   rr   r   r   r   r   rM   r   r)   r   r	   r	   ]   s+    	(
$6# J3r)   r	   )r   collectionsr   r   rT   typingr   r   __all__r   r   r   r	   r   r)   r   <module>r      s:     #   
Y; ;|:^ ^r)   