U
    ‘Ç-e•  ã                   @   sô  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 e 1d dd¡Z2e 3e2e2¡\Z4Z5e 6e4 7¡  8dd¡e5 7¡  8dd¡g¡Z9dd„ Z:dd„ Z;dd„ Z<dd„ Z=dd„ Z>dd„ Z?dd „ Z@d!d"„ ZAejB Cd#d$d%g¡ejB Cd&d'¡d(d)„ ƒƒZDd*d+„ ZEejB Cd#d$d%g¡d,d-„ ƒZFd.d/„ ZGd0d1„ ZHejB Cd2d$ejIfd%ejIfd%ejJfg¡ejB Cd3d4gd5ggd6fd4d7gd5d4ggd8fg¡d9d:„ ƒƒZKd;d<„ ZLd=d>„ ZMe/ed?d@dA„ ƒZNdBdC„ ZOdDdE„ ZPdFdG„ ZQdHdI„ ZRdJdK„ ZSdLdM„ ZTdNdO„ ZUdPdQ„ ZVdRdS„ ZWdTdU„ ZXdVdW„ ZYd†dZd[„ZZd\d]„ Z[d^d_„ Z\d`da„ Z]ejB Cd#d%d$g¡ejB Cdbej^ej_g¡dcdd„ ƒƒZ`ejB Cd#d%d$g¡dedf„ ƒZadgdh„ Zbe0didj„ ƒZcdkdl„ Zddmdn„ ZeejB Cd#d%d$g¡dodp„ ƒZfd‡dqdr„Zgdsdt„ Zhdudv„ ZiejB Cdwdxe$fdye#fg¡ejB Cd#d%d$g¡dzd{„ ƒƒZjejB Cd#d$d%g¡d|d}„ ƒZkd~d„ ZlejB Cd€d¡d‚dƒ„ ƒZmd„d…„ Znd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é   é
   éÿÿÿÿc                  C   sž  G dd„ dƒ} ddd„}t j}tƒ t _z.t| ƒ t d¡dddd	d	d	d
dd
\}}}W 5 t j ¡ }t j ¡  |t _X |dks~t‚|dksŠt‚d|ks–t‚t j}tƒ t _z,t|t d¡dddd	d	d	d	dd
\}}}W 5 t j ¡ }t j ¡  |t _X |d	ksút‚|dkst‚d|kst‚t j}tƒ t _z.t| ƒ t d¡dddd	d	d	d	dd
\}}}W 5 t j ¡ }t j ¡  |t _X |d	ks~t‚|dksŒt‚d|ksšt‚d S )Nc                   @   s   e Zd Zdd„ Zddd„ZdS )z;test_gradient_descent_stops.<locals>.ObjectiveSmallGradientc                 S   s
   d| _ d S ©Nr    )Úit)Úself© r$   úb/var/www/html/Darija-Ai-Train/env/lib/python3.8/site-packages/sklearn/manifold/tests/test_t_sne.pyÚ__init__9   s    zDtest_gradient_descent_stops.<locals>.ObjectiveSmallGradient.__init__Tc                 S   s(   |  j d7  _ d| j  d t dg¡fS )Nr   r   ç      $@çñhãˆµøä>)r"   ÚnpÚarray)r#   Ú_Úcompute_errorr$   r$   r%   Ú__call__<   s    zDtest_gradient_descent_stops.<locals>.ObjectiveSmallGradient.__call__N)T)Ú__name__Ú
__module__Ú__qualname__r&   r-   r$   r$   r$   r%   ÚObjectiveSmallGradient8   s   r1   Tc                 S   s   dt  d¡fS )Nç        r   )r)   Úones)r+   r,   r$   r$   r%   Úflat_function@   s    z2test_gradient_descent_stops.<locals>.flat_functionr   r   éd   r2   r(   é   )Ún_iterÚn_iter_without_progressZmomentumÚlearning_rateZmin_gainÚmin_grad_normÚverboseç      ð?úgradient normr   é   zdid not make any progresszIteration 10)T)	ÚsysÚstdoutr   ÚgetvalueÚcloser   r)   ÚzerosÚAssertionError)r1   r4   Ú
old_stdoutÚoutr+   Úerrorr"   r$   r$   r%   Útest_gradient_descent_stops6   s‚    
ö

