o
    }oi                     @  s^   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
dZ
G dd deZdS )    )annotationsN)Any)
BasePruner)_is_first_in_interval_stepvaluer   returnfloatc              	   C  s>   zt | } W | S  ttfy   dt| j d}t|d w )Nz!The `value` argument is of type 'z' but supposed to be a float.)r   	TypeError
ValueErrortype__name__)r   message r   M/home/ubuntu/.local/lib/python3.10/site-packages/optuna/pruners/_threshold.py_check_value   s   

r   c                   @  s.   e Zd ZdZ				ddddZdddZdS )ThresholdPrunera  Pruner to detect outlying metrics of the trials.

    Prune if a metric exceeds upper threshold,
    falls behind lower threshold or reaches ``nan``.

    Example:
        .. testcode::

            from optuna import create_study
            from optuna.pruners import ThresholdPruner
            from optuna import TrialPruned


            def objective_for_upper(trial):
                for step, y in enumerate(ys_for_upper):
                    trial.report(y, step)

                    if trial.should_prune():
                        raise TrialPruned()
                return ys_for_upper[-1]


            def objective_for_lower(trial):
                for step, y in enumerate(ys_for_lower):
                    trial.report(y, step)

                    if trial.should_prune():
                        raise TrialPruned()
                return ys_for_lower[-1]


            ys_for_upper = [0.0, 0.1, 0.2, 0.5, 1.2]
            ys_for_lower = [100.0, 90.0, 0.1, 0.0, -1]

            study = create_study(pruner=ThresholdPruner(upper=1.0))
            study.optimize(objective_for_upper, n_trials=10)

            study = create_study(pruner=ThresholdPruner(lower=0.0))
            study.optimize(objective_for_lower, n_trials=10)

    Args:
        lower:
            A minimum value which determines whether pruner prunes or not.
            If an intermediate value is smaller than lower, it prunes.
        upper:
            A maximum value which determines whether pruner prunes or not.
            If an intermediate value is larger than upper, it prunes.
        n_warmup_steps:
            Pruning is disabled if the step is less than the given number of warmup steps.
        interval_steps:
            Interval in number of steps between the pruning checks, offset by the warmup steps.
            If no value has been reported at the time of a pruning check, that particular check
            will be postponed until a value is reported. Value must be at least 1.

    Nr      lowerfloat | Noneuppern_warmup_stepsintinterval_stepsr   Nonec                 C  s   |d u r|d u rt d|d urt|}|d urt|}|d ur"|ntd }|d ur-|ntd}||kr9td|dk rEtd| d|dk rQtd| d|| _|| _|| _|| _d S )	Nz(Either lower or upper must be specified.infz#lower should be smaller than upper.r   z2Number of warmup steps cannot be negative but got .r   z2Pruning interval steps must be at least 1 but got )r	   r   r   r
   _lower_upper_n_warmup_steps_interval_steps)selfr   r   r   r   r   r   r   __init__Q   s,   


zThresholdPruner.__init__study'optuna.study.Study'trial'optuna.trial.FrozenTrial'boolc                 C  sv   |j }|d u r	dS | j}||k rdS t||j || jsdS |j| }t|r+dS || jk r2dS || j	kr9dS dS )NFT)
	last_stepr   r   intermediate_valueskeysr   mathisnanr   r   )r    r"   r$   stepr   latest_valuer   r   r   pruner   s$   



zThresholdPruner.prune)NNr   r   )
r   r   r   r   r   r   r   r   r   r   )r"   r#   r$   r%   r   r&   )r   
__module____qualname____doc__r!   r.   r   r   r   r   r      s    :!r   )r   r   r   r   )
__future__r   r*   typingr   optunaoptuna.prunersr   optuna.pruners._percentiler   r   r   r   r   r   r   <module>   s    
