o
    ÖtBhä©  ã                	   @   s  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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/ e 0d dd¡Z1e 2e1e1¡\Z3Z4e 5e3 6¡  7dd¡e4 6¡  7dd¡g¡Z8e
j9 :d ¡Z;d!d"„ Z<d#d$„ Z=d%d&„ Z>d'd(„ Z?d)d*„ Z@d+d,„ ZAd-d.„ ZBd/d0„ ZCe
j9 Dd1d2d3g¡e
j9 Dd4d5¡d6d7„ ƒƒZEd8d9„ ZFe
j9 Dd1d2d3g¡d:d;„ ƒZGd<d=„ ZHd>d?„ ZIe
j9 :d@¡e
j9 :dA¡dBdC„ ƒƒZJe
j9 :d@¡e
j9 :dA¡dDdE„ ƒƒZKe
j9 :d@¡e
j9 DdFd2ejLfd3ejLfd3e	jMfg¡e
j9 DdGdHgdIggdJfdHdKgdIdHggdLfg¡dMdN„ ƒƒƒZNe
j9 :d@¡dOdP„ ƒZOe
j9 :d@¡dQdR„ ƒZPeedSdTdU„ ƒZQe
j9 :d@¡e
j9 :dA¡dVdW„ ƒƒZRe
j9 :d@¡dXdY„ ƒZSdZd[„ ZTd\d]„ ZUe
j9 :d@¡e
j9 :dA¡d^d_„ ƒƒZVe
j9 :d@¡e
j9 :dA¡d`da„ ƒƒZWe
j9 :d@¡e
j9 :dA¡dbdc„ ƒƒZXe
j9 :d@¡ddde„ ƒZYdfdg„ ZZe
j9 :d@¡e
j9 :dA¡dhdi„ ƒƒZ[djdk„ Z\dldm„ Z]dndo„ Z^dpdq„ Z_drds„ Z`	t	u	 d¦dvdw„Zae
j9 :d@¡e
j9 :dA¡dxdy„ ƒƒZbe
j9 :d@¡e
j9 :dA¡dzd{„ ƒƒZce
j9 :d@¡e
j9 :dA¡d|d}„ ƒƒZde
j9 Dd1d3d2g¡e
j9 Dd~ejeejfg¡dd€„ ƒƒZge
j9 Dd1d3d2g¡dd‚„ ƒZhdƒd„„ Zied…d†„ ƒZje
j9 :d@¡e
j9 :dA¡d‡dˆ„ ƒƒZke
j9 :d@¡e
j9 :dA¡d‰dŠ„ ƒƒZle
j9 Dd1d3d2g¡d‹dŒ„ ƒZmd§ddŽ„Zndd„ Zod‘d’„ Zpd“d”„ Zqe
j9 Dd4g d•¢¡d–d—„ ƒZre
j9 Dd˜dd™g¡dšd›„ ƒZse
j9 :dA¡dœd„ ƒZte
j9 Dd1d2d3g¡dždŸ„ ƒZue
j9 :d ¡d¡d¢„ ƒZve
j9 :d£¡d¤d¥„ ƒZwdS )¨é    N)ÚStringIO)Úassert_allclose)Ú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é   é
   éÿÿÿÿzPignore:The PCA initialization in TSNE will change to have the standard deviationc                  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$   úx/var/www/html/riverr-enterprise-integrations-main/venv/lib/python3.10/site-packages/sklearn/manifold/tests/test_t_sne.pyÚ__init__7   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%   ÚObjectiveSmallGradient6   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_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_stops4   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   ç      >@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rp   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   rv   ÚnnÚdistances_nnÚP2ÚP1_nnry   ÚtopnÚP2kÚidxÚP1topÚP2topr$   rz   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   rt   ru   Frr   rW   rN   r~   rX   )r   rZ   r   r€   r   re   r[   r)   r\   r   rb   r   rs   r   Útoarrayr
   )rv   r†   rd   re   r‡   r|   rf   Úlast_Prg   r+   rU   r{   Ú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   ©rv   gš™™™™™É?)