ö

ö

rH   c                     s€   t dƒ} |  dd¡}t|ƒ tj¡}d}t||dd‰ t ˆ t tj	¡j
¡‰ t ‡ fdd„tˆ jd ƒD ƒ¡}t||dd	 d S )
Nr   é2   é   ç      9@©r;   c                    s0   g | ](}t  t  ˆ | t  ˆ | ¡ ¡ ¡‘qS r$   )r)   ÚexpÚsumÚlog)Ú.0Úi©ÚPr$   r%   Ú
<listcomp>•   s     z&test_binary_search.<locals>.<listcomp>é   ©Údecimal)r   Úrandnr   Úastyper)   Úfloat32r   ÚmaximumZfinfoÚdoubleZepsÚmeanÚrangeÚshaper   )Úrandom_stateÚdataÚ	distancesÚdesired_perplexityZmean_perplexityr$   rR   r%   Útest_binary_searchŒ   s    ÿrd   c               
   C   sv   t dƒ} |  dd¡ tj¡d }d}t||dd}dt |ddd …f t |ddd …f ¡ ¡  }t||d	d
 d S )Né*   r   éZ   r5   g      >@r   rL   r6   rU   rV   )	r   rX   rY   r)   rZ   r   ZnansumÚlog2r   )r`   ra   rc   rS   Ú
perplexityr$   r$   r%   Útest_binary_search_underflowš   s    2ri   c                     sš  d} d}t dƒ}| | d¡jtjdd}t|ƒ}t||dd‰ | d }tƒ  |¡}|j	|d	d
‰ˆj
jtjdd}| | |¡}t||dd}ˆj‰t ‡ ‡‡fdd„t| ƒD ƒ¡}	t|	|dd t d| d d¡D ]Â}
t|
ƒ}
|
d }|j	|
d	d
‰ˆj
jtjdd}| | |
¡}t||dd}t|	|dd t ˆ  ¡ ¡d d d… }ˆ  ¡ | d |… }t | ¡ ¡d d d… }| ¡ | d |… }t||dd qÒd S )NéÈ   rK   r   r6   F©ÚcopyrL   r   Údistance©Ún_neighborsÚmodec              	      s.   g | ]&}ˆ |ˆj ˆ| ˆ|d   … f ‘qS )r   )Úindices)rP   Úk©ÚP1Údistance_graphÚindptrr$   r%   rT   »   s   ÿz0test_binary_search_neighbors.<locals>.<listcomp>é   rV   é–   rJ   r   r    )r   rX   rY   r)   rZ   r   r   r   Úfitr   ra   Úreshaperv   r*   r^   r   ÚlinspaceÚintZargsortÚravel)Ú	n_samplesrc   r`   ra   rb   ro   ÚnnZdistances_nnZP2ZP1_nnrr   ZtopnZP2kÚidxZP1topZP2topr$   rs   r%   Útest_binary_search_neighbors¦   s@    þÿr   c                  C   sÄ   d} d}t dƒ}| |d¡}tƒ  |¡}|j| dd}|jjtjdd}| 	|| ¡}d }d	}t
dƒD ]Z}	t| ¡ |dd
}
t||dd
}| ¡ }|d kr¢|
}|}qdt|
|dd t||dd qdd S )Nr   r5   r   rJ   rm   rn   Frk   rU   rL   rw   rV   )r   rX   r   ry   r   ra   rY   r)   rZ   rz   r^   r   rl   r   Útoarrayr   )ro   r~   r`   ra   r   ru   rb   Zlast_Prc   r+   rS   rt   Zlast_P1r$   r$   r%   Ú test_binary_perplexity_stabilityÒ   s&    rƒ   c                     s®   t dƒ} d‰d}d‰d‰|  ˆ|¡ tj¡}t | |j¡¡}t |d¡ |  ˆˆ¡ tj¡}t	|ddd‰ ‡ ‡‡‡fdd	„}‡ ‡‡‡fd
d„}t
t||| ¡ ƒddd d S )Nr   rI   r6   r<   r2   rK   )rc   r;   c                    s   t | ˆ ˆˆˆƒd S )Nr   ©r   ©Úparams©rS   ÚalphaÚn_componentsr~   r$   r%   Úfuný   s    ztest_gradient.<locals>.func                    s   t | ˆ ˆˆˆƒd S )Nr   r„   r…   r‡   r$   r%   Úgrad   s    ztest_gradient.<locals>.gradrJ   rV   )r   rX   rY   r)   rZ   ÚabsÚdotÚTZfill_diagonalr   r   r   r}   )r`   Ú
n_featuresrb   Ú
X_embeddedrŠ   r‹   r$   r‡   r%   Útest_gradientí   s    r‘   c                  C   s¬   t dƒ} |  dd¡}t|d|d  ƒdks.t‚t d¡ dd¡}| ¡ }|  |¡ t||ƒd	k sdt‚t d
¡ dd¡}t 	dgdgdgdgdgg¡}t
t||dddƒ d S )Nr   r5   r6   ç      @r'   r<   r    r   g333333ã?rJ   rw   rU   ©ro   gš™™™™™É?)r   rX   r   rD   r)   Úarangerz   rl   Úshuffler*   r   )r`   ÚXr   r$   r$   r%   Útest_trustworthiness  s    
r—   c               	   C   s|   d} t j d¡}| dd¡}| dd¡}tjt| d t||dd W 5 Q R X t||d	d}d
|  krrdksxn t‚dS )z[Raise an error when n_neighbors >= n_samples / 2.

    Non-regression test for #18567.
    z%n_neighbors .+ should be less than .+re   é   rw   r6   ©ÚmatchrJ   r“   rU   r   r   N)	r)   ÚrandomZRandomStateZrandÚpytestÚraisesÚ
