
    !#h9                       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'	 	 	 	 	 	 	 	 	 	 	 	 	 	 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        _/var/www/html/sandstorm/venv/lib/python3.12/site-packages/optuna/terminator/improvement/emmr.py__init__zEMMREvaluator.__init__l   sF     1BKK$=_``5(#D)	    c           	     
   t        |      }|D cg c]"  }|j                  t        j                  k(  s!|$ }}t	        |      | j
                  k  r!t        j                  j                  t        z  S t        j                  ||      \  }}t	        |j                        dk(  rMt        j                  | j                  j                    d       t        j                  j                  t        z  S t	        |      }t	        |j                        }	|j"                  ||	fk(  sJ |t$        j&                  k(  rdnd}
t)        j*                  |D cg c]  }t-        t.        |j0                         c}      |
z  }t3        j4                  |      }||j7                         z
  t        t        j                  j8                  |j;                               z  }t	        |      t	        |      k(  sJ t3        j<                  |dd dd d f   |d d |j                  t        j>                  j@                  k(  tB        jD                  tB        jF                  d | jH                        }t3        j<                  |||j                  t        j>                  j@                  k(  tB        jD                  tB        jF                  || jH                        }tK        t)        jL                  |            }tK        t)        jL                  |d d             }||d d f   }||d d f   }tO        ||||||      }tQ        ||d dd d f   |d d |dd d f   |      \  }}tQ        |||||      \  }}tQ        |||||      \  }}tQ        ||d dd d f   |d d ||      \  }}|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  }'t9        t        j                  j                  d
z  ||!z   |"z   |'z         S c c}w c c}w )Nr   zM cannot consider any search space.Termination will never occur in this study.r   .)XYis_categorical	log_priorminimum_noiseinitial_kernel_paramsr!   )rngg|=g       @g      ?g      ?g         )4r   stater   COMPLETElenr   sys
float_infomaxMARGIN_FOR_NUMARICAL_STABILITYgp_search_space&get_search_space_and_normalized_paramsscale_typeswarningswarn	__class____name__shaper	   MINIMIZEr   arrayr   floatvaluer   warn_and_convert_infmeanminstdfit_kernel_params	ScaleTypeCATEGORICALr   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
len_paramssign
score_valsstandarized_score_valskernel_params_t1kernel_params_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*9*`*`0+
'' |''(A-MM>>**+ ,> > >>%%(FFF)
112
 &&:z*BBBB %(?(??rQXX_MtE1773MNQUU
,,Z8
",z/@"@CNN
 0E
 "
 )*c2C.DDDD//SbS!,$Sb)(448Q8Q8]8]]--99"&$($7$7
 ..$(448Q8Q8]8]]--99"2$($7$7
 !+A!BC!")),B3B,G"HI();Q)>?)*=q*@A7["8
4 BWcrc1f%"3B'b!e$B
>!> '<"'
## 6K"6
22 "7crc1f%"3B'"
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$&()() ))
 	
Y P* Ns   "S7S7!S<)Fr   r0   N)
r!   boolr"   rB   r   rM   r#   z
int | NonereturnNone)rX   zlist[FrozenTrial]rY   r	   r   rB   )r>   
__module____qualname____doc__r%   r~    r&   r$   r   r   *   sQ    >D ).*!%* * 	*
 * 
*U
r&   r   c           
     0   t        j                  t         j                  j                  || ||      }t	        j
                  |j                  t        j                  |j                        t        j                  |j                  j                  t        j                  j                  k(        t        j                  |j                        t        j                  |j                         t        j                  |            \  }}|j#                         j%                         j'                         }|j#                         j%                         j'                         }	t)        |      dk(  rt)        |	      dk(  sJ t+        |d         t+        |	d         fS )N	acqf_typekernel_paramsr   r)   r*   r   r   )r   create_acqf_paramsAcquisitionFunctionTypeLOG_EIr   	posteriorr   r   
