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$   ú‚/var/www/www-root/data/www/176.119.141.140/sports-predictor/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_progressÚmomentumÚlearning_rateÚ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”   
ö


þ
ö


þ
ö


þ
rJ   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   ÚmaximumÚfinfoÚdoubleÚepsÚmeanÚrangeÚshaper   )Úrandom_stateÚdataÚ	distancesÚdesired_perplexityÚmean_perplexityr$   rT   r%   Útest_binary_searchŒ   s   ÿri   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   rN   r7   rW   rX   )	r   rZ   r[   r)   r\   r   ÚnansumÚlog2r   )rd   re   rg   rU   Ú
perplexityr$   r$   r%   Útest_binary_search_underflowš   s   2ro   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éÈ   rM   r   r7   F©ÚcopyrN   r   Údistance©Ún_neighborsÚmodec              	      s.   g | ]}ˆ |ˆj ˆ| ˆ|d   … f ‘qS )r   )Úindices)rR   Úk©ÚP1Údistance_graphÚindptrr$   r%   rV   »   s     ÿÿz0test_binary_search_neighbors.<locals>.<listcomp>é   rX   é–   rL   r   r    )r   rZ   r[   r)   r\   r   r   r   Úfitr   re   Úreshaper|   r*   rb   r   ÚlinspaceÚintÚargsortÚravel)Ú	n_samplesrg   rd   re   rf   ru   ÚnnÚdistances_nnÚP2ÚP1_nnrx   ÚtopnÚP2kÚidxÚP1topÚP2topr$   ry   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   rL   rs   rt   Frq   rW   rN   r}   rX   )r   rZ   r   r   r   re   r[   r)   r\   r€   rb   r   rr   r   Útoarrayr   )ru   r…   rd   re   r†   r{   rf   Úlast_Prg   r+   rU   rz   Ú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   rK   r7   r?   r3   rM   )rg   r>   c                    ó   t | ˆ ˆˆˆƒd S )Nr   ©r   ©Úparams©rU   ÚalphaÚn_componentsr…   r$   r%   Úfuný   ó   ztest_gradient.<locals>.func                    r”   )Nr   r•   r–   r˜   r$   r%   Úgrad   rœ   ztest_gradient.<locals>.gradrL   rX   )r   rZ   r[   r)   r\   ÚabsÚdotÚTÚfill_diagonalr   r   r   r„   )rd   Ú
n_featuresrf   Ú
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ã?rL   r}   rW   ©ru   gš™™™™™É?)
r   rZ   r   r)   Úaranger€   rr   Úshuffler*   r   )rd   Ú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 .+rj   é   r}   r7   ©ÚmatchrL   r¦   NrW   r   r   )r)   ÚrandomÚRandomStateÚ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   rK   i¼  Úauto)rš   r»   rd   r¸   r8   r;   r   r¦   g333333ë?)r   rZ   r[   r)   r\   r	   Úfit_transformr   )r¸   r»   rd   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   rW   )r¢   rd   )éú   é,  i^  r7   r®   r   ç      Y@)rš   r»   rn   r;   r8   rd   r   N)r   r   r	   r¾   ÚappendÚkl_divergence_)rd   r©   r+   Ú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   rK   r7   r3   é   r®   r   rÄ   iî  )rš   r»   rn   r;   rd   r¸   r8   r   r¦   r?   g)\Âõ(¼?©Úrtol)r   rZ   Úrandintr	   r¾   r   r   )r¸   rÉ   rµ   r©   Ú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   rW   éP   r7   ÚsqeuclideanrÄ   ç       @Úprecomputedéô  r®   )	rš   rn   r;   Úearly_exaggerationÚmetricrd   r>   r8   r»   r   )ru   rÖ   gffffffî?)r   rb   rZ   r   r   r	   r¾   r   )rd   rS   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   rZ   r   r   )rd   r©   r$   r$   r%   Ú)test_trustworthiness_not_euclidean_metric  s
   ÿrÛ   zmethod, retypec                 C   s   g | ]}d |f‘qS )rº   r$   )rR   rÉ   r$   r$   r%   rV   Ž  s    rV   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®   rj   r   ©rÖ   r¸   r»   rd   rn   r¬   )r	   r±   r²   r³   r¾   )r¸   r×   ÚretypeÚ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®   rj   r   rÜ   Úsparser¬   r   rL   ©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®   rj   r   )rÖ   r»   rd   rn   zB3 neighbors per samples are required, but some samples have only 1r¬   )r)   r*   r	   r±   r²   r³   r¾   )rÉ   ÚdistÚ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   rs   T)ru   rv   Úinclude_selfrÓ   r®   r½   )rÖ   rd   r»   r;   N)
