a
    ;ZaO                  	   @   sZ  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. e/d ddZ0e1e0e0\Z2Z3e4e25 6dde35 6ddgZ7d d! Z8d"d# Z9d$d% Z:d&d' Z;d(d) Z<d*d+ Z=d,d- Z>e
j?@d.e
j?Ad/d0d1ge
j?Ad2d3d4d5 ZBe
j?@d.d6d7 ZCe
j?@d.e
j?Ad/d0d1gd8d9 ZDe
j?@d.d:d; ZEd<d= ZFe
j?@d.d>d? ZGe
j?@d.d@dA ZHe
j?@d.e
j?AdBd0ejIfd1ejIfd1e	jJfge
j?AdCdDgdEggdFfdDdGgdEdDggdHfgdIdJ ZKe
j?@d.dKdL ZLe
j?@d.dMdN ZMe
j?@d.eedOdPdQ ZNe
j?@d.dRdS ZOe
j?@d.dTdU ZPe
j?@d.dVdW ZQdXdY ZRe
j?@d.dZd[ ZSe
j?@d.d\d] ZTe
j?@d.d^d_ ZUe
j?@d.d`da ZVe
j?@d.dbdc ZWddde ZXe
j?@d.dfdg ZYe
j?@d.dhdi ZZdjdk Z[dldm Z\dndo Z]dpdq Z^ddtduZ_e
j?@d.dvdw Z`e
j?@d.dxdy Zae
j?@d.dzd{ Zbe
j?@d.e
j?Ad/d1d0ge
j?Ad|ejcejdgd}d~ Zee
j?@d.e
j?Ad/d1d0gdd Zfdd Zgedd Zhe
j?@d.dd Zie
j?@d.dd Zje
j?@d.e
j?Ad/d1d0gdd ZkdddZldd Zmdd Zne
j?@d.dd Zoe
j?Ad/d0d1ge
j?Adddge
j?AdddgeepdOdd Zqe
j?Adddge
j?Adddgdd Zre
j?Ad2g ddd Zse
j?Adddgdd Zte
j?@d.dd Zue
j?@d.e
j?Ad/d0d1gdd Zvd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   
   c                  C   s  G dd d} ddd}t j}t t _zHt|  tddddd	d	d	d
dd
\}}}W t j }t j  |t _nt j }t j  |t _0 |dksJ |dksJ d|v sJ t j}t t _zFt|tddddd	d	d	d	dd
\}}}W t j }t j  |t _nt j }t j  |t _0 |d	ks0J |dks>J d|v sLJ t j}t t _zHt|  tddddd	d	d	d	dd
\}}}W t j }t j  |t _nt j }t j  |t _0 |d	ksJ |dksJ d|v sJ 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$   @lib/python3.9/site-packages/sklearn/manifold/tests/test_t_sne.py__init__2   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__5   s    zDtest_gradient_descent_stops.<locals>.ObjectiveSmallGradient.__call__N)T)__name__
__module____qualname__r&   r-   r$   r$   r$   r%   ObjectiveSmallGradient1   s   r1   Tc                 S   s   dt dfS )N        r   )r)   ones)r+   r,   r$   r$   r%   flat_function9   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   r   r)   zerosgetvalueclose)r1   r4   
old_stdoutr+   errorr"   outr$   r$   r%   test_gradient_descent_stops/   s    












rG   c                     s   t d} | dd}t|tj}d}t||dd t ttj	j
 t fddt jd D }t||dd	 d S )
