o
    }oi2                     @  s  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mZ d dlmZ erEd dlZd d	lmZ d d
lmZ n
d dlmZ edZedZdedej  Zedej Zeedej ZdZd8ddZd9ddZd:d d!Z d;d&d'Z!G d(d) d)eZ"G d*d+ d+e"Z#G d,d- d-e"Z$G d.d/ d/e"Z%G d0d1 d1e"Z&G d2d3 d3e"Z'G d4d5 d5e"Z(G d6d7 d7e"Z)dS )<    )annotations)ABC)abstractmethodN)cast)TYPE_CHECKING)get_non_dominated_box_bounds)_is_pareto_front)GPRegressor)SearchSpace)_LazyImporttorch      ?      -q=dimint	n_samplesseed
int | Nonereturntorch.Tensorc                 C  sB   t jj| d|dj|t jd}d|d  }t |ttd S )NT)	dimensionscrambler   dtypeg       @r   r   )	r   quasirandomSobolEnginedrawfloat64erfinvfloatnpsqrt)r   r   r   sobol_samplessamples r&   C/home/ubuntu/.local/lib/python3.10/site-packages/optuna/_gp/acqf.py_sample_from_normal_sobol!   s   r(   Y_postnon_dominated_box_lower_boundsnon_dominated_box_intervalsc                 C  s\   t t| jd }| d| }|jtjttj	d|d tj
j| jdddd| S )Nr   )minmaxr   )r,   r/   )r!   r"   logshape	unsqueezeclamp_r   tensor_EPSr   special	logsumexpsum)r)   r*   r+   log_n_qmc_samplesdiffr&   r&   r'   logehvi-   s    r<   zc                 C  s   d|   }t jt |   | |   t   }| | dk  }  } rAd|d  t dt	| t j
t |     ||< |S )aH  
    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   r7   erfc
_SQRT_HALFexp_INV_SQRT_2PIr1   numel_LOG_SQRT_2PI_SQRT_HALF_PIerfcx)r=   z_halfoutsmallz_smallr&   r&   r'   standard_logeiA   s   
 rJ   meanvarf0r!   c                 C  s    t | | |  } |  S N)rJ   sqrt_r1   )rK   rL   rM   sigmar&   r&   r'   logeiZ   s    rQ   c                   @  s8   e Zd ZdddZedddZdddZdddZdS )BaseAcquisitionFunclength_scales
np.ndarraysearch_spacer
   r   Nonec                 C  s   || _ || _d S rN   )rS   rU   )selfrS   rU   r&   r&   r'   __init__`   s   
zBaseAcquisitionFunc.__init__xr   c                 C  s   t rN   )NotImplementedErrorrW   rY   r&   r&   r'   	eval_acqfd   s   zBaseAcquisitionFunc.eval_acqfc                 C  sD   t   | t |  W  d    S 1 sw   Y  d S rN   )r   no_gradr\   
from_numpydetachnumpyr[   r&   r&   r'   eval_acqf_no_gradh   s   
$z%BaseAcquisitionFunc.eval_acqf_no_gradtuple[float, np.ndarray]c                 C  sF   |j dksJ t|d}| |}|  | |j 	 fS )Nr   T)
ndimr   r^   requires_grad_r\   backwarditemgradr_   r`   )rW   rY   x_tensorvalr&   r&   r'   eval_acqf_with_gradl   s
   
z'BaseAcquisitionFunc.eval_acqf_with_gradN)rS   rT   rU   r
   r   rV   rY   r   r   r   )rY   rT   r   rT   )rY   rT   r   rb   )__name__
__module____qualname__rX   r   r\   ra   rj   r&   r&   r&   r'   rR   _   s    

rR   c                      ,   e Zd Z	dd fddZdddZ  ZS )LogEIr   gprr	   rU   r
   	thresholdr!   stabilizing_noiser   rV   c                   &   || _ || _|| _t |j| d S rN   _gpr_stabilizing_noise
_thresholdsuperrX   rS   rW   rq   rU   rr   rs   	__class__r&   r'   rX   u      zLogEI.__init__rY   r   c                 C  sL   | j |\}}t| jst||| j | jdS tj|j	d d tj
dS )N)rK   rL   rM   r/   r   )rv   	posteriorr"   isneginfrx   rQ   rw   r   zerosr2   r   rW   rY   rK   rL   r&   r&   r'   r\      s   
zLogEI.eval_acqfr   
rq   r	   rU   r
   rr   r!   rs   r!   r   rV   rk   rl   rm   rn   rX   r\   __classcell__r&   r&   r{   r'   rp   t       rp   c                      ro   )LogPIr   rq   r	   rU   r
   rr   r!   rs   r   rV   c                   rt   rN   ru   rz   r{   r&   r'   rX      r}   zLogPI.__init__rY   r   c                 C  s6   | j |\}}t|| j }tj|| j | S rN   )rv   r~   r   r#   rw   r7   log_ndtrrx   )rW   rY   rK   rL   rP   r&   r&   r'   r\      s   zLogPI.eval_acqfr   r   rk   r   r&   r&   r{   r'   r      r   r   c                      (   e Zd Zd fd	d
ZdddZ  ZS )UCBrq   r	   rU   r
   betar!   r   rV   c                       || _ || _t |j| d S rN   rv   _betary   rX   rS   rW   rq   rU   r   r{   r&   r'   rX         zUCB.__init__rY   r   c                 C  s$   | j |\}}|t| j|  S rN   rv   r~   r   r#   r   r   r&   r&   r'   r\         zUCB.eval_acqfrq   r	   rU   r
   r   r!   r   rV   rk   r   r&   r&   r{   r'   r          
r   c                      r   )LCBrq   r	   rU   r
   r   r!   r   rV   c                   r   rN   r   r   r{   r&   r'   rX      r   zLCB.__init__rY   r   c                 C  s$   | j |\}}|t| j|  S rN   r   r   r&   r&   r'   r\      r   zLCB.eval_acqfr   rk   r   r&   r&   r{   r'   r      r   r   c                      s,   e Zd Z	dd fddZdddZ  ZS )ConstrainedLogEIr   rq   r	   rU   r
   rr   r!   constraints_gpr_listlist[GPRegressor]constraints_threshold_listlist[float]rs   r   rV   c                   sX   t |t |kr
|sJ t| || _ fddt||D | _t |j  d S )Nc                      g | ]\}}t | |qS r&   r   .0rv   rx   rU   rs   r&   r'   
<listcomp>       z-ConstrainedLogEI.__init__.<locals>.<listcomp>)lenrp   _acqfzip_constraints_acqf_listry   rX   rS   )rW   rq   rU   rr   r   r   rs   r{   r   r'   rX      s   
zConstrainedLogEI.__init__rY   r   c                   s$   | j  t fdd| jD  S )Nc                 3      | ]}|  V  qd S rN   r\   r   acqfrY   r&   r'   	<genexpr>   s    

z-ConstrainedLogEI.eval_acqf.<locals>.<genexpr>)r   r\   r9   r   r[   r&   r   r'   r\      s   
zConstrainedLogEI.eval_acqfr   )rq   r	   rU   r
   rr   r!   r   r   r   r   rs   r!   r   rV   rk   r   r&   r&   r{   r'   r      s    r   c                      s,   e Zd Z	dd fddZdddZ  ZS )LogEHVIr   gpr_listr   rU   r
   Y_trainr   n_qmc_samplesr   qmc_seedr   rs   r!   r   rV   c           	        st   d fdd}|| _ || _t jd ||d| _| \| _}|| j t| _t	 
tjdd |D d	d
| d S )Nr   !tuple[torch.Tensor, torch.Tensor]c                    sl       } | t| dd }tj| dd}ttd| d| tj}t||\}}t	| t	| fS )NF)assume_unique_lexsortedr   axisg?g?)
r`   r   r"   r.   	nextaftermaximuminfr   r   r^   )	loss_valspareto_sols	ref_pointlbsubsr   r&   r'   _get_non_dominated_box_bounds   s   
z7LogEHVI.__init__.<locals>._get_non_dominated_box_boundsr/   )r   r   r   c                 S     g | ]}|j qS r&   rS   r   rq   r&   r&   r'   r         z$LogEHVI.__init__.<locals>.<listcomp>r   r   )r   r   )rw   	_gpr_listr(   r2   _fixed_samples_non_dominated_box_lower_bounds
clamp_min_r6   _non_dominated_box_intervalsry   rX   r"   rK   )	rW   r   rU   r   r   r   rs   r   non_dominated_box_upper_boundsr{   r   r'   rX      s   	
&zLogEHVI.__init__rY   c                 C  sv   g }t | jD ]%\}}||\}}t|| j }||d |d | jd|f    qttj	|dd| j
| jdS )N).N.r/   r0   )r)   r*   r+   )	enumerater   r~   r   r#   rw   appendr   r<   stackr   r   )rW   rY   r)   irq   rK   rL   stdevr&   r&   r'   r\     s   &zLogEHVI.eval_acqfr   )r   r   rU   r
   r   r   r   r   r   r   rs   r!   r   rV   rk   r   r&   r&   r{   r'   r      s    $r   c                      s,   e Zd Z	dd fddZdddZ  ZS )ConstrainedLogEHVIr   r   r   rU   r
   
Y_feasibletorch.Tensor | Noner   r   r   r   r   r   r   rs   r!   r   rV   c	           	        sz   t |t |kr
|sJ |d urt| |||nd | _ fddt||D | _t tjdd |D dd  d S )Nc                   r   r&   r   r   r   r&   r'   r   -  r   z/ConstrainedLogEHVI.__init__.<locals>.<listcomp>c                 S  r   r&   r   r   r&   r&   r'   r   5  r   r   r   )	r   r   r   r   r   ry   rX   r"   rK   )	rW   r   rU   r   r   r   r   r   rs   r{   r   r'   rX     s   &zConstrainedLogEHVI.__init__rY   r   c                   s>   t  fdd| jD }| jd u rttj|S || j  S )Nc                 3  r   rN   r   r   r   r&   r'   r   8  s    z/ConstrainedLogEHVI.eval_acqf.<locals>.<genexpr>)r9   r   r   r   r   Tensorr\   )rW   rY   constraints_acqf_valuesr&   r   r'   r\   7  s   
zConstrainedLogEHVI.eval_acqfr   )r   r   rU   r
   r   r   r   r   r   r   r   r   r   r   rs   r!   r   rV   rk   r   r&   r&   r{   r'   r     s    
r   )r   r   r   r   r   r   r   r   )r)   r   r*   r   r+   r   r   r   )r=   r   r   r   )rK   r   rL   r   rM   r!   r   r   )*
__future__r   abcr   r   mathtypingr   r   r`   r"   optuna._hypervolumer   optuna.study._multi_objectiver   r   optuna._gp.gpr	   optuna._gp.search_spacer
   optuna._importsr   r#   r?   pirA   rD   r1   rC   r6   r(   r<   rJ   rQ   rR   rp   r   r   r   r   r   r   r&   r&   r&   r'   <module>   s@    




: