U
    ½mœd¤¯  ã                   @   sÞ  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	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mZmZmZmZmZ d d
lm Z 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ddgZ*dd„ Z+G dd„ dƒZ,dd„ Z-dd„ Z.dd„ Z/dd „ Z0d!d"„ Z1d#d$„ Z2d%d&„ Z3d'd(„ Z4d)d*„ Z5d+d,„ Z6d-d.„ Z7d/d0„ Z8d1d2„ Z9ej: ;d3¡ej: <d4d5d6d7d8g¡d9d:„ ƒƒZ=d;d<„ Z>d=d>„ Z?d?d@„ Z@dAdB„ ZAdCdD„ ZBdEdF„ ZCdGdH„ ZDdIdJ„ ZEdKdL„ ZFej: ;d3¡ej: <dMdN¡dOdP„ ƒƒZGe)e dQ�dRdS„ ƒZHdTdU„ ZIdVdW„ ZJdXdY„ ZKdZd[„ ZLd\d]„ ZMd^d_„ ZNe)e dQ�d`da„ ƒZOdbdc„ ZPej: <dddedfdgdhg¡didj„ ƒZQej: <dddedfdgdhg¡dkdl„ ƒZRdmdn„ ZSdodp„ ZTdqdr„ ZUdS )sé    N)ÚstatsÚlinalg)ÚKMeans)ÚEmpiricalCovariance©Úmake_spd_matrix)ÚStringIO)Úadjusted_rand_score)ÚGaussianMixture)Ú#_estimate_gaussian_covariances_fullÚ#_estimate_gaussian_covariances_tiedÚ#_estimate_gaussian_covariances_diagÚ(_estimate_gaussian_covariances_sphericalÚ_estimate_gaussian_parametersÚ_compute_precision_choleskyÚ_compute_log_det_cholesky)ÚConvergenceWarningÚNotFittedError)Úfast_logdet)Úassert_allclose)Úassert_almost_equal)Úassert_array_almost_equal)Úassert_array_equal)Úignore_warningsÚfullÚtiedÚdiagÚ	sphericalc                 C   sh  t j d¡}g }|dkrhtt|||d ƒƒD ]:\}\}	}
}| | |
|t  |¡ tt  	|	|  ¡ƒ¡¡ q,|dkr¼tt|||d ƒƒD ]6\}\}	}
}| | |
t  
|¡tt  	|	|  ¡ƒ¡¡ q„|dk�rtt||ƒƒD ]2\}\}	}
| | |
|d tt  	|	|  ¡ƒ¡¡ qÔ|dk�rZtt|||d ƒƒD ]2\}\}	}
}| | |
|tt  	|	|  ¡ƒ¡¡ �q&t  |¡}|S )Nr   r   r   r   r   )ÚnpÚrandomÚRandomStateÚ	enumerateÚzipÚappendÚmultivariate_normalÚeyeÚintÚroundr   Úvstack)Ú	n_samplesÚ
n_featuresÚweightsÚmeansÚ
precisionsÚcovariance_typeÚrngÚXÚ_ÚwÚmÚc© r5   úd/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/sklearn/mixture/tests/test_gaussian_mixture.pyÚgenerate_data*   s<    "  ÿÿ" ÿ
  ÿÿ
"&
r7   c                   @   s   e Zd Zddd„ZdS )Ú
RandomDataéÈ   é   é2   c                    s  ˆˆ_ |ˆ_ˆ ˆ_ˆ |¡ˆ_ˆjˆj ¡  ˆ_ˆ |ˆ ¡| ˆ_dˆ |¡ dˆ |ˆ ¡ d tˆ ˆd�t 	‡ ‡fdd„t
|ƒD ƒ¡dœˆ_dˆjd  dˆjd	  t ˆjd
 ¡t 	dd„ ˆjd D ƒ¡dœˆ_ttt‡ ‡‡fdd„tD ƒƒƒˆ_t ‡fdd„tˆjƒD ƒ¡ˆ_d S )Nç      à?r:   ©Úrandom_statec                    s   g | ]}t ˆ ˆd �d ‘qS )r=   r<   r   )Ú.0r1   )r*   r/   r5   r6   Ú
<listcomp>W   s   ÿz'RandomData.__init__.<locals>.<listcomp>©r   r   r   r   ç      ð?r   r   r   c                 S   s   g | ]}t  |¡‘qS r5   ©r   Úinv)r?   Ú
covariancer5   r5   r6   r@   b   s     r   c              	      s$   g | ]}t ˆˆ ˆjˆjˆj|ƒ‘qS r5   )r7   r+   r,   Úcovariances)r?   Ú
covar_type)r*   r)   Úselfr5   r6   r@   i   s   	øúc                    s.   g | ]&\}}t jtt  |ˆ  ¡ƒ|td �‘qS ))Zdtype)r   r   r&   r'   )r?   Úkr2   )r)   r5   r6   r@   w   s   ÿ)r)   Ún_componentsr*   Úrandr+   Úsumr,   r   r   ÚarrayÚrangerF   r   rD   r-   Údictr"   ÚCOVARIANCE_TYPEr0   Zhstackr!   ÚY)rH   r/   r)   rJ   r*   Úscaler5   )r*   r)   r/   rH   r6   Ú__init__J   sF    
þÿüÿü		÷þÿ
þÿzRandomData.__init__N)r9   r:   r:   r;   )Ú__name__Ú
__module__Ú__qualname__rS   r5   r5   r5   r6   r8   I   s   r8   c            
   	   C   s°   t j d¡} |  dd¡}d\}}}}}d\}}t|||||||d� |¡}	|	j|ksXt‚|	j|ksft‚|	j	|kstt‚|	j
|ks‚t‚|	j|ks�t‚|	j|ksžt‚|	j|ks¬t‚d S )Nr   é
   r:   )r:   g-Cëâ6?é   é   çš™™™™™¹?)r   r   )rJ   ÚtolÚn_initÚmax_iterÚ	reg_covarr.   Úinit_params)r   r   r    rK   r
   ÚfitrJ   ÚAssertionErrorr.   r[   r^   r]   r\   r_   )
r/   r0   rJ   r[   r\   r]   r^   r.   r_   Úgmmr5   r5   r6   Ú test_gaussian_mixture_attributes~   s,    ùø
rc   c            
   	   C   sf  t j d¡} t| ƒ}|j}|jd }t|d�}|  |d¡}||_t	 
d|› dt|jƒ› �¡}tjt|d�� | |¡ W 5 Q R X |  |¡d }||_t	 
dt  |¡d	›d
t  |¡d	›�¡}tjt|d�� | |¡ W 5 Q R X |  |¡}|| ¡ d  }||_t	 
dt  |¡d	›�¡}tjt|d�� | |¡ W 5 Q R X |j}	t|	|d�}| |¡ t|	|jƒ d S )Nr   r   ©rJ   é   z2The parameter 'weights' should have the shape of (z,), but got ©ÚmatchzIThe parameter 'weights' should be in the range [0, 1], but got max value z.5fz, min value zEThe parameter 'weights' should be normalized, but got sum(weights) = )Úweights_initrJ   )r   r   r    r8   rJ   r0   r
   rK   rh   ÚreÚescapeÚstrÚshapeÚpytestÚraisesÚ
ValueErrorr`   ÚminÚmaxrL   r+   r   )
r/   Ú	rand_datarJ   r0   ÚgZweights_bad_shapeÚmsgZweights_bad_rangeZweights_bad_normr+   r5   r5   r6   Útest_check_weights™   s>    

ÿÿ
ÿ
ru   c            	   	   C   sš   t j d¡} t| ƒ}|j|j }}|jd }t|d�}|  |d |¡}||_	d}t
jt|d�� | |¡ W 5 Q R X |j}||_	| |¡ t||j	ƒ d S )Nr   r   rd   re   z/The parameter 'means' should have the shape of rf   )r   r   r    r8   rJ   r*   r0   r
   rK   Ú
means_initrm   rn   ro   r`   r,   r   )	r/   rr   rJ   r*   r0   rs   Zmeans_bad_shapert   r,   r5   r5   r6   Útest_check_meansÉ   s    


rw   c               
   C   s’  t j d¡} t| ƒ}|j|j }}t  |d ||f¡t  |d |d f¡t  |d |f¡t  |d ¡dœ}t  |||f¡}t  |¡|d< d|d< ||d t  ||fd¡t  |d¡dœ}dddddœ}t	D ]Ä}t| ƒj
| }	t||| d�}
|| |
_d	|› d
�}tjt|d�� |
 |	¡ W 5 Q R X || |
_d|› d|| › �}tjt|d�� |
 |	¡ W 5 Q R X |j| |
_|
 |	¡ t|j| |
jƒ qÈd S )Nr   re   )r   r   r   r   g      ð¿)r   r   r   zsymmetric, positive-definiteZpositive©rJ   r.   r>   zThe parameter 'z$ precision' should have the shape ofrf   ú'z precision' should be )r   r   r    r8   rJ   r*   Úonesr%   r   rP   r0   r
   Úprecisions_initrm   rn   ro   r`   r-   r   )r/   rr   rJ   r*   Zprecisions_bad_shapeZprecisions_not_posZprecisions_not_positiveZnot_positive_errorsrG   r0   rs   rt   r5   r5   r6   Útest_check_precisionsà   sN    ü
üü  ÿ


r|   c                  C   s¤  t j d¡} d\}}|  ||¡}|  |d¡}t  |¡| }t  |g¡}t  d|f¡}t||||dƒ}tdd�}	|	 	|¡ t
|	j|d dd�dƒ t
|	j|d dd�dƒ t|d	ƒ}
t  d
d„ |
D ƒ¡}t  dd„ |D ƒ¡}t||ƒ t  |df¡}t  |g¡}|jdd� d¡}t||||dƒ}tdd�}	|	 	|¡ t
|	j|d dd�dƒ t
|	j|d dd�dƒ t|d	ƒ}
t  dd„ |
D ƒ¡}t  dd„ |D ƒ¡}t||ƒ d S )Nr   ©éô  r:   re   T)Zassume_centeredÚ	frobenius©ÚnormÚspectralr   c                 S   s   g | ]}t  ||j¡‘qS r5   ©r   ÚdotÚT©r?   Úprecr5   r5   r6   r@   .  s     z)test_suffstat_sk_full.<locals>.<listcomp>c                 S   s   g | ]}t  |¡‘qS r5   rC   ©r?   Úcovr5   r5   r6   r@   /  s     ©Zaxis)re   éÿÿÿÿFc                 S   s   g | ]}t  ||j¡‘qS r5   rƒ   r†   r5   r5   r6   r@   >  s     c                 S   s   g | ]}t  |¡‘qS r5   rC   rˆ   r5   r5   r6   r@   ?  s     )r   r   r    rK   ÚsqrtrM   Úzerosr   r   r`   r   Ú
error_normr   r   rz   ÚmeanZreshape)r/   r)   r*   r0   ÚrespZX_respÚnkÚxkZcovars_predÚecovÚprecs_chol_predÚ
precs_predÚ	precs_estr5   r5   r6   Útest_suffstat_sk_full  s8    






r—   c                  C   s"  t j d¡} d\}}}|  ||¡}||jdd�d d …t jf  }|  ||¡}|jdd�}t  |j|¡|d d …t jf  }t||||dƒ}t  |d d …t jt jf | d¡| }t	||||dƒ}	t
ƒ }
||
_t|
j|	dd�dƒ t|
j|	dd�dƒ t|	dƒ}t  ||j¡}t |	¡}t||ƒ d S )	Nr   ©r~   r:   r:   re   rŠ   r   r€   r‚   r   )r   r   r    rK   rL   Únewaxisr„   r…   r   r   r   Úcovariance_r   rŽ   r   r   rD   r   )r/   r)   r*   rJ   r�   r0   r‘   r’   Úcovars_pred_fullZcovars_pred_tiedr“   r”   r•   r–   r5   r5   r6   Útest_suffstat_sk_tiedC  s&    
 $ÿ

rœ   c                  C   s  t j d¡} d\}}}|  ||¡}||jdd�d d …t jf  }|  ||¡}|jdd�}t  |j|¡|d d …t jf  }t||||dƒ}t	||||dƒ}	t
ƒ }
t||	ƒD ]L\}}t  t  |¡¡|
_t  |¡}t|
j|dd�dƒ t|
j|dd�dƒ q¨t|	dƒ}t|	d	|d
  ƒ d S )Nr   r˜   re   rŠ   r   r€   r‚   r   rB   r:   )r   r   r    rK   rL   r™   r„   r…   r   r   r   r"   r   rš   r   rŽ   r   )r/   r)   r*   rJ   r�   r0   r‘   r’   r›   Zcovars_pred_diagr“   Zcov_fullZcov_diagr”   r5   r5   r6   Útest_suffstat_sk_diaga  s"    
 

r�   c            
      C   s¦   t j d¡} d\}}|  ||¡}|| ¡  }t  |df¡}t  |g¡}| ¡ }t||||dƒ}t  | 	¡ j
| 	¡ ¡||  }t||ƒ t|dƒ}	t|d|	d  ƒ d S )Nr   r}   re   r   rB   r:   )r   r   r    rK   r�   rz   rM   r   r„   Úflattenr…   r   r   )
r/   r)   r*   r0   r�   r‘   r’   Zcovars_pred_sphericalZcovars_pred_spherical2r”   r5   r5   r6   Ú#test_gaussian_suffstat_sk_sphericalz  s    ÿ

rŸ   c                  C   s´   d} t tj d¡ƒ}tD ]–}|j| }|dkrDt dd„ |D ƒ¡}nB|dkrXt |¡}n.|dkrvt dd„ |D ƒ¡}n|d	kr†||  }t	t
||ƒ|| d
�}t|dt |¡ ƒ qd S )Nr:   r   r   c                 S   s   g | ]}t  |¡‘qS r5   )r   Údetrˆ   r5   r5   r6   r@   ˜  s     z1test_compute_log_det_cholesky.<locals>.<listcomp>r   r   c                 S   s   g | ]}t  |¡‘qS r5   )r   Úprodrˆ   r5   r5   r6   r@   œ  s     r   ©r*   g      à¿)r8   r   r   r    rP   rF   rM   r   r    r   r   r   Úlog)r*   rr   rG   rE   Zpredected_detZexpected_detr5   r5   r6   Útest_compute_log_det_cholesky�  s$    
ýr¤   c                 C   sd   t  t| ƒt|ƒf¡}t  |¡}tt||ƒƒD ]0\}\}}tj | ||¡j	dd�|d d …|f< q.|S )Nre   rŠ   )
r   ÚemptyÚlenrŒ   r!   r"   r   r�   ZlogpdfrL   )r0   r,   Zcovarsr�   ZstdsÚir�   Zstdr5   r5   r6   Ú_naive_lmvnpdf_diag©  s
    