Nr   2            9@r;   c                    s0   g | ](}t t  | t  |   qS r$   )r)   Zexpsumlog).0iPr$   r%   
<listcomp>       z&test_binary_search.<locals>.<listcomp>   Zdecimal)r   randnr   astyper)   float32r   ZmaximumZfinfoZdoubleZepsmeanrangeshaper   )random_statedata	distancesdesired_perplexityZmean_perplexityr$   rP   r%   test_binary_search   s    r`   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         >@r   rK   r6   rT   rU   )	r   rV   rW   r)   rX   r   ZnansumZlog2r   )r\   r]   r_   rQ   
perplexityr$   r$   r%   test_binary_search_underflow   s    2re   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 qd S )N   rJ   r   r6   FcopyrK   r   distancen_neighborsmodec              	      s.   g | ]&} |j | |d    f qS )r   )indices)rN   kP1distance_graphindptrr$   r%   rR      s   z0test_binary_search_neighbors.<locals>.<listcomp>   rU      rI   r   r    )r   rV   rW   r)   rX   r   r   r   fitr   r]   reshaperr   r*   rZ   r
   linspaceintZargsortravel)	n_samplesr_   r\   r]   r^   rk   nnZdistances_nnZP2ZP1_nnrn   ZtopnZP2kidxZP1topZP2topr$   ro   r%   test_binary_search_neighbors   s@    r}   c                  C   s   d} d}t d}||d}t |}|j| dd}|jjtjdd}|	|| }d }d	}t
dD ]Z}	t| |dd
}
t||dd
}| }|d u r|
}|}qdt|
|dd t||dd qdd S )Nr   r5   r   rI   ri   rj   Frg   rT   rK   rs   rU   )r   rV   r   ru   r   r]   rW   r)   rX   rv   rZ   r   rh   r   toarrayr
   )rk   rz   r\   r]   r{   rq   r^   Zlast_Pr_   r+   rQ   rp   Zlast_P1r$   r$   r%    test_binary_perplexity_stability   s&    r   c                     s   t d} dd}dd| |tj}t||j}t|d | tj}t	|ddd  fdd	} fd
d}t
t||| ddd d S )Nr   rH   r6   r<   r2   rJ   )r_   r;   c                    s   t |  d S )Nr   r   paramsrQ   Zalphan_componentsrz   r$   r%   fun   s    ztest_gradient.<locals>.func                    s   t |  d S )Nr   r   r   r   r$   r%   grad   s    ztest_gradient.<locals>.gradrI   rU   )r   rV   rW   r)   rX   absdotTZfill_diagonalr   r   r   ry   )r\   
n_featuresr^   
X_embeddedr   r   r$   r   r%   test_gradient   s    r   c                  C   s   t d} | dd}t|d|d  dks.J tddd}| }| | t||d	k sdJ td
dd}tdgdgdgdgdgg}t	t||ddd d S )Nr   r5   r6         @r'   r<   r    r   g333333?rI   rs   rT   rk   g?)
r   rV   r   r)   Zarangerv   rh   Zshuffler*   r   )r\   Xr   r$   r$   r%   test_trustworthiness   s    
r   z)ignore:.*TSNE will change.*:FutureWarningmethodexact
barnes_hutinit)randompcac                 C   sZ   t d}d}|d|tj}t||d| dd}||}t||dd}|dksVJ d S )	Nr   r6   rH   i  )r   r   r\   r   r7   r   r   g333333?)r   rV   rW   r)   rX   r   fit_transformr   )r   r   r\   r   r   tsner   tr$   r$   r%   +test_preserve_trustworthiness_approximately  s    

r   c                  C   sz   t d} td| d\}}g }dD ],}tddd|dd}|| ||j q |d	 |d ksbJ |d |d	 ksvJ d
S )z=t-SNE should give a lower KL divergence with more iterations.r   rT   r   r\   )   ,  i^  r6   r         Y@)r   rd   r9   r7   r\   r   N)r   r   r   r   appendkl_divergence_)r\   r   r+   Zkl_divergencesr7   r   r$   r$   r%   )test_optimization_minimizes_kl_divergence%  s    
r   c                 C   sx   t d}|dd}d||ddd|dddf< t|}tdddd| dd	}||}tt||d
dddd d S )Nr   rH   r6   r2      r   r   i  )r   rd   r9   r\   r   r7   r   r   r<   g)\(?Zrtol)	r   rV   Zrandintsp
csr_matrixr   r   r   r   )r   rngr   ZX_csrr   r   r$   r$   r%   test_fit_csr_matrix:  s     

r   c                  C   sv   t d} tdD ]`}| dd}tt|d}tddddd|dd	d
dd
}||}t||ddd}|dksJ qd S )Nr   rT   P   r6   Zsqeuclideanr          @precomputed  Tr   )
r   rd   r9   early_exaggerationmetricr\   r;   r7   square_distancesr   r   )rk   r   gffffff?)r   rZ   rV   r   r   r   r   r   )r\   rO   r   Dr   r   r   r$   r$   r%   Ftest_preserve_trustworthiness_approximately_with_precomputed_distancesO  s&    
r   c                  C   s@   t d} | dd}t||ddtt|dd|ddks<J d S )Nr   r5   r6   cosiner   r   )r   rV   r   r   r\   r   r$   r$   r%   )test_trustworthiness_not_euclidean_metricg  s
    r   c                  C   sT   t dd} tjtdd( | tdgdgg W d    n1 sF0    Y  d S )NgGz?)r   zearly_exaggeration .*matchr2   r   pytestraises