r   rZ   r   r)   Úaranger   rs   Ú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»   ro   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È   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   rK   r7   r3   é   r®   r   rÄ   iî  )rš   r»   ro   r;   rd   r¸   r8   r   r¦   r?   g)\Âõ(¼?©Úrtol)	r   rZ   ÚrandintÚspÚ
csr_matrixr   r¾   r   r   )r¸   rµ   r©   ÚX_csrr¿   r£   r$   r$   r%   Útest_fit_csr_matrixP  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š   ro   r;   Úearly_exaggerationÚmetricrd   r>   r8   r»   r   )rv   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_distancesd  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_metricz  s
   ÿrÝ   z(ignore:The default learning rate in TSNEz)ignore:The default initialization in TSNEc                  C   óV   t dd} tjtdd |  t dgdgg¡¡ W d   ƒ d S 1 s$w   Y  d S )Ng®Gáz®ï?)rÖ   zearly_exaggeration .*r¬   r3   ©r   r±   r²   r³   r¾   r)   r*   ©r¿   r$   r$   r%   Ú!test_early_exaggeration_too_small„  ó   
"ÿrá   c                  C   rÞ   )NéÇ   )r8   z	n_iter .*r¬   r3   rß   rà   r$   r$   r%   Útest_too_few_iterations  râ   rä   zmethod, retypezD, message_regexr3   r?   z.* square distance matrixg      ð¿z.* positive.*c                 C   sR   t d| ddd}tjt|d | ||ƒ¡ W d   ƒ d S 1 s"w   Y  d S )NrÔ   r®   rj   ©r×   r¸   r»   rd   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} tjtdd |  t dd	gd	dgg¡¡ W d   ƒ d S 1 s)w   Y  d S )
NrÔ   r¹   r®   rj   rå   Úsparser¬   r   rL   ©r   r±   r²   Ú	TypeErrorr¾   rÍ   rÎ   rà   r$   r$   r%   Ú test_exact_no_precomputed_sparse±  s   ü"ÿrì   c                  C   sv   t  g d¢g d¢g d¢g¡} t | ¡}t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»   rd   zB3 neighbors per samples are required, but some samples have only 1r¬   )	r)   r*   rÍ   rÎ   r   r±   r²   r³   r¾   )ÚdistÚ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J ‚t|j|ƒ tdddd	d
}| 	|¡}dD ]}| 	| 
|¡¡}t||ƒ q2dS )zAMake sure that TSNE works identically for sparse and dense matrixr   r6   r7   rt   T)rv   rw   Úinclude_selfrÔ   r®   r½   )r×   rd   r»   r;   )ÚcsrÚlilN)r   rZ   r   r   rÍ   Úissparser   ÚAr   r¾   Úasformat)rd   r©   ÚD_sparserØ   r¿   ÚXt_denseÚfmtÚ	Xt_sparser$   r$   r%   Ú test_sparse_precomputed_distanceÈ  s   ÿ
þrü   c                  C   sh   dd„ } t | 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¸   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   sZ   t dd} d}tjt|d |  t dgdgg¡¡ W d   ƒ d S 1 s&w   Y  d S )Núnot available)r»   z0'init' must be 'pca', 'random', or a numpy arrayr¬   r3   r?   rß   )r¿   Úmr$   r$   r%   Útest_init_not_availableë  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   sª   t ddd} tjtdd |  t dgdgg¡¡ W d   ƒ n1 s$w   Y  t ddd} tjtd	d |  t dgdgg¡¡ W d   ƒ d S 1 sNw   Y  d S )
Nr  r¹   rÿ   zUnknown metric not available.*r¬   r3   r?   rº   z"Metric 'not available' not valid.*rß   rà   r$   r$   r%   Útest_distance_not_available  s   ÿ"ÿr  c                  C   sV   t 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¸   z!'method' must be 'barnes_hut' or r¬   r3   r?   rß   rà   r$   r$   r%   Útest_method_not_available  râ   r	  c               	   C   s^   dD ]*} t | d}tjtdd | t dgdgg¡¡ W d   ƒ n1 s'w   Y  qd S )N)r    gíµ ÷Æ°¾gzo ð?r7   )Úanglez!'angle' must be between 0.0 - 1.0r¬   r3   r?   rß   )r
  r¿   r$   r$   r%   Útest_angle_out_of_range_checks  s   