&r¨   c                     s^  ddl m}  tj d¡}t|ƒ}d}|j‰ |j}|j}| 	|ˆ ¡}| 	|ˆ ¡}t
|||ƒ}t dd„ |D ƒ¡}	| |||	dƒ}
t|
|ƒ dt |¡ }| |||dƒ}
t|
|ƒ t d	d„ |D ƒ¡jdd
�}t t d| ¡¡}t
|||g| ƒ}| |||dƒ}
t|
|ƒ |jdd
�}dt |jdd
�¡ }t
||‡ fdd„|D ƒƒ}| |||dƒ}
t|
|ƒ d S )Nr   )Ú_estimate_log_gaussian_probr~   c                 S   s    g | ]}t  d t  |¡ ¡‘qS )rB   )r   r   rŒ   ©r?   Úxr5   r5   r6   r@   Á  s     z;test_gaussian_mixture_log_probabilities.<locals>.<listcomp>r   rB   r   c                 S   s   g | ]}|‘qS r5   r5   rª   r5   r5   r6   r@   Ì  s     rŠ   r   re   c                    s   g | ]}|gˆ  ‘qS r5   r5   ©r?   rI   r¢   r5   r6   r@   Ø  s     r   )Ú!sklearn.mixture._gaussian_mixturer©   r   r   r    r8   r*   rJ   r,   rK   r¨   rM   r   rŒ   r�   r   )r©   r/   rr   r)   rJ   r,   Zcovars_diagr0   Zlog_prob_naiveZ
precs_fullZlog_probZprecs_chol_diagZcovars_tiedZ
precs_tiedZcovars_sphericalZprecs_sphericalr5   r¢   r6   Ú'test_gaussian_mixture_log_probabilities±  s<    


  ÿr®   c               	   C   s¾   t j d¡} t| dd�}|j}|j}|j}|  ||¡}tD ]~}|j	}|j
}|j| }	t|| |||	|d�}
|
 |¡ |
 |¡}t|jdd�t  |¡ƒ t|
j|ƒ t|
j|ƒ t|
j|	ƒ q:d S )Nr   é   ©rR   ©rJ   r>   rh   rv   r{   r.   re   rŠ   )r   r   r    r8   r)   r*   rJ   rK   rP   r+   r,   r-   r
   r`   Úpredict_probar   rL   rz   r   rh   rv   r{   )r/   rr   r)   r*   rJ   r0   rG   r+   r,   r-   rs   r�   r5   r5   r6   Ú,test_gaussian_mixture_estimate_log_prob_respá  s0    
ú

r³   c            	   
   C   s¼   t j d¡} t| ƒ}tD ]ž}|j| }|j}t|j| |j	|j
|j| |d�}d}tjt|d�� | |¡ W 5 Q R X | |¡ | |¡}| |¡jdd�}t||ƒ t||ƒdkst‚qd S )Nr   r±   úsThis GaussianMixture instance is not fitted yet. Call 'fit' with appropriate arguments before using this estimator.rf   re   rŠ   çffffffî?)r   r   r    r8   rP   r0   rQ   r
   rJ   r+   r,   r-   rm   rn   r   Úpredictr`   r²   Zargmaxr   r	   ra   )	r/   rr   rG   r0   rQ   rs   rt   ZY_predZY_pred_probar5   r5   r6   Ú+test_gaussian_mixture_predict_predict_probaþ  s,    
úÿ


r·   zignore:.*did not converge.*zseed, max_iter, tol)r   r:   çH¯¼šò×z>)re   r:   rZ   )rX   é,  r¸   )é   r¹   rZ   c                 C   s–   t j | ¡}t|ƒ}tD ]x}|j| }|j}t|j||j	|j
|j| |||d�}t |¡}	|	 |¡ |¡}
| |¡}t|
|ƒ t||ƒdkst‚qd S )N)rJ   r>   rh   rv   r{   r.   r]   r[   rµ   )r   r   r    r8   rP   r0   rQ   r
   rJ   r+   r,   r-   ÚcopyÚdeepcopyr`   r¶   Úfit_predictr   r	   ra   )Úseedr]   r[   r/   rr   rG   r0   rQ   rs   ÚfZY_pred1ZY_pred2r5   r5   r6   Ú!test_gaussian_mixture_fit_predict  s(    
ø


rÀ   c                  C   sD   t j d¡ dd¡} tdddd�}| | ¡}| | ¡}t||ƒ d S )Nr   éè  r¯   )rJ   r\   r>   )r   r   r    Úrandnr
   r½   r¶   r   )r0   ÚgmZy_pred1Zy_pred2r5   r5   r6   Ú(test_gaussian_mixture_fit_predict_n_init?  s
    

rÄ   c                     sð  t j d¡} t| ƒ}|j‰ |j}tD �]Ä}|j| }t|dd| |d�}| 	|¡ t
t  |j¡t  |j¡ddd� |jd d …df  ¡ }|jd d …df  ¡ }t
|j| |j| ddd� |dkrÒ|j}|jd }	n²|dk�rt  |jg| ¡}t  |jd g| ¡}	n~|d	k�rJt  ‡ fd
d„|jD ƒ¡}t  ‡ fdd„|jd	 D ƒ¡}	n:|dk�r„t  dd„ |jD ƒ¡}t  dd„ |jd D ƒ¡}	t j|ddd� ¡ }t j|	ddd� ¡ }t||ƒD ]2\}
}tƒ }|	| |_t
| ||
 ¡ddd� �q¶q$d S )Nr   é   ©rJ   r\   r^   r>   r.   rZ   g{®Gáz„?)ZrtolÚatolr   r   r   c                    s   g | ]}t  ˆ ¡| ‘qS r5   ©r   r%   ©r?   r4   r¢   r5   r6   r@   l  s     z-test_gaussian_mixture_fit.<locals>.<listcomp>c                    s   g | ]}t  ˆ ¡| ‘qS r5   rÈ   rÉ   r¢   r5   r6   r@   n  s     r   c                 S   s   g | ]}t  |¡‘qS r5   ©r   r   ©r?   Údr5   r5   r6   r@   q  s     c                 S   s   g | ]}t  |¡‘qS r5   rÊ   rË   r5   r5   r6   r@   r  s     re   r:   )Zaxis1Zaxis2g333333Ã?)rÇ   )r   r   r    r8   r*   rJ   rP   r0   r
   r`   r   ÚsortÚweights_r+   Úmeans_Zargsortr,   Úprecisions_r-   rM   Útracer"   r   rš   rŽ   )r/   rr   rJ   rG   r0   rs   Zarg_idx1Zarg_idx2Z	prec_predZ	prec_testrI   Úhr“   r5   r¢   r6   Útest_gaussian_mixture_fitH  s`    

û

 
  ÿ   ÿ

ÿ

rÓ   c            
      C   s®   t j d¡} t| ƒ}|j}d}tD ]†}|j| }t|dd| |d�}g }t|ƒD ]}| 	|¡ | 
| |¡¡ qNt  |¡}t||d| |d�}	|	 	|¡ t| ¡ |	 |¡ƒ q"d S )Nr   rW   re   rÆ   )r   r   r    r8   rJ   rP   r0   r
   rN   r`   r#   ÚscorerM   r   rp   )
r/   rr   rJ   r\   rG   r0   rs   Úllr1   Zg_bestr5   r5   r6   Ú%test_gaussian_mixture_fit_best_params}  s6    
û

û
rÖ   c               
   C   s~   t j d¡} t| dd�}|j}d}tD ]R}|j| }t|d|d| |d�}d|› d�}tj	t
|d�� | |¡ W 5 Q R X q&d S )Nr   re   r°   ©rJ   r\   r]   r^   r>   r.   zInitialization zi did not converge. Try different init parameters, or increase max_iter, tol or check for degenerate data.rf   )r   r   r    r8   rJ   rP   r0   r
   rm   Zwarnsr   r`   )r/   rr   rJ   r]   rG   r0   rs   rt   r5   r5   r6   Ú-test_gaussian_mixture_fit_convergence_warning›  s$    
ú	
ÿrØ   c                  C   sr   t j d¡} d\}}}|  ||¡}tD ]F}t||dd� |¡ |¡}t||ddd� |¡ |¡}||ks&t‚q&d S )Nr   ©r;   r¯   r:   rx   r¯   ©rJ   r.   r>   r\   )	r   r   r    rÂ   rP   r
   r`   rÔ   ra   )r/   r)   r*   rJ   r0   Úcv_typeZtrain1Útrain2r5   r5   r6   Útest_multiple_init³  s4    
  ÿýüÿüúùÿ
rÝ   c                  C   sf   t j d¡} d\}}}|  ||¡}dddddœ}tD ],}t||| d� |¡}| ¡ || ks4t‚q4d S )	Nr   rÙ   é   é   é   é)   rA   rx   )	r   r   r    rÂ   rP   r
   r`   Ú_n_parametersra   )r/   r)   r*   rJ   r0   Zn_paramsrÛ   rs   r5   r5   r6   Ú"test_gaussian_mixture_n_parametersÍ  s    
  ÿþrã   c                  C   sn   t j d¡} d\}}}|  ||¡}t|d| d� |¡ |¡}dD ](}t||| d� |¡ |¡}t||ƒ q@d S )Nr   )éd   re   re   r   rx   )r   r   r   )r   r   r    rÂ   r
   r`   Úbicr   )r/   r)   Zn_dimrJ   r0   Zbic_fullr.   rå   r5   r5   r6   Útest_bic_1d_1componentÚ  s2    
  ÿýüÿýûúÿ	ræ   c                  C   sò   t j d¡} d\}}}|  ||¡}dtt j|jdd�ƒ|dt  dt j ¡    }t	D ]–}t
||| dd�}| |¡ d| | d| ¡   }d| | t  |¡| ¡   }	|t  |¡ }
| |¡| | |
k sÒt‚| |¡|	 | |
k sVt‚qVd S )	Nr   )r;   rX   r:   r<   re   )Zbiasr:   r9   )rJ   r.   r>   r]   )r   r   r    rÂ   r   r‰   r…   r£   ÚpirP   r
   r`   râ   rŒ   Úaicra   rå   )r/   r)   r*   rJ   r0   ZsghrÛ   rs   rè   rå   Úboundr5   r5   r6   Útest_gaussian_mixture_aic_bicô  s&    
*ÿü
rê   c               	   C   sŠ   t j d¡} t| ƒ}|j}tD ]f}|j| }t|dd| |dd�}t|dd| |dd�}tj	}t
ƒ t_	z| |¡ | |¡ W 5 |t_	X qd S )Nr   re   )rJ   r\   r^   r>   r.   Úverboser:   )r   r   r    r8   rJ   rP   r0   r
   ÚsysÚstdoutr   r`   )r/   rr   rJ   rG   r0   rs   rÒ   Z
old_stdoutr5   r5   r6   Útest_gaussian_mixture_verbose  s6    
úú
rî   r¾   )r   re   r:   c              	   C   s0  | }t j |¡}d\}}}| ||¡}t|ddd|dd�}t|ddd|dd�}| |¡ | |¡ |¡}	| |¡ |¡}
t|j|jƒ t|j	|j	ƒ t|j
|j
ƒ |
|	ks®t‚t|ddd|dd	d
�}t|ddd|dd	d
�}| |¡ |jrît‚| |¡ tdƒD ]}| |¡ |j�r  �q �q |j�s,t‚d S )Nr˜   re   r:   r   F)rJ   r\   r]   r^   r>   Ú
warm_startTr¯   ç�íµ ÷Æ°>)rJ   r\   r]   r^   r>   rï   r[   rÁ   )r   r   r    rK   r
   r`   rÔ   r   rÎ   rÏ   rÐ   ra   Ú
converged_rN   )r¾   r>   r/   r)   r*   rJ   r0   rs   rÒ   Zscore1Zscore2r1   r5   r5   r6   Útest_warm_start+  sj    
úú	
ù	ù





rò   )Úcategoryc                  C   s|   t j d¡} t| ƒ}|j}|jd }dD ]N}t|d|| d�}tdƒD ]}| |¡ |j	rD q^qD|j	sht
‚||jks(t
‚q(d S )Nr   r   )re   r:   r;   T)rJ   rï   r]   r>   rä   )r   r   r    r8   rJ   r0   r
   rN   r`   rñ   ra   Ún_iter_)r/   rr   rJ   r0   r]   rb   r1   r5   r5   r6   Ú)test_convergence_detected_with_warm_startp  s"    
ü

rõ   c            
   	   C   sè   d} t j d¡}t|dd�}|j}|j|  }t|ddd|| d�}d}tjt	|d�� | 
|¡ W 5 Q R X t ¡ � t d	t¡ | |¡ W 5 Q R X | 
|¡}| |¡ ¡ }t||ƒ t|dd|| d
� |¡}	|	 
|¡| 
|¡ksät‚d S )Nr   r   é   r°   re   r×   r´   rf   ÚignorerÆ   )r   r   r    r8   rJ   r0   r
   rm   rn   r   rÔ   ÚwarningsÚcatch_warningsÚsimplefilterr   r`   Úscore_samplesr�   r   ra   )
rG   r/   rr   rJ   r0   Úgmm1rt   Z	gmm_scoreZgmm_score_probaÚgmm2r5   r5   r6   Ú
test_score‡  sB    
ú	ÿ


ûúrþ   c               	   C   sŽ   d} t j d¡}t|dd�}|j}|j|  }t|dd|| d�}d}tjt	|d�� | 
|¡ W 5 Q R X | |¡ 
|¡}|jd |jksŠt‚d S )	Nr   r   rö   r°   re   rÆ   r´   rf   )r   r   r    r8   rJ   r0   r
   rm   rn   r   rû   r`   rl   r)   ra   )rG   r/   rr   rJ   r0   rb   rt   Zgmm_score_samplesr5   r5   r6   Útest_score_samples±  s$    
ûÿrÿ   c            	   
   C   s¶   t j d¡} t| dd�}|j}tD ]Ž}|j| }t||ddd| dd�}t j }t	 
¡ �T t	 dt¡ td	ƒD ].}|}| |¡ |¡}||ks�t‚|jrl qœql|js¦t‚W 5 Q R X q"d S )
Nr   rö   r°   Tre   r¸   )rJ   r.   r^   rï   r]   r>   r[   r÷   iX  )r   r   r    r8   rJ   rP   r0   r
   Zinftyrø   rù   rú   r   rN   r`   rÔ   ra   rñ   )	r/   rr   rJ   rG   r0   rb   Zcurrent_log_likelihoodr1   Zprev_log_likelihoodr5   r5   r6   Útest_monotonic_likelihoodË  s0    
ù	
r   c                  C   s¼   t j d¡} d\}}t  t  |d |f¡t  |d |f¡f¡}tD ]t}t|d|| d�}t 	¡ �R t 
dt¡ t d¡}tjt|d�� | |¡ W 5 Q R X |jdd	� |¡ W 5 Q R X qBd S )
Nr   )rW   r¯   r:   )rJ   r^   r.   r>   r÷   zØFitting the mixture model failed because some components have ill-defined empirical covariance (for instance caused by singleton or collapsed samples). Try to decrease the number of components, or increase reg_covar.rf   rð   )r^   )r   r   r    r(   rz   r�   rP   r
   rø   rù   rú   ÚRuntimeWarningri   rj   rm   rn   ro   r`   Z
set_params)r/   r)   r*   r0   rG   rb   rt   r5   r5   r6   Útest_regularisationí  s(    "ÿü
ÿr  c                  C   s²   t j d¡} t| dd�}|j}tD ]Š}|j| }t||| dd�}| |¡ |dkr|t	|j
|jƒD ]\}}tt |¡|ƒ q`q"|dkrštt |j
¡|jƒ q"t|j
d|j ƒ q"d S )	Nr   rö   r°   r¯   rÚ   r   r   rB   )r   r   r    r8   rJ   rP   r0   r
   r`   r"   rÐ   Úcovariances_r   r   rD   )r/   rr   rJ   rG   r0   rb   r‡   Zcovarr5   r5   r6   Útest_property  s$    
ü
r  c                     sü  t j d¡} t| ddd�}|j|j }}tD �]È}|j| }t||| d�}d}t	j
t|d�� | d¡ W 5 Q R X | |¡ d}t	j
t|d�� | d¡ W 5 Q R X d	}| |¡\‰ ‰t|ƒD ]À}	|d
krðt|j|	 t  ˆ ˆ|	k j¡dd� q¾|dk�rt|jt  ˆ ˆ|	k j¡dd� q¾|dk�rRt|j|	 t  t  ˆ ˆ|	k j¡¡dd� q¾t|j|	 t  ˆ ˆ|	k |j|	  ¡dd� q¾t  ‡ ‡fdd„t|ƒD ƒ¡}
t|j|
dd� ˆ j||fk�sÂt‚tddƒD ](}| |¡\‰ }ˆ j||fk�sÌt‚�qÌq,d S )Nr   rö   rX   )rR   rJ   rx   z+This GaussianMixture instance is not fittedrf   zInvalid value for 'n_samples'i N  r   re   )Údecimalr   r   c                    s    g | ]}t  ˆ ˆ|k d ¡‘qS )r   )r   r�   r¬   ©ZX_sZy_sr5   r6   r@   R  s     ztest_sample.<locals>.<listcomp>rä   )r   r   r    r8   r*   rJ   rP   r0   r
   rm   rn   r   Úsampler`   ro   rN   r   r  r‰   r…   r   ÚvarrÏ   rM   rl   ra   )r/   rr   r*   rJ   rG   r0   rb   rt   r)   rI   Zmeans_sZsample_sizer1   r5   r  r6   Útest_sample%  sb    

  ÿ
  ÿ
  ÿ
  ÿýr	  c                  C   st   t dƒD ]f} ttj | ¡ddd�}|j}|jd }t|dd| d� |¡}t|dd| d� |¡}|j	|j	kst
‚qd S )Né   r;   re   )r)   rR   r   )rJ   r\   r]   r>   rW   )rN   r8   r   r   r    rJ   r0   r
   r`   Úlower_bound_ra   )r>   rr   rJ   r0   rü   rý   r5   r5   r6   Ú	test_init^  s2    
  ÿ
   ÿþ   ÿþr  c               
   C   sÌ   t j d¡} d}| j|dfd�}t  dddgdd	d
gdddgdddgdddgdddgg¡}t  ddddddg¡}dddddd g}td!d||| t|ƒ|d"d#�}| |¡ |jr°t	‚d$D ]}t
||ƒs´t	‚q´d%S )&zÛ`GaussianMixture`'s best_parameters, `n_iter_` and `lower_bound_`
    must be set appropriately in the case of divergence.

    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/18216
    r   rY   rX   ©Úsizegß¯ŒÝuå?g³ýºÕÐíÊ?gnÏ,¨€À?gqz=|¸?gdUX'nâ?g.baË¼í?g£Úê8à?gà—�ŸŸî?g½Í×�ƒ'¶?g{á¼ÇÇ?g
 ³á?g(}I�^ÑÈ?gLœähÝ?gtªã“M„Ö?gŽÈ§@.â?g»YáŒ8ã?g›ïj4}_é?g$%ˆŸÈÈî?g§(Ìÿ„.Ag_Sˆÿ„.Ag]°IN�@g¬òÅ•&™i@g’âçî¼/@gYa2¤i]U@g¡?g±?ggfffffæ?gŸ™™™™™¹?r   re   )r.   r^   rv   rh   r>   rJ   r{   r]   )rÎ   rÏ   r  Úprecisions_cholesky_rô   r  N)r   r   r    ÚuniformrM   r
   r¦   r`   rñ   ra   Úhasattr)Zrndr)   r0   rv   r{   rh   rb   Úattrr5   r5   r6   Ú)test_gaussian_mixture_setting_best_paramsr  sT    úÿ
úÿú	ø

r  r_   r   Zrandom_from_dataz	k-means++Zkmeansc           
      C   st   t j |¡}t|dd�}|j}|jd }t|| |dd�}| |¡ |j}t	j
|dd�D ]\}}	t  ||	¡rVt‚qVd S )Nr¯   r°   r   r   )rJ   r_   r>   r]   r:   )Úr)r   r   r    r8   rJ   r0   r
   r`   rÏ   Ú	itertoolsÚcombinationsZallclosera   )
r_   Úglobal_random_seedr/   rr   rJ   r0   rb   r,   Zi_meanZj_meanr5   r5   r6   Útest_init_means_not_duplicated·  s    
   ÿ
r  c                 C   s    t j |¡}t|dd�}|j}|jd }t|| |d�}| |¡ |jj	||j	d fksZt
‚t  |jdd�|jk¡svt
‚t  |j|jdd�k¡s’t
‚|jsœt
‚d S )Nr¯   r°   r   )rJ   r_   r>   re   r   rŠ   )r   r   r    r8   rJ   r0   r
   r`   rÏ   rl   ra   Úallrp   rq   rñ   )r_   r  r/   rr   rJ   r0   rb   r5   r5   r6   Útest_means_for_all_initsË  s    
  ÿ
r  c                  C   sd   t j d¡} t| dd�}|j}|jd }ddgddgg}t|| |ddd	�}| |¡ t|j	|ƒ d S )
Nr   r¯   r°   r   rÅ   rY   é   rð   )rJ   r>   rv   r[   r]   )
r   r   r    r8   rJ   r0   r
   r`   r   rÏ   )r/   rr   rJ   r0   rv   rb   r5   r5   r6   Útest_max_iter_zeroà  s    
û
r  c                  C   s   d} t j d¡}| | d¡t  ddg¡ }t  ddgddgg¡}t  | | d¡|¡}t  ||g¡}d	\}}}}	t  |jd |f¡}
t	|d
|	d� 
|¡j}d
|
t  |jd ¡|f< t||
||d�\}}}d
| }t|||||	d� 
|¡}t||||	d� 
|¡}|j|jk�st‚t|j|jƒ dS )aü  Check that we properly initialize `precision_cholesky_` when we manually
    provide the precision matrix.

    In this regard, we check the consistency between estimating the precision
    matrix and providing the same precision matrix as initialization. It should
    lead to the same results with the same number of iterations.

    If the initialization is wrong then the number of iterations will increase.

    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/16944
    r¹   r   r:   rÅ   g        gffffffæ¿g      @gffffffæ?)r:   r   rð   r   re   )Z
n_clustersr\   r>   )r^   r.   )rJ   r.   r^   r{   r>   )rJ   r.   r^   r>   N)r   r   r    rÂ   rM   r„   r(   r�   rl   r   r`   Zlabels_Zaranger   r
   rô   ra   r   r  )r)   r/   Zshifted_gaussianÚCZstretched_gaussianr0   rJ   r.   r^   r>   r�   Úlabelr1   rE   r{   Zgm_with_initZgm_without_initr5   r5   r6   Ú*test_gaussian_mixture_precisions_init_diagô  sT    ÿÿ   ÿûúüû ÿr  c                  C   sD   t j d¡} | jt  d¡t  d¡dd�}tdd�}| |¡ ¡  dS )za
    Non-regression test for #23032 ensuring 1-component GM works on only a
    few samples.
    r   r:   rX   r  re   rd   N)	r   r   r    r$   r�   Úidentityr
   r`   r  )r/   r0   rÃ   r5   r5   r6   Ú-test_gaussian_mixture_single_component_stable1  s    
r!  )Vr  ri   rì   r»   rø   rm   Únumpyr   Zscipyr   r   Zsklearn.clusterr   Zsklearn.covariancer   Zsklearn.datasetsr   Úior   Zsklearn.metrics.clusterr	   Zsklearn.mixturer
   r­   r   r   r   r   r   r   r   Zsklearn.exceptionsr   r   Zsklearn.utils.extmathr   Zsklearn.utils._testingr   r   r   r   r   rP   r7   r8   rc   ru   rw   r|   r—   rœ   r�   rŸ   r¤   r¨   r®   r³   r·   ÚmarkÚfilterwarningsZparametrizerÀ   rÄ   rÓ   rÖ   rØ   rÝ   rã   ræ   rê   rî   rò   rõ   rþ   rÿ   r   r  r  r	  r  r  r  r  r  r  r!  r5   r5   r5   r6   Ú<module>   s¦   $	509*0
üþ		5
C
*" 9
E 
ÿ
 
ÿ
=