
    /Цii              	       	   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S"S#/5      \R                  R                  S$\05      S% 5       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      S0 5       rL\R                  R                  S$\05      S1 5       rM\R                  R                  S25      \R                  R                  S3\0\1-   5      S4 5       5       rOS5 rPS6 rQS7 rRS8 rSS9 rTS: rUS; rV\R                  R                  S$\05      S< 5       rW\R                  R                  S$\05      S= 5       rX\R                  R                  S$\05      S> 5       rY   SXS? jrZ\R                  R                  S@ 5       r\SA r]SB r^\R                  R                  SSS/5      \R                  R                  SC\R                  \R                  /5      SD 5       5       ra\R                  R                  SSS/5      SE 5       rbSF rc\.SG 5       rdSH reSI rf\R                  R                  SSS/5      SJ 5       rgSYSK jrhSL riSM rj\R                  R                  SNSO\#4SP\"4/5      \R                  R                  SSS/5      SQ 5       5       rk\R                  R                  SSS/5      SR 5       rlSS rm\R                  R                  STSU5      SV 5       rnSW rogs  sn f )Z    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                 L    " S S5      nSS jn[        U" 5       [        R                  " S5      SSSSSSSS	S
9
u  p4nUS:X  d   eUS:X  d   eSU R                  5       R                  ;   d   e[        U[        R                  " S5      SSSSSSSS	S
9
u  p4nUS:X  d   eUS:X  d   eSU R                  5       R                  ;   d   e[        U" 5       [        R                  " S5      SSSSSSSS	S
9
u  p4nUS:X  d   eUS:X  d   eSU R                  5       R                  ;   d   eg )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    `/var/www/html/ai-image-ml/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   )r   r2   zeros
readouterrout)capsysr?   rC   r4   errorr)   s         r+   test_gradient_descent_stopsrV   6   s[   ; ; % 
	 #LAb C<<7N7f//155555 %
	 "LAb C<<8O8&&*;*;*=*A*AAAA % 
	 #LAb C<<8O8V..044444r.   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_searchrs   w   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   r_   r`   r2   ra   r   nansumlog2r   )rl   rm   ro   rp   
perplexitys        r+   test_binary_search_underflowrz      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   rZ   r   rF   Fcopyr[   r   distancen_neighborsmode   r]      rY   r    r!   )r   r_   r`   r2   ra   r   r   r   fitr   rm   reshapeindptrr3   rg   indicesr   linspaceintargsortravel)	n_samplesro   rl   rm   rn   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   rY   r   r   Fr}   r\   r[   r   r]   )r   r_   r   r   r   rm   r`   r2   ra   r   rg   r   r~   r   toarrayr   )r   r   rl   rm   r   r   rn   last_Pro   r4   rp   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   rX   rF   rN   rA   rZ   )ro   rM   c                 (   > [        U TTTT5      S   $ )Nr   r   paramsrp   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.   rY   r]   )r   r_   r`   r2   ra   absdotTfill_diagonalr   r   r   r   )
rl   
n_featuresrn   
X_embeddedr   r   rp   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?rY   r   r\   r   g?)
r   r_   r   r2   aranger   r~   shuffler3   r   )rl   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 .+ru      r   rF   matchrY   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   rX   i  auto)r   r   rl   r   rG   rJ   r   r   g333333?)r   r_   r`   r2   ra   r
   fit_transformr   )r   r   rl   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   rl   )   ,  i^  rF   r   r          Y@)r   r   ry   rJ   rG   rl   r   N)r   r	   r
   r   appendkl_divergence_)rl   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.   r   r   csr_containerc           
         [        S5      nUR                  SS5      nSXCR                  SSS5      UR                  SSS5      4'   U" U5      n[        SUSSSU S	S
9nUR	                  U5      n[        [        XWSS9SSS9  g )Nr   rX   r\   rA      rF   r    r   i  )r   r   ry   rJ   rl   r   rG   r   r   rN   g)\(?rtol)r   r_   randintr
   r   r   r   )r   r   r   r   r   X_csrr   r   s           r+   test_fit_transform_csr_matrixr   =  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   ry   rJ   early_exaggerationmetricrl   rM   rG   r   r   )r   r   gffffff?)r   rg   r_   r   r   r
   r   r   )rl   rq   r   Dr   r   r   s          r+   Ftest_preserve_trustworthiness_approximately_with_precomputed_distancesr   U  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   r_   r   r   )rl   r   s     r+   )test_trustworthiness_not_euclidean_metricr   k  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   ru   r   r   r   r   rl   ry   r   )r
   r   r   r   r   )r   r   retypemessage_regexr   s        r+   test_bad_precomputed_distancesr   u  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   ru   r   r   sparser   r   rY   )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   ru   r   )r   r   rl   ry   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   rl   r   rJ   N)
