U
    3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6e47 8d de57 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
jBCd1d2d3ge
jBCd4d5d6d7 ZDd8d9 ZEe
jBCd1d2d3gd:d; ZFd<d= ZGd>d? ZHe
jBCd@d2ejIfd3ejIfd3e	jJfge
jBCdAdBg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 ZYddhdiZZdjdk Z[dldm Z\dndo Z]e
jBCd1d3d2ge
jBCdpej^ej_gdqdr Z`e
jBCd1d3d2gdsdt Zadudv Zbedwdx Zcdydz Zdd{d| Zee
jBCd1d3d2gd}d~ ZfdddZgdd Zhdd Zie
jBCdde/fde0fge
jBCd1d3d2gdd Zje
jBCd1d2d3gdd Zkdd Zldd Zme
jBCdddd Zndd 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std|kst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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 5 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%   E/tmp/pip-unpacked-wheel-zrfo1fqw/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 qd 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
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_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 ҇&IimU-|3Sٵ?:ǁ$*r   r7   rV   r   g\$w?gRn		Qgz}g`>41f>6Sc>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st	d
|kst	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std S )Nr   r6   r7   gMb`?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\}}} qqtt|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
|| qd 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 )zCheck 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   Z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-
&
