o
    ¢Äi‘˜  ã                   @   s~  d dl Z d dlZd dlmZ d dl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 d d	lmZmZmZmZmZmZ d d
lm Z  d dl!m"Z"m#Z#m$Z$ d dl%m&Z&m'Z' d dl(m)Z) d dl*m+Z+m,Z,m-Z-m.Z. d dl/m0Z0m1Z1 e 2d dd¡Z3e 4e3e3¡\Z5Z6e 7e5 8¡  9dd¡e6 8¡  9dd¡g¡Z:dd„ Z;dd„ Z<dd„ Z=dd„ Z>dd„ Z?dd„ Z@dd „ ZAd!d"„ ZBejC Dd#d$d%g¡ejC Dd&d'¡d(d)„ ƒƒZEd*d+„ ZFejC Dd#d$d%g¡ejC Dd,e0¡d-d.„ ƒƒZGd/d0„ ZHd1d2„ ZIejC Dd3d$ejJfd%ejJfgd4d5„ e0D ƒ¢¡ejC Dd6d7gd8ggd9fd7d:gd8d7ggd;fg¡d<d=„ ƒƒZKejC Dd,e0¡d>d?„ ƒZLejC Dd,e0¡d@dA„ ƒZMejC NdB¡ejC DdCe0e1 ¡dDdE„ ƒƒZOdFdG„ ZPdHdI„ ZQdJdK„ ZRdLdM„ ZSejC Dd,e0¡dNdO„ ƒZTdPdQ„ ZUdRdS„ ZVdTdU„ ZWejC Dd,e0¡dVdW„ ƒZXejC Dd,e0¡dXdY„ ƒZYejC Dd,e0¡dZd[„ ƒZZ	\	]	 dŠd^d_„Z[d`da„ Z\dbdc„ Z]ddde„ Z^ejC Dd#d%d$g¡ejC Ddfej_ej`g¡dgdh„ ƒƒZaejC Dd#d%d$g¡didj„ ƒZbdkdl„ Zce.dmdn„ ƒZddodp„ Zedqdr„ ZfejC Dd#d%d$g¡dsdt„ ƒZgd‹dudv„Zhdwdx„ Zidydz„ ZjejC Dd{d|e#fd}e"fg¡ejC Dd#d%d$g¡d~d„ ƒƒZkejC Dd#d$d%g¡d€d„ ƒZld‚dƒ„ ZmejC Dd„d…¡d†d‡„ ƒZndˆd‰„ ZodS )Œé    N)ÚStringIO)Úassert_allclose)Ú
check_grad)ÚpdistÚ
squareform)Úconfig_context)Ú
make_blobs)ÚTSNEÚ_barnes_hut_tsne)Ú_gradient_descentÚ_joint_probabilitiesÚ_joint_probabilities_nnÚ_kl_divergenceÚ_kl_divergence_bhÚtrustworthiness)Ú_binary_search_perplexity)Úcosine_distancesÚmanhattan_distancesÚpairwise_distances)ÚNearestNeighborsÚkneighbors_graph)Úcheck_random_state)Úassert_almost_equalÚassert_array_almost_equalÚassert_array_equalÚskip_if_32bit)ÚCSR_CONTAINERSÚLIL_CONTAINERSé   é
   éÿÿÿÿc                  C   sâ  G dd„ dƒ} ddd„}t j}tƒ t _z$t| ƒ t d¡dddd	d	d	d
dd
\}}}W t j ¡ }t j ¡  |t _nt j ¡ }t j ¡  |t _w |dksLJ ‚|dksRJ ‚d|v sXJ ‚t j}tƒ t _z#t|t d¡dddd	d	d	d	dd
\}}}W t j ¡ }t j ¡  |t _nt j ¡ }t j ¡  |t _w |d	ks—J ‚|dksJ ‚d|v s£J ‚t j}tƒ t _z$t| ƒ t d¡dddd	d	d	d	dd
\}}}W t j ¡ }t j ¡  |t _nt j ¡ }t j ¡  |t _w |d	ksãJ ‚|dkséJ ‚d|v sïJ ‚d S )Nc                   @   s   e Zd Zdd„ Zddd„ZdS )z;test_gradient_descent_stops.<locals>.ObjectiveSmallGradientc                 S   s
   d| _ d S ©Nr    )Úit)Úself© r$   ú[/home/kim/smarthome/.venv/lib/python3.10/site-packages/sklearn/manifold/tests/test_t_sne.pyÚ__init__9   s   
zDtest_gradient_descent_stops.<locals>.ObjectiveSmallGradient.__init__Tc                 S   s(   |  j d7  _ d| j  d t dg¡fS )Nr   r   ç      $@çñhãˆµøä>)r"   ÚnpÚarray)r#   Ú_Úcompute_errorr$   r$   r%   Ú__call__<   s   zDtest_gradient_descent_stops.<locals>.ObjectiveSmallGradient.__call__N©T)Ú__name__Ú
__module__Ú__qualname__r&   r-   r$   r$   r$   r%   ÚObjectiveSmallGradient8   s    r2   Tc                 S   s   dt  d¡fS )Nç        r   )r)   Úones)r+   r,   r$   r$   r%   Úflat_function@   s   z2test_gradient_descent_stops.<locals>.flat_functionr   r   éd   r3   r(   é   )Úmax_iterÚn_iter_without_progressZmomentumÚlearning_rateZmin_gainÚmin_grad_normÚverboseç      ð?úgradient normr   é   zdid not make any progresszIteration 10r.   )ÚsysÚstdoutr   r   r)   ÚzerosÚgetvalueÚclose)r2   r5   Ú
old_stdoutr+   Úerrorr"   Úoutr$   r$   r%   Útest_gradient_descent_stops6   s”   
ö


