a
    hh                     @   s  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 d dlmZ d dl	Z
d dlZd dlmZ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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'm(Z(m)Z) d dl*m+Z+ g dZ,dd Z-G dd dZ.dd Z/dd Z0dd Z1dd Z2dd Z3dd Z4dd  Z5d!d" Z6d#d$ Z7d%d& Z8d'd( Z9d)d* Z:d+d, Z;ej<=d-ej<>d.g d/d0d1 Z?d2d3 Z@d4d5 ZAd6d7 ZBd8d9 ZCd:d; ZDd<d= ZEd>d? ZFd@dA ZGdBdC ZHej<=d-ej<>dDdEdFdG ZIej<=dHdIdJ ZJdKdL ZKdMdN ZLdOdP ZMdQdR ZNdSdT ZOdUdV ZPej<=dHdWdX ZQdYdZ ZRej<>d[g d\d]d^ ZSej<>d[g d\d_d` ZTdadb ZUdcdd ZVdedf ZWdgdh ZXej<>die,djdk ZYdldm ZZdndo Z[dS )p    N)StringIO)Mock)linalgstats)KMeans)EmpiricalCovariancemake_spd_matrix)ConvergenceWarningNotFittedError)adjusted_rand_score)GaussianMixture)_compute_log_det_cholesky_compute_precision_cholesky#_estimate_gaussian_covariances_diag#_estimate_gaussian_covariances_full(_estimate_gaussian_covariances_spherical#_estimate_gaussian_covariances_tied_estimate_gaussian_parameters)assert_allcloseassert_almost_equalassert_array_almost_equalassert_array_equal)fast_logdetfulltieddiag	sphericalc                 C   sh  t jd}g }|dkrhtt|||d D ]:\}\}	}
}|||
|t | tt 	|	|   q,|dkrt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 r6   g/var/www/html/assistant/venv/lib/python3.9/site-packages/sklearn/mixture/tests/test_gaussian_mixture.pygenerate_data+   s4    "" 

"&
r8   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   ).0r2   )r+   r0   r6   r7   
<listcomp>X   s   z'RandomData.__init__.<locals>.<listcomp>r   r   r   r         ?r   r   r   c                 S   s   g | ]}t |qS r6   r   inv)r@   
covariancer6   r6   r7   rA   c       r   c              	      s$   g | ]}t  jjj|qS r6   )r8   r,   r-   covariances)r@   
covar_type)r+   r*   selfr6   r7   rA   j   s   	c                    s.   g | ]&\}}t jtt |  |td qS ))Zdtype)r   r   r'   r(   )r@   kr3   )r*   r6   r7   rA   x   s   )r*   n_componentsr+   randr,   sumr-   r	   r   arrayrangerH   r   rE   r.   dictr#   COVARIANCE_TYPEr1   Zhstackr"   Y)rJ   r0   r*   rL   r+   scaler6   )r+   r*   r0   rJ   r7   __init__K   sF    
		
zRandomData.__init__N)r:   r;   r;   r<   )__name__
__module____qualname__rU   r6   r6   r6   r7   r9   J   s   r9   c            
   	   C   s   t jd} | dd}d\}}}}}d\}}t|||||||d|}	|	j|ksXJ |	j|ksfJ |	j|kstJ |	j	|ksJ |	j
|ksJ |	j|ksJ |	j|ksJ d S )Nr   
   r;   )r;   g-C6?      皙?)r   r    )rL   toln_initmax_iter	reg_covarr/   init_params)r   r    r!   rM   r   fitrL   r/   r]   r`   r_   r^   ra   )
r0   r1   rL   r]   r^   r_   r`   r/   ra   gmmr6   r6   r7    test_gaussian_mixture_attributes   s,    
rd   c            
      C   s  t jd} t| }|j}|jd }t|d}| |d}||_t	
d| dt|j }tjt|d || W d    n1 s0    Y  | |d }||_t	
dt |d	d
t |d	}tjt|d || W d    n1 s0    Y  | |}|| d  }||_t	
dt |d	}tjt|d || W d    n1 sn0    Y  |j}	t|	|d}|| t|	|j d S )Nr   r   rL      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_initrL   )r   r    r!   r9   rL   r1   r   rM   ri   reescapestrshapepytestraises
ValueErrorrb   minmaxrN   r,   r   )
r0   	rand_datarL   r1   gZweights_bad_shapemsgZweights_bad_rangeZweights_bad_normr,   r6   r6   r7   test_check_weights   sR    

(

(

*
rv   c            	      C   s   t jd} t| }|j|j }}|jd }t|d}| |d |}||_	d}t
jt|d || W d    n1 s~0    Y  |j}||_	|| t||j	 d S )Nr   r   re   rf   z/The parameter 'means' should have the shape of rg   )r   r    r!   r9   rL   r+   r1   r   rM   
means_initrn   ro   rp   rb   r-   r   )	r0   rs   rL   r+   r1   rt   Zmeans_bad_shaperu   r-   r6   r6   r7   test_check_means   s    

(
rx   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 d    n1 s.0    Y  || |
_d| d||  }tjt|d |
|	 W d    n1 s0    Y  |j| |
_|
|	 t|j| |
j qd S )Nr   rf   r   g      )r   r   r   zsymmetric, positive-definiteZpositiverL   r/   r?   zThe parameter 'z$ precision' should have the shape ofrg   'z precision' should be )r   r    r!   r9   rL   r+   onesr&   r   rR   r1   r   precisions_initrn   ro   rp   rb   r.   r   )r0   rs   rL   r+   Zprecisions_bad_shapeZprecisions_not_posZprecisions_not_positiveZnot_positive_errorsrI   r1   rt   ru   r6   r6   r7   test_check_precisions   sJ    

*
*
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;   rf   T)Zassume_centered	frobeniusnormspectralr   c                 S   s   g | ]}t ||jqS r6   r   dotTr@   precr6   r6   r7   rA   /  rG   z)test_suffstat_sk_full.<locals>.<listcomp>c                 S   s   g | ]}t |qS r6   rD   r@   covr6   r6   r7   rA   0  rG   Zaxis)rf   Fc                 S   s   g | ]}t ||jqS r6   r   r   r6   r6   r7   rA   ?  rG   c                 S   s   g | ]}t |qS r6   rD   r   r6   r6   r7   rA   @  rG   )r   r    r!   rM   sqrtrO   zerosr   r   rb   r   
error_normr   r   r{   meanZreshape)r0   r*   r+   r1   respZX_respnkxkZcovars_predecovprecs_chol_pred
precs_pred	precs_estr6   r6   r7   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;   rf   r   r   r   r   r   )r   r    r!   rM   rN   newaxisr   r   r   r   r   covariance_r   r   r   r   rE   r   )r0   r*   r+   rL   r   r1   r   r   covars_pred_fullZcovars_pred_tiedr   r   r   r   r6   r6   r7   test_suffstat_sk_tiedD  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 qt|	d}t|	d	|d
   d S )Nr   r   rf   r   r   r   r   r   rC   r;   )r   r    r!   rM   rN   r   r   r   r   r   r   r#   r   r   r   r   r   )r0   r*   r+   rL   r   r1   r   r   r   Zcovars_pred_diagr   Zcov_fullZcov_diagr   r6   r6   r7   test_suffstat_sk_diagb  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~   rf   r   rC   r;   )r   r    r!   rM   r   r{   rO   r   r   flattenr   r   r   )
r0   r*   r+   r1   r   r   r   Zcovars_pred_sphericalZcovars_pred_spherical2r   r6   r6   r7   #test_gaussian_suffstat_sk_spherical{  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 r6   )r   detr   r6   r6   r7   rA     rG   z1test_compute_log_det_cholesky.<locals>.<listcomp>r   r   c                 S   s   g | ]}t |qS r6   )r   prodr   r6   r6   r7   rA     rG   r   r+   g      )r9   r   r    r!   rR   rH   rO   r   r   r   r   r   log)r+   rs   rI   rF   Zpredected_detZexpected_detr6   r6   r7   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 )Nrf   r   )
r   emptylenr   r"   r#   r   r   ZlogpdfrN   )r1   r-   Zcovarsr   Zstdsir   Zstdr6   r6   r7   _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 )rC   )r   r   r   r@   xr6   r6   r7   rA     rG   z;test_gaussian_mixture_log_probabilities.<locals>.<listcomp>r   rC   r   c                 S   s   g | ]}|qS r6   r6   r   r6   r6   r7   rA     rG   r   r   rf   c                    s   g | ]}|g  qS r6   r6   r@   rK   r   r6   r7   rA     rG   r   )!sklearn.mixture._gaussian_mixturer   r   r    r!   r9   r+   rL   r-   rM   r   rO   r   r   r   r   )r   r0   rs   r*   rL   r-   Zcovars_diagr1   Zlog_prob_naiveZ
precs_fullZlog_probZprecs_chol_diagZcovars_tiedZ
precs_tiedZcovars_sphericalZprecs_sphericalr6   r   r7   'test_gaussian_mixture_log_probabilities  s8    


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      rT   rL   r?   ri   rw   r|   r/   rf   r   )r   r    r!   r9   r*   r+   rL   rM   rR   r,   r-   r.   r   rb   predict_probar   rN   r{   r   ri   rw   r|   )r0   rs   r*   r+   rL   r1   rI   r,   r-   r.   rt   r   r6   r6   r7   ,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 d    n1 s~0    Y  || ||}||jdd}t|| t||dksJ qd S )Nr   r   sThis GaussianMixture instance is not fitted yet. Call 'fit' with appropriate arguments before using this estimator.rg   rf   r   ffffff?)r   r    r!   r9   rR   r1   rS   r   rL   r,   r-   r.   rn   ro   r   predictrb   r   Zargmaxr   r   )	r0   rs   rI   r1   rS   rt   ru   ZY_predZY_pred_probar6   r6   r7   +test_gaussian_mixture_predict_predict_proba  s,    
(


r   zignore:.*did not converge.*zseed, max_iter, tol))r   r;   Hz>)rf   r;   r\   )rZ   ,  r   )   r   r\   c                 C   s   t j| }t|}tD ]x}|j| }|j}t|j||j	|j
|j| |||d}t|}	|	||}
||}t|
| t||dksJ qd S )N)rL   r?   ri   rw   r|   r/   r_   r]   r   )r   r    r!   r9   rR   r1   rS   r   rL   r,   r-   r.   copydeepcopyrb   r   fit_predictr   r   )seedr_   r]   r0   rs   rI   r1   rS   rt   fZY_pred1ZY_pred2r6   r6   r7   !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   )rL   r^   r?   )r   r    r!   randnr   r   r   r   )r1   gmZy_pred1Zy_pred2r6   r6   r7   (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rt 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 qq$d S )Nr      rL   r^   r`   r?   r/   r\   g{Gz?)Zrtolatolr   r   r   c                    s   g | ]}t  | qS r6   r   r&   r@   r5   r   r6   r7   rA   m  rG   z-test_gaussian_mixture_fit.<locals>.<listcomp>c                    s   g | ]}t  | qS r6   r   r   r   r6   r7   rA   o  rG   r   c                 S   s   g | ]}t |qS r6   r   r   r@   dr6   r6   r7   rA   r  rG   c                 S   s   g | ]}t |qS r6   r   r   r6   r6   r7   rA   s  rG   rf   r;   )Zaxis1Zaxis2g333333?)r   )r   r    r!   r9   r+   rL   rR   r1   r   rb   r   sortweights_r,   means_Zargsortr-   precisions_r.   rO   tracer#   r   r   r   )r0   rs   rL   rI   r1   rt   Zarg_idx1Zarg_idx2Z	prec_predZ	prec_testrK   hr   r6   r   r7   test_gaussian_mixture_fitI  sT    






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   rY   rf   r   )r   r    r!   r9   rL   rR   r1   r   rP   rb   r$   scorerO   r   rq   )
r0   rs   rL   r^   rI   r1   rt   Zllr2   Zg_bestr6   r6   r7   %test_gaussian_mixture_fit_best_params~  s6    



r   c               	   C   s   t jd} t| dd}|j}d}tD ]^}|j| }t|d|d| |d}d}tj	t
|d || W d    q&1 sz0    Y  q&d S )Nr   rf   r   rL   r^   r_   r`   r?   r/   zBest performing initialization did not converge. Try different init parameters, or increase max_iter, tol, or check for degenerate data.rg   )r   r    r!   r9   rL   rR   r1   r   rn   Zwarnsr
   rb   )r0   rs   rL   r_   rI   r1   rt   ru   r6   r6   r7   -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&J q&d S )Nr   r<   r   r;   ry   r   rL   r/   r?   r^   )r   r    r!   r   rR   r   rb   r   )r0   r*   r+   rL   r1   cv_typeZtrain1train2r6   r6   r7   test_multiple_init  s0    

r   c                  C   sf   t jd} d\}}}| ||}ddddd}tD ],}t||| d|}| || ks4J q4d S )	Nr   r            )   rB   ry   )r   r    r!   r   rR   r   rb   _n_parameters)r0   r*   r+   rL   r1   Zn_paramsr   rt   r6   r6   r7   "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   rf   rf   r   ry   )r   r   r   )r   r    r!   r   r   rb   bicr   )r0   r*   Zn_dimrL   r1   Zbic_fullr/   r   r6   r6   r7   test_bic_1d_1component  s.    
	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 sJ |||	 | |
k sVJ qVd S )	Nr   )r<   rZ   r;   r=   rf   )Zbiasr;   r:   )rL   r/   r?   r_   )r   r    r!   r   r   r   r   r   pirR   r   rb   r   r   aicr   )r0   r*   r+   rL   r1   Zsghr   rt   r   r   boundr6   r6   r7   test_gaussian_mixture_aic_bic  s&    
*
r   c               	   C   s   t jd} t| }|j}tD ]l}|j| }t|dd| |dd}t|dd| |dd}tj	}t
 t_	z|| || W |t_	q|t_	0 qd S )Nr   rf   )rL   r^   r`   r?   r/   verboser;   )r   r    r!   r9   rL   rR   r1   r   sysstdoutr   rb   )r0   rs   rL   rI   r1   rt   r   Z
old_stdoutr6   r6   r7   test_gaussian_mixture_verbose  s6    

r   r   )r   rf   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sJ t|ddd|dd	d
}t|ddd|dd	d
}|| |jrJ || tdD ]}|| |jr  q q |js,J d S )Nr   rf   r;   r   F)rL   r^   r_   r`   r?   
warm_startTr   ư>)rL   r^   r_   r`   r?   r   r]   r   )r   r    r!   rM   r   rb   r   r   r   r   r   
converged_rP   )r   r?   r0   r*   r+   rL   r1   rt   r   Zscore1Zscore2r2   r6   r6   r7   test_warm_start,  sj    
	
	





r   z-ignore::sklearn.exceptions.ConvergenceWarningc                  C   s|   t jd} t| }|j}|jd }dD ]N}t|d|| d}tdD ]}|| |j	rD q^qD|j	shJ ||j
ks(J q(d S )Nr   r   )rf   r;   r<   T)rL   r   r_   r?   r   )r   r    r!   r9   rL   r1   r   rP   rb   r   n_iter_)r0   rs   rL   r1   r_   rc   r2   r6   r6   r7   )test_convergence_detected_with_warm_startq  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 d    n1 sr0    Y  t & td	t || W d    n1 s0    Y  |
|}|| }t|| t|dd|| d
|}	|	
||
|ksJ d S )Nr   r      r   rf   r   r   rg   ignorer   )r   r    r!   r9   rL   r1   r   rn   ro   r   r   warningscatch_warningssimplefilterr
   rb   score_samplesr   r   )
rI   r0   rs   rL   r1   gmm1ru   Z	gmm_scoreZgmm_score_probagmm2r6   r6   r7   
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 d    n1 sp0    Y  ||
|}|jd |jksJ d S )	Nr   r   r   r   rf   r   r   rg   )r   r    r!   r9   rL   r1   r   rn   ro   r   r   rb   rm   r*   )rI   r0   rs   rL   r1   rc   ru   Zgmm_score_samplesr6   r6   r7   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	dt td	D ].}|}|||}||ksJ |jrl qql|jsJ W d    q"1 s0    Y  q"d S )
Nr   r   r   Trf   r   )rL   r/   r`   r   r_   r?   r]   r   iX  )r   r    r!   r9   rL   rR   r1   r   infr   r   r   r
   rP   rb   r   r   )	r0   rs   rL   rI   r1   rc   Zcurrent_log_likelihoodr2   Zprev_log_likelihoodr6   r6   r7   test_monotonic_likelihood  s0    
	
r   c               
   C   s   t jd} d\}}t t |d |ft |d |ff}tD ]}t|d|| d}t	 p t
dt td}tjt|d || W d    n1 s0    Y  |jdd	| W d    qB1 s0    Y  qBd S )
Nr   )rY   r   r;   )rL   r`   r/   r?   r   zFitting 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.rg   r   )r`   )r   r    r!   r)   r{   r   rR   r   r   r   r   RuntimeWarningrj   rk   rn   ro   rp   rb   Z
set_params)r0   r*   r+   r1   rI   rc   ru   r6   r6   r7   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rtt|j
|j q"t|j
d|j  q"d S )	Nr   r   r   r   r   r   r   rC   )r   r    r!   r9   rL   rR   r1   r   rb   r#   r   covariances_r   r   rE   )r0   rs   rL   rI   r1   rc   r   Zcovarr6   r6   r7   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 d    n1 s|0    Y  || d}t	j
t|d |d W d    n1 s0    Y  d	}||\ t|D ]}	|d
krt|j|	 t  |	k jdd q|dkrFt|jt  |	k jdd q|dkr|t|j|	 t t  |	k jdd qt|j|	 t  |	k |j|	  dd qt  fddt|D }
t|j|
dd  j||fksJ tddD ](}||\ } j||fksJ qq,d S )Nr   r   rZ   )rT   rL   ry   z+This GaussianMixture instance is not fittedrg   zInvalid value for 'n_samples'i N  r   rf   )decimalr   r   c                    s    g | ]}t  |k d qS )r   )r   r   r   ZX_sZy_sr6   r7   rA   R  rG   ztest_sample.<locals>.<listcomp>r   )r   r    r!   r9   r+   rL   rR   r1   r   rn   ro   r   samplerb   rp   rP   r   r  r   r   r   varr   rO   rm   )r0   rs   r+   rL   rI   r1   rc   ru   r*   rK   Zmeans_sZsample_sizer2   r6   r  r7   test_sample%  sR    

(
(


"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J qd S )N   r<   rf   )r*   rT   r   )rL   r^   r_   r?   rY   )
rP   r9   r   r    r!   rL   r1   r   rb   lower_bound_)r?   rs   rL   r1   r   r   r6   r6   r7   	test_init^  s"    
r  c               
   C   s   t jd} d}| j|dfd}t g dg dg dg dg d	g d
g}t g d}g d}tdd||| t||dd}|| |jrJ dD ]}t	||sJ qd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   r[   rZ   size)gu?g?gn,?)gqz=|?gdUX'n?g.ba˼?)g8?g?g׏'?)g{?g
 ?g(}I^?)gLh?gtM?g@.?)gY8?gj4}_?g$%?)g(.Ag_S.Ag]IN@gŕ&i@g/@gYa2i]U@)?r  ?r  ggfffff?g?r   rf   )r/   r`   rw   ri   r?   rL   r|   r_   )r   r   r  precisions_cholesky_r   r  N)
r   r    r!   uniformrO   r   r   rb   r   hasattr)Zrndr*   r1   rw   r|   ri   rc   attrr6   r6   r7   )test_gaussian_mixture_setting_best_paramsr  s<    

	

r  ra   )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 ||	rVJ qVd S )Nr   r   r   r   )rL   ra   r?   r_   r;   )r)r   r    r!   r9   rL   r1   r   rb   r   	itertoolscombinationsZallclose)
ra   global_random_seedr0   rs   rL   r1   rc   r-   Zi_meanZj_meanr6   r6   r7   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sZJ t 
|jdd|jksvJ t 
|j|jddksJ |jsJ d S )Nr   r   r   )rL   ra   r?   rf   r   r   )r   r    r!   r9   rL   r1   r   rb   r   rm   allrq   rr   r   )ra   r  r0   rs   rL   r1   rc   r6   r6   r7   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   r[      r   )rL   r?   rw   r]   r_   )
r   r    r!   r9   rL   r1   r   rb   r   r   )r0   rs   rL   r1   rw   rc   r6   r6   r7   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J 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        gffffffg      @gffffff?)r;   r   r   r   rf   )Z
n_clustersr^   r?   )r`   r/   )rL   r/   r`   r|   r?   )rL   r/   r`   r?   N)r   r    r!   r   rO   r   r)   r   rm   r   rb   Zlabels_Zaranger   r   r   r   r  )r*   r0   Zshifted_gaussianCZstretched_gaussianr1   rL   r/   r`   r?   r   labelr2   rF   r|   Zgm_with_initZgm_without_initr6   r6   r7   *test_gaussian_mixture_precisions_init_diag  sL    r!  c                 C   sN   t j| }|||f}|||f}||jddddt jf  }||fS )z/Randomly generate samples and responsibilities.rf   r   N)r   r    r!   Zrandom_samplerN   r   )r   r*   r+   rL   rsr1   r   r6   r6   r7   _generate_data1  s
    r#  c                 C   sZ   d}t | |||\}}}t||}|j\}}	t|	|d}
||||f}|
| |
j|
jfS )zfCalculate precision matrix of X and its Cholesky decomposition
    for the given covariance type.
    r   )rL   r/   )r   r   rm   r   Z_set_parametersr   r  )r1   r   r/   r`   r,   r-   rH   Zprecisions_choleskyr2   rL   rc   paramsr6   r6   r7   _calculate_precisions:  s    



r%  r/   c                 C   sP   t |dddd\}}t||| \}}t| |d}||| |j}t|| dS )zNon-regression test for #26415.r   rZ   r   )r   r*   r+   rL   )r/   r|   N)r#  r%  r   _initializer  r   )r/   r  r1   r   r|   Zdesired_precisions_choleskyrc   Zactual_precisions_choleskyr6   r6   r7   %test_gaussian_mixture_precisions_initO  s    
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;   rZ   r  rf   re   N)	r   r    r!   r%   r   identityr   rb   r  )r0   r1   r   r6   r6   r7   -test_gaussian_mixture_single_component_stablee  s    
r)  c                 C   sr   t td}| tjjd| tj|}t	|}t
|j|j|j|jd |d}||jd  |j|jksnJ dS )zWhen all init parameters are provided, the Gaussian parameters
    are not estimated.

    Non-regression test for gh-26015.
    )Zside_effectr   r   )rL   ri   rw   r|   r?   N)r   r   setattrsklearnZmixtureZ_gaussian_mixturer   r    r!   r9   r   rL   r,   r-   r.   rb   r1   Z
call_countr   )Zmonkeypatchr  Zmockr0   rs   r   r6   r6   r7   Dtest_gaussian_mixture_all_init_does_not_estimate_gaussian_parametersp  s    


r,  )\r   r  rj   r   r   ior   Zunittest.mockr   numpyr   rn   Zscipyr   r   r+  Zsklearn.clusterr   Zsklearn.covariancer   Zsklearn.datasetsr	   Zsklearn.exceptionsr
   r   Zsklearn.metrics.clusterr   Zsklearn.mixturer   r   r   r   r   r   r   r   r   Zsklearn.utils._testingr   r   r   r   Zsklearn.utils.extmathr   rR   r8   r9   rd   rv   rx   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#  r%  r'  r)  r,  r6   r6   r6   r7   <module>   s   $	509*0
		5
C

*" 9

E

=	
