
    _nd                        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j1        d dd          Z2 ej3        e2e2          \  Z4Z5 ej6        e47                                8                    d d          e57                                8                    d d          g          Z9d! Z:d" Z;d# Z<d$ Z=d% Z>d& Z?d' Z@d( ZAe
jB        C                    d)d*d+g          e
jB        C                    d,d-          d.                         ZDd/ ZEe
jB        C                    d)d*d+g          d0             ZFd1 ZGd2 ZHe
jB        C                    d3d*ejI        fd+ejI        fd+e	jJ        fg          e
jB        C                    d4d5gd6ggd7fd5d8gd6d5ggd9fg          d:                         ZKd; ZLd< ZM ee=          d>             ZNd? ZOd@ ZPdA ZQdB ZRdC ZSdD ZTdE ZUdF ZVdG ZWdH ZXdI ZY	 	 	 dfdLZZdM Z[dN Z\dO Z]e
jB        C                    d)d+d*g          e
jB        C                    dPej^        ej_        g          dQ                         Z`e
jB        C                    d)d+d*g          dR             ZadS ZbedT             ZcdU ZddV Zee
jB        C                    d)d+d*g          dW             ZfdgdXZgdY ZhdZ Zie
jB        C                    d[d\e/fd]e0fg          e
jB        C                    d)d+d*g          d^                         Zje
jB        C                    d)d*d+g          d_             Zkd` Zlda Zme
jB        C                    dbdc          dd             Znde ZodS )h    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                  H    G d d          } dd}t           j        }t                      t           _        	 t           |             t	          j        d          ddddddd	d

  
        \  }}}t           j                                        }t           j                                         |t           _        nM# t           j                                        }t           j                                         |t           _        w xY w|dk    sJ |dk    sJ d|v sJ t           j        }t                      t           _        	 t          |t	          j        d          dddddddd

  
        \  }}}t           j                                        }t           j                                         |t           _        nM# t           j                                        }t           j                                         |t           _        w xY w|dk    sJ |dk    sJ d|v sJ t           j        }t                      t           _        	 t           |             t	          j        d          dddddddd

  
        \  }}}t           j                                        }t           j                                         |t           _        nM# t           j                                        }t           j                                         |t           _        w xY w|dk    sJ |dk    sJ d|v sJ d S )Nc                       e Zd Zd ZddZdS );test_gradient_descent_stops.<locals>.ObjectiveSmallGradientc                     d| _         d S Nr"   )it)selfs    Alib/python3.11/site-packages/sklearn/manifold/tests/test_t_sne.py__init__zDtest_gradient_descent_stops.<locals>.ObjectiveSmallGradient.__init__3   s    DGGG    Tc                 f    | xj         dz  c_         d| j         z
  dz  t          j        dg          fS )Nr    r!         $@h㈵>)r(   nparray)r)   _compute_errors      r*   __call__zDtest_gradient_descent_stops.<locals>.ObjectiveSmallGradient.__call__6   s3    GGqLGGLD("(D6*:*:::r,   NT)__name__
__module____qualname__r+   r4    r,   r*   ObjectiveSmallGradientr%   2   s7        	 	 		; 	; 	; 	; 	; 	;r,   r:   Tc                 .    dt          j        d          fS )N        r    )r0   ones)r2   r3   s     r*   flat_functionz2test_gradient_descent_stops.<locals>.flat_function:   s    BGAJJr,   r    r   d   r<   r/      )n_itern_iter_without_progressmomentumlearning_ratemin_gainmin_grad_normverbose      ?gradient normr!      zdid not make any progresszIteration 10r5   )sysstdoutr   r   r0   zerosgetvalueclose)r:   r>   
old_stdoutr2   errorr(   outs          r*   test_gradient_descent_stopsrS   0   s/   ; ; ; ; ; ; ; ;    JCJ (""$$HQKK$'
 
 
5" j!!##


 j!!##

C<<<<7777c!!!! JCJ (HQKK$&
 
 
5" j!!##


 j!!##

C<<<<8888&#---- JCJ (""$$HQKK$'
 
 
5" j!!##


 j!!##

C<<<<8888S      s&   7B7 7A
D?/F7 7A
H?7J? ?A
L	c                     t          d          } |                     dd          }t          |                              t          j                  }d}t          ||d          t	          j        t	          j        t          j	                  j
                  t	          j        fdt          j        d                   D                       }t          ||d           d S )	Nr   2            9@rG   c                     g | ]J}t          j        t          j        |         t          j        |                   z                       KS r9   )r0   expsumlog).0iPs     r*   
<listcomp>z&test_binary_search.<locals>.<listcomp>   sE    III!!rvad||+,,,	-	-IIIr,      decimal)r   randnr   astyper0   float32r   maximumfinfodoubleepsmeanrangeshaper
   )random_statedata	distancesdesired_perplexitymean_perplexityr_   s        @r*   test_binary_searchrs      s    %a((Lb!$$D"4((//
;;I!)-?KKKA

1bhry))-..AgIIIIuQWQZ7H7HIII O );QGGGGGGr,   c            
      ^   t          d          } |                     dd                              t          j                  dz   }d}t          ||d          }dt          j        |ddd f         t          j        |ddd f                   z             z  }t          ||d	
           d S )N*   r    Z   r?   g      >@r   rX   r@   ra   rb   )	r   rd   re   r0   rf   r   nansumlog2r
   )rn   ro   rq   r_   
perplexitys        r*   test_binary_search_underflowrz      s     &b))La$$++BJ77#=D!$(:AFFFAry1abb5BGAaeH,=,=!=>>>>J
$6BBBBBBr,   c                  >   d} d}t          d          }|                    | d                              t          j        d          }t          |          }t          ||d          | dz
  }t                                          |          }|	                    |d	
          j
                            t          j        d          }|                    | |          }t          ||d          }j        t          j        fdt          |           D                       }	t          |	|d           t          j        d| dz
  d          D ]B}
t#          |
          }
