U
    3d&                     @   sX  d Z ddlZddlZddlmZ ddlZddlmZ ddl	m
Z
mZmZmZ ddlmZ ddlmZ ddlmZmZ d	d
 ZeedddjZedddddgjZejee dkedZee Z ej!ej"edZ#de#e dk < de#e dke dk @ < de#e dk< e
dddZ$e
dde$e
dddedde
ddd gZ%dd e%D Z&ej'(d e%d!d" Z)d#d$ Z*ej'(d e&d%d& Z+ej'(d e%d'd( Z,ej'(d e%d)d* Z-ej'(d e&d+d, Z.ej'(d e%d-d. Z/d/d0 Z0ej'(d e&d1d2 Z1ej'(d e%d3d4 Z2ej'(d e%d5d6 Z3d7d8 Z4ej'(d9d edie5d:fgd;d< Z6dS )=z,Testing for Gaussian process classification     N)approx_fprime)GaussianProcessClassifier)RBFCompoundKernelConstantKernelWhiteKernel)MiniSeqKernel)ConvergenceWarning)assert_almost_equalassert_array_equalc                 C   s
   t | S )N)npsin)x r   K/tmp/pip-unpacked-wheel-zrfo1fqw/sklearn/gaussian_process/tests/test_gpc.pyf   s    r   
             @g      @g      @g      @g      @Zdtypegffffffֿ   gffffff?         ?fixedlength_scalelength_scale_boundsg?)r   )MbP?     @@g{Gz?      Y@c                 C   s   g | ]}|t kr|qS r   )fixed_kernel).0kernelr   r   r   
<listcomp>/   s      r$   r#   c                 C   s<   t | dtt}t|t|td d df dk d S )Nr#   r         ?)r   fitXyr   predictpredict_probar#   gpcr   r   r   test_predict_consistent2   s    r.   c                  C   s`   dddg} t dddg}tdd}t|d| |}t|| || d d d	f d
k d S )NAZABBTFr   )Zbaseline_similarity_boundsr%   r   r&   )r   arrayr   r   r'   r   r*   r+   )r(   r)   r#   r-   r   r   r   "test_predict_consistent_structured9   s
    

r2   c                 C   s4   t | dtt}||jj|| jks0td S )Nr%   )r   r'   r(   r)   log_marginal_likelihoodkernel_thetaAssertionErrorr,   r   r   r   test_lml_improvingB   s    r7   c                 C   s0   t | dtt}t||jj| d d S )Nr%      )r   r'   r(   r)   r
   r3   r4   r5   r,   r   r   r   test_lml_precomputedK   s      r9   c                 C   sJ   t | dtt}tj|jjjtj	d}|j
|dd t|jj|d d S )Nr%   r   F)Zclone_kernelr8   )r   r'   r(   r)   r   Zonesr4   r5   shapeZfloat64r3   r
   )r#   r-   Zinput_thetar   r   r   test_lml_without_cloning_kernelT   s    r;   c                 C   sz   t | dtt}||jjd\}}tt	|dk |jj|jj
d d df kB |jj|jj
d d df kB svtd S )Nr%   T-C6?r   r   )r   r'   r(   r)   r3   r4   r5   r   allabsboundsr6   )r#   r-   lmllml_gradientr   r   r   test_converged_to_local_maximum^   s    rB   c                    sJ   t | dtt  | jd\}}t| j fddd}t||d d S )Nr%   Tc                    s     | dS )NF)r3   )r5   r-   r   r   <lambda>s       z#test_lml_gradient.<locals>.<lambda>g|=   )r   r'   r(   r)   r3   r5   r   r
   )r#   r@   rA   Zlml_gradient_approxr   rC   r   test_lml_gradientl   s     
 rG   c            
      C   s   d\} }t jd}|| |d d }t |jddt d| jdd dk}tddtd	g| d