ValueErrorr   rD   )ÚregexÚrngr–   r   Útrustr$   r$   r%   Ú&test_trustworthiness_n_neighbors_error  s    r¢   ÚmethodÚexactÚ
barnes_hutÚinit)r›   Úpcac                 C   s\   t dƒ}d}| d|¡ tj¡}t||d| ddd}| |¡}t||dd}|d	ksXt‚d S )
Nr   r6   rI   i¼  Úauto)r‰   r¦   r`   r£   r7   r9   r   r“   g333333ë?)	r   rX   rY   r)   rZ   r
   Úfit_transformr   rD   )r£   r¦   r`   r‰   r–   Útsner   Útr$   r$   r%   Ú+test_preserve_trustworthiness_approximately*  s    ú
r¬   c               	   C   s|   t dƒ} td| d\}}g }dD ].}tdddd|dd	}| |¡ | |j¡ q |d
 |d ksdt‚|d |d
 ksxt‚dS )z=t-SNE should give a lower KL divergence with more iterations.r   rU   )r   r`   )éú   é,  i^  r6   r›   r   ç      Y@)r‰   r¦   rh   r9   r7   r`   r   N)r   r   r
   r©   ÚappendÚkl_divergence_rD   )r`   r–   r+   Zkl_divergencesr7   rª   r$   r$   r%   Ú)test_optimization_minimizes_kl_divergence>  s     ú
r²   c              	   C   sz   t dƒ}| dd¡}d|| ddd¡| ddd¡f< t |¡}tddddd| d	d
}| |¡}tt||ddddd d S )Nr   rI   r6   r2   é   r›   r   r¯   iî  )r‰   r¦   rh   r9   r`   r£   r7   r   r“   r<   g)\Âõ(¼?©Zrtol)	r   rX   ÚrandintÚspÚ
csr_matrixr
   r©   r   r   )r£   r    r–   ZX_csrrª   r   r$   r$   r%   Útest_fit_transform_csr_matrixR  s     
ù	
r¸   c                  C   st   t dƒ} tdƒD ]^}|  dd¡}tt|ƒdƒ}tddddd|dd	d
d	}| |¡}t||ddd}|dkst‚qd S )Nr   rU   éP   r6   Zsqeuclideanr¯   ç       @Úprecomputedéô  r›   )	r‰   rh   r9   Úearly_exaggerationÚmetricr`   r;   r7   r¦   r   )ro   r¾   gffffffî?)	r   r^   rX   r   r   r
   r©   r   rD   )r`   rQ   r–   ÚDrª   r   r«   r$   r$   r%   ÚFtest_preserve_trustworthiness_approximately_with_precomputed_distancesh  s$    ÷
