§
    Ë²Åj/&  ã                   ó‚   — 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     úBC:\Projects\Historical\venv\Lib\site-packages\torch/utils/hooks.pyú	<genexpr>z+RemovableHandle.__init__.<locals>.<genexpr>!   s*   è è € Ð'KÐ'K¸1­¬°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Ô"KˆDÔÐÐð	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   € Ø×(Ò(Ñ*Ô*ˆ
ØÐ! d¤g°Ð&;Ð&;Ø˜4œ7Ð#àÔ&ð 	(ð 	(ˆCØ˜™œˆJØÐ%¨$¬'°ZÐ*?Ð*?Ø˜tœwÐ'øð	(ð 	(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   € ØÔÐ&Ø×'Ò'Ñ)Ô)¨4¬7Ð3Ð3à×'Ò'Ñ)Ô)¨4¬7µEÐ9_Ð9_È4ÔK^Ð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Ð'I¸1­¬°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Ðå")¤+­k©m¬mÑ"<Ô"<ˆDÔÐå")¤+¨e°A¬hÑ"7Ô"7ˆDÔØ˜”(ˆŒÝ"%¥oÔ&=¸t¼wÈ¹{Ñ"KÔ"K�Ôåˆu‰:Œ:˜Š>ˆ>˜U 1œXÐ-Ø"$ˆDÔÐÐå"'Ð'IÐ'IÀÀaÄÐ'IÑ'IÔ'IÑ"IÔ"IˆDÔÐÐ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ü   € € € € € € ðð ð 	€G€G�GØ€GˆSÐÐÑà=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Ð!;Ñ<Ô<ð :Ý”ð 9­t°D©z¬zð 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   € Øˆf�t‰mˆÝ˜G VÑ,Ô,ð 	ð 	‰HˆC�ØˆC�‰HˆHå�S‰zŒzÐr   c                 ó>   ‡— ˆfd„|D ¦   «         }t          |¦  «        S )Nc                 ó    •— g | ]
}‰|         ‘ŒS r   r   )r   r^   r[   s     €r   ú
<listcomp>z-BackwardHook._unpack_none.<locals>.<listcomp>{   s   ø€ Ð.Ð.Ð.˜sˆv�cŒ{Ð.Ð.Ð.r   )r#   )r$   rZ   r[   r]   s     ` r   Ú_unpack_nonezBackwardHook._unpack_nonez   s(   ø€ Ø.Ð.Ð.Ð. gÐ.Ñ.Ô.ˆå�S‰zŒzÐ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   ÚRuntimeErrorrd   )Ú
grad_inputÚ_r]   rL   Úoutr$   s        €r   rL   z)BackwardHook._set_user_hook.<locals>.hook€   sæ   ø€ ØÔ Ð(ð �Ø×&Ò& tÔ'?ÀÈTÌ]Ñ[Ô[ˆCàœð 
ð 
�Ø�d˜4œ;¨¨TÔ->Ñ?Ô?�à�;Øå�s‘8”8�s 3™xœxÒ'Ð'Ý&ð (RÝ.1°#©h¬hð(Rð (RÝGJÈ3ÁxÄxð(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)rn   Úname)r   Úts     r   rc   z2BackwardHook._apply_on_tensors.<locals>.<listcomp>®   s]   € ð  Dð  Dð  D !°a´iÐ6KÐPQÔPY×P^ÒP^ÑP`ÔP`ð  eCò  QCð  QC�A”Ið  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ÚTensorÚappendÚrequires_gradÚis_grad_enabledÚnnÚmodulesÚ
_functionsÚBackwardHookFunctionÚapplyr1   rh   r"   rY   r6   r#   )r$   ÚfnÚargsÚtensors_idxÚtensorsry   ÚiÚargÚnew_tensorsÚgrad_fnsÚarg_listr^   r_   rk   s                 r   Ú_apply_on_tensorszBackwardHook._apply_on_tensorsš   sŸ  € ð ˆØˆàˆÝ ‘o”oð 	3ð 	3‰FˆAˆsÝ˜#�uœ|Ñ,Ô,ð 3Ø×"Ò" 1Ñ%Ô%Ð%Ø—’˜sÑ#Ô#Ð#Ø Ô!2Ñ2�øàð 	¥%Ô"7Ñ"9Ô"9ð 	Ø˜�:Ðå”hÔ&Ô1ÔFÔLÈgÐVˆÝˆ{ÑÔ˜qÒ Ð ÝÐdÑeÔeÐeð Dð  D {ð  Dñ  Dô  DˆÝˆx‰=Œ=˜AÒÐÝð  Pñ Qô Qð Qð 	ˆˆ8�AŒ;‰Œˆå˜‘:”:ˆÝ˜K¨Ñ5Ô5ð 	 ð 	 ‰HˆC�ØˆH�S‰MˆMå�‰:Œ:�ÐÐÝ˜‘/”/ˆCˆCà•$�t‘*”*˜hÐ'ˆCØ�KÐÐr   c                 óz   ‡ — ˆ fd„}‰                       ||¦  «        \  }}t          |¦  «        ‰ _        |‰ _        |S )Nc                 ó2   •— ‰                      | ¦  «         d S r   )ro   )rn   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 rg   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*   è è € ÐRlÐRlÐbdÐSUÐY]ÐS]ÐRlÐRlÐRlÐRlÐRlÐRlr   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Ð Z¸1Ð!3°AÔ!6Ð ZÐ ZÐ ZÐ ZÐ ZÐ Zr   )r`   rU   rT   rS   rQ   r1   rR   rh   rW   rV   rP   r    r#   Úall)rj   Ú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¸Ô9RØ9DØ9=¼ñ%Iô %I�Ô!ð Ô&ð >Ý#& tÔ'8Ñ#9Ô#9�LØ)-Ô)<ð 	>ð 	>˜Ø,9¨M¸$¼+ÀtÔGXÑ,YÔ,YÐ)Ø,Ð4Ø$å%(Ð):Ñ%;Ô%;˜
Ø%¨Ò5Ð5Ý".ð 0`Ø6@ð0`ð 0`ØQ]ð0`ð 0`ñ #aô #að aà,=˜Ô)Ð)ð &*Ô%6Ð"ð Ô+Ð3Ø"&×"6Ò"6°r¸2¸t¼}Ñ"MÔ"M�KØ%)¤_ð pð p˜	Ø'˜i¨¬°[À$ÔBSÑTÔT˜Ø˜?µJ¸sÅEÑ4JÔ4J˜?ÍsÐRlÐRlÐhkÐRlÑRlÔRlÑOlÔOl˜?Ý".ð 0oñ #pô #pð pøà(,�DÔ%à%Ð1ØÔ4Ð@Ð@Ð@Ý Ð ZÐ ZÐ ZÐ ZÀÔ@YÐ ZÑ ZÔ ZÑZÔZÐZð 2Ð1r   rl   )rn   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 ˆÝ˜$¥Ñ&Ô&ð 	Ø�7ˆDØˆHà×0Ò0°°TÑ:Ô:‰ˆˆZÝ˜T™œˆŒØ$.ˆÔ!àð 	Ø�a”&ˆCØˆ
r   N)r;   r<   r=   r>   r%   r`   rd   ro   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   