U
    _»{j•  ã                   @   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 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/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¡d,d-„ ƒZFd.d/„ ZGd0d1„ ZHejB Cd2d$ejIfd%ejIfd%ejJfg¡ejB Cd3d4gd5ggd6fd4d7gd5d4ggd8fg¡d9d:„ ƒƒZKd;d<„ ZLd=d>„ ZMe/ed?�d@dA„ ƒZNdBdC„ ZOdDdE„ ZPdFdG„ ZQdHdI„ ZRdJdK„ ZSdLdM„ ZTdNdO„ ZUdPdQ„ ZVdRdS„ ZWdTdU„ ZXdVdW„ ZYd†dZd[„ZZd\d]„ Z[d^d_„ Z\d`da„ Z]ejB Cd#d%d$g¡ejB Cdbej^ej_g¡dcdd„ ƒƒZ`ejB Cd#d%d$g¡dedf„ ƒZadgdh„ Zbe0didj„ ƒZcdkdl„ Zddmdn„ ZeejB Cd#d%d$g¡dodp„ ƒZfd‡dqdr„Zgdsdt„ Zhdudv„ ZiejB Cdwdxe$fdye#fg¡ejB Cd#d%d$g¡dzd{„ ƒƒZjejB Cd#d$d%g¡d|d}„ ƒZkd~d„ ZlejB Cd€d�¡d‚dƒ„ ƒZmd„d…„ ZndS )ˆé    N)ÚStringIO)Úassert_allclose)Ú
check_grad)ÚpdistÚ
squareform)Úconfig_context)Ú
make_blobs)ÚEfficiencyWarning)Ú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Úignore_warningsÚskip_if_32bité   é
   éÿÿÿÿ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 5 t j ¡ }t j ¡  |t _X |dks~t‚|dksŠt‚d|ks–t‚t j}tƒ t _z,t|t d¡dddd	d	d	d	dd�
\}}}W 5 t j ¡ }t j ¡  |t _X |d	ksút‚|dk�st‚d|k�st‚t j}tƒ t _z.t| ƒ t d¡dddd	d	d	d	dd�
\}}}W 5 t j ¡ }t j ¡  |t _X |d	k�s~t‚|dk�sŒt‚d|k�sšt‚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/bwave/python/venv/lib/python3.8/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   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(   é   )Ún_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   ÚgetvalueÚcloser   r)   ÚzerosÚAssertionError)r1   r4   Ú
old_stdoutÚoutr+   Úerrorr"   r$   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     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   r5   g      >@r   rL   r6   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 ]Â}
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éÈ   rK   r   r6   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¦   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 kr¢|
}|}qdt|
|dd� t||dd� qdd S )Nr   r5   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   r6   r<   r2   rK   )rd   r;   c                    s   t | ˆ ˆˆˆƒd S )Nr   ©r   ©Úparams©rS   Ú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>.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.t‚t d¡ dd¡}| ¡ }|  |¡ t||ƒd	k sdt‚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ã?rJ   rx   rU   ©rp   gš™™™™™É?)r   rX   r   rD   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 5 Q R X t||d	d�}d
|  krrdksxn t‚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   ©ÚmatchrJ   r”   rU   r   r   N)	r)   ÚrandomZRandomStateZrandÚpytestÚraisesÚ
ValueErrorr   rD   )Ú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sXt‚d S )
Nr   r6   rI   i¼  Úauto)rŠ   r§   ra   r¤   r7   r9   r   r”   g333333ë?)	r   rX   rY   r)   rZ   r
   Úfit_transformr   rD   )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sdt‚|d |d
 ksxt‚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_rD   )ra   r—   r+   Zkl_divergencesr7   r«   r$   r$   r%   Ú)test_optimization_minimizes_kl_divergence>  s     ú
r³   c              	   C   sz   t dƒ}| dd¡}d|| ddd¡| ddd¡f< t |¡}tddddd| d	d
�}| |¡}tt||dd�ddd� d S )Nr   rI   r6   r2   é   rœ   r   r°   iî  )rŠ   r§   ri   r9   ra   r¤   r7   r   r”   r<   g)\�Âõ(¼?©Zrtol)	r   rX   ÚrandintÚspÚ
csr_matrixr
   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st‚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   rD   )ra   rQ   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<t‚d S )Nr   r5   r6   Úcosine©r¿   r¼   )r   rX   r   r   rD   )ra   r—   r$   r$   r%   Ú)test_trustworthiness_not_euclidean_metric~  s    
  ÿrÄ   zmethod, retypezD, message_regexr2   r<   z.* square distance matrixg      ð¿z.* positive.*c              	   C   s>   t d| dddd�}tjt|d�� | ||ƒ¡ W 5 Q R X 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   sL   t dddddd�} tjtdd��" |  t d	d