r   r_   r   r   spissparser   r   r
   r   )r   rl   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   ry   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   rY   )r
   r2   rQ   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   rQ   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   ry   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	                  [
        R                  " S/S//5      5        S S S 5        g ! , (       d  f       g = f)	Nr   r   r   )r   r   ry   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   ry   rJ   r   rl   r   r   rG   r0   )r   r_   r`   r2   ra   r
   r   allclose)rl   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   r_   r`   r2   ra   r
   r   n_iter_)rl   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_pointsr/  '  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(  r*  s        r+    test_answer_gradient_four_pointsrC  8  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   r1  r2  r3  r4  r5  r6  r7  r8  r9  r:  r;  r<  r=  r>  r?  r@  rA  rB  F皙?rF   r(  r*  s        r+   test_skip_num_points_gradientrF  S  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   r`   r2   ra   int64r   r   rQ   rh   r   r   r   gradientrm   r   )r+  r,  r-  r.  r   rM   ry   rI  rn   args	pij_inputgrad_bhrp   r   s                 r+   r)  r)  s  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   ry   rY   z[t-SNE]znearest neighbors...z"Computed conditional probabilitiesz
Mean sigmazearly exaggeration)	r   r
   r_   sysstdoutr   r   getvalueclose)rl   r   r   
old_stdoutrS   s        r+   test_verboserU    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   ry   rY   rF   )r   r
   r_   r   )rl   r   r   s      r+   test_chebyshev_metricrX    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   ry   rY   rF   )r   r
   r_   r   
embedding_r2   allisfinite)rl   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   ry   rJ   rl   r   rM   rG   r   )r   r_   r`   r
   r   rH  r2   ra   )r   r^  rl   r   r   r   effective_types          r+   
test_64bitrb    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   rX   rF   r   i  r   r`  )r   r_   r
   r   r2   isnanr   )r   rl   r   r   s       r+   test_kl_divergence_not_nanre    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\   rY   rN   r   r[   r   r   r   )anglerI  rM   r]   r\   )floatr   r_   r   r   r   r   r   r   r   r   r   r   r   r   )rg  ry   r   r   r   degrees_of_freedomrl   rm   rn   r   rp   kl_exact
