a
    ¶Àh-›  ã                   @   s€  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.m/Z/m0Z0 e 1d dd¡Z2e 3e2e2¡\Z4Z5e 6e4 7¡  8dd¡e5 7¡  8dd¡g¡Z9dd„ Z:dd„ Z;dd„ Z<dd„ Z=dd„ Z>dd„ Z?dd „ Z@d!d"„ ZAejB Cd#d$d%g¡ejB Cd&d'¡d(d)„ ƒƒZDd*d+„ ZEejB Cd#d$d%g¡ejB Cd,e/¡d-d.„ ƒƒZFd/d0„ ZGd1d2„ ZHejB Cd3d$ejIfd%ejIfgd4d5„ e/D ƒ¢¡ejB Cd6d7gd8ggd9fd7d:gd8d7ggd;fg¡d<d=„ ƒƒZJejB Cd,e/¡d>d?„ ƒZKejB Cd,e/¡d@dA„ ƒZLejB MdB¡ejB CdCe/e0 ¡dDdE„ ƒƒZNdFdG„ ZOdHdI„ ZPdJdK„ ZQdLdM„ ZRejB Cd,e/¡dNdO„ ƒZSdPdQ„ ZTdRdS„ ZUdTdU„ ZVejB Cd,e/¡dVdW„ ƒZWejB Cd,e/¡dXdY„ ƒZXejB Cd,e/¡dZd[„ ƒZYdŽd^d_„ZZd`da„ Z[dbdc„ Z\ddde„ Z]ejB Cd#d%d$g¡ejB Cdfej^ej_g¡dgdh„ ƒƒZ`ejB Cd#d%d$g¡didj„ ƒZadkdl„ Zbe-dmdn„ ƒZcdodp„ Zddqdr„ ZeejB Cd#d%d$g¡dsdt„ ƒZfddudv„Zgdwdx„ Zhdydz„ ZiejB Cd{d|e"fd}e!fg¡ejB Cd#d%d$g¡d~d„ ƒƒZjejB Cd#d$d%g¡d€d„ ƒZkd‚dƒ„ ZlejB Cd„d…¡d†d‡„ ƒZmdˆd‰„ ZndŠd‹„ ZodŒd„ Zpd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 _zHt| ƒ t d¡dddd	d	d	d
dd
\}}}W t j ¡ }t j ¡  |t _nt j ¡ }t j ¡  |t _0 |dks˜J ‚|dks¤J ‚d|v s°J ‚t j}tƒ t _zFt|t d¡dddd	d	d	d	dd
\}}}W t j ¡ }t j ¡  |t _nt j ¡ }t j ¡  |t _0 |d	ks0J ‚|dks>J ‚d|v sLJ ‚t j}tƒ t _zHt| ƒ t d¡dddd	d	d	d	dd
\}}}W t j ¡ }t j ¡  |t _nt j ¡ }t j ¡  |t _0 |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$   ú]/var/www/html/assistant/venv/lib/python3.9/site-packages/sklearn/manifold/tests/test_t_sne.pyÚ__init__8   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%   ÚObjectiveSmallGradient7   s   r1   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   r2   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 10)T)ÚsysÚstdoutr   r   r)   ÚzerosÚgetvalueÚclose)r1   r4   Ú
old_stdoutr+   Úerrorr"   Úoutr$   r$   r%   Útest_gradient_descent_stops5   s”    
ö

þ

ö

þ

ö

þ

