o
    }oiXA                     @  s  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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 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  e
rd dl!Z!d dl"m#Z$ d dl%m&Z& d dl%m'Z' nedZ&edZ'edZ!edZ$d)d d!Z(ed"G d#d$ d$eZ)G d%d& d&Z*G d'd( d(Z+dS )*    )annotations)	Container)SequenceN)Any)TYPE_CHECKING)experimental_class)_LazyImport)BaseDistribution)distribution_to_json)DuplicatedStudyError)UpdateFinishedTrialError)BaseStorage)DEFAULT_STUDY_NAME_PREFIX)FrozenStudy)StudyDirection)FrozenTrial)
TrialState)servicer)api_pb2)api_pb2_grpcz,optuna.storages._grpc.auto_generated.api_pb2z1optuna.storages._grpc.auto_generated.api_pb2_grpcgrpczoptuna.storages._grpc.servicerhoststrportintreturngrpc.Channelc                 C  s   t j|  d| dgdS )N:)zgrpc.max_receive_message_length)options)r   insecure_channelr   r    r"   P/home/ubuntu/.local/lib/python3.10/site-packages/optuna/storages/_grpc/client.pycreate_insecure_channel'   s   r$   z4.2.0c                   @  s$  e Zd ZdZddddbddZdcddZdddeddZdcddZdfddZdgddZ		dddhd d!Z
did#d$Zdjd(d)Zdjd*d+Zdkd,d-Zdld.d/Zdmd1d2Zdnd4d5Zdnd6d7Zdod9d:Zdddpd=d>ZdqdEdFZ	dddrdKdLZdsdOdPZdtdQdRZdtdSdTZdudVdWZdvdYdZZ	[	dwdxd`daZdS )yGrpcStorageProxyax  gRPC client for :func:`~optuna.storages.run_grpc_proxy_server`.

    Example:

        This is a simple example of using :class:`~optuna.storages.GrpcStorageProxy` with
        :func:`~optuna.storages.run_grpc_proxy_server`.

        .. code::

            import optuna
            from optuna.storages import GrpcStorageProxy

            storage = GrpcStorageProxy(host="localhost", port=13000)
            study = optuna.create_study(storage=storage)

        Please refer to the example in :func:`~optuna.storages.run_grpc_proxy_server` for the
        server side code.

    Args:
        host: The hostname of the gRPC server.
        port: The port of the gRPC server.

    .. warning::

        Currently, gRPC storage proxy in combination with an SQLite3 database may cause unexpected
        behaviors when calling :func:`optuna.delete_study` due to non-invalidated cache.
    	localhosti2  r!   r   r   r   r   r   Nonec                C  s   || _ || _|   d S N)_host_port_setup)selfr   r   r"   r"   r#   __init__K   s   zGrpcStorageProxy.__init__c                 C  s.   t | j| j| _t| j| _t| j| _dS )z!Set up the gRPC channel and stub.N)	r$   r)   r*   _channelr   StorageServiceStub_stubGrpcClientCache_cacher,   r"   r"   r#   r+   P   s   zGrpcStorageProxy._setupNtimeoutfloat | Nonec              
   C  sp   z%t | j| j}t|j|d W d   W dS 1 sw   Y  W dS  tjy7 } ztd|d}~ww )zWait until the gRPC server is ready.

        Args:
            timeout: The maximum time to wait in seconds. If :obj:`None`, wait indefinitely.
        )r4   NzGRPC connection timeout)r$   r)   r*   r   channel_ready_futureresultFutureTimeoutErrorConnectionError)r,   r4   channeler"   r"   r#   wait_server_readyV   s   &
z"GrpcStorageProxy.wait_server_readyc                 C  s   | j   dS )zClose the gRPC channel.N)r.   closer3   r"   r"   r#   r=   b   s   zGrpcStorageProxy.closedict[Any, Any]c                 C  s    | j  }|d= |d= |d= |S )Nr.   r0   r2   )__dict__copyr,   stater"   r"   r#   __getstate__f   s
   
zGrpcStorageProxy.__getstate__rB   c                 C  s   | j | |   d S r(   )r?   updater+   rA   r"   r"   r#   __setstate__m   s   zGrpcStorageProxy.__setstate__
directionsSequence[StudyDirection]
study_name
str | Nonec              
   C  sp   t jdd |D |pttt  d}z
| j|}W |jS  tj	y7 } z|
 tjjkr2t| d }~ww )Nc                 S  "   g | ]}|t jkrtjntjqS r"   )r   MINIMIZEr   MAXIMIZE.0dr"   r"   r#   
<listcomp>u       z5GrpcStorageProxy.create_new_study.<locals>.<listcomp>)rF   rH   )r   CreateNewStudyRequestr   r   uuiduuid4r0   CreateNewStudyr   RpcErrorcode
StatusCodeALREADY_EXISTSr   study_id)r,   rF   rH   requestresponser;   r"   r"   r#   create_new_studyq   s   z!GrpcStorageProxy.create_new_studyrZ   c              
   C  s`   t j|d}z| j| W n tjy' } z| tjjkr"t	| d }~ww | j
| d S NrZ   )r   DeleteStudyRequestr0   DeleteStudyr   rV   rW   rX   	NOT_FOUNDKeyErrorr2   delete_study_cache)r,   rZ   r[   r;   r"   r"   r#   delete_study   s   zGrpcStorageProxy.delete_studykeyvaluer   c              
   C  \   t j||t|d}z	| j| W d S  tjy- } z| tj	j
kr(t| d }~ww N)rZ   rf   rg   )r   SetStudyUserAttributeRequestjsondumpsr0   SetStudyUserAttributer   rV   rW   rX   rb   rc   r,   rZ   rf   rg   r[   r;   r"   r"   r#   set_study_user_attr      z$GrpcStorageProxy.set_study_user_attrc              
   C  rh   ri   )r   SetStudySystemAttributeRequestrk   rl   r0   SetStudySystemAttributer   rV   rW   rX   rb   rc   rn   r"   r"   r#   set_study_system_attr   rp   z&GrpcStorageProxy.set_study_system_attrc              
   C  T   t j|d}z
| j|}W |j
S  tjy) } z| tjjkr$t	| d }~ww )N)rH   )r   GetStudyIdFromNameRequestr0   GetStudyIdFromNamer   rV   rW   rX   rb   rc   rZ   )r,   rH   r[   r\   r;   r"   r"   r#   get_study_id_from_name      z'GrpcStorageProxy.get_study_id_from_namec              
   C  rt   r^   )r   GetStudyNameFromIdRequestr0   GetStudyNameFromIdr   rV   rW   rX   rb   rc   rH   r,   rZ   r[   r\   r;   r"   r"   r#   get_study_name_from_id   rx   z'GrpcStorageProxy.get_study_name_from_idlist[StudyDirection]c              
   C  s`   t j|d}z| j|}W n tjy' } z| tjjkr"t	| d }~ww dd |j
D S )Nr_   c                 S  rJ   r"   r   rK   r   rL   rM   r"   r"   r#   rP      rQ   z9GrpcStorageProxy.get_study_directions.<locals>.<listcomp>)r   GetStudyDirectionsRequestr0   GetStudyDirectionsr   rV   rW   rX   rb   rc   rF   r{   r"   r"   r#   get_study_directions   s   z%GrpcStorageProxy.get_study_directionsdict[str, Any]c              
   C  d   t j|d}z| j|}W n tjy' } z| tjjkr"t	| d }~ww dd |j
 D S )Nr_   c                 S     i | ]
\}}|t |qS r"   rk   loadsrN   rf   rg   r"   r"   r#   
<dictcomp>       z9GrpcStorageProxy.get_study_user_attrs.<locals>.<dictcomp>)r   GetStudyUserAttributesRequestr0   GetStudyUserAttributesr   rV   rW   rX   rb   rc   user_attributesitemsr{   r"   r"   r#   get_study_user_attrs      z%GrpcStorageProxy.get_study_user_attrsc              
   C  r   )Nr_   c                 S  r   r"   r   r   r"   r"   r#   r      r   z;GrpcStorageProxy.get_study_system_attrs.<locals>.<dictcomp>)r   GetStudySystemAttributesRequestr0   GetStudySystemAttributesr   rV   rW   rX   rb   rc   system_attributesr   r{   r"   r"   r#   get_study_system_attrs   r   z'GrpcStorageProxy.get_study_system_attrslist[FrozenStudy]c                 C  s$   t  }| j|}dd |jD S )Nc                 S  sP   g | ]$}t |j|jd dd |jD dd |j D dd |j D dqS )Nc                 S  rJ   r"   r~   rM   r"   r"   r#   rP      rQ   z?GrpcStorageProxy.get_all_studies.<locals>.<listcomp>.<listcomp>c                 S  r   r"   r   r   r"   r"   r#   r          z?GrpcStorageProxy.get_all_studies.<locals>.<listcomp>.<dictcomp>c                 S  r   r"   r   r   r"   r"   r#   r      r   )rZ   rH   	directionrF   
