
    -ji2                       S SK Jr  S SKJr  S SKJr  S SKrS SKJr  S SKJr  S SK	r
S SKJr  S SKJr  \(       a  S SKrS S	KJr  S S
KJr  OS SKJr  \" S5      r\R,                  " S5      rS\R,                  " S\R0                  -  5      -  r\R,                  " S\R0                  -  5      r\R6                  " \R,                  " S\R0                  -  5      5      rSrS%S jr        S&S jrS'S jr S(S jr! " S S\5      r" " S S\"5      r# " S S\"5      r$ " S S\"5      r% " S S\"5      r& " S S \"5      r' " S! S"\"5      r( " S# S$\"5      r)g))    )annotations)ABC)abstractmethodN)cast)TYPE_CHECKING)get_non_dominated_box_bounds)_is_pareto_front)GPRegressor)SearchSpace)_LazyImporttorch      ?      -q=c                    [         R                  R                  U SUS9R                  U[         R                  S9nSUS-
  -  n[         R
                  " U5      [        [        R                  " S5      5      -  $ )NT)	dimensionscrambleseeddtypeg       @r   r   )	r   quasirandomSobolEnginedrawfloat64erfinvfloatnpsqrt)dim	n_samplesr   sobol_samplessampless        I/home/james-whalen/.local/lib/python3.13/site-packages/optuna/_gp/acqf.py_sample_from_normal_sobolr%   !   sm     %%114 2 
