o
    }oi/                     @  s   d dl mZ d dlmZ d dlmZ d dlmZ d dl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m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 dZG dd deeZdS )    )annotations)Callable)	Container)SequenceN)Any)distributions)JSONSerializable)BaseStorage)BaseHeartbeat)
RDBStorage)FrozenStudy)StudyDirection)FrozenTrial)
TrialStatec                   @  s   e Zd ZdddZdS )
_StudyInforeturnNonec                 C  s*   i | _ t | _d| _i | _d | _d | _d S )N)trialssetunfinished_trial_idslast_finished_trial_idparam_distribution
directionsnameself r   S/home/ubuntu/.local/lib/python3.10/site-packages/optuna/storages/_cached_storage.py__init__   s   
z_StudyInfo.__init__N)r   r   )__name__
__module____qualname__r   r   r   r   r   r      s    r   c                   @  sL  e Zd ZdZdlddZdmd	d
ZdnddZ	dodpddZdqddZdrddZ	dsd d!Z
dtd"d#Zdud$d%Zdvd'd(Zdwd*d+Zdwd,d-Zdxd/d0Zdodyd3d4Zdzd;d<Zd{d>d?Zd|dAdBZ	dod}dGdHZd~dKdLZddMdNZddOdPZddQdRZddSdTZ	U	dddZd[Zdqd\d]Zdd_d`ZddadbZddddeZddgdhZ ddjdkZ!dS )_CachedStoragea7  A wrapper class of storage backends.

    This class is used in :func:`~optuna.get_storage` function and automatically
    wraps :class:`~optuna.storages.RDBStorage` class.

    :class:`~optuna.storages._CachedStorage` meets the following **Data persistence** requirements.

    **Data persistence**

    :class:`~optuna.storages._CachedStorage` does not guarantee that write operations are logged
    into a persistent storage, even when write methods succeed.
    Thus, when process failure occurs, some writes might be lost.
    As exceptions, when a persistent storage is available, any writes on any attributes
    of `Study` and writes on `state` of `Trial` are guaranteed to be persistent.
    Additionally, any preceding writes on any attributes of `Trial` are guaranteed to
    be written into a persistent storage before writes on `state` of `Trial` succeed.
    The same applies for `param`, `user_attrs', 'system_attrs' and 'intermediate_values`
    attributes.

    Args:
        backend:
            :class:`~optuna.storages.RDBStorage` class instance to wrap.
    backendr   r   r   c                 C  s&   || _ i | _i | _i | _t | _d S N)_backend_studies _trial_id_to_study_id_and_number _study_id_and_number_to_trial_id	threadingLock_lock)r   r$   r   r   r   r   =   s
   z_CachedStorage.__init__dict[Any, Any]c                 C  s   | j  }|d= |S )Nr,   )__dict__copyr   stater   r   r   __getstate__D   s   
z_CachedStorage.__getstate__r1   c                 C  s   | j | t | _d S r%   )r.   updater*   r+   r,   r0   r   r   r   __setstate__I   s   z_CachedStorage.__setstate__Nr   Sequence[StudyDirection]
study_name
str | Noneintc                 C  s\   | j j||d}| j t }||_t||_|| j|< W d    |S 1 s'w   Y  |S )N)r   r6   )r&   create_new_studyr,   r   r   listr   r'   )r   r   r6   study_idstudyr   r   r   r9   M   s   

z_CachedStorage.create_new_studyr;   c                 C  s   | j 8 || jv r4| j| jD ] }| j||f}|| jv r"| j|= ||f| jv r/| j||f= q| j|= W d    n1 s>w   Y  | j| d S r%   )r,   r'   r   r)   getr(   r&   delete_study)r   r;   trial_numbertrial_idr   r   r   r>   Y   s   