ValueErrorr   r)   r*   r   r$   r$   r%   !test_early_exaggeration_too_smallr  s    
r   c                  C   sT   t dd} tjtdd( | tdgdgg W d    n1 sF0    Y  d S )N   )r7   z	n_iter .*r   r2   r   r   r$   r$   r%   test_too_few_iterations{  s    
r   zmethod, retypezD, message_regexr2   r<   z.* square distance matrixg      z.* positive.*c                 C   sR   t d| dddd}tjt|d ||| W d    n1 sD0    Y  d S )Nr   Tr   ra   r   r   r   r   r\   r   )r   r   r   r   r   )r   r   ZretypeZmessage_regexr   r$   r$   r%   test_bad_precomputed_distances  s    r   c                  C   s`   t dddddd} tjtdd, | td	d
gd
d	gg W d    n1 sR0    Y  d S )Nr   r   Tr   ra   r   sparser   r   rI   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}d}tjt|d	 || W d    n1 sh0    Y  d S )
N)r<   r2   r2   )r2   r<   r2   r   Tr   ra   )r   r   r   r\   zB3 neighbors per samples are required, but some samples have only 1r   )	r)   r*   r   r   r   r   r   r   r   )Z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:J t|j| tddddd	}|	|}d
D ]}|	|
|}t|| qddS )zAMake sure that TSNE works identically for sparse and dense matrixr   r5   r6   ri   T)rk   rl   Zinclude_selfr   r   )r   r\   r   r   )ZcsrZlilN)r   rV   r   r   r   Zissparser   Ar   r   Zasformat)r\   r   ZD_sparser   r   ZXt_denseZfmtZ	Xt_sparser$   r$   r%    test_sparse_precomputed_distance  s    
r   c                  C   sh   dd } t | ddd}tddgddgg}tjtdd	 || W d    n1 sZ0    Y  d S )
Nc                 S   s   dS r!   r$   )xyr$   r$   r%   r     s    z4test_non_positive_computed_distances.<locals>.metricr   Tr   r   r   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   sX   t dd} d}tjt|d( | tdgdgg W d    n1 sJ0    Y  d S )Nnot availabler   z0'init' must be 'pca', 'random', or a numpy arrayr   r2   r<   r   )r   mr$   r$   r%   test_init_not_available  s    
r   c                  C   s4   t tdd} | td}ttd| d S )Nr5   r6   r   )r5   rI   )r   r)   rA   r   r3   r	   )r   r   r$   r$   r%   test_init_ndarray  s    r   c                  C   s*   t tddddd} | td d S )Nr   r   Tg      I@)r   r   r   r9   )r5   r5   )r   r)   rA   ru   r   r$   r$   r%   test_init_ndarray_precomputed  s    r   c                  C   s   t dddd} tjtdd( | tdgdgg W d    n1 sJ0    Y  t dd	dd} tjtd
d( | tdgdgg W d    n1 s0    Y  d S )Nr   r   Tr   zUnknown metric not available.*r   r2   r<   r   z"Metric 'not available' not valid.*r   r   r$   r$   r%   test_distance_not_available  s    6r   c                  C   sT   t dd} tjtdd( | tdgdgg W d    n1 sF0    Y  d S )Nr   )r   z!'method' must be 'barnes_hut' or r   r2   r<   r   r   r$   r$   r%   test_method_not_available  s    
r   c                  C   sT   t dd} tjtdd( | tdgdgg W d    n1 sF0    Y  d S )NZnot_available)r   z"'square_distances' must be True orr   r2   r<   r   r   r$   r$   r%   #test_square_distances_not_available  s    
r   c               	   C   s^   dD ]T} t | d}tjtdd( |tdgdgg W d    q1 sN0    Y  qd S )N)r    gưgzo ?r6   )anglez!'angle' must be between 0.0 - 1.0r   r2   r<   r   )r   r   r$   r$   r%   test_angle_out_of_range_checks   s    
r   c                  C   sX   t dddd} tjtdd( | tdgdgg W d    n1 sJ0    Y  d S )	Nr   r   T)r   r   r   zBThe parameter init="pca" cannot be used with metric="precomputed".r   r2   r<   r   r   r$   r$   r%   >test_pca_initialization_not_compatible_with_precomputed_kernel*  s    r   c                  C   sZ   t ddd} tjtdd, | tddgddgg W d    n1 sL0    Y  d S )Nr   r   )r   r9   zPCA initialization.*r   r   rI   r   r   r$   r$   r%   8test_pca_initialization_not_compatible_with_sparse_input5  s    r   c                  C   sV   t ddd} tjtdd( | tdgdgg W d    n1 sH0    Y  d S )Nrs   r   )r   r   z'n_components' should be .*r   r2   r<   r   r   r$   r$   r%   test_n_components_range=  s    r   c                  C   s   t d} d}ddg}| d|tj}|D ]X}t|dddd|d	d
d}||}t|dddd|dd
d}||}t||r,J q,d S )Nr   r6   r   r   r   r   r   r   r<   r   r   rd   r9   r   r\   r   r   r7   r'   )r   rV   rW   r)   rX   r   r   Zallclose)r\   r   methodsr   r   r   ZX_embedded1ZX_embedded2r$   r$   r%   test_early_exaggeration_usedF  s8    



r   c                  C   st   t d} d}ddg}| d|tj}|D ]B}dD ]8}t|ddd	d|d
|d}|| |j|d ks4J q4q,d S )Nr   r6   r   r   r   )   r   r         ?r   r<   r   )r   rV   rW   r)   rX   r   r   n_iter_)r\   r   r   r   r   r7   r   r$   r$   r%   test_n_iter_usedh  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
gCrgJ!zE?g)x>1?r   r   gKXAgr}gKXA>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 g dg dg dg dg}t ddgddgddgddgg}t| ||| d S )Nr<   r2   r   r   333333@皙@$1?m5a ҇&IimU-|3Sٵ?:ǁ$*r   r6   rT   r   r6   rT   r   r   rT   r   r6   r   g\$w?gRn		Qgz}g`>41f>6Sc>gU9&#*@>r   r   r$   r$   r%    test_answer_gradient_four_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 g dg dg dg dg}t ddgddgddgddgg}t| |||ddd d S )Nr<   r2   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   F皙?r6   r   r   r$   r$   r%   test_skip_num_points_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 )NFrg   )dtyper   )r   r   r6   r   )skip_num_pointsrs   rU   )r   rW   r)   rX   Zint64r   r   rA   r[   scipy.sparser   rm   rr   r   Zgradientr]   r
   )r   r   r   r   r;   rd   r  r^   argsZ	pij_inputgrad_bhr   rQ   rr   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_0 d|v s~J d|v sJ d|v sJ d|v sJ d	|v sJ d S )