gd
d	gg¡¡ W 5 Q R X d S )Nr¼   r¥   rœ   rf   r   rÅ   Úsparserš   r   rJ   ©r
   r�   rž   Ú	TypeErrorrª   r·   r¸   ©r«   r$   r$   r%   Ú test_exact_no_precomputed_sparse£  s    ûrË   c               	   C   sh   t  dddgdddgdddgg¡} t | ¡}tddddd�}d}tjt|d	�� | |¡ W 5 Q R X d S )
Nr<   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Ÿ   rª   )ÚdistZbad_distr«   Úmsgr$   r$   r%   Ú1test_high_perplexity_precomputed_sparse_distances¯  s    "
rÎ   )Úcategoryc                  C   sŠ   t dƒ} |  dd¡}t|dddd�}t|ƒ}t |¡s:t‚t| ¡ |ƒ t	dddd	d
�}| 
|¡}dD ]}| 
| |¡¡}t||ƒ qfd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   )ZcsrZlilN)r   rX   r   r   r·   ÚissparserD   r   rƒ   r
   rª   Zasformat)ra   r—   ZD_sparserÀ   r«   ZXt_denseÚfmtZ	Xt_sparser$   r$   r%   Ú test_sparse_precomputed_distance¹  s        ÿ
rÒ   c               	   C   sT   dd„ } t | ddd�}t ddgddgg¡}tjtdd	�� | |¡ W 5 Q R X 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   rJ   )r
   r)   rC   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)   rC   rz   rÊ   r$   r$   r%   Útest_init_ndarray_precomputedá  s    ýrØ   c               	   C   sD   t dddd�} tjtdd�� |  t dgdgg¡¡ W 5 Q R X 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   sH   t dddd�} tjtdd��" |  t ddgddgg¡¡ W 5 Q R X d S )	Nr¨   r°   r   )r§   r9   ri   zPCA initialization.*rš   r   rJ   rÈ   rÊ   r$   r$   r%   Ú8test_pca_initialization_not_compatible_with_sparse_inputö  s    rÛ   c               	   C   sD   t dddd�} tjtdd�� |  t dgdgg¡¡ W 5 Q R X 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,t‚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allcloserD   )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s4t‚q4q,d S )Nr   r6   r¥   r¦   r´   )éû   r½   r   ç      à?rœ   r<   rÝ   )	r   rX   rY   r)   rZ   r
   rª   Ún_iter_rD   )ra   rŠ   rÞ   r—   r¤   r7   r«   r$   r$   r%   Útest_n_iter_used%  s$    ø

rã   c                  C   sf   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©Ú	pos_inputÚ
pos_outputÚ	neighborsÚgrad_outputr$   r$   r%   Útest_answer_gradient_two_points<  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  dddgdddgdddgdddg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   g\¥$Æw?g×Rn		Qà¾gz¡}¿g³«ûÙÕ`à>ç�4Ž1Çf>ç6×ÆS×c¾ç>ÛÔgU9&¾ç¸#£*@>rä   ræ   r$   r$   r%   Ú test_answer_gradient_four_pointsL  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  dddgdddgdddgdddg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   r6   rU   r   rö   r÷   rø   rù   Fçš™™™™™¹?rä   ræ   r$   r$   r%   Útest_skip_num_points_gradientf  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�}
ddl	m
} ||	ƒ}|j tj¡}|j tj¡}tj|j||||
ddddd	�	 t|
|d
d� d S )NFrl   )Údtyper   )r¸   rá   r6   r   )Úskip_num_pointsrx   rV   )r   rY   r)   rZ   Zint64r   r   rC   r`   Úscipy.sparser¸   rr   rw   r   Zgradientrb   r   )rç   rè   ré   rê   r;   ri   rþ   rc   ÚargsZ	pij_inputÚgrad_bhr¸   rS   rw   r$   r$   r%   rå   ƒ  s.    	
        ÿrå   c                  C   sš   t dƒ} tddd�}|  dd¡}tj}tƒ t_z| |¡ W 5 tj ¡ }tj ¡  |t_X d|ksft	‚d|ksrt	‚d|ks~t	‚d	|ksŠt	‚d
|ks–t	‚d S )Nr   r6   rx   )r;   ri   rJ   z[t-SNE]znearest neighbors...z"Computed conditional probabilitiesz
Mean sigmazearly exaggeration)
r   r
   rX   r?   r@   r   rA   rB   rª   rD   )ra   r«   r—   rE   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   rJ   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@t‚d S )Nr   r   rx   )rŠ   ri   rJ   r6   )	r   r
   rX   rz   Z
embedding_r)   ÚallÚisfiniterD   )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sTt‚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   rD   )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¡rFt‚d S )Nr   rI   r6   r°   i÷  rœ   r  )r   rX   r
   rª   r)   Úisnanr²   rD   )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   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÷  sR        ÿÿ þÿø