ÿ€þr  c                  C   óX   t 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»   zBThe parameter init="pca" cannot be used with metric="precomputed".r¬   r3   r?   rß   rà   r$   r$   r%   Ú>test_pca_initialization_not_compatible_with_precomputed_kernel&  s   þ"ür  c                  C   s\   t ddd} tjtdd |  t ddgddgg¡¡ W d   ƒ d S 1 s'w   Y  d S )Nr¼   rÄ   r  zPCA initialization.*r¬   r   rL   rê   rà   r$   r$   r%   Ú8test_pca_initialization_not_compatible_with_sparse_input1  s   "ÿr  c                  C   r  )Nr~   rº   )rš   r¸   z'n_components' should be .*r¬   r3   r?   rß   rà   r$   r$   r%   Útest_n_components_range8  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š   ro   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_usedA  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_n_iter_usedb  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_pointsy  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_points‰  s"   "üÿ"üÿr4  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/  r0  r1  r2  r3  Fçš™™™™™¹?r7   r  r  r$   r$   r%   Útest_skip_num_points_gradient£  s"   "üÿ"üÿr6  Fr5  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 )NFrr   )Údtyper   )rÎ   r  r7   r   )Úskip_num_pointsr~   rX   )r   r[   r)   r\   Úint64r   r   rD   rc   Úscipy.sparserÎ   rx   r}   r   Úgradientre   r
   )r  r  r  r   r>   ro   r8  rf   ÚargsÚ	pij_inputÚgrad_bhrÎ   rU   r}   r$   r$   r%   r  À  s   	
ÿr  c                  C   s²   t 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|v s?J ‚d|v sEJ ‚d|v sKJ ‚d|v sQJ ‚d	|v sWJ ‚d S )
Nr   r7   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 S )Nr   Ú	chebyshevrÛ   rL   r7   )r   r   rZ   r¾   )rd   r¿   r©   r$   r$   r%   Útest_chebyshev_metricö  s   
rA  c                  C   sB   t dƒ} tdd}|  dd¡}| |¡j}t t |¡¡sJ ‚d S )Nr   r   )rš   rL   r7   )r   r   rZ   r€   Ú
embedding_r)   ÚallÚisfinite)rd   r¿   r©   r£   r$   r$   r%   Útest_reduction_to_one_component   s
   
rE  Ú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   Frr   rÄ   rÃ   r®   ©rš   ro   r;   rd   r¸   r>   r8   r»   )r   rZ   r[   r   r¾   r7  r)   r\   )r¸   rF  rd   r©   r¿   r£   Úeffective_typer$   r$   r%   Ú
test_64bit  s   ø

rI  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®   rG  )r   rZ   r   r¾   r)   ÚisnanrÆ   )r¸   rd   r©   r¿   r$   r$   r%   Útest_kl_divergence_not_nan$  s   ø

rK  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   rt   ru   )r
  r8  r>   rX   rW   )Úfloatr   rZ   r   r   r   r   r€   r   r   r   r   r‘   r
   r   )r
  ro   r†   rš   r¢   Údegrees_of_freedomrd   re   rf   r—   rU   Úkl_exactÚ
grad_exactrv   Údistances_csrÚP_bhÚkl_bhr>  r$   r$   r%   Útest_barnes_hut_angle:  sH   
ÿþÿ
øÞrS  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_N_ITERrB   rC   r   r¾   rE   rF   )rd   r©   r¸   r¿   rG   rI   r$   r$   r%   Útest_n_iter_without_progressd  s4   ù	


