ó
    "Eñiä'  ã                   ót   • 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S j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     ÚN/home/mande/repo/quber/.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   € Ü%Ÿkšk¨*Ó5ˆÔÜ!×)Ñ)ˆŒÜ×Ò 1Ñ$Õà%'ˆÔÜ�j¤$×'Ñ'Ü#*§;¢;¨zÓ#:Ð"<ˆDÕÜ˜
¤D×)Ñ)Ü"'Ñ'KÁ
Ó'KÓ"KˆDÕð *ó    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]   € Ø×(Ñ(Ó*ˆ
ØÑ! d§g¡g°Ó&;ØŸ7™7Ð#à×&Ô&ˆCÙ›ˆJØÓ%¨$¯'©'°ZÕ*?ØŸw™wÒ'ò '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   € Ø×ÑÑ&Ø×'Ñ'Ó)¨4¯7©7Ð3Ð3à×'Ñ'Ó)¨4¯7©7´EÑ9_È4×K^Ò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Ñä")§+¢+¬k«mÓ"<ˆDÕä")§+¢+¨e°A©hÓ"7ˆDÔØ˜‘(ˆŒÜ"%¤o×&=Ñ&=¸t¿w¹wÈ¹{Ó"KŒÔäˆu‹:˜‹>˜U 1™XÑ-Ø"$ˆDÕä"'Ñ'IÀÀaÂÓ'IÓ"IˆDÕ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Ø€GˆSÓà=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                   (       aX  U R                    HG  nU R                   U   n[        US5      (       a  M%  [        R                  " S[	        U5       S3SS9  MI     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 warningr4   ©Ú
stacklevel)Ú_backward_hooksÚhasattrÚwarningsÚwarnÚrepr)ÚtensorÚkÚhooks      r   r   r   S   sf   € Ø××Ø×'Ô'ˆAØ×)Ñ)¨!Ñ,ˆDÜ˜4Ð!;×<Ó<Ü—’ ¬t°D«z¨lð ;9ð 9ð FGôHò (ð r(   c                   óJ   • \ rS rSrSrSS jrS rS rSS j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
Nc                 ó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%   rb   r`   ra   s       r   r&   ÚBackwardHook.__init__h   s8   € Ø$ŒØ,ÔØŒà ˆÔØˆŒØ$(ˆÔ!ØˆŒØ#'ˆÕ r(   c                 óR   • S /U-  n[        XSS9 H	  u  pVXdU'   M     [        U5      $ )NT©Ústrict)Úzipr$   )r%   ÚindicesÚvaluesÚsizeÚresÚidxÚvals          r   Ú_pack_with_noneÚBackwardHook._pack_with_nones   s3   € Øˆf�t‰mˆÜ˜G°DÔ9‰HˆCØ�‹Hñ :ô �S‹zÐr(   c                 óJ   • U Vs/ s H  o2U   PM	     nn[        U5      $ s  snf r   )r$   )r%   rm   rn   rq   rp   s        r   Ú_unpack_noneÚBackwardHook._unpack_nonez   s'   € Ù&-Ó.¢g˜s�cŒ{¡gˆÐ.ä�S‹zÐùò /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 )	rc   rs   rg   rf   r`   rb   r8   ÚRuntimeErrorrv   )Ú
grad_inputÚ_rp   r[   Úoutr%   s        €r   r[   Ú)BackwardHook._set_user_hook.<locals>.hook€   sÇ   ø€ Ø× Ñ Ñ(ð Ø×&Ñ& t×'?Ñ'?ÀÈTÏ]É]Ó[ˆCàŸœ�Ù˜4Ÿ;™;¨¨T×->Ñ->Ó?�à‘;Ùä�s“8œs 3›xÓ'Ü&ð (.Ü.1°#«h¨Z°ÄsÈ3ÃxÀjð(Ró Sð Sð ’ñ (ð !%ˆDÔà×$Ñ$ T×%=Ñ%=¸sÓCÐCr(   ©Úregister_hook)r%   Úgrad_fnr[   s   `  r   Ú_set_user_hookÚBackwardHook._set_user_hook   s   ø€ õ	Dð2 	×Ñ˜dÕ#r(   c                 óZ  • / 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=  o™R                  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[#        X8SS9 H	  u  pÍXÛU'   M     [%        U5      [&        L a  ['        U5      nXã4$ [%        U5      " U6 nXã4$ 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.Trj   )Ú	enumerater!   ÚtorchÚTensorÚappendÚrequires_gradÚis_grad_enabledÚnnÚmodulesÚ
_functionsÚBackwardHookFunctionÚapplyr8   r{   r‚   Únamer#   rl   r?   r$   )r%   ÚfnÚargsÚtensors_idxÚtensorsr‹   ÚiÚargÚnew_tensorsÚtÚgrad_fnsÚarg_listrq   rr   r~   s                  r   Ú_apply_on_tensorsÚBackwardHook._apply_on_tensors›   s‘  € ð ˆØˆàˆÜ –o‰FˆAÜ˜#œuŸ|™|×,Ó,Ø×"Ñ" 1Ô%Ø—‘˜sÔ#Ø×!2Ñ!2Ñ2’ñ	 &ö ¤%×"7Ò"7×"9Ñ"9Ø˜�:Ðä—h‘h×&Ñ&×1Ñ1×FÑF×LÒLÈgÐVˆÜˆ{Ó˜qÓ ÜÐdÓeÐeá'2ó  D¢{ !·i±i“IÐPQ×PYÑPY×P^ÑP^ÓP`ð  eCñ  QC“I�A—I”I¡{ˆð  DÜˆx‹=˜AÓÜð  Pó Qð Qñ 	ˆ8�A‰;Œä˜“:ˆÜ˜K¸TÔB‰HˆCØ�S‹Mñ Cô �‹:œÒÜ˜“/ˆCð ÐÐô �t”*˜hÐ'ˆCØÐÐùò Ds   Ã*F(Ã>F(ÄF(c                 ól   ^ • SU 4S j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(   rE   )r�   r8   rf   rg   )r%   r”   r“   rp   Ú	input_idxs   `    r   Úsetup_input_hookÚBackwardHook.setup_input_hookÀ   s4   ø€ ÷	)ð ×/Ñ/°Ó9‰ˆÜ˜D›	ˆŒØ#,ˆÔ Øˆ
r(   c                 ó¼   ^ • SU 4S j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                 óX  >^	• 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¦  [        R                  " SSS9  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	b7  T
R                  c  [!        S5      e[        U	4S	 jT
R                   5       5      $ g )
NzABackward pre hook returned an invalid number of grad_output, got rz   zþFull backward hook is firing when gradients are computed with respect to module outputs since no inputs require gradients. See https://docs.pytorch.org/docs/main/generated/torch.nn.Module.html#torch.nn.Module.register_full_backward_hook for more details.é   rR   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   é € ÐRlÒhkÐbdÐY]ÕS]Òhkùs   ‚zoBackward hook for Modules where no input requires gradient should always return None or None for all gradients.zEoutput_tensors_index should not be None when grad_outputs is not Nonec              3   ó.   >#   • U  H
  nTU   v •  M     g 7fr   r   )r   r—   Úlocal_grad_outputss     €r   r   r«   ó   s   øé € Ð ZÒ@Y¸1Ð!3°AÖ!6Ò@Yùs   ƒ)rs   re   rd   rc   ra   r8   rb   r{   rg   rV   rW   rf   r`   r!   r$   ÚallÚAssertionError)r}   Úgrad_outputÚexpected_lenÚuser_pre_hookÚhook_grad_outputsÚ
actual_lenÚgrad_inputsÚ	user_hookrp   r­   r%   s            @€r   r[   Ú8BackwardHook.setup_output_hook.<locals>.fn.<locals>.hookË   s¡  ù€ Ø$(×$8Ñ$8¸×9RÑ9RØ9DØ9=¿¹ó%I�Ô!ð ×&×&Ü#& t×'8Ñ'8Ó#9�LØ)-×)<Ô)<˜Ù,9¸$¿+¹+Àt×GXÑGXÓ,YÐ)Ø,Ñ4Ù$ä%(Ð):Ó%;˜
Ø%Ó5Ü".ð 06Ø6@°\ÀÐQ]ÐP^ð0`ó #að aà,=˜Ö)ñ *=ð &*×%6Ñ%6Ð"ð ×+Ñ+Ñ3Ü—M’Mð #6ð ./ò	0ð
 #'×"6Ñ"6°r¸2¸t¿}¹}Ó"M�KØ%)§_¤_˜	Ù'¨¯©°[À$×BSÑBSÓT˜Ø›?´J¸sÄE×4JÑ4JÌsÑRlÑhkÓRl×OlÓOlÜ".ð 0oó #pð pñ &5ð
 )-�DÔ%à%Ñ1Ø×0Ñ0Ñ8Ü,Ð-tÓuÐuÜ Ô ZÀ×@YÒ@YÓ ZÓZÐZð 2r(   r€   )r‚   r[   r%   s     €r   r“   Ú*BackwardHook.setup_output_hook.<locals>.fnÊ   s   ø€ õ([ðT ×!Ñ! $Õ'r(   TFr   rE   )r!   r$   r�   r8   rd   re   )r%   r”   r“   Úis_tuplerp   Ú
output_idxs   `     r   Úsetup_output_hookÚBackwardHook.setup_output_hookÉ   s_   ø€ ÷+	(ðZ ˆÜ˜$¤×&Ñ&Ø�7ˆDØˆHà×0Ñ0°Ó:‰ˆÜ˜T›ˆŒØ$.ˆÔ!æØ�a‘&ˆCØˆ
r(   )rc   rg   rb   rf   rd   re   r`   ra   rE   )rF   rG   rH   rI   rJ   r&   rs   rv   rƒ   r�   r£   r»   rM   r   r(   r   r   r   ]   s+   † ñô	(òòô
$ò8# òJõ9r(   r   rE   )rˆ   Úcollectionsr   r   rV   Útypingr   Ú__all__r   r   r   r   r   r(   r   Ú<module>rÀ      s;   ðã Ý #Û Û Ý â
Y€÷;ñ ;ò|ôH÷eò er(   