rÀ   c                  C   s@   t dƒ} |  dd¡}t||ddtt|dd|ddks<t‚d S )Nr   r5   r6   Úcosine©r¾   r»   )r   rX   r   r   rD   )r`   r–   r$   r$   r%   Ú)test_trustworthiness_not_euclidean_metric~  s    
  ÿrÃ   zmethod, retypezD, message_regexr2   r<   z.* square distance matrixg      ð¿z.* positive.*c              	   C   s>   t d| dddd}tjt|d | ||ƒ¡ W 5 Q R X d S )Nr»   r›   re   r   ©r¾   r£   r¦   r`   rh   r™   )r
   rœ   r   rž   r©   )r£   r¿   ZretypeZmessage_regexrª   r$   r$   r%   Útest_bad_precomputed_distancesˆ  s    ûrÅ   c               	   C   sL   t dddddd} tjtdd" |  t d	d
gd
d	gg¡¡ W 5 Q R X d S )Nr»   r¤   r›   re   r   rÄ   Úsparser™   r   rJ   ©r
   rœ   r   Ú	TypeErrorr©   r¶   r·   ©rª   r$   r$   r%   Ú test_exact_no_precomputed_sparse£  s    ûrÊ   c               	   C   sh   t  dddgdddgdddgg¡} t | ¡}tddddd}d}tjt|d	 | |¡ W 5 Q R X d S )
Nr<   r2   r»   r›   re   r   )r¾   r¦   r`   rh   zB3 neighbors per samples are required, but some samples have only 1r™   )	r)   r*   r¶   r·   r
   rœ   r   rž   r©   )ÚdistZbad_distrª   Úmsgr$   r$   r%   Ú1test_high_perplexity_precomputed_sparse_distances¯  s    "
rÍ   )Úcategoryc                  C   sŠ   t dƒ} |  dd¡}t|dddd}t|ƒ}t |¡s:t‚t| ¡ |ƒ t	dddd	d
}| 
|¡}dD ]}| 
| |¡¡}t||ƒ qfdS )zAMake sure that TSNE works identically for sparse and dense matrixr   r5   r6   rm   T)ro   rp   Zinclude_selfr»   r›   r¨   )r¾   r`   r¦   r9   )ZcsrZlilN)r   rX   r   r   r¶   ÚissparserD   r   r‚   r
   r©   Zasformat)r`   r–   ZD_sparser¿   rª   ZXt_denseÚfmtZ	Xt_sparser$   r$   r%   Ú test_sparse_precomputed_distance¹  s        ÿ
rÑ   c               	   C   sT   dd„ } t | ddd}t ddgddgg¡}tjtdd	 | |¡ W 5 Q R X d S )
Nc                 S   s   dS r!   r$   )ÚxÚyr$   r$   r%   r¾   Ð  s    z4test_non_positive_computed_distances.<locals>.metricr¤   r   )r¾   r£   rh   r2   r<   zAll distances .*metric given.*r™   )r
   r)   r*   rœ   r   rž   r©   )r¾   rª   r–   r$   r$   r%   Ú$test_non_positive_computed_distancesÎ  s
    rÔ   c                  C   s6   t t d¡dd} |  t d¡¡}tt d¡|ƒ d S )N©r5   r6   r¨   )r¦   r9   )r5   rJ   )r
   r)   rC   r©   r3   r   )rª   r   r$   r$   r%   Útest_init_ndarrayÚ  s    rÖ   c                  C   s(   t t d¡ddd} |  t d¡¡ d S )NrÕ   r»   g      I@)r¦   r¾   r9   )r5   r5   )r
   r)   rC   ry   rÉ   r$   r$   r%   Útest_init_ndarray_precomputedá  s    ýr×   c               	   C   sD   t dddd} tjtdd |  t dgdgg¡¡ W 5 Q R X d S )	Nr»   r§   r   )r¾   r¦   rh   zBThe parameter init="pca" cannot be used with metric="precomputed".r™   r2   r<   ©r
   rœ   r   rž   r©   r)   r*   rÉ   r$   r$   r%   Ú>test_pca_initialization_not_compatible_with_precomputed_kernelì  s    þrÙ   c               	   C   sH   t dddd} tjtdd" |  t ddgddgg¡¡ W 5 Q R X d S )	Nr§   r¯   r   )r¦   r9   rh   zPCA initialization.*r™   r   rJ   rÇ   rÉ   r$   r$   r%   Ú8test_pca_initialization_not_compatible_with_sparse_inputö  s    rÚ   c               	   C   sD   t dddd} tjtdd |  t dgdgg¡¡ W 5 Q R X d S )	Nrw   r¥   r   )r‰   r£   rh   z'n_components' should be .*r™   r2   r<   rØ   rÉ   r$   r$   r%   Útest_n_components_rangeý  s    rÛ   c                  C   sŠ   t dƒ} d}ddg}|  d|¡ tj¡}|D ]X}t|dddd|d	d
d}| |¡}t|dddd|dd
d}| |¡}t ||¡r,t‚q,d S )Nr   r6   r¤   r¥   r³   r   r¯   r§   r<   r­   ©r‰   rh   r9   r¦   r`   r£   r½   r7   r'   )	r   rX   rY   r)   rZ   r
   r©   ZallcloserD   )r`   r‰   Úmethodsr–   r£   rª   ZX_embedded1ZX_embedded2r$   r$   r%   Útest_early_exaggeration_used  s8    ø

ø

rÞ   c                  C   st   t dƒ} d}ddg}|  d|¡ tj¡}|D ]B}dD ]8}t|ddd	d|d
|d}| |¡ |j|d ks4t‚q4q,d S )Nr   r6   r¤   r¥   r³   )éû   r¼   r   ç      à?r›   r<   rÜ   )	r   rX   rY   r)   rZ   r
   r©   Ún_iter_rD   )r`   r‰   rÝ   r–   r£   r7   rª   r$   r$   r%   Útest_n_iter_used%  s$    ø

