U
    3d6C                     @   s\  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 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mZ d dlmZ ddddgZddgZdd Zdd Zdd Zdd Zdd Zdd Zdd Zeed d!d" Zd#d$ Z eed d%d& Z!eed d'd( Z"ej#$d)ej#%d*d+d,d-d.gd/d0 Z&d1d2 Z'd3d4 Z(dS )5    N)gammaln)assert_almost_equal)assert_array_equal)adjusted_rand_score)_log_dirichlet_norm)_log_wishart_norm)BayesianGaussianMixture)
RandomData)ConvergenceWarningNotFittedError)ignore_warningsfulltieddiag	sphericaldirichlet_processdirichlet_distributionc                  C   sH   t jd} | d}tt |t t| }t|}t|| d S )Nr      )nprandomRandomStaterandr   sumr   r   )rngZweight_concentrationexpected_normpredected_norm r   O/tmp/pip-unpacked-wheel-zrfo1fqw/sklearn/mixture/tests/test_bayesian_mixture.pytest_log_dirichlet_norm   s    
r   c            
      C   s   t jd} d\}}t | |d }|t tdd|  }t d}tt	||D ]Z\}\}}||d| t d   t 
td|t d|d d t jf   d  ||< qXt|||}	t||	 d S )Nr   )   r         ?r   r   g      ?g       @)r   r   r   absr   lograngeempty	enumeratezipr   r   Zarangenewaxisr   r   )
r   n_components
n_featuresZdegrees_of_freedomZlog_det_precisions_cholr   kZdegrees_of_freedom_kZ	log_det_kr   r   r   r   test_log_wishart_norm)   s2    


  r+   c                  C   sn   t jd} d\}}}| ||}|  }t|| d|}t||j t|| d|}td| |j d S )Nr   )
   r   r   )weight_concentration_priorrandom_stater(   r.   r    )r   r   r   r   r   fitr   Zweight_concentration_prior_)r   	n_samplesr(   r)   Xr-   bgmmr   r   r   2test_bayesian_mixture_weights_prior_initialisationE   s    
 r4   c                  C   s   t jd} d\}}}| ||}|  }t|| d|}t||j t| d|}td|j | |}t||| d|}t||j t|| d|}t|j	dd|j d S )	Nr   )r,      r   )mean_precision_priorr.   r.   r    )r(   
mean_priorr.   r/   axis)
r   r   r   r   r   r0   r   Zmean_precision_prior_Zmean_prior_mean)r   r1   r(   r)   r2   r6   r3   r8   r   r   r   /test_bayesian_mixture_mean_prior_initialisationV   s0    
 
  r<   c               
   C   s  t jd} d\}}| ||}|d }t|| d}d|d  d|dd	}tjt|d
 || W 5 Q R X |  | d }t|| d|}t	||j
 |}t|| d|}t	||j
 t j|jddd t j|jddd t t t j|jddd |  d}	t| d}dD ]0}
|
|_|	|
 |_|| t	|	|
 |j qt t |jt t |jt j|dddt j|ddd d}tdd}dD ]&}
|
|_|| t	||
 |j qd S )Nr   r,   r   r    )degrees_of_freedom_priorr.   z@The parameter 'degrees_of_freedom_prior' should be greater than    z
, but got z.3f.match)Zbiasr,   r   r5   )r   r   r   r   r7   )r:   Zddof)r   r   r   r   r   pytestraises
ValueErrorr0   r   Zdegrees_of_freedom_prior_covTr   Z
atleast_2dcovariance_typecovariance_priorZcovariance_prior_varr;   )r   r1   r)   r2   Zbad_degrees_of_freedom_prior_r3   msgr>   Z degrees_of_freedom_prior_defaultrI   Zcov_typeZcovariance_prior_defaultr   r   r   5test_bayesian_mixture_precisions_prior_initialisationr   sh        




rL   c               	   C   sV   t jd} d\}}t| d}| ||}d}tjt|d || W 5 Q R X d S )Nr   r=   r7   z8This BayesianGaussianMixture instance is not fitted yet.rA   )	r   r   r   r   r   rC   rD   rE   Zscore)r   r1   r)   r3   r2   rK   r   r   r   %test_bayesian_mixture_check_is_fitted   s    
rM   c            	   	   C   s   t jd} d\}}| ||}tdd| d|}|jt |j }t||j	 tt |j	d tdd| d|}|jd |jd  }|jd | }|jd | t 
dt |d d	 f }|t | }t||j	 tt |j	d d S )
Nr   r=   r   r5   )weight_concentration_prior_typer(   r.   r    r   r?   )r   r   r   r   r   r0   Zweight_concentration_r   r   weights_ZhstackZcumprod)	r   r1   r)   r2   r3   Zexpected_weightsZdpgmmZweight_dirichlet_sumtmpr   r   r   test_bayesian_mixture_weights   s@    rR   )categoryc            
      C   s   t jd} t| dd}|j}tD ]x}tD ]n}|j| }t|d| |dd| dd}t j	 }t