z_CachedStorage.delete_studykeystrvaluer   c                 C     | j ||| d S r%   )r&   set_study_user_attrr   r;   rA   rC   r   r   r   rE   f      z"_CachedStorage.set_study_user_attrr   c                 C  rD   r%   )r&   set_study_system_attrrF   r   r   r   rH   i   rG   z$_CachedStorage.set_study_system_attrc                 C     | j |S r%   )r&   get_study_id_from_name)r   r6   r   r   r   rJ   l      z%_CachedStorage.get_study_id_from_namec                 C     | j   || jv r| j| j}|d ur|W  d    S W d    n1 s&w   Y  | j|}| j  || jvr@t | j|< || j| _W d    |S 1 sQw   Y  |S r%   )r,   r'   r   r&   get_study_name_from_idr   )r   r;   r   r   r   r   rM   o   "   
 

z%_CachedStorage.get_study_name_from_idlist[StudyDirection]c                 C  rL   r%   )r,   r'   r   r&   get_study_directionsr   )r   r;   r   r   r   r   rP   }   rN   z#_CachedStorage.get_study_directionsdict[str, Any]c                 C  rI   r%   )r&   get_study_user_attrsr   r;   r   r   r   rR      rK   z#_CachedStorage.get_study_user_attrsc                 C  rI   r%   )r&   get_study_system_attrsrS   r   r   r   rT      rK   z%_CachedStorage.get_study_system_attrslist[FrozenStudy]c                 C  
   | j  S r%   )r&   get_all_studiesr   r   r   r   rW         
z_CachedStorage.get_all_studiestemplate_trialFrozenTrial | Nonec                 C  sd   | j ||}|j}| j || jvrt | j|< | ||g W d    |S 1 s+w   Y  |S r%   )r&   _create_new_trial	_trial_idr,   r'   r   _add_trials_to_cache)r   r;   rY   frozen_trialr@   r   r   r   create_new_trial   s   

z_CachedStorage.create_new_trialr@   
param_nameparam_value_internalfloatdistributiondistributions.BaseDistributionc                 C  s   | j 7 | j| \}}| j| j|}| j||||| |d u r2|| j| j|< W d    d S W d    d S 1 s=w   Y  d S r%   )r,   r(   r'   r   r=   r&   _set_trial_param)r   r@   r`   ra   rc   r;   _cached_distr   r   r   set_trial_param   s   
"z_CachedStorage.set_trial_paramr?   c                 C  s^   ||f}| j  || jv r| j| W  d    S W d    n1 s#w   Y  | j||S r%   )r,   r)   r&   'get_trial_id_from_study_id_trial_number)r   r;   r?   rA   r   r   r   ri      s   
z6_CachedStorage.get_trial_id_from_study_id_trial_numberr   c                 C  s>   |  |}t|dkrtd|d }| j||}| |S )N   zBBest trial can be obtained only for single-objective optimization.r   )rP   lenRuntimeErrorr&   _get_best_trial_id	get_trial)r   r;   _directions	directionr@   r   r   r   get_best_trial   s   

z_CachedStorage.get_best_trialr   valuesSequence[float] | Noneboolc                 C  s   | j j|||dS )N)r1   rr   )r&   set_trial_state_values)r   r@   r1   rr   r   r   r   ru      s   z%_CachedStorage.set_trial_state_valuesstepintermediate_valuec                 C  rD   r%   )r&   set_trial_intermediate_value)r   r@   rv   rw   r   r   r   rx      s   z+_CachedStorage.set_trial_intermediate_valuec                 C     | j j|||d d S N)rA   rC   )r&   set_trial_user_attrr   r@   rA   rC   r   r   r   r{         z"_CachedStorage.set_trial_user_attrc                 C  ry   rz   )r&   set_trial_system_attrr|   r   r   r   r~      r}   z$_CachedStorage.set_trial_system_attrc                 C  sB   || j vrd S | j | \}}| j| }|j| }|j sd S |S r%   )r(   r'   r   r1   is_finished)r   r@   r;   numberr<   trialr   r   r   _get_cached_trial   s   



z _CachedStorage._get_cached_trialc                 C  sV   | j  | |}|d ur|W  d    S W d    n1 s w   Y  | j|S r%   )r,   r   r&   rn   )r   r@   r   r   r   r   rn      s   
z_CachedStorage.get_trialTdeepcopystatesContainer[TrialState] | Nonelist[FrozenTrial]c                   s   |  | | j6 | j| } d ur fdd|j D }n|j}tt| dd d}|r5t	|n|W  d    S 1 sAw   Y  d S )Nc                   s    i | ]\}}|j  v r||qS r   )r1   ).0r   tr   r   r   
<dictcomp>   s     z1_CachedStorage.get_all_trials.<locals>.<dictcomp>c                 S  s   | j S r%   )r   )r   r   r   r   <lambda>   s    z/_CachedStorage.get_all_trials.<locals>.<lambda>)rA   )
 _read_trials_from_remote_storager,   r'   r   itemsr:   sortedrr   r/   r   )r   r;   r   r   r<   r   r   r   r   get_all_trials   s   