râ   c                  C   sf   t  ddgddgg¡} t  ddgddgg¡}t  dgdgg¡}t  d	d
gddgg¡}t| |||ƒ d S )Nr<   r2   gbv›î
¿güC…r³¿gJ!zëE?gÒ)§x>µ1?r   r   g¹KÈXAÚø¾gµÎþr}¿g¹KÈXAÚø>gµÎþr}?©r)   r*   Ú_run_answer_test©Ú	pos_inputÚ
pos_outputÚ	neighborsÚgrad_outputr$   r$   r%   Útest_answer_gradient_two_points<  s    ÿÿrê   c                  C   s¢   t  ddgddgddgddgg¡} t  ddgd	d
gddgddgg¡}t  dddgdddgdddgdddgg¡}t  ddgddgddgddgg¡}t| |||ƒ d S )Nr<   r2   r’   rº   ç333333@çš™™™™™@ç$·á1á?ç›mƒ´ª¿ç5a ƒÒ‡&¿çIiò³mù¿çU Ÿ Æ-¿çÜ|3SÙµ?ç›È:Ç¿çä$Ä*¹Ç¿r   r6   rU   r   g\¥$Æw?g×Rn		Qà¾gz¡}¿g³«ûÙÕ`à>ç4Ž1Çf>ç6×ÆS×c¾ç>ÛÔgU9&¾ç¸#£*@>rã   rå   r$   r$   r%   Ú test_answer_gradient_four_pointsL  s"    "üÿ*üÿrù   c                  C   s¨   t  ddgddgddgddgg¡} t  ddgd	d
gddgddgg¡}t  dddgdddgdddgdddgg¡}t  ddgddgddgddgg¡}t| |||dddƒ d S )Nr<   r2   r’   rº   rë   rì   rí   rî   rï   rð   rñ   rò   ró   rô   r   r6   rU   r   rõ   rö   r÷   rø   Fçš™™™™™¹?rã   rå   r$   r$   r%   Útest_skip_num_points_gradientf  s"    "üÿ*üÿrû   Frú   c                 C   sÀ   t | ƒ tj¡}|||f}| tj¡}|jtjdd}t|Ž }	t|	ƒ tj¡}	tj|jtjd}
ddl	m
} ||	ƒ}|j tj¡}|j tj¡}tj|j||||
ddddd		 t|
|d
d d S )NFrk   )Údtyper   )r·   rà   r6   r   )Úskip_num_pointsrw   rV   )r   rY   r)   rZ   Zint64r   r   rC   r_   Úscipy.sparser·   rq   rv   r   Zgradientra   r   )ræ   rç   rè   ré   r;   rh   rý   rb   ÚargsZ	pij_inputÚgrad_bhr·   rS   rv   r$   r$   r%   rä   ƒ  s.    	
        ÿrä   c                  C   sš   t dƒ} tddd}|  dd¡}tj}tƒ t_z| |¡ W 5 tj ¡ }tj ¡  |t_X d|ksft	‚d|ksrt	‚d|ks~t	‚d	|ksŠt	‚d
|ks–t	‚d S )Nr   r6   rw   )r;   rh   rJ   z[t-SNE]znearest neighbors...z"Computed conditional probabilitiesz
Mean sigmazearly exaggeration)
r   r
   rX   r?   r@   r   rA   rB   r©   rD   )r`   rª   r–   rE   rF   r$   r$   r%   Útest_verbose¡  s    