|
dz  }|	                    |
d	
          j
                            t          j        d          }|                    | |
          }t          ||d          }t          |	|d           t          j                                                  d d d         }                                |         d |         }t          j        |                                          d d d         }|                                |         d |         }t          ||d           Dd S )N   rW   r   r@   FcopyrX   r    distancen_neighborsmodec           	      \    g | ](}|j         |         |d z                     f         )S )r    )indices)r]   kP1distance_graphindptrs     r*   r`   z0test_binary_search_neighbors.<locals>.<listcomp>   sL     	
 	
 	
 q.(VAE])BCCD	
 	
 	
r,      rb      rV   r!   r"   )r   rd   re   r0   rf   r   r   r   fitr   ro   reshaper   r1   rl   r   linspaceintargsortravel)	n_samplesrq   rn   ro   rp   r   nndistances_nnP2P1_nnr   topnP2kidxP1topP2topr   r   r   s                   @@@r*   test_binary_search_neighborsr      s    I%a((Li++222:E2JJD"4((I	"9.@!	L	L	LB a-K						%	%B(([z(RRN!&--bju-EEL''	;??L	"<1CQ	O	O	OB"FH	
 	
 	
 	
 	
 	
9%%	
 	
 	
 E eR3333 [i!mQ// ; ;FF2v,,,LL%*11"*51II#++Iq99'6HRSTTT!%Q7777j$$TTrT*

3&j%%ddd+		C $'!%:::::; ;r,   c                  V   d} d}t          d          }|                    |d          }t                                          |          }|                    | d          }|j                            t          j        d          }|	                    ||           }d }d	}t          d          D ]w}	t          |                                |d
          }
t          ||d
          }|                                }||
}|}St          |
|d           t          ||d           xd S )Nr!   r?   r   rV   r   r   Fr}   ra   rX   r   rb   )r   rd   r   r   r   ro   re   r0   rf   r   rl   r   r~   r   toarrayr   )r   r   rn   ro   r   r   rp   last_Prq   r2   r_   r   last_P1s                r*    test_binary_perplexity_stabilityr      s>    KI%a((Li++D						%	%B(([z(RRN#**2:E*BBI!!)[99IF3ZZ 
> 
>%inn&6&68JTUVVV$^5GQRSSSZZ\\>FGG%a;;;;%b'1=====
> 
>r,   c                  4  	 t          d          } d	d}dd|                     	|                              t          j                  }t          j        |                    |j                            }t          j        |d           |                     	                              t          j                  }t          |dd          	fd}	fd	}t          t          |||                                          dd
           d S )Nr   rU   r@   rH   r<   rW   )rq   rG   c                 6    t          |           d         S )Nr   r   paramsr_   alphan_componentsr   s    r*   funztest_gradient.<locals>.fun       fa	<HHKKr,   c                 6    t          |           d         S )Nr    r   r   s    r*   gradztest_gradient.<locals>.grad   r   r,   rV   rb   )r   rd   re   r0   rf   absdotTfill_diagonalr   r
   r   r   )
rn   
n_featuresrp   
X_embeddedr   r   r_   r   r   r   s
         @@@@r*   test_gradientr      sK   %a((LIJLE""9j99@@LLIy}}Y[1122IY$$$##I|<<CCBJOOJY4KKKAL L L L L L L LL L L L L L L L 
3j.>.>.@.@AA3PQRRRRRRr,   c                  "   t          d          } |                     dd          }t          |d|dz  z             dk    sJ t          j        d                              dd          }|                                }|                     |           t          ||          d	k     sJ t          j        d
                              dd          }t          j        dgdgdgdgdgg          }t          t          ||d          d           d S )Nr   r?   r@         @r.   rH   r"   r    g333333?rV   r   ra   r   g?)
r   rd   r   r0   aranger   r~   shuffler1   r
   )rn   Xr   s      r*   test_trustworthinessr      s   %a((L 	3""A1cAHn--4444 		#r1%%AJ$$$1j))C//// 		!R##AA3aS1#s344J:1EEEsKKKKKr,   c                  p   d} t           j                            d          }|                    dd          }|                    dd          }t	          j        t          |           5  t          ||d           d	d	d	           n# 1 swxY w Y   t          ||d
          }d|cxk    rdk    sn J d	S )z[Raise an error when n_neighbors >= n_samples / 2.

    Non-regression test for #18567.
    z%n_neighbors .+ should be less than .+ru      r   r@   matchrV   r   Nra   r   r    )r0   randomRandomStaterandpytestraises
ValueErrorr   )regexrngr   r   trusts        r*   &test_trustworthiness_n_neighbors_errorr     s    
 4E
)


#
#CAA!QJ	z	/	/	/ 6 6:155556 6 6 6 6 6 6 6 6 6 6 6 6 6 6 Azq999E????????????s   )BBBmethodexact
barnes_hutinit)r   pcac                    t          d          }d}|                    d|                              t          j                  }t          ||d| dd          }|                    |          }t          ||d          }|d	k    sJ d S )
Nr   r@   rU   i  auto)r   r   rn   r   rA   rD   r    r   g333333?)r   rd   re   r0   rf   r   fit_transformr   )r   r   rn   r   r   tsner   ts           r*   +test_preserve_trustworthiness_approximatelyr   $  s     &a((LL2|,,33BJ??A!  D ##A&&J:1555At888888r,   c            	      2   t          d          } t          d|           \  }}g }dD ]F}t          dddd|d	          }|                    |           |                    |j                   G|d
         |d         k    sJ |d         |d
         k    sJ dS )z=t-SNE should give a lower KL divergence with more iterations.r   ra   )r   rn   )   ,  i^  r@   r   r!         Y@)r   r   ry   rD   rA   rn   r    N)r   r   r   r   appendkl_divergence_)rn   r   r2   kl_divergencesrA   r   s         r*   )test_optimization_minimizes_kl_divergencer   8  s    %a((L>>>DAqN! 
3 
3
 
 
 	1d12222!q 11111!q 1111111r,   c           	      t   t          d          }|                    dd          }d||                    ddd          |                    ddd          f<   t          j        |          }t          ddddd| d	
          }|                    |          }t          t          ||d          dd           d S )Nr   rU   r@   r<      r   r!   r   i  )r   r   ry   rD   rn   r   rA   r    r   rH   g)\(?rtol)	r   rd   randintsp
csr_matrixr   r   r   r   )r   r   r   X_csrr   r   s         r*   test_fit_transform_csr_matrixr   L  s    
 Q

C		"aA9<As{{1b"s{{1a4456M!E  D ##E**JOE:1EEEsQWXXXXXXr,   c                  >   t          d          } t          d          D ]}}|                     dd          }t          t	          |          d          }t          ddddd|dd	d
	  	        }|                    |          }t          ||dd          }|dk    sJ ~d S )Nr   ra   P   r@   sqeuclideanr          @precomputed  r   )	r   ry   rD   early_exaggerationmetricrn   rG   rA   r   r    )r   r   gffffff?)r   rl   rd   r   r   r   r   r   )rn   r^   r   Dr   r   r   s          r*   Ftest_preserve_trustworthiness_approximately_with_precomputed_distancesr   b  s    %a((L1XX  r1%%uQxx//" 

 

 

 ''**
AzqOOO4xxxxx! r,   c                      t          d          } |                     dd          }t          ||d          t          t          |d          |d          k    sJ d S )Nr   r?   r@   cosiner   r   )r   rd   r   r   )rn   r   s     r*   )test_trustworthiness_not_euclidean_metricr   x  s{     &a((L3""A1a111_1X...-6 6 6      r,   zmethod, retypezD, message_regexr<   rH   z.* square distance matrixg      z.* positive.*c                     t          d| ddd          }t          j        t          |          5  |                     ||                     d d d            d S # 1 swxY w Y   d S )Nr   r   ru   r    r   r   r   rn   ry   r   )r   r   r   r   r   )r   r   retypemessage_regexr   s        r*   test_bad_precomputed_distancesr     s        D 
z	7	7	7 & &66!99%%%& & & & & & & & & & & & & & & & & &s   AA #A c                      t          ddddd          } t          j        t          d          5  |                     t          j        d	d
gd
d	gg                     d d d            d S # 1 swxY w Y   d S )Nr   r   r   ru   r    r   sparser   r   rV   r   r   r   	TypeErrorr   r   r   r   s    r*    test_exact_no_precomputed_sparser     s      D 
y	1	1	1 < <2=1a&1a&)9::;;;< < < < < < < < < < < < < < < < < <s   .A++A/2A/c                  $   t          j        g dg dg dg          } t          j        |           }t	          dddd          }d}t          j        t          |	          5  |                    |           d d d            d S # 1 swxY w Y   d S )
N)rH   r<   r<   )r<   rH   r<   r   r   ru   r    )r   r   rn   ry   zB3 neighbors per samples are required, but some samples have only 1r   )	r0   r1   r   r   r   r   r   r   r   )distbad_distr   msgs       r*   1test_high_perplexity_precomputed_sparse_distancesr     s    8___oooGHHD}T""H}8"QRSSSD
NC	z	-	-	- % %8$$$% % % % % % % % % % % % % % % % % %s   "BB	B	)categoryc                     t          d          } |                     dd          }t          |ddd          }t          |          }t	          j        |          sJ t          |j        |           t          dddd	
          }|	                    |          }dD ]:}|	                    |
                    |                    }t          ||           ;dS )zAMake sure that TSNE works identically for sparse and dense matrixr   r?   r@   r   T)r   r   include_selfr   r   r   )r   rn   r   rD   )csrlilN)r   rd   r   r   r   issparser
   Ar   r   asformat)rn   r   D_sparser   r   Xt_densefmt	Xt_sparses           r*    test_sparse_precomputed_distancer    s     &a((L3""AsRVWWWH1A;x     
A&&&186  D !!!$$H 1 1&&x'8'8'='=>>	Hi00001 1r,   c                      d } t          | dd          }t          j        ddgddgg          }t          j        t
          d          5  |                    |           d d d            d S # 1 swxY w Y   d S )	Nc                     dS r'   r9   )xys     r*   r   z4test_non_positive_computed_distances.<locals>.metric  s    rr,   r   r    )r   r   ry   r<   rH   zAll distances .*metric given.*r   )r   r0   r1   r   r   r   r   )r   r   r   s      r*   $test_non_positive_computed_distancesr    s       vg!<<<D
3*sCj)**A	z)I	J	J	J  1                 s   A..A25A2c                      t          t          j        d          d          } |                     t          j        d                    }t          t          j        d          |           d S )Nr?   r@   r   )r   rD   )r?   rV   )r   r0   rM   r   r=   r   )r   r   s     r*   test_init_ndarrayr    s[    RXh''v>>>D##BGH$5$566Jrx)):66666r,   c                      t          t          j        d          dd          } |                     t          j        d                     d S )Nr  r   g      I@)r   r   rD   )r?   r?   )r   r0   rM   r   r   s    r*   test_init_ndarray_precomputedr    sO     Xh  D
 	HHRXj!!"""""r,   c                      t          ddd          } t          j        t          d          5  |                     t          j        dgdgg                     d d d            d S # 1 swxY w Y   d S )	Nr   r   r    )r   r   ry   zBThe parameter init="pca" cannot be used with metric="precomputed".r   r<   rH   r   r   r   r   r   r0   r1   r   s    r*   >test_pca_initialization_not_compatible_with_precomputed_kernelr    s    }5Q???D	R
 
 
 5 5 	28cUSEN33444	5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5   ,A''A+.A+c                      t          ddd          } t          j        t          d          5  |                     t          j        ddgddgg                     d d d            d S # 1 swxY w Y   d S )	Nr   r   r    )r   rD   ry   zPCA initialization.*r   r   rV   r   r   s    r*   8test_pca_initialization_not_compatible_with_sparse_inputr    s    U%A>>>D	y(>	?	?	? < <2=1a&1a&)9::;;;< < < < < < < < < < < < < < < < < <s   .A))A-0A-c                      t          ddd          } t          j        t          d          5  |                     t          j        dgdgg                     d d d            d S # 1 swxY w Y   d S )	Nr   r   r    )r   r   ry   z'n_components' should be .*r   r<   rH   r  r   s    r*   test_n_components_ranger    s    Q|BBBD	z)F	G	G	G 5 528cUSEN334445 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5r  c                  ~   t          d          } d}ddg}|                     d|                              t          j                  }|D ]q}t          |dddd|d	d
          }|                    |          }t          |dddd|dd
          }|                    |          }t          j        ||          rJ rd S )Nr   r@   r   r   r   r    r   r   rH   r   r   ry   rD   r   rn   r   r   rA   r.   )r   rd   re   r0   rf   r   r   allclose)rn   r   methodsr   r   r   X_embedded1X_embedded2s           r*   test_early_exaggeration_usedr&    s    %a((LL%G2|,,33BJ??A 9 9%"	
 	
 	
 ((++%#	
 	
 	
 ((++;{K88888819 9r,   c                  "   t          d          } d}ddg}|                     d|                              t          j                  }|D ]C}dD ]>}t          |ddd	d|d
|          }|                    |           |j        |dz
  k    sJ ?Dd S )Nr   r@   r   r   r   )   r   r          ?r   rH   r!  )r   rd   re   r0   rf   r   r   n_iter_)rn   r   r#  r   r   rA   r   s          r*   test_n_iter_usedr+    s    %a((LL%G2|,,33BJ??A . .  	. 	.F)!#&	 	 	D q!!!<6A:-----	.. .r,   c                      t          j        ddgddgg          } t          j        ddgddgg          }t          j        dgdgg          }t          j        d	d
gddgg          }t          | |||           d S )NrH   r<   gbv
gCrgJ!zE?g)x>1?r    r   gKXAgr}gKXA>gr}?r0   r1   _run_answer_test	pos_input
pos_output	neighborsgrad_outputs       r*   test_answer_gradient_two_pointsr4  6  s    
 3*sCj122I
	',)EF J 1#s$$I(
?	+nn-MN K Y
I{CCCCCr,   c                  *   t          j        ddgddgddgddgg          } t          j        ddgd	d
gddgddgg          }t          j        g dg dg dg dg          }t          j        ddgddgddgddgg          }t          | |||           d S )NrH   r<   r   r   333333@皙@$1?m5a ҇&IimU-|3Sٵ?:ǁ$*r    r@   ra   r   r@   ra   r    r   ra   r    r@   r   g\$w?gRn		Qgz}g`>41f>6Sc>gU9&#*@>r-  r/  s       r*    test_answer_gradient_four_pointsrH  F  s    
 3*sCj3*sCjIJJI=)M*L)M*		
 J )))YYY			999EFFI(_-n-_-n-		
 K Y
I{CCCCCr,   c            	      0   t          j        ddgddgddgddgg          } t          j        ddgd	d
gddgddgg          }t          j        g dg dg dg dg          }t          j        ddgddgddgddgg          }t          | |||ddd           d S )NrH   r<   r   r   r6  r7  r8  r9  r:  r;  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  F皙?r@   r-  r/  s       r*   test_skip_num_points_gradientrK  `  s     3*sCj3*sCjIJJI=)M*L)M*		
 J )))YYY			999EFFI(#J#J_-n-		
 K Y
I{E3PQRRRRRr,   FrJ  c                    t          |                               t          j                  }|||f}|                    t          j                  }|                    t          j        d          }t          | }	t          |	                              t          j                  }	t          j        |j        t          j                  }
ddl	m
}  ||	          }|j                            t          j                  }|j                            t          j                  }t          j        |j        ||||
dddd		  	         t!          |
|d
           d S )NFr}   )dtyper   )r   r)  r@   r    )skip_num_pointsr   rb   )r   re   r0   rf   int64r   r   rM   rm   scipy.sparser   r   r   r   gradientro   r   )r0  r1  r2  r3  rG   ry   rN  rp   args	pij_inputgrad_bhr   r_   r   s                 r*   r.  r.  }  s6    #9--44RZ@@Ij')D""2:..J   66I$d+I9%%,,RZ88Ihz'rz:::G''''''
9A	  **IX__RX&&F	
IvwQST    g{A>>>>>>r,   c                  N   t          d          } t          dd          }|                     dd          }t          j        }t                      t          _        	 |                    |           t          j                                        }t          j                                         |t          _        nM# t          j                                        }t          j                                         |t          _        w xY wd|v sJ d|v sJ d|v sJ d	|v sJ d
|v sJ d S )Nr   r@   r   )rG   ry   rV   z[t-SNE]znearest neighbors...z"Computed conditional probabilitiesz
Mean sigmazearly exaggeration)	r   r   rd   rK   rL   r   r   rN   rO   )rn   r   r   rP   rR   s        r*   test_verboserV    s)   %a((La(((D1a  AJCJ 1j!!##


 j!!##

!S((((/3666633&&&&&&s   B: :A
Dc                      t          d          } t          dd          }|                     dd          }|                    |           d S )Nr   	chebyshevr   )r   ry   rV   r@   )r   r   rd   r   )rn   r   r   s      r*   test_chebyshev_metricrY    sP    %a((L{q111D1a  Aqr,   c                      t          d          } t          dd          }|                     dd          }|                    |          j        }t          j        t          j        |                    sJ d S )Nr   r    r   )r   ry   rV   r@   )r   r   rd   r   
embedding_r0   allisfinite)rn   r   r   r   s       r*   test_reduction_to_one_componentr^    sn    %a((LQ1---D1a  A!'J6"+j))*******r,   dtc           
         t          d          }|                    dd                              |d          }t          dddd| ddd	          }|                    |          }|j        }|t          j        k    sJ d S )
Nr   r!   r@   Fr}   r   r   r   r   ry   rD   rn   r   rG   rA   r   )r   rd   re   r   r   rM  r0   rf   )r   r_  rn   r   r   r   effective_types          r*   
test_64bitrc    s     &a((L2q!!((%(88A	 	 	D ##A&&J%N RZ''''''r,   c           
          t          d          }|                    dd          }t          dddd| ddd          }|                    |           t	          j        |j                  rJ d S )Nr   rU   r@   r   i  r   ra  )r   rd   r   r   r0   isnanr   )r   rn   r   r   s       r*   test_kl_divergence_not_nanrf    s     &a((L2q!!A	 	 	D 	qx+,,,,,,,r,   c                     d} d}d}dD ]7}d}t          |dz
            }t          d          }|                    ||          }t          |          }|                    ||          }	t	          ||d          }
t          |	|
|||          \  }}|d	z
  }t                                          |                              |d
          }t          ||d          }t          |	||||| dd          \  }}t          |
          }
|                                }t          ||
d           t          ||d           9d S )Nr<   r!   r?   )r@   ra   rV   rH   r   rX   r    r   r   )anglerN  rG   rb   ra   )floatr   rd   r   r   r   r   r   r   r   r   r   r   r   r
   )rh  ry   r   r   r   degrees_of_freedomrn   ro   rp   r   r_   kl_exact
grad_exactr   distances_csrP_bhkl_bhrT  s                     r*   test_barnes_hut_anglerp    s   EJI "8 "8
"<##566)!,,!!)Z88&t,,	##I|<< JBBB-A)9l 
  
*  !mSYY+JGG 	
 '}j!LLL*	
 	
 	
w qMM||~~!$15555HeQ77777E"8 "8r,   c            
      N   t          d          } |                     dd          }dD ]}t          dddd|dd	
          }d|_        d|_        t
          j        }t                      t
          _        	 |                    |           t
          j        	                                }t
          j        
                                 |t
          _        nM# t
          j        	                                }t
          j        
                                 |t
          _        w xY wd|v sJ d S )Nr   r?   r!   )r   r   r"   r@   g    חAi_  r   )rB   rG   rD   rn   r   rA   r   r    z@did not make any progress during the last -1 episodes. Finished.)r   rd   r   _N_ITER_CHECK_EXPLORATION_N_ITERrK   rL   r   r   rN   rO   )rn   r   r   r   rP   rR   s         r*   test_n_iter_without_progressrt    s.    &a((L3##A) Y Y$&
 
 
 #$ Z
ZZ
	$q!!!*%%''CJ#CJJ *%%''CJ#CJ#### RUXXXXXX/Y Ys   3CA
Dc                     t          d          } |                     dd          }d}t          |ddd          }t          j        }t                      t          _        	 |                    |           t          j                                        }t          j                                         |t          _        nM# t          j                                        }t          j                                         |t          _        w xY w|	                    d          }g }|D ]~}d|v r nw|
                    d	          }	|	dk    r[||	d          }|                    d
d          	                    d          d         }|                    t          |                     t          j        |          }t!          |||k                       }
|
dk    sJ d S )Nr   r?   r@   gMb`?r   )rF   rG   rn   r   
FinishedrI   zgradient norm =   r    )r   rd   r   rK   rL   r   r   rN   rO   splitfindreplacer   ri  r0   r1   len)rn   r   rF   r   rP   rR   	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WWWDJCJ 1j!!##


 j!!##

		$I  