from_numpyr)   r   r:   r8   rI   rJ   cov_Y_Y_invcov_Y_Y_inv_Ydetachnumpyflattenr3   rB   )
r   r)   r*   x_paramsr   acqf_paramsmean_tensor
var_tensorrE   vars
             r$   rP   rP     s=    ))..55#!

K !ll!!'$$00O4M4M4Y4YY	
 	001223"	K %%'//1D




#
#
%
-
-
/Ct9>c#h!m++a>5Q=((r&   c           	        t        |j                        dk(  sJ |j                  \  }}t        |j                        dk(  sJ |j                  d   }|j                  ||fk(  sJ |j                  |fk(  sJ |j                  ||fk(  sJ |j                  |fk(  sJ t        j                  || |dd d d f   |      ddd d f   }	|	j                  ||fk(  sJ t        j                  || |dd d d f   |      ddd d f   }
|
j                  ||fk(  sJ t	        j
                  |
j                         t        j                  |             sJ t	        j
                  |
|
j                        sJ |	|z  }|j                  |fk(  sJ |
|	|z  |	j                  z  z
  }|j                  ||fk(  sJ |t	        j                  |d      fS )Nr0   r   .g        )rF   )
r3   r?   r   kernelr   allclosediagkernel_at_zero_distanceTclamp)r   r)   r+   r   r   thetar^   r_   	len_batchcov_ftheta_fXcov_ftheta_fthetarE   r   s                r$   _posterior_of_batched_thetar   2  s    qww<1WWJ
u{{q   AI;;9j1111J=000Z 8888:-///IInmU3a<=PRSTUXZ[]^U^_M9j"9999		.-sDRS|ATV[\Q	 ""y)&<<<<>>+002B4N4N}4]^^^>>+->-@-@AAA=(D::)%%%
mk9MOOK
KC99I.... Sc***r&   c                   ||k(  rt        | ||||   |      d   S |j                  d   |j                  d   k(  sJ t        j                  t        j                  j
                  || ||      }t        |j                  t        j                  |j                        t        j                  |j                  j                  t        j                  j                  k(        t        j                  |j                         t        j                  |j"                        t        j                  |||g               \  }}|j                  dk(  sJ |j%                         j'                         d   }t)        |      S )Nr   r   r   )r0   r0   )r   r   )rP   r?   r   r   r   r   r   r   r   r   r)   r   r:   r8   rI   rJ   r   r   r   r   rB   )	r   r]   rb   r   theta1_indextheta2_indexr   rl   r   s	            r$   rO   rO   W  s\    |#$"l+
  	 ""1%)?)E)Ea)HHHH))..55#!

 K )!!'$$00O4M4M4Y4YY	
 	001223*L,+GHI	FAs 99
**,


t
$C:r&   )r   gp_search_space.SearchSpacer)   
np.ndarrayr*   r   r   r   r   gp.KernelParamsTensorr   ztuple[float, float])r   r   r)   torch.Tensorr+   r   r   r   r   r   r   r   r   z!tuple[torch.Tensor, torch.Tensor])r   r   r]   r   rb   r   r   r   r   rM   r   rM   r   rB   ))
__future__r   rQ   r4   typingr   r   r;   r   r   optuna._experimentalr   "optuna.samplers._lazy_random_stater   optuna.search_spacer   optuna.studyr	   'optuna.terminator.improvement.evaluatorr
   r   optuna.trialr   r   scipy.statsstatsrS   r   
optuna._gpr   r   r   r   r8   optuna._importsr   r7   r   rP   r   rO   r   r&   r$   <module>r      s   "  
      3 > 9 ' V L $ # % :+ E	_	%B()D*+E!";<Om,K!$  Ge
, e
 e
P)-)) ) 	)
 )) )>"+("+"+ !"+ 	"+
  "+ "+ '"+J(-(!( '( )	(
 ( ( (r&   