
    rii              	       	   d dl Z 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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. d dl/m0Z0m1Z1  ejd                  d dd      Z3 ejh                  e3e3      \  Z5Z6 ejn                  e5jq                         js                  dd      e6jq                         js                  dd      g      Z:d Z;d Z<d Z=d Z>d Z?d Z@d ZAd ZBej                  j                  dddg      ej                  j                  dd      d                ZEd! ZFej                  j                  dddg      ej                  j                  dd"d#g      ej                  j                  d$e0      d%                      ZGd& ZHd' ZIej                  j                  d(dej                  fdej                  fge0D  cg c]  } d| f c}       ej                  j                  d)d*gd+ggd,fd*d-gd+d*ggd.fg      d/               ZKej                  j                  d$e0      d0        ZLej                  j                  d$e0      d1        ZMej                  j                  d2      ej                  j                  d3e0e1z         d4               ZOd5 ZPd6 ZQd7 ZRd8 ZSd9 ZTd: ZUd; ZVej                  j                  d$e0      d<        ZWej                  j                  d$e0      d=        ZXej                  j                  d$e0      d>        ZY	 	 	 dXd?ZZej                  j                  d@        Z\dA Z]dB Z^ej                  j                  dddg      ej                  j                  dCej                  ej                  g      dD               Zaej                  j                  dddg      dE        ZbdF Zce.dG        ZddH ZedI Zfej                  j                  dddg      dJ        ZgdYdKZhdL ZidM Zjej                  j                  dNdOe#fdPe"fg      ej                  j                  dddg      dQ               Zkej                  j                  dddg      dR        ZldS Zmej                  j                  dTdU      dV        ZndW Zoyc c} w )Z    N)StringIO)assert_allclose)
check_grad)pdist
squareform)config_context)
make_blobs)TSNE_barnes_hut_tsne)_gradient_descent_joint_probabilities_joint_probabilities_nn_kl_divergence_kl_divergence_bhtrustworthiness)_binary_search_perplexity)cosine_distancesmanhattan_distancespairwise_distances)NearestNeighborskneighbors_graph)check_random_state)assert_almost_equalassert_array_almost_equalassert_array_equalskip_if_32bit)CSR_CONTAINERSLIL_CONTAINERS   
   c                 D    G d d      }dd}t         |       t        j                  d      dddddddd	

      \  }}}|dk(  sJ |dk(  sJ d| j                         j                  v sJ t        |t        j                  d      dddddddd	

      \  }}}|dk(  sJ |dk(  sJ d| j                         j                  v sJ t         |       t        j                  d      dddddddd	

      \  }}}|dk(  sJ |dk(  sJ d| j                         j                  v sJ y )Nc                       e Zd Zd ZddZy);test_gradient_descent_stops.<locals>.ObjectiveSmallGradientc                     d| _         y Nr!   )it)selfs    _/var/www/auto_recruiter/arenv/lib/python3.12/site-packages/sklearn/manifold/tests/test_t_sne.py__init__zDtest_gradient_descent_stops.<locals>.ObjectiveSmallGradient.__init__9   s	    DG    c                 |    | 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__<   s2    GGqLGLD("((D6*:::r+   NT)__name__
__module____qualname__r*   r3    r+   r)   ObjectiveSmallGradientr$   8   s    		;r+   r9   c                 0    dt        j                  d      fS )N        r   )r/   ones)r1   r2   s     r)   flat_functionz2test_gradient_descent_stops.<locals>.flat_function@   s    BGGAJr+   r   r   d   r;   r.      )max_itern_iter_without_progressmomentumlearning_ratemin_gainmin_grad_normverbose      ?gradient normr       zdid not make any progresszIteration 10r4   )r   r/   zeros
readouterrout)capsysr9   r=   r1   errorr'   s         r)   test_gradient_descent_stopsrO   6   sa   ; ; % 
	 #LAub C<<7N7f//155555 %
	 "LAub C<<8O8&&*;*;*=*A*AAAA % 
	 #LAub C<<8O8V..044444r+   c                  N   t        d      } | j                  dd      }t        |      j                  t        j
                        }d}t        ||d      }t	        j                  |t	        j                  t        j                        j                        }t	        j                  t        |j                  d         D cg c]G  }t	        j                  t	        j                  ||   t	        j                   ||         z               I c}      }t#        ||d       y c c}w )Nr   2            9@rF      decimal)r   randnr   astyper/   float32r   maximumfinfodoubleepsmeanrangeshapeexpsumlogr   )random_statedata	distancesdesired_perplexityPimean_perplexitys          r)   test_binary_searchrl   w   s    %a(Lb!$D"4(//

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