Nr   r6   rK   rI   z[t-SNE]znearest neighbors...z"Computed conditional probabilitiesz
Mean sigmazearly exaggeration)	r   r   rV   r?   r@   r   r   rB   rC   )r\   r   r   rD   rF   r$   r$   r%   test_verbose  s$    




r  c                  C   s.   t d} tddd}| dd}|| d S )Nr   Z	chebyshevT)r   r   rI   r6   )r   r   rV   r   )r\   r   r   r$   r$   r%   test_chebyshev_metric  s    r  c                  C   sB   t d} tdd}| dd}||j}tt|s>J d S )Nr   r   )r   rI   r6   )r   r   rV   ru   Z
embedding_r)   allZisfinite)r\   r   r   r   r$   r$   r%   test_reduction_to_one_component  s
    
r  dtc              	   C   sV   t d}|ddj|dd}tdddd| ddd}||}|j}|tjksRJ d S )	Nr   r   r6   Frg   r   r   r   rd   r9   r\   r   r;   r7   )r   rV   rW   r   r   r   r)   rX   )r   r	  r\   r   r   r   Zeffective_typer$   r$   r%   
test_64bit  s    	
r  c              	   C   sH   t d}|dd}tdddd| ddd}|| t|jrDJ d S )Nr   rH   r6   r   i  r
  )r   rV   r   r   r)   Zisnanr   )r   r\   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   rT   rI   r<   r   rK   r   ri   rj   )r   r  r;   rU   rT   )floatr   rV   r   r   r   r   ru   r   r   r   r   r~   r
   r   )r   rd   rz   r   r   degrees_of_freedomr\   r]   r^   r   rQ   Zkl_exactZ
