
    (^i                    `   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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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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rSd d	l.m/Z0 d d	l1m2Z3 d d	l4m5Z6 d d	l7m8Z9 d d	l:Z:d d	l;m<c m=Z> d d	l?m<c m@ZA d d	lBm<c mCZD d d	lEmFZG d d	lHmIZJ d d	lKmLc mMZN d dlOmPZP n` ed      Z0 ed      Z3 ed      Z6 ed      Z9 ed      Z: ed       Z> ed!      ZA ed"      ZD ed#      ZG ed$      ZJ ed%      ZN ed&      ZPej                   j                  eR      ZSe	 d-	 	 	 	 	 d.d'       ZT G d( d)e#e&      ZU G d* d+      ZVd/d,ZWy	)0    )annotations)defaultdict)Callable)	Container)	Generator)Iterable)Sequence)contextmanagerN)datetime)	timedelta)Any)TYPE_CHECKING)distributions)version)warn_experimental_argument)_LazyImport)JSONSerializable)BaseStorage)DEFAULT_STUDY_NAME_PREFIX)BaseHeartbeat)FrozenStudy)StudyDirection)FrozenTrial)
TrialState)modelszalembic.commandzalembic.configzalembic.migrationzalembic.script
sqlalchemyzsqlalchemy.dialects.mysqlzsqlalchemy.dialects.postgresqlzsqlalchemy.dialects.sqlitezsqlalchemy.exczsqlalchemy.ormzsqlalchemy.sql.functionszoptuna.storages._rdb.modelsc              #    K    |        }	 | |j                          |j                          y # t        j                  $ rK}|j                          |r.t        j                  dj                  t        |                   n Y d }~jd }~wt        j                  $ r7}|j                          d}t        j                  j                  |      |d }~wt        $ r |j                           w xY w# |j                          w xY ww)NzIgnoring {}. This happens due to a timing issue among threads/processes/nodes. Another one might have committed a record with the same key(s).zAn exception is raised during the commit. This typically happens due to invalid data in the commit, e.g. exceeding max length. )commitsqlalchemy_excIntegrityErrorrollback_loggerdebugformatreprSQLAlchemyErroroptuna
exceptionsStorageInternalError	Exceptionclose)scoped_sessionignore_integrity_errorsessionemessages        ]/var/www/html/hubwallet-dev/venv/lib/python3.12/site-packages/optuna/storages/_rdb/storage.py_create_scoped_sessionr2   H   s     
 G, 	+ (( !MMRRXRXY]^_Y`Ra
  )) E* 	
 44W=1D  	sD   D0 DC/AB	C2 	C/2CC//C2 2DDc                     e Zd ZdZ	 	 d4ddddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d5dZd6dZd7dZ	 d8	 	 	 	 	 d9dZd:d	Ze	d;d
       Z
d<dZd=dZd>dZd?dZd@dZdAdZdAdZdBdZdBdZdCdZd8dDdZ	 d8	 	 	 	 	 dEdZ	 	 	 	 	 	 	 	 dFdZ	 	 	 	 	 	 	 	 	 	 dGdZ	 	 	 	 	 	 	 	 	 	 	 	 dHdZdIdZ	 d8	 	 	 	 	 	 	 dJdZ	 	 	 	 	 	 	 	 	 	 dKdZ	 	 	 	 	 	 	 	 dLdZ	 	 	 	 	 	 	 	 	 	 dMdZdNdZdOd Z 	 	 	 	 	 	 	 	 	 	 	 	 dPd!Z!dQd"Z"dRd#Z#	 	 dS	 	 	 	 	 	 	 dTd$Z$	 	 	 	 	 	 	 	 	 	 dUd%Z%dVd&Z&dWd'Z'dXd(Z(e	dYd)       Z)e	dZd*       Z*d[d+Z+d[d,Z,d\d-Z-d\d.Z.d]d/Z/d^d0Z0d_d1Z1d`d2Z2	 	 dad3Z3y)b
RDBStoragea\  Storage class for RDB backend.

    Note that library users can instantiate this class, but the attributes
    provided by this class are not supposed to be directly accessed by them.

    Example:

        Create an :class:`~optuna.storages.RDBStorage` instance with customized
        ``pool_size`` and ``timeout`` settings.

        .. testcode::

            import optuna


            def objective(trial):
                x = trial.suggest_float("x", -100, 100)
                return x**2


            storage = optuna.storages.RDBStorage(
                url="sqlite:///:memory:",
                engine_kwargs={"pool_size": 20, "connect_args": {"timeout": 10}},
            )

            study = optuna.create_study(storage=storage)
            study.optimize(objective, n_trials=10)

    Args:
        url:
            URL of the storage.
        engine_kwargs:
            A dictionary of keyword arguments that is passed to
            `sqlalchemy.engine.create_engine`_ function.
        skip_compatibility_check:
            Flag to skip schema compatibility check if set to :obj:`True`.
        heartbeat_interval:
            Interval to record the heartbeat. It is recorded every ``interval`` seconds.
            ``heartbeat_interval`` must be :obj:`None` or a positive integer.

            .. note::
                Heartbeat mechanism is experimental. API would change in the future.

            .. note::
                The heartbeat is supposed to be used with :meth:`~optuna.study.Study.optimize`.
                If you use :meth:`~optuna.study.Study.ask` and
                :meth:`~optuna.study.Study.tell` instead, it will not work.

        grace_period:
            Grace period before a running trial is failed from the last heartbeat.
            ``grace_period`` must be :obj:`None` or a positive integer.
            If it is :obj:`None`, the grace period will be `2 * heartbeat_interval`.
        failed_trial_callback:
            A callback function that is invoked after failing each stale trial.
            The function must accept two parameters with the following types in this order:
            :class:`~optuna.study.Study` and :class:`~optuna.trial.FrozenTrial`.

            .. note::
                The procedure to fail existing stale trials is called just before asking the
                study for a new trial.

        skip_table_creation:
            Flag to skip table creation if set to :obj:`True`.

    .. _sqlalchemy.engine.create_engine:
        https://docs.sqlalchemy.org/en/latest/core/engines.html#sqlalchemy.create_engine

    .. note::
        If you use MySQL, `pool_pre_ping`_ will be set to :obj:`True` by default to prevent
        connection timeout. You can turn it off with ``engine_kwargs['pool_pre_ping']=False``, but
        it is recommended to keep the setting if execution time of your objective function is
        longer than the `wait_timeout` of your MySQL configuration.

    .. _pool_pre_ping:
        https://docs.sqlalchemy.org/en/13/core/engines.html#sqlalchemy.create_engine.params.
        pool_pre_ping

    .. note::
        We would never recommend SQLite3 for parallel optimization.
        Please see the FAQ :ref:`sqlite_concurrency` for details.

    .. note::
        Mainly in a cluster environment, running trials are often killed unexpectedly.
        If you want to detect a failure of trials, please use the heartbeat
        mechanism. Set ``heartbeat_interval``, ``grace_period``, and ``failed_trial_callback``
        appropriately according to your use case. For more details, please refer to the
        :ref:`tutorial <heartbeat_monitoring>` and `Example page
        <https://github.com/optuna/optuna-examples/blob/main/pytorch/pytorch_checkpoint.py>`__.

    .. seealso::
        You can use :class:`~optuna.storages.RetryFailedTrialCallback` to automatically retry
        failed trials detected by heartbeat.

    NF)heartbeat_intervalgrace_periodfailed_trial_callbackskip_table_creationc               6   |xs i | _         | j                  |      | _        || _        ||dk  rt	        d      t        d       ||dk  rt	        d      || _        || _        || _        | j                  || j                          	 t        j                  j                  | j                  fi | j                   | _        t        j                  t        j                   | j                              | _        |s3t"        j$                  j&                  j)                  | j                         t+        | j                  | j                  | j                        | _        |s| j,                  j/                          y y # t        $ r}t        d      |d }~ww xY w)Nr   z?The value of `heartbeat_interval` should be a positive integer.r5   z9The value of `grace_period` should be a positive integer.`Failed to import DB access module for the specified storage URL. Please install appropriate one.bind)engine_kwargs_fill_storage_url_templateurlskip_compatibility_check
ValueErrorr   r5   r6   r7   $_set_default_engine_kwargs_for_mysqlr   enginecreate_engineImportErrorsqlalchemy_ormr,   sessionmakerr   	BaseModelmetadata
create_all_VersionManager_version_manager check_table_schema_compatibility)	selfr?   r=   r@   r5   r6   r7   r8   r/   s	            r1   __init__zRDBStorage.__init__   sm    +0b2237(@%)!Q& !bcc*+?@#(9XYY"4(%:"11#t7I7IJ	$++99$((YdFXFXYDK -;;''T[[9
 #%%00= /$++tGZGZ ['!!BBD (  	2 	s   
9E> >	FFFc                L    | j                   j                         }|d= |d= |d= |S )Nr,   rC   rL   )__dict__copy)rN   states     r1   __getstate__zRDBStorage.__getstate__   s2    ""$"#(O$%    c                l   | j                   j                  |       	 t        j                  j                  | j
                  fi | j                  | _        t        j                  t        j                  | j                              | _	        t        j                  j                  j                  | j                         t        | j
                  | j                  | j                        | _        | j"                  s| j                   j%                          y y # t        $ r}t        d      |d }~ww xY w)Nr:   r;   )rQ   updater   rC   rD   r?   r=   rE   rF   r,   rG   r   rH   rI   rJ   rK   rL   r@   rM   )rN   rS   r/   s      r1   __setstate__zRDBStorage.__setstate__   s    U#	$++99$((YdFXFXYDK -;;''T[[9
 	!!,,T[[9 /$++tGZGZ [,,!!BBD -  	2 	s   9D 	D3"D..D3c           	     @   	 t        | j                        5 }|| j                  |      }t        t	        |            D cg c]  \  }}t        j                  ||       }}}|j                  t        j                  ||             d d d        t        j!                  dj                  |             | j#                  |      S c c}}w # 1 sw Y   DxY w# t        j                  $ r/ t        j                  j                  dj                  |            w xY w)N)	objective	direction)
study_name
directionszAnother study with name '{}' already exists. Please specify a different name, or reuse the existing one by setting `load_if_exists` (for Python API) or `--skip-if-exists` flag (for CLI).z(A new study created in RDB with name: {})r2   r,   _create_unique_study_name	enumeratelistr   StudyDirectionModeladd
StudyModelr   r    r'   r(   DuplicatedStudyErrorr$   r"   infoget_study_id_from_name)rN   r]   r\   r.   rZ   ddirection_modelss          r1   create_new_studyzRDBStorage.create_new_study  s   	'(;(;< 	c%!%!?!?!HJ )2$z2B(C$$	1 ..aP$  $
 F--P`ab	c& 	?FFzRS**:66#$		c 	c ,, 	##885 6<VJ5G	 	s5   C +C!C	#)CC 	CCC ADc                    t        | j                  d      5 }t        j                  j	                  ||      }|j                  |       d d d        y # 1 sw Y   y xY wNT)r2   r,   r   rc   find_or_raise_by_iddelete)rN   study_idr.   studys       r1   delete_studyzRDBStorage.delete_study*  sM    #D$7$7> 	"'%%99(GLENN5!	" 	" 	"s   2AAc                    	 t        t        j                               }t        |z   }t        j
                  j                  ||       }|	 |S LN)struuiduuid4r   r   rc   find_by_name)r.   
study_uuidr\   ro   s       r1   r^   z$RDBStorage._create_unique_study_name/  sJ    TZZ\*J2Z?J%%22:wGE} rU   c                   t        | j                  d      5 }t        j                  j	                  ||      }t        j
                  j                  |||      }|=t        j
                  ||t        j                  |            }|j                  |       nt        j                  |      |_
        d d d        y # 1 sw Y   y xY wNT)rn   key
value_json)r2   r,   r   rc   rl   StudyUserAttributeModelfind_by_study_and_keyjsondumpsrb   r{   rN   rn   rz   valuer.   ro   	attributes          r1   set_study_user_attrzRDBStorage.set_study_user_attr:  s    #D$7$7> 		9'%%99(GLE66LLUTWY`aI "::%34::e;L	 I&'+zz%'8	$		9 		9 		9   BB;;Cc                   t        | j                  d      5 }t        j                  j	                  ||      }t        j
                  j                  |||      }|=t        j
                  ||t        j                  |            }|j                  |       nt        j                  |      |_
        d d d        y # 1 sw Y   y xY wry   )r2   r,   r   rc   rl   StudySystemAttributeModelr}   r~   r   rb   r{   r   s          r1   set_study_system_attrz RDBStorage.set_study_system_attrF  s    #D$7$7> 		9'%%99(GLE88NNuVY[bcI "<<%34::e;L	 I&'+zz%'8	$		9 		9 		9r   c                    t        | j                        5 }t        j                  j	                  ||      }|j
                  }d d d        |S # 1 sw Y   S xY wrr   )r2   r,   r   rc   find_or_raise_by_namern   )rN   r\   r.   ro   rn   s        r1   rf   z!RDBStorage.get_study_id_from_nameR  sQ    #D$7$78 	&G%%;;JPE~~H	& 		&    -AAc                    t        | j                        5 }t        j                  j	                  ||      }|j
                  }d d d        |S # 1 sw Y   S xY wrr   )r2   r,   r   rc   rl   r\   )rN   rn   r.   ro   r\   s        r1   get_study_name_from_idz!RDBStorage.get_study_name_from_idY  sU    #D$7$78 	*G%%99(GLE))J	* 		* r   c                    t        | j                        5 }t        j                  j	                  ||      }|j
                  D cg c]  }|j                   }}d d d        |S c c}w # 1 sw Y   S xY wrr   )r2   r,   r   rc   rl   r]   r[   )rN   rn   r.   ro   rg   r]   s         r1   get_study_directionszRDBStorage.get_study_directions`  sp    #D$7$78 	AG%%99(GLE/4/?/?@!!++@J@	A  A	A s   /A)A$A)$A))A3c                T   t        | j                        5 }t        j                  j	                  ||       t        j
                  j                  ||      }|D ci c],  }|j                  t        j                  |j                        . }}d d d        |S c c}w # 1 sw Y   S xY wrr   )r2   r,   r   rc   rl   r|   where_study_idrz   r~   loadsr{   )rN   rn   r.   
