§
    �Štj§'  ã                   ó€   — d dl Z d dlmZ d dlZd dlZd dlmZ g d¢Z G d„ d¦  «        Zd„ Z	dd	„Z
 G d
„ d¦  «        ZdS )é    N)ÚOrderedDict)ÚAny)Ú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     úO/var/www/html/CA-Chatbot/venv/lib/python3.11/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#   r5   r6   r7   s       r   Ú__exit__zRemovableHandle.__exit__D   s   € Ø�Š‰Œˆˆˆr   ©r   N)r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚintÚ__annotations__r   r   r$   r&   r*   r2   r4   r9   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   r   c                 ó´   — | j         rN| j         D ]H}| j         |         }t          |d¦  «        s't          j        dt	          |¦  «        › d�d¬¦  «         ŒGd 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 warningr-   ©Ú
stacklevel)Ú_backward_hooksÚhasattrÚwarningsÚwarnÚrepr)ÚtensorÚkÚhooks      r   r   r   S   sœ   € ØÔð HØÔ'ð 	Hð 	HˆAØÔ)¨!Ô,ˆDÝ˜4Ð!;Ñ<Ô<ð HÝ”ð 9­t°D©z¬zð 9ð 9ð 9ð FGðHñ Hô Hð Høð	Hð Hð	Hð 	Hr   c                   ó@   — e Zd ZdZdd„Zd„ Zd„ Zd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
    r   Nc                 ó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#   rT   rR   rS   s       r   r$   zBackwardHook.__init__h   sD   € Ø$ˆŒØ,ˆÔØˆŒà ˆÔØˆŒØ$(ˆÔ!ØˆŒØ#'ˆÔ Ð Ð r   c                 óf   — d g|z  }t          ||d¬¦  «        D ]
\  }}|||<   Œt          |¦  «        S )NT©Ústrict)Úzipr"   )r#   ÚindicesÚvaluesÚsizeÚresÚidxÚvals          r   Ú_pack_with_nonezBackwardHook._pack_with_nones   sF   € Øˆf�t‰mˆÝ˜G V°DÐ9Ñ9Ô9ð 	ð 	‰HˆC�ØˆC�‰HˆHå�S‰zŒzÐr   c                 ó>   ‡— ˆfd„|D ¦   «         }t          |¦  «        S )Nc                 ó    •— g | ]
}‰|         ‘ŒS r   r   )r   rb   r_   s     €r   ú
<listcomp>z-BackwardHook._unpack_none.<locals>.<listcomp>{   s   ø€ Ð.Ð.Ð.˜sˆv�cŒ{Ð.Ð.Ð.r   )r"   )r#   r^   r_   ra   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 )	rU   rd   rY   rX   rR   rT   r0   ÚRuntimeErrorrh   )Ú
grad_inputÚ_ra   rN   Úoutr#   s        €r   rN   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_fnrN   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¬¦  «        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)rr   Úname)r   Úts     r   rg   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.Tr[   )Ú	enumerater   ÚtorchÚTensorÚappendÚrequires_gradÚis_grad_enabledÚnnÚmodulesÚ
_functionsÚBackwardHookFunctionÚapplyr0   rl   r!   r]   r5   r"   )r#   ÚfnÚargsÚtensors_idxÚtensorsr}   ÚiÚargÚnew_tensorsÚgrad_fnsÚarg_listrb   rc   ro   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¨¸TÐBÑBÔBð 	 ð 	 ‰HˆC�ØˆH�S‰MˆMå�‰:Œ:�ÐÐÝ˜‘/”/ˆCˆCà•$�t‘*”*˜hÐ'ˆCØ�KÐÐr   c                 ó|   ‡ — dˆ fd„}‰                       ||¦  «        \  }}t          |¦  «        ‰ _        |‰ _        |S )Nr   c                 ó2   •— ‰                      | ¦  «         d S r   )rs   )rr   r#   s    €r   r„   z)BackwardHook.setup_input_hook.<locals>.fnÀ   s   ø€ Ø×Ò Ñ(Ô(Ð(Ð(Ð(r   r:   )r�   r0   rX   rY   )r#   r…   r„   ra   Ú	input_idxs   `    r   Úsetup_input_hookzBackwardHook.setup_input_hook¿   sV   ø€ ð	)ð 	)ð 	)ð 	)ð 	)ð 	)ð ×/Ò/°°DÑ9Ô9‰ˆˆYÝ˜D™	œ	ˆŒØ#,ˆÔ Øˆ
r   c                 óÈ   ‡ — dˆ fd„}d}t          |t          ¦  «        s|f}d}‰                      ||¦  «        \  }}t          |¦  «        ‰ _        |‰ _        |s|d         }|S )Nr   c                 ó<   •— ˆfd„}|                       |¦  «         d S )Nc                 óò  •‡	— ‰
                      ‰