grad_exactrk   distances_csrP_bhZkl_bhr  r$   r$   r%   test_barnes_hut_angleB  sH    

r  c               
   C   s   t d} | dd}dD ]}tdddd|dd	d
}d|_d|_tj}t t_z(|| W tj	 }tj
  |t_ntj	 }tj
  |t_0 d|v sJ qd S )Nr   r5   r   )r   r   r    r6   g    חAi_  r   )r8   r;   r9   r\   r   r7   r   r   z@did not make any progress during the last -1 episodes. Finished.)r   rV   r   Z_N_ITER_CHECK_EXPLORATION_N_ITERr?   r@   r   r   rB   rC   )r\   r   r   r   rD   rF   r$   r$   r%   test_n_iter_without_progressl  s2    	



r  c                  C   s  t d} | dd}d}t|dddd}tj}t t_z(|| W tj }tj  |t_ntj }tj  |t_0 |	d}g }|D ]R}d|v r q|
d	}	|	dkr||	d  }|d
d	dd }|t| qt|}t|||k }
|
dks
J d S )Nr   r5   r6   gMb`?r   )r:   r;   r\   r   
ZFinishedr=   zgradient norm =   r   )r   rV   r   r?   r@   r   r   rB   rC   splitfindreplacer   r  r)   r*   len)r\   r   r:   r   rD   rF   Z	lines_outZgradient_norm_valueslineZstart_grad_normZn_smaller_gradient_normsr$   r$   r%   test_min_grad_norm  s:    







r  c                  C   s   t d} | dd}tdddddd}tj}t t_z(|| W tj }tj  |t_ntj }tj  |t_0 |	dd d d D ]4}d	|v r|
d
\}}}|r|
d\}}} qqt|jt|dd d S )Nr   rH   r6   r   r   )r8   r;   r\   r   r7   r  r    Z	Iterationzerror = ,rI   rU   )r   rV   r   r?   r@   r   r   rB   rC   r  	partitionr   r   r  )r\   r   r   rD   rF   r  r+   rE   r$   r$   r%   test_accessible_kl_divergence  s,    




r  c              	   C   s   t d}d}|D ]r}tdd|d|| d}|t}d| |}zt|| W q ty   |d7 }||_|t}t|| Y q0 qd	S )
a  Make sure that TSNE can approximately recover a uniform 2D grid

    Due to ties in distances between point in X_2d_grid, this test is platform
    dependent for ``method='barnes_hut'`` due to numerical imprecision.

    Also, t-SNE is not assured to converge to the right solution because bad
    initialization can lead to convergence to bad local minimum (the
    optimization problem is non-convex). To avoid breaking the test too often,
    we re-run t-SNE from the final point when the convergence is not good
    enough.
    rT   r   r6   r   rH   )r   r   r\   rd   r7   r   z{}_{}z:rerunN)rZ   r   r   	X_2d_gridformatassert_uniform_gridAssertionErrorr   )r   Zseedsr7   Zseedr   Ytry_namer$   r$   r%   test_uniform_grid  s(    

r&  c                 C   s|   t dd| }|jddd  }| dks4J | t| }| t| }|dkshJ ||dk sxJ |d S )	Nr   r   T)Zreturn_distancer   r   r   r6   )r   ru   Z
kneighborsry   minr)   rY   max)r$  r%  r{   Z
dist_to_nnZsmallest_to_meanZlargest_to_meanr$   r$   r%   r"    s    r"  c                  C   s   t d} d}| d|tj}i }i }dD ]:}td|ddddd	dd
}d|_||||< |j||< q,|d |d ks|J t	|d |d dd d S )Nr   r      )r   r   r6   r<   r   r   rc   )r   r   r9   r   r\   r7   rd   r   r   r   g-C6?r   )
r   rV   rW   r)   rX   r   r  r   r   r   )r\   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
|| qd S )Nr   r)  r6   r   rT   rI   r   ri   rj   rK   )r   r  r;   num_threads)r6   rs   gư>r   )r   rV   rW   r)   rX   r   ru   r   r   r   r   )r   rz   r   r  r   rd   r\   r]   r   rk   r  r  Zkl_sequentialZgrad_sequentialr+  Zkl_multithreadZ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 ]J\}}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   rT   r6   rH   	manhattanr   r   Tr   )r   r   r\   r7   r   r   r   )r   r   r\   r7   r   r   N)r   rV   rW   r)   rX   r   r   zipr   r   r	   )
r\   n_components_originaln_components_embeddingr   ZmetricsZ
dist_funcsr   Z	dist_funcX_transformed_tsneX_transformed_tsne_precomputedr$   r$   r%   )test_tsne_with_different_distance_metrics^  s8    r3  r   	euclideanr-  r   Tlegacyc                 C   s   t d}d}d}t||d\}}t||d}|dkrD|dkrD|dC }t|||| ddd	|}	td
||| ddd	|}
t|	|
 d S )Nr   rT   r6   r   r   r4  r5  r   )r   r   r   r   r\   r   r   )r   r   r   r   r   r   )r   r   r   r\   r/  r0  r   r+   ZX_precomputedr1  r2  r$   r$   r%   $test_tsne_different_square_distances{  s8    	r6  c                 C   s   t d}|dd}t| |ddd}| dkrn|durntjtd	d
 || W d    q1 sb0    Y  n<td }|| W d    n1 s0    Y  |rJ d S )Nr   rI   r6         i@r   )r   r   r9   r   r4  Tz'square_distances'.*r   )r   rV   r   r   warnsFutureWarningr   )r   r   r\   r   r   recordr$   r$   r%   (test_tsne_square_distances_futurewarning  s    *(r;  )Nr   r   c                 C   s   t d}|dd}td| d}tf i dd | D }| du r~tjtd	d
 || W d   q1 sr0    Y  n~| dkrtjtdd
 || W d   q1 s0    Y  n<td}|| W d   n1 s0    Y  |rJ dS )z]Make sure that a FutureWarning is only raised when the
    init is not specified or is 'pca'.r   rI   r6   r7  r9   r   c                 S   s   i | ]\}}|d ur||qS Nr$   rN   rn   vr$   r$   r%   
<dictcomp>  rS   z0test_tsne_init_futurewarning.<locals>.<dictcomp>NzThe default initialization.*r   r   zThe PCA initialization.*	r   rV   dictr   itemsr   r8  r9  r   )r   r\   r   kwargsr   r:  r$   r$   r%   test_tsne_init_futurewarning  s    **(rE  r9   r7  c                 C   s   t d}|dd}t| dd}tf i dd | D }| du r~tjtd	d
 || W d   q1 sr0    Y  n<td}|| W d   n1 s0    Y  |rJ dS )zYMake sure that a FutureWarning is only raised when the learning rate
    is not specifiedr   rI   r6   r   r<  c                 S   s   i | ]\}}|d ur||qS r=  r$   r>  r$   r$   r%   r@    rS   z9test_tsne_learning_rate_futurewarning.<locals>.<dictcomp>NzThe default learning rate.*r   rA  )r9   r\   r   rD  r   r:  r$   r$   r%   %test_tsne_learning_rate_futurewarning  s    *(rF  c                  C   sV   t d} | dd}tjtdd  tdd| W d   n1 sH0    Y  dS )	z=Make sure that negative learning rate results in a ValueErrorr   rI   r6   z'learning_rate' must be.*r   g      I)r9   N)r   rV   r   r   r   r   r   r   r$   r$   r%    test_tsne_negative_learning_rate  s    rG  c                 C   sZ   t d}d}|d|}td| ddddd|}t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   rc   r   )r   r   rd   r   Zn_jobsr\   N)r   rV   r   r   r   )r   r\   r   r   ZX_tr_refZX_trr$   r$   r%   test_tsne_n_jobs  s0    	rH  )Fr   r   )N)wr?   ior   Znumpyr)   Znumpy.testingr   r  r   r   r   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   rw   r   ZmeshgridZxxZyyZhstackry   rv   r   rG   r`   re   r}   r   r   r   ZmarkfilterwarningsZparametrizer   r   r   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   r   r  r  r  rX   Zfloat64r  r  r  r  r  r  r&  r"  r*  r,  r3  r9  r6  r;  rE  rF  rG  rH  r$   r$   r$   r%   <module>   s:  V,



















	









	






!"   




	




*


,


&
4

"



	
