
    ΧgV%                         d dl Z d dlmZ d dlZd dlZd dlmZmZ g dZ G d d          Z	d Z
d Z G d	 d
          ZdS )    N)OrderedDict)AnyTuple)RemovableHandleunserializable_hookwarn_if_has_hooksBackwardHookc                   |    e Zd ZU dZeed<   dZeed<   dddeded	dfd
ZddZ	d Z
ddZddZdededed	dfdZdS )r   a]  
    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                ^   t          j        |          | _        t          j        | _        t          xj        dz  c_        d| _        t          |t                    rt          j        |          f| _        d S t          |t                    r t          d |D                       | _        d S d S )N    c              3   >   K   | ]}t          j        |          V  d S Nweakrefref.0ds     M/var/www/html/ai-engine/env/lib/python3.11/site-packages/torch/utils/hooks.py	<genexpr>z+RemovableHandle.__init__.<locals>.<genexpr>!   s*      'K'K1A'K'K'K'K'K'K    )r   r   hooks_dict_refr   r   r   extra_dict_ref
isinstancedictlisttuple)selfr   r   s      r   __init__zRemovableHandle.__init__   s    %k*55!)1$%'j$'' 	L#*;z#:#:"<D
D)) 	L"''K'K
'K'K'K"K"KD	L 	Lr   c                     |                                  }|| j        |v r|| j        = | j        D ]} |            }|| j        |v r|| j        =  d S r   )r   r   r   )r$   r   r   r   s       r   removezRemovableHandle.remove#   ss    ((**
!dg&;&;47#& 	( 	(CJ%$'Z*?*?tw'	( 	(r   c                     | j         |                                 | j        fS |                                 | j        t          d | j         D                       fS )Nc              3   *   K   | ]} |            V  d S r   r   )r   r   s     r   r   z/RemovableHandle.__getstate__.<locals>.<genexpr>1   s(      9_9_C##%%9_9_9_9_9_9_r   )r   r   r   r#   r$   s    r   __getstate__zRemovableHandle.__getstate__-   sY    &''))4733''))47E9_9_4K^9_9_9_4_4_``r   c                    |d         &t          j        t                                | _        nt          j        |d                   | _        |d         | _        t          t          j        | j        dz             t          _        t          |          dk     s|d         	d| _	        d S t          d |d         D                       | _	        d S )Nr   r         r   c              3   >   K   | ]}t          j        |          V  d S r   r   r   s     r   r   z/RemovableHandle.__setstate__.<locals>.<genexpr>?   s*      'I'I1A'I'I'I'I'I'Ir   )r   r   r   r   r   maxr   r   lenr   r#   )r$   states     r   __setstate__zRemovableHandle.__setstate__3   s    8")+kmm"<"<D")+eAh"7"7D("%o&=tw{"K"Ku::>>U1X-"$D"''I'Ia'I'I'I"I"IDr   c                     | S r   r   r*   s    r   	__enter__zRemovableHandle.__enter__A   s    r   typevaluetbc                 .    |                                   d S r   )r'   )r$   r6   r7   r8   s       r   __exit__zRemovableHandle.__exit__D   s    r   )r   N)r   r   )__name__
__module____qualname____doc__int__annotations__r   r   r%   r'   r+   r3   r5   r:   r   r   r   r   r   
   s           	GGGGS=A 	L 	L 	L3 	Ls 	Ld 	L 	L 	L 	L( ( ( (a a aJ J J J   S  # $      r   r   c                     d| _         | S )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                     | j         rL| j         D ]F}| j         |         }t          |d          s%t          j        dt	          |           d           Ed S d S )NrB   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!;<< : 9tDzz 9 9 9 : : :	: :	: 	:r   c                   <    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	S )
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                 v    || _         || _        || _        d | _        d| _        d | _        d| _        d | _        d S )N)
user_hooksuser_pre_hooksmodulegrad_outputs	n_outputsoutput_tensors_indexn_inputsinput_tensors_index)r$   rR   rP   rQ   s       r   r%   zBackwardHook.__init__h   sD    $, $(!#'   r   c                 b    d g|z  }t          ||          D ]
\  }}|||<   t          |          S r   )zipr#   )r$   indicesvaluessizeresidxvals          r   _pack_with_nonezBackwardHook._pack_with_nones   sA    ftmGV,, 	 	HCCHHSzzr   c                 d    g }|D ]}|                     ||                    t          |          S r   )appendr#   )r$   rZ   r[   r]   r^   s        r   _unpack_nonezBackwardHook._unpack_nonez   s;     	$ 	$CJJvc{####Szzr   c                 <      fd}|                     |           d S )Nc           	         j         d S                     j        | j                  }j        D ]m} |j        |j                   }|t          |          t          |          k    r/t          dt          |           dt          |                     |}nd _                             j        |          S )Nz<Backward hook returned an invalid number of grad_input, got , but expected )	rS   r`   rW   rV   rP   rR   r1   RuntimeErrorrc   )
grad_input_r]   rL   outr$   s        r   rL   z)BackwardHook._set_user_hook.<locals>.hook   s     ( &&t'?T][[C 
 
d4;T->??;s88s3xx''& (R.1#hh(R (RGJ3xx(R (R S S S  $D$$T%=sCCCr   register_hook)r$   grad_fnrL   s   `  r   _set_user_hookzBackwardHook._set_user_hook   s=    	D 	D 	D 	D 	D0 	d#####r   c                    g }g }d}t          |          D ]S\  }}t          |t          j                  r4|                    |           |                    |           ||j        z  }T|rt          j                    s|d fS t          j        j        j	        j
        j        | }t          |          dk    rt          d          d |D             }	t          |	          dk    rt          d           ||	d                    t          |          }
