
    -i              	       j	   S SK r S SKrS SKJr  S SKrS SKrS SKJr	  S SK
Jr  S SKJr  S SKJrJr  S SKJr  S SKJr  S SKJrJr  S S	KJrJrJrJrJrJr  S S
KJ r   S SK!J"r"J#r#J$r$  S SK%J&r&J'r'  S SK(J)r)  S SK*J+r+J,r,J-r-J.r.  S SK/J0r0J1r1  \Rd                  " S SS5      r3\Rh                  " \3\35      u  r5r6\Rn                  " \5Rq                  5       Rs                  SS5      \6Rq                  5       Rs                  SS5      /5      r:S r;S r<S r=S r>S r?S r@S rAS rB\R                  R                  SSS/5      \R                  R                  SS5      S  5       5       rES! rF\R                  R                  SSS/5      \R                  R                  S"\05      S# 5       5       rGS$ rHS% rI\R                  R                  S&S\R                  4S\R                  4/\0 V s/ s H  n SU 4PM	     sn Q5      \R                  R                  S'S(/S)//S*4S(S+/S)S(//S,4/5      S- 5       5       rK\R                  R                  S"\05      S. 5       rL\R                  R                  S"\05      S/ 5       rM\R                  R                  S05      \R                  R                  S1\0\1-   5      S2 5       5       rOS3 rPS4 rQS5 rRS6 rS\R                  R                  S"\05      S7 5       rTS8 rUS9 rVS: rW\R                  R                  S"\05      S; 5       rX\R                  R                  S"\05      S< 5       rY\R                  R                  S"\05      S= 5       rZ   SWS> jr[S? r\S@ r]SA r^\R                  R                  SSS/5      \R                  R                  SB\R                  \R                  /5      SC 5       5       ra\R                  R                  SSS/5      SD 5       rbSE rc\.SF 5       rdSG reSH rf\R                  R                  SSS/5      SI 5       rgSXSJ jrhSK riSL rj\R                  R                  SMSN\#4SO\"4/5      \R                  R                  SSS/5      SP 5       5       rk\R                  R                  SSS/5      SQ 5       rlSR rm\R                  R                  SSST5      SU 5       rnSV rogs  sn f )Y    N)StringIO)assert_allclose)
check_grad)pdist
squareform)config_context)
make_blobs)TSNE_barnes_hut_tsne)_gradient_descent_joint_probabilities_joint_probabilities_nn_kl_divergence_kl_divergence_bhtrustworthiness)_binary_search_perplexity)cosine_distancesmanhattan_distancespairwise_distances)NearestNeighborskneighbors_graph)check_random_state)assert_almost_equalassert_array_almost_equalassert_array_equalskip_if_32bit)CSR_CONTAINERSLIL_CONTAINERS   
   c                      " S S5      n SS jn[         R                  n[        5       [         l         [        U " 5       [        R
                  " S5      SSSSSSSS	S
9
u  p4n[         R                  R                  5       n[         R                  R                  5         U[         l        US:X  d   eUS:X  d   eSU;   d   e[         R                  n[        5       [         l         [        U[        R
                  " S5      SSSSSSSS	S
9
u  p4n[         R                  R                  5       n[         R                  R                  5         U[         l        US:X  d   eUS:X  d   eSU;   d   e[         R                  n[        5       [         l         [        U " 5       [        R
                  " S5      SSSSSSSS	S
9
u  p4n[         R                  R                  5       n[         R                  R                  5         U[         l        US:X  d   eUS:X  d   eSU;   d   eg ! [         R                  R                  5       n[         R                  R                  5         U[         l        f = f! [         R                  R                  5       n[         R                  R                  5         U[         l        f = f! [         R                  R                  5       n[         R                  R                  5         U[         l        f = f)Nc                   $    \ rS rSrS rSS jrSrg);test_gradient_descent_stops.<locals>.ObjectiveSmallGradient8   c                     SU l         g Nr!   it)selfs    T/var/www/html/venv/lib/python3.13/site-packages/sklearn/manifold/tests/test_t_sne.py__init__Dtest_gradient_descent_stops.<locals>.ObjectiveSmallGradient.__init__9   s	    DG    c                 ~    U =R                   S-  sl         SU R                   -
  S-  [        R                  " S/5      4$ )Nr   r          $@h㈵>)r)   nparray)r*   _compute_errors      r+   __call__Dtest_gradient_descent_stops.<locals>.ObjectiveSmallGradient.__call__<   s2    GGqLGLD("((D6*:::r.   r(   NT)__name__
__module____qualname____firstlineno__r,   r6   __static_attributes__ r.   r+   ObjectiveSmallGradientr$   8   s    		;r.   r?   c                 2    S[         R                  " S5      4$ )N        r   )r2   ones)r4   r5   s     r+   flat_function2test_gradient_descent_stops.<locals>.flat_function@   s    BGGAJr.   r   r   d   rA   r1      )max_itern_iter_without_progressmomentumlearning_ratemin_gainmin_grad_normverbose      ?gradient normr       zdid not make any progresszIteration 10r8   )sysstdoutr   r   r2   zerosgetvalueclose)r?   rC   
old_stdoutr4   errorr)   outs          r+   test_gradient_descent_stopsrY   6   st   ; ; JCJ ("$HHQK$'
" jj!!#


C<<7N7c!!! JCJ (HHQK$&
" jj!!#


C<<8O8&#--- JCJ ("$HHQK$'
" jj!!#


C<<8O8S   k jj!!#


, jj!!#


, jj!!#


s&   .H %)I+ .J7 A	I(+A	J47A	L c                  L   [        S5      n U R                  SS5      n[        U5      R                  [        R
                  5      nSn[        X#SS9n[        R                  " U[        R                  " [        R                  5      R                  5      n[        R                  " [        UR                  S   5       Vs/ s HI  n[        R                  " [        R                  " XE   [        R                   " XE   5      -  5      * 5      PMK     sn5      n[#        XcSS9  g s  snf )Nr   2            9@rM      decimal)r   randnr   astyper2   float32r   maximumfinfodoubleepsmeanrangeshapeexpsumlogr   )random_statedata	distancesdesired_perplexityPimean_perplexitys          r+   test_binary_searchrv      s    %a(Lb!$D"4(//

;I!)KA


1bhhryy)--.Agg7<QWWQZ7HI7H!rvvad|+,,	-7HIO QG 	Js   ?AD!c            
      (   [        S5      n U R                  SS5      R                  [        R                  5      S-   nSn[        XSS9nS[        R                  " USSS 24   [        R                  " USSS 24   5      -  5      * -  n[        XBS	S
9  g )N*   r   Z   rE   g      >@r   r^   rF   r_   r`   )	r   rb   rc   r2   rd   r   nansumlog2r   )ro   rp   rr   rs   
perplexitys        r+   test_binary_search_underflowr}      s     &b)La$++BJJ7#=D!$AFAryy1ab5BGGAaeH,=!=>>>J
Br.   c                     Sn Sn[        S5      nUR                  U S5      R                  [        R                  SS9n[        U5      n[        XASS9nU S-
  n[        5       R                  U5      nUR                  US	S
9nUR                  R                  [        R                  SS9n	U	R                  X5      n	[        XSS9n
UR                  n[        R                  " [        U 5       Vs/ s H  nX\UR                  X   XS-       4   PM     sn5      n[!        XSS9  [        R"                  " SU S-
  S5       H  n[%        U5      nUS-  nUR                  US	S
9nUR                  R                  [        R                  SS9n	U	R                  X5      n	[        XSS9n[!        XSS9  [        R&                  " UR)                  5       5      S S S2   nUR)                  5       U   S U n[        R&                  " UR)                  5       5      S S S2   nUR)                  5       U   S U n[!        UUSS9  M     g s  snf )N   r]   r   rF   Fcopyr^   r   distancen_neighborsmode   r`      r\   r    r!   )r   rb   rc   r2   rd   r   r   r   fitr   rp   reshapeindptrr3   rj   indicesr   linspaceintargsortravel)	n_samplesrr   ro   rp   rq   P1r   nndistance_graphdistances_nnP2r   kP1_nntopnP2kidxP1topP2tops                      r+   test_binary_search_neighborsr      s)    I%a(Li+222::E2JD"4(I	"9!	LB a-K					%B(([z(RN!&&--bjju-EL''	?L	"<Q	OB""FHH 9%	
% .((VE]CCD%	
E e3 [[i!mQ/F2v,,,L%**11"**51I#++I9'RST!%Q7jj$TrT*
3&jj%dd+		C $'!%: 0	
s   -$H=c                     Sn Sn[        S5      nUR                  US5      n[        5       R                  U5      nUR	                  U SS9nUR
                  R                  [        R                  SS9nUR                  X5      nS nS	n[        S5       HT  n	[        UR                  5       USS
9n
[        XXSS
9nUR                  5       nUc  U
nUnM?  [        XSS9  [        UWSS9  MV     g )Nr    rE   r   r\   r   r   Fr   r_   r^   r   r`   )r   rb   r   r   r   rp   rc   r2   rd   r   rj   r   r   r   toarrayr   )r   r   ro   rp   r   r   rq   last_Prr   r4   rs   r   last_P1s                r+    test_binary_perplexity_stabilityr      s     KI%a(Li+D					%B(([z(RN##**2::E*BI!!)9IF3Z%inn&68JTUV$^QRSZZ\>FG%a;%b'1= r.   c                    ^^^^	 [        S5      n Sm	SnSmSmU R                  T	U5      R                  [        R                  5      n[        R
                  " UR                  UR                  5      5      n[        R                  " US5        U R                  T	T5      R                  [        R                  5      n[        USSS9mUUUU	4S jnUUUU	4S	 jn[        [        XEUR                  5       5      SS
S9  g )Nr   r[   rF   rN   rA   r]   )rr   rM   c                 (   > [        U TTTT5      S   $ )Nr   r   paramsrs   alphan_componentsr   s    r+   funtest_gradient.<locals>.fun       fa	<HKKr.   c                 (   > [        U TTTT5      S   $ )Nr   r   r   s    r+   gradtest_gradient.<locals>.grad   r   r.   r\   r`   )r   rb   rc   r2   rd   absdotTfill_diagonalr   r   r   r   )
ro   
n_featuresrq   
X_embeddedr   r   rs   r   r   r   s
         @@@@r+   test_gradientr      s    %a(LIJLE""9j9@@LIy}}Y[[12IY$##I|<CCBJJOJY4KAL LL L 
3j.>.>.@A3PQRr.   c                     [        S5      n U R                  SS5      n[        USUS-  -   5      S:X  d   e[        R                  " S5      R                  SS5      nUR                  5       nU R                  U5        [        X5      S	:  d   e[        R                  " S
5      R                  SS5      n[        R                  " S/S/S/S/S//5      n[        [        XSS9S5        g )Nr   rE   rF         @r0   rN   r!   r   g333333?r\   r   r_   r   g?)
r   rb   r   r2   aranger   r   shuffler3   r   )ro   Xr   s      r+   test_trustworthinessr     s    %a(L 	3"A1cAHn-444 			#r1%AJ$1)C/// 			!R#AA3aS1#s34J1EsKr.   c                  @   Sn [         R                  R                  S5      nUR                  SS5      nUR                  SS5      n[        R
                  " [        U S9   [        X#SS9  S	S	S	5        [        X#S
S9nSUs=::  a  S::  d   e   eg	! , (       d  f       N+= f)zSRaise an error when n_neighbors >= n_samples / 2.

Non-regression test for #18567.
z%n_neighbors .+ should be less than .+rx      r   rF   matchr\   r   Nr_   r   r   )r2   randomRandomStaterandpytestraises
ValueErrorr   )regexrngr   r   trusts        r+   &test_trustworthiness_n_neighbors_errorr     s    
 4E
))


#CAA!QJ	z	/15 
0 Aq9E????	 
0	/s   B
Bmethodexact
barnes_hutinit)r   pcac           	          [        S5      nSnUR                  SU5      R                  [        R                  5      n[        UUSU SSS9nUR                  U5      n[        XFSS9nUS	:  d   eg )
Nr   rF   r[   i  auto)r   r   ro   r   rG   rJ   r   r   g333333?)r   rb   rc   r2   rd   r
   fit_transformr   )r   r   ro   r   r   tsner   ts           r+   +test_preserve_trustworthiness_approximatelyr   *  sy     &a(LL2|,33BJJ?A!D ##A&J15At8O8r.   c            
          [        S5      n [        SU S9u  p/ nS H=  n[        SSSSUSS	9nUR                  U5        UR	                  UR
                  5        M?     US
   US   ::  d   eUS   US
   ::  d   eg)z=t-SNE should give a lower KL divergence with more iterations.r   r_   )r   ro   )   ,  i^  rF   r   r          Y@)r   r   r|   rJ   rG   ro   r   N)r   r	   r
   r   appendkl_divergence_)ro   r   r4   kl_divergencesrG   r   s         r+   )test_optimization_minimizes_kl_divergencer   >  s    %a(L>DAN#
 	1d112 $ !q 1111!q 1111r.   csr_containerc           
         [        S5      nUR                  SS5      nSX2R                  SSS5      UR                  SSS5      4'   U" U5      n[        SSSSSU S	S
9nUR	                  U5      n[        [        XFSS9SSS9  g )Nr   r[   rF   rA      r   r    r   i  )r   r   r|   rJ   ro   r   rG   r   r   rN   g)\(?rtol)r   rb   randintr
   r   r   r   )r   r   r   r   X_csrr   r   s          r+   test_fit_transform_csr_matrixr   R  s     Q
C		"aA9<A{{1b"s{{1a456!ED ##E*JOE1EsQWXr.   c                      [        S5      n [        S5       H_  nU R                  SS5      n[        [	        U5      S5      n[        SSSSSUSS	S
S9	nUR                  U5      n[        X5SSS9nUS:  a  M_   e   g )Nr   r_   P   rF   sqeuclideanr          @precomputed  r   )	r   r|   rJ   early_exaggerationmetricro   rM   rG   r   r   )r   r   gffffff?)r   rj   rb   r   r   r
   r   r   )ro   rt   r   Dr   r   r   s          r+   Ftest_preserve_trustworthiness_approximately_with_precomputed_distancesr   i  s    %a(L1Xr1%uQx/" 

 ''*
AqO4xx! r.   c                      [        S5      n U R                  SS5      n[        XSS9[        [        USS9USS9:X  d   eg )Nr   rE   rF   cosiner   r   )r   rb   r   r   )ro   r   s     r+   )test_trustworthiness_not_euclidean_metricr     sN     &a(L3"A11_1X.-6   r.   zmethod, retypezD, message_regexrA   rN   z.* square distance matrixg      z.* positive.*c                     [        SU SSSS9n[        R                  " [        US9   UR	                  U" U5      5        S S S 5        g ! , (       d  f       g = f)Nr   r   rx   r   r   r   r   ro   r|   r   )r
   r   r   r   r   )r   r   retypemessage_regexr   s        r+   test_bad_precomputed_distancesr     sK      D 
z	76!9% 
8	7	7s   A
Ac                     [        SSSSSS9n[        R                  " [        SS9   UR	                  U " S	S
/S
S	//5      5        S S S 5        g ! , (       d  f       g = f)Nr   r   r   rx   r   r   sparser   r   r\   r
   r   r   	TypeErrorr   r   r   s     r+    test_exact_no_precomputed_sparser     sW    D 
y	1=1a&1a&)9:; 
2	1	1s   A
Ac                     [         R                  " / SQ/ SQ/ SQ/5      nU " U5      n[        SSSSS9nSn[        R                  " [
        US	9   UR                  U5        S S S 5        g ! , (       d  f       g = f)
N)rN   rA   rA   )rA   rN   rA   r   r   rx   r   )r   r   ro   r|   zB3 neighbors per samples are required, but some samples have only 1r   )r2   r3   r
   r   r   r   r   )r   distbad_distr   msgs        r+   1test_high_perplexity_precomputed_sparse_distancesr    sa     88_oGHDT"H}8"QRSD
NC	z	-8$ 
.	-	-s   A**
A8zaignore:Precomputed sparse input was not sorted by row values:sklearn.exceptions.EfficiencyWarningsparse_containerc                 X   [        S5      nUR                  SS5      n[        USSSS9n[        U5      n[        R
                  " U5      (       d   e[        UR                  5       U5        [        SSSS	S
9nUR                  U5      nUR                  U " U5      5      n[        Xg5        g)zAMake sure that TSNE works identically for sparse and dense matrixr   rE   rF   r   T)r   r   include_selfr   r   r   )r   ro   r   rJ   N)
r   rb   r   r   spissparser   r   r
   r   )r  ro   r   D_sparser   r   Xt_dense	Xt_sparses           r+    test_sparse_precomputed_distancer    s     &a(L3"AsRVWH1A;;x    ((*A.186D !!!$H""#3H#=>I,r.   c                      S n [        U SSS9n[        R                  " SS/SS//5      n[        R                  " [
        SS9   UR                  U5        S S S 5        g ! , (       d  f       g = f)	Nc                     gr'   r>   )xys     r+   r   4test_non_positive_computed_distances.<locals>.metric  s    r.   r   r   )r   r   r|   rA   rN   zAll distances .*metric given.*r   )r
   r2   r3   r   r   r   r   )r   r   r   s      r+   $test_non_positive_computed_distancesr    s\     vg!<D
3*sCj)*A	z)I	J1 
K	J	Js   A
A-c                      [        [        R                  " S5      SS9n U R                  [        R                  " S5      5      n[        [        R                  " S5      U5        g )NrE   rF   r   )r   rJ   )rE   r\   )r
   r2   rS   r   rB   r   )r   r   s     r+   test_init_ndarrayr    sC    RXXh'v>D##BGGH$56Jrxx):6r.   c                      [        [        R                  " S5      SSS9n U R                  [        R                  " S5      5        g )Nr  r   g      I@)r   r   rJ   )rE   rE   )r
   r2   rS   r   r   s    r+   test_init_ndarray_precomputedr    s7     XXhD
 	HHRXXj!"r.   c                      [        SSSS9n [        R                  " [        SS9   U R	                  [
        R                  " S/S//5      5        S S S 5        g ! , (       d  f       g = f)	Nr   r   r   )r   r   r|   zBThe parameter init="pca" cannot be used with metric="precomputed".r   rA   rN   r
   r   r   r   r   r2   r3   r  s    r+   >test_pca_initialization_not_compatible_with_precomputed_kernelr    sS    }5Q?D	R
 	288cUSEN34	
 
 
   *A
A&c                     [        SSSS9n[        R                  " [        SS9   UR	                  U " SS/SS//5      5        S S S 5        g ! , (       d  f       g = f)	Nr   r   r   )r   rJ   r|   zPCA initialization.*r   r   r\   r   r   s     r+   8test_pca_initialization_not_compatible_with_sparse_inputr    sN     U%A>D	y(>	?=1a&1a&)9:; 
@	?	?s   A
Ac                      [        SSSS9n [        R                  " [        SS9   U R	                  [
        R                  " S/S//5      5        S S S 5        g ! , (       d  f       g = f)	Nr   r   r   )r   r   r|   z'n_components' should be .*r   rA   rN   r  r  s    r+   test_n_components_ranger!    sK    Q|BD	z)F	G288cUSEN34 
H	G	Gr  c                  T   [        S5      n SnSS/nU R                  SU5      R                  [        R                  5      nU Hb  n[        USSSSUS	S
S9nUR                  U5      n[        USSSSUSS
S9nUR                  U5      n[        R                  " Xg5      (       d  Mb   e   g )Nr   rF   r   r   r   r   r   r   rN   r   r   r|   rJ   r   ro   r   r   rG   r0   )r   rb   rc   r2   rd   r
   r   allclose)ro   r   methodsr   r   r   X_embedded1X_embedded2s           r+   test_early_exaggeration_usedr(    s    %a(LL%G2|,33BJJ?A%"	
 ((+%#	
 ((+;;{88881 r.   c                     [        S5      n SnSS/nU R                  SU5      R                  [        R                  5      nU HB  nS H9  n[        USSS	SUS
US9nUR                  U5        UR                  US-
  :X  a  M9   e   MD     g )Nr   rF   r   r   r   )   r   r         ?r   rN   r#  )r   rb   rc   r2   rd   r
   r   n_iter_)ro   r   r%  r   r   rG   r   s          r+   test_max_iter_usedr-  ,  s    %a(LL%G2|,33BJJ?A"H)!#&!	D q!<<8a</// # r.   c                     [         R                  " SS/SS//5      n[         R                  " SS/SS//5      n[         R                  " S/S//5      n[         R                  " S	S
/SS//5      n[        XX4U 5        g )NrN   rA   gbv
gCrgJ!zE?g)x>1?r   r   gKXAgr}gKXA>gr}?r2   r3   _run_answer_testr   	pos_input
pos_output	neighborsgrad_outputs        r+   test_answer_gradient_two_pointsr6  C  s     3*sCj12I
	',)EFJ 1#s$I((
?	+nn-MNK YIMRr.   c                 .   [         R                  " SS/SS/SS/SS//5      n[         R                  " SS/S	S
/SS/SS//5      n[         R                  " / SQ/ SQ/ SQ/ SQ/5      n[         R                  " SS/SS/SS/SS//5      n[        XX4U 5        g )NrN   rA   r   r   333333@皙@$1?m5a ҇&IimU-|3Sٵ?:ǁ$*r   rF   r_   r   rF   r_   r   r   r_   r   rF   r   g\$w?gRn		Qgz}g`>41f>6Sc>gU9&#*@>r/  r1  s        r+    test_answer_gradient_four_pointsrJ  T  s     3*sCj3*sCjIJI=)M*L)M*		
J )Y	9EFI((_-n-_-n-		
K YIMRr.   c           
      4   [         R                  " SS/SS/SS/SS//5      n[         R                  " SS/S	S
/SS/SS//5      n[         R                  " / SQ/ SQ/ SQ/ SQ/5      n[         R                  " SS/SS/SS/SS//5      n[        XX4U SSS5        g )NrN   rA   r   r   r8  r9  r:  r;  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  rH  rI  F皙?rF   r/  r1  s        r+   test_skip_num_points_gradientrM  o  s     3*sCj3*sCjIJI=)M*L)M*		
J )Y	9EFI((#J#J_-n-		
K y}eSRSr.   c                    [        U 5      R                  [        R                  5      nXU4n	UR                  [        R                  5      nUR                  [        R                  SS9n[        U	6 n
[        U
5      R                  [        R                  5      n
[        R                  " UR                  [        R                  S9nU" U
5      nUR                  R                  [        R                  5      nUR                  R                  [        R                  5      n[        R                  " UR                  XXSSSSS9	  [        XS	S
9  g )NFr   )dtyper+  rF   r   r   )skip_num_pointsr   r`   )r   rc   r2   rd   int64r   r   rS   rk   r   r   r   gradientrp   r   )r2  r3  r4  r5  r   rM   r|   rP  rq   args	pij_inputgrad_bhrs   r   s                 r+   r0  r0    s     #9-44RZZ@I')D""2::.J   6I$d+I9%,,RZZ8Ihhz''rzz:Gi A		  *IXX__RXX&F	
vQST gA>r.   c                  2   [        S5      n [        SSS9nU R                  SS5      n[        R                  n[        5       [        l         UR                  U5        [        R                  R                  5       n[        R                  R                  5         U[        l        SU;   d   eSU;   d   eSU;   d   eS	U;   d   eS
U;   d   eg ! [        R                  R                  5       n[        R                  R                  5         U[        l        f = f)Nr   rF   r   )rM   r|   r\   z[t-SNE]znearest neighbors...z"Computed conditional probabilitiesz
Mean sigmazearly exaggeration)	r   r
   rb   rQ   rR   r   r   rT   rU   )ro   r   r   rV   rX   s        r+   test_verboserW    s    %a(La(D1a AJCJ 1jj!!#


!S(((/366633&&& jj!!#


s   C A	Dc                  t    [        S5      n [        SSS9nU R                  SS5      nUR                  U5        g )Nr   	chebyshevr   )r   r|   r\   rF   )r   r
   rb   r   )ro   r   r   s      r+   test_chebyshev_metricrZ    s8    %a(L{q1D1a Aqr.   c                      [        S5      n [        SSS9nU R                  SS5      nUR                  U5      R                  n[
        R                  " [
        R                  " U5      5      (       d   eg )Nr   r   r   )r   r|   r\   rF   )r   r
   rb   r   
embedding_r2   allisfinite)ro   r   r   r   s       r+   test_reduction_to_one_componentr_    s[    %a(LQ1-D1a A!''J66"++j)****r.   dtc                     [        S5      nUR                  SS5      R                  USS9n[        SSSSU SSSS	9nUR	                  U5      nUR
                  nU[        R                  :X  d   eg )
Nr   r    rF   Fr   r   r   r   r   r|   rJ   ro   r   rM   rG   r   )r   rb   rc   r
   r   rO  r2   rd   )r   r`  ro   r   r   r   effective_types          r+   
test_64bitrd    s     &a(L2q!((%(8A	D ##A&J%%N RZZ'''r.   c                     [        S5      nUR                  SS5      n[        SSSSU SSSS9nUR                  U5        [        R
                  " UR                  5      (       a   eg )Nr   r[   rF   r   i  r   rb  )r   rb   r
   r   r2   isnanr   )r   ro   r   r   s       r+   test_kl_divergence_not_nanrg    sp     &a(L2q!A	D 	qxx++,,,,,r.   c                     Sn SnSnS H  nSn[        US-
  5      n[        S5      nUR                  X$5      n[        U5      nUR                  X#5      n	[	        XSS9n
[        XXRU5      u  pUS	-
  n[        5       R                  U5      R                  US
S9n[        XSS9n[        U	UUUUU SSS9u  nn[        U
5      n
UR                  5       n[        XSS9  [        UUSS9  M     g )NrA   r    rE   )rF   r_   r\   rN   r   r^   r   r   r   )anglerP  rM   r`   r_   )floatr   rb   r   r   r   r   r   r   r   r   r   r   r   r   )ri  r|   r   r   r   degrees_of_freedomro   rp   rq   r   rs   kl_exact
grad_exactr   distances_csrP_bhkl_bhrU  s                     r+   test_barnes_hut_anglerq    s   EJI
"<##56)!,!!)8&t,	##I< B-)l 
  !mSY+JG 	
 '}!L*	
w qM||~!$15HeQ7E r.   c                  *   [        S5      n U R                  SS5      nS H  n[        SSSSUSS	S
9nSUl        SUl        [
        R                  n[        5       [
        l         UR                  U5        [
        R                  R                  5       n[
        R                  R                  5         U[
        l        SU;   a  M   e   g ! [
        R                  R                  5       n[
        R                  R                  5         U[
        l        f = f)Nr   rE   r    )r   r   r!   rF   g    חAi_  r   )rH   rM   rJ   ro   r   rG   r   r   z@did not make any progress during the last -1 episodes. Finished.)r   rb   r
   _N_ITER_CHECK_EXPLORATION_MAX_ITERrQ   rR   r   r   rT   rU   )ro   r   r   r   rV   rX   s         r+   test_n_iter_without_progressru  ,  s     &a(L3#A)$&
 %&"ZZ
Z
	$q!**%%'CJJ#CJ RUXXXX/ *$ **%%'CJJ#CJs   $C		A	Dc                  D   [        S5      n U R                  SS5      nSn[        USSSS9n[        R                  n[        5       [        l         UR                  U5        [        R                  R                  5       n[        R                  R                  5         U[        l        UR                  S5      n/ nU Hf  nSU;   a    O_UR                  S	5      n	U	S:  d  M$  XS  nUR                  S
S5      R                  S5      S   nUR                  [        U5      5        Mh     [        R                  " U5      n[!        XwU:*     5      n
U
S::  d   eg ! [        R                  R                  5       n[        R                  R                  5         U[        l        f = f)Nr   rE   rF   gMb`?r   )rL   rM   ro   r   
FinishedrO   zgradient norm =   r   )r   rb   r
   rQ   rR   r   r   rT   rU   splitfindreplacer   rj  r2   r3   len)ro   r   rL   r   rV   rX   	lines_outgradient_norm_valueslinestart_grad_normn_smaller_gradient_normss              r+   test_min_grad_normr  K  sf   %a(L3"AMmQQwWDJCJ 1jj!!#


		$I  ))O4a()D<< 2B7==cB1ED ''d4  88$89"]BC  $q(((9 jj!!#


s   E A	Fc                     [        S5      n U R                  SS5      n[        SSSSSS9n[        R                  n[        5       [        l         UR                  U5        [        R                  R                  5       n[        R                  R                  5         U[        l        UR                  S5      S S S2    H=  nS	U;   d  M  UR                  S
5      u    pgU(       d  M(  UR                  S5      u  n  n  O   [        UR                  [        W5      SS9  g ! [        R                  R                  5       n[        R                  R                  5         U[        l        f = f)Nr   r[   rF   r   r   )rH   rM   ro   r   rG   rw  r!   	Iterationzerror = ,r\   r`   )r   rb   r
   rQ   rR   r   r   rT   rU   r{  	partitionr   r   rj  )ro   r   r   rV   rX   r  r4   rW   s           r+   test_accessible_kl_divergencer  v  s   %a(L2q!A !D JCJ 1jj!!#


 		$"%$..4KAqu#ooc2q! & ++U5\1E jj!!#


s   D A	E'c                 *   [        S5      nSnU HD  n[        SSUSUU SS9nUR                  [        5      nSR	                  X5      n [        XV5        MF     g
! [         a/    US	-  nXTl        UR                  [        5      n[        XV5         M  f = f)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.
r_   r   rF   r   r[   r   )r   r   ro   r|   rG   r   rJ   z{}_{}z:rerunN)rj   r
   r   	X_2d_gridformatassert_uniform_gridAssertionErrorr   )r   seedsrG   seedr   Ytry_names          r+   test_uniform_gridr    s     !HEH 
 y)>>&/		-,   	-  HI""9-A,	-s   	A5BBc                 p   [        SS9R                  U 5      nUR                  SS9S   R                  5       nUR	                  5       S:  d   eUR	                  5       [
        R                  " U5      -  nUR                  5       [
        R                  " U5      -  nUS:  d   U5       eUS:  d   U5       eg )	Nr   r   T)return_distancer   rL  r+  rF   )r   r   
kneighborsr   minr2   ri   max)r  r  r   
dist_to_nnsmallest_to_meanlargest_to_means         r+   r  r    s     
a	(	,	,Q	/Bt4Q7==?J>>c!!!!~~'"''**== nn&)<<Oc!+8+!Q((r.   c                  D   [        S5      n SnU R                  SU5      R                  [        R                  5      n0 n0 nS H;  n[        SUSSSSS	SS
9nSUl        UR                  U5      X5'   UR                  XE'   M=     US   US   :X  d   e[        US   US   SS9  g )Nr   r       )r   r   rF   rN   r   r*  g     =@)r   r   rJ   r   ro   rG   r|   ri  r   r   g-C6?r   )
r   rb   rc   r2   rd   r
   rt  r   r,  r   )ro   r   r   X_embeddedsrG   r   r   s          r+   test_bh_match_exactr    s     &a(LJ2z*11"**=AKH)	
 &'""003<< *  G 6666K(+l*C$Or.   c                     Sn SnSnSnSnSn[        S5      nUR                  X5      R                  [        R                  5      nUR                  X5      nUS-
  n	[        5       R                  U5      R                  U	SS	9n
[        XSS
9n[        UUUUUUSSSS9	u  pS H-  n[        UUUUUUSSUS9	u  nn[        XSS9  [        UU5        M/     g )Nr    r  rF   r   r_   r\   r   r   r   r^   )ri  rP  rM   num_threads)rF   r   gư>r   )r   rb   rc   r2   rd   r   r   r   r   r   r   )r   r   r   rk  ri  r|   ro   rp   r   r   rn  ro  kl_sequentialgrad_sequentialr  kl_multithreadgrad_multithreads                    r+   -test_gradient_bh_multithread_match_sequentialr    s    JILEJ%a(Li4;;BJJGD	8Fa-K	T		k
		C 
 #=aHD%6
&"M +<#
,
(( 	DA(*:; r.   zmetric, dist_func	manhattanr   c           
      ^   US:X  a  U S:X  a  [         R                  " S5        [        S5      nSnSnUR                  SU5      R	                  [
        R                  5      n[        U UUSSS	S
S9R                  U5      n[        SUUSSS	S
S9R                  U" U5      5      n[        Xx5        g)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   r_   rF   r[   r   r   r   )r   r   r   ro   rG   r   rJ   r   N)
r   xfailr   rb   rc   r2   rd   r
   r   r   )	r   	dist_funcr   ro   n_components_originaln_components_embeddingr   X_transformed_tsneX_transformed_tsne_precomputeds	            r+   )test_tsne_with_different_distance_metricsr    s     &K"7 	5	

 &a(L245<<RZZHA+ mA  &*+& mIaL! # )Jr.   c                     [        S5      nSnUR                  SU5      n[        SU SSSSSSS	9R                  U5      n[        SU SSSSSSS	9R                  U5      n[	        XE5        g
)z=Make sure that the n_jobs parameter doesn't impact the outputr   r    r  rF   r]   r   r   r   )r   r   r|   ri  n_jobsro   r   rJ   N)r   rb   r
   r   r   )r   ro   r   r   X_tr_refX_trs         r+   test_tsne_n_jobsr  N  s     &a(LJ2z*A	 mA  	 mA 	 H#r.   c                     [        S5      n Su  pU R                  X5      nSSSSSSS.n[        SS	S
0UD6nSn[        R                  " [
        US9   UR                  U5        SSS5        [        [        US
S9SS9n[        SS	S0UD6R                  U5      n[        SS
S[        R                  " UR                  5      0S.UD6R                  U5      n	[        X5        g! , (       d  f       N= f)zAMake sure that method_parameters works with mahalanobis distance.r   )r   r    (   r   r   r   r_   )r|   rG   rJ   r   r   ro   r   mahalanobisz4Must provide either V or VI for Mahalanobis distancer   Nr   T)checksr   V)r   metric_paramsr>   )r   rb   r
   r   r   r   r   r   r   r2   covr   r   )
ro   r   r   r   default_paramsr   r  precomputed_XX_trans_expectedX_transs
             r+   #test_tsne_with_mahalanobis_distancer  l  s    %a(L#I91AN 7}77D
@C	z	-1 
. uQ}=dKMC=CNCQQ  S"&&+,>BPmA  G. 
.	-s   C##
C1r|   )   r  c                    [        S5      nUR                  SS5      n[        SSU US9n[        R                  " SU  S35      n[
        R                  " [        US	9   UR                  U5        S
S
S
5        g
! , (       d  f       g
= f)z=Make sure that perplexity > n_samples results in a ValueErrorr   r  rF   r   r   )rJ   r   r|   ro   zperplexity (z") must be less than n_samples (20)r   N)	r   rb   r
   reescaper   r   r   r   )r|   ro   r   estr  s        r+   test_tsne_perplexity_validationr    sx     &a(L2q!A
!	C ))l:,.PQ
RC	z	-! 
.	-	-s   A88
Bc                      [         R                  " S5        [        SS9   [        R                  " S5      R                  SS5      n [        SS9R                  U 5        SSS5        g! , (       d  f       g= f)	zaMake sure that TSNE works when the output is set to "pandas".

Non-regression test for gh-25365.
pandas)transform_output   #   r   rF   )r   N)r   importorskipr   r2   r   r   r
   r   )arrs    r+   "test_tsne_works_with_pandas_outputr    sT    
 !		2ii''A.!**3/ 
3	2	2s   ?A((
A6)FrL  r   )N)pr  rQ   ior   numpyr2   r   scipy.sparser   r  numpy.testingr   scipy.optimizer   scipy.spatial.distancer   r   sklearnr   sklearn.datasetsr	   sklearn.manifoldr
   r   sklearn.manifold._t_sner   r   r   r   r   r   sklearn.manifold._utilsr   sklearn.metrics.pairwiser   r   r   sklearn.neighborsr   r   sklearn.utilsr   sklearn.utils._testingr   r   r   r   sklearn.utils.fixesr   r   r   r  meshgridxxyyhstackr   r   r  rY   rv   r}   r   r   r   r   r   markparametrizer   r   r   r   r   asarrayr   r   r  filterwarningsr  r  r  r  r  r  r!  r(  r-  r6  rJ  rM  r0  rW  rZ  r_  rd   float64rd  rg  rq  ru  r  r  r  r  r  r  r  r  r  r  r  )r   s   0r+   <module>r     s=   	 
     ) % 4 " '  > 
 A ,  ?KK1b	Q	BII

2q!

2q!	S!lH	C);X>6S2L(  G\#:;!23 4 <$2( G\#:;.9Y : <Y*, 	"**	rzz" >L	L^M<
'^	L %#45+Sz	"O4	&	& .9	< :	< .9% :% 6 +^n-LM- N	
-&	7#5 .9< :<59B0. .9S :S  .9S :S4 .9 :J ?:',+ L'#:;

BJJ78( 9 <(. L'#:;- <-*'8T Y Y<()VF@ L'#:;$- <$-N)P80<f &'(4D)EF L'#:;*K <	
*KZ G\#:;$ <$:/< x0 1 0[ 
Ms   R0