B
    0dO              	   @   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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?Ad2dddg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 _z.t|  tddddd	d	d	d
dd
\}}}W d t j }t j  |t _X |dks~t|dkstd|kstt j}t t _z,t|tddddd	d	d	d	dd
\}}}W d t j }t j  |t _X |d	kst|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 d t j }t j  |t _X |d	ks~t|dkstd|kst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"   S/var/www/html/venv/lib/python3.7/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   g      $@gh㈵>)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   r-   Tc             S   s   dt dfS )Ng        r   )r%   ones)r'   r(   r"   r"   r#   flat_function9   s    z2test_gradient_descent_stops.<locals>.flat_functionr   r   d   g        gh㈵>   )n_itern_iter_without_progressZmomentumlearning_rateZmin_gainmin_grad_normverboseg      ?zgradient normr      zdid not make any progresszIteration 10)T)	sysstdoutr   r   r%   zerosgetvaluecloseAssertionError)r-   r/   
old_stdoutr'   errorr    outr"   r"   r#   test_gradient_descent_stops/   s|    






rA   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      g      9@)r6   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"   )rI   r#   test_binary_search   s    rY   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   r0   g      >@r   )r6   r1   rK   )rL   )	r   rM   rN   r%   rO   r   Znansumlog2r   )rU   rV   rX   rI   
perplexityr"   r"   r#   test_binary_search_underflow   s    2r^   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 xt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 qW d S )N   g      9@r   r1   F)copy)r6   r   distance)n_neighborsmodec          	      s.   g | ]&} |j | |d    f qS )r   )indices)rG   k)P1distance_graphindptrr"   r#   rJ      s   z0test_binary_search_neighbors.<locals>.<listcomp>   )rL      rC   r   r   )r   rM   rN   r%   rO   r   r   r   fitr   rV   reshaperh   r&   rS   r
   linspaceintZargsortravel)	n_samplesrX   rU   rV   rW   rb   nnZdistances_nnZP2ZP1_nnre   ZtopnZP2kidxZP1topZP2topr"   )rf   rg   rh   r#   test_binary_search_neighbors   s<    rs   c              C   s   d} d}t d}||d}t |}|j| dd}|jjtjdd}|	|| }d }d	}xft
dD ]Z}	t| |dd
}
t||dd
}| }|d kr|
}|}qft|
|dd t||dd qfW d S )Nr   r0   r   rC   ra   )rb   rc   F)r`   rK   )r6   ri   )rL   )r   rM   r   rk   r   rV   rN   r%   rO   rl   rS   r   r`   r   toarrayr
   )rb   rp   rU   rV   rq   rg   rW   Zlast_PrX   r'   rI   rf   Zlast_P1r"   r"   r#    test_binary_perplexity_stability   s&    ru   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   rB   r1   g      ?g        g      9@)rX   r6   c                s   t |  d S )Nr   )r   )params)rI   alphan_componentsrp   r"   r#   fun   s    ztest_gradient.<locals>.func                s   t |  d S )Nr   )r   )rv   )rI   rw   rx   rp   r"   r#   grad   s    ztest_gradient.<locals>.gradrC   )rL   )r   rM   rN   r%   rO   absdotTZfill_diagonalr   r   r   ro   )rU   
n_featuresrW   
X_embeddedry   rz   r"   )rI   rw   rx   rp   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   r0   r1   g      @g      $@g      ?r   r   g333333?rC   ri   rK   )rb   g?)r   rM   r   r=   r%   Zarangerl   r`   shuffler&   r   )rU   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sVtd S )	Nr   r1   rB   i  )rx   r   rU   r   r2   r   )rb   g333333?)	r   rM   rN   r%   rO   r   fit_transformr   r=   )r   r   rU   rx   r   tsner   tr"   r"   r#   +test_preserve_trustworthiness_approximately  s    
r   c              C   s~   t d} td| d\}}g }x4dD ],}tddd|dd}|| ||j q"W |d	 |d ksft|d |d	 ksztd
S )z=t-SNE should give a lower KL divergence with more iterations.r   rK   )r~   rU   )   i,  i^  r1   r   g      Y@)rx   r]   r4   r2   rU   r   N)r   r   r   r   appendkl_divergence_r=   )rU   r   r'   Zkl_divergencesr2   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   rB   r1   g           r   g      Y@i  )rx   r]   r4   rU   r   r2   r   )rb   g      ?g)\(?)rtol)	r   rM   randintsp
csr_matrixr   r   r   r   )r   rngr   ZX_csrr   r   r"   r"   r#   test_fit_csr_matrix:  s     