$z_CachedStorage.get_all_trialsc                 C  s   | j ] || jvrt | j|< | j| }| jj|d |j|jd}|s+	 W d    d S | || |D ]$}|j	 sB|j
|j q3t|j|j|_|j|jv rW|j|j q3W d    d S 1 scw   Y  d S )N)r   included_trial_idstrial_id_greater_than)r,   r'   r   r&   _get_trialsr   r   r]   r1   r   addr\   maxremove)r   r;   r<   r   r   r   r   r   r      s0   


"z/_CachedStorage._read_trials_from_remote_storager   c                 C  sH   | j | }|D ]}||jf| j|j< |j| j||jf< ||j|j< qd S r%   )r'   r   r(   r\   r)   r   )r   r;   r   r<   r   r   r   r   r]     s   
z#_CachedStorage._add_trials_to_cachec                 C  s   | j | d S r%   )r&   record_heartbeat)r   r@   r   r   r   r     s   z_CachedStorage.record_heartbeat	list[int]c                 C  rI   r%   )r&   _get_stale_trial_idsrS   r   r   r   r     rK   z#_CachedStorage._get_stale_trial_ids
int | Nonec                 C  rV   r%   )r&   get_heartbeat_intervalr   r   r   r   r   !  rX   z%_CachedStorage.get_heartbeat_interval4Callable[['optuna.Study', FrozenTrial], None] | Nonec                 C  rV   r%   )r&   get_failed_trial_callbackr   r   r   r   r   $  rX   z(_CachedStorage.get_failed_trial_callback)r$   r   r   r   )r   r-   )r1   r-   r   r   r%   )r   r5   r6   r7   r   r8   )r;   r8   r   r   )r;   r8   rA   rB   rC   r   r   r   )r;   r8   rA   rB   rC   r   r   r   )r6   rB   r   r8   )r;   r8   r   rB   )r;   r8   r   rO   )r;   r8   r   rQ   )r   rU   )r;   r8   rY   rZ   r   r8   )
r@   r8   r`   rB   ra   rb   rc   rd   r   r   )r;   r8   r?   r8   r   r8   )r;   r8   r   r   )r@   r8   r1   r   rr   rs   r   rt   )r@   r8   rv   r8   rw   rb   r   r   )r@   r8   rA   rB   rC   r   r   r   )r@   r8   rA   rB   rC   r   r   r   )r@   r8   r   rZ   )r@   r8   r   r   )TN)r;   r8   r   rt   r   r   r   r   )r;   r8   r   r   r   r   )r@   r8   r   r   )r;   r8   r   r   )r   r   )r   r   )"r    r!   r"   __doc__r   r2   r4   r9   r>   rE   rH   rJ   rM   rP   rR   rT   rW   r_   rh   ri   rq   ru   rx   r{   r~   r   rn   r   r   r]   r   r   r   r   r   r   r   r   r#   $   sH    












	













r#   )
__future__r   collections.abcr   r   r   r/   r*   typingr   optunar   optuna._typingr   optuna.storagesr	   optuna.storages._heartbeatr
   optuna.storages._rdb.storager   optuna.study._frozenr   optuna.study._study_directionr   optuna.trialr   r   r   r#   r   r   r   r   <module>   s&    