5 
5 E))O44a(()D<< 2B77==cBB1ED ''d444 8$899"1]BC    $q((((((s    B> >A
Dc                     t          d          } |                     dd          }t          ddddd          }t          j        }t                      t          _        	 |                    |           t          j                                        }t          j                                         |t          _        nM# t          j                                        }t          j                                         |t          _        w xY w|	                    d          d d d         D ]<}d	|v r6|
                    d
          \  }}}|r|
                    d          \  }}} n=t          |j        t          |          d           d S )Nr   rU   r@   r   r   )rB   rG   rn   r   rA   rv  r"   	Iterationzerror = ,rV   rb   )r   rd   r   rK   rL   r   r   rN   rO   rz  	partitionr
   r   ri  )rn   r   r   rP   rR   r  r2   rQ   s           r*   test_accessible_kl_divergencer  e  so   %a((L2q!!A !11WUX  D JCJ 1j!!##


 j!!##

 		$"%  $..44KAq% #ooc22q!+U5\\1EEEEEEs   B= =A
Dc           
      l   t          d          }d}|D ]}t          dd|d|| d          }|                    t                    }d                    | |          }	 t          ||           Z# t          $ r9 |d	z  }||_        |                    t                    }t          ||           Y w xY wd
S )a  Make sure that TSNE can approximately recover a uniform 2D grid

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

    Also, t-SNE is not assured to converge to the right solution because bad
    initialization can lead to convergence to bad local minimum (the
    optimization problem is non-convex). To avoid breaking the test too often,
    we re-run t-SNE from the final point when the convergence is not good
    enough.
    ra   r   r@   r   rU   r   )r   r   rn   ry   rA   r   rD   z{}_{}z:rerunN)rl   r   r   	X_2d_gridformatassert_uniform_gridAssertionErrorr   )r   seedsrA   seedr   Ytry_names          r*   test_uniform_gridr    s     !HHEF - - 
 
 
 y))>>&$//		-8,,,, 	- 	- 	-  HDI""9--A8,,,,,	-- -s   A..A B10B1c                    t          d                              |           }|                    d          d                                         }|                                dk    sJ |                                t          j        |          z  }|                                t          j        |          z  }|dk    s