r  c               
   C   sŠ   t dƒ} |  dd¡}dD ]l}tdddd|dd	d
�}d|_d|_tj}tƒ t_z| 
|¡ W 5 tj ¡ }tj 	¡  |t_X d|kst‚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_N_ITERr?   r@   r   rA   rB   rª   rD   )ra   r—   r¤   r«   rE   rF   r$   r$   r%   Útest_n_iter_without_progress!  s,    ù	

r  c                  C   sò   t dƒ} |  dd¡}d}t|dddd�}tj}tƒ t_z| |¡ W 5 tj ¡ }tj ¡  |t_X | 	d¡}g }|D ]R}d|kr„ qÈ| 
d	¡}	|	dkrt||	d … }| d
d¡ 	d¡d }| t|ƒ¡ qtt |¡}t|||k ƒ}
|
dksît‚d S )Nr   r5   r6   gü©ñÒMb`?r¥   )r:   r;   ra   r¤   Ú
ZFinishedr=   zgradient norm = Ú ú r   )r   rX   r
   r?   r@   r   rA   rB   rª   ÚsplitÚfindÚreplacer±   r  r)   r*   ÚlenrD   )ra   r—   r:   r«   rE   rF   Z	lines_outZgradient_norm_valuesÚlineZstart_grad_normZn_smaller_gradient_normsr$   r$   r%   Útest_min_grad_norm@  s4    





ÿr  c                  C   sÂ   t dƒ} |  dd¡}tdddddd�}tj}tƒ t_z| |¡ W 5 tj ¡ }tj ¡  |t_X | 	d¡d d d… D ]4}d	|krt| 
d
¡\}}}|rt| 
d¡\}}} qªqtt|jt|ƒdd� d S )Nr   rI   r6   r¥   r½   )r8   r;   ra   r¤   r7   r  r    Z	Iterationzerror = ú,rJ   rV   )r   rX   r
   r?   r@   r   rA   rB   rª   r  Ú	partitionr   r²   r  )ra   r—   r«   rE   rF   r  r+   rG   r$   r$   r%   Útest_accessible_kl_divergencek  s.        ÿ

r  c              
   C   sŒ   t dƒ}d}|D ]v}tdd|d|| dd�}| t¡}d | |¡}zt||ƒ W q tk
r„   |d	7 }||_| t¡}t||ƒ Y qX 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œ   rI   r©   )rŠ   r§   ra   ri   r7   r¤   r9   z{}_{}z:rerunN)r_   r
   rª   Ú	X_2d_gridÚformatÚassert_uniform_gridrD   r§   )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s4t‚| ¡ t |¡ }| ¡ t |¡ }|dksht|ƒ‚|dk sxt|ƒ‚d S )	Nr   r”   T)Zreturn_distancer   rû   rá   r6   )	r   rz   Z
kneighborsr~   ÚminrD   r)   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|t	‚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â   rD   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   rJ   r   rn   ro   rL   )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Ú  sV    ÿ þÿ÷
÷
r,  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¦   r-  zoDistance computations are different for method == 'barnes_hut' and metric == 'manhattan', but this is expected.r   rU   r6   rI   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>    ÿùø	ùø	r.  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   rK   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_jobs?  s8    ø	÷
ø	÷r/  c            
   	   C   sÈ   t dƒ} d\}}|  ||¡}dddddddœ}tf d	d
i|—Ž}d}tjt|d�� | |¡ W 5 Q R X 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š   rÃ   T)Zchecksr¼   ÚV)r¿   Zmetric_paramsN)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_distance]  s6    ú	ÿ ÿÿþr2  ri   )é   r)  c              	   C   sP   t dƒ}| dd¡}tdd| |d�}d}tjt|d�� | |¡ W 5 Q R X d	S )
z=Make sure that perplexity > n_samples results in a ValueErrorr   r3  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    ür4  c               	   C   sF   t  d¡ tdd��( t d¡ dd¡} tdd� | ¡ W 5 Q R X 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    
r7  )Frû   r   )N)or?   Úior   Únumpyr)   r�   rÿ   rÇ   r·   Znumpy.testingr   Zscipy.optimizer   Zscipy.spatial.distancer   r   Zsklearnr   Zsklearn.datasetsr   Zsklearn.exceptionsr	   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   r   r|   rÓ   ZmeshgridZxxÚyyZhstackr~   r{   r   rH   re   rj   r‚   r„   r’   r˜   r£   ÚmarkZparametrizer­   r³   r¹   rÁ   rÄ   Zasarrayr¸   rÆ   rË   rÎ   rÒ   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*  r,  r.  r/  r2  r4  r7  r$   r$   r$   r%   Ú<module>   sÎ    þÿV,

ýþþþ


!"   ù
	
*
+
'
3þ-

