U
    ½mœd¢š  ã                   @   sl  d dl Z d dlmZ d dlZd dlmZ d dlmZ	 d dl
Z
d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlm Z  d dl!m"Z" d dl!m#Z# d dl$m%Z% d dl&m'Z' d dl(m)Z) d dl*m+Z+ d dl*m,Z, d dl-m.Z. d dl-m/Z/ d dl-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/d0„ ZAe
jB Cd1d2d3g¡e
jB Cd4d5¡d6d7„ ƒƒZDd8d9„ ZEe
jB Cd1d2d3g¡d:d;„ ƒZFd<d=„ ZGd>d?„ ZHe
jB Cd@d2ejIfd3ejIfd3e	jJfg¡e
jB CdAdBgdCggdDfdBdEgdCdBggdFfg¡dGdH„ ƒƒZKdIdJ„ ZLdKdL„ ZMeedM�dNdO„ ƒZNdPdQ„ ZOdRdS„ ZPdTdU„ ZQdVdW„ ZRdXdY„ ZSdZd[„ ZTd\d]„ ZUd^d_„ ZVd`da„ ZWdbdc„ ZXddde„ ZYd–dhdi„ZZdjdk„ Z[dldm„ Z\dndo„ Z]e
jB Cd1d3d2g¡e
jB Cdpej^ej_g¡dqdr„ ƒƒZ`e
jB Cd1d3d2g¡dsdt„ ƒZadudv„ Zbedwdx„ ƒZcdydz„ Zdd{d|„ Zee
jB Cd1d3d2g¡d}d~„ ƒZfd—dd€„Zgd�d‚„ Zhdƒd„„ Zie
jB Cd…d†e/fd‡e0fg¡e
jB Cd1d3d2g¡dˆd‰„ ƒƒZje
jB Cd1d2d3g¡dŠd‹„ ƒZkdŒd�„ ZldŽd�„ Zme
jB Cd�d‘¡d’d“„ ƒZnd”d•„ ZodS )˜é    N)ÚStringIO)Úassert_allclose)Úconfig_context)ÚNearestNeighbors)Úkneighbors_graph)ÚEfficiencyWarning)Úignore_warnings)Úassert_almost_equal)Úassert_array_equal)Úassert_array_almost_equal)Úskip_if_32bit)Úcheck_random_state)Ú_joint_probabilities)Ú_joint_probabilities_nn©Ú_kl_divergence)Ú_kl_divergence_bh)Ú_gradient_descent)Útrustworthiness)ÚTSNE)Ú_barnes_hut_tsne)Ú_binary_search_perplexity)Ú
make_blobs)Ú
check_grad)Úpdist)Ú
squareform)Úpairwise_distances)Úmanhattan_distances)Úcosine_distancesé   é
   éÿÿÿÿ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%   úZ/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/sklearn/manifold/tests/test_t_sne.pyÚ__init__3   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__6   s    zDtest_gradient_descent_stops.<locals>.ObjectiveSmallGradient.__call__N)T)Ú__name__Ú
__module__Ú__qualname__r'   r.   r%   r%   r%   r&   ÚObjectiveSmallGradient2   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)   é   )Ú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)r2   r5   Ú
old_stdoutÚoutr,   Úerrorr#   r%   r%   r&   Útest_gradient_descent_stops0   s‚    
ö

ö

ö

