Ë
    þÍ:jW  ã                  óF  — d dl mZ d dlZd dlmZ d dlZd dlmZ d dlmZ d dl	m
Z
 d dlZd dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ  G d„ dej*                  ¬«      Z G d„ dej*                  ¬«      Z G d„ de«      Z G d„ de«      Zdd„Z ed«      dd„«       Zdd„Zy)é    )ÚannotationsN)ÚCallable)ÚEvent)ÚThread)ÚTracebackType)Údeprecated_func)Úexperimental_func)ÚBaseStorage)ÚFrozenTrial)Ú
TrialStatec                  óÐ   — e Zd ZdZej
                  dd„«       Zej
                  dd„«       Zej
                  dd„«       Zej
                  	 	 dd„«       Z	 e
ddd¬	«      dd
„«       Zy)ÚBaseHeartbeatal  Base class for heartbeat.

    This class is not supposed to be directly accessed by library users.

    The heartbeat mechanism periodically checks whether each trial process is alive during an
    optimization loop. To support this mechanism, the methods of
    :class:`~optuna.storages._heartbeat.BaseHeartbeat` is implemented for the target database
    backend, typically with multiple inheritance of :class:`~optuna.storages._base.BaseStorage`
    and :class:`~optuna.storages._heartbeat.BaseHeartbeat`.

    .. seealso::
        See :class:`~optuna.storages.RDBStorage`, where the backend supports heartbeat.
    c                ó   — t        «       ‚)zqRecord the heartbeat of the trial.

        Args:
            trial_id:
                ID of the trial.
        ©ÚNotImplementedError)ÚselfÚtrial_ids     úo/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/optuna/storages/_heartbeat.pyÚrecord_heartbeatzBaseHeartbeat.record_heartbeat!   s   € ô "Ó#Ð#ó    c                ó   — t        «       ‚)zÝGet the stale trial ids of the study.

        Args:
            study_id:
                ID of the study.
        Returns:
            List of IDs of trials whose heartbeat has not been updated for a long time.
        r   )r   Ústudy_ids     r   Ú_get_stale_trial_idsz"BaseHeartbeat._get_stale_trial_ids+   s   € ô "Ó#Ð#r   c                ó   — t        «       ‚)z‹Get the heartbeat interval if it is set.

        Returns:
            The heartbeat interval if it is set, otherwise :obj:`None`.
        r   ©r   s    r   Úget_heartbeat_intervalz$BaseHeartbeat.get_heartbeat_interval7   s   € ô "Ó#Ð#r   c                ó   — t        «       ‚)z¨Get the heartbeat-stale trial callback function.

        Returns:
            The heartbeat-stale trial callback function if it is set, otherwise :obj:`None`.
        r   r   s    r   Ú"get_heartbeat_stale_trial_callbackz0BaseHeartbeat.get_heartbeat_stale_trial_callback@   s   € ô "Ó#Ð#r   z4.9.0z6.0.0z1Use `get_heartbeat_stale_trial_callback` instead.)Útextc                ó"   — | j                  «       S )z'Get the failed trial callback function.)r   r   s    r   Úget_failed_trial_callbackz'BaseHeartbeat.get_failed_trial_callbackK   s   € ð ×6Ñ6Ó8Ð8r   N)r   ÚintÚreturnÚNone)r   r"   r#   z	list[int])r#   z
int | None)r#   z4Callable[['optuna.Study', FrozenTrial], None] | None)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚabcÚabstractmethodr   r   r   r   r   r!   © r   r   r   r      s™   „ ñð 	×Ñò$ó ð$ð 	×Ñò	$ó ð	$ð 	×Ñò$ó ð$ð 	×Ñð$à	=ò$ó ð$ñ ØØØ@ôò
9óñ
9r   r   )Ú	metaclassc                  óx   — e Zd Zdd„Z	 	 	 	 	 	 	 	 dd„Zej                  dd„«       Zej                  dd„«       Zy)ÚBaseHeartbeatThreadc                ó$   — | j                  «        y ©N)Ústartr   s    r   Ú	__enter__zBaseHeartbeatThread.__enter__V   s   € Ø�
‰
�r   c                ó$   — | j                  «        y r0   )Újoin)r   Úexc_typeÚ	exc_valueÚ	tracebacks       r   Ú__exit__zBaseHeartbeatThread.__exit__Y   s   € ð 	�	‰	�r   c                ó   — t        «       ‚r0   r   r   s    r   r1   zBaseHeartbeatThread.starta   ó   € ä!Ó#Ð#r   c                ó   — t        «       ‚r0   r   r   s    r   r4   zBaseHeartbeatThread.joine   r:   r   N©r#   r$   )r5   ztype[Exception] | Noner6   zException | Noner7   zTracebackType | Noner#   r$   )	r%   r&   r'   r2   r8   r)   r*   r1   r4   r+   r   r   r.   r.   U   sf   „ óðà(ðð $ðð (ð	ð
 