1bhhryy)--.Agg7<QWWQZ7HI!!rvvad|+,,	-IO );QG 	Js    AD"c            
      4   t        d      } | j                  dd      j                  t        j                        dz   }d}t        ||d      }dt        j                  |ddd f   t        j                  |ddd f         z         z  }t        ||d	
       y )N*   r   Z   r>   g      >@r   rT   r?   rU   rV   )	r   rX   rY   r/   rZ   r   nansumlog2r   )re   rf   rh   ri   
perplexitys        r)   test_binary_search_underflowrs      s     &b)La$++BJJ7#=D!$(:AFAryy1ab5BGGAaeH,=!=>>>J
$6Br+   c                     d} d}t        d      }|j                  | d      j                  t        j                  d      }t        |      }t        ||d      }| dz
  }t               j                  |      }|j                  |d	
      }|j                  j                  t        j                  d      }	|	j                  | |      }	t        |	|d      }
|j                  }t        j                  t        |       D cg c]  }|||j                  ||   ||dz       f   ! c}      }t!        ||
d       t        j"                  d| dz
  d      D ]  }t%        |      }|dz  }|j                  |d	
      }|j                  j                  t        j                  d      }	|	j                  | |      }	t        |	|d      }t!        ||
d       t        j&                  |j)                               d d d   }|j)                         |   d | }t        j&                  |j)                               d d d   }|j)                         |   d | }t!        ||d        y c c}w )N   rS   r   r?   FcopyrT   r   distancen_neighborsmode   rV      rR   r    r!   )r   rX   rY   r/   rZ   r   r   r   fitr   rf   reshapeindptrr0   r`   indicesr   linspaceintargsortravel)	n_samplesrh   re   rf   rg   P1rz   nndistance_graphdistances_nnP2r   kP1_nntopnP2kidxP1topP2tops                      r)   test_binary_search_neighborsr      s@    I%a(Li+222::E2JD"4(I	"9.@!	LB a-K					%B(([z(RN!&&--bjju-EL''	;?L	"<1CQ	OB""FHH 9%	
 q.((VAE]CCD	
E eR3 [[i!mQ/ ;F2v,,,L%**11"**51I#++Iq9'6HRST!%Q7jj$TrT*
3&jj%dd+		C $'!%:;	
s   >$I!c                     d} d}t        d      }|j                  |d      }t               j                  |      }|j	                  | d      }|j
                  j                  t        j                  d      }|j                  ||       }d }d	}t        d      D ]_  }	t        |j                         |d
      }
t        ||d
      }|j                         }||
}|}Dt        |
|d       t        |d       a y )Nr    r>   r   rR   rx   ry   Frv   rU   rT   r|   rV   )r   rX   r   r~   r   rf   rY   r/   rZ   r   r`   r   rw   r   toarrayr   )rz   r   re   rf   r   r   rg   last_Prh   r1   ri   r   last_P1s                r)    test_binary_perplexity_stabilityr      s     KI%a(Li+D					%B(([z(RN##**2::E*BI!!)[9IF3Z 
>%inn&68JTUV$^5GQRSZZ\>FG%a;%b'1=
>r+   c                     	 t        d      } d	d}dd| j                  	|      j                  t        j                        }t        j
                  |j                  |j                              }t        j                  |d       | j                  	      j                  t        j                        }t        |dd      	fd}	fd	}t        t        |||j                               dd
       y )Nr   rQ   r?   rG   r;   rS   )rh   rF   c                 (    t        |       d   S )Nr   r   paramsri   alphan_componentsr   s    r)   funztest_gradient.<locals>.fun       fa	<HKKr+   c                 (    t        |       d   S )Nr   r   r   s    r)   gradztest_gradient.<locals>.grad   r   r+   rR   rV   )r   rX   rY   r/   rZ   absdotTfill_diagonalr   r   r   r   )
