
    Ug                     	   d dl Z d dlmZ d dl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mZ d dlmZ d dlmZ d dlmZ d d	lmZmZ d d
lmZmZmZmZmZmZ d dl m!Z! d dl"m#Z#m$Z$m%Z% d dl&m'Z'm(Z( d dl)m*Z* d dl+m,Z,m-Z-m.Z.m/Z/m0Z0 d dl1m2Z2m3Z3  ej4        d dd          Z5 ej6        e5e5          \  Z7Z8 ej9        e7:                                ;                    dd          e8:                                ;                    dd          g          Z<d Z=d Z>d Z?d Z@d ZAd ZBd ZCd ZDejE        F                    dddg          ejE        F                    dd           d!                         ZGd" ZHejE        F                    dddg          ejE        F                    d#e2          d$                         ZId% ZJd& ZKejE        F                    d'dejL        fdejL        fgd( e2D                       ejE        F                    d)d*gd+ggd,fd*d-gd+d*ggd.fg          d/                         ZMejE        F                    d#e2          d0             ZNejE        F                    d#e2          d1             ZO e/e2          ejE        F                    d3e2e3z             d4                         ZPd5 ZQd6 ZRd7 ZSd8 ZTejE        F                    d#e2          d9             ZUd: ZVd; ZWd< ZXejE        F                    d#e2          d=             ZYejE        F                    d#e2          d>             ZZejE        F                    d#e2          d?             Z[	 	 	 d]dBZ\dC Z]dD Z^dE Z_ejE        F                    dddg          ejE        F                    dFej`        eja        g          dG                         ZbejE        F                    dddg          dH             ZcdI Zde0dJ             ZedK ZfdL ZgejE        F                    dddg          dM             Zhd^dNZidO ZjdP ZkejE        F                    dQdRe$fdSe#fg          ejE        F                    dddg          dT                         ZlejE        F                    dddg          dU             ZmdV ZnejE        F                    dWdX          dY             ZodZ Zpd[ Zqd\ ZrdS )_    N)StringIO)assert_allclose)
check_grad)pdist
squareform)config_context)
make_blobs)EfficiencyWarning)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ignore_warningsskip_if_32bit)CSR_CONTAINERSLIL_CONTAINERS   
   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    `/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/sklearn/manifold/tests/test_t_sne.py__init__zDtest_gradient_descent_stops.<locals>.ObjectiveSmallGradient.__init__:   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__=   s3    GGqLGGLD("(D6*:*:::r-   NT)__name__
__module____qualname__r,   r5    r-   r+   ObjectiveSmallGradientr&   9   s7        	 	 		; 	; 	; 	; 	; 	;r-   r;   Tc                 .    dt          j        d          fS )N        r!   )r1   ones)r3   r4   s     r+   flat_functionz2test_gradient_descent_stops.<locals>.flat_functionA   s    BGAJJr-   r!   r   d   r=   r0      )max_itern_iter_without_progressmomentumlearning_ratemin_gainmin_grad_normverbose      ?gradient normr"      zdid not make any progresszIteration 10r6   )sysstdoutr   r   r1   zerosgetvalueclose)r;   r?   
old_stdoutr3   errorr)   outs          r+   test_gradient_descent_stopsrT   7   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@rH   c                     g | ]J}t          j        t          j        |         t          j        |                   z                       KS r:   )r1   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   astyper1   float32r   maximumfinfodoubleepsmeanrangeshaper   )random_statedata	distancesdesired_perplexitymean_perplexityr`   s        @r+   test_binary_searchrt      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   rY   rA   rb   rc   )	r   re   rf   r1   rg   r   nansumlog2r   )ro   rp   rr   r`   
perplexitys        r+   test_binary_search_underflowr{      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   rX   r   rA   FcopyrY   r!   distancen_neighborsmodec           	      \    g | ](}|j         |         |d z                     f         )S )r!   )indices)r^   kP1distance_graphindptrs     r+   ra   z0test_binary_search_neighbors.<locals>.<listcomp>   sL     	
 	
 	
 q.(VAE])BCCD	
 	
 	
r-      rc      rW   r"   r#   )r   re   rf   r1   rg   r   r   r   fitr   rp   reshaper   r2   rm   r   linspaceintargsortravel)	n_samplesrr   ro   rp   rq   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   rW   r   r   Fr~   rb   rY   r   rc   )r   re   r   r   r   rp   rf   r1   rg   r   rm   r   r   r   toarrayr   )r   r   ro   rp   r   r   rq   last_Prr   r3   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   rV   rA   rI   r=   rX   )rr   rH   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-   rW   rc   )r   re   rf   r1   rg   absdotTfill_diagonalr   r   r   r   )
ro   
n_featuresrq   
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@   rA         @r/   rI   r#   r!   g333333?rW   r   rb   r   g?)
r   re   r   r1   aranger   r   shuffler2   r   )ro   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 .+rv      r   rA   matchrW   r   Nrb   r   r!   )r1   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   rA   rV   i  auto)r   r   ro   r   rB   rE   r!   r   g333333?)r   re   rf   r1   rg   r   fit_transformr   )r   r   ro   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   rb   )r   ro   )   ,  i^  rA   r   r"         Y@)r   r   rz   rE   rB   ro   r!   N)r   r	   r   r   appendkl_divergence_)ro   r   r3   kl_divergencesrB   r   s         r+   )test_optimization_minimizes_kl_divergencer   ?  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-   csr_containerc           	      b   t          d          }|                    dd          }d||                    ddd          |                    ddd          f<    ||          }t          ddddd| d	
          }|                    |          }t          t          ||d          dd           d S )Nr   rV   rA   r=      r   r"   r   i  )r   r   rz   rE   ro   r   rB   r!   r   rI   g)\(?rtol)r   re   randintr   r   r   r   )r   r   r   r   X_csrr   r   s          r+   test_fit_transform_csr_matrixr   S  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   rb   P   rA   sqeuclideanr          @precomputed  r   )	r   rz   rE   early_exaggerationmetricro   rH   rB   r   r!   )r   r   gffffff?)r   rm   re   r   r   r   r   r   )ro   r_   r   Dr   r   r   s          r+   Ftest_preserve_trustworthiness_approximately_with_precomputed_distancesr   j  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@   rA   cosiner   r   )r   re   r   r   )ro   r   s     r+   )test_trustworthiness_not_euclidean_metricr     s{     &a((L3""A1a111_1X...-6 6 6      r-   zmethod, retypec                     g | ]}d |fS )r   r:   )r^   r   s     r+   ra   ra     s    	L	L	LM<
'	L	L	Lr-   zD, message_regexr=   rI   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   rv   r!   r   r   r   ro   rz   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  |                     | d	d
gd
d	gg                     d d d            d S # 1 swxY w Y   d S )Nr   r   r   rv   r!   r   sparser   r   rW   r   r   r   	TypeErrorr   r   r   s     r+    test_exact_no_precomputed_sparser     s      D 
y	1	1	1 < <==1a&1a&)9::;;;< < < < < < < < < < < < < < < < < <s   %A""A&)A&c                    t          j        g dg dg dg          } | |          }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)rI   r=   r=   )r=   rI   r=   r   r   rv   r!   )r   r   ro   rz   zB3 neighbors per samples are required, but some samples have only 1r   )r1   r2   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   A<<B B )categorysparse_containerc                    t          d          }|                    dd          }t          |ddd          }t          |          }t	          j        |          sJ t          |                                |           t          dddd	
          }|	                    |          }|	                     | |                    }t          ||           dS )zAMake sure that TSNE works identically for sparse and dense matrixr   r@   rA   r   T)r   r   include_selfr   r   r   )r   ro   r   rE   N)
r   re   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WWWH1A;x     ((**A...186  D !!!$$H""#3#3H#=#=>>I),,,,,r-   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(   r:   )xys     r+   r   z4test_non_positive_computed_distances.<locals>.metric  s    rr-   r   r!   )r   r   rz   r=   rI   zAll distances .*metric given.*r   )r   r1   r2   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@   rA   r   )r   rE   )r@   rW   )r   r1   rN   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   rE   )r@   r@   )r   r1   rN   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   rz   zBThe parameter init="pca" cannot be used with metric="precomputed".r   r=   rI   r   r   r   r   r   r1   r2   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  |                     | 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   rE   rz   zPCA initialization.*r   r   rW   r   r   s     r+   8test_pca_initialization_not_compatible_with_sparse_inputr    s     U%A>>>D	y(>	?	?	? < <==1a&1a&)9::;;;< < < < < < < < < < < < < < < < < <s   %A  A$'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   rz   z'n_components' should be .*r   r=   rI   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   rA   r   r   r   r!   r   r   rI   r   r   rz   rE   r   ro   r   r   rB   r/   )r   re   rf   r1   rg   r   r   allclose)ro   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   rA   r   r   r   )   r   r!         ?r   rI   r!  )r   re   rf   r1   rg   r   r   n_iter_)ro   r   r#  r   r   rB   r   s          r+   test_max_iter_usedr+  *  s    %a((LL%G2|,,33BJ??A 0 0" 	0 	0H)!#&!	 	 	D q!!!<8a</////	00 0r-   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 )NrI   r=   gbv
gCrgJ!zE?g)x>1?r!   r   gKXAgr}gKXA>gr}?r1   r2   _run_answer_testr   	pos_input
pos_output	neighborsgrad_outputs        r+   test_answer_gradient_two_pointsr4  A  s     3*sCj122I
	',)EF J 1#s$$I(
?	+nn-MN K Y
I{MRRRRRr-   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 )NrI   r=   r   r   333333@皙@$1?m5a ҇&IimU-|3Sٵ?:ǁ$*r!   rA   rb   r   rA   rb   r!   r   rb   r!   rA   r   g\$w?gRn		Qgz}g`>41f>6Sc>gU9&#*@>r-  r/  s        r+    test_answer_gradient_four_pointsrH  R  s     3*sCj3*sCjIJJI=)M*L)M*		
 J )))YYY			999EFFI(_-n-_-n-		
 K Y
I{MRRRRRr-   c           
      2   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 )NrI   r=   r   r   r6  r7  r8  r9  r:  r;  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  F皙?rA   r-  r/  s        r+   test_skip_num_points_gradientrK  m  s     3*sCj3*sCjIJJI=)M*L)M*		
 J )))YYY			999EFFI(#J#J_-n-		
 K :y+}eSRS    r-   FrJ  c                    t          |                               t          j                  }|||f}	|                    t          j                  }|                    t          j        d          }t          |	 }