r   rZ   r   r   ÚspÚissparser   r   r	   r¾   )ré   rd   r©   ÚD_sparser×   r¿   ÚXt_denseÚ	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¸   rn   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   rL   )r	   r)   rD   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)   rD   r   ©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»   rn   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;   rn   zPCA initialization.*r¬   r   rL   rá   rã   r$   r$   r%   Ú8test_pca_initialization_not_compatible_with_sparse_inputü  s   "ÿrû   c                  C   rø   )	Nr}   rº   r   )rš   r¸   rn   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š   rn   r;   r»   rd   r¸   rÕ   r8   r'   )r   rZ   r[   r)   r\   r	   r¾   Úallclose)rd   rš   Úmethodsr©   r¸   r¿   ÚX_embedded1Ú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   rZ   r[   r)   r\   r	   r¾   Ún_iter_)rd   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   rW   ©r   r7   rW   ©r   r   rW   ©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 )NFrq   )Údtyper  r7   r   r   )Úskip_num_pointsr}   rX   )r   r[   r)   r\   Úint64r   r   rD   rc   rw   r|   r
   Úgradientre   r   )r
  r  r  r  rÉ   r>   rn   r%  rf   ÚargsÚ	pij_inputÚgrad_bhrU   r|   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   r}   )r>   rn   rL   z[t-SNE]znearest neighbors...z"Computed conditional probabilitiesz
Mean sigmazearly exaggeration)	r   r	   rZ   rB   rC   r   r¾   rE   rF   )rd   r¿   r©   rG   rI   r$   r$   r%   Útest_verbose¬  s$   


þ
r+  c                  C   s.   t dƒ} tddd}|  dd¡}| |¡ d S )Nr   Ú	chebyshevr}   )rÖ   rn   rL   r7   )r   r	   rZ   r¾   )rd   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   r}   )rš   rn   rL   r7   )r   r	   rZ   r   Ú
embedding_r)   ÚallÚisfinite)rd   r¿   r©   r£   r$   r$   r%   Útest_reduction_to_one_componentÊ  s
   r1  Ú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   Frq   rÄ   rÃ   r®   ©rš   rn   r;   rd   r¸   r>   r8   r»   )r   rZ   r[   r	   r¾   r$  r)   r\   )r¸   r2  rd   r©   r¿   r£   Úeffective_typer$   r$   r%   Ú
test_64bitÓ  s   ø

r5  c              
   C   sJ   t dƒ}| dd¡}tdddd| dddd}| |¡ t |j¡r#J ‚d S )Nr   rK   r7   rÄ   i÷  r®   r3  )r   rZ   r	   r¾   r)   ÚisnanrÆ   )r¸   rd   r©   r¿   r$   r$   r%   Útest_kl_divergence_not_nanì  s   ø

r7  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   rW   rL   r?   r   rN   r   rs   rt   )Úangler%  r>   rX   rW   )Úfloatr   rZ   r   r   r   r   r   r   r   r   r   r   r   r   )r8  rn   r…   rš   r¢   Údegrees_of_freedomrd   re   rf   r—   rU   Úkl_exactÚ
grad_exactru   Údistances_csrÚP_bhÚ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;   rd   r¸   r8   r»   r   z@did not make any progress during the last -1 episodes. Finished.)r   rZ   r	   Ú_N_ITER_CHECKÚ_EXPLORATION_MAX_ITERrB   rC   r   r¾   rE   rF   )rd   r©   r¸   r¿   rG   rI   r$   r$   r%   Útest_n_iter_without_progress,  s4   ù	


þ
érC  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>   rd   r¸   Ú
ÚFinishedr@   zgradient norm = Ú ú r   )r   rZ   r	   rB   rC   r   r¾   rE   rF   ÚsplitÚfindÚreplacerÅ   r9  r)   r*   Úlen)rd   r©   r=   r¿   rG   rI   Ú	lines_outÚgradient_norm_valuesÚlineÚstart_grad_normÚn_smaller_gradient_normsr$   r$   r%   Útest_min_grad_normK  s<   


þ


€

ÿrQ  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   rK   r7   r¹   rÔ   )r9   r>   rd   r¸   r8   rD  r    Ú	Iterationzerror = ú,rL   rX   )r   rZ   r	   rB   rC   r   r¾   rE   rF   rH  Ú	partitionr   rÆ   r9  )rd   r©   r¿   rG   rI   rN  r+   rH   r$   r$   r%   Útest_accessible_kl_divergencev  s6   û