re   
n_featuresrg   
X_embeddedr   r   ri   r   r   r   s
         @@@@r)   test_gradientr      s    %a(LIJLE""9j9@@LIy}}Y[[12IY$##I|<CCBJJOJY4KALL 
3j.>.>.@A3PQRr+   c                     t        d      } | j                  dd      }t        |d|dz  z         dk(  sJ t        j                  d      j                  dd      }|j                         }| j                  |       t        ||      d	k  sJ t        j                  d
      j                  dd      }t        j                  dgdgdgdgdgg      }t        t        ||d      d       y )Nr   r>   r?         @r-   rG   r!   r   g333333?rR   r|   rU   rz   g?)
r   rX   r   r/   aranger   rw   shuffler0   r   )re   Xr   s      r)   test_trustworthinessr      s    %a(L 	3"A1cAHn-444 			#r1%AJ$1j)C/// 			!R#AA3aS1#s34J:1EsKr+   c                  F   d} t         j                  j                  d      }|j                  dd      }|j                  dd      }t	        j
                  t        |       5  t        ||d       d	d	d	       t        ||d
      }d|cxk  rdk  sJ  J y	# 1 sw Y   (xY w)z[Raise an error when n_neighbors >= n_samples / 2.

    Non-regression test for #18567.
    z%n_neighbors .+ should be less than .+rn      r|   r?   matchrR   r   NrU   r   r   )r/   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:156 Azq9E????	6 6s   !BB methodexact
barnes_hutinit)r   pcac                     t        d      }d}|j                  d|      j                  t        j                        }t        ||d| dd      }|j                  |      }t        ||d      }|d	kD  sJ y )
Nr   r?   rQ   i  auto)r   r   re   r   r@   rC   r   r   g333333?)r   rX   rY   r/   rZ   r
   fit_transformr   )r   r   re   r   r   tsner   ts           r)   +test_preserve_trustworthiness_approximatelyr     s{     &a(LL2|,33BJJ?A!D ##A&J:15At8O8r+   c            	          t        d      } t        d|       \  }}g }dD ]?  }t        dddd|d	      }|j                  |       |j	                  |j
                         A |d
   |d   k  sJ |d   |d
   k  sJ y)z=t-SNE should give a lower KL divergence with more iterations.r   rU   )r   re   )   ,  i^  r?   r   r          Y@)r   r   rr   rC   r@   re   r   N)r   r	   r
   r   appendkl_divergence_)re   r   r1   kl_divergencesr@   r   s         r)   )test_optimization_minimizes_kl_divergencer   )  s    %a(L>DAqN# 
3
 	1d112
3 !q 1111!q 1111r+   r   r   csr_containerc           	         t        d      }|j                  dd      }d||j                  ddd      |j                  ddd      f<    ||      }t        d|ddd| d	
      }|j	                  |      }t        t        ||d      dd       y )Nr   rQ   rU   r;      r?   r    r   i  )r   r   rr   rC   re   r   r@   r   r   rG   g)\(?rtol)r   rX   randintr
   r   r   r   )r   r   r   r   r   X_csrr   r   s           r)   test_fit_transform_csr_matrixr   =  s     Q