attributesattr
user_attrss         r1   get_study_user_attrszRDBStorage.get_study_user_attrsg  s    #D$7$78 	XG11(GD77FFxQXYJLVWD$((DJJt$??WJW		X  X		X    AB1BBBB'c                T   t        | j                        5 }t        j                  j	                  ||       t        j
                  j                  ||      }|D ci c],  }|j                  t        j                  |j                        . }}d d d        |S c c}w # 1 sw Y   S xY wrr   )r2   r,   r   rc   rl   r   r   rz   r~   r   r{   )rN   rn   r.   r   r   system_attrss         r1   get_study_system_attrsz!RDBStorage.get_study_system_attrsp  s    #D$7$78 	ZG11(GD99HHSZ[JNXYdDHHdjj&AAYLY		Z  Z		Z r   c                T   t        | j                        5 }t        j                  j	                  ||       t        j
                  j                  ||      }|D ci c],  }|j                  t        j                  |j                        . }}d d d        |S c c}w # 1 sw Y   S xY wrr   )r2   r,   r   
TrialModelrl   TrialUserAttributeModelwhere_trial_idrz   r~   r   r{   )rN   trial_idr.   r   r   r   s         r1   get_trial_user_attrszRDBStorage.get_trial_user_attrsy  s    #D$7$78 	XG11(GD77FFxQXYJLVWD$((DJJt$??WJW	X  X	X r   c                T   t        | j                        5 }t        j                  j	                  ||       t        j
                  j                  ||      }|D ci c],  }|j                  t        j                  |j                        . }}d d d        |S c c}w # 1 sw Y   S xY wrr   )r2   r,   r   r   rl   TrialSystemAttributeModelr   rz   r~   r   r{   )rN   r   r.   r   r   r   s         r1   get_trial_system_attrsz!RDBStorage.get_trial_system_attrs  s    #D$7$78 	ZG11(GD99HHSZ[JNXYdDHHdjj&AAYLY	Z  Z	Z r   c                   t        | j                        5 }|j                  t        j                  j
                  t        j                  j                        j                  t        j                  j
                        j                         }t        t              }|j                  t        j                        j                         D ]*  }||j
                     j                  |j                         , t        t              }|j                  t        j                        j                         D ]   }||j
                     j                  |       " t        t              }|j                  t        j                        j                         D ]   }||j
                     j                  |       " g }|D ]  }	||	j
                     }
|j!                  |	j
                  g       }|j!                  |	j
                  g       }|j                  t#        |	j                  d |
|D ci c],  }|j$                  t'        j(                  |j*                        . c}|D ci c],  }|j$                  t'        j(                  |j*                        . c}|	j
                                |cd d d        S c c}w c c}w # 1 sw Y   y xY w)N)r\   r[   r]   r   r   rn   )r2   r,   queryr   rc   rn   r\   order_byallr   r`   ra   appendr[   r|   r   getr   rz   r~   r   r{   )rN   r.   studies_directionsdirection_model_user_attrsattribute_model_system_attrsfrozen_studiesro   r]   r   r   is                 r1   get_all_studieszRDBStorage.get_all_studies  s=   #D$7$78 &	"G%%..%%00 &++445  &d+K#*==1K1K#L#P#P#R XO445<<_=V=VWX &d+K#*==1O1O#P#T#T#V NO445<<_MN (-M#*==1Q1Q#R#V#V#X Po667>>OP  N  (8