J |            |dk     s
J |            d S )	Nr    r   T)return_distancer   rJ  r)  r@   )r   r   
kneighborsr   minr0   rk   max)r  r  r   
dist_to_nnsmallest_to_meanlargest_to_means         r*   r  r    s     
a	(	(	(	,	,Q	/	/Bt44Q7==??J>>c!!!!!~~''"'**=*== nn&&)<)<<Oc!!!8!!!Qr,   c                     t          d          } d}|                     d|                              t          j                  }i }i }dD ]B}t          d|ddddd	d
          }d|_        |                    |          ||<   |j        ||<   C|d         |d         k    sJ t          |d         |d         d           d S )Nr   r!      )r   r   r@   rH   r   r(  g     =@)r   r   rD   r   rn   rA   ry   rh  r   r   g-C6?r   )
r   rd   re   r0   rf   r   rs  r   r*  r   )rn   r   r   X_embeddedsrA   r   r   s          r*   test_bh_match_exactr    s     &a((LJ2z**11"*==AKF) & &	
 	
 	
 $% "0033Fv'?f\22222K(+l*C$OOOOOOr,   c                  "   d} d}d}d}d}d}t          d          }|                    ||                               t          j                  }|                    ||          }|dz
  }	t                                          |                              |	d	          }
t          |
|d
          }t          ||||||ddd	  	        \  }}dD ]?}t          ||||||dd|	  	        \  }}t          ||d           t          ||           @d S )Nr!   r  r@   r    ra   rV   r   r   r   rX   )rh  rN  rG   num_threads)r@   r   gư>r   )r   rd   re   r0   rf   r   r   r   r   r   r   )r   r   r   rj  rh  ry   rn   ro   r   r   rm  rn  kl_sequentialgrad_sequentialr  kl_multithreadgrad_multithreads                    r*   -test_gradient_bh_multithread_match_sequentialr    se    JILEJ%a((Li44;;BJGGD	<88Fa-K	T		k
		C	C 
 #=*aHHHD%6
& 
& 
&"M?  < <+<#
,
 
,
 
,
(( 	DAAAA(*:;;;;< <r,   zmetric, dist_func	manhattanr   c           	         |dk    r| dk    rt          j        d           t          d          }d}d}|                    d|                              t
          j                  }t          | ||ddd	d
                              |          }t          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   ra   r@   rU   r   r   r   )r   r   r   rn   rA   r   rD   r   N)
r   xfailr   rd   re   r0   rf   r   r   r   )	r   	dist_funcr   rn   n_components_originaln_components_embeddingr   X_transformed_tsneX_transformed_tsne_precomputeds	            r*   )test_tsne_with_different_distance_metricsr    s    &K"7"7 	5	
 	
 	

 &a((L2455<<RZHHA+   mA  &*+& & & mIIaLL!! # )+IJJJJJr,   c           
         t          d          }d}|                    d|          }t          d| dddddd	                              |          }t          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  r@   rW   r    r   r   )r   r   ry   rh  n_jobsrn   r   rD   N)r   rd   r   r   r   )r   rn   r   r   X_tr_refX_trs         r*   test_tsne_n_jobsr  9  s     &a((LJ2z**A	 	 	 mA  	 	 	 mA 	 Hd#####r,   c                  4   t          d          } d\  }}|                     ||          }ddddddd}t          dd	d
i|}d}t          j        t
          |          5  |                    |           ddd           n# 1 swxY w Y   t          t          |d
          d          }t          dd	di|                    |          }t          dd
dt          j
        |j                  id|                    |          }	t          |	|           dS )zAMake sure that method_parameters works with mahalanobis distance.r   )r   r!   (   r   r   r   ra   )ry   rA   rD   r   r   rn   r   mahalanobisz4Must provide either V or VI for Mahalanobis distancer   Nr   T)checksr   V)r   metric_paramsr9   )r   rd   r   r   r   r   r   r   r   r0   covr   r   )