C		"aA9<As{{1b"s{{1a456!ED ##E*JOE:1EsQWXr+   c                      t        d      } t        d      D ]d  }| j                  dd      }t        t	        |      d      }t        ddddd|dd	d
	      }|j                  |      }t        ||dd      }|dkD  rdJ  y )Nr   rU   P   r?   sqeuclideanr          @precomputed  r   )	r   rr   rC   early_exaggerationmetricre   rF   r@   r   r   )rz   r   gffffff?)r   r`   rX   r   r   r
   r   r   )re   rj   r   Dr   r   r   s          r)   Ftest_preserve_trustworthiness_approximately_with_precomputed_distancesr   U  s    %a(L1X r1%uQx/" 

 ''*
AzqO4xx!r+   c                      t        d      } | j                  dd      }t        ||d      t        t        |d      |d      k(  sJ y )Nr   r>   r?   cosiner   r   )r   rX   r   r   )re   r   s     r)   )test_trustworthiness_not_euclidean_metricr   k  sP     &a(L3"A1a1_1X.-6   r+   zmethod, retypezD, message_regexr;   rG   z.* square distance matrixg      z.* positive.*c                     t        d| ddd      }t        j                  t        |      5  |j	                   ||             d d d        y # 1 sw Y   y xY w)Nr   r   rn   r   r   r   r   re   rr   r   )r
   r   r   r   r   )r   r   retypemessage_regexr   s        r)   test_bad_precomputed_distancesr   u  sT      D 
z	7 &6!9%& & &s   AAc                     t        ddddd      }t        j                  t        d      5  |j	                   | d	d
gd
d	gg             d d d        y # 1 sw Y   y xY w)Nr   r   r   rn   r   r   sparser   r   rR   )r
   r   r   	TypeErrorr   )r   r   s     r)    test_exact_no_precomputed_sparser     s`    D 
y	1 <=1a&1a&)9:;< < <s   AAc                     t        j                  g dg dg dg      } | |      }t        dddd      }d}t        j                  t
        |	      5  |j                  |       d d d        y # 1 sw Y   y xY w)
N)rG   r;   r;   )r;   rG   r;   r   r   rn   r   )r   r   re   rr   zB3 neighbors per samples are required, but some samples have only 1r   )r/   r0   r
   r   r   r   r   )r   distbad_distr   msgs        r)   1test_high_perplexity_precomputed_sparse_distancesr     sj     88_oGHDT"H}8"QRSD
NC	z	- %8$% % %s   A..A7zaignore:Precomputed sparse input was not sorted by row values:sklearn.exceptions.EfficiencyWarningsparse_containerc                 Z   t        d      }|j                  dd      }t        |ddd      }t        |      }t	        j
                  |      sJ t        |j                         |       t        dddd	
      }|j                  |      }|j                   | |            }t        ||       y)zAMake sure that TSNE works identically for sparse and dense matrixr   r>   r?   rx   T)rz   r{   include_selfr   r   r   )r   re   r   rC   N)
r   rX   r   r   spissparser   r   r
   r   )r   re   r   D_sparser   r   Xt_dense	Xt_sparses           r)    test_sparse_precomputed_distancer     s     &a(L3"AsRVWH1A;;x   ((*A.186D !!!$H""#3H#=>I),r+   c                      d } t        | dd      }t        j                  ddgddgg      }t        j                  t
        d      5  |j                  |       d d d        y # 1 sw Y   y xY w)	Nc                      yr&   r8   )xys     r)   r   z4test_non_positive_computed_distances.<locals>.metric  s    r+   r   r   )r   r   rr   r;   rG   zAll distances .*metric given.*r   )r
   r/   r0   r   r   r   r   )r   r   r   s      r)   $test_non_positive_computed_distancesr    sd     vg!<D
3*sCj)*A	z)I	J 1  s   A##A,c                      t        t        j                  d      d      } | j                  t        j                  d            }t        t        j                  d      |       y )Nr>   r?   r   )r   rC   )r>   rR   )r
   r/   rJ   r   r<   r   )r   r   s     r)   test_init_ndarrayr    sC    RXXh'v>D##BGGH$56Jrxx):6r+   c                      t        t        j                  d      dd      } | j                  t        j                  d             y )Nr  r   g      I@)r   r   rC   )r>   r>   )r
   r/   rJ   r~   r   s    r)   test_init_ndarray_precomputedr
    s7     XXhD
 	HHRXXj!"r+   c                      t        ddd      } t        j                  t        d      5  | j	                  t        j                  dgdgg             d d d        y # 1 sw Y   y xY w)	Nr   r   r   )r   r   rr   zBThe parameter init="pca" cannot be used with metric="precomputed".r   r;   rG   r
   r   r   r   r   r/   r0   r	  s    r)   >test_pca_initialization_not_compatible_with_precomputed_kernelr    sX    }5Q?D	R
 5 	288cUSEN34	5 5 5   )AA%c                      t        ddd      } t        j                  t        d      5  | j	                  t        j                  dgdgg             d d d        y # 1 sw Y   y xY w)	Nr|   r   r   )r   r   rr   z'n_components' should be .*r   r;   rG   r  r	  s    r)   test_n_components_ranger    sS    Q|BD	z)F	G 5288cUSEN345 5 5r  c                  R   t        d      } d}ddg}| j                  d|      j                  t        j                        }|D ]b  }t        |dddd|d	d
      }|j                  |      }t        |dddd|dd
      }|j                  |      }t        j                  ||      sbJ  y )Nr   r?   r   r   r   r   r   r   rG   r   r   rr   rC   r   re   r   r   r@   r-   )r   rX   rY   r/   rZ   r
   r   allclose)re   r   methodsr   r   r   X_embedded1X_embedded2s           r)   test_early_exaggeration_usedr    s    %a(LL%G2|,33BJJ?A 9%"	
 ((+%#	
 ((+;;{K88819r+   c                     t        d      } d}ddg}| j                  d|      j                  t        j                        }|D ]A  }dD ]:  }t        |ddd	d|d