rG   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>”   ó    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$   rQ   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   r5   g      >@r   rK   r6   rU   rV   )	r   rX   rY   r)   rZ   r   ZnansumÚlog2r   )ra   rb   rd   rR   Ú
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 ]Â}
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 qÒd S )NéÈ   rJ   r   r6   F©ÚcopyrK   r   Údistance©Ún_neighborsÚmodec              	      s.   g | ]&}ˆ |ˆj ˆ| ˆ|d   … f ‘qS )r   )Úindices)rO   Úk©ÚP1Údistance_graphÚindptrr$   r%   rS   º   s   ÿz0test_binary_search_neighbors.<locals>.<listcomp>é   rV   é–   rI   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¥   s@    þÿr‚   c                  C   sÄ   d} d}t dƒ}| |d¡}tƒ  |¡}|j| dd}|jjtjdd}| 	|| ¡}d }d	}t
dƒD ]Z}	t| ¡ |dd
}
t||dd
}| ¡ }|d u r¢|
}|}qdt|
|dd t||dd qdd S )Nr   r5   r   rI   rn   ro   Frl   rU   rK   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+   rR   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   rH   r6   r<   r2   rJ   )rd   r;   c                    s   t | ˆ ˆˆˆƒd S )Nr   ©r   ©Úparams©rR   ÚalphaÚn_componentsr   r$   r%   Úfunü   s    ztest_gradient.<locals>.func                    s   t | ˆ ˆˆˆƒd S )Nr   r…   r†   rˆ   r$   r%   Úgradÿ   s    ztest_gradient.<locals>.gradrI   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 sdJ ‚t d
¡ dd¡}t dgdgdgdgdgg¡}t	t||dddƒ d S )Nr   r5   r6   ç      @r'   r<   r    r   g333333ã?rI   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 sZ0    Y  t||d
d}d|  kr†dksŒn 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   r6   ©ÚmatchrI   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sXJ ‚d S )
Nr   r6   rH   i¼  Úauto)rŠ   r§   ra   r¤   r7   r9   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sdJ ‚|d |d
 ksxJ ‚dS )z=t-SNE should give a lower KL divergence with more iterations.r   rU   )r   ra   )éú   é,  i^  r6   rœ   r   ç      Y@)rŠ   r§   ri   r9   r7   ra   r   N)r   r   r	   rª   ÚappendÚkl_divergence_)ra   r—   r+   Zkl_divergencesr7   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   rH   r6   r2   é   rœ   r   r°   iî  )rŠ   r§   ri   r9   ra   r¤   r7   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_matrixQ  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sJ ‚qd S )Nr   rU   éP   r6   Zsqeuclideanr°   ç       @Úprecomputedéô  rœ   )	rŠ   ri   r9   Úearly_exaggerationÚmetricra   r;   r7   r§   r   )rp   r¾   gffffffî?)r   r_   rX   r   r   r	   rª   r   )ra   rP   r—   ÚDr«   r‘   r¬   r$   r$   r%   ÚFtest_preserve_trustworthiness_approximately_with_precomputed_distancesh  s$    ÷
rÀ   c                  C   s@   t dƒ} |  dd¡}t||ddtt|dd|ddks<J ‚d S )Nr   r5   r6   Ú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$   )rO   r´   r$   r$   r%   rS     rT   rS   zD, message_regexr2   r<   z.* square distance matrixg      ð¿z.* positive.*c                 C   sR   t d| dddd}tjt|d | ||ƒ¡ W d   ƒ n1 sD0    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   ƒ n1 sP0    Y  d S )Nr»   r¥   rœ   rf   r   rÄ   Úsparserš   r   rI   ©r	   r   rž   Ú	TypeErrorrª   ©r´   r«   r$   r$   r%   Ú test_exact_no_precomputed_sparse£  s    ûrÊ   c                 C   st   t  g d¢g d¢g d¢g¡}| |ƒ}tddddd}d}tjt|d	 | |¡ W d   ƒ n1 sf0    Y  d S )
N)r<   r2   r2   )r2   r<   r2   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   r5   r6   rn   T)rp   rq   Zinclude_selfr»   rœ   r©   )r¾   ra   r§   r9   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   sh   dd„ } t | ddd}t ddgddgg¡}tjtdd	 | |¡ W d   ƒ n1 sZ0    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   r2   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©r5   r6   r©   )r§   r9   )r5   rI   )r	   r)   rA   rª   r3   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¾   r9   )r5   r5   )r	   r)   rA   rz   ©r«   r$   r$   r%   Útest_init_ndarray_precomputedæ  s    ýrØ   c                  C   sX   t dddd} tjtdd( |  t dgdgg¡¡ W d   ƒ n1 sJ0    Y  d S )	Nr»   r¨   r   )r¾   r§   ri   zBThe parameter init="pca" cannot be used with metric="precomputed".rš   r2   r<   ©r	   r   rž   rŸ   rª   r)   r*   r×   r$   r$   r%   Ú>test_pca_initialization_not_compatible_with_precomputed_kernelñ  s    þrÚ   c                 C   sZ   t dddd}tjtdd* | | ddgddggƒ¡ W d   ƒ n1 sL0    Y  d S )	Nr¨   r°   r   )r§   r9   ri   zPCA initialization.*rš   r   rI   rÇ   rÉ   r$   r$   r%   Ú8test_pca_initialization_not_compatible_with_sparse_inputû  s    rÛ   c                  C   sX   t dddd} tjtdd( |  t dgdgg¡¡ W d   ƒ n1 sJ0    Y  d S )	Nrx   r¦   r   )rŠ   r¤   ri   z'n_components' should be .*rš   r2   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 ]X}t|dddd|d	d
d}| |¡}t|dddd|dd
d}| |¡}t ||¡r,J ‚q,d S )Nr   r6   r¥   r¦   rµ   r   r°   r¨   r<   r®   ©rŠ   ri   r9   r§   ra   r¤   r½   r7   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
  s8    ø

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

