o
    ie                     @   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,e
j-fddZ.G d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;d+d, Z<ej=>d-ej=?d.g d/d0d1 Z@d2d3 ZAd4d5 ZBd6d7 ZCd8d9 ZDd:d; ZEd<d= ZFd>d? ZGd@dA ZHdBdC ZIej=>d-ej=?dDdEdFdG ZJej=>dHdIdJ ZKdKdL ZLdMdN ZMdOdP ZNdQdR ZOej=?dSe,dTdU ZPdVdW ZQej=>dHdXdY ZRdZd[ ZSej=?d\g d]d^d_ ZTej=?d\g d]d`da ZUdbdc ZVddde ZWe
j-fdfdgZXdhdi ZYej=?dje,dkdl ZZdmdn Z[dodp Z\dS )q    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   sz  t jd}g }|dkr7tt|||d D ] \}	\}
}}||||t | tt 	|
|  
| q|dkrdtt|||d D ]\}	\}
}}|||t |tt 	|
|  
| qE|dkrtt||D ]\}	\}
}||||d tt 	|
|  
| qo|dkrtt|||d D ]\}	\}
}}||||tt 	|
|  
| qt |}|S )Nr   r   r   r   r   )nprandomRandomState	enumeratezipappendmultivariate_normaleyeintroundastyper   vstack)	n_samples
n_featuresweightsmeans
precisionscovariance_typedtyperngX_wmc r7   e/home/kim/smarthome/.venv/lib/python3.10/site-packages/sklearn/mixture/tests/test_gaussian_mixture.pygenerate_data+   sF   """
r9   c                   @   s"   e Zd ZddddejfddZdS )
RandomData      2   c                    sB  _ |__| _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   r(   ).0r3   )r0   r+   r1   r7   r8   
<listcomp>h   s    z'RandomData.__init__.<locals>.<listcomp>r   r   r   r         ?r   r   r   c                 S      g | ]}t |qS r7   r   inv)rA   
covariancer7   r7   r8   rB   s       r   c                    s(   g | ]}t jjj| d qS r0   )r9   r,   r-   covariances)rA   
covar_type)r0   r+   r*   selfr7   r8   rB   z   s    
c                    s.   g | ]\}}t jtt |  |td qS rJ   )r   r   r&   r'   )rA   kr4   )r*   r7   r8   rB      s    )r*   n_componentsr+   randr(   r,   sumr-   r   r   arrayrangerL   r   rG   r.   dictr"   COVARIANCE_TYPEr2   Zhstackr!   Y)rN   r1   r*   rP   r+   scaler0   r7   )r0   r+   r*   r1   rN   r8   __init__S   sF   		


zRandomData.__init__N)__name__
__module____qualname__r   float64rY   r7   r7   r7   r8   r:   R   s    r:   c            
   	   C   s   t jd} | dd}d\}}}}}d\}}t|||||||d|}	|	j|ks,J |	j|ks3J |	j|ks:J |	j	|ksAJ |	j
|ksHJ |	j|ksOJ |	j|ksVJ d S )Nr   
   r<   )r<   g-C6?      皙?)r   r   )rP   toln_initmax_iter	reg_covarr/   init_params)r   r   r    rQ   r   fitrP   r/   rb   re   rd   rc   rf   )
r1   r2   rP   rb   rc   rd   re   r/   rf   gmmr7   r7   r8    test_gaussian_mixture_attributes   s,   
ri   c            
      C   s  t jd} t| }|j}|jd }t|d}| |d}||_t	
d| d|j }tjt|d || W d    n1 sCw   Y  | |d }||_t	
dt |d	d
t |d	}tjt|d || W d    n1 s|w   Y  | |}|| d  }||_t	
dt |d	}tjt|d || W d    n1 sw   Y  |j}	t|	|d}|| t|	|j d S )Nr   r   rP      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_initrP   )r   r   r    r:   rP   r2   r   rQ   rn   reescapeshapepytestraises
ValueErrorrg   minmaxrR   r,   r   )
r1   	rand_datarP   r2   gZweights_bad_shapemsgZweights_bad_rangeZweights_bad_normr,   r7   r7   r8   test_check_weights   sX   






rz   c            	      C   s   t jd} t| }|j|j}}|jd }t|d}| |d |}||_	d}t
jt|d || W d    n1 s?w   Y  |j}||_	|| t||j	 d S )Nr   r   rj   rk   z/The parameter 'means' should have the shape of rl   )r   r   r    r:   rP   r+   r2   r   rQ   
means_initrr   rs   rt   rg   r-   r   )	r1   rw   rP   r+   r2   rx   Zmeans_bad_shapery   r-   r7   r7   r8   test_check_means   s   


r|   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 ]v}t| j
| }	t||| d}
|| |
_d	| d
}tjt|d |
|	 W d    n1 sw   Y  || |
_d| d||  }tjt|d |
|	 W d    n1 sw   Y  |j| |
_|
|	 t|j| |
j qdd S )Nr   rk   r   g      )r   r   r   zsymmetric, positive-definiteZpositiverP   r/   r@   zThe parameter 'z$ precision' should have the shape ofrl   'z precision' should be )r   r   r    r:   rP   r+   onesr%   r   rV   r2   r   precisions_initrr   rs   rt   rg   r.   r   )r1   rw   rP   r+   Zprecisions_bad_shapeZprecisions_not_posZprecisions_not_positiveZnot_positive_errorsrM   r2   rx   ry   r7   r7   r8   test_check_precisions   sP   



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<   rk   T)Zassume_centered	frobeniusnormspectralr   c                 S      g | ]	}t ||jqS r7   r   dotTrA   precr7   r7   r8   rB   @      z)test_suffstat_sk_full.<locals>.<listcomp>c                 S   rE   r7   rF   rA   covr7   r7   r8   rB   A  rI   Zaxis)rk   Fc                 S   r   r7   r   r   r7   r7   r8   rB   P  r   c                 S   rE   r7   rF   r   r7   r7   r8   rB   Q  rI   )r   r   r    rQ   sqrtrS   zerosr   r   rg   r   
error_normr   r   r   meanZreshape)r1   r*   r+   r2   respZX_respnkxkZcovars_predecovprecs_chol_pred
precs_pred	precs_estr7   r7   r8   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<   rk   r   r   r   r   r   )r   r   r    rQ   rR   newaxisr   r   r   r   r   covariance_r   r   r   r   rG   r   )r1   r*   r+   rP   r   r2   r   r   covars_pred_fullZcovars_pred_tiedr   r   r   r   r7   r7   r8   test_suffstat_sk_tiedU  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 ]&\}}t t ||
_t |}t|
j|ddd t|
j|ddd qTt|	d}t|	d	|d
   d S )Nr   r   rk   r   r   r   r   r   rD   r<   )r   r   r    rQ   rR   r   r   r   r   r   r   r"   r   r   r   r   r   )r1   r*   r+   rP   r   r2   r   r   r   Zcovars_pred_diagr   Zcov_fullZcov_diagr   r7   r7   r8   test_suffstat_sk_diags  s"   
 

r   c                 C   s   t jd}d\}}|||| }||  }t j|df| d}t j|g| d}| }t||||d}t 	|
 j|
 ||  }	t||	 |j| ksQJ t|d}
t|d|
d   |
j| ksfJ d S )Nr   r   rk   rK   r   rD   r<   )r   r   r    rQ   r(   r   r   rS   r   r   flattenr   r   r0   r   )global_dtyper1   r*   r+   r2   r   r   r   Zcovars_pred_sphericalZcovars_pred_spherical2r   r7   r7   r8   #test_gaussian_suffstat_sk_spherical  s    

r   c                 C   s   d}t tjd| d}tD ]Y}|j| }|dkr$tdd |D }n!|dkr.t|}n|dkr=td	d |D }n|d
krE|| }|j	| ksLJ t
t||||d}t|dt|  |j	| ksgJ qd S )Nr<   r   rK   r   c                 S   rE   r7   )r   detr   r7   r7   r8   rB     rI   z1test_compute_log_det_cholesky.<locals>.<listcomp>r   r   c                 S   rE   r7   )r   prodr   r7   r7   r8   rB     rI   r   r+   g      )r:   r   r   r    rV   rL   rS   r   r   r0   r   r   r   log)r   r+   rw   rM   rH   Zpredected_detZexpected_detr7   r7   r8   test_compute_log_det_cholesky  s*   
r   c                 C   sd   t t| t|f}t |}tt||D ]\}\}}tj| ||j	dd|d d |f< q|S )Nrk   r   )
r   emptylenr   r!   r"   r   r   ZlogpdfrR   )r2   r-   Zcovarsr   Zstdsir   Zstdr7   r7   r8   _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 )rD   )r   r   r   rA   xr7   r7   r8   rB          z;test_gaussian_mixture_log_probabilities.<locals>.<listcomp>r   rD   r   c                 S   s   g | ]}|qS r7   r7   r   r7   r7   r8   rB     s    r   r   rk   c                    s   g | ]}|g  qS r7   r7   rA   rO   r   r7   r8   rB     rI   r   )!sklearn.mixture._gaussian_mixturer   r   r   r    r:   r+   rP   r-   rQ   r   rS   r   r   r   r   )r   r1   rw   r*   rP   r-   Zcovars_diagr2   Zlog_prob_naiveZ
precs_fullZlog_probZprecs_chol_diagZcovars_tiedZ
precs_tiedZcovars_sphericalZprecs_sphericalr7   r   r8   '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      rX   rP   r@   rn   r{   r   r/   rk   r   )r   r   r    r:   r*   r+   rP   rQ   rV   r,   r-   r.   r   rg   predict_probar   rR   r   r   rn   r{   r   )r1   rw   r*   r+   rP   r2   rM   r,   r-   r.   rx   r   r7   r7   r8   ,test_gaussian_mixture_estimate_log_prob_resp  s2   


r   c            	   	   C   s   t jd} t| }tD ]Y}|j| }|j}t|j| |j	|j
|j| |d}d}tjt|d || W d    n1 s?w   Y  || ||}||jdd}t|| t||dkseJ qd S )Nr   r   sThis GaussianMixture instance is not fitted yet. Call 'fit' with appropriate arguments before using this estimator.rl   rk   r   ffffff?)r   r   r    r:   rV   r2   rW   r   rP   r,   r-   r.   rr   rs   r
   predictrg   r   Zargmaxr   r   )	r1   rw   rM   r2   rW   rx   ry   ZY_predZY_pred_probar7   r7   r8   +test_gaussian_mixture_predict_predict_proba  s0   



r   zignore:.*did not converge.*zseed, max_iter, tol))r   r<   Hz>)rk   r<   ra   )r_   ,  r   )   r   ra   c                 C   s   t j| }t||d}tD ]T}|j| }|j}t|j||j	|j
|j| |||d}	t|	}
|
||}|	|}t|| t||dksJJ |	jj|ksRJ |	jj|ksZJ |	jj|ksbJ qd S )NrK   )rP   r@   rn   r{   r   r/   rd   rb   r   )r   r   r    r:   rV   r2   rW   r   rP   r,   r-   r.   copydeepcopyrg   r   fit_predictr   r   means_r0   weights_precisions_)seedrd   rb   r   r1   rw   rM   r2   rW   rx   fZY_pred1ZY_pred2r7   r7   r8   !test_gaussian_mixture_fit_predict2  s0   



r   c                  C   sD   t jddd} tdddd}|| }|| }t|| d S )Nr     r   )rP   rc   r@   )r   r   r    randnr   r   r   r   )r2   gmZy_pred1Zy_pred2r7   r7   r8   (test_gaussian_mixture_fit_predict_n_initX  s
   

r   c                    s  t jd}t|| d}|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rj|j}	|jd }
nV|d	krt |jg| }	t |jd	 g| }
n=|d
krt  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 ]\}}t }|
| |_t
||	| ddd q|jj| ksJ |jj| ksJ |jj| ksJ qd S )Nr   rK      rP   rc   re   r@   r/   ra   g{Gz?)Zrtolatolr   r   r   c                       g | ]	}t  | qS r7   r   r%   rA   r6   r   r7   r8   rB     r   z-test_gaussian_mixture_fit.<locals>.<listcomp>c                    r   r7   r   r   r   r7   r8   rB     r   r   c                 S   rE   r7   r   r   rA   dr7   r7   r8   rB     rI   c                 S   rE   r7   r   r   r7   r7   r8   rB     rI   rk   r<   )Zaxis1Zaxis2g333333?)r   )r   r   r    r:   r+   rP   rV   r2   r   rg   r   sortr   r,   r   Zargsortr-   r   r.   rS   tracer"   r   r   r   r0   covariances_)r   r1   rw   rP   rM   r2   rx   Zarg_idx1Zarg_idx2Z	prec_predZ	prec_testrO   hr   r7   r   r8   test_gaussian_mixture_fita  s\   


r   c            
      C   s   t jd} t| }|j}d}tD ]C}|j| }t|dd| |d}g }t|D ]}|	| |
|| q't |}t||d| |d}	|		| t| |	| qd S )Nr   r^   rk   r   )r   r   r    r:   rP   rV   r2   r   rT   rg   r#   scorerS   r   ru   )
r1   rw   rP   rc   rM   r2   rx   Zllr3   Zg_bestr7   r7   r8   %test_gaussian_mixture_fit_best_params  s8   



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    n1 s=w   Y  qd S )Nr   rk   r   rP   rc   rd   re   r@   r/   zBest performing initialization did not converge. Try different init parameters, or increase max_iter, tol, or check for degenerate data.rl   )r   r   r    r:   rP   rV   r2   r   rr   Zwarnsr	   rg   )r1   rw   rP   rd   rM   r2   rx   ry   r7   r7   r8   -test_gaussian_mixture_fit_convergence_warning  s*   
	r   c                  C   sr   t jd} d\}}}| ||}tD ]#}t||dd||}t||ddd||}||ks6J qd S )Nr   r=   r   r<   r}   r   rP   r/   r@   rc   )r   r   r    r   rV   r   rg   r   )r1   r*   r+   rP   r2   cv_typeZtrain1train2r7   r7   r8   test_multiple_init  s*   

r   c                  C   sf   t jd} d\}}}| ||}ddddd}tD ]}t||| d|}| || ks0J qd S )	Nr   r            )   rC   r}   )r   r   r    r   rV   r   rg   _n_parameters)r1   r*   r+   rP   r2   Zn_paramsr   rx   r7   r7   r8   "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   rk   rk   r   r}   )r   r   r   )r   r   r    r   r   rg   bicr   )r1   r*   Zn_dimrP   r2   Zbic_fullr/   r   r7   r7   r8   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 ]K}t
||| dd}|| d| | d|   }d| | t ||   }	|t | }
||| | |
k siJ |||	 | |
k svJ q+d S )	Nr   )r=   r_   r<   r>   rk   )Zbiasr<   r;   )rP   r/   r@   rd   )r   r   r    r   r   r   r   r   pirV   r   rg   r   r   aicr   )r1   r*   r+   rP   r2   Zsghr   rx   r   r   boundr7   r7   r8   test_gaussian_mixture_aic_bic  s(   
*
r   c               	   C   s   t jd} t| }|j}tD ]5}|j| }t|dd| |dd}t|dd| |dd}tj	}t
 t_	z|| || W |t_	q|t_	w d S )Nr   rk   )rP   rc   re   r@   r/   verboser<   )r   r   r    r:   rP   rV   r2   r   sysstdoutr   rg   )r1   rw   rP   rM   r2   rx   r   Z
old_stdoutr7   r7   r8   test_gaussian_mixture_verbose)  s8   

r   r   )r   rk   r<   c              	   C   s(  | }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sWJ t|ddd|dd	d
}t|ddd|dd	d
}|| |jrwJ || tdD ]}|| |jr nq|jsJ d S )Nr   rk   r<   r   F)rP   rc   rd   re   r@   
warm_startTr   ư>)rP   rc   rd   re   r@   r   rb   r   )r   r   r    rQ   r   rg   r   r   r   r   r   
converged_rT   )r   r@   r1   r*   r+   rP   r2   rx   r   Zscore1Zscore2r3   r7   r7   r8   test_warm_startH  sl   

		




r   z-ignore::sklearn.exceptions.ConvergenceWarningc                  C   s|   t jd} t| }|j}|jd }dD ]'}t|d|| d}tdD ]}|| |j	r. nq"|j	s4J ||j
ks;J qd S )Nr   r   )rk   r<   r=   T)rP   r   rd   r@   r   )r   r   r    r:   rP   r2   r   rT   rg   r   n_iter_)r1   rw   rP   r2   rd   rh   r3   r7   r7   r8   )test_convergence_detected_with_warm_start  s&   


r   c                 C   sN  d}t jd}t|d| d}|j}|j| }|j| ksJ t|ddd||d}d}tj	t
|d || W d    n1 sAw   Y  t  td	t || W d    n1 s`w   Y  |jj| ksmJ |jj| ksuJ ||}|| }	t||	 |	j| ksJ t|dd||d
|}
|
|||ksJ d S )Nr   r      rX   r0   rk   r   r   rl   ignorer   )r   r   r    r:   rP   r2   r0   r   rr   rs   r
   r   warningscatch_warningssimplefilterr	   rg   r   r   score_samplesr   r   )r   rM   r1   rw   rP   r2   gmm1ry   Z	gmm_scoreZgmm_score_probagmm2r7   r7   r8   
test_score  sN   
	


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 s8w   Y  ||
|}|jd |jksOJ d S )	Nr   r   r   r   rk   r   r   rl   )r   r   r    r:   rP   r2   r   rr   rs   r
   r  rg   rq   r*   )rM   r1   rw   rP   r2   rh   ry   Zgmm_score_samplesr7   r7   r8   test_score_samples  s&   
r	  c            	   
   C   s   t jd} t| dd}|j}tD ]Q}|j| }t||ddd| dd}t j }t	
 / t	dt td	D ]}|}|||}||ksHJ |jrM nq6|jsSJ W d    n1 s]w   Y  qd S )
Nr   r   r   Trk   r   )rP   r/   re   r   rd   r@   rb   r  iX  )r   r   r    r:   rP   rV   r2   r   infr  r  r  r	   rT   rg   r   r   )	r1   rw   rP   rM   r2   rh   Zcurrent_log_likelihoodr3   Zprev_log_likelihoodr7   r7   r8   test_monotonic_likelihood  s8   
	
r  c               
   C   s   t jd} d\}}t t |d |ft |d |ff}tD ]N}t|d|| d}t	 8 t
dt td}tjt|d || W d    n1 sRw   Y  |jdd	| W d    n1 sjw   Y  q!d S )
Nr   )r^   r   r<   )rP   re   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, increase reg_covar, or scale the input data.rl   r   )re   )r   r   r    r)   r   r   rV   r   r  r  r  RuntimeWarningro   rp   rr   rs   rt   rg   Z
set_params)r1   r*   r+   r2   rM   rh   ry   r7   r7   r8   test_regularisation  s0   "
r  rM   c           	      C   s   t jd}t|d|d}|j}|j|  }t|| |dd}|| |jj	|ks*J |j
j	|ks2J | dkrLt|j|j
D ]\}}tt|| q=d S | dkr\tt|j|j
 d S t|jd|j
  d S )	Nr   r   r   r   r   r   r   rD   )r   r   r    r:   rP   r2   r   rg   r   r0   r   r"   r   r   rG   )	rM   r   r1   rw   rP   r2   rh   r   Zcovarr7   r7   r8   ,test_fitted_precision_covariance_concistency0  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=w   Y  || d}t	j
t|d |d W d    n1 s`w   Y  d	}||\ t|D ]^}	|d
krt|j|	 t  |	k jdd qr|dkrt|jt  |	k jdd qr|dkrt|j|	 t t  |	k jdd qrt|j|	 t  |	k |j|	  dd qrt  fddt|D }
t|j|
dd  j||fksJ tddD ]}||\ } j||fks	J qqd S )Nr   r   r_   )rX   rP   r}   z+This GaussianMixture instance is not fittedrl   zInvalid value for 'n_samples'i N  r   rk   )decimalr   r   c                    s    g | ]}t  |k d qS )r   )r   r   r   ZX_sZy_sr7   r8   rB   v  r   ztest_sample.<locals>.<listcomp>r   )r   r   r    r:   r+   rP   rV   r2   r   rr   rs   r
   samplerg   rt   rT   r   r   r   r   r   varr   rS   rq   )r1   rw   r+   rP   rM   r2   rh   ry   r*   rO   Zmeans_sZsample_sizer3   r7   r  r8   test_sampleI  sZ   

"r  c                  C   st   t dD ]3} ttj| ddd}|j}|jd }t|dd| d|}t|dd| d|}|j	|j	ks7J qd S )N   r=   rk   )r*   rX   r   )rP   rc   rd   r@   r^   )
rT   r:   r   r   r    rP   r2   r   rg   lower_bound_)r@   rw   rP   r2   r  r  r7   r7   r8   	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rJJ dD ]	}t	||sUJ qLd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`   r_   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   rk   )r/   re   r{   rn   r@   rP   r   rd   )r   r   r   precisions_cholesky_r   r  Zlower_bounds_N)
r   r   r    uniformrS   r   r   rg   r   hasattr)Zrndr*   r2   r{   r   rn   rh   attrr7   r7   r8   )test_gaussian_mixture_setting_best_params  s>   

	

	r  rf   )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 ||	r7J q+d S )Nr   r   r   r   )rP   rf   r@   rd   r<   )r)r   r   r    r:   rP   r2   r   rg   r   	itertoolscombinationsZallclose)
rf   global_random_seedr1   rw   rP   r2   rh   r-   Zi_meanZj_meanr7   r7   r8   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s.J t 
|jdd|jks<J t 
|j|jddksJJ |jsOJ |jj|ksWJ |jj|ks_J |jj|ksgJ d S )Nr   r   r   )rP   rf   r@   rk   r   r   )r   r   r    r:   rP   r2   r   rg   r   rq   allru   rv   r   r0   r   r   )rf   r#  r   r1   rw   rP   r2   rh   r7   r7   r8   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   )rP   r@   r{   rb   rd   )
r   r   r    r:   rP   r2   r   rg   r   r   )r1   rw   rP   r2   r{   rh   r7   r7   r8   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\}}}|j| kspJ d
| }t|||	||
d|}|jj| ksJ |jj| ksJ |jj| ksJ t|||	|
d|}|jj| ksJ |jj| ksJ |jj| ksJ |j|jksJ 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   rk   )Z
n_clustersrc   r@   )re   r/   )rP   r/   re   r   r@   )rP   r/   re   r@   N)r   r   r    r   rS   r   r)   r(   r   rq   r   rg   Zlabels_Zaranger   r0   r   r   r   r  r   r   )r   r*   r1   Zshifted_gaussianCZstretched_gaussianr2   rP   r/   re   r@   r   labelr3   rH   r   Zgm_with_initZgm_without_initr7   r7   r8   *test_gaussian_mixture_precisions_init_diag  sZ   r+  c                 C   sZ   t j| }|||f|}|||f|}||jddddt jf  }||fS )z/Randomly generate samples and responsibilities.rk   r   N)r   r   r    Zrandom_sampler(   rR   r   )r   r*   r+   rP   r0   rsr2   r   r7   r7   r8   _generate_data`  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   )rP   r/   )r   r   rq   r   Z_set_parametersr   r  )r2   r   r/   re   r,   r-   rL   Zprecisions_choleskyr3   rP   rh   paramsr7   r7   r8   _calculate_precisionsi  s   



r/  r/   c           	      C   sn   t |ddd|d\}}t||| \}}|j|ksJ |j|ks!J t| |d}||| |j}t|| dS )zNon-regression test for #26415.r   r_   r   )r   r*   r+   rP   r0   )r/   r   N)r-  r/  r0   r   _initializer  r   )	r/   r#  r   r2   r   r   Zdesired_precisions_choleskyrh   Zactual_precisions_choleskyr7   r7   r8   %test_gaussian_mixture_precisions_init~  s$   
r1  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<   r_   r  rk   rj   N)	r   r   r    r$   r   identityr   rg   r  )r1   r2   r   r7   r7   r8   -test_gaussian_mixture_single_component_stable  s   
r3  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s7J dS )zWhen all init parameters are provided, the Gaussian parameters
    are not estimated.

    Non-regression test for gh-26015.
    )Zside_effectr   r   )rP   rn   r{   r   r@   N)r   r   setattrsklearnZmixtureZ_gaussian_mixturer   r   r    r:   r   rP   r,   r-   r.   rg   r2   Z
call_countr   )Zmonkeypatchr#  Zmockr1   rw   r   r7   r7   r8   Dtest_gaussian_mixture_all_init_does_not_estimate_gaussian_parameters  s   


r6  )]r   r!  ro   r   r  ior   Zunittest.mockr   numpyr   rr   Zscipyr   r   r5  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   rV   r]   r9   r:   ri   rz   r|   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/  r1  r3  r6  r7   r7   r7   r8   <module>   s   $	
'>09*0
		9

C
0" 

9
F

D	