j        |‰
j        ¦  «        ‰
_        ‰
j        rht          ‰
j        ¦  «        }‰
j        D ]L} |‰
j        ‰
j        ¦  «        }|€Œt          |¦  «        }||k    rt          d|› d|› �¦  «        ‚|‰
_        ŒM‰
j        Š	‰
j        €™t          j
        dd¬¦  «         ‰
                      g g ‰
j        ¦  «        }‰
j        D ]X} |‰
j        |‰
j        ¦  «        }|�=t          |t          ¦  «        rt          d„ |D ¦   «         ¦  «        st          d¦  «        ‚ŒYd ‰
_        ‰	�6‰
j        €t!          d¦  «        ‚t          ˆ	fd	„‰
j        D ¦   «         ¦  «        S d S )
NzABackward pre hook returned an invalid number of grad_output, got rk   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.é   rE   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.zEoutput_tensors_index should not be None when grad_outputs is not Nonec              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   )rd   rW   rV   rU   rS   r0   rT   rl   rY   rI   rJ   rX   rR   r   r"   ÚallÚAssertionError)rn   Úgrad_outputÚexpected_lenÚuser_pre_hookÚhook_grad_outputsÚ
actual_lenÚgrad_inputsÚ	user_hookra   r™   r#   s            @€r   rN   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Ý”Mð #6ð ./ð	0ñ 0ô 0ð 0ð
 #'×"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ØÔ0Ð8Ý,Ð-tÑuÔuÐuÝ Ð ZÐ ZÐ ZÐ ZÀÔ@YÐ ZÑ ZÔ ZÑZÔZÐZð 2Ð1r   rp   )rr   rN   r#   s     €r   r„   z*BackwardHook.setup_output_hook.<locals>.fnÉ   s>   ø€ ð([ð ([ð ([ð ([ð ([ðT ×!Ò! $Ñ'Ô'Ð'Ð'Ð'r   TFr   r:   )r   r"   r�   r0   rV   rW   )r#   r…   r„   Úis_tuplera   Ú
output_idxs   `     r   Úsetup_output_hookzBackwardHook.setup_output_hookÈ   s‹   ø€ ð+	(ð +	(ð +	(ð +	(ð +	(ð +	(ðZ ˆÝ˜$¥Ñ&Ô&ð 	Ø�7ˆDØˆHà×0Ò0°°TÑ:Ô:‰ˆˆZÝ˜T™œˆŒØ$.ˆÔ!àð 	Ø�a”&ˆCØˆ
r   r:   )r;   r<   r=   r>   r$   rd   rh   rs   r�   r‘   r¥   r   r   r   r   r   ]   s’   € € € € € ðð ð	(ð 	(ð 	(ð 	(ðð ð ðð ð ð
$ð $ð $ð $ð6# ð # ð # ðJð ð ð9ð 9ð 9ð 9ð 9r   r   r:   )rz   Úcollectionsr   r   rI   Útypingr   Ú__all__r   r   r   r   r   r   r   ú<module>r©      sÛ   ðà €€€Ø #Ð #Ð #Ð #Ð #Ð #Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð à
YÐ
YÐ
Y€ð;ð ;ð ;ð ;ð ;ñ ;ô ;ð ;ð|ð ð ðHð Hð Hð Hðdð dð dð dð dñ dô dð dð dð dr   