r   c              C   sz   t d} xlt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tqW d S )Nr   rK   P   r1   Zsqeuclideang      Y@g       @precomputedi  Tr   )
rx   r]   r4   early_exaggerationmetricrU   r6   r2   square_distancesr   r   )rb   r   gffffff?)	r   rS   rM   r   r   r   r   r   r=   )rU   rH   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<td S )Nr   r0   r1   cosine)r   r   )r   rM   r   r   r=   )rU   r   r"   r"   r#   )test_trustworthiness_not_euclidean_metricg  s    r   c           	   C   s@   t dd} tjtdd | tdgdgg W d Q R X d S )NgGz?)r   zearly_exaggeration .*)matchg        )r   pytestraises
ValueErrorr   r%   r&   )r   r"   r"   r#   !test_early_exaggeration_too_smallr  s    
r   c           	   C   s@   t dd} tjtdd | tdgdgg W d Q R X d S )N   )r2   z	n_iter .*)r   g        )r   r   r   r   r   r%   r&   )r   r"   r"   r#   test_too_few_iterations{  s    
r   zmethod, retypezD, message_regexg        g      ?z.* square distance matrixg      z.* positive.*c          	   C   s>   t d| dddd}tjt|d ||| W d Q R X d S )Nr   Tr   rZ   )r   r   r   r   rU   )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 d Q R X d S )Nr   r   Tr   rZ   )r   r   r   r   rU   sparse)r   r   rC   )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 d Q R X d S )
Ng      ?g        r   Tr   rZ   )r   r   r   rU   zB3 neighbors per samples are required, but some samples have only 1)r   )	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	}|
|}x&d
D ]}|
||}t|| qfW dS )zAMake sure that TSNE works identically for sparse and dense matrixr   r0   r1   ra   T)rb   rc   Zinclude_selfr   r   )r   rU   r   r   )ZcsrZlilN)r   rM   r   r   r   issparser=   r   Ar   r   Zasformat)rU   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 d Q R X d S )
Nc             S   s   dS )Nr   r"   )xyr"   r"   r#   r     s    z4test_non_positive_computed_distances.<locals>.metricr   T)r   r   r   g        g      ?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   sD   t dd} d}tjt|d | tdgdgg W d Q R X d S )Nznot available)r   z0'init' must be 'pca', 'random', or a numpy array)r   g        g      ?)r   r   r   r   r   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)r0   r1   )r   )r0   rC   )r   r%   r:   r   r.   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 )N)r0   r1   r   Tg      I@)r   r   r   r4   )r0   r0   )r   r%   r:   rk   )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 Q R X t dd	dd} tjtd
d | tdgdgg W d Q R X d S )Nznot availabler   T)r   r   r   zUnknown metric not available.*)r   g        g      ?r   z"Metric 'not available' not valid.*)r   r   r   r   r   r%   r&   )r   r"   r"   r#   test_distance_not_available  s    "r   c           	   C   s@   t dd} tjtdd | tdgdgg W d Q R X d S )Nznot available)r   z!'method' must be 'barnes_hut' or )r   g        g      ?)r   r   r   r   r   r%   r&   )r   r"   r"   r#   test_method_not_available  s    
r   c           	   C   s@   t dd} tjtdd | tdgdgg W d Q R X d S )NZnot_available)r   z"'square_distances' must be True or)r   g        g      ?)r   r   r   r   r   r%   r&   )r   r"   r"   r#   #test_square_distances_not_available  s    
r   c           
   C   sN   xHdD ]@} t | d}tjtdd |tdgdgg W d Q R X qW d S )N)r   gưgzo ?r1   )anglez!'angle' must be between 0.0 - 1.0)r   g        g      ?)r   r   r   r   r   r%   r&   )r   r   r"   r"   r#   test_angle_out_of_range_checks   s    

