o
    /wi58                     @  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	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rQd dlZn
d dlmZ edZdQddZdRddZdSddZdTd$d%ZdTd&d'ZdUd)d*ZdUd+d,ZG d-d. d.eZ ed/d0G d1d2 d2Z!ed/d0G d3d4 d4e!Z"ed/d0G d5d6 d6e!Z#			7dVdWdCdDZ$dXdGdHZ%dYdJdKZ&dZdLdMZ'd[dOdPZ(dS )\    )annotations)	dataclass)IntEnumN)TYPE_CHECKING)kernel)KernelParamsTensor)	posterior)	ScaleType)SearchSpace)get_non_dominated_box_bounds)_is_pareto_front)_LazyImporttorch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   quasirandomSobolEnginedrawfloat64erfinvfloatnpsqrt)r   r   r   sobol_samplessamples r&   L/home/ubuntu/sommelier/.venv/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_upper_boundsc              
   C  sl   t t| jd }tjdtjd}t|t| dtj	d d f || }tj
j| jdddd| S )N-q=r   .r   )r,   r.   )r!   r"   logshaper   tensorr   maximumminimumnewaxisspecial	logsumexpsum)r)   r*   r+   log_n_qmc_samples_EPSdiffr&   r&   r'   logehvi'   s    r<   zc           	      C  s   | dk }t | }| | }| |  }tdtj }dt j| td  }t d|d  d|  }t || | || < tdtj t j	| td  }d|d  t || d d|   ||< |S )Nir   r   g         )
r   
empty_likemathr#   pir6   erfcexpr0   erfcx)	r=   smallvalsz_smallz_normalsqrt_2picdfpdfrr&   r&   r'   standard_logei?   s   

(*rM   meanvarf0r!   c                 C  s,   t |}t| | | }t || }|S N)r   r#   rM   r0   )rN   rO   rP   sigmast_valvalr&   r&   r'   logeiV   s   
rU   c                 C  s   t |}t j||  | S rQ   )r   r#   r6   log_ndtr)rN   rO   rP   rR   r&   r&   r'   logpi^   s   
rW   betac                 C  s   | t ||  S rQ   r   r#   rN   rO   rX   r&   r&   r'   ucbf      r[   c                 C  s   | t ||  S rQ   rY   rZ   r&   r&   r'   lcbj   r\   r]   c                   @  s    e Zd ZdZdZdZdZdZdS )AcquisitionFunctionTyper   r>   r         N)__name__
__module____qualname__LOG_EIUCBLCBLOG_PILOG_EHVIr&   r&   r&   r'   r^   p   s    r^   T)frozenc                   @  sV   e Zd ZU ded< ded< ded< ded< ded	< ded
< ded< ded< ded< dS )AcquisitionFunctionParamsr^   	acqf_typer   kernel_params
np.ndarrayXr
   search_spacecov_Y_Y_invcov_Y_Y_inv_Yr!   max_Yfloat | NonerX   acqf_stabilizing_noiseN)ra   rb   rc   __annotations__r&   r&   r&   r'   rj   x   s   
 rj   c                   @  s$   e Zd ZU ded< ed	ddZdS )
$ConstrainedAcquisitionFunctionParamslist[AcquisitionFunctionParams]acqf_params_for_constraintsacqf_paramsrj   r   c                 C  s.   | |j |j|j|j|j|j|j|j|j|d
S )N)
rk   rl   rn   ro   rp   rq   rr   rX   rt   rx   	rk   rl   rn   ro   rp   rq   rr   rX   rt   )clsry   rx   r&   r&   r'   from_acqf_params   s   z5ConstrainedAcquisitionFunctionParams.from_acqf_paramsN)ry   rj   rx   rw   r   rv   ra   rb   rc   ru   classmethodr|   r&   r&   r&   r'   rv      s   
 rv   c                   @  s<   e Zd ZU ded< ded< ded< ded< edddZdS )'MultiObjectiveAcquisitionFunctionParamsrw   acqf_params_for_objectivesr   r*   r+   fixed_samplesYrm   n_qmc_samplesr   qmc_seedr   r   c                   s   d fdd}t  jd ||d}| \}}tjdd |D d	d
}	ttd|	d  td	td	d}
|d	 }| tj	|j
|j|j|||||
td	td	tjd dS )Nr   !tuple[torch.Tensor, torch.Tensor]c                    sh     } | 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"   max	nextafterr3   infr   r   
from_numpy)	loss_valspareto_sols	ref_pointlbsubsr   r&   r'   _get_non_dominated_box_bounds   s   z_MultiObjectiveAcquisitionFunctionParams.from_acqf_params.<locals>._get_non_dominated_box_boundsr.   )r   r   r   c                 S  s&   g | ]}d t |jj   qS )r>   )r"   r#   rl   inverse_squared_lengthscalesdetachnumpy).0ry   r&   r&   r'   
<listcomp>   s    zLMultiObjectiveAcquisitionFunctionParams.from_acqf_params.<locals>.<listcomp>r   r   g      ?r   )r   kernel_scale	noise_var)rk   rn   ro   rt   r   r*   r+   r   rl   rp   rq   rr   rX   )r   r   )r(   r1   r"   rN   r   r   r   emptyr^   rh   rn   ro   rt   nan)r{   r   r   r   r   r   r   r*   r+   mean_lengthscalesdummy_kernel_paramsrepr_acqf_paramsr&   r   r'   r|      sB   	z8MultiObjectiveAcquisitionFunctionParams.from_acqf_paramsN)
r   rw   r   rm   r   r   r   r   r   r   r}   r&   r&   r&   r'   r      s   
 r   r-   rk   rl   r   ro   r
   rn   rm   r   rr   rs   rt   c                 C  s   t |}t |jtjk}	t   t|	|||  }