(__U^^R@
,00D%%#(#3#3"&#-MW#XAEE4::all+C$C#XO[%\!aeeTZZ-E&E%\!&		 "M&	" &	"@ $Y%\C&	" &	"s*   HJ:$1J0J:1J5J:0
J::Kc                :    | j                  ||      j                  S rr   )_create_new_trial	_trial_id)rN   rn   template_trials      r1   create_new_trialzRDBStorage.create_new_trial  s    %%h?IIIrU   c                   	 	 	 	 	 	 d	d}d}t        d|dz         D ]a  }	 t        | j                        5 }t        j                  j                  ||d       | j                  |||      } |||      cddd       c S  J d       # 1 sw Y   nxY wx# t        j                  j                  $ r;}||k(  r|t        j                  t        j                         dz         Y d}~d}~ww xY w)
aU  Create a new trial and returns a :class:`~optuna.trial.FrozenTrial`.

        Args:
            study_id:
                Study id.
            template_trial:
                A :class:`~optuna.trial.FrozenTrial` with default values for trial attributes.

        Returns:
            A :class:`~optuna.trial.FrozenTrial` instance.

        c                   |rJt        j                  |      }| j                  |_        | j                  |_        | j                  |_        |S t        | j                  | j                  d d | j                  d i i i i i | j                        S )NnumberrS   r   valuesdatetime_startdatetime_completeparamsr   r   r   intermediate_valuesr   )rR   deepcopyr   r   r   r   r   rS   )trialr   frozens      r1   _create_frozen_trialz:RDBStorage._create_new_trial.<locals>._create_frozen_trial  s     ~6 %(-(<(<%#(>> ||kk$33"& $& rU         T
for_updateNg       @zShould not be reached.)r   'models.TrialModel'r   FrozenTrial | Nonereturnr   )ranger2   r,   r   rc   rl   _get_prepared_new_trialr'   r(   r)   timesleeprandom)	rN   rn   r   r   MAX_RETRIES	n_retriesr.   r   r/   s	            r1   r   zRDBStorage._create_new_trial  s    	&	8J		2 q+/2 	2I2+D,?,?@ GG %%99(GX\9] 88>SZ[E/~FG G	2( 	/..u%G G G $$99 	2 +G 

6==?S011	2s.   B>B3	BB	BC,11C''C,c                0   |:t        j                  |d t        j                  t	        j
                               }n>t        j                  }t        j                  |d ||j                  |j                        }|j                  |       |j                          ||j                  Jt        |j                        dkD  r2t        |j                        D ]  \  }}| j                  ||||        n*|j                  | j                  ||d|j                         |j                  j!                         D ]D  \  }}	|j"                  |   }
|
j%                  |	      }| j'                  ||j(                  |||
       F |j*                  j!                         D ]2  \  }}| j-                  |t         j.                  |j(                  ||       4 |j0                  j!                         D ]2  \  }}| j-                  |t         j2                  |j(                  ||       4 |j4                  j!                         D ]#  \  }}| j7                  ||j(                  ||       % |j8                  |_        |j;                  |      |_        |j                  |       |S )N)rn   r   rS   r   )rn   r   rS   r   r   r   r   )r   r   r   RUNNINGr   nowr   r   rb   flushr   lenr_   _set_trial_value_without_commitr   r   itemsr   to_internal_repr_set_trial_param_without_commitr   r   _set_trial_attr_without_commitr   r   r   r   ,_set_trial_intermediate_value_without_commitrS   count_past_trialsr   )rN   rn   r   r.   r   
temp_staterZ   r   
param_nameparam_valuedistributionparam_value_in_internal_reprrz   stepintermediate_values                  r1   r   z"RDBStorage._get_prepared_new_trial  sk    !%%! (('||~	E $++J%%! -<<"0"B"BE 	E 	%$$0S9N9N5ORS5S(1.2G2G(H [$Iu88%TYZ[%%144WeQH\H\]+9+@+@+F+F+H '
K-;;JG/;/L/L[/Y,44U^^Z9UWc -77==? 
U33V;;U^^SRW
 -99??A 
U33V==u~~sTY
 -;,N,N,T,T,V ((AAU^^T3E
 )..EK..w7ErU   c                    t        | j                  d      5 }| j                  |||||       d d d        y # 1 sw Y   y xY wrk   )r2   r,   r   )rN   r   r   param_value_internalr   r.   s         r1   set_trial_paramzRDBStorage.set_trial_paramB  sE     $D$7$7> 	'00:/C\	 	 	s   6?c                   t         j                  j                  ||      }| j                  ||j                         t        j
                  |||t        j                  |            }|j                  ||j                         y )N)r   r   r   distribution_json)