|      }|j                  |       |j                  |dz
  k(  r:J  C y )Nr   r?   r   r   r   )   r   r         ?r   rG   r  )r   rX   rY   r/   rZ   r
   r   n_iter_)re   r   r  r   r   r@   r   s          r)   test_max_iter_usedr    s    %a(LL%G2|,33BJJ?A 0" 	0H)!#&!	D q!<<8a<///	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        |||||        y )NrG   r;   gbv
gCrgJ!zE?g)x>1?r   r   gKXAgr}gKXA>gr}?r/   r0   _run_answer_testr   	pos_input
pos_output	neighborsgrad_outputs        r)   test_answer_gradient_two_pointsr%  '  s     3*sCj12I
	',)EFJ 1#s$I((
?	+nn-MNK Y
I{M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        |||||        y )NrG   r;   r   r   333333@皙@$1?m5a ҇&IimU-|3Sٵ?:ǁ$*r   r?   rU   r   r?   rU   r   r   rU   r   r?   r   g\$w?gRn		Qgz}g`>41f>6Sc>gU9&#*@>r  r   s        r)    test_answer_gradient_four_pointsr9  8  s     3*sCj3*sCjIJI=)M*L)M*		
J )Y	9EFI((_-n-_-n-		
K Y
I{MRr+   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       y )NrG   r;   r   r   r'  r(  r)  r*  r+  r,  r-  r.  r/  r0  r1  r2  r3  r4  r5  r6  r7  r8  F皙?r?   r  r   s        r)   test_skip_num_points_gradientr<  S  s     3*sCj3*sCjIJI=)M*L)M*		
J )Y	9EFI((#J#J_-n-		
K :y+}eSRSr+   c                    t        |       j                  t        j                        }|||f}	|j                  t        j                        }|j                  t        j                  d      }t        |	 }
t        |
      j                  t        j                        }
t        j                  |j                  t        j                        } ||
      }|j                  j                  t        j                        }|j                  j                  t        j                        }t        j                  |j                  ||||dddd	       t        ||d	
       y )NFrv   )dtyper  r?   r   r   )skip_num_pointsr|   rV   )r   rY   r/   rZ   int64r   r   rJ   ra   r   r   r   gradientrf   r   )r!  r"  r#  r$  r   rF   rr   r?  rg   args	pij_inputgrad_bhri   r   s                 r)   r  r  s  s     #9-44RZZ@Ij')D""2::.J   6I$d+I9%,,RZZ8Ihhz''rzz:Gi A		  *IXX__RXX&F	
IvwQST g{A>r+   c                  $   t        d      } t        dd      }| j                  dd      }t        j                  }t               t        _        	 |j                  |       t        j                  j                         }t        j                  j                          |t        _        d|v sJ d|v sJ d|v sJ d	|v sJ d
|v sJ y # t        j                  j                         }t        j                  j                          |t        _        w xY w)Nr   r?   r|   )rF   rr   rR   z[t-SNE]znearest neighbors...z"Computed conditional probabilitiesz
Mean sigmazearly exaggeration)	r   r
   rX   sysstdoutr   r   getvalueclose)re   r   r   
old_stdoutrL   s        r)   test_verboserK    s     &a(La(D1a AJCJ 1jj!!#

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


s   C A	Dc                  z    t        d      } t        dd      }| j                  dd      }|j                  |       y )Nr   	chebyshevr|   )r   rr   rR   r?   )r   r
   rX   r   )re   r   r   s      r)   test_chebyshev_metricrN    s8    %a(L{q1D1a Aqr+   c                      t        d      } t        dd      }| j                  dd      }|j                  |      j                  }t        j                  t        j                  |            sJ y )Nr   r   r|   )r   rr   rR   r?   )r   r
   rX   r~   
embedding_r/   allisfinite)re   r   r   r   s       r)   test_reduction_to_one_componentrS    sX    %a(LQ1-D1a A!''J66"++j)***r+   dtc           
          t        d      }|j                  dd      j                  |d      }t        dddd| ddd	      }|j	                  |      }|j
                  }|t        j                  k(  sJ y )
Nr   r    r?   Frv   r   r   r   r   rr   rC   re   r   rF   r@   r   )r   rX   rY   r
   r   r>  r/   rZ   )r   rT  re   r   r   r   effective_types          r)   
test_64bitrX    s     &a(L2q!((%(8A	D ##A&J%%N RZZ'''r+   c           
          t        d      }|j                  dd      }t        dddd| ddd      }|j                  |       t	        j
                  |j                        rJ y )Nr   rQ   r?   r   i  r   rV  )r   rX   r
   r   r/   isnanr   )r   re   r   r   s       r)   test_kl_divergence_not_nanr[    sm     &a(L2q!A	D 	qxx++,,,,r+   c                     d} d}d}dD ]  }d}t        |dz
        }t        d      }|j                  ||      }t        |      }|j                  ||      }	t	        ||d      }
t        |	|
|||      \  }}|d	z
  }t               j                  |      j                  |d
      }t        ||d      }t        |	||||| dd      \  }}t        |
      }
|j                         }t        ||
d       t        ||d        y )Nr;   r    r>   )r?   rU   rR   rG   r   rT   r   rx   ry   )angler?  rF   rV   rU   )floatr   rX   r   r   r   r   r~   r   r   r   r   r   r   r   )r]  rr   r   r   r   degrees_of_freedomre   rf   rg   r   ri   kl_exact
grad_exactrz   distances_csrP_bhkl_bhrD  s                     r)   test_barnes_hut_anglere    s*   EJI "8
"<##56)!,!!)Z8&t,	##I|< JB-A)9l 
*  !mSY+JG 	
 '}j!L*	
w qM||~!$15HeQ7E"8r+   c           
          t        d      }|j                  dd      }dD ]Q  }t        dddd|dd	
      }d|_        d|_        |j                  |       d| j                         j                  v rQJ  y )Nr   r>   r    )r   r   r!   r?   g    חAi_  r   )rA   rF   rC   re   r   r@   r   r   z@did not make any progress during the last -1 episodes. Finished.)r   rX   r
   _N_ITER_CHECK_EXPLORATION_MAX_ITERr   rK   rL   )rM   re   r   r   r   s        r)   test_n_iter_without_progressri    s     &a(L3#A) 
$&
 %&"1 O  "&&'	
'!
r+   c                     t        d      }|j                  dd      }d}t        |ddd      }|j                  |       | j	                         j
                  j                  d      }g }|D ]b  }d|v r n\|j                  d	      }|dk\  s ||d  }|j                  d
d      j                  d      d   }|j                  t        |             d t        j                  |      }t        |||k           }	|	dk  sJ y )Nr   r>   r?   gMb`?r   )rE   rF   re   r   
FinishedrH   zgradient norm =   r   )r   rX   r
   r   rK   rL   splitfindreplacer   r^  r/   r0   len)