W d    n1 s(w   Y  |
t	
|jd   |j 7  < t	j|
}t| |||||| |d urS|nt	|||d	S )Nr   rz   )r   r   scale_typesr	   CATEGORICALno_gradr   r   r   r"   diag_indicesr1   r   itemlinalginvrj   r   )rk   rl   ro   rn   r   rr   rX   rt   X_tensoris_categoricalcov_Y_Yrp   r&   r&   r'   create_acqf_params   s$   


"r   ehvi_acqf_paramsxc              	   C  s   t | j}t | jjtjk}g }| j}t| j	D ]8\}}t
|j||t |jt |j|d\}}	t |	| j }
||dt jf |
dt jf |d|f    qtt j|dd| j| jdS )N)rl   rn   r   rp   rq   r   .r.   r/   )r)   r*   r+   )r   r   rn   ro   r   r	   r   r   	enumerater   r   rl   rp   rq   r#   rt   appendr5   r<   stackr*   r+   )r   r   rn   r   r)   r   iry   rN   rO   stdevr&   r&   r'   
_eval_ehvi  s,   


0r   ry   c                   s`  | j tjkrt| tsJ t|  dS t| jt	| j
t	| jjtjkt	| jt	| j \}}| j tjkrSt| jsJt||| j | jdntjdtjd}nF| j tjkret||| j | jd}n4| j tjkr}| jd ustJ dt||| jd}n| j tjkr| jd usJ dt||| jd}nJ d	t| t rt! fd
d| j"D }|| S |S )N)r   r   )rN   rO   rP   g        r   zbeta must be given to UCB.rZ   zbeta must be given to LCB.Fz"Unknown acquisition function type.c                 3  s    | ]}t | V  qd S rQ   )	eval_acqf)r   paramsr   r&   r'   	<genexpr>H  s    zeval_acqf.<locals>.<genexpr>)#rk   r^   rh   
isinstancer   r   r   rl   r   r   rn   ro   r   r	   r   rp   rq   rd   r"   isneginfrr   rU   rt   r2   r   rg   rW   re   rX   r[   rf   r]   rv   r8   rx   )ry   r   rN   rO   f_valc_valr&   r   r'   r   $  s>   


	

r   c                 C  sD   t   t| t |  W  d    S 1 sw   Y  d S rQ   )r   r   r   r   r   r   )ry   r   r&   r&   r'   eval_acqf_no_gradN  s   
$r   tuple[float, np.ndarray]c                 C  sJ   |j dksJ t|}|d t| |}|  | |j 	 fS )Nr>   T)
ndimr   r   requires_grad_r   backwardr   gradr   r   )ry   r   x_tensorrT   r&   r&   r'   eval_acqf_with_gradS  s   


r   )r   r   r   r   r   r   r   r   )r)   r   r*   r   r+   r   r   r   )r=   r   r   r   )rN   r   rO   r   rP   r!   r   r   )rN   r   rO   r   rX   r!   r   r   )NNr-   )rk   r^   rl   r   ro   r
   rn   rm   r   rm   rr   rs   rX   rs   rt   r!   r   rj   )r   r   r   r   r   r   )ry   rj   r   r   r   r   )ry   rj   r   rm   r   rm   )ry   rj   r   rm   r   r   ))
__future__r   dataclassesr   enumr   r@   typingr   r   r"   optuna._gp.gpr   r   r   optuna._gp.search_spacer	   r
   optuna._hypervolumer   optuna.study._multi_objectiver   r   optuna._importsr   r(   r<   rM   rU   rW   r[   r]   r^   rj   rv   r   r   r   r   r   r   r&   r&   r&   r'   <module>   sN    







H

#
*