þ
érV  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Å   rL  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_normƒ  s<   


þ


€

ÿrd  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   rW  r    Ú	Iterationzerror = ú,rL   rX   )r   rZ   r   rB   rC   r   r¾   rE   rF   r[  Ú	partitionr   rÆ   rL  )rd   r©   r¿   rG   rI   ra  r+   rH   r$   r$   r%   Útest_accessible_kl_divergence°  s.   
ÿ


þ
€rh  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   ro   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.   ù
	
ùñrq  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   r5  r  r7   )r   r€   Ú
kneighborsr…   Úminr)   ra   Úmax)ro  rp  r‡   Ú
dist_to_nnÚsmallest_to_meanÚlargest_to_meanr$   r$   r%   rk  ö  s   rk  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  rl   )rš   r¸   r;   r»   rd   r8   ro   r
  r¹   rº   g-Cëâ6?rÊ   )
r   rZ   r[   r)   r\   r   rU  r¾   r  r   )rd   r¢   r©   Ú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
||ƒ qGd S )Nr   ry  r7   r   rW   rL   r   rt   ru   rN   )r
  r8  r>   Únum_threads)r7   r~   gíµ ÷Æ°>rÊ   )r   rZ   r[   r)   r\   r   r€   r   r   r   r   )r¢   r†   rš   rM  r
  ro   rd   re   r—   rv   rP  rQ  Úkl_sequentialÚgrad_sequentialr|  Úkl_multithreadÚgrad_multithreadr$   r$   r%   Ú-test_gradient_bh_multithread_match_sequential!  sT   þÿ
÷
÷òr  c            
   	   C   sŽ   t dƒ} d}d}|  d|¡ tj¡}ddg}ttg}t||ƒD ]%\}}t||dddd	d
 	|¡}td|dddd	d
 	||ƒ¡}	t
||	ƒ qdS )z8Make sure that TSNE works for different distance metricsr   rW   r7   rK   Ú	manhattanrÚ   rÃ   r®   r½   )r×   rš   rd   r8   r»   r;   rÔ   N)r   rZ   r[   r)   r\   r   r   Úzipr   r¾   r	   )
rd   Ún_components_originalÚn_components_embeddingr©   ÚmetricsÚ
dist_funcsr×   Ú	dist_funcÚX_transformed_tsneÚX_transformed_tsne_precomputedr$   r$   r%   Ú)test_tsne_with_different_distance_metricsT  s:   úùú
ùïr‹  )Nr®   r¼   c                 C   s  t dƒ}| dd¡}td| d}tdi dd„ | ¡ D ƒ¤Ž}| du rAtjtd	d
 | |¡ W d  ƒ dS 1 s:w   Y  dS | dkrdtjtdd
 | |¡ W d  ƒ dS 1 s]w   Y  dS t	 
¡  t	 dt¡ | |¡ W d  ƒ dS 1 sw   Y  dS )z]Make sure that a FutureWarning is only raised when the
    init is not specified or is 'pca'.r   rL   r7   ç      i@©r;   r»   c                 S   ó   i | ]\}}|d ur||“qS ©Nr$   ©rR   ry   Úvr$   r$   r%   Ú
<dictcomp>y  ó    z0test_tsne_init_futurewarning.<locals>.<dictcomp>NzThe default initialization.*r¬   r¼   zThe PCA initialization.*rH   r$   ©r   rZ   Údictr   Úitemsr±   ÚwarnsÚFutureWarningr¾   ÚwarningsÚcatch_warningsÚsimplefilter)r»   rd   r©   Úkwargsr¿   r$   r$   r%   Útest_tsne_init_futurewarningq  s    "ÿ"ÿ
"þr  r;   rŒ  c                 C   sÆ   t dƒ}| dd¡}t| dd}tdi dd„ | ¡ D ƒ¤Ž}| du rAtjtd	d
 | |¡ W d  ƒ dS 1 s:w   Y  dS t	 