d	D ]*}|}	||j}||	kst|jrb qqb|js*tq*q"d S )
Nr      scaler   Tr?   MbP?)rN   r(   rH   Z
warm_startmax_iterr.   toliX  )r   r   r   r	   r(   
PRIOR_TYPECOVARIANCE_TYPEr2   r   Zinftyr#   r0   Zlower_bound_AssertionErrorZ
converged_)
r   	rand_datar(   
prior_type
covar_typer2   r3   Zcurrent_lower_bound_Zprev_lower_boundr   r   r   test_monotonic_likelihood   s.    
	ra   c            
   	   C   s  t jd} t| dd}|jd }|j}tD ]j}t|d| ddddd}|| |	|t jd |j
|jd d t jt jf  }t|d| d	dddd}|| |	|t jd |j
|j }t|t |d t|d| d
dddd}|| |	|t jd |j
|jd d t jf  }t|t dd |D  t|d| ddddd}|| |	|t jd |j
|j }	t|	t |d q,d S )Nr      rU   r   r   r?   Hz>)rN   r(   rH   rX   r.   rY   r   r   c                 S   s   g | ]}t |qS r   )r   r   ).0rF   r   r   r   
<listcomp>9  s     z+test_compare_covar_type.<locals>.<listcomp>r   )r   r   r   r	   r2   r(   rZ   r   Z_check_parametersZ_initialize_parameterscovariances_Zdegrees_of_freedom_r'   r   r;   array)
r   r]   r2   r(   r^   r3   Zfull_covariancesZtied_covarianceZdiag_covariancesZspherical_covariancesr   r   r   test_compare_covar_type  sp    




 
rh   c                  C   s   t jd} t| dd}d|j d }}t|d| ddd}tD ]}||_||j	|  |dkrt
|j|jD ] \}}tt ||t | qnq>|d	krtt |j|jt | q>|d
krt|j|j t ||f q>t|j|j t | q>d S )Nr   rb   rU   r   d   rW   r(   rX   r.   rY   	reg_covarr   r   r   )r   r   r   r	   r(   r   r[   rH   r0   r2   r&   rf   Zprecisions_r   dotZeyeZones)r   r]   r(   r)   r3   r_   ZcovarZ	precisionr   r   r   test_check_covariance_precisionL  s<         

 rm   c               
   C   s   t jd} t| dd}d|j }tD ]~}tD ]t}|j| }t||ddddd	|}t||ddddd	|d }t
|j|jd  t
|j|j t
|j|j q.q&d S )Nr   ri   rU   r   rW   )rN   r(   rX   r.   rY   rk   )r   r   r   r	   r(   rZ   r[   r2   r   r0   r   Zmeans_rP   rf   )r   r]   r(   r^   r_   r2   bgmm1bgmm2r   r   r   test_invariant_translationp  s:    

	rp   zignore:.*did not converge.*zseed, max_iter, tol)r   r   rc   )r?   r   皙?)r5   ,  rc   )   rr   rq   c                 C   s   t j| }t|ddd}d|j }tD ]T}t||||dd}||_t	|}|j
| }	||	|	}
||	}t|
| q(d S )N2   rb   )r1   rV   r   r   rj   )r   r   r   r	   r(   r[   r   rH   copydeepcopyr2   r0   predictfit_predictr   )seedrX   rY   r   r]   r(   r_   rn   ro   r2   ZY_pred1ZY_pred2r   r   r   !test_bayesian_mixture_fit_predict  s"    



rz   c                  C   sD   t jddd} tdddd}|| }|| }t|| d S )Nr   rt   r   r,   )r(   Zn_initr.   )r   r   r   Zrandnr   rx   rw   r   )r2   ZgmZy_pred1Zy_pred2r   r   r   (test_bayesian_mixture_fit_predict_n_init  s
    

r{   c            
      C   s   t jd} t| }tD ]}tD ]}|j| }|j}t|j	| ||d}d}t
jt|d || W 5 Q R X || ||}||jdd}	t||	 t||dks tq qd S )Nr   )r(   r.   rN   rH   z{This BayesianGaussianMixture instance is not fitted yet. Call 'fit' with appropriate arguments before using this estimator.rA   r?   r9   gffffff?)r   r   r   r	   rZ   r[   r2   Yr   r(   rC   rD   r   rw   r0   Zpredict_probaZargmaxr   r   r\   )
r   r]   r^   r_   r2   r|   r3   rK   ZY_predZY_pred_probar   r   r   +test_bayesian_mixture_predict_predict_proba  s*    
	


r}   ))ru   Znumpyr   Zscipy.specialr   rC   Zsklearn.utils._testingr   r   Zsklearn.metrics.clusterr   Z!sklearn.mixture._bayesian_mixturer   r   Zsklearn.mixturer   Z+sklearn.mixture.tests.test_gaussian_mixturer	   Zsklearn.exceptionsr
   r   r   r[   rZ   r   r+   r4   r<   rL   rM   rR   ra   rh   rm   rp   markfilterwarningsZparametrizerz   r{   r}   r   r   r   r   <module>   sP   ?%
 H
#
 
		