t          |
                              t          j                  }
t          j        |j        t          j                  } ||
          }|j	                            t          j                  }|j
                            t          j                  }t          j        |j        ||||dddd	  	         t          ||d	
           d S )NFr~   )dtyper)  rA   r!   r   )skip_num_pointsr   rc   )r   rf   r1   rg   int64r   r   rN   rn   r   r   r   gradientrp   r   )r0  r1  r2  r3  r   rH   rz   rN  rq   args	pij_inputgrad_bhr`   r   s                 r+   r.  r.    s$    #9--44RZ@@Ij')D""2:..J   66I$d+I9%%,,RZ88Ihz'rz:::Gi  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   rA   r   )rH   rz   rW   z[t-SNE]znearest neighbors...z"Computed conditional probabilitiesz
Mean sigmazearly exaggeration)	r   r   re   rL   rM   r   r   rO   rP   )ro   r   r   rQ   rS   s        r+   test_verboserU    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   rz   rW   rA   )r   r   re   r   )ro   r   r   s      r+   test_chebyshev_metricrX    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   rz   rW   rA   )r   r   re   r   
embedding_r1   allisfinite)ro   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"   rA   Fr~   r   r   r   r   rz   rE   ro   r   rH   rB   r   )r   re   rf   r   r   rM  r1   rg   )r   r^  ro   r   r   r   effective_types          r+   
test_64bitrb    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   rV   rA   r   i  r   r`  )r   re   r   r   r1   isnanr   )r   ro   r   r   s       r+   test_kl_divergence_not_nanre    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@   )rA   rb   rW   rI   r   rY   r!   r   r   )anglerN  rH   rc   rb   )floatr   re   r   r   r   r   r   r   r   r   r   r   r   r   )rg  rz   r   r   r   degrees_of_freedomro   rp   rq   r   r`   kl_exact
grad_exactr   distances_csrP_bhkl_bhrS  s                     r+   test_barnes_hut_anglero     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#   rA   g    חAi_  r   )rC   rH   rE   ro   r   rB   r   r!   z@did not make any progress during the last -1 episodes. Finished.)r   re   r   _N_ITER_CHECK_EXPLORATION_MAX_ITERrL   rM   r   r   rO   rP   )ro   r   r   r   rQ   rS   s         r+   test_n_iter_without_progressrs  *  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@   rA   gMb`?r   )rG   rH   ro   r   
FinishedrJ   zgradient norm =   r!   )r   re   r   rL   rM   r   r   rO   rP   splitfindreplacer   rh  r1   r2   len)ro   r   rG   r   rQ   rS   	lines_outgradient_norm_valueslinestart_grad_normn_smaller_gradient_normss              r+   test_min_grad_normr  I  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   rV   rA   r   r   )rC   rH   ro   r   rB   ru  r#   	Iterationzerror = ,rW   rc   )r   re   r   rL   rM   r   r   rO   rP   ry  	partitionr   r   rh  )ro   r   r   rQ   rS   r  r3   rR   s           r+   test_accessible_kl_divergencer  t  sr   %a((L2q!!A !  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.
    rb   r   rA   r   rV   r   )r   r   ro   rz   rB   r   rE   z{}_{}z:rerunN)rm   r   r   	X_2d_gridformatassert_uniform_gridAssertionErrorr   )r   seedsrB   seedr   Ytry_names          r+   test_uniform_gridr    s     !HHEH - - 
 
 
 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)  rA   )r   r   