þ
ö


þ
ö


þ
rH   c                     s€   t dƒ} |  dd¡}t|ƒ tj¡}d}t||dd‰ t ˆ t tj	¡j
¡‰ t ‡ fdd„tˆ jd ƒD ƒ¡}t||dd	 d S )
Nr   é2   é   ç      9@©r<   c                    s0   g | ]}t  t  ˆ | t  ˆ | ¡ ¡ ¡‘qS r$   )r)   ÚexpÚsumÚlog)Ú.0Úi©ÚPr$   r%   Ú
<listcomp>•   s   0 z&test_binary_search.<locals>.<listcomp>é   ©Údecimal)r   Úrandnr   Úastyper)   Úfloat32r   ÚmaximumZfinfoÚdoubleÚepsÚmeanÚrangeÚshaper   )Úrandom_stateÚdataÚ	distancesÚdesired_perplexityZmean_perplexityr$   rR   r%   Útest_binary_searchŒ   s   ÿre   c               
   C   sv   t dƒ} |  dd¡ tj¡d }d}t||dd}dt |ddd …f t |ddd …f ¡ ¡  }t||d	d
 d S )Né*   r   éZ   r6   g      >@r   rL   r7   rU   rV   )	r   rX   rY   r)   rZ   r   ZnansumÚlog2r   )ra   rb   rd   rS   Ú
perplexityr$   r$   r%   Útest_binary_search_underflowš   s   2rj   c                     sš  d} d}t dƒ}| | d¡jtjdd}t|ƒ}t||dd‰ | d }tƒ  |¡}|j	|d	d
‰ˆj
jtjdd}| | |¡}t||dd}ˆj‰t ‡ ‡‡fdd„t| ƒD ƒ¡}	t|	|dd t d| d d¡D ]a}
t|
ƒ}
|
d }|j	|
d	d
‰ˆj
jtjdd}| | |
¡}t||dd}t|	|dd t ˆ  ¡ ¡d d d… }ˆ  ¡ | d |… }t | ¡ ¡d d d… }| ¡ | d |… }t||dd qid S )NéÈ   rK   r   r7   F©ÚcopyrL   r   Údistance©Ún_neighborsÚmodec              	      s.   g | ]}ˆ |ˆj ˆ| ˆ|d   … f ‘qS )r   )Úindices)rP   Úk©ÚP1Údistance_graphÚindptrr$   r%   rT   »   s     ÿÿz0test_binary_search_neighbors.<locals>.<listcomp>é   rV   é–   rJ   r   r    )r   rX   rY   r)   rZ   r   r   r   Úfitr   rb   Úreshaperw   r*   r_   r   ÚlinspaceÚintZargsortÚravel)Ú	n_samplesrd   ra   rb   rc   rp   ÚnnZdistances_nnZP2ZP1_nnrs   ZtopnZP2kÚidxZP1topZP2topr$   rt   r%   Útest_binary_search_neighbors¦   sB   þÿôr‚   c                  C   sÄ   d} d}t dƒ}| |d¡}tƒ  |¡}|j| dd}|jjtjdd}| 	|| ¡}d }d	}t
dƒD ]-}	t| ¡ |dd
}
t||dd
}| ¡ }|d u rQ|
}|}q2t|
|dd t||dd q2d S )Nr   r6   r   rJ   rn   ro   Frl   rU   rL   rx   rV   )r   rX   r   rz   r   rb   rY   r)   rZ   r{   r_   r   rm   r   Útoarrayr   )rp   r   ra   rb   r€   rv   rc   Zlast_Prd   r+   rS   ru   Zlast_P1r$   r$   r%   Ú test_binary_perplexity_stabilityÒ   s(   ör„   c                     s®   t dƒ} d‰d}d‰d‰|  ˆ|¡ tj¡}t | |j¡¡}t |d¡ |  ˆˆ¡ tj¡}t	|ddd‰ ‡ ‡‡‡fdd	„}‡ ‡‡‡fd
d„}t
t||| ¡ ƒddd d S )Nr   rI   r7   r=   r3   rK   )rd   r<   c                    ó   t | ˆ ˆˆˆƒd S )Nr   ©r   ©Úparams©rS   ÚalphaÚn_componentsr   r$   r%   Úfuný   ó   ztest_gradient.<locals>.func                    r…   )Nr   r†   r‡   r‰   r$   r%   Úgrad   r   ztest_gradient.<locals>.gradrJ   rV   )r   rX   rY   r)   rZ   ÚabsÚdotÚTZfill_diagonalr   r   r   r~   )ra   Ú
n_featuresrc   Ú
X_embeddedrŒ   rŽ   r$   r‰   r%   Útest_gradientí   s   r”   c                  C   s¬   t dƒ} |  dd¡}t|d|d  ƒdksJ ‚t d¡ dd¡}| ¡ }|  |¡ t||ƒd	k s2J ‚t d
¡ dd¡}t dgdgdgdgdgg¡}t	t||dddƒ d S )Nr   r6   r7   ç      @r'   r=   r    r   g333333ã?rJ   rx   rU   ©rp   gš™™™™™É?)
r   rX   r   r)   Úaranger{   rm   Úshuffler*   r   )ra   ÚXr“   r$   r$   r%   Útest_trustworthiness  s   
rš   c                  C   s’   d} t j d¡}| dd¡}| dd¡}tjt| d t||dd W d	  ƒ n1 s-w   Y  t||d
d}d|  krDdksGJ ‚ J ‚d	S )z[Raise an error when n_neighbors >= n_samples / 2.

    Non-regression test for #18567.
    z%n_neighbors .+ should be less than .+rf   é   rx   r7   ©ÚmatchrJ   r–   NrU   r   r   )r)   ÚrandomZRandomStateZrandÚpytestÚraisesÚ
ValueErrorr   )ÚregexÚrngr™   r“   Útrustr$   r$   r%   Ú&test_trustworthiness_n_neighbors_error  s   ÿ r¥   ÚmethodÚexactÚ
barnes_hutÚinit)rž   Úpcac                 C   s\   t dƒ}d}| d|¡ tj¡}t||d| ddd}| |¡}t||dd}|d	ks,J ‚d S )
Nr   r7   rI   i¼  Úauto)r‹   r©   ra   r¦   r8   r:   r   r–   g333333ë?)r   rX   rY   r)   rZ   r	   Úfit_transformr   )r¦   r©   ra   r‹   r™   Útsner“   Útr$   r$   r%   Ú+test_preserve_trustworthiness_approximately*  s   ú
r¯   c               	   C   s|   t dƒ} td| d\}}g }dD ]}tdddd|dd	}| |¡ | |j¡ q|d
 |d ks2J ‚|d |d
 ks<J ‚dS )z=t-SNE should give a lower KL divergence with more iterations.r   rU   )r’   ra   )éú   é,  i^  r7   rž   r   ç      Y@)r‹   r©   ri   r:   r8   ra   r   N)r   r   r	   r¬   ÚappendÚkl_divergence_)ra   r™   r+   Zkl_divergencesr8   r­   r$   r$   r%   Ú)test_optimization_minimizes_kl_divergence>  s    ú
rµ   Úcsr_containerc              	   C   sx   t dƒ}| dd¡}d|| ddd¡| ddd¡f< ||ƒ}tddddd| d	d
}| |¡}tt||ddddd d S )Nr   rI   r7   r3   é   rž   r   r²   iî  )r‹   r©   ri   r:   ra   r¦   r8   r   r–   r=   g)\Âõ(¼?©Zrtol)r   rX   Úrandintr	   r¬   r   r   )r¦   r¶   r£   r™   ZX_csrr­   r“   r$   r$   r%   Útest_fit_transform_csr_matrixR  s    ù
	rº   c                  C   st   t dƒ} tdƒD ]/}|  dd¡}tt|ƒdƒ}tddddd|dd	d
d	}| |¡}t||ddd}|dks7J ‚qd S )Nr   rU   éP   r7   Zsqeuclideanr²   ç       @Úprecomputedéô  rž   )	r‹   ri   r:   Úearly_exaggerationÚmetricra   r<   r8   r©   r   )rp   rÀ   gffffffî?)r   r_   rX   r   r   r	   r¬   r   )ra   rQ   r™   ÚDr­   r“   r®   r$   r$   r%   ÚFtest_preserve_trustworthiness_approximately_with_precomputed_distancesi  s&   ÷
ðrÂ   c                  C   s@   t dƒ} |  dd¡}t||ddtt|dd|ddksJ ‚d S )Nr   r6   r7   Úcosine©rÀ   r½   )r   rX   r   r   )ra   r™   r$   r$   r%   Ú)test_trustworthiness_not_euclidean_metric  s
   ÿrÅ   zmethod, retypec                 C   s   g | ]}d |f‘qS )r¨   r$   )rP   r¶   r$   r$   r%   rT   Ž  s    rT   zD, message_regexr3   r=   z.* square distance matrixg      ð¿z.* positive.*c                 C   sT   t d| dddd}tjt|d | ||ƒ¡ W d   ƒ d S 1 s#w   Y  d S )Nr½   rž   rf   r   ©rÀ   r¦   r©   ra   ri   rœ   )r	   rŸ   r    r¡   r¬   )r¦   rÁ   ZretypeZmessage_regexr­   r$   r$   r%   Útest_bad_precomputed_distances‰  s   û"ÿrÇ   c                 C   s`   t dddddd}tjtdd | | d	d
gd
d	ggƒ¡ W d   ƒ d S 1 s)w   Y  d S )Nr½   r§   rž   rf   r   rÆ   Úsparserœ   r   rJ   ©r	   rŸ   r    Ú	TypeErrorr¬   ©r¶   r­   r$   r$   r%   Ú test_exact_no_precomputed_sparse¤  s   û"ÿrÌ   c                 C   sv   t  g d¢g d¢g d¢g¡}| |ƒ}tddddd}d}tjt|d	 | |¡ W d   ƒ d S 1 s4w   Y  d S )
N)r=   r3   r3   )r3   r=   r3   r½   rž   rf   r   )rÀ   r©   ra   ri   zB3 neighbors per samples are required, but some samples have only 1rœ   )r)   r*   r	   rŸ   r    r¡   r¬   )r¶   ÚdistZbad_distr­   Úmsgr$   r$   r%   Ú1test_high_perplexity_precomputed_sparse_distances±  s   "ÿrÏ   zaignore:Precomputed sparse input was not sorted by row values:sklearn.exceptions.EfficiencyWarningÚsparse_containerc                 C   s~   t dƒ}| dd¡}t|dddd}t|ƒ}t |¡sJ ‚t| ¡ |ƒ tdddd	d
}| 	|¡}| 	| |ƒ¡}t||ƒ dS )zAMake sure that TSNE works identically for sparse and dense matrixr   r6   r7   rn   T)rp   rq   Zinclude_selfr½   rž   r«   )rÀ   ra   r©   r:   N)
r   rX   r   r   ÚspÚissparser   rƒ   r	   r¬   )rÐ   ra   r™   ZD_sparserÁ   r­   ZXt_denseZ	Xt_sparser$   r$   r%   Ú test_sparse_precomputed_distance¼  s   ÿ
rÓ   c                  C   sj   dd„ } t | ddd}t ddgddgg¡}tjtdd	 | |¡ W d   ƒ d S 1 s.w   Y  d S )
Nc                 S   s   dS r!   r$   )ÚxÚyr$   r$   r%   rÀ   Ö  s   z4test_non_positive_computed_distances.<locals>.metricr§   r   )rÀ   r¦   ri   r3   r=   zAll distances .*metric given.*rœ   )r	   r)   r*   rŸ   r    r¡   r¬   )rÀ   r­   r™   r$   r$   r%   Ú$test_non_positive_computed_distancesÔ  s   "ÿrÖ   c                  C   s6   t t d¡dd} |  t d¡¡}tt d¡|ƒ d S )N©r6   r7   r«   )r©   r:   )r6   rJ   )r	   r)   rB   r¬   r4   r   )r­   r“   r$   r$   r%   Útest_init_ndarrayà  s   rØ   c                  C   s(   t t d¡ddd} |  t d¡¡ d S )Nr×   r½   g      I@)r©   rÀ   r:   )r6   r6   )r	   r)   rB   rz   ©r­   r$   r$   r%   Útest_init_ndarray_precomputedç  s   ýrÚ   c                  C   óZ   t dddd} tjtdd |  t dgdgg¡¡ W d   ƒ d S 1 s&w   Y  d S )	Nr½   rª   r   )rÀ   r©   ri   zBThe parameter init="pca" cannot be used with metric="precomputed".rœ   r3   r=   ©r	   rŸ   r    r¡   r¬   r)   r*   rÙ   r$   r$   r%   Ú>test_pca_initialization_not_compatible_with_precomputed_kernelò  s   þ"ürÝ   c                 C   s\   t dddd}tjtdd | | ddgddggƒ¡ W d   ƒ d S 1 s'w   Y  d S )	Nrª   r²   r   )r©   r:   ri   zPCA initialization.*rœ   r   rJ   rÉ   rË   r$   r$   r%   Ú8test_pca_initialization_not_compatible_with_sparse_inputü  s   "ÿrÞ   c                  C   rÛ   )	Nrx   r¨   r   )r‹   r¦   ri   z'n_components' should be .*rœ   r3   r=   rÜ   rÙ   r$   r$   r%   Útest_n_components_range  s   "ÿrß   c                  C   sŠ   t dƒ} d}ddg}|  d|¡ tj¡}|D ],}t|dddd|d	d
d}| |¡}t|dddd|dd
d}| |¡}t ||¡rBJ ‚qd S )Nr   r7   r§   r¨   r·   r   r²   rª   r=   r°   ©r‹   ri   r:   r©   ra   r¦   r¿   r8   r'   )r   rX   rY   r)   rZ   r	   r¬   Zallclose)ra   r‹   Úmethodsr™   r¦   r­   ZX_embedded1ZX_embedded2r$   r$   r%   Útest_early_exaggeration_used  s:   ø

ø

èrâ   c                  C   st   t dƒ} d}ddg}|  d|¡ tj¡}|D ]!}dD ]}t|ddd	d|d
|d}| |¡ |j|d ks6J ‚qqd S )Nr   r7   r§   r¨   r·   )éû   r¾   r   ç      à?rž   r=   rà   )r   rX   rY   r)   rZ   r	   r¬   Ún_iter_)ra   r‹   rá   r™   r¦   r8   r­   r$   r$   r%   Útest_max_iter_used,  s(   ø

óÿræ   c                 C   sh   t  ddgddgg¡}t  ddgddgg¡}t  dgdgg¡}t  d	d
gddgg¡}t||||| ƒ d S )Nr=   r3   gbv›î
¿güC…r³¿gJ!zëE?gÒ)§x>µ1?r   r   g¹KÈXAÚø¾gµÎþr}¿g¹KÈXAÚø>gµÎþr}?©r)   r*   Ú_run_answer_test©r¶   Ú	pos_inputÚ
pos_outputÚ	neighborsÚgrad_outputr$   r$   r%   Útest_answer_gradient_two_pointsC  s   ÿÿrî   c                 C   sœ   t  ddgddgddgddgg¡}t  ddgd	d
gddgddgg¡}t  g d¢g d¢g d¢g d¢g¡}t  ddgddgddgddgg¡}t||||| ƒ d S )Nr=   r3   r•   r¼   ç333333@çš™™™™™@ç$·á1á?ç›mƒ´ª¿ç5a ƒÒ‡&¿çIiò³mù¿çU Ÿ Æ-¿çÜ|3SÙµ?ç›È:Ç¿çä$Ä*¹Ç¿©r   r7   rU   ©r   r7   rU   ©r   r   rU   ©r   r7   r   g\¥$Æw?g×Rn		Qà¾gz¡}¿g³«ûÙÕ`à>ç4Ž1Çf>ç6×ÆS×c¾ç>ÛÔgU9&¾ç¸#£*@>rç   ré   r$   r$   r%   Ú test_answer_gradient_four_pointsT  s"   "üÿ"üÿr  c              	   C   s¢   t  ddgddgddgddgg¡}t  ddgd	d
gddgddgg¡}t  g d¢g d¢g d¢g d¢g¡}t  ddgddgddgddgg¡}t||||| dddƒ d S )Nr=   r3   r•   r¼   rï   rð   rñ   rò   ró   rô   rõ   rö   r÷   rø   rù   rú   rû   rü   rý   rþ   rÿ   r   Fçš™™™™™¹?r7   rç   ré   r$   r$   r%   Útest_skip_num_points_gradiento  s&   "	üÿ"üÿÿr  Fr  c                 C   s´   t | ƒ tj¡}|||f}	| tj¡}|jtjdd}t|	Ž }
t|
ƒ tj¡}
tj|jtjd}||
ƒ}|j	 tj¡}|j
 tj¡}tj|j||||ddddd	 t||d	d
 d S )NFrl   )Údtyperä   r7   r   r   )Úskip_num_pointsrx   rV   )r   rY   r)   rZ   Zint64r   r   rB   r`   rr   rw   r
   Zgradientrb   r   )rê   rë   rì   rí   r¶   r<   ri   r  rc   ÚargsZ	pij_inputÚgrad_bhrS   rw   r$   r$   r%   rè     s   

ÿrè   c                  C   s´   t dƒ} tddd}|  dd¡}tj}tƒ t_z| |¡ W tj ¡ }tj ¡  |t_ntj ¡ }tj ¡  |t_w d|v s@J ‚d|v sFJ ‚d|v sLJ ‚d	|v sRJ ‚d
|v sXJ ‚d S )Nr   r7   rx   )r<   ri   rJ   z[t-SNE]znearest neighbors...z"Computed conditional probabilitiesz
Mean sigmazearly exaggeration)	r   r	   rX   r@   rA   r   r¬   rC   rD   )ra   r­   r™   rE   rG   r$   r$   r%   Útest_verbose¬  s$   


þ
r  c                  C   s.   t dƒ} tddd}|  dd¡}| |¡ d S )Nr   Z	chebyshevrx   )rÀ   ri   rJ   r7   )r   r	   rX   r¬   )ra   r­   r™   r$   r$   r%   Útest_chebyshev_metricÂ  s   r	  c                  C   sD   t dƒ} tddd}|  dd¡}| |¡j}t t |¡¡s J ‚d S )Nr   r   rx   )r‹   ri   rJ   r7   )r   r	   rX   rz   Z
embedding_r)   ÚallÚisfinite)ra   r­   r™   r“   r$   r$   r%   Útest_reduction_to_one_componentÊ  s
   r  Údtc              
   C   sX   t dƒ}| dd¡j|dd}tdddd| dddd	}| |¡}|j}|tjks*J ‚d S )
Nr   r   r7   Frl   r²   r±   rž   ©r‹   ri   r:   ra   r¦   r<   r8   r©   )r   rX   rY   r	   r¬   r  r)   rZ   )r¦   r  ra   r™   r­   r“   Zeffective_typer$   r$   r%   Ú
test_64bitÓ  s   ø

r  c              
   C   sJ   t dƒ}| dd¡}tdddd| dddd}| |¡ t |j¡r#J ‚d S )Nr   rI   r7   r²   i÷  rž   r  )r   rX   r	   r¬   r)   Úisnanr´   )r¦   ra   r™   r­   r$   r$   r%   Útest_kl_divergence_not_nanì  s   ø

r  c                  C   sè   d} d}d}dD ]i}d}t |d ƒ}tdƒ}| ||¡}t|ƒ}| ||¡}	t||dd}
t|	|
|||ƒ\}}|d	 }tƒ  |¡j|d
d}t	||dd}t
|	||||| ddd\}}t|
ƒ}
| ¡ }t||
dd t||dd qd S )Nr3   r   r6   )r7   rU   rJ   r=   r   rL   r   rn   ro   )Úangler  r<   rV   rU   )Úfloatr   rX   r   r   r   r   rz   r   r   r   r   rƒ   r   r   )r  ri   r   r‹   r’   Údegrees_of_freedomra   rb   rc   rˆ   rS   Zkl_exactZ
grad_exactrp   Údistances_csrÚP_bhZkl_bhr  r$   r$   r%   Útest_barnes_hut_angle  sH   
ÿþÿ
øÞr  c               
   C   s¤   t dƒ} |  dd¡}dD ]C}tdddd|dd	d
}d|_d|_tj}tƒ t_z| |¡ W tj 	¡ }tj 
¡  |t_ntj 	¡ }tj 
¡  |t_w d|v sOJ ‚qd S )Nr   r6   r   )r¨   r§   r    r7   g    „×—Ai_  rž   )r9   r<   r:   ra   r¦   r8   r©   r   z@did not make any progress during the last -1 episodes. Finished.)r   rX   r	   Z_N_ITER_CHECKÚ_EXPLORATION_MAX_ITERr@   rA   r   r¬   rC   rD   )ra   r™   r¦   r­   rE   rG   r$   r$   r%   Útest_n_iter_without_progress,  s4   ù	


þ
ér  c                  C   s  t dƒ} |  dd¡}d}t|dddd}tj}tƒ t_z| |¡ W tj ¡ }tj ¡  |t_ntj ¡ }tj ¡  |t_w | 	d¡}g }|D ])}d|v rO n"| 
d	¡}	|	dkrp||	d … }| d
d¡ 	d¡d }| t|ƒ¡ qGt |¡}t|||k ƒ}
|
dks„J ‚d S )Nr   r6   r7   gü©ñÒMb`?r§   )r;   r<   ra   r¦   Ú
ZFinishedr>   zgradient norm = Ú ú r   )r   rX   r	   r@   rA   r   r¬   rC   rD   ÚsplitÚfindÚreplacer³   r  r)   r*   Úlen)ra   r™   r;   r­   rE   rG   Z	lines_outZgradient_norm_valuesÚlineZstart_grad_normZn_smaller_gradient_normsr$   r$   r%   Útest_min_grad_normK  s<   


þ


€

ÿr"  c                  C   sÜ   t dƒ} |  dd¡}tdddddd}tj}tƒ t_z| |¡ W tj ¡ }tj ¡  |t_ntj ¡ }tj ¡  |t_w | 	d¡d d d… D ]}d	|v ra| 
d
¡\}}}|ra| 
d¡\}}} nqGt|jt|ƒdd d S )Nr   rI   r7   r§   r¾   )r9   r<   ra   r¦   r8   r  r    Z	Iterationzerror = ú,rJ   rV   )r   rX   r	   r@   rA   r   r¬   rC   rD   r  Ú	partitionr   r´   r  )ra   r™   r­   rE   rG   r!  r+   rF   r$   r$   r%   Útest_accessible_kl_divergencev  s6   û


þ
€r%  c              
   C   sˆ   t dƒ}d}|D ]9}tdd|d|| dd}| t¡}d | |¡}zt||ƒ W q tyA   |d	7 }||_| t¡}t||ƒ Y qw d
S )a  Make sure that TSNE can approximately recover a uniform 2D grid

    Due to ties in distances between point in X_2d_grid, this test is platform
    dependent for ``method='barnes_hut'`` due to numerical imprecision.

    Also, t-SNE is not assured to converge to the right solution because bad
    initialization can lead to convergence to bad local minimum (the
    optimization problem is non-convex). To avoid breaking the test too often,
    we re-run t-SNE from the final point when the convergence is not good
    enough.
    rU   r¾   r7   rž   rI   r«   )r‹   r©   ra   ri   r8   r¦   r:   z{}_{}z:rerunN)r_   r	   r¬   Ú	X_2d_gridÚformatÚassert_uniform_gridÚAssertionErrorr©   )r¦   Zseedsr8   Úseedr­   ÚYÚtry_namer$   r$   r%   Útest_uniform_grid–  s.   ù
	
ùñr-  c                 C   s|   t dd | ¡}|jddd  ¡ }| ¡ dksJ ‚| ¡ t |¡ }| ¡ t |¡ }|dks4J |ƒ‚|dk s<J |ƒ‚d S )	Nr   r–   T)Zreturn_distancer   r  rä   r7   )r   rz   Z
kneighborsr~   Úminr)   r^   Úmax)r+  r,  r€   Z
dist_to_nnZsmallest_to_meanZlargest_to_meanr$   r$   r%   r(  ¾  s   r(  c                  C   s–   t dƒ} d}|  d|¡ tj¡}i }i }dD ]}td|ddddd	dd
}d|_| |¡||< |j||< q|d |d ks>J ‚t	|d |d dd d S )Nr   r   é   )r§   r¨   r7   r=   rž   rã   g     €=@)r‹   r¦   r:   r©   ra   r8   ri   r  r§   r¨   g-Cëâ6?r¸   )
r   rX   rY   r)   rZ   r	   r  r¬   rå   r   )ra   r’   r™   ZX_embeddedsr8   r¦   r­   r$   r$   r%   Útest_bh_match_exactÍ  s*   ør1  c                  C   sÎ   d} d}d}d}d}d}t dƒ}| || ¡ tj¡}| ||¡}|d }	tƒ  |¡j|	dd	}
t|
|dd
}t	||||||dddd	\}}dD ]}t	||||||dd|d	\}}t
||dd t
||ƒ qGd S )Nr   r0  r7   r   rU   rJ   r   rn   ro   rL   )r  r  r<   Únum_threads)r7   rx   gíµ ÷Æ°>r¸   )r   rX   rY   r)   rZ   r   rz   r   r   r   r   )r’   r   r‹   r  r  ri   ra   rb   rˆ   rp   r  r  Zkl_sequentialZgrad_sequentialr2  Zkl_multithreadZgrad_multithreadr$   r$   r%   Ú-test_gradient_bh_multithread_match_sequentialé  sT   þÿ
÷
÷òr3  zmetric, dist_funcÚ	manhattanrÃ   c           	   	   C   sˆ   |dkr| dkrt  d¡ tdƒ}d}d}| d|¡ tj¡}t| ||ddd	d
d |¡}td||ddd	d
d ||ƒ¡}t	||ƒ dS )z8Make sure that TSNE works for different distance metricsr¨   r4  zoDistance computations are different for method == 'barnes_hut' and metric == 'manhattan', but this is expected.r   rU   r7   rI   r±   rž   r«   )rÀ   r¦   r‹   ra   r8   r©   r:   r½   N)
rŸ   Zxfailr   rX   rY   r)   rZ   r	   r¬   r   )	rÀ   Z	dist_funcr¦   ra   Zn_components_originalZn_components_embeddingr™   ZX_transformed_tsneZX_transformed_tsne_precomputedr$   r$   r%   Ú)test_tsne_with_different_distance_metrics  s>   ÿùø	ù
ø	r5  c              
   C   sb   t dƒ}d}| d|¡}td| ddddddd	 |¡}td| ddddddd	 |¡}t||ƒ d
S )z=Make sure that the n_jobs parameter doesn't impact the outputr   r   r0  r7   rK   r   rž   r«   )r‹   r¦   ri   r  Zn_jobsra   r©   r:   N)r   rX   r	   r¬   r   )r¦   ra   r’   r™   ZX_tr_refZX_trr$   r$   r%   Útest_tsne_n_jobsN  s8   ø	÷
ø	÷r6  c            
      C   sÜ   t dƒ} d\}}|  ||¡}dddddddœ}tdd	d
i|¤Ž}d}tjt|d | |¡ W d  ƒ n1 s9w   Y  tt|d
ddd}tdd	di|¤Ž |¡}tdd
dt	 
|j¡idœ|¤Ž |¡}	t|	|ƒ dS )zAMake sure that method_parameters works with mahalanobis distance.r   )r±   r   é(   r°   r«   rž   rU   )ri   r8   r:   r©   r‹   ra   rÀ   Zmahalanobisz4Must provide either V or VI for Mahalanobis distancerœ   NrÄ   T)Zchecksr½   ÚV)rÀ   Zmetric_paramsr$   )r   rX   r	   rŸ   r    r¡   r¬   r   r   r)   Zcovr‘   r   )
ra   r   r’   r™   Zdefault_paramsr­   rÎ   Zprecomputed_XZX_trans_expectedZX_transr$   r$   r%   Ú#test_tsne_with_mahalanobis_distancel  s6   ú	ÿÿÿÿþr9  ri   )é   r0  c                 C   st   t dƒ}| dd¡}tdd| |d}t d| › d¡}tjt|d	 | |¡ W d
  ƒ d
S 1 s3w   Y  d
S )z=Make sure that perplexity > n_samples results in a ValueErrorr   r:  r7   r«   rª   )r:   r©   ri   ra   zperplexity (z") must be less than n_samples (20)rœ   N)	r   rX   r	   ÚreÚescaperŸ   r    r¡   r¬   )ri   ra   r™   ZestrÎ   r$   r$   r%   Útest_tsne_perplexity_validationŠ  s   ü"ÿr=  c                  C   s\   t  d¡ tdd t d¡ dd¡} tdd | ¡ W d  ƒ dS 1 s'w   Y  dS )	ziMake sure that TSNE works when the output is set to "pandas".

    Non-regression test for gh-25365.
    Zpandas)Ztransform_outputéŒ   é#   rx   r7   )r‹   N)rŸ   Zimportorskipr   r)   r—   r{   r	   r¬   )Zarrr$   r$   r%   Ú"test_tsne_works_with_pandas_output›  s
   
"þr@  )Fr  r   )N)pr;  r@   Úior   Únumpyr)   rŸ   Zscipy.sparserÈ   rÑ   Znumpy.testingr   Zscipy.optimizer   Zscipy.spatial.distancer   r   Zsklearnr   Zsklearn.datasetsr   Zsklearn.manifoldr	   r
   Zsklearn.manifold._t_sner   r   r   r   r   r   Zsklearn.manifold._utilsr   Zsklearn.metrics.pairwiser   r   r   Zsklearn.neighborsr   r   Zsklearn.utilsr   Zsklearn.utils._testingr   r   r   r   Zsklearn.utils.fixesr   r   r|   rÔ   ZmeshgridÚxxÚyyZhstackr~   r{   r&  rH   re   rj   r‚   r„   r”   rš   r¥   ÚmarkZparametrizer¯   rµ   rº   rÂ   rÅ   ZasarrayrÇ   rÌ   rÏ   ÚfilterwarningsrÓ   rÖ   rØ   rÚ   rÝ   rÞ   rß   râ   ræ   rî   r  r  rè   r  r	  r  rZ   Zfloat64r  r  r  r  r"  r%  r-  r(  r1  r3  r5  r6  r9  r=  r@  r$   r$   r$   r%   Ú<module>   sè     þÿV,
þýþþþ


ÿ

!


%
ø	
*
+ 

'3þ-