r   c           	   C   sD   t dddd} tjtdd | tdgdgg W d Q R X d S )	Nr   r   T)r   r   r   zBThe parameter init="pca" cannot be used with metric="precomputed".)r   g        g      ?)r   r   r   r   r   r%   r&   )r   r"   r"   r#   >test_pca_initialization_not_compatible_with_precomputed_kernel*  s
    
r   c           	   C   sF   t ddd} tjtdd" | tddgddgg W d Q R X d S )Nr   g      Y@)r   r4   zPCA initialization.*)r   r   rC   )r   r   r   r   r   r   r   )r   r"   r"   r#   8test_pca_initialization_not_compatible_with_sparse_input5  s    r   c           	   C   sB   t ddd} tjtdd | tdgdgg W d Q R X d S )Nri   r   )rx   r   z'n_components' should be .*)r   g        g      ?)r   r   r   r   r   r%   r&   )r   r"   r"   r#   test_n_components_range=  s    r   c              C   s   t d} d}ddg}| d|tj}x`|D ]X}t|dddd|d	d
d}||}t|dddd|dd
d}||}t||r.tq.W d S )Nr   r1   r   r   r   r   g      Y@r   g      ?r   )rx   r]   r4   r   rU   r   r   r2   g      $@)	r   rM   rN   r%   rO   r   r   Zallcloser=   )rU   rx   methodsr   r   r   ZX_embedded1ZX_embedded2r"   r"   r#   test_early_exaggeration_usedF  s4    


r   c              C   s|   t d} d}ddg}| d|tj}xN|D ]F}x@dD ]8}t|ddd	d|d
|d}|| |j|d ks8tq8W q.W d S )Nr   r1   r   r   r   )   i  r   g      ?r   g      ?)rx   r]   r4   r   rU   r   r   r2   )	r   rM   rN   r%   rO   r   r   n_iter_r=   )rU   rx   r   r   r   r2   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 )Ng      ?g        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 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 )Ng      ?g        g      @g       @g333333@g@g$1?gmg5a ҇&gIimgU-g|3Sٵ?g:ǁg$*r   r1   rK   r   g\$w?gRn		Qgz}g`>g41f>g6Scg>gU9&g#*@>)r%   r&   r   )r   r   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 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 )Ng      ?g        g      @g       @g333333@g@g$1?gmg5a ҇&gIimgU-g|3Sٵ?g:ǁg$*r   r1   rK   r   g41f>g6Scg>gU9&g#*@>Fg?)r%   r&   r   )r   r   r   r   r"   r"   r#   test_skip_num_points_gradient  s    "*r   F皙?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 )NF)r`   )dtyper   )r   g      ?r1   r   )skip_num_pointsri   )rL   )r   rN   r%   rO   Zint64r   r   r:   rT   scipy.sparser   rd   rh   r   ZgradientrV   r
   )r   r   r   r   r6   r]   r   rW   argsZ	pij_inputgrad_bhr   rI   rh   r"   r"   r#   r     s    	