r  c                  C   s.   t dƒ} tddd}|  dd¡}| |¡ d S )Nr   Z	chebyshevrw   )r¾   rh   rJ   r6   )r   r
   rX   r©   )r`   rª   r–   r$   r$   r%   Útest_chebyshev_metric·  s    r  c                  C   sD   t dƒ} tddd}|  dd¡}| |¡j}t t |¡¡s@t‚d S )Nr   r   rw   )r‰   rh   rJ   r6   )	r   r
   rX   ry   Z
embedding_r)   ÚallÚisfiniterD   )r`   rª   r–   r   r$   r$   r%   Útest_reduction_to_one_component¿  s
    r  Údtc              
   C   sX   t dƒ}| dd¡j|dd}tdddd| dddd	}| |¡}|j}|tjksTt‚d S )
Nr   r   r6   Frk   r¯   r®   r›   ©r‰   rh   r9   r`   r£   r;   r7   r¦   )	r   rX   rY   r
   r©   rü   r)   rZ   rD   )r£   r  r`   r–   rª   r   Zeffective_typer$   r$   r%   Ú
test_64bitÈ  s    ø

r  c              
   C   sJ   t dƒ}| dd¡}tdddd| dddd}| |¡ t |j¡rFt‚d S )Nr   rI   r6   r¯   i÷  r›   r  )r   rX   r
   r©   r)   Úisnanr±   rD   )r£   r`   r–   rª   r$   r$   r%   Útest_kl_divergence_not_naná  s    ø

r
  c                  C   sè   d} d}d}dD ]Ò}d}t |d ƒ}tdƒ}| ||¡}t|ƒ}| ||¡}	t||dd}
t|	|
|||ƒ\}}|d	 }tƒ  |¡j|d
d}t	||dd}t
|	||||| ddd\}}t|
ƒ}
| ¡ }t||
dd t||dd qd S )Nr2   r   r5   )r6   rU   rJ   r<   r   rL   r   rm   rn   )Úanglerý   r;   rV   rU   )Úfloatr   rX   r   r   r   r   ry   r   r   r   r   r‚   r   r   )r  rh   r~   r‰   r   Údegrees_of_freedomr`   ra   rb   r†   rS   Zkl_exactZ
grad_exactro   Údistances_csrÚP_bhZkl_bhr   r$   r$   r%   Útest_barnes_hut_angle÷  sR        ÿÿ þÿø
r  c               
   C   sŠ   t dƒ} |  dd¡}dD ]l}tdddd|dd	d
}d|_d|_tj}tƒ t_z| 
|¡ W 5 tj ¡ }tj 	¡  |t_X d|kst‚qd S )Nr   r5   r   )r¥   r¤   r    r6   g    „×—Ai_  r›   )r8   r;   r9   r`   r£   r7   r¦   r   z@did not make any progress during the last -1 episodes. Finished.)r   rX   r
   Z_N_ITER_CHECKÚ_EXPLORATION_N_ITERr?   r@   r   rA   rB   r©   rD   )r`   r–   r£   rª   rE   rF   r$   r$   r%   Útest_n_iter_without_progress!  s,    ù	