rI   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ÚdoubleZepsÚmeanÚrangeÚshaper	   )Úrandom_stateÚdataÚ	distancesÚdesired_perplexityZmean_perplexityr%   rS   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   rM   r7   rV   rW   )	r   rY   rZ   r*   r[   r   ZnansumÚlog2r	   )ra   rb   rd   rT   Ú
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éÈ   rL   r   r7   F©ÚcopyrM   r   Údistance©Ún_neighborsÚmodec              	      s.   g | ]&}ˆ |ˆj ˆ| ˆ|d   … f ‘qS )r   )Úindices)rQ   Úk©ÚP1Údistance_graphÚindptrr%   r&   rU   µ   s   ÿz0test_binary_search_neighbors.<locals>.<listcomp>é   rW   é–   rK   r    r!   )r   rY   rZ   r*   r[   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    r6   r   rK   rn   ro   Frl   rV   rM   rx   rW   )r   rY   r   rz   r   rb   rZ   r*   r[   r{   r_   r   rm   r   Útoarrayr   )rp   r   ra   rb   r€   rv   rc   Zlast_Prd   r,   rT   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   rJ   r7   r=   r3   rL   )rd   r<   c                    s   t | ˆ ˆˆˆƒd S )Nr   r   ©Úparams©rT   Ú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>.gradrK   rW   )r   rY   rZ   r*   r[   Ú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   r6   r7   ç      @r(   r=   r!   r   g333333ã?rK   rx   rV   ©rp   gš™™™™™É?)r   rY   r   rE   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   r7   ©ÚmatchrK   r“   rV   r   r   N)	r*   ÚrandomZRandomStateZrandÚpytestÚraisesÚ
ValueErrorr   rE   )Ú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   r7   rJ   i¼  Úauto)r‰   r¦   ra   r£   r8   r:   r   r“   g333333ë?)	r   rY   rZ   r*   r[   r   Úfit_transformr   rE   )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   rV   )r�   ra   )éú   é,  i^  r7   r›   r    ç      Y@)r‰   r¦   ri   r:   r8   ra   r   N)r   r   r   r©   ÚappendÚkl_divergence_rE   )ra   r–   r,   Zkl_divergencesr8   rª   r%   r%   r&   Ú)test_optimization_minimizes_kl_divergence8  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   rJ   r7   r3   é   r›   r    r¯   iî  )r‰   r¦   ri   r:   ra   r£   r8   r   r“   r=   g)\�Âõ(¼?©Zrtol)	r   rY   ÚrandintÚspÚ
csr_matrixr   r©   r   r   )r£   r    r–   ZX_csrrª   r�   r%   r%   r&   Útest_fit_transform_csr_matrixL  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   rV   éP   r7   Zsqeuclideanr¯   ç       @Úprecomputedéô  r›   )	r‰   ri   r:   Úearly_exaggerationÚmetricra   r<   r8   r¦   r   )rp   r¾   gffffffî?)	r   r_   rY   r   r   r   r©   r   rE   )ra   rR   r–   ÚDrª   r�   r«   r%   r%   r&   ÚFtest_preserve_trustworthiness_approximately_with_precomputed_distancesb  s$    ÷
rÀ   c                  C   s@   t dƒ} |  dd¡}t||dd�tt|dd�|dd�ks<t‚d S )Nr   r6   r7   Úcosine©r¾   r»   )r   rY   r   r   rE   )ra   r–   r%   r%   r&   Ú)test_trustworthiness_not_euclidean_metricx  s    
  ÿrÃ   zmethod, retypezD, message_regexr3   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   rK   ©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=   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ž   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|j|ƒ t	dddd	d