r   c              C   s   t d} tdd}| dd}tj}t t_z|| W d tj }tj  |t_X d|ksdt	d|kspt	d|ks|t	d|kst	d	|kst	d S )
Nr   r1   )r6   rC   z[t-SNE]znearest neighbors...z"Computed conditional probabilitiesz
Mean sigmazearly exaggeration)
r   r   rM   r8   r9   r   r   r;   r<   r=   )rU   r   r   r>   r@   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   rC   r1   )r   r   rM   r   )rU   r   r   r"   r"   r#   test_chebyshev_metric  s    r   c              C   sB   t d} tdd}| dd}||j}tt|s>td S )Nr   r   )rx   rC   r1   )	r   r   rM   rk   Z
embedding_r%   allisfiniter=   )rU   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sRtd S )	Nr   r   r1   F)r`   g      Y@i,  )rx   r]   r4   rU   r   r6   r2   )	r   rM   rN   r   r   r   r%   rO   r=   )r   r   rU   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rDtd S )Nr   rB   r1   g      Y@i  )rx   r]   r4   rU   r   r6   r2   )r   rM   r   r   r%   isnanr   r=   )r   rU   r   r   r"   r"   r#   test_kl_divergence_not_nan,  s    
r   c              C   s   d} d}d}xd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W d S )Ng        r   r0   )r1   rK   rC   g      ?r   )r6   r   ra   )rb   rc   )r   r   r6   )rL   rK   )floatr   rM   r   r   r   r   rk   r   r   r   r   rt   r
   r   )r   r]   rp   rx   r~   degrees_of_freedomrU   rV   rW   rv   rI   Zkl_exactZ
grad_exactrb   distances_csrP_bhZkl_bhr   r"   r"   r#   test_barnes_hut_angleB  s>    

r   c           
   C   s   t d} | dd}xtdD ]l}tdddd|dd	d
}d|_d|_tj}t t_z|| W d tj	 }tj
  |t_X d|kstqW d S )Nr   r0   r   )r   r   r   r1   g    חAi_  r   )r3   r6   r4   rU   r   r2   r   r   z@did not make any progress during the last -1 episodes. Finished.)r   rM   r   Z_N_ITER_CHECK_EXPLORATION_N_ITERr8   r9   r   r   r;   r<   r=   )rU   r   r   r   r>   r@   r"   r"   r#   test_n_iter_without_progressl  s*    


r   c              C   s   t d} | dd}d}t|dddd}tj}t t_z|| W d tj }tj  |t_X |	d}g }xX|D ]P}d|krP |
d	}	|	dkrv||	d  }|d
d	dd }|t| qvW t|}t|||k }
|
dkstd S )Nr   r0   r1   gMb`?r   )r5   r6   rU   r   
ZFinishedzgradient normzgradient norm =   r   )r   rM   r   r8   r9   r   r   r;   r<   splitfindreplacer   r   r%   r&   lenr=   )rU   r   r5   r   r>   r@   Z	lines_outZgradient_norm_valueslineZstart_grad_normZn_smaller_gradient_normsr"   r"   r#   test_min_grad_norm  s2    





r   c              C   s   t d} | dd}tdddddd}tj}t t_z|| W d tj }tj  |t_X xJ|	dd d d D ]2}d	|krv|
d
\}}}|rv|
d\}}}P qvW t|jt|dd d S )Nr   rB   r1   r   i  )r3   r6   rU   r   r2   r   r   Z	Iterationzerror = ,rC   )rL   )r   rM   r   r8   r9   r   r   r;   r<   r   	partitionr   r   r   )rU   r   r   r>   r@   r   r'   r?   r"   r"   r#   test_accessible_kl_divergence  s$    

r   c          	   C   s   t d}d}x||D ]t}tdd|d|| d}|t}d| |}yt|| W q tk
r   |d7 }||_|t}t|| Y qX 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.
    rK   i  r1   r   rB   )rx   r   rU   r]   r2   r   z{}_{}z:rerunN)rS   r   r   	X_2d_gridformatassert_uniform_gridr=   r   )r   Zseedsr2   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   )rb   T)Zreturn_distancer   g?g      ?r1   )	r   rk   Z
kneighborsro   minr=   r%   rR   max)r   r   rq   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 }xBdD ]:}td|ddddd	dd
}d|_||||< |j||< q.W |d |d kst	t
|d |d dd d S )Nr   r      )r   r   r1   g      ?r   r   g      >@)rx   r   r4   r   rU   r2   r]   r   r   r   g-C6?)r   )r   rM   rN   r%   rO   r   r   r   r   r=   r   )rU   r~   r   ZX_embeddedsr2   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	\}}xBdD ]:}t	||||||dd|d	\}}t
||dd t
|| qW d S )Nr   r   r1   r   rK   rC   r   ra   )rb   rc   )r6   )r   r   r6   num_threads)r1   ri   gư>)r   )r   rM   rN   r%   rO   r   rk   r   r   r   r   )r~   rp   rx   r   r   r]   rU   rV   rv   rb   r   r   Zkl_sequentialZgrad_sequentialr   Zkl_multithreadZgrad_multithreadr"   r"   r#   -test_gradient_bh_multithread_match_sequential*  sJ    