¡  t	 dt¡ | |¡ W d  ƒ dS 1 s\w   Y  dS )zYMake sure that a FutureWarning is only raised when the learning rate
    is not specifiedr   rL   r7   r®   r  c                 S   rŽ  r  r$   r  r$   r$   r%   r’    r“  z9test_tsne_learning_rate_futurewarning.<locals>.<dictcomp>NzThe default learning rate.*r¬   rH   r$   r”  )r;   rd   r©   rœ  r¿   r$   r$   r%   Ú%test_tsne_learning_rate_futurewarningˆ  s   "ÿ
"þrž  c                  C   sX   t dƒ} |  dd¡}tjtdd tdd |¡ W d  ƒ dS 1 s%w   Y  dS )	z=Make sure that negative learning rate results in a ValueErrorr   rL   r7   z'learning_rate' must be.*r¬   g      IÀ)r;   N)r   rZ   r±   r²   r³   r   r¾   rÜ   r$   r$   r%   Ú test_tsne_negative_learning_rate›  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   ry  r7   rl   r   r®   r½   )rš   r¸   ro   r
  Ún_jobsrd   r»   r;   N)r   rZ   r   r¾   r   )r¸   rd   r¢   r©   ÚX_tr_refÚX_trr$   r$   r%   Útest_tsne_n_jobs¤  s8   ø	÷
ø	÷r£  z)ignore:.*TSNE will change.*:FutureWarningc            
      C   sÚ   t dƒ} d\}}|  ||¡}ddddddœ}tddd	i|¤Ž}d
}tjt|d | |¡ W d  ƒ n1 s8w   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½   rW   )ro   r8   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_distanceÃ  s4   ûÿÿÿÿþr®  z1ignore:The PCA initialization in TSNE will changec               
   C   s–   t dƒ} |  dd¡}tdddddddd	d
}d}tjt|d | |¡}W d  ƒ n1 s/w   Y  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   ry  r   r7   r¼   r½   rl   r   T)rš   r»   r;   ro   r
  r   rd   Úsquare_distanceszRThe parameter `square_distances` has not effect and will be removed in version 1.3r¬   N)rš   r»   r;   ro   r
  r   rd   )r   rZ   r   r±   r—  r˜  r¾   r   )rd   r©   r¿   Úwarn_msgÚ	X_trans_1Ú	X_trans_2r$   r$   r%   Ú&test_tsne_deprecation_square_distancesá  s8   øÿÿù
	r³  )Fr5  r   r  )xrB   Úior   Únumpyr)   Únumpy.testingr   r:  ré   rÍ   r±   r™  Úsklearn.neighborsr   r   Úsklearn.exceptionsr   Úsklearn.utils._testingr   r   r	   r
   r   Úsklearn.utilsr   Úsklearn.manifold._t_sner   r   r   r   r   r   Úsklearn.manifoldr   r   Úsklearn.manifold._utilsr   Úsklearn.datasetsr   Úscipy.optimizer   Úscipy.spatial.distancer   r   Úsklearn.metrics.pairwiser   r   r   r‚   rý   ÚmeshgridÚxxÚyyÚhstackr…   r   ri  ÚmarkÚfilterwarningsÚ
pytestmarkrJ   ri   rp   r   r”   r¤   rª   r·   ÚparametrizerÁ   rÈ   rÐ   rÙ   rÝ   rá   rä   ÚasarrayrÎ   rè   rì   rð   rü   r   r  r  r  r  r	  r  r  r  r  r  r  r!  r4  r6  r  r?  rA  rE  r\   Úfloat64rI  rK  rS  rV  rd  rh  rq  rk  r{  r  r‹  r  rž  rŸ  r£  r®  r³  r$   r$   r$   r%   Ú<module>   s:   þÿÿV,






ýþþþ




















!"
ù





	
*



+


'3