�}| 
|¡}dD ]}| 
| |¡¡}t||ƒ qdd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:   )ZcsrZlilN)r   rY   r   r   r¶   ÚissparserE   r	   ÚAr   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   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   rK   )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   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™   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   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¦   r:   ri   zPCA initialization.*r™   r   rK   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™   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 ]X}t|dddd|d	d
d�}| |¡}t|dddd|dd
d�}| |¡}t ||¡r,t‚q,d S )Nr   r7   r¤   r¥   r³   r   r¯   r§   r=   r­   ©r‰   ri   r:   r¦   ra   r£   r½   r8   r(   )	r   rY   rZ   r*   r[   r   r©   ZallcloserE   )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   r7   r¤   r¥   r³   )éû   r¼   r   ç      à?r›   r=   rÝ   )	r   rY   rZ   r*   r[   r   r©   Ún_iter_rE   )ra   r‰   rÞ   r–   r£   r8   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=   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©Ú	pos_inputÚ
pos_outputÚ	neighborsÚgrad_outputr%   r%   r&   Útest_answer_gradient_two_points6  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=   r3   r’   rº   ç333333@çš™™™™™@ç$·á1á?ç›mƒ´ª¿ç5a ƒÒ‡&¿çIiò³mù¿çU Ÿ Æ-¿çÜ|3SÙµ?ç›È:Ç�¿çä$Ä*¹Ç¿r   r7   rV   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_pointsF  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=   r3   r’   rº   rì   rí   rî   rï   rð   rñ   rò   ró   rô   rõ   r   r7   rV   r   rö   r÷   rø   rù   Fçš™™™™™¹?rä   ræ   r%   r%   r&   Útest_skip_num_points_gradient`  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á   r7   r   )Úskip_num_pointsrx   rW   )r   rZ   r*   r[   Zint64r   r   rD   r`   Úscipy.sparser·   rr   rw   r   Zgradientrb   r   )rç   rè   ré   rê   r<   ri   rþ   rc   ÚargsZ	pij_inputÚgrad_bhr·   rT   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   r7   rx   )r<   ri   rK   z[t-SNE]znearest neighbors...z"Computed conditional probabilitiesz
Mean sigmazearly exaggeration)
r   r   rY   r@   rA   r   rB   rC   r©   rE   )ra   rª   r–   rF   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   rK   r7   )r   r   rY   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   rK   r7   )	r   r   rY   rz   Z
embedding_r*   ÚallÚisfiniterE   )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    r7   Frl   r¯   r®   r›   ©r‰   ri   r:   ra   r£   r<   r8   r¦   )	r   rY   rZ   r   r©   rý   r*   r[   rE   )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   rJ   r7   r¯   i÷  r›   r  )r   rY   r   r©   r*   Úisnanr±   rE   )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 )Nr3   r    r6   )r7   rV   rK   r=   r   rM   r   rn   ro   )Úanglerþ   r<   rW   rV   )Úfloatr   rY   r   r   r   r   rz   r   r   r   r   rƒ   r   r	   )r  ri   r   r‰   r�   Údegrees_of_freedomra   rb   rc   r†   rT   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   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   rY   r   Z_N_ITER_CHECKÚ_EXPLORATION_N_ITERr@   rA   r   rB   rC   r©   rE   )ra   r–   r£   rª   rF   rG   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   r6   r7   gü©ñÒMb`?r¤   )r;   r<   ra   r£   Ú
ZFinishedr>   zgradient norm = Ú ú r   )r   rY   r   r@   rA   r   rB   rC   r©   ÚsplitÚfindÚreplacer°   r  r*   r+   ÚlenrE   )ra   r–   r;   rª   rF   rG   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   rJ   r7   r¤   r¼   )r9   r<   ra   r£   r8   r  r!   Z	Iterationzerror = ú,rK   rW   )r   rY   r   r@   rA   r   rB   rC   r©   r  Ú	partitionr	   r±   r  )ra   r–   rª   rF   rG   r  r,   rH   r%   r%   r&   Útest_accessible_kl_divergencee  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.
    rV   r¼   r7   r›   rJ   r¨   )r‰   r¦   ra   ri   r8   r£   r:   z{}_{}z:rerunN)r_   r   r©   Ú	X_2d_gridÚformatÚassert_uniform_gridrE   r¦   )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s4t‚| ¡ t |¡ }| ¡ t |¡ }|dksht|ƒ‚|dk sxt|ƒ‚d S )	Nr   r“   T)Zreturn_distancer   rû   rá   r7   )	r   rz   Z
kneighborsr~   ÚminrE   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¥   r7   r=   r›   rà   g     €=@)r‰   r£   r:   r¦   ra   r8   ri   r  r¤   r¥   g-Cëâ6?r´   )r   rY   rZ   r*   r[   r   r  r©   râ   rE   r   )ra   r�   r–   ZX_embeddedsr8   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)  r7   r   rV   rK   r   rn   ro   rM   )r  rþ   r<   Únum_threads)r7   rx   g�íµ ÷Æ°>r´   )r   rY   rZ   r*   r[   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   rV   r7   rJ   r®   r›   r¨   )r¾   r£   r‰   ra   r8   r¦   r:   r»   N)
rœ   Zxfailr   rY   rZ   r*   r[   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)  r7   rL   r   r›   r¨   )r‰   r£   ri   r  Ún_jobsra   r¦   r:   N)r   rY   r   r©   r   )r£   ra   r�   r–   ZX_tr_refZX_trr%   r%   r&   Útest_tsne_n_jobs9  s8    ø	÷
ø	÷r0  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›   rV   )ri   r8   r:   r¦   r‰   ra   r¾   Zmahalanobisz4Must provide either V or VI for Mahalanobis distancer™   rÂ   T)Zchecksr»   ÚV)r¾   Zmetric_paramsN)r   rY   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_distanceW  s6    ú	ÿ ÿÿþr3  c               
   C   s‚   t dƒ} |  dd¡}tdddddddd	d
�}d}tjt|d�� | |¡}W 5 Q R X tdddddddd�}| |¡}t||ƒ dS )zŠCheck that we raise a warning regarding the removal of
    `square_distances`.

    Also check the parameters do not have any effect.
    r   r)  r    r7   r§   r¨   rL   r   T)r‰   r¦   r:   ri   r  r/  ra   Zsquare_distanceszRThe parameter `square_distances` has not effect and will be removed in version 1.3r™   )r‰   r¦   r:   ri   r  r/  ra   N)r   rY   r   rœ   ZwarnsÚFutureWarningr©   r   )ra   r–   rª   Zwarn_msgZ	X_trans_1Z	X_trans_2r%   r%   r&   Ú&test_tsne_deprecation_square_distancesv  s6    øÿù	
r5  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   r6  r7   r¨   r§   )r:   r¦   ri   ra   z&perplexity must be less than n_samplesr™   N)r   rY   r   rœ   r�   rž   r©   )ri   ra   r–   ZestrÌ   r%   r%   r&   Útest_tsne_perplexity_validationœ  s    ür7  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   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@   Úior   Únumpyr*   Znumpy.testingr   rÿ   rÆ   r¶   rœ   Zsklearnr   Zsklearn.neighborsr   r   Zsklearn.exceptionsr   Zsklearn.utils._testingr   r	   r
   r   r   Zsklearn.utilsr   Zsklearn.manifold._t_sner   r   r   r   r   r   Zsklearn.manifoldr   r   Zsklearn.manifold._utilsr   Zsklearn.datasetsr   Zscipy.optimizer   Zscipy.spatial.distancer   r   Zsklearn.metrics.pairwiser   r   r   r|   rÓ   ZmeshgridZxxÚyyZhstackr~   r{   r   rI   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  r[   Zfloat64r	  r  r  r  r  r  r&  r"  r*  r,  r.  r0  r3  r5  r7  r:  r%   r%   r%   r&   Ú<module>   sì   þÿV,

ýþþþ


!"   ù
	
*
+
'
3þ-
&