r   c        
   	   C   s   t d} d}d}| d|tj}ddg}ttg}xXt||D ]J\}}t||dddd	d
	|}td|ddd	dd	||}	t
||	 q@W dS )z8Make sure that TSNE works for different distance metricsr   rK   r1   rB   	manhattanr   i,  Tr   )r   rx   rU   r2   r   r   r   )r   rx   rU   r2   r   r   N)r   rM   rN   r%   rO   r   r   zipr   r   r	   )
rU   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^  s0    
r  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   rK   r1   )r~   rU   )r   r  r  r   )r   rx   r   r   rU   r   r   )r   r   r   r   r   r   )r   r   r   rU   r  r  r   r'   ZX_precomputedr  r  r"   r"   r#   $test_tsne_different_square_distances{  s0    r	  c          	   C   s   t d}|dd}t| |ddd}| dkrZ|dk	rZtjtd	d
 || W d Q R X n(td }|| W d Q R X |rtd S )Nr   rC   r1   g      i@r   )r   r   r4   r   r  Tz'square_distances'.*)r   )r   rM   r   r   warnsFutureWarningr   r=   )r   r   rU   r   r   recordr"   r"   r#   (test_tsne_square_distances_futurewarning  s    r  r   r   c          	   C   s   t d}|dd}td| d}tf dd | D }| dkrftjtd	d
 || W dQ R X nV| dkrtjtdd
 || W dQ R X n(td}|| W dQ R X |rt	dS )z]Make sure that a FutureWarning is only raised when the
    init is not specified or is 'pca'.r   rC   r1   g      i@)r4   r   c             S   s   i | ]\}}|d k	r||qS )Nr"   )rG   re   vr"   r"   r#   
<dictcomp>  s    z0test_tsne_init_futurewarning.<locals>.<dictcomp>NzThe default initialization.*)r   r   zThe PCA initialization.*)
r   rM   dictr   itemsr   r
  r  r   r=   )r   rU   r   kwargsr   r  r"   r"   r#   test_tsne_init_futurewarning  s    r  r4   g      i@c          	   C   s   t d}|dd}t| dd}tf dd | D }| dkrftjtd	d
 || W dQ R X n(td}|| W dQ R X |rt	dS )zYMake sure that a FutureWarning is only raised when the learning rate
    is not specifiedr   rC   r1   r   )r4   r   c             S   s   i | ]\}}|d k	r||qS )Nr"   )rG   re   r  r"   r"   r#   r    s    z9test_tsne_learning_rate_futurewarning.<locals>.<dictcomp>NzThe default learning rate.*)r   )
r   rM   r  r   r  r   r
  r  r   r=   )r4   rU   r   r  r   r  r"   r"   r#   %test_tsne_learning_rate_futurewarning  s    r  c           	   C   sB   t d} | dd}tjtdd tdd| W dQ R X dS )	z=Make sure that negative learning rate results in a ValueErrorr   rC   r1   z'learning_rate' must be.*)r   g      I)r4   N)r   rM   r   r   r   r   r   )rU   r   r"   r"   r#    test_tsne_negative_learning_rate  s    r  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   r1   g      >@r   )rx   r   r]   r   Zn_jobsrU   N)r   rM   r   r   r   )r   rU   r~   r   ZX_tr_refZX_trr"   r"   r#   test_tsne_n_jobs  s(    r  )Fr   r   )N)wr8   ior   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   rm   r   ZmeshgridZxxyyZhstackro   rl   r   rA   rY   r^   rs   ru   r   r   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   rO   Zfloat64r   r   r   r   r   r   r   r   r   r   r  r  r	  r  r  r  r  r  r"   r"   r"   r#   <module>   s   V,

		
$

		
	""  


"
* -
'
4#