r   r   rl   check_trial_is_updatablerS   TrialParamModelr   distribution_to_jsoncheck_and_addrn   )rN   r.   r   r   r   r   r   trial_params           r1   r   z*RDBStorage._set_trial_param_without_commitN  sm     !!55hH%%h<,,!,+@@N	
 	!!'5>>:rU   c                    t        | j                        5 }t        j                  j	                  ||      }t        j
                  j                  |||      }|j                  }d d d        |S # 1 sw Y   S xY wrr   )r2   r,   r   r   rl   r   %find_or_raise_by_trial_and_param_namer   )rN   r   r   r.   r   r   r   s          r1   get_trial_paramzRDBStorage.get_trial_paramb  st    #D$7$78 	2G%%99(GLE 00VVz7K &11K	2 	2 s   AA..A8c                   	 t        | j                        5 }t        j                  j	                  ||d      }| j                  ||j                         |'t        |      D ]  \  }}| j                  ||||        |t        j                  k(  r'|j                  t        j                  k7  r
	 d d d        y||_        |t        j                  k(  rt        j                         |_        |j                         rt        j                         |_        d d d        y# 1 sw Y   yxY w# t"        j$                  $ r Y yw xY w)NTr   F)r2   r,   r   r   rl   r   rS   r_   r   r   r   WAITINGr   r   r   is_finishedr   r   r    )rN   r   rS   r   r.   r   rZ   vs           r1   set_trial_state_valuesz!RDBStorage.set_trial_state_valuesl  s   	'(;(;< =))==h\`=a--hD%(1&(9 [	1<<WeYXYZ[ J...5;;*BTBT3T = = $J...+3<<>E($$&.6llnE+#=( )=(  ,, 		s<   D* BD0D* 9ADD* D'#D* 'D* *E ?E c                `   | j                  |j                  |j                         t        j                  j                  |      \  }}t        j                  j                  |||      }|5t        j                  |j                  |||      }|j                  |       y ||_        ||_	        y )N)r   rZ   r   
value_type)
r   r   rS   r   TrialValueModelvalue_to_stored_reprfind_by_trial_and_objectiverb   r   r   )rN   r.   r   rZ   r   stored_valuer   trial_values           r1   r   z*RDBStorage._set_trial_value_without_commit  s     	%%ennekkB#)#9#9#N#Nu#U j,,HHPY[bc 00#"%	K KK$ ,K%/K"rU   c                    t        | j                  d      5 }| j                  ||||       d d d        y # 1 sw Y   y xY wrk   )r2   r,   r   )rN   r   r   r   r.   s        r1   set_trial_intermediate_valuez'RDBStorage.set_trial_intermediate_value  sC     $D$7$7> 	'==4);	 	 	s   5>c                x   t         j                  j                  ||      }| j                  ||j                         t         j
                  j                  |      \  }}t         j
                  j                  |||      }|+t        j
                  ||||      }|j                  |       y ||_	        ||_
        y )N)r   r   r   intermediate_value_type)r   r   rl   r   rS   TrialIntermediateValueModel!intermediate_value_to_stored_reprfind_by_trial_and_steprb   r   r  )	rN   r.   r   r   r   r   r   r   trial_intermediate_values	            r1   r   z7RDBStorage._set_trial_intermediate_value_without_commit  s     !!55hH%%h<
 ..PP
	
 $*#E#E#\#\4$
  $+'-'I'I!#/(2	($ KK01:F$7?I$<rU   c                    t        | j                  d      5 }| j                  |t        j                  |||       d d d        y # 1 sw Y   y xY wrk   )r2   r,   r   r   r   rN   r   rz   r   r.   s        r1   set_trial_user_attrzRDBStorage.set_trial_user_attr  sL    #D$7$7> 	'//..	 	 	   $AAc                    t        | j                  d      5 }| j                  |t        j                  |||       d d d        y # 1 sw Y   y xY wrk   )r2   r,   r   r   r   r  s        r1   set_trial_system_attrz RDBStorage.set_trial_system_attr  sL    #D$7$7> 	'//00	 	 	r	  c                &   t         j                  j                  ||      }| j                  ||j                         | j
                  j                  dk(  rrt        j                  |      j                  ||t        j                  |            }|j                  |j                  j                        }|j                  |       y | j
                  j                  dk(  rt         j"                  dk\  rt%        j                  |      j                  ||t        j                  |            }	|	j'                  |j(                  |j*                  gt-        |	j.                  j                              }
|j                  |
       y | j
                  j                  dk(  rt1        j                  |      j                  ||t        j                  |            }|j'                  |j(                  |j*                  gt-        |j.                  j                              }|j                  |       y |j3                  |||      }|0 |||t        j                  |            }|j5                  |       y t        j                  |      |_        y )Nmysql)r   rz   r{   )r{   sqlite)      r   )index_elementsset_
postgresql)r   r   rl   r   rS   rC   namesqlalchemy_dialects_mysqlinsertr   r~   r   on_duplicate_key_updateinsertedr{   executesqlite3sqlite_version_infosqlalchemy_dialects_sqliteon_conflict_do_updater   rz   dictexcludedsqlalchemy_dialects_postgresqlfind_by_trial_and_keyrb   )rN   r.   	model_clsr   rz   r   r   mysql_insert_stmtmysql_upsert_stmtsqlite_insert_stmtsqlite_upsert_stmtpg_insert_stmtpg_upsert_stmtr   s                 r1   r   z)RDBStorage._set_trial_attr_without_commit  s+    !!55hH%%h<;;w& 9 @ @ K R R!stzz%7H !S ! !2 I I,55@@ !J ! OO-.[[)g.I.IZ.W!;!B!B9!M!T!T!stzz%7H "U " "4!I!I ) 2 2IMMB%7%@%@%K%KL "J " OO./[[-;BB9MTT!stzz%7H U N ,AA ) 2 2IMMB^%<%<%G%GH B N OON+ "77sGLI %xSTZZX]M^_	I&'+zz%'8	$rU   c                   t        | j                        5 }|j                  t        j                  j
                        j                  t        j                  j                  |k(  t        j                  j                  |k(        j                         }|t        dj                  ||            |d   cd d d        S # 1 sw Y   y xY w)Nz?No trial with trial number {} exists in study with study_id {}.r   )r2   r,   r   r   r   r   filterr   rn   one_or_noneKeyErrorr$   )rN   rn   trial_numberr.   r   s        r1   'get_trial_id_from_study_id_trial_numberz2RDBStorage.get_trial_id_from_study_id_trial_number  s    #D$7$78 	Gf//889%%,,<%%..(:   U\\$h 
 A;	 	 	s   BB??Cc                    t        | j                        5 }t        j                  j	                  ||      }| j                  |      }d d d        |S # 1 sw Y   S xY wrr   )r2   r,   r   r   rl   $_build_frozen_trial_from_trial_model)rN   r   r.   trial_modelfrozen_trials        r1   	get_trialzRDBStorage.get_trial  s]    #D$7$78 	RG ++??'RKDD[QL	R 		R s   2AAc                l    | j                  ||t               d      }|rt        j                  |      S |S )N)_get_trialssetrR   r   )rN   rn   r   statestrialss        r1   get_all_trialszRDBStorage.get_all_trials  s2     !!(FCE2>(0t}}V$<f<rU   c           	        t        fd|D              }t        | j                        5 }t        j                  j                  ||       |j                  t        j                        j                  t        j                  t        j                  j                              j                  t        j                  t        j                  j                              j                  t        j                  t        j                  j                              j                  t        j                  t        j                  j                              j                  t        j                  t        j                  j                              j!                  t        j                  j"                  |k(        }|Jt%        |t&              sJ |j!                  t        j                  j(                  j+                  |            }	 t-        |      dkD  rmdkD  rh|j!                  t/        j0                  t        j                  j2                  j+                  |      t        j                  j2                  kD              }n4dkD  r-|j!                  t        j                  j2                  kD        }n|}|j5                  t        j                  j2                        j7                         }|D cg c]  }| jE                  |       }}d d d        |S # t8        j:                  $ r}	t<        j?                  djA                  tC        |	                   |j5                  t        j                  j2                        j7                         }|D 