þ
€rU  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.
    rW   rÔ   r7   r®   rK   r½   )rš   r»   rd   rn   r8   r¸   r;   z{}_{}z:rerunN)rb   r	   r¾   Ú	X_2d_gridÚformatÚassert_uniform_gridÚAssertionErrorr»   )r¸   Ú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)Úreturn_distancer   r"  r  r7   )r   r   Ú
kneighborsr„   Úminr)   ra   Úmax)r\  r]  r†   Ú
dist_to_nnÚsmallest_to_meanÚlargest_to_meanr$   r$   r%   rX  ¾  s   rX  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»   rd   r8   rn   r8  r¹   rº   g-Cëâ6?rË   )
r   rZ   r[   r)   r\   r	   rB  r¾   r  r   )rd   r¢   r©   ÚX_embeddedsr8   r¸   r¿   r$   r$   r%   Útest_bh_match_exactÍ  s*   ørh  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   rf  r7   r   rW   rL   r   rs   rt   rN   )r8  r%  r>   Únum_threads)r7   r}   gíµ ÷Æ°>rË   )r   rZ   r[   r)   r\   r   r   r   r   r   r   )r¢   r…   rš   r:  r8  rn   rd   re   r—   ru   r=  r>  Úkl_sequentialÚgrad_sequentialri  Úkl_multithreadÚgrad_multithreadr$   r$   r%   Ú-test_gradient_bh_multithread_match_sequentialé  sT   þÿ
÷
÷òrn  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º   ro  zoDistance computations are different for method == 'barnes_hut' and metric == 'manhattan', but this is expected.r   rW   r7   rK   rÃ   r®   r½   )rÖ   r¸   rš   rd   r8   r»   r;   rÓ   N)
r±   Úxfailr   rZ   r[   r)   r\   r	   r¾   r   )	rÖ   Ú	dist_funcr¸   rd   Ún_components_originalÚn_components_embeddingr©   ÚX_transformed_tsneÚX_transformed_tsne_precomputedr$   r$   r%   Ú)test_tsne_with_different_distance_metrics  s>   ÿùø	ù
ø	rv  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   rf  r7   rM   r   r®   r½   )rš   r¸   rn   r8  Ún_jobsrd   r»   r;   N)r   rZ   r	   r¾   r   )r¸   rd   r¢   r©   ÚX_tr_refÚX_trr$   r$   r%   Útest_tsne_n_jobsN  s8   ø	÷
ø	÷rz  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®   rW   )rn   r8   r;   r»   rš   rd   rÖ   Úmahalanobisz4Must provide either V or VI for Mahalanobis distancer¬   NrÚ   T)ÚchecksrÓ   ÚV)rÖ   Úmetric_paramsr$   )r   rZ   r	   r±   r²   r³   r¾   r   r   r)   Úcovr    r   )
rd   r…   r¢   r©   Údefault_paramsr¿   rç   Úprecomputed_XÚX_trans_expectedÚX_transr$   r$   r%   Ú#test_tsne_with_mahalanobis_distancel  s6   ú	ÿÿÿÿþr…  rn   )é   rf  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»   rn   rd   zperplexity (z") must be less than n_samples (20)r¬   N)	r   rZ   r	   ÚreÚescaper±   r²   r³   r¾   )rn   rd   r©   Ú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.
    Úpandas)Útransform_outputéŒ   é#   r}   r7   )rš   N)r±   Úimportorskipr   r)   r§   r€   r	   r¾   )Úarrr$   r$   r%   Ú"test_tsne_works_with_pandas_output›  s
   
"þr‘  )Fr"  r   )N)pr‡  rB   Úior   Únumpyr)   r±   Úscipy.sparserà   rë   Únumpy.testingr   Úscipy.optimizer   Úscipy.spatial.distancer   r   Úsklearnr   Úsklearn.datasetsr   Úsklearn.manifoldr	   r
   Úsklearn.manifold._t_sner   r   r   r   r   r   Úsklearn.manifold._utilsr   Úsklearn.metrics.pairwiser   r   r   Úsklearn.neighborsr   r   Úsklearn.utilsr   Úsklearn.utils._testingr   r   r   r   Úsklearn.utils.fixesr   r   r   rñ   ÚmeshgridÚxxÚyyÚhstackr„   r€   rV  rJ   ri   ro   r   r“   r¤   rª   r·   ÚmarkÚparametrizerÁ   rÈ   rÏ   rØ   rÛ   Úasarrayrß   rä   rè   Úfilterwarningsrð   ró   rõ   r÷   rú   rû   rü   r  r  r  r!  r#  r  r+  r-  r1  r\   Úfloat64r5  r7  r@  rC  rQ  rU  r^  rX  rh  rn  rv  rz  r…  rŠ  r‘  r$   r$   r$   r%   Ú<module>   sè     þÿV,
þýþþþ


ÿ

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