t          ||          D ]
\  }}||
|<   t!          |          t"          u rt#          |
          }n t!          |          |
 }||fS )NFr   zCCannot set Module backward hook for a Module with no input Tensors.c                 d    g | ]-}|j         	|j                                         dk    &|j         .S )NBackwardHookFunctionBackward)rm   name)r   ts     r   
<listcomp>z2BackwardHook._apply_on_tensors.<locals>.<listcomp>   s]      D  D  D!ai6KPQPYP^P^P`P`  eC  QC  QCAI  QC  QC  QCr   zaError while setting up backward hooks. Please open an issue with a code sample to reproduce this.)	enumerater    torchTensorrb   requires_gradis_grad_enablednnmodules
_functionsBackwardHookFunctionapplyr1   rg   r"   rY   r6   r#   )r$   fnargstensors_idxtensorsrx   iargnew_tensorsgrad_fnsarg_listr^   r_   rj   s                 r   _apply_on_tensorszBackwardHook._apply_on_tensors   s    oo 	3 	3FAs#u|,, 3""1%%%s###!22 	%"7"9"9 	:h&1FLgV{q  deee D  D{  D  D  Dx==A  P Q Q Q 	8A;::K55 	  	 HCHSMM:://CC$t**h'CKr   c                 z      fd}                      ||          \  }}t          |           _        | _        |S )Nc                 2                         |            d S r   )rn   )rm   r$   s    r   r   z)BackwardHook.setup_input_hook.<locals>.fn   s    (((((r   )r   r1   rV   rW   )r$   r   r   r]   	input_idxs   `    r   setup_input_hookzBackwardHook.setup_input_hook   sQ    	) 	) 	) 	) 	) //D99YD		#, 
r   c                       fd}d}t          |t                    s|f}d}                     ||          \  }}t          |           _        | _        |s|d         }|S )Nc                 <    fd}|                      |           d S )Nc                   	 
                     
j        |
j                  
_        
j        rht          
j                  }
j        D ]L} |
j        
j                  }|t          |          }||k    rt          d| d|           |
_        M
j        	
j        
                     g g 
j	                  }
j
        D ]X} |
j        |
j                  }|=t          |t                    rt          d |D                       st          d          Yd 
_        	)
j        J t          	fd
j        D                       S d S )NzABackward pre hook returned an invalid number of grad_output, got rf   c              3      K   | ]}|d u V  	d S r   r   )r   els     r   r   zKBackwardHook.setup_output_hook.<locals>.fn.<locals>.hook.<locals>.<genexpr>   s*      RlRlbdSUY]S]RlRlRlRlRlRlr   zoBackward hook for Modules where no input requires gradient should always return None or None for all gradients.c              3   (   K   | ]}|         V  d S r   r   )r   r   local_grad_outputss     r   r   zKBackwardHook.setup_output_hook.<locals>.fn.<locals>.hook.<locals>.<genexpr>   s)       Z Z1!3A!6 Z Z Z Z Z Zr   )r`   rU   rT   rS   rQ   r1   rR   rg   rW   rV   rP   r    r#   all)ri   grad_outputexpected_lenuser_pre_hookhook_grad_outputs
actual_lengrad_inputs	user_hookr]   r   r$   s            @r   rL   z8BackwardHook.setup_output_hook.<locals>.fn.<locals>.hook   s   $($8$89R9D9=%I %I! & >#&t'8#9#9L)-)< 	> 	>,9M$+tGX,Y,Y),4$%():%;%;
%55". 0`6@0` 0`Q]0` 0` #a #a a,=)) &*%6" +3"&"6"6r2t}"M"MK%)_ p p	'i[$BSTT?JsE4J4J?sRlRlhkRlRlRlOlOl?". 0o #p #p p(,D%%14@@@  Z Z Z Z@Y Z Z ZZZZ 21r   rk   )rm   rL   r$   s     r   r   z*BackwardHook.setup_output_hook.<locals>.fn   s>    "[ "[ "[ "[ "[H !!$'''''r   TFr   )r    r#   r   r1   rT   rU   )r$   r   r   is_tupler]   
output_idxs   `     r   setup_output_hookzBackwardHook.setup_output_hook   s    %	( %	( %	( %	( %	(N $&& 	7DH00T::ZT$.! 	a&C
r   N)r;   r<   r=   r>   r%   r`   rc   rn   r   r   r   r   r   r   r	   r	   ]   s         	( 	( 	(    $ $ $6#  #  # J  3 3 3 3 3r   r	   )rv   collectionsr   r   rG   typingr   r   __all__r   r   r   r	   r   r   r   <module>r      s     # # # # # #          
Y
Y
Y; ; ; ; ; ; ; ;|  : : :` ` ` ` ` ` ` ` ` `r   