cg c]!  }
|
j2                  |v s|
j2                  kD  r|
# nc c}
w }}
Y d }	~	d }	~	ww xY wc c}w # 1 sw Y   S xY w)Nc              3  .   K   | ]  }|k  s	|  y wrr    ).0r   trial_id_greater_thans     r1   	<genexpr>z)RDBStorage._get_trials.<locals>.<genexpr>0  s      !
!8G\;\H!
s   
r   r5  zKCaught an error from sqlalchemy: {}. Falling back to a slower alternative. )#r7  r2   r,   r   rc   rl   r   r   optionsrF   selectinloadr   r   user_attributessystem_attributesr   r*  rn   
isinstancer   rS   in_r   r   or_r   r   r   r   OperationalErrorr"   warningr$   rs   r0  )rN   rn   r8  included_trial_idsr?  r.   r   _querytrial_modelsr/   tr   r9  s       `        r1   r6  zRDBStorage._get_trials)  s    ! !
%7!
 
 $D$7$78 4	bG11(GDf//044V5F5F5M5MNO44V5F5F5M5MNO44V5F5F5V5VWX44V5F5F5X5XYZ44V5F5F5Z5Z[\%%..(:  ! "&(333V%6%6%<%<%@%@%HI)*Q.3H23M"\\""--66::;MN"--669NNF +R/"\\&*;*;*D*DG\*\]F"F%v/@/@/I/IJNNP& Uaa5d??FaFai4	bl ) "22  vc!f~
  %~~f.?.?.H.HIMMO * zz%771::H];]      $ bi4	bl sP   GOC&L*O.OOO%A(O &N43O ;O OOOc                   |j                   rl|j                   D cg c]  }d }}|j                   D ]C  }t        j                  j                  |j                  |j
                        ||j                  <   E nd }t        |j                  d       }t        |j                  |j                  d ||j                  |j                  |D ci c]E  }|j                  t        j                   |j"                        j%                  |j&                        G c}|D ci c],  }|j                  t        j                   |j"                        . c}|j(                  D ci c],  }|j*                  t-        j.                  |j0                        . c}|j2                  D ci c],  }|j*                  t-        j.                  |j0                        . c}|j4                  D ci c]A  }|j6                  t        j8                  j;                  |j<                  |j>                        C c}|j@                        S c c}w c c}w c c}w c c}w c c}w c c}w )Nr   c                    | j                   S rr   )param_id)ps    r1   <lambda>zARDBStorage._build_frozen_trial_from_trial_model.<locals>.<lambda>w  s
    AJJ rU   )rz   r   )!r   r   r   stored_repr_to_valuer   r   rZ   sortedr   r   r   rS   r   r   r   r   json_to_distributionr   to_external_reprr   rC  rz   r~   r   r{   rD  r   r   r  !stored_repr_to_intermediate_valuer   r  r   )	rN   r   _r   value_modelr   rQ  r   r   s	            r1   r0  z/RDBStorage._build_frozen_trial_from_trial_modell  s   <<!&.Aa.F.$|| 060F0F0[0[%%{'='=1{,,-
 F*>?<<++ //#55
  	  m@@''""1==12   m@@ATATUU KPJ_J_`$$**T__"==`BGBYBY:>$**T__55 22	!  ::\\((!*C*C ! ^^7
 	
 /" a!s%   	H6
A
H;1I 1I1I
AIc                    | j                  |      }t        |      dkD  rt        d      |d   }| j                  ||      }| j	                  |      S )Nr   zBBest trial can be obtained only for single-objective optimization.r   )r   r   RuntimeError_get_best_trial_idr3  )rN   rn   r   r[   r   s        r1   get_best_trialzRDBStorage.get_best_trial  s[    //9{aT   N	**8Y?~~h''rU   c                   t        | j                        5 }|t        j                  k(  r*t        j
                  j                  |d|      cd d d        S t        j
                  j                  |d|      cd d d        S # 1 sw Y   y xY w)Nr   )r2   r,   r   MAXIMIZEr   r   find_max_value_trial_idfind_min_value_trial_id)rN   rn   r[   r.   s       r1   r\  zRDBStorage._get_best_trial_id  sw    #D$7$78 	WGN333((@@1gV	W 	W ((@@1gV		W 	W 	Ws   4A> A>>Bc                f    | j                  d      sy d|v ry d|d<   t        j                  d       y )Nr  pool_pre_pingTzJpool_pre_ping=True was set to engine_kwargs to prevent connection timeout.)
startswithr"   r#   )r?   r=   s     r1   rB   z/RDBStorage._set_default_engine_kwargs_for_mysql  s9     ~~g& m+ *.o&bcrU   c                B    | j                  t        j                        S )N)SCHEMA_VERSION)r$   r   rf  )templates    r1   r>   z%RDBStorage._fill_storage_url_template  s    f.C.CDDrU   c                8    | j                   j                          y)a  Removes the current session.

        A session is stored in SQLAlchemy's ThreadLocalRegistry for each thread. This method
        closes and removes the session which is associated to the current thread. Particularly,
        under multi-thread use cases, it is important to call this method *from each thread*.
        Otherwise, all sessions and their associated DB connections are destructed by a thread
        that occasionally invoked the garbage collector. By default, it is not allowed to touch
        a SQLite connection from threads other than the thread that created the connection.
        Therefore, we need to explicitly close the connection from each thread.

        N)r,   removerN   s    r1   remove_sessionzRDBStorage.remove_session  s     	""$rU   c                8    | j                   j                          y)zUpgrade the storage schema.N)rL   upgraderj  s    r1   rm  zRDBStorage.upgrade  s     	%%'rU   c                6    | j                   j                         S )z9Return the schema version currently used by this storage.)rL   get_current_versionrj  s    r1   ro  zRDBStorage.get_current_version  s     $$88::rU   c                6    | j                   j                         S )z!Return the latest schema version.)rL   get_head_versionrj  s    r1   rq  zRDBStorage.get_head_version       $$5577rU   c                6    | j                   j                         S )zReturn the schema version list.)rL   get_all_versionsrj  s    r1   rt  zRDBStorage.get_all_versions  rr  rU   c                   t        | j                  d      5 }t        j                  j	                  ||      }|(t        j                  |      }|j                  |       net        j                  j	                  ||d      }|J |j                  t        j                  j                               j                         |_        d d d        y # 1 sw Y   y xY w)NT)r   )r2   r,   r   TrialHeartbeatModelr   rb   r  r   funcr   scalar	heartbeat)rN   r   r.   ry  s       r1   record_heartbeatzRDBStorage.record_heartbeat  s    #D$7$7> 
	V'22AA(GTI "66I	I& #66EEhPWY]^	 ,,,&-oojoo6I6I6K&L&S&S&U	#
	V 
	V 
	Vs   B0CCc                   | j                   J | j                  d| j                   z  }n| j                  }g }t        | j                  d      5 }|j	                  t
        j                  j                               j                         }|J |j                  d       }|j                  t        j                        j                  t        j                  t        j                  j                               j#                  t        j                  j$                  t&        j(                  k(        j#                  t        j                  j*                  |k(        j-                         }|D ]|  }t/        |j                         dk(  rt/        |j                         dk(  sJ |j                   d   j0                  }||z
  t3        |      kD  sb|j5                  |j6                         ~ 	 d d d        |S # 1 sw Y   |S xY w)N   T)tzinfor   r   )seconds)r5   r6   r2   r,   r  r   rw  r   rx  replacer   r   r   rA  rF   rB  
