
    (^i'                       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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 er#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" n6d dl#m$Z$  e$d      Z e$d      Z e$d      Z e$d      Z  e$d      Z" e$d      ZdZ% ed       G d de             Z&ddZ'	 	 	 	 	 	 	 	 	 	 ddZ(y)     )annotationsN)cast)TYPE_CHECKING)experimental_class)LazyRandomState)intersection_search_space)StudyDirection)"_compute_standardized_regret_bound)BaseImprovementEvaluator)FrozenTrial)
TrialState)acqf)gp)prior)search_space)_LazyImporttorchzoptuna._gp.gpzoptuna._gp.acqfzoptuna._gp.priorzoptuna._gp.search_spacezscipy.stats皙?z4.0.0c                  <    e Zd ZdZ	 	 	 	 d	 	 	 	 	 	 	 	 	 ddZddZy)EMMREvaluatora	  Evaluates a kind of regrets, called the Expected Minimum Model Regret(EMMR).

    EMMR is an upper bound of "expected minimum simple regret" in the optimization process.

    Expected minimum simple regret is a quantity that converges to zero only if the
    optimization process has found the global optima.

    For further information about expected minimum simple regret and the algorithm,
    please refer to the following paper:

    - `A stopping criterion for Bayesian optimization by the gap of expected minimum simple
      regrets <https://proceedings.mlr.press/v206/ishibashi23a.html>`__

    Also, there is our blog post explaining this evaluator:

    - `Introducing A New Terminator: Early Termination of Black-box Optimization Based on
      Expected Minimum Model Regret
      <https://medium.com/optuna/introducing-a-new-terminator-early-termination-of-black-box-optimization-based-on-expected-9a660774fcdb>`__

    Args:
        deterministic_objective:
            A boolean value which indicates whether the objective function is deterministic.
            Default is :obj:`False`.
        delta:
            A float number related to the criterion for termination. Default to 0.1.
            For further information about this parameter, please see the aforementioned paper.
        min_n_trials:
            A minimum number of complete trials to compute the criterion. Default to 2.
        seed:
            A random seed for EMMREvaluator.

    Example:

        .. testcode::

            import optuna
            from optuna.terminator import EMMREvaluator
            from optuna.terminator import MedianErrorEvaluator
            from optuna.terminator import Terminator

            sampler = optuna.samplers.TPESampler(seed=0)
            study = optuna.create_study(sampler=sampler, direction="minimize")
            emmr_improvement_evaluator = EMMREvaluator()
            median_error_evaluator = MedianErrorEvaluator(emmr_improvement_evaluator)
            terminator = Terminator(
                improvement_evaluator=emmr_improvement_evaluator,
                error_evaluator=median_error_evaluator,
            )


            for i in range(1000):
                trial = study.ask()

                ys = [trial.suggest_float(f"x{i}", -10.0, 10.0) for i in range(5)]
                value = sum(ys[i] ** 2 for i in range(5))

                study.tell(trial, value)

                if terminator.should_terminate(study):
                    # Terminated by Optuna Terminator!
                    break

    Nc                    |dk  st        j                  |      st        d      || _        || _        || _        t        |      | _        y )N   z@`min_n_trials` is expected to be a finite integer more than one.)npisfinite
ValueError_deterministic_deltamin_n_trialsr   _rng)selfdeterministic_objectivedeltar   seeds        c/var/www/html/hubwallet-dev/venv/lib/python3.12/site-packages/optuna/terminator/improvement/emmr.py__init__zEMMREvaluator.__init__l   sF     1BKK$=_``5(#D)	    c           	     6	   t        |      }|D cg c]"  }|j                  t        j                  k(  s!|$ }}t	        |      | j
                  k  r!t        j                  j                  t        z  S t        j                  |      }|j                  |      }|j                  sMt        j                  | j                   j"                   d       t        j                  j                  t        z  S t	        |      }|j$                  ||j                  fk(  sJ |t&        j(                  k(  rdnd}	t+        j,                  |D cg c]  }t/        t0        |j2                         c}      |	z  }
t5        j6                  |
      }
|
|
j9                         z
  t        t        j                  j:                  |
j=                               z  }t	        |      t	        |      k(  sJ t5        j>                  |dd dd d f   |d d |j@                  tB        jD                  tB        jF                  d | jH                        }t5        j>                  |||j@                  tB        jD                  tB        jF                  || jH                        }tK        t+        jL                  |            }tK        t+        jL                  |d d             }||d d f   }||d d f   }tO        ||||      }tQ        |dd d f   |      \  }}tQ        ||      \  }}tQ        ||      \  }}tQ        ||      \  }}|d   }tS        |||d dd d f   |d d | jT                  | jV                  jX                        }||z
  }|}t[        j\                  t        d|d|z  z
  |z               }||z
  |z  }|t^        j`                  jc                  |      z  } ||z  t^        j`                  je                  |      z  }!tB        jF                  dz  }"d	t[        jf                  d