d9EMMd*  ]S()G<< 5#444    c                d   [        [        R                  " U R                  S   5      5      nU R	                  S5      U-
  nUR                  [        R                  " [        [        R                  S9US9  [        R                  R                  UR                  5       R                  SS9SS9U-
  $ )Nr   )minmaxr    )r(   r+   )r   r   logshape	unsqueezeclamp_r   tensor_EPSr   special	logsumexpsum)Y_postnon_dominated_box_lower_boundsnon_dominated_box_intervalslog_n_qmc_samplesdiffs        r$   logehvir;   -   s    
 bffV\\"%567 B"@@DKKELLU]];A\K] ==""488:>>b>#9x"HK\\\r&   c                   SU -  =n[         R                  R                  [        * U -  5      -  U* U -  R	                  5       [
        -  -   R                  5       nX S:  =n   =nR                  5       (       aT  SUS-  -  [        -
  S[        U-  [         R                  R                  [        * U-  5      -  -   R                  5       -   X#'   U$ )a0  
Return E_{x ~ N(0, 1)}[max(0, x+z)]
The calculation depends on the value of z for numerical stability.
Please refer to Eq. (9) in the following paper for more details:
    https://arxiv.org/pdf/2310.20708.pdf

NOTE: We do not use the third condition because [-10**100, 10**100] is an overly high range.
r   ig      r   r   )r   r3   erfc
_SQRT_HALFexp_INV_SQRT_2PIr-   numel_LOG_SQRT_2PI_SQRT_HALF_PIerfcx)zz_halfoutsmallz_smalls        r$   standard_logeirJ   A   s     7	emm00*qAA7Q;



-	.	ce  3w&e((//11 7A:=7*U]]-@-@*wAV-WWW\\^_ 	

 Jr&   c                d    [        X-
  UR                  5       =n-  5      UR                  5       -   $ N)rJ   sqrt_r-   )meanvarf0sigmas       r$   logeirR   Z   s*    49#))+)=>?%))+MMr&   c                  F    \ rS rSrSS jr\S	S j5       rS
S jrSS jrSr	g)BaseAcquisitionFunc_   c                    Xl         X l        g rL   length_scalessearch_space)selfrX   rY   s      r$   __init__BaseAcquisitionFunc.__init__`   s    *(r&   c                    [         erL   )NotImplementedErrorrZ   xs     r$   	eval_acqfBaseAcquisitionFunc.eval_acqfd   s    !!r&   c                    [         R                  " 5          U R                  [         R                  " U5      5      R	                  5       R                  5       sS S S 5        $ ! , (       d  f       g = frL   )r   no_gradra   
from_numpydetachnumpyr_   s     r$   eval_acqf_no_grad%BaseAcquisitionFunc.eval_acqf_no_gradh   s>    ]]_>>%"2"21"56==?EEG __s   AA!!
A/c                "   UR                   S:X  d   e[        R                  " U5      R                  S5      nU R	                  U5      nUR                  5         UR                  5       UR                  R                  5       R                  5       4$ )Nr   T)
ndimr   re   requires_grad_ra   backwarditemgradrf   rg   )rZ   r`   x_tensorvals       r$   eval_acqf_with_grad'BaseAcquisitionFunc.eval_acqf_with_gradl   sk    vv{{##A&55d;nnX&xxz8==//177999r&   rW   N)rX   
np.ndarrayrY   r   returnNoner`   torch.Tensorru   rx   )r`   rt   ru   rt   )r`   rt   ru   ztuple[float, np.ndarray])
__name__
__module____qualname____firstlineno__r[   r   ra   rh   rr   __static_attributes__ r&   r$   rT   rT   _   s&    ) " "H:r&   rT   c                  N   ^  \ rS rSr S         SU 4S jjjrSS jrSrU =r$ )LogEIt   c                ^   > Xl         X@l        X0l        [        TU ]  UR
                  U5        g rL   _gpr_stabilizing_noise
_thresholdsuperr[   rX   rZ   gprrY   	thresholdstabilizing_noise	__class__s        r$   r[   LogEI.__init__u   *     	"3#**L9r&   c                (   U R                   R                  U5      u  p#[        R                  " U R                  5      (       d!  [        X#U R                  -   U R                  S9$ [        R                  " UR                  S S [        R                  S9$ )N)rN   rO   rP   r+   r   )r   	posteriorr   isneginfr   rR   r   r   zerosr.   r   rZ   r`   rN   rO   s       r$   ra   LogEI.eval_acqf   sp    II''*	
 ;;t// tt'>'>!>4??S	
 QWWSb\?	
r&   r   r   r   r   
r   r
   rY   r   r   r   r   r   ru   rv   rw   ry   rz   r{   r|   r[   ra   r}   __classcell__r   s   @r$   r   r   t   sL     $)
:
: "
: 	
:
 !
: 

: 
:
 
r&   r   c                  N   ^  \ rS rSr S         SU 4S jjjrSS jrSrU =r$ )LogPI   c                ^   > Xl         X@l        X0l        [        TU ]  UR
                  U5        g rL   r   r   s        r$   r[   LogPI.__init__   r   r&   c                    U R                   R                  U5      u  p#[        R                  " X0R                  -   5      n[        R
                  R                  X R                  -
  U-  5      $ rL   )r   r   r   r   r   r3   log_ndtrr   )rZ   r`   rN   rO   rQ   s        r$   ra   LogPI.eval_acqf   sR     II''*	

3!8!889}}%%too'=&FGGr&   r   r   r   rw   r   r   s   @r$   r   r      sN     $)
:
: "
: 	
:
 !
: 

: 
:H Hr&   r   c                  F   ^  \ rS rSr        SU 4S jjrSS jrSrU =r$ )UCB   c                R   > Xl         X0l        [        TU ]  UR                  U5        g rL   r   _betar   r[   rX   rZ   r   rY   betar   s       r$   r[   UCB.__init__   $     	
**L9r&   c                    U R                   R                  U5      u  p#U[        R                  " U R                  U-  5      -   $ rL   r   r   r   r   r   r   s       r$   ra   UCB.eval_acqf   5    II''*	ejjc!1222r&   r   r   r   r
   rY   r   r   r   ru   rv   rw   r   r   s   @r$   r   r      8    :: ": 	:
 
:3 3r&   r   c                  F   ^  \ rS rSr        SU 4S jjrSS jrSrU =r$ )LCB   c                R   > Xl         X0l        [        TU ]  UR                  U5        g rL   r   r   s       r$   r[   LCB.__init__   r   r&   c                    U R                   R                  U5      u  p#U[        R                  " U R                  U-  5      -
  $ rL   r   r   s       r$   ra   LCB.eval_acqf   r   r&   r   r   rw   r   r   s   @r$   r   r      r   r&   r   c                  V   ^  \ rS rSr S             SU 4S jjjrSS jrSrU =r$ )ConstrainedLogEI   c           
       > [        U5      [        U5      :X  a  U(       d   e[        XX65      U l        [        XE5       VVs/ s H  u  px[	        XrX5      PM     snnU l        [        T	U ]  UR                  U5        g s  snnf rL   )	lenr   _acqfzipr   _constraints_acqf_listr   r[   rX   )
rZ   r   rY   r   constraints_gpr_listconstraints_threshold_listr   r   r   r   s
            r$   r[   ConstrainedLogEI.__init__   s     $%-G)HHMa	
a3iK
 %((<$Y'
$Y  $jD$Y'
# 	**L9	'
s   A>c                z   ^ U R                   R                  T5      [        U4S jU R                   5       5      -   $ )Nc              3  D   >#    U  H  oR                  T5      v   M     g 7frL   ra   .0acqfr`   s     r$   	<genexpr>-ConstrainedLogEI.eval_acqf.<locals>.<genexpr>   s      -
*E$NN1*E    )r   ra   r5   r   r_   s    `r$   ra   ConstrainedLogEI.eval_acqf   s;     zz##A& -
*.*E*E-
 *
 
 	
r&   r   r   r   )r   r
   rY   r   r   r   r   list[GPRegressor]r   list[float]r   r   ru   rv   rw   r   r   s   @r$   r   r      s`     $):: ": 	:
 0: %0: !: 
: :&
 