r  c                  C   sò   t dƒ} |  dd¡}d}t|dddd}tj}tƒ t_z| |¡ W 5 tj ¡ }tj ¡  |t_X | 	d¡}g }|D ]R}d|kr„ qÈ| 
d	¡}	|	dkrt||	d … }| d
d¡ 	d¡d }| t|ƒ¡ qtt |¡}t|||k ƒ}
|
dksît‚d S )Nr   r5   r6   gü©ñÒMb`?r¤   )r:   r;   r`   r£   Ú
ZFinishedr=   zgradient norm = Ú ú r   )r   rX   r
   r?   r@   r   rA   rB   r©   ÚsplitÚfindÚreplacer°   r  r)   r*   ÚlenrD   )r`   r–   r:   rª   rE   rF   Z	lines_outZgradient_norm_valuesÚlineZstart_grad_normZn_smaller_gradient_normsr$   r$   r%   Útest_min_grad_norm@  s4    





ÿr  c                  C   sÂ   t dƒ} |  dd¡}tdddddd}tj}tƒ t_z| |¡ W 5 tj ¡ }tj ¡  |t_X | 	d¡d d d… D ]4}d	|krt| 
d
¡\}}}|rt| 
d¡\}}} qªqtt|jt|ƒdd d S )Nr   rI   r6   r¤   r¼   )r8   r;   r`   r£   r7   r  r    Z	Iterationzerror = ú,rJ   rV   )r   rX   r
   r?   r@   r   rA   rB   r©   r  Ú	partitionr   r±   r  )r`   r–   rª   rE   rF   r  r+   rG   r$   r$   r%   Útest_accessible_kl_divergencek  s.        ÿ

r  c              
   C   sŒ   t dƒ}d}|D ]v}tdd|d|| dd}| t¡}d | |¡}zt||ƒ W q tk
r„   |d	7 }||_| t¡}t||ƒ Y qX q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.
    rU   r¼   r6   r›   rI   r¨   )r‰   r¦   r`   rh   r7   r£   r9   z{}_{}z:rerunN)r^   r
   r©   Ú	X_2d_gridÚformatÚassert_uniform_gridrD   r¦   )r£   Zseedsr7   Úseedrª   ÚYÚtry_namer$   r$   r%   Útest_uniform_grid‡  s*    ù	

r%  c                 C   s|   t dd | ¡}|jddd  ¡ }| ¡ dks4t‚| ¡ t |¡ }| ¡ t |¡ }|dksht|ƒ‚|dk sxt|ƒ‚d S )	Nr   r“   T)Zreturn_distancer   rú   rà   r6   )	r   ry   Z
kneighborsr}   ÚminrD   r)   r]   Úmax)r#  r$  r   Z
dist_to_nnZsmallest_to_meanZlargest_to_meanr$   r$   r%   r!  ¯  s    r!  c                  C   s–   t dƒ} d}|  d|¡ tj¡}i }i }dD ]:}td|ddddd	dd
}d|_| |¡||< |j||< q,|d |d ks|t	‚t
|d |d dd d S )Nr   r   é   )r¤   r¥   r6   r<   r›   rß   g     €=@)r‰   r£   r9   r¦   r`   r7   rh   r  r¤   r¥   g-Cëâ6?r´   )r   rX   rY   r)   rZ   r
   r  r©   rá   rD   r   )r`   r   r–   ZX_embeddedsr7   r£   rª   r$   r$   r%   Útest_bh_match_exact¾  s*    ør)  c                  C   sÎ   d} d}d}d}d}d}t dƒ}| || ¡ tj¡}| ||¡}|d }	tƒ  |¡j|	dd	}