|"|z  z         z  }#d|z  ||"dz  z   z  }$d	|z  ||z
  dz  z  ||"dz  z   dz  z  }%|t[        j\                  d	|#|$z   |%z   z        z  }&t;        t        j                  j                  d	z  || z   |!z   |&z         S c c}w c c}w )NzM cannot consider any search space.Termination will never occur in this study.r   .)XYis_categorical	log_priorminimum_noise	gpr_cacher!   )rngg|=g       @g      ?g      ?g         )4r   stater   COMPLETElenr   sys
float_infomaxMARGIN_FOR_NUMARICAL_STABILITYgp_search_spaceSearchSpaceget_normalized_paramsdimwarningswarn	__class____name__shaper	   MINIMIZEr   arrayr   floatvaluer   warn_and_convert_infmeanminstdfit_kernel_paramsr+   r   default_log_priorDEFAULT_MINIMUM_NOISE_VARr   intargmax$_compute_gp_posterior_cov_two_thetas_compute_gp_posteriorr
   r   r   r/   mathsqrtscipy_statsnormpdfcdflog)'r    trialsstudy_directionoptuna_search_spacetcomplete_trialsr   normalized_params
len_trialssign
score_valsstandarized_score_valsgpr_t1gpr_ttheta_t_star_indextheta_t1_star_indextheta_t_startheta_t1_star,cov_t_between_theta_t_star_and_theta_t1_starmu_t1_theta_t_with_nu_tvariance_t1_theta_t_with_nu_t_variance_t_theta_t1_starmu_t_theta_t_starvariance_t_theta_t_starmu_t1_theta_t1_stary_tkappa_t1theorem1_delta_mu_t_staralg1_delta_r_tilde_t_term1
theorem1_v
theorem1_galg1_delta_r_tilde_t_term2alg1_delta_r_tilde_t_term3_lambdaeq4_rhs_term1eq4_rhs_term2eq4_rhs_term3alg1_delta_r_tilde_t_term4s'                                          r$   evaluatezEMMREvaluator.evaluate{   s   7?&,O:;N;N0N1OO$"3"33>>%%(FFF&223FG(>>OMM>>**+ ,> > >>%%(FFF)
 &&:|7G7G*HHHH %(?(??rQXX_MtE1773MNQUU
,,Z8
",z/@"@CNN
 0E
 "
 )*c2C.DDDD%%SbS!,$Sb)'66--99$($7$7
 $$$'66--99$($7$7
 !+A!BC!")),B3B,G"HI();Q)>?)*=q*@A7[u&8:M8
4
 BWb!e$eB
>!> '<M5&Q##5J<Y^5_22!6}f!MQ$R(5crc1f%"3B'KK		
 $79J#J %="YY'DDE*+

 (*==K
%/+2B2B2F2Fz2R%R"%/*%<{?O?O?S?ST^?_%_"1125dhhsW7T-T'TUU004QT[]_T_4_` 	 +,,,23 -w{:q@A 	 &.		==0=@A1
 &
" NN$&()() ))
 	
U P& Ns   "RR!R)Fr   r0   N)
r!   boolr"   rC   r   rL   r#   z
int | NonereturnNone)rW   zlist[FrozenTrial]rX   r	   r~   rC   )r?   
__module____qualname____doc__r%   r|    r&   r$   r   r   *   sQ    >D ).*!%* * 	*
 * 
*s
r&   r   c                    |j                  t        j                  |             \  }}|j                         |j                         fS )N)	posteriorr   
from_numpyitem)x_paramsgprrF   vars       r$   rO   rO      s6    e..x89ID#99;
""r&   c                    ||k(  rt        | |   |      d   S |j                  t        j                  | ||g         d      \  }}|j                  dk(  sJ |d   j                         S )Nr   T)joint)r0   r0   )r   r   )rO   r   r   r   r@   r   )r\   r   theta1_indextheta2_indexrj   covars         r$   rN   rN      s~     |#$%6|%DcJ1MM}}*L,+GHIQU  HAu ;;&   ;r&   )r   
np.ndarrayr   gp.GPRegressorr~   ztuple[float, float])
r\   r   r   r   r   rL   r   rL   r~   rC   ))
__future__r   rP   r4   typingr   r   r<   numpyr   optuna._experimentalr   "optuna.samplers._lazy_random_stater   optuna.search_spacer   optuna.studyr	   'optuna.terminator.improvement.evaluatorr
   r   optuna.trialr   r   scipy.statsstatsrR   r   
optuna._gpr   acqf_moduler   r   r   r8   optuna._importsr   r7   r   rO   rN   r   r&   r$   <module>r      s    "  
      3 > 9 ' V L $ # %. :+ E	_	%B/0K*+E!";<Om,K!$  GC
, C
 C
L#!(6FIY\
r&   