g| d }t j }t	dD ]F}t
||dd||}||jj}	|	|t t jj kst|	}qd S )N)   r   r   r   r   )ZaxisrF   r   r   r   )r<   r    r      )r#   n_restarts_optimizerZrandom_state)r   randomRandomStateZrandnr   sumCr   infranger   r'   r3   r4   r5   ZfinfoZfloat32Zepsr6   )
Z	n_samplesZ
n_featuresrngr(   r)   r#   Zlast_lmlrJ   Zgpr@   r   r   r   test_random_startsy   s*    ,
    rR   c                 C   sB   dd }t | |d}|tt ||jj|| jks>td S )Nc           	      S   s   t jd}|| |dd }}tdD ]\}t |t d|d d df t d|d d df }| |dd}||k r&|| }}q&||fS )Nr   F)Zeval_gradientr   r   )r   rK   rL   rP   Z
atleast_1duniformmaximumZminimum)	Zobj_funcZinitial_thetar?   rQ   Z	theta_optZfunc_min_r5   r   r   r   r   	optimizer   s     
2z(test_custom_optimizer.<locals>.optimizer)r#   rW   )r   r'   r(   y_mcr3   r4   r5   r6   )r#   rW   r-   r   r   r   test_custom_optimizer   s    rY   c                 C   sP   t | d}|tt |t}t|dd |t}t	t
|d| d S )Nr%   r   )r   r'   r(   rX   r+   X2r
   rM   r*   r   r   Zargmax)r#   r-   y_probZy_predr   r   r   test_multi_class   s    


r\   c                 C   sP   t | d}|tt t | dd}|tt |t}|t}t|| d S )Nr%   r   )r#   Zn_jobs)r   r'   r(   rX   r+   rZ   r
   )r#   r-   Zgpc_2r[   Zy_prob_2r   r   r   test_multi_class_n_jobs   s    


r]   c            	   	   C   s  t ddgd} t| d}d}tjt|d |tt W 5 Q R X tddgdt dd	gd }t|d}t	j
d
d}t	d |tt t|dkstt|d jtst|d jjd dkstt|d jtst|d jjd dkstW 5 Q R X ttd}t ddgddgd}t|d}t	j
d
d}t	d ||t t|dks^tt|d jtstt|d jjd dkstt|d jtst|d jjd dkstW 5 Q R X d S )Ngh㈵>r   )r   r%   zThe optimal value found for dimension 0 of parameter length_scale is close to the specified upper bound 0.001. Increasing the bound and calling fit again may find a better value.match)Znoise_level_boundsr   g     j@T)recordalwaysr   r   zThe optimal value found for dimension 0 of parameter k1__noise_level is close to the specified upper bound 0.001. Increasing the bound and calling fit again may find a better value.r   zThe optimal value found for dimension 0 of parameter k2__length_scale is close to the specified lower bound 1000.0. Decreasing the bound and calling fit again may find a better value.r   r   g      $@r    r   zThe optimal value found for dimension 0 of parameter length_scale is close to the specified upper bound 100.0. Increasing the bound and calling fit again may find a better value.zThe optimal value found for dimension 1 of parameter length_scale is close to the specified upper bound 100.0. Increasing the bound and calling fit again may find a better value.)r   r   pytestZwarnsr	   r'   r(   r)   r   warningscatch_warningssimplefilterlenr6   
issubclasscategorymessageargsr   Ztile)	r#   r-   Zwarning_messageZ
kernel_sumZgpc_sumr`   ZX_tileZkernel_dimsZgpc_dimsr   r   r   test_warning_bounds   sR    







rk   zparams, error_type, err_msgz!kernel cannot be a CompoundKernelc              	   C   s4   t f | }tj||d |tt W 5 Q R X dS )z0Check that expected error are raised during fit.r^   N)r   rb   Zraisesr'   r(   r)   )paramsZ
error_typeerr_msgr-   r   r   r   test_gpc_fit_error  s    
rn   )7__doc__rc   Znumpyr   Zscipy.optimizer   rb   Zsklearn.gaussian_processr   Z sklearn.gaussian_process.kernelsr   r   r   rN   r   Z4sklearn.gaussian_process.tests._mini_sequence_kernelr   Zsklearn.exceptionsr	   Zsklearn.utils._testingr
   r   r   Z
atleast_2dZlinspaceTr(   rZ   r1   Zravelintr)   ZfXemptyr:   rX   r!   ZkernelsZnon_fixed_kernelsmarkZparametrizer.   r2   r7   r9   r;   rB   rG   rR   rY   r\   r]   rk   
ValueErrorrn   r   r   r   r   <module>   sn   

	


	




M