kneighborsr   minr1   rl   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   rA   rI   r   r(  g     =@)r   r   rE   r   ro   rB   rz   rg  r   r   g-C6?r   )
r   re   rf   r1   rg   r   rr  r   r*  r   )ro   r   r   X_embeddedsrB   r   r   s          r+   test_bh_match_exactr    s     &a((LJ2z**11"*==AKH) ( (	
 	
 	
 &'""0033F<G 66666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  rA   r!   rb   rW   r   r   r   rY   )rg  rN  rH   num_threads)rA   r   gư>r   )r   re   rf   r1   rg   r   r   r   r   r   r   )r   r   r   ri  rg  rz   ro   rp   r   r   rl  rm  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   rb   rA   rV   r   r   r   )r   r   r   ro   rB   r   rE   r   N)
r   xfailr   re   rf   r1   rg   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"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  rA   rX   r!   r   r   )r   r   rz   rg  n_jobsro   r   rE   N)r   re   r   r   r   )r   ro   r   r   X_tr_refX_trs         r+   test_tsne_n_jobsr  L  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   rb   )rz   rB   rE   r   r   ro   r   mahalanobisz4Must provide either V or VI for Mahalanobis distancer   Nr   T)checksr   V)r   metric_paramsr:   )r   re   r   r   r   r   r   r   r   r1   covr   r   )
ro   r   r   r   default_paramsr   r  precomputed_XX_trans_expectedX_transs
             r+   #test_tsne_with_mahalanobis_distancer  j  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rz   )   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  rA   r   r   )rE   r   rz   ro   z&perplexity must be less than n_samplesr   Nr   re   r   r   r   r   r   )rz   ro   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   rA   )r   N)r   importorskipr   r1   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c                     t          d          } |                     dd          }t          d          }d}t          j        t
          |          5  |                    |           ddd           dS # 1 swxY w Y   dS )	z$Check `n_iter` parameter deprecated.r   r  r@   r   )n_iterz"'n_iter' was renamed to 'max_iter'r   N)r   re   r   r   warnsFutureWarningr   ro   r   r   r  s       r+   test_tnse_n_iter_deprecatedr    s    %a((L2s##AsD
.C	m3	/	/	/  1                 s   A66A:=A: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 )
z9Check error raised when `n_iter` and `max_iter` both set.r   r  r@   r   r   )r  rB   z0Both 'n_iter' and 'max_iter' attributes were setr   Nr  r  s       r+   "test_tnse_n_iter_max_iter_both_setr    s    %a((L2s##AsS)))D
<C	z	-	-	-  1                 s   A77A;>A;)FrJ  r   )N)srL   ior   numpyr1   r   scipy.sparser   r  numpy.testingr   scipy.optimizer   scipy.spatial.distancer   r   sklearnr   sklearn.datasetsr	   sklearn.exceptionsr
   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   r   sklearn.utils.fixesr   r    r   r  meshgridxxyyhstackr   r   r  rT   rt   r{   r   r   r   r   r   markparametrizer   r   r   r   r   asarrayr   r   r  r  r  r  r  r  r  r  r&  r+  r4  rH  rK  r.  rU  rX  r]  rg   float64rb  re  ro  rs  r  r  r  r  r  r  r  r  r  r  r  r  r  r:   r-   r+   <module>r     s	   



                  ) ) ) ) ) ) % % % % % % 4 4 4 4 4 4 4 4 " " " " " " ' ' ' ' ' ' 0 0 0 0 0 0                       > = = = = =         
 A @ @ @ @ @ @ @ , , , , , ,              ? > > > > > > >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\#:;;.99Y Y :9 <;Y*  ,   	"*	rz" 
M	L^	L	L	L  %#45+Sz	"O4 	& 	&  	& .99	< 	< :9	< .99% % :9% +,,,+^n-LMM- - NM -,-&	 	 	7 7 7# # #5 5 5 .99< < :9<5 5 59 9 9B0 0 0. .99S S :9S  .99S S :9S4 .99  :9J ? ? ? ?:' ' ',  + + + L'#:;;
BJ788( ( 98 <;(. L'#:;;- - <;-*'8 '8 '8T Y Y Y<() () ()VF F F@ L'#:;;$- $- <;$-N) ) ) )P P P80< 0< 0<f &'(4D)EF  L'#:;;*K *K <;	 
*KZ G\#:;;$ $ <;$:/ / /< x00  10 0 0 0      r-   