rM   re   r   rE   r   	lines_outgradient_norm_valueslinestart_grad_normn_smaller_gradient_normss
             r)   test_min_grad_normrx  +  s   %a(L3"AMmQQwWDq!!#''--d3I  
5 ))O4a()D<< 2B7==cB1ED ''d4
5 88$89"1]BC  $q(((r+   c                    t        d      }|j                  dd      }t        ddddd      }|j                  |       | j	                         j
                  j                  d      d d d   D ]5  }d	|v s|j                  d
      \  }}}|s |j                  d      \  }}} n t        |j                  t              d       y )Nr   rQ   r?   r   r   )rA   rF   re   r   r@   rk  r!   	Iterationzerror = ,rR   rV   )r   rX   r
   r   rK   rL   ro  	partitionr   r   r^  )rM   re   r   r   ru  r1   rN   s          r)   test_accessible_kl_divergencer}  N  s    %a(L2q!A !D 	q !!#''--d3DbD9 $..4KAq%#ooc2q! ++U5\1Er+   c           
      0   t        d      }d}|D ]H  }t        dd|d|| d      }|j                  t              }dj	                  | |      }	 t        ||       J y
# t        $ r0 |d	z  }||_        |j                  t              }t        ||       Y w xY w)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.
    rU   r   r?   r   rQ   r   )r   r   re   rr   r@   r   rC   z{}_{}z:rerunN)r`   r
   r   	X_2d_gridformatassert_uniform_gridAssertionErrorr   )r   seedsr@   seedr   Ytry_names          r)   test_uniform_gridr  f  s     !HEH - 
 y)>>&$/		-8,-  	-  HDI""9-A8,	-s   A6BBc                 r   t        d      j                  |       }|j                  d      d   j                         }|j	                         dkD  sJ |j	                         t        j                  |      z  }|j                         t        j                  |      z  }|dkD  sJ |       |dk  sJ |       y )	Nr   r   T)return_distancer   r;  r  r?   )r   r~   
kneighborsr   minr/   r_   max)r  r  r   
dist_to_nnsmallest_to_meanlargest_to_means         r)   r  r    s     
a	(	,	,Q	/Bt4Q7==?J>>c!!!!~~'"''**== nn&)<<Oc!+8+!Q((r+   c                  N   t        d      } d}| j                  d|      j                  t        j                        }i }i }dD ]?  }t        d|ddddd	d
      }d|_        |j                  |      ||<   |j                  ||<   A |d   |d   k(  sJ t        |d   |d   d       y )Nr   r       )r   r   r?   rG   r   r  g     =@)r   r   rC   r   re   r@   rr   r]  r   r   g-C6?r   )
r   rX   rY   r/   rZ   r
   rh  r   r  r   )re   r   r   X_embeddedsr@   r   r   s          r)   test_bh_match_exactr    s     &a(LJ2z*11"**=AKH) (	
 &'""003F<<(  G 6666K(+l*C$Or+   c                     d} d}d}d}d}d}t        d      }|j                  ||       j                  t        j                        }|j                  ||      }|dz
  }	t               j                  |      j                  |	d	      }
t        |
|d
      }t        ||||||ddd	      \  }}dD ]3  }t        ||||||dd|	      \  }}t        ||d       t        ||       5 y )Nr    r  r?   r   rU   rR   r   rx   ry   rT   )r]  r?  rF   num_threads)r?   r|   gư>r   )r   rX   rY   r/   rZ   r   r~   r   r   r   r   )r   r   r   r_  r]  rr   re   rf   r   rz   rb  rc  kl_sequentialgrad_sequentialr  kl_multithreadgrad_multithreads                    r)   -test_gradient_bh_multithread_match_sequentialr    s    JILEJ%a(Li4;;BJJGD	<8Fa-K	T		k
		C 
 #=*aHD%6
&"M?  <+<#
,
(( 	DA(*:;<r+   zmetric, dist_func	manhattanr   c           	      f   |dk(  r| dk(  rt        j                  d       t        d      }d}d}|j                  d|      j	                  t
        j                        }t        | ||ddd	d
      j                  |      }t        d||ddd	d
      j                   ||            }t        ||       y)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   rU   r?   rQ   r   r   r   )r   r   r   re   r@   r   rC   r   N)
r   xfailr   rX   rY   r/   rZ   r
   r   r   )	r   	dist_funcr   re   n_components_originaln_components_embeddingr   X_transformed_tsneX_transformed_tsne_precomputeds	            r)   )test_tsne_with_different_distance_metricsr    s     &K"7 	5	

 &a(L245<<RZZHA+ mA  &*+& mIaL! # )+IJr+   c           
          t        d      }d}|j                  d|      }t        d| dddddd	      j                  |      }t        d| dddddd	      j                  |      }t	        ||       y
)z=Make sure that the n_jobs parameter doesn't impact the outputr   r    r  r?   rS   r   r   r   )r   r   rr   r]  n_jobsre   r   rC   N)r   rX   r
   r   r   )r   re   r   r   X_tr_refX_trs         r)   test_tsne_n_jobsr    s     &a(LJ2z*A	 mA  	 mA 	 Hd#r+   c                     t        d      } d\  }}| j                  ||      }ddddddd}t        dd	d
i|}d}t        j                  t
        |      5  |j                  |       ddd       t        t        |d
      d      }t        dd	di|j                  |      }t        dd
dt        j                  |j                        id|j                  |      }	t        |	|       y# 1 sw Y   xY w)zAMake sure that method_parameters works with mahalanobis distance.r   )r   r    (   r   r   r   rU   )rr   r@   rC   r   r   re   r   mahalanobisz4Must provide either V or VI for Mahalanobis distancer   Nr   T)checksr   V)r   metric_paramsr8   )r   rX   r
   r   r   r   r   r   r   r/   covr   r   )
re   r   r   r   default_paramsr   r   precomputed_XX_trans_expectedX_transs
             r)   #test_tsne_with_mahalanobis_distancer  <  s
   %a(L#Iz9j1AN 7}77D
@C	z	- 1 uQ}=dKMC=CNCQQ  S"&&+,>BPmA  G-. s   C--C6rr   )   r  c                    t        d      }|j                  dd      }t        dd| |      }t        j                  d|  d      }t        j                  t        |	      5  |j                  |       d
d
d
       y
# 1 sw Y   y
xY w)z=Make sure that perplexity > n_samples results in a ValueErrorr   r  r?   r   r   )rC   r   rr   re   zperplexity (z") must be less than n_samples (20)r   N)	r   rX   r
   reescaper   r   r   r   )rr   re   r   estr   s        r)   test_tsne_perplexity_validationr  Z  s     &a(L2q!A
!	C ))l:,.PQ
RC	z	- !  s   !A<<Bc                      t        j                  d       t        d      5  t        j                  d      j                  dd      } t        d      j                  |        ddd       y# 1 sw Y   yxY w)	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   r/   r   r   r
   r   )arrs    r)   "test_tsne_works_with_pandas_outputr  k  s]    
 !		2 0ii''A.!**3/0 0 0s   AA,,A5)Fr;  r   )N)pr  rF  ior   numpyr/   r   scipy.sparser   r   numpy.testingr   scipy.optimizer   scipy.spatial.distancer   r   sklearnr   sklearn.datasetsr	   sklearn.manifoldr
   r   sklearn.manifold._t_sner   r   r   r   r   r   sklearn.manifold._utilsr   sklearn.metrics.pairwiser   r   r   sklearn.neighborsr   r   sklearn.utilsr   sklearn.utils._testingr   r   r   r   sklearn.utils.fixesr   r   r   r  meshgridxxyyhstackr   r   r  rO   rl   rs   r   r   r   r   r   markparametrizer   r   r   r   r   asarrayr   r   r   filterwarningsr   r  r  r
  r  r  r  r  r%  r9  r<  r  thread_unsaferK  rN  rS  rZ   float64rX  r[  re  ri  rx  r}  r  r  r  r  r  r  r  r  r  )r   s   0r)   <module>r     sM   	 
     ) % 4 " '  > 
 A ,  ?BKK1b	Q	BBII

2q!

2q!	>5BH	C);X>6S2L(  G\#:;!23 4 <$2( G\#:;(E!23.9Y : 4 <Y*, 	"**	rzz" >L	LM<
'	L %#45+Sz	"O4	&	& .9	< :	< .9% :% 6 +^n-LM- N	
-&	7#559B0. .9S :S  .9S :S4 .9 :J ?: ' ',+ L'#:;

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