r&   r   c                  V   ^  \ rS rSr S             SU 4S jjjrSS jrSrU =r$ )LogEHVI   c                V  >^ SU4S jjnX`l         Xl        [        TR                  S   XES9U l        U" 5       u  U l        nXR
                  -
  R                  [        5      U l        [        T
U ])  [        R                  " U V	s/ s H  oR                  PM     sn	SS9U5        g s  sn	f )Nc                 `  > TR                  5       * n U [        U SS9   n[        R                  " U SS9n[        R                  " [        R
                  " SU-  SU-  5      [        R                  5      n[        X5      u  p4[        R                  " U* 5      [        R                  " U* 5      4$ )NF)assume_unique_lexsortedr   axisg?g?)
rg   r	   r   r*   	nextaftermaximuminfr   r   re   )	loss_valspareto_sols	ref_pointlbsubsY_trains        r$   _get_non_dominated_box_bounds7LogEHVI.__init__.<locals>._get_non_dominated_box_bounds   s     (I#$4YX]$^_Kyq1IRZZiy%QSUSYSYZI3KKHC##SD)5+;+;SD+AAAr&   r+   )r    r!   r   r   r   )ru   z!tuple[torch.Tensor, torch.Tensor])r   	_gpr_listr%   r.   _fixed_samples_non_dominated_box_lower_bounds
clamp_min_r2   _non_dominated_box_intervalsr   r[   r   rN   rX   )rZ   gpr_listrY   r   n_qmc_samplesqmc_seedr   r   non_dominated_box_upper_boundsr   r   s      `      r$   r[   LogEHVI.__init__   s    	B #4!7b!]
 *+ 	M,.L +-Q-QQ
*T
 	) 	x!Hx"3"3x!HqQS_`!Hs   B&c                h   / n[        U R                  5       Hf  u  p4UR                  U5      u  pV[        R                  " X`R
                  -   5      nUR                  US   US   U R                  SU4   -  -   5        Mh     [        [        R                  " USS9U R                  U R                  S9$ )N).N.r+   r,   )r6   r7   r8   )	enumerater   r   r   r   r   appendr   r;   stackr   r   )rZ   r`   r6   ir   rN   rO   stdevs           r$   ra   LogEHVI.eval_acqf  s    /FAa(IDJJs%<%<<=E
 MM$y/E),<t?R?RSVXYSY?Z,ZZ[ 0 ;;v2.+/+O+O(,(I(I
 	
r&   )r   r   r   r   r   r   )r   r   rY   r   r   rx   r   intr   
int | Noner   r   ru   rv   rw   r   r   s   @r$   r   r      sj     $)"a#"a ""a 	"a
 "a "a !"a 
"a "aH
 
r&   r   c                  ^   ^  \ rS rSr S                 SU 4S jjjrSS jrSrU =r$ )ConstrainedLogEHVIi  c	           
     d  > [        U5      [        U5      :X  a  U(       d   eUb  [        XX4XX5      OS U l        [        Xg5       V	V
s/ s H  u  p[	        XX5      PM     sn
n	U l        [        TU ]  [        R                  " U Vs/ s H  oR                  PM     snSS9U5        g s  sn
n	f s  snf )Nr   r   )r   r   r   r   r   r   r   r[   r   rN   rX   )rZ   r   rY   
Y_feasibler   r   r   r   r   r   r   r   r   s               r$   r[   ConstrainedLogEHVI.__init__  s     $%-G)HHMa	
a % HJxc 	
 %((<$Y'
$Y  $jD$Y'
# 	x!Hx"3"3x!HqQS_`'
 "Is   B'B-c                   ^ [        U4S jU R                   5       5      nU R                  c  [        [        R
                  U5      $ X R                  R                  T5      -   $ )Nc              3  D   >#    U  H  oR                  T5      v   M     g 7frL   r   r   s     r$   r   /ConstrainedLogEHVI.eval_acqf.<locals>.<genexpr>8  s     %`D_DnnQ&7&7D_r   )r5   r   r   r   r   Tensorra   )rZ   r`   constraints_acqf_valuess    ` r$   ra   ConstrainedLogEHVI.eval_acqf7  sN    "%%`DD_D_%`"`::&=>>&)=)=a)@@@r&   r   r   )r   r   rY   r   r   ztorch.Tensor | Noner   r   r   r   r   r   r   r   r   r   ru   rv   rw   r   r   s   @r$   r   r     s     $)a#a "a (	a
 a a 0a %0a !a 
a a:A Ar&   r   )r    r   r!   r   r   r   ru   rx   )r6   rx   r7   rx   r8   rx   ru   rx   )rE   rx   ru   rx   )rN   rx   rO   rx   rP   r   ru   rx   )*
__future__r   abcr   r   mathtypingr   r   rg   r   optuna._hypervolumer   optuna.study._multi_objectiver	   r   optuna._gp.gpr
   optuna._gp.search_spacer   optuna._importsr   r   r>   pir@   rC   r-   rB   r2   r%   r;   rJ   rR   rT   r   r   r   r   r   r   r   r~   r&   r$   <module>r     sI   "        < : )3+ E YYs^
DIIa$''k**		#-(1tww;/0	5]]$0] ".] 	](2N
:# :*
 
0H H.3
 3 3
 3 
* 
87
! 7
t"A, "Ar&   