heartbeatsr*  rS   r   r   rn   r   r   ry  r   r   r   )	rN   rn   r6   stale_trial_idsr.   current_heartbeatrunning_trialsr   ry  s	            r1   _get_stale_trial_idszRDBStorage._get_stale_trial_ids  s   &&222$t666L,,L#D$7$7> 	;' '
0C0C0E F M M O$000 !2 9 9 9 F f//044V5F5F5Q5QRS))//:3E3EEF))22h>?  ( ;u''(A-5++,111!,,Q/99	$y09\3RR#**5>>:;	;. /	;. s   E>G6G66H c                    | j                   S rr   )r5   rj  s    r1   get_heartbeat_intervalz!RDBStorage.get_heartbeat_interval  s    &&&rU   c                    | j                   S rr   )r7   rj  s    r1   get_failed_trial_callbackz$RDBStorage.get_failed_trial_callback  s     )))rU   )NF)r?   rs   r=   zdict[str, Any] | Noner@   boolr5   
int | Noner6   r  r7   :Callable[['optuna.study.Study', FrozenTrial], None] | Noner8   r  r   None)r   dict[Any, Any])rS   r  r   r  rr   )r]   zSequence[StudyDirection]r\   z
str | Noner   int)rn   r  r   r  )r.   'sqlalchemy_orm.Session'r   rs   )rn   r  rz   rs   r   r   r   r  )rn   r  rz   rs   r   r   r   r  )r\   rs   r   r  )rn   r  r   rs   )rn   r  r   zlist[StudyDirection])rn   r  r   dict[str, Any])r   r  r   r  )r   zlist[FrozenStudy])rn   r  r   r   r   r  )rn   r  r   r   r   r   )rn   r  r   r   r.   r  r   r   )
r   r  r   rs   r   floatr   distributions.BaseDistributionr   r  )r.   r  r   r  r   rs   r   r  r   r  r   r  )r   r  r   rs   r   r  )r   r  rS   r   r   zSequence[float] | Noner   r  )
r.   r  r   zmodels.TrialModelrZ   r  r   r  r   r  )r   r  r   r  r   r  r   r  )
r.   r  r   r  r   r  r   r  r   r  )r   r  rz   rs   r   r   r   r  )r   r  rz   rs   r   r   r   r  )r.   r  r"  zGtype[models.TrialUserAttributeModel | models.TrialSystemAttributeModel]r   r  rz   rs   r   r   r   r  )rn   r  r-  r  r   r  )r   r  r   r   )TN)rn   r  r   r  r8  Container[TrialState] | Noner   list[FrozenTrial])
rn   r  r8  r  rJ  zset[int]r?  r  r   r  )r   r   r   r   )rn   r  r   r   )rn   r  r[   r   r   r  )r?   rs   r=   r  r   r  )rg  rs   r   rs   r   r  r   rs   r   z	list[str])r   r  r   r  )rn   r  r   z	list[int])r   r  )r   r  )4__name__
__module____qualname____doc__rO   rT   rX   ri   rp   staticmethodr^   r   r   rf   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r   r.  r3  r:  r6  r0  r]  r\  rB   r>   rk  rm  ro  rq  rt  rz  r  r  r  r=  rU   r1   r4   r4   i   s   ]D 04).	+E *.#'\`$)+E+E -+E #'	+E '+E !+E  Z+E "+E 
+EZE& NR727@J7	76"
  
9
9'"RJ CG>/>/-?>/	>/@GG +G *	G
 
GR

 
 $	

 5
 

;); ; 	;
 $; 5; 
;( RV$.8N	40)0 !0 	0
 0 
0.#&<A	J)J J 	J
 "J 
J>,9),9 [,9 	,9
 ,9 ,9 
,9\$ /3	== = -	=
 
=AA -A %	A
  #A 
AF)
V(W d d  E E%(
;
8
8
VB'*	C*rU   r4   c                      e Zd Z	 	 	 	 	 	 	 	 ddZddZddZddZddZddZddZ	ddZ
dd	Zdd
ZddZddZddZy)rK   c                n    || _         || _        || _        | j                          | j	                          y rr   )r?   rC   r,   _init_version_info_model_init_alembic)rN   r?   rC   r,   s       r1   rO   z_VersionManager.__init__  s2     ,%%'rU   c                8   t        | j                  d      5 }t        j                  j	                  |      }|
	 d d d        y t        j                  t        j
                  t        j                        }|j                  |       d d d        y # 1 sw Y   y xY w)NT)schema_versionlibrary_version)	r2   r,   r   VersionInfoModelfindrf  r   __version__rb   rN   r.   version_infos      r1   r  z(_VersionManager._init_version_info_model$  s    #D$7$7> 		&'!2277@L'		& 		&
 "22%44 ' 3 3L KK%		& 		& 		&s   #BABBc                   t        j                  d      j                  t         j                         | j                  j                         5 }t        j                  j                  |      }|j                         d u}|r
	 d d d        y | j                         r| j                         }n| j                         }d d d        | j                         y # 1 sw Y   xY w)Nalembic)logging	getLoggersetLevelWARNrC   connectalembic_migrationMigrationContext	configureget_current_revision_is_alembic_supportedrq  _get_base_version_set_alembic_revision)rN   