rß   c                  C   st   t dƒ} d}ddg}|  d|¡ tj¡}|D ]B}dD ]8}t|ddd	d|d
|d}| |¡ |j|d ks4J ‚q4q,d S )Nr   r6   r¥   r¦   rµ   )éû   r¼   r   ç      à?rœ   r<   rÝ   )r   rX   rY   r)   rZ   r	   rª   Ún_iter_)ra   rŠ   rÞ   r—   r¤   r7   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<   r2   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_pointsB  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<   r2   r“   rº   ç333333@çš™™™™™@ç$·á1á?ç›mƒ´ª¿ç5a ƒÒ‡&¿çIiò³mù¿çU Ÿ Æ-¿çÜ|3SÙµ?ç›È:Ç¿çä$Ä*¹Ç¿©r   r6   rU   ©r   r6   rU   ©r   r   rU   ©r   r6   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_pointsS  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<   r2   r“   rº   rì   rí   rî   rï   rð   rñ   rò   ró   rô   rõ   rö   r÷   rø   rù   rú   rû   rü   rý   Fçš™™™™™¹?r6   rä   ræ   r$   r$   r%   Útest_skip_num_points_gradientn  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á   r6   r   r   )Úskip_num_pointsrx   rV   )r   rY   r)   rZ   Zint64r   r   rA   r`   rr   rw   r
   Zgradientrb   r   )rç   rè   ré   rê   r´   r;   ri   r  rc   ÚargsZ	pij_inputÚgrad_bhrR   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_0 d|v s€J ‚d|v sŒJ ‚d|v s˜J ‚d	|v s¤J ‚d
|v s°J ‚d S )Nr   r6   rx   )r;   ri   rI   z[t-SNE]znearest neighbors...z"Computed conditional probabilitiesz
Mean sigmazearly exaggeration)	r   r	   rX   r?   r@   r   rª   rB   rC   )ra   r«   r—   rD   rF   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   rI   r6   )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   rI   r6   )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sTJ ‚d S )
Nr   r   r6   Frl   r°   r¯   rœ   ©rŠ   ri   r9   ra   r¤   r;   r7   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¡rFJ ‚d S )Nr   rH   r6   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 ]Ò}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 )Nr2   r   r5   )r6   rU   rI   r<   r   rK   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‡   rR   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 ]†}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_0 d|v sJ ‚qd S )Nr   r5   r   )r¦   r¥   r    r6   g    „×—Ai_  rœ   )r8   r;   r9   ra   r¤   r7   r§   r   z@did not make any progress during the last -1 episodes. Finished.)r   rX   r	   Z_N_ITER_CHECKÚ_EXPLORATION_MAX_ITERr?   r@   r   rª   rB   rC   )ra   r—   r¤   r«   rD   rF   r$   r$   r%   Útest_n_iter_without_progress+  s2    ù	

þ

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_0 | 	d¡}g }|D ]R}d|v rž qâ| 
d	¡}	|	dkrŽ||	d … }| d
d¡ 	d¡d }| t|ƒ¡ qŽt |¡}t|||k ƒ}
|
dks
J ‚d S )Nr   r5   r6   gü©ñÒMb`?r¥   )r:   r;   ra   r¤   Ú
ZFinishedr=   zgradient norm = Ú ú r   )r   rX   r	   r?   r@   r   rª   rB   rC   ÚsplitÚfindÚreplacer±   r  r)   r*   Úlen)ra   r—   r:   r«   rD   rF   Z	lines_outZgradient_norm_valuesÚlineZstart_grad_normZn_smaller_gradient_normsr$   r$   r%   Útest_min_grad_normJ  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_0 | 	d¡d d d… D ]4}d	|v rŽ| 
d
¡\}}}|rŽ| 
d¡\}}} qÄqŽt|jt|ƒdd d S )Nr   rH   r6   r¥   r¼   )r8   r;   ra   r¤   r7   r  r    Z	Iterationzerror = ú,rI   rV   )r   rX   r	   r?   r@   r   rª   rB   rC   r  Ú	partitionr   r²   r  )ra   r—   r«   rD   rF   r  r+   rE   r$   r$   r%   Útest_accessible_kl_divergenceu  s4    û

þ