grad_exactr   distances_csrP_bhkl_bhrN  s                     r+   test_barnes_hut_anglero    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 HQ  n[        SSSSUSS	S
9nSUl        SUl        UR                  U5        SU R                  5       R                  ;   a  MQ   e   g )Nr   rE   r    )r   r   r!   rF   g    חAi_  r   )rH   rM   rJ   rl   r   rG   r   r   z@did not make any progress during the last -1 episodes. Finished.)r   r_   r
   _N_ITER_CHECK_EXPLORATION_MAX_ITERr   rR   rS   )rT   rl   r   r   r   s        r+   test_n_iter_without_progressrs    s     &a(L3#A)$&
 %&"1 O  "&&'	
'! *r.   c                    [        S5      nUR                  SS5      nSn[        USSSS9nUR                  U5        U R	                  5       R
                  R                  S5      n/ nU Hf  nSU;   a    O_UR                  S	5      nUS:  d  M$  XxS  nUR                  S
S5      R                  S5      S   nUR                  [        U5      5        Mh     [        R                  " U5      n[        XfU:*     5      n	U	S::  d   eg )Nr   rE   rF   gMb`?r   )rL   rM   rl   r   
FinishedrO   zgradient norm =   r   )r   r_   r
   r   rR   rS   splitfindreplacer   rh  r2   r3   len)
rT   rl   r   rL   r   	lines_outgradient_norm_valueslinestart_grad_normn_smaller_gradient_normss
             r+   test_min_grad_normr  +  s   %a(L3"AMmQQwWDq!!#''--d3I  ))O4a()D<< 2B7==cB1ED ''d4  88$89"]BC  $q(((r.   c                    [        S5      nUR                  SS5      n[        SSSSSS9nUR                  U5        U R	                  5       R
                  R                  S5      S S S2    H=  nS	U;   d  M  UR                  S
5      u    pVU(       d  M(  UR                  S5      u  n  n  O   [        UR                  [        W5      SS9  g )Nr   rX   rF   r   r   )rH   rM   rl   r   rG   ru  r!   	Iterationzerror = ,rY   r]   )r   r_   r
   r   rR   rS   ry  	partitionr   r   rh  )rT   rl   r   r   r  r4   rU   s          r+   test_accessible_kl_divergencer  N  s    %a(L2q!A !D 	q !!#''--d3DbD9$..4KAqu#ooc2q! : ++U5\1Er.   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   rX   r   )r   r   rl   ry   rG   r   rJ   z{}_{}z:rerunN)rg   r
   r   	X_2d_gridformatassert_uniform_gridAssertionErrorr   )r   seedsrG   seedr   Ytry_names          r+   test_uniform_gridr  f  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   rE  r$  rF   )r   r   
kneighborsr   minr2   rf   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   rl   rG   ry   rg  r   r   g-C6?r   )
r   r_   r`   r2   ra   r
   rr  r   r%  r   )rl   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\   rY   r   r   r   r[   )rg  rI  rM   num_threads)rF   r   gư>r   )r   r_   r`   r2   ra   r   r   r   r   r   r   )r   r   r   ri  rg  ry   rl   rm   r   r   rl  rm  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   rX   r   r   r   )r   r   r   rl   rG   r   rJ   r   N)
r   xfailr   r_   r`   r2   ra   r
   r   r   )	r   	dist_funcr   rl   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   rZ   r   r   r   )r   r   ry   rg  n_jobsrl   r   rJ   N)r   r_   r
   r   r   )r   rl   r   r   X_tr_refX_trs         r+   test_tsne_n_jobsr    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\   )ry   rG   rJ   r   r   rl   r   mahalanobisz4Must provide either V or VI for Mahalanobis distancer   Nr   T)checksr   V)r   metric_paramsr>   )r   r_   r
   r   r   r   r   r   r   r2   covr   r   )
rl   r   r   r   default_paramsr   r   precomputed_XX_trans_expectedX_transs
             r+   #test_tsne_with_mahalanobis_distancer  <  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ry   )   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   ry   rl   zperplexity (z") must be less than n_samples (20)r   N)	r   r_   r
   reescaper   r   r   r   )ry   rl   r   estr   s        r+   test_tsne_perplexity_validationr  Z  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  k  sT    
 !		2ii''A.!**3/ 
3	2	2s   ?A((
A6)FrE  r   )N)pr  rP  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  rV   rs   rz   r   r   r   r   r   markparametrizer   r   r   r   r   asarrayr   r   r   filterwarningsr  r  r  r  r  r  r!  r&  r/  rC  rF  r)  thread_unsaferU  rX  r]  ra   float64rb  re  ro  rs  r  r  r  r  r  r  r  r  r  r  r  )r   s   0r+   <module>r     sK   	 
     ) % 4 " '  > 
 A ,  ?KK1b	Q	BII

2q!

2q!	>5BH	C);X>6S2L(  G\#:;!23 4 <$2( G\#:;(E!23.9Y : 4 <Y*, 	"**	rzz" >L	L^M<
'^	L %#45+Sz	"O4	&	& .9	< :	< .9% :% 6 +^n-LM- N	
-&	7#559B0. .9S :S  .9S :S4 .9 :J ?: ' ',+ L'#:;

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