connectioncontextis_initializedrevisions        r1   r  z_VersionManager._init_alembic0  s    )$--gll;[[  " 	4j'88BB:NG$99;4GN	4 	4 ))+002  113	4 	""8,	4 	4s   5C1CCc                .   | j                   j                         5 }t        j                  j	                  |      }|j                         5  | j                         }|j                  ||       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY wrr   )rC   r  r  r  r  begin_create_alembic_scriptstamp)rN   r  r  r  scripts        r1   r  z%_VersionManager._set_alembic_revisionC  s    [[  " 	0j'88BB:NG!!# 0446fh/0	0 	00 0	0 	0s#   0B#A?.B?B	BBc                   t        | j                        5 }t        j                  j	                  |      }|J | j                         }| j                         }||k(  r
	 d d d        y dj                  t        j                  |j                        }| j                         }d d d        v rdz  }t        |      dz  }t        |      # 1 sw Y   -xY w)NzcThe runtime optuna version {} is no longer compatible with the table schema (set up by optuna {}). z[Please execute `$ optuna storage upgrade --storage $STORAGE_URL` for upgrading the storage.zNPlease try updating optuna to the latest version by `$ pip install -U optuna`.)r2   r,   r   r  r  ro  rq  r$   r   r  r  rt  r[  )rN   r.   r  current_versionhead_versionr0   known_versionss          r1   rM   z0_VersionManager.check_table_schema_compatibilityJ  s    #D$7$78 	5G "2277@L+++"668O002L,.	5 	5**0&1D1DlFbFb*c  "224N!	5$ n,-G 7##	 `G 7##9	5 	5s   A
C):CCc                    | j                   j                         5 }t        j                  j	                  |      }|j                         }d d d        J |S # 1 sw Y   xY wrr   )rC   r  r  r  r  r  )rN   r  r  r   s       r1   ro  z#_VersionManager.get_current_versioni  s`    [[  " 	5j'88BB:NG224G	5 """	5 	5s   0AA"c                N    | j                         }|j                         }|J |S rr   )r  get_current_head)rN   r  current_heads      r1   rq  z _VersionManager.get_head_versionq  s0    ,,...0'''rU   c                X    | j                         }|j                         }|J d       |S )Nz0There should be exactly one base, i.e. v0.9.0.a.)r  get_base)rN   r  bases      r1   r  z!_VersionManager._get_base_versionw  s3    ,,. S!SSrU   c                |    | j                         }|j                         D cg c]  }|j                   c}S c c}w rr   )r  walk_revisionsr  )rN   r  rs      r1   rt  z _VersionManager.get_all_versions}  s1    ,,.$*$9$9$;<q

<<<s   9c                @   | j                         }t        j                  |d       t        | j                  d      5 }t
        j                  j                  |      }|J t
        j                  |_	        t        j                  |_        d d d        y # 1 sw Y   y xY w)NheadT)_create_alembic_configalembic_commandrm  r2   r,   r   r  r  rf  r  r   r  r  )rN   configr.   r  s       r1   rm  z_VersionManager.upgrade  s    ,,./#D$7$7> 	?'!2277@L+++*0*?*?L'+2+>+>L(		? 	? 	?s   ABBc                    t        | j                        5 }t        j                  j	                  |      }|
	 d d d        y|j
                  t        j                  k(  cd d d        S # 1 sw Y   y xY wrk   )r2   r,   r   r  r  r  rf  r  s      r1   r  z%_VersionManager._is_alembic_supported  sl    #D$7$78 	HG!2277@L#	H 	H  ..&2G2GG	H 	H 	Hs   #A(A((A1c                d    | j                         }t        j                  j                  |      }|S rr   )r  alembic_scriptScriptDirectoryfrom_config)rN   r  r  s      r1   r  z&_VersionManager._create_alembic_script  s+    ,,.//;;FCrU   c                   t         j                  j                  t         j                  j                  t              d      }t        j                  t         j                  j                  t         j                  j                  t              d            }|j                  dt        |             |j                  dt        | j                               |S )Nr  zalembic.iniscript_locationzsqlalchemy.url)
ospathjoindirname__file__alembic_configConfigset_main_optionescape_alembic_config_valuer?   )rN   alembic_dirr  s      r1   r  z&_VersionManager._create_alembic_config  s    ggll277??8#<iH&&rww||BGGOOH4M}']^02Mk2Z[/1LTXX1VWrU   N)r?   rs   rC   z'sqlalchemy.engine.Engine'r,   'sqlalchemy_orm.scoped_session'r   r  r  )r  rs   r   r  r  r  )r   r  )r   z 'alembic_script.ScriptDirectory')r   z'alembic_config.Config')r  r  r  rO   r  r  r  rM   ro  rq  r  rt  rm  r  r  r  r=  rU   r1   rK   rK     sj    

 +
 8	

 


&-&0$>=?H
rU   rK   c                &    | j                  dd      S )N%z%%)r  )r   s    r1   r  r    s     ==d##rU   )F)r,   r  r-   r  r   z/Generator['sqlalchemy_orm.Session', None, None])r   rs   r   rs   )X
__future__r   collectionsr   collections.abcr   r   r   r   r	   
contextlibr
   rR   r   r   r~   r  r  r   r  r   typingr   r   rt   r'   r   r   optuna._experimentalr   optuna._importsr   optuna._typingr   optuna.storages._baser   r   optuna.storages._heartbeatr   optuna.study._frozenr   optuna.study._study_directionr   optuna.trialr   r   alembic.commandcommandr  alembic.configr  r  alembic.migration	migrationr  alembic.scriptr  r  r   sqlalchemy.dialects.mysqldialectsr  r  sqlalchemy.dialects.postgresqlr  r   sqlalchemy.dialects.sqliter  r  sqlalchemy.excexcr   sqlalchemy.ormormrF   sqlalchemy.sql.functionssql	functionssqlalchemy_sql_functionsoptuna.storages._rdbr   
get_loggerr  r"   r2   r4   rK   r  r=  rU   r1   <module>r     s   " # $ % % $ $ %      	            ; ' + - ; 4 , 8 $ # -+1+AAKKCC++??+!"34O !12N#$78 !12N\*J +,G H%01Q%R"!,-I!J !12N !12N*+EF67F ..
#
#H
-  $)3  5 @k*m k*\I IX$rU   