t|
|dd
}t	||||||dddd	\}}dD ]:}t	||||||dd|d	\}}t
||dd t
||ƒ qŽd S )Nr   r(  r6   r   rU   rJ   r   rm   rn   rL   )r  rý   r;   Únum_threads)r6   rw   gíµ ÷Æ°>r´   )r   rX   rY   r)   rZ   r   ry   r   r   r   r   )r   r~   r‰   r  r  rh   r`   ra   r†   ro   r  r  Zkl_sequentialZgrad_sequentialr*  Zkl_multithreadZgrad_multithreadr$   r$   r%   Ú-test_gradient_bh_multithread_match_sequentialÚ  sV    ÿ þÿ÷
÷
r+  zmetric, dist_funcÚ	manhattanrÁ   c           	   	   C   sˆ   |dkr| dkrt  d¡ tdƒ}d}d}| d|¡ tj¡}t| ||ddd	d
d |¡}td||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   rU   r6   rI   r®   r›   r¨   )r¾   r£   r‰   r`   r7   r¦   r9   r»   N)
rœ   Zxfailr   rX   rY   r)   rZ   r
   r©   r   )	r¾   Z	dist_funcr£   r`   Zn_components_originalZn_components_embeddingr–   ZX_transformed_tsneZX_transformed_tsne_precomputedr$   r$   r%   Ú)test_tsne_with_different_distance_metrics  s>    ÿùø	ùø	r-  c              
   C   sb   t dƒ}d}| d|¡}td| ddddddd	 |¡}td| 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(  r6   rK   r   r›   r¨   )r‰   r£   rh   r  Zn_jobsr`   r¦   r9   N)r   rX   r
   r©   r   )r£   r`   r   r–   ZX_tr_refZX_trr$   r$   r%   Útest_tsne_n_jobs?  s8    ø	÷
ø	÷r.  c            
   	   C   sÈ   t dƒ} d\}}|  ||¡}dddddddœ}tf d	d
i|—Ž}d}tjt|d | |¡ W 5 Q R X tt|d
ddd}tf d	di|—Ž |¡}tf d
dt	 
|j¡idœ|—Ž |¡}	t|	|ƒ dS )zAMake sure that method_parameters works with mahalanobis distance.r   )r®   r   é(   r­   r¨   r›   rU   )rh   r7   r9   r¦   r‰   r`   r¾   Zmahalanobisz4Must provide either V or VI for Mahalanobis distancer™   rÂ   T)Zchecksr»   ÚV)r¾   Zmetric_paramsN)r   rX   r
   rœ   r   rž   r©   r   r   r)   ZcovrŽ   r   )
r`   r~   r   r–   Zdefault_paramsrª   rÌ   Zprecomputed_XZX_trans_expectedZX_transr$   r$   r%   Ú#test_tsne_with_mahalanobis_distance]  s6    ú	ÿ ÿÿþr1  rh   )é   r(  c              	   C   sP   t dƒ}| dd¡}tdd| |d}d}tjt|d | |¡ W 5 Q R X d	S )
z=Make sure that perplexity > n_samples results in a ValueErrorr   r2  r6   r¨   r§   )r9   r¦   rh   r`   z&perplexity must be less than n_samplesr™   N)r   rX   r
   rœ   r   rž   r©   )rh   r`   r–   ZestrÌ   r$   r$   r%   Útest_tsne_perplexity_validation{  s    ür3  c               	   C   sF   t  d¡ tdd( t d¡ dd¡} tdd | ¡ W 5 Q R X dS )	ziMake sure that TSNE works when the output is set to "pandas".

    Non-regression test for gh-25365.
    Zpandas)Ztransform_outputéŒ   é#   rw   r6   )r‰   N)rœ   Zimportorskipr   r)   r”   rz   r
   r©   )Zarrr$   r$   r%   Ú"test_tsne_works_with_pandas_outputŒ  s    
r6  )Frú   r   )N)or?   Úior   Únumpyr)   rœ   rþ   rÆ   r¶   Znumpy.testingr   Zscipy.optimizer   Zscipy.spatial.distancer   r   Zsklearnr   Zsklearn.datasetsr   Zsklearn.exceptionsr	   Zsklearn.manifoldr
   r   Zsklearn.manifold._t_sner   r   r   r   r   r   Zsklearn.manifold._utilsr   Zsklearn.metrics.pairwiser   r   r   Zsklearn.neighborsr   r   Zsklearn.utilsr   Zsklearn.utils._testingr   r   r   r   r   r{   rÒ   ZmeshgridZxxÚyyZhstackr}   rz   r  rH   rd   ri   r   rƒ   r‘   r—   r¢   ÚmarkZparametrizer¬   r²   r¸   rÀ   rÃ   Zasarrayr·   rÅ   rÊ   rÍ   rÑ   rÔ   rÖ   r×   rÙ   rÚ   rÛ   rÞ   râ   rê   rù   rû   rä   r  r  r  rZ   Zfloat64r  r
  r  r  r  r  r%  r!  r)  r+  r-  r.  r1  r3  r6  r$   r$   r$   r%   Ú<module>   sÎ    þÿV,

ýþþþ


!"   ù
	
*
+
'
3þ-