óð 	×Ñò$ó ð$ð 	×Ñò$ó ñ$r   r.   c                  ó$   — e Zd Zdd„Zdd„Zdd„Zy)ÚNullHeartbeatThreadc                 ó   — y r0   r+   r   s    r   Ú__init__zNullHeartbeatThread.__init__k   ó   € Ør   c                 ó   — y r0   r+   r   s    r   r1   zNullHeartbeatThread.startn   rA   r   c                 ó   — y r0   r+   r   s    r   r4   zNullHeartbeatThread.joinq   rA   r   Nr<   )r%   r&   r'   r@   r1   r4   r+   r   r   r>   r>   j   s   „ óóôr   r>   c                  ó6   — e Zd Zdd„Zdd„Zdd„Zedd„«       Zy)	ÚHeartbeatThreadc                ó<   — || _         || _        d | _        d | _        y r0   )Ú	_trial_idÚ
_heartbeatÚ_threadÚ_stop_event)r   r   Ú	heartbeats      r   r@   zHeartbeatThread.__init__v   s   € Ø!ˆŒØ#ˆŒØ&*ˆŒØ)-ˆÕr   c                óÐ   — t        «       | _        t        | j                  | j                  | j
                  | j                  f¬«      | _        | j                  j                  «        y )N)ÚtargetÚargs)r   rJ   r   Ú_record_heartbeatrG   rH   rI   r1   r   s    r   r1   zHeartbeatThread.start|   sK   € Ü ›7ˆÔÜØ×)Ñ)°·±ÀÇÁÐRV×RbÑRbÐ0cô
ˆŒð 	�‰×ÑÕr   c                ó¤   — | j                   €J ‚| j                  €J ‚| j                   j                  «        | j                  j                  «        y r0   )rJ   rI   Úsetr4   r   s    r   r4   zHeartbeatThread.joinƒ   sF   € Ø×ÑÐ+Ð+Ð+Ø�|‰|Ð'Ð'Ð'Ø×Ñ×ÑÔØ�‰×ÑÕr   c                óv   — |j                  «       }|€J ‚	 |j                  | «       |j                  |¬«      ry Œ%)N)Útimeout)r   r   Úwait)r   rK   Ú
stop_eventÚheartbeat_intervals       r   rO   z!HeartbeatThread._record_heartbeat‰   sE   € à&×=Ñ=Ó?ÐØ!Ð-Ð-Ð-ØØ×&Ñ& xÔ0Ø�‰Ð'9ˆÔ:Øð r   N)r   r"   rK   r   r#   r$   r<   )r   r"   rK   r   rU   r   r#   r$   )r%   r&   r'   r@   r1   r4   ÚstaticmethodrO   r+   r   r   rE   rE   u   s%   „ ó.óóð òó ñr   rE   c                óh   — t        |«      rt        |t        «      sJ ‚t        | |«      S t	        «       S r0   )Úis_heartbeat_enabledÚ
isinstancer   rE   r>   )r   Ústorages     r   Úget_heartbeat_threadr\   “   s0   € Ü˜GÔ$Ü˜'¤=Ô1Ð1Ð1Ü˜x¨Ó1Ð1ä"Ó$Ð$r   z2.9.0c                óÔ  — | j                   }t        |t        «      syt        |«      syg }|j	                  | j
                  «      D ]5  }	 |j                  |t        j                  ¬«      r|j                  |«       Œ7 |j                  «       }|�5|D ]/  }t        j                  |j!                  |«      «      } || |«       Œ1 yy# t        j                  j                  $ r Y ŒŸw xY w)au  Fail stale trials and run their failure callbacks.

    The running trials whose heartbeat has not been updated for a long time will be failed,
    that is, those states will be changed to :obj:`~optuna.trial.TrialState.FAIL`.

    .. seealso::

        See :class:`~optuna.storages.RDBStorage`.

    Args:
        study:
            Study holding the trials to check.
    N)Ústate)Ú_storagerZ   r   rY   r   Ú	_study_idÚset_trial_state_valuesr   ÚFAILÚappendÚoptunaÚ
exceptionsÚUpdateFinishedTrialErrorr   ÚcopyÚdeepcopyÚ	get_trial)Ústudyr[   Úfailed_trial_idsr   Úheartbeat_stale_trial_callbackÚfailed_trials         r   Úfail_stale_trialsrn   ›   sæ   € ð �n‰n€Gä�gœ}Ô-Øä Ô(ØàÐØ×0Ñ0°·±ÓAò ˆð	Ø×-Ñ-¨h¼j¿o¹oÐ-ÔNØ ×'Ñ'¨Ô1øðð &-×%OÑ%OÓ%QÐ"Ø%Ð1Ø(ò 	@ˆHÜŸ=™=¨×):Ñ):¸8Ó)DÓEˆLÙ*¨5°,Õ?ñ	@ð 2øô × Ñ ×9Ñ9ò 	ñ ð	ús   Á2CÃC'Ã&C'c                óJ   — t        | t        «      xr | j                  «       duS )a2  Check whether the storage enables the heartbeat.

    Returns:
        :obj:`True` if the storage also inherits :class:`~optuna.storages._heartbeat.BaseHeartbeat`
        and the return value of :meth:`~optuna.storages.BaseStorage.get_heartbeat_interval` is an
        integer, otherwise :obj:`False`.
    N)rZ   r   r   )r[   s    r   rY   rY   Ã   s%   € ô �gœ}Ó-Ò^°'×2PÑ2PÓ2RÐZ^Ð2^Ð^r   )r   r"   r[   r
   r#   r.   )rj   z'optuna.Study'r#   r$   )r[   r
   r#   Úbool)Ú
__future__r   r)   Úcollections.abcr   rg   Ú	threadingr   r   Útypesr   rd   Úoptuna._deprecatedr   Úoptuna._experimentalr	   Úoptuna.storagesr
   Úoptuna.trialr   r   ÚABCMetar   r.   r>   rE   r\   rn   rY   r+   r   r   ú<module>rz      s�   ðÝ "ã 
Ý $Û Ý Ý Ý ã Ý .Ý 2Ý 'Ý $Ý #ô@9˜cŸk™kõ @9ôF$ C§K¡Kõ $ô*Ð-ô ôÐ)ô ó<%ñ �7Óò$@ó ð$@ôN_r   