user_attrssystem_attrs)r   rZ   rH   rF   r   r   r   )rN   studyr"   r"   r#   rP      s"    z4GrpcStorageProxy.get_all_studies.<locals>.<listcomp>)r   GetAllStudiesRequestr0   GetAllStudiesstudies)r,   r[   r\   r"   r"   r#   get_all_studies   s
   z GrpcStorageProxy.get_all_studiestemplate_trialFrozenTrial | Nonec              
   C  sv   |d u rt j|dd}nt j|t|dd}z
| j|}W |jS  tjy: } z| tj	j
kr5t| d }~ww )NT)rZ   template_trial_is_noneF)rZ   r   r   )r   CreateNewTrialRequestgrpc_servicer_to_proto_trialr0   CreateNewTrialr   rV   rW   rX   rb   rc   trial_id)r,   rZ   r   r[   r\   r;   r"   r"   r#   create_new_trial   s    z!GrpcStorageProxy.create_new_trialr   
param_nameparam_value_internalfloatdistributionr	   c              
   C  s   t j|||t|d}z	| j| W d S  tjyC } z"| tjj	kr(t
|| tjjkr3t|| tjjkr>t| d }~ww )N)r   r   r   r   )r   SetTrialParameterRequestr
   r0   SetTrialParameterr   rV   rW   rX   rb   rc   FAILED_PRECONDITIONr   INVALID_ARGUMENT
ValueError)r,   r   r   r   r   r[   r;   r"   r"   r#   set_trial_param  s$   z GrpcStorageProxy.set_trial_paramr   valuesSequence[float] | Noneboolc              
   C  st   t j|t||d}z
| j|}W |jS  tjy9 } z| tj	j
kr)t|| tj	jkr4t| d }~ww )N)r   rB   r   )r   SetTrialStateValuesRequestr   _to_proto_trial_stater0   SetTrialStateValuesr   rV   rW   rX   rb   rc   r   r   trial_updated)r,   r   rB   r   r[   r\   r;   r"   r"   r#   set_trial_state_values  s    	z'GrpcStorageProxy.set_trial_state_valuesstepintermediate_valuec              
   C  sl   t j|||d}z	| j| W d S  tjy5 } z| tjjkr%t	|| tjj
kr0t| d }~ww )N)r   r   r   )r    SetTrialIntermediateValueRequestr0   SetTrialIntermediateValuer   rV   rW   rX   rb   rc   r   r   )r,   r   r   r   r[   r;   r"   r"   r#   set_trial_intermediate_value.  s   z-GrpcStorageProxy.set_trial_intermediate_valuec              
   C  r   t j||t|d}z	| j| W d S  tjy8 } z| tj	j
kr(t|| tj	jkr3t| d }~ww N)r   rf   rg   )r   SetTrialUserAttributeRequestrk   rl   r0   SetTrialUserAttributer   rV   rW   rX   rb   rc   r   r   r,   r   rf   rg   r[   r;   r"   r"   r#   set_trial_user_attr>     z$GrpcStorageProxy.set_trial_user_attrc              
   C  r   r   )r   SetTrialSystemAttributeRequestrk   rl   r0   SetTrialSystemAttributer   rV   rW   rX   rb   rc   r   r   r   r"   r"   r#   set_trial_system_attrL  r   z&GrpcStorageProxy.set_trial_system_attrtrial_numberc              
   C  sV   t j||d}z
| j|}W |j
S  tjy* } z| tjjkr%t	| d }~ww )N)rZ   r   )r   'GetTrialIdFromStudyIdTrialNumberRequestr0    GetTrialIdFromStudyIdTrialNumberr   rV   rW   rX   rb   rc   r   )r,   rZ   r   r[   r\   r;   r"   r"   r#   'get_trial_id_from_study_id_trial_numberZ  s   z8GrpcStorageProxy.get_trial_id_from_study_id_trial_numberr   c              
   C  s\   t j|d}z| j|}W n tjy' } z| tjjkr"t	| d }~ww t
|jS )N)r   )r   GetTrialRequestr0   GetTrialr   rV   rW   rX   rb   rc   r   _from_proto_trialtrial)r,   r   r[   r\   r;   r"   r"   r#   	get_trialf  s   zGrpcStorageProxy.get_trialTdeepcopystatesContainer[TrialState] | Nonelist[FrozenTrial]c                 C  s    | j ||}|rt|S |S r(   )r2   get_all_trialsr@   r   )r,   rZ   r   r   trialsr"   r"   r#   r   p  s   zGrpcStorageProxy.get_all_trials)r   r   r   r   r   r'   r   r'   r(   )r4   r5   r   r'   )r   r>   )rB   r>   r   r'   )rF   rG   rH   rI   r   r   rZ   r   r   r'   )rZ   r   rf   r   rg   r   r   r'   )rH   r   r   r   )rZ   r   r   r   )rZ   r   r   r}   )rZ   r   r   r   )r   r   )rZ   r   r   r   r   r   )
r   r   r   r   r   r   r   r	   r   r'   )r   r   rB   r   r   r   r   r   )r   r   r   r   r   r   r   r'   )r   r   rf   r   rg   r   r   r'   )rZ   r   r   r   r   r   )r   r   r   r   )TN)rZ   r   r   r   r   r   r   r   )__name__
__module____qualname____doc__r-   r+   r<   r=   rC   rE   r]   re   ro   rs   rw   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r"   r"   r"   r#   r%   -   s>    






















r%   c                   @  s>   e Zd ZdddZdd	d
ZdddZdddZdddZdS )r1   grpc_clientapi_pb2_grpc.StorageServiceStubr   r'   c                 C  s   i | _ || _t | _d S r(   )r   r   	threadingLocklock)r,   r   r"   r"   r#   r-   {  s   zGrpcClientCache.__init__rZ   r   c                 C  s:   | j  | j|d  W d    d S 1 sw   Y  d S r(   )r   r   pop)r,   rZ   r"   r"   r#   rd     s   "z"GrpcClientCache.delete_study_cacher   r   r   c                   s   | j 4 | | | j| } d ur fdd|j D }n|j}tt| dd d}|W  d    S 1 s:w   Y  d S )Nc                   s    i | ]\}}|j  v r||qS r"   )rB   )rN   numbertr   r"   r#   r     s     z2GrpcClientCache.get_all_trials.<locals>.<dictcomp>c                 S  s   | j S r(   )r   )r   r"   r"   r#   <lambda>  s    z0GrpcClientCache.get_all_trials.<locals>.<lambda>)rf   )r    _read_trials_from_remote_storager   r   r   listsortedr   )r,   rZ   r   r   r   r"   r   r#   r     s   

$zGrpcClientCache.get_all_trialsc              
   C  s   || j vrt | j |< | j | }tj||j|jd}z| j|}W n  tj	yB } z|
 tjjkr=| j |d  t| d }~ww |jsHd S |jD ]}t|}| || qKd S )N)rZ   included_trial_idstrial_id_greater_than)r   GrpcClientCacheEntryr   GetTrialsRequestunfinished_trial_idslast_finished_trial_idr   	GetTrialsr   rV   rW   rX   rb   r   rc   r   r   r   _add_trial_to_cache)r,   rZ   r   reqresr;   trial_protor   r"   r"   r#   r     s.   



z0GrpcClientCache._read_trials_from_remote_storager   r   c                 C  sT   | j | }||j|j< |j s|j|j d S t|j	|j|_	|j
|j d S r(   )r   r   r   rB   is_finishedr   add	_trial_idmaxr   discard)r,   rZ   r   r   r"   r"   r#   r     s   

z#GrpcClientCache._add_trial_to_cacheN)r   r   r   r'   r   )rZ   r   r   r   r   r   )rZ   r   r   r   r   r'   )r   r   r   r-   rd   r   r   r   r"   r"   r"   r#   r1   z  s    



r1   c                   @  s   e Zd ZdddZdS )r   r   r'   c                 C  s   i | _ t | _d| _d S )Nr   )r   setr   r   r3   r"   r"   r#   r-     s   
zGrpcClientCacheEntry.__init__Nr   )r   r   r   r-   r"   r"   r"   r#   r     s    r   )r   r   r   r   r   r   ),
__future__r   collections.abcr   r   r@   rk   r   typingr   r   rS   optuna._experimentalr   optuna._importsr   optuna.distributionsr	   r
   optuna.exceptionsr   r   optuna.storages._baser   r   optuna.study._frozenr   optuna.study._study_directionr   optuna.trial._frozenr   optuna.trial._stater   r   optuna.storages._grpcr   r   $optuna.storages._grpc.auto_generatedr   r   r$   r%   r1   r   r"   r"   r"   r#   <module>   sJ    
  N<