o
    /wi-                     @  s$  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	Z
d dlmZ er=d dlmZ d dlmZ d dlZnd dlmZ ed	Zed
ZeeZd:ddZG dd dejjZd;ddZeddG dd dZd<ddZd=d d!Zd>d'd(Zd?d*d+Z d@d4d5Z!		6dAdBd8d9Z"dS )C    )annotations)	dataclassN)Any)TYPE_CHECKING)
get_logger)Callable)_LazyImportzscipy.optimizetorchvalues
np.ndarrayreturnc                 C  s   t | }t |r| S td t j|dd}t | t |t jt || t j	dddt |t j
t || t j	 dddS )NzDClip non-finite values to the min/max finite values for GP fittings.r   )axis        )npisfiniteallwarningswarnanyclipwheremininfmax)r
   is_values_finiteis_any_finite r   J/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/optuna/_gp/gp.pywarn_and_convert_inf)   s   


"$r   c                   @  s(   e Zd ZedddZedd	d
ZdS )Matern52Kernelctxr   squared_distancetorch.Tensorr   c                 C  sL   t d| }t | }|d| | d  }d|d  | }| | |S )N   g?   g)r	   sqrtexpsave_for_backward)r    r!   sqrt5dexp_partvalderivr   r   r   forward:   s   
zMatern52Kernel.forwardgradc                 C  s   | j \}|| S N)saved_tensors)r    r-   r+   r   r   r   backwardD   s   zMatern52Kernel.backwardN)r    r   r!   r"   r   r"   )r    r   r-   r"   r   r"   )__name__
__module____qualname__staticmethodr,   r0   r   r   r   r   r   9   s
    	r   r!   r"   c                 C  s
   t | S r.   )r   apply)r!   r   r   r   %matern52_kernel_from_squared_distanceL   s   
r6   T)frozenc                   @  s&   e Zd ZU ded< ded< ded< dS )KernelParamsTensorr"   inverse_squared_lengthscaleskernel_scale	noise_varN)r1   r2   r3   __annotations__r   r   r   r   r8   U   s   
 r8   is_categoricalkernel_paramsX1X2c                 C  st   |dd d d d d f |dd d d d d f  d }|d| f dk tj|d| f< ||j jdd}t||j S )N.   r   dim)typer	   float64r9   sumr6   r:   )r=   r>   r?   r@   d2r   r   r   kernel]   s   4 rI   c                 C  s   | j S r.   )r:   )r>   r   r   r   kernel_at_zero_distanceq   s   rJ   Xcov_Y_Y_invcov_Y_Y_inv_Yx!tuple[torch.Tensor, torch.Tensor]c           
      C  sd   t || |dd d d f |ddd d f }t| }|| }||||  jdd }	|tj|	ddfS )N.r   rB   rC   r   )r   )rI   rJ   rG   r	   clamp)
r>   rK   r=   rL   rM   rN   	cov_fx_fX	cov_fx_fxmeanvarr   r   r   	posteriorx   s
   *rU   Yc                 C  s   t ||| | }tj||jtj| jd tjd  }dtt	|
  }tjj||d d d f ddd d df }d|| jd tdtj   ||   S )Nr   dtyperA   F)upperg      )rI   r	   linalgcholeskyr;   eyeshaperF   logdiagrG   solve_triangularmathpi)rK   rV   r=   r>   	cov_fX_fXcov_Y_Y_chollogdetcov_Y_Y_chol_inv_Yr   r   r   marginal_log_likelihood   s   	*rg   	log_prior,Callable[[KernelParamsTensor], torch.Tensor]minimum_noisefloatdeterministic_objectiveboolinitial_kernel_paramsgtolc              	     s    j d tt|j  t|j t|j	 d  gg}d fdd}	t
j|	|d	d
d|id}
|
jsJtd|
j t|
j}tt|d  t| ritjtjdn
t|d   d}
|
S )Nr$   gGz?
raw_paramsr   r   tuple[float, np.ndarray]c              	     s   t | }|d t  V tt |d  t | r(t jt jdn
t |d   d}tt  t t | | }|	  |j
d  }r]|dks]J W d    n1 sgw   Y  | |j
  fS )NTrW   r$   r9   r:   r;   r   )r	   
from_numpyrequires_grad_enable_gradr8   r&   tensorrF   rg   r0   r-   itemdetachnumpy)rp   raw_params_tensorparamslossraw_noise_var_gradrK   rV   rl   r=   rh   rj   n_paramsr   r   	loss_func   s*   


	z%_fit_kernel_params.<locals>.loss_funcTzl-bfgs-bro   )jacmethodoptionszOptimization failed: rW   rr   )rp   r   r   rq   )r]   r   concatenater^   r9   rx   ry   r:   rw   r;   sominimizesuccessRuntimeErrormessager	   rs   rN   r8   r&   rv   rF   )rK   rV   r=   rh   rj   rl   rn   ro   initial_raw_paramsr   resraw_params_opt_tensorr   r~   r   _fit_kernel_params   s6   

	r   {Gz?KernelParamsTensor | Nonec                 C  s   t tj| jd tjdtjdtjdtjdtjdd}|d u r"|}d }	||fD ]%}
zt| |||||
||dW   S  tyM } z|}	W Y d }~q(d }~ww t	d|	 d |S )Nr$   rW   g      ?rr   )rK   rV   r=   rh   rj   rn   rl   ro   z+The optimization of kernel_params failed: 
z8
The default initial kernel params will be used instead.)
r8   r	   onesr]   rF   rv   r   r   loggerwarning)rK   rV   r=   rh   rj   rl   rn   ro   default_initial_kernel_paramserrorinit_kernel_paramser   r   r   fit_kernel_params   s8   


r   )r
   r   r   r   )r!   r"   r   r"   )
r=   r"   r>   r8   r?   r"   r@   r"   r   r"   )r>   r8   r   r"   )r>   r8   rK   r"   r=   r"   rL   r"   rM   r"   rN   r"   r   rO   )
rK   r"   rV   r"   r=   r"   r>   r8   r   r"   )rK   r   rV   r   r=   r   rh   ri   rj   rk   rl   rm   rn   r8   ro   rk   r   r8   )Nr   )rK   r   rV   r   r=   r   rh   ri   rj   rk   rl   rm   rn   r   ro   rk   r   r8   )#
__future__r   dataclassesr   ra   typingr   r   r   ry   r   optuna.loggingr   collections.abcr   scipy.optimizeoptimizer   r	   optuna._importsr   r1   r   r   autogradFunctionr   r6   r8   rI   rJ   rU   rg   r   r   r   r   r   r   <module>   s:    


	




S