r"  c              
   C   sŠ   t dƒ}d}|D ]t}tdd|d|| dd}| t¡}d | |¡}zt||ƒ W q ty‚   |d	7 }||_| t¡}t||ƒ Y q0 q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¼   r6   rœ   rH   r©   )rŠ   r§   ra   ri   r7   r¤   r9   z{}_{}z:rerunN)r_   r	   rª   Ú	X_2d_gridÚformatÚassert_uniform_gridÚAssertionErrorr§   )r¤   Zseedsr7   Úseedr«   ÚYÚtry_namer$   r$   r%   Útest_uniform_grid•  s*    ù	

r*  c                 C   s|   t dd | ¡}|jddd  ¡ }| ¡ dks4J ‚| ¡ t |¡ }| ¡ t |¡ }|dkshJ |ƒ‚|dk sxJ |ƒ‚d S )	Nr   r”   T)Zreturn_distancer   rÿ   rá   r6   )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¦   r6   r<   rœ   rà   g     €=@)rŠ   r¤   r9   r§   ra   r7   ri   r  r¥   r¦   g-Cëâ6?r¶   )
r   rX   rY   r)   rZ   r	   r  rª   râ   r   )ra   r   r—   ZX_embeddedsr7   r¤   r«   r$   r$   r%   Útest_bh_match_exactÌ  s*    ør.  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
||ƒ qŽd S )Nr   r-  r6   r   rU   rI   r   rn   ro   rK   )r  r  r;   Únum_threads)r6   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_sequentialr/  Zkl_multithreadZgrad_multithreadr$   r$   r%   Ú-test_gradient_bh_multithread_match_sequentialè  sT    ÿþÿ÷
÷
r0  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¦   r1  zoDistance computations are different for method == 'barnes_hut' and metric == 'manhattan', but this is expected.r   rU   r6   rH   r¯   rœ   r©   )r¾   r¤   rŠ   ra   r7   r§   r9   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>    ÿùø	ùø	r2  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   r-  r6   rJ   r   rœ   r©   )rŠ   r¤   ri   r  Zn_jobsra   r§   r9   N)r   rX   r	   rª   r   )r¤   ra   r   r—   ZX_tr_refZX_trr$   r$   r%   Útest_tsne_n_jobsM  s8    ø	÷
ø	÷r3  c            
      C   sÜ   t dƒ} d\}}|  ||¡}dddddddœ}tf d	d
i|¤Ž}d}tjt|d | |¡ W d  ƒ n1 sr0    Y  tt|d
ddd}tf d	di|¤Ž |¡}tf 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   r7   r9   r§   rŠ   ra   r¾   Zmahalanobisz4Must provide either V or VI for Mahalanobis distancerš   NrÂ   T)Zchecksr»   ÚV)r¾   Zmetric_params)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_distancek  s4    ú	(ÿÿÿþr6  ri   )é   r-  c                 C   sd   t dƒ}| dd¡}tdd| |d}d}tjt|d | |¡ W d	  ƒ n1 sV0    Y  d	S )
z=Make sure that perplexity > n_samples results in a ValueErrorr   r7  r6   r©   r¨   )r9   r§   ri   ra   z&perplexity must be less than n_samplesrš   N©r   rX   r	   r   rž   rŸ   rª   )ri   ra   r—   ZestrÌ   r$   r$   r%   Útest_tsne_perplexity_validation‰  s    ür9  c                  C   sZ   t  d¡ tdd2 t d¡ dd¡} tdd | ¡ W d  ƒ n1 sL0    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   r6   )rŠ   N)r   Zimportorskipr   r)   r•   r{   r	   rª   )Zarrr$   r$   r%   Ú"test_tsne_works_with_pandas_outputš  s    
r<  c                  C   s^   t dƒ} |  dd¡}tdd}d}tjt|d | |¡ W d  ƒ n1 sP0    Y  dS )	z$Check `n_iter` parameter deprecated.r   r4  r5   r®   )Ún_iterz"'n_iter' was renamed to 'max_iter'rš   N)r   rX   r	   r   ZwarnsÚFutureWarningrª   ©ra   r—   r«   rÌ   r$   r$   r%   Útest_tnse_n_iter_deprecated¦  s    
r@  c                  C   s`   t dƒ} |  dd¡}tddd}d}tjt|d | |¡ W d	  ƒ n1 sR0    Y  d	S )
z9Check error raised when `n_iter` and `max_iter` both set.r   r4  r5   r®   r¼   )r=  r7   z0Both 'n_iter' and 'max_iter' attributes were setrš   Nr8  r?  r$   r$   r%   Ú"test_tnse_n_iter_max_iter_both_set±  s    rA  )Frÿ   r   )N)qr?   Ú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#  rG   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%  r.  r0  r2  r3  r6  r9  r<  r@  rA  r$   r$   r$   r%   Ú<module>   sè    þÿV,
þýþþþ


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