rn   r   r   r   default_paramsr   r   precomputed_XX_trans_expectedX_transs
             r*   #test_tsne_with_mahalanobis_distancer  W  s   %a((L#Iz9j11A N 77}777D
@C	z	-	-	-  1               uQ}===dKKKMCC=CNCCQQ   S"&++,> BP mA  G-.....s   BBBc            
         t          d          } |                     dd          }t          dddddddd	
          }d}t          j        t
          |          5  |                    |          }ddd           n# 1 swxY w Y   t          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!   r@   r   r   rW   r    T)r   r   rD   ry   rh  r  rn   square_distanceszRThe parameter `square_distances` has not effect and will be removed in version 1.3r   N)r   r   rD   ry   rh  r  rn   )r   rd   r   r   warnsFutureWarningr   r   )rn   r   r   warn_msg	X_trans_1	X_trans_2s         r*   &test_tsne_deprecation_square_distancesr  v  s1    &a((L2r""A	 	 	D	  
m8	4	4	4 * *&&q))	* * * * * * * * * * * * * * *   D ""1%%IIy)))))s   A<<B B ry   )   r  c                    t          d          }|                    dd          }t          dd| |          }d}t          j        t
          |          5  |                    |           d	d	d	           d	S # 1 swxY w Y   d	S )
z=Make sure that perplexity > n_samples results in a ValueErrorr   r  r@   r   r   )rD   r   ry   rn   z&perplexity must be less than n_samplesr   N)r   rd   r   r   r   r   r   )ry   rn   r   estr   s        r*   test_tsne_perplexity_validationr    s     &a((L2q!!A
!	  C 3C	z	-	-	-  !                 s   A99A= A=c                     t          j        d           t          d          5  t          j        d                              dd          } t          d                              |            ddd           dS # 1 swxY w Y   dS )	ziMake sure that TSNE works when the output is set to "pandas".

    Non-regression test for gh-25365.
    pandas)transform_output   #   r   r@   )r   N)r   importorskipr   r0   r   r   r   r   )arrs    r*   "test_tsne_works_with_pandas_outputr    s    
 !!!		2	2	2 0 0i''A..!**3///0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0s   AA>>BB)FrJ  r   )N)prK   ior   numpyr0   numpy.testingr   rP  r   r   r   sklearnr   sklearn.neighborsr   r   sklearn.exceptionsr   sklearn.utils._testingr	   r
   r   r   r   sklearn.utilsr   sklearn.manifold._t_sner   r   r   r   r   r   sklearn.manifoldr   r   sklearn.manifold._utilsr   sklearn.datasetsr   scipy.optimizer   scipy.spatial.distancer   r   sklearn.metrics.pairwiser   r   r   r   r  meshgridxxyyhstackr   r   r  rS   rs   rz   r   r   r   r   r   markparametrizer   r   r   r   r   asarrayr   r   r   r   r  r  r  r  r  r  r  r&  r+  r4  rH  rK  r.  rV  rY  r^  rf   float64rc  rf  rp  rt  r  r  r  r  r  r  r  r  r  r  r  r  r9   r,   r*   <module>r     s   



           ) ) ) ) ) )        " " " " " " . . . . . . . . . . . . 0 0 0 0 0 0 2 2 2 2 2 2 6 6 6 6 6 6 5 5 5 5 5 5 < < < < < < 0 0 0 0 0 0 , , , , , , 8 8 8 8 8 8 ; ; ; ; ; ; 2 2 2 2 2 2 5 5 5 5 5 5 5 5 5 5 5 5 3 3 3 3 3 3 ! ! ! ! ! ! . - - - - - = = = = = = ' ' ' ' ' ' % % % % % % ( ( ( ( ( ( - - - - - - 7 7 7 7 7 7 8 8 8 8 8 8 5 5 5 5 5 5 BK1b	Q		BBI


2q!!


2q!! 	S! S! S!lH H H	C 	C 	C); ); );X> > >6S S S2L L L(    G\#:;;!233  43 <;$2 2 2( G\#:;;Y Y <;Y*  ,   	"*	rz"	r}%  %#45+Sz	"O4 	& 	&  	&	< 	< 	<% % % +,,,1 1 -,1(	 	 	7 7 7# # #5 5 5< < <5 5 59 9 9B. . ..D D D D D D4S S SD ? ? ? ?<' ' ',  + + + L'#:;;
BJ788( ( 98 <;(. L'#:;;- - <;-*'8 '8 '8T Y Y Y<() () ()VF F F8 L'#:;;$- $- <;$-N) ) ) )P P P80< 0< 0<f &'(4D)EF  L'#:;;*K *K <;	 
*KZ G\#:;;$ $ <;$:/ / />#* #* #*L x00  10 0 0 0 0 0r,   