U
    ½mœdkJ  ã                
   @   s  d Z ddlZddlZddl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 ddlmZmZmZ dd	lmZ dd
lmZ ddlmZ edƒZeƒ Ze ejj¡Zej e Z!eje Z"e #e$¡j%Z&dd„ Z'dd„ Z(dd„ Z)dd„ Z*dd„ Z+dd„ Z,dd„ Z-ej. /dddddg¡ej. /dddddg¡ej. /d dddg¡ej. /d!ddddg¡d"d#„ ƒƒƒƒZ0d$d%„ Z1d&d'„ Z2ej. /d(d)d*d+d,d-g¡d.d/„ ƒZ3d0d1„ Z4d2d3„ Z5d4d5„ Z6d6d7„ Z7d8d9„ Z8d:d;„ Z9ej. /d<d!e :d¡fd=e :d>¡fd?e ;d@¡fg¡dAdB„ ƒZ<dCdD„ Z=dS )EzL
Testing for Neighborhood Component Analysis module (sklearn.neighbors.nca)
é    N)Úassert_array_equalÚassert_array_almost_equal)Ú
check_grad)Úclone)ÚConvergenceWarning)Úcheck_random_state)Ú	load_irisÚmake_classificationÚ
make_blobs)ÚNeighborhoodComponentsAnalysis)Úpairwise_distances)ÚLabelEncoderc                  C   sˆ   t  ddgddgddgddgg¡} t  ddddg¡}tdddd�}| | |¡ | | ¡}tt|ƒ ¡ dd…df t  ddddg¡ƒ dS )	z×Test on a simple example.

    Puts four points in the input space where the opposite labels points are
    next to each other. After transform the samples from the same class
    should be next to each other.

    r   é   é   Úidentityé*   )Ún_componentsÚinitÚrandom_stateNé   )ÚnpÚarrayr   ÚfitÚ	transformr   r   Zargsort)ÚXÚyÚncaÚX_t© r   úY/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/sklearn/neighbors/tests/test_nca.pyÚtest_simple_example    s    "  ÿ
r    c            	      C   s°   t j d¡} d}|  d|¡}t  ||jdd�t jdd…f g¡}dddg}G dd	„ d	ƒ}|||ƒ}td|jd
�}| 	||¡}t
|ƒ t||d  dƒ t|jd ƒdk s¬t‚dS )aö  Test on a toy example of three points that should collapse

    We build a simple example: two points from the same class and a point from
    a different class in the middle of them. On this simple example, the new
    (transformed) points should all collapse into one single point. Indeed, the
    objective is 2/(1 + exp(d/2)), with d the euclidean distance between the
    two samples from the same class. This is maximized for d=0 (because d>=0),
    with an objective equal to 1 (loss=-1.).

    r   é   r   r   )ZaxisNr   c                   @   s   e Zd Zdd„ Zdd„ ZdS )z4test_toy_example_collapse_points.<locals>.LossStorerc                 S   sh   t j| _tƒ | _t j| j_| jj||dd�\| _}tƒ  	|¡}|d d …t j
f |t j
d d …f k| _d S ©Nr   )Zensure_min_samples)r   ÚinfÚlossr   Úfake_ncaÚn_iter_Ú_validate_datar   r   Úfit_transformÚnewaxisÚsame_class_mask©Úselfr   r   r   r   r   Ú__init__D   s    
z=test_toy_example_collapse_points.<locals>.LossStorer.__init__c                 S   s    | j  || j| jd¡\| _}dS )z*Stores the last value of the loss functiong      ð¿N)r%   Ú_loss_grad_lbfgsr   r*   r$   )r,   ÚtransformationÚn_iterÚ_r   r   r   ÚcallbackM   s       ÿz=test_toy_example_collapse_points.<locals>.LossStorer.callbackN©Ú__name__Ú
__module__Ú__qualname__r-   r2   r   r   r   r   Ú
LossStorerC   s   	r7   )r   r2   ç        g»½×Ùß|Û=)r   ÚrandomÚRandomStateÚrandnZvstackZmeanr)   r   r2   r(   Úprintr   Úabsr$   ÚAssertionError)	ÚrngZ	input_dimZ
two_pointsr   r   r7   Zloss_storerr   r   r   r   r   Ú test_toy_example_collapse_points2   s    $

r@   c                    s¸   t j | ¡}t| d�\‰ }| | dˆ jd d ¡ˆ jd ¡}tƒ ‰dˆ_|dd…t j	f |t j	dd…f k‰‡ ‡‡fdd„}‡ ‡‡fdd„}t
||| ¡ ƒ}|tjd	d
d�ks´t‚dS )z~Test gradient of loss function

    Assert that the gradient is almost equal to its finite differences
    approximation.
    )r   r   r   Nc                    s   ˆ  | ˆ ˆ¡d S )Nr   ©r.   ©ÚM©r   Úmaskr   r   r   Úfunj   s    z$test_finite_differences.<locals>.func                    s   ˆ  | ˆ ˆ¡d S )Nr   rA   rB   rD   r   r   Úgradm   s    z%test_finite_differences.<locals>.gradr8   ç-Cëâ6?)r=   )r   r9   r:   r	   r;   ÚrandintÚshaper   r&   r)   r   ZravelÚpytestZapproxr>   )Zglobal_random_seedr?   r   rC   rF   rG   Údiffr   rD   r   Útest_finite_differences\   s    $$rM   c               	   C   sÜ   t  d¡ dd¡} ddddg}t}t j d¡}| dd¡}d|jd	 › d
|jd › d�}tj	t
t |¡d�� ||d� | |¡ W 5 Q R X d}d|› d| jd › d�}tj	t
t |¡d�� ||d� | |¡ W 5 Q R X d S )Né   é   r   r   r   r   r!   úThe output dimensionality (r   ú]) of the given linear transformation `init` cannot be greater than its input dimensionality (ú).©Úmatch©r   é
   úDThe preferred dimensionality of the projected space `n_components` (ú8) cannot be greater than the given data dimensionality (ú)!)r   )r   ÚarangeÚreshaper   r9   r:   ÚrandrJ   rK   ÚraisesÚ
ValueErrorÚreÚescaper   )r   r   ZNCAr?   r   Úmsgr   r   r   r   Útest_params_validationu   s    ÿÿrb   c               	   C   sÈ   t  d¡ dd¡} ddddg}t  ddgddgg¡}t t¡� t|d� | |¡ W 5 Q R X t  ddgddgddgg¡}t t¡� t|d� | |¡ W 5 Q R X t  d	¡ dd¡}t|d� | |¡ d S )
NrN   rO   r   r   r   rU   r!   é   é	   )	r   rZ   r[   r   rK   r]   r^   r   r   )r   r   r/   r   r   r   Útest_transformation_dimensionsŽ   s    re   c               	   C   s  t j d¡} t  d¡ dd¡}ddddg}|  |jd d d¡}|jd }t||d�}d|› d	|jd
 › d�}tj	t
t |¡d�� | ||¡ W 5 Q R X |jd d }t||d�}d|› d|jd › d�}tj	t
t |¡d�� | ||¡ W 5 Q R X tddd�}| ||¡ d S )Nr   rN   rO   r   r   r   ©r   r   rW   úV) does not match the output dimensionality of the given linear transformation `init` (r   rY   rS   rX   r   )r   r   )r   r9   r:   rZ   r[   r\   rJ   r   rK   r]   r^   r_   r`   r   )r?   r   r   r   r   r   ra   r   r   r   Útest_n_components£   s$    
ÿÿrh   c               	   C   s  t j d¡} tddddd�\}}tdd�}| ||¡ td	d�}| ||¡ td
d�}| ||¡ tdd�}| ||¡ tdd�}| ||¡ |  |jd |jd ¡}t|d�}| ||¡ |  |jd |jd d ¡}t|d�}d|jd › d|jd › d�}	tj	t
t |	¡d�� | ||¡ W 5 Q R X |  |jd d |jd ¡}t|d�}d|jd › d|jd › d�}	tj	t
t |	¡d�� | ||¡ W 5 Q R X |  |jd |jd ¡}|jd d }
t||
d�}d|
› d|jd › d�}	tj	t
t |	¡d�� | ||¡ W 5 Q R X d S )Nr   é   rc   r!   r   ©Ú	n_samplesZcentersÚ
n_featuresr   r   rU   r9   ÚautoÚpcaÚldar   zThe input dimensionality (zc) of the given linear transformation `init` must match the dimensionality of the given inputs `X` (rR   rS   rP   rQ   r   rf   rW   rg   rY   )r   r9   r:   r
   r   r   r\   rJ   rK   r]   r^   r_   r`   )r?   r   r   r   Z
nca_randomZnca_autoZnca_pcaZnca_ldar   ra   r   r   r   r   Útest_init_transformationÆ   sD    






ÿ
ÿÿrp   rk   r   r!   é   é   rl   Ú	n_classesr   c           
      C   sâ   t j d¡}td|d|d�}|| kr&n¸| | |¡}t  t|ƒ| | d ¡d | … }||kr\n‚t|ƒ}| ||¡ |t	|d |ƒkr”t|ƒj
dd�}	n0|t	|| ƒk r´t|ƒj
dd�}	nt|ƒj
dd�}	|	 ||¡ t|j|	jƒ d S )	Nr   rm   r   )r   r   Úmax_iterr   ro   rU   rn   r   )r   r9   r:   r   r;   ZtileÚranger   r   ÚminZ
set_paramsr   Úcomponents_)
rk   rl   rs   r   r?   Znca_baser   r   r   Z	nca_otherr   r   r   Útest_auto_init  s,       ÿ rx   c               	   C   s˜   t ddddddd�\} }tddd�}| | |¡ t ddddddd�\}}d|jd	 › d
|jjd	 › d�}tjtt 	|¡d�� | ||¡ W 5 Q R X d S )Nri   r!   rO   r   )rk   rl   rs   Zn_redundantZn_informativer   T)Ú
warm_startrt   zThe new inputs dimensionality (r   zT) does not match the input dimensionality of the previously learned transformation (rR   rS   )
r	   r   r   rJ   rw   rK   r]   r^   r_   r`   )r   r   r   ZX_less_featuresra   r   r   r   Útest_warm_start_validation)  s,    ú
	ú
	ÿrz   c                  C   s¸   t ddd�} |  tt¡ | j}d| _|  tt¡ | j}t ddd�}| tt¡ |j}d|_| tt¡ |j}t t || ¡¡}t t || ¡¡}|dk s¤t	dƒ‚||ks´t	dƒ‚d S )	NTr   )ry   r   r   Fg      @zVTransformer changed significantly after one iteration even though it was warm-started.zfCold-started transformer changed less significantly than warm-started transformer after one iteration.)
r   r   Ú	iris_dataÚiris_targetrw   rt   r   Úsumr=   r>   )Znca_warmZtransformation_warmZtransformation_warm_plus_oneZnca_coldZtransformation_coldZtransformation_cold_plus_oneZ	diff_warmZ	diff_coldr   r   r   Útest_warm_start_effectivenessG  s(    
ÿ
ÿr~   Ú	init_namern   ro   r   r9   Úprecomputedc                 C   s^  t j d¡}tddddd�\}}d}d| d	| d
œ}| dkrX| |jd |jd ¡}n| }td|d�}| ||¡ | ¡ \}	}
t	 
d|	¡}| d
kr¸t	 ||  |d ¡s¬t‚|dd … }|d dksÈt‚d ddd¡}|d d |¡ksìt‚|d d dt|ƒ ¡k�st‚|dd… D ]}t	 d|¡�st‚�qt	 d|d ¡�sHt‚|d dk�sZt‚d S )Nr   ri   rc   r!   r   rj   z... done in \ *\d+\.\d{2}szFinding principal componentsz&Finding most discriminative components)rn   ro   r€   r   )Úverboser   z
+z [NeighborhoodComponentsAnalysis]z{:>10} {:>20} {:>10}Z	IterationzObjective ValuezTime(s)z#[NeighborhoodComponentsAnalysis] {}r   ú-r   éþÿÿÿzH\[NeighborhoodComponentsAnalysis\] *\d+ *\d\.\d{6}e[+|-]\d+\ *\d+\.\d{2}z@\[NeighborhoodComponentsAnalysis\] Training took\ *\d+\.\d{2}s\.éÿÿÿÿÚ )r   r9   r:   r
   r;   rJ   r   r   Ú
readouterrr_   ÚsplitrT   r>   ÚformatÚlen)r   Úcapsysr?   r   r   Zregexp_initZmsgsr   r   Úoutr1   ÚlinesÚheaderÚliner   r   r   Útest_verboseg  s<    þ ýþ
r�   c                 C   s.   t ƒ }| tt¡ |  ¡ \}}|dks*t‚d S )Nr…   )r   r   r{   r|   r†   r>   )rŠ   r   r‹   r1   r   r   r   Útest_no_verbose–  s    r�   c                  C   s4  t } t}d}t ||k¡\}d||< |||d < tdd�}| | |¡ t |dk¡\}t |dk¡\}d||< d||d < d||< d||d < tdd�}| | |¡ t |dk¡\}t |dk¡\}t |dk¡\}| |d |d |d g } ||d |d |d g }tddd�}| | |¡ t| | | ¡ƒ d S )Nr   r   r   ri   ©rt   r   )r   rt   )r{   r|   r   Úwherer   r   r   r   )r   r   Zsingleton_classZind_singletonr   Zind_1Zind_2Zind_0r   r   r   Útest_singleton_classŸ  s0    

r“   c                  C   sL   t tdk } ttdk }td| jd dd�}| | |¡ t| | | ¡ƒ d S )Nr   ri   r   r   )rt   r   r   )r{   r|   r   rJ   r   r   r   )r   r   r   r   r   r   Útest_one_classÃ  s      ÿr”   c                    sP   d‰ ‡ fdd„}t ˆ |dd�}| tt¡ |  ¡ \}}d ˆ d ¡|ksLt‚d S )NrV   c                    s4   | j tj d d fkst‚ˆ | }td |¡ƒ d S )Nr   r   ú{} iterations remaining...)rJ   r{   r>   r<   rˆ   )r/   r0   Zrem_iterr‘   r   r   Úmy_cbÑ  s    ztest_callback.<locals>.my_cbr   )rt   r2   r�   r•   )r   r   r{   r|   r†   rˆ   r>   )rŠ   r–   r   r‹   r1   r   r‘   r   Útest_callbackÎ  s    r—   c                  C   s\   t } t}G dd„ dƒ}|| |ƒ}|j}td|d�}| | |¡ |jj| jd d ksXt‚dS )z4Test that the transformation has the expected shape.c                   @   s   e Zd Zdd„ Zdd„ ZdS )z@test_expected_transformation_shape.<locals>.TransformationStorerc                 S   s`   t ƒ | _tj| j_| jj||dd�\| _}tƒ  |¡}|d d …tj	f |tj	d d …f k| _
d S r"   )r   r%   r   r#   r&   r'   r   r   r(   r)   r*   r+   r   r   r   r-   å  s
    
zItest_expected_transformation_shape.<locals>.TransformationStorer.__init__c                 S   s
   || _ dS )zWStores the last value of the transformation taken as input by
            the optimizerN)r/   )r,   r/   r0   r   r   r   r2   î  s    zItest_expected_transformation_shape.<locals>.TransformationStorer.callbackNr3   r   r   r   r   ÚTransformationStorerä  s   	r˜   r!   )rt   r2   r   r   N)	r{   r|   r2   r   r   r/   ÚsizerJ   r>   )r   r   r˜   Ztransformation_storerÚcbr   r   r   r   Ú"test_expected_transformation_shapeß  s    
r›   c               	   C   sN   t ddd�} | jj}d |¡}tjtt |¡d�� |  	t
t¡ W 5 Q R X d S )Nr   r   )rt   r�   z[{}] NCA did not convergerS   )r   Ú	__class__r4   rˆ   rK   Zwarnsr   r_   r`   r   r{   r|   )r   Úcls_namera   r   r   r   Útest_convergence_warningú  s
    
rž   zparam, valuert   éd   ZtolrH   c                 C   s&   t f | |iŽ}t}t}| ||¡ d S )N)r   r{   r|   r   )ÚparamÚvaluer   r   r   r   r   r   Útest_parameters_valid_types  s    r¢   c                     s`   t } t}tƒ  | |¡}| ¡ }|jj ¡ ‰ tj	‡ fdd„t
|jjd ƒD ƒtd�}t||ƒ dS )zCCheck `get_feature_names_out` for `NeighborhoodComponentsAnalysis`.c                    s   g | ]}ˆ › |› �‘qS r   r   )Ú.0Úi©Zclass_name_lowerr   r   Ú
<listcomp>   s     z.test_nca_feature_names_out.<locals>.<listcomp>r   )ZdtypeN)r{   r|   r   r   Zget_feature_names_outrœ   r4   Úlowerr   r   ru   rw   rJ   Úobjectr   )r   r   ZestZ	names_outZexpected_names_outr   r¥   r   Útest_nca_feature_names_out  s    þr©   )>Ú__doc__rK   r_   Únumpyr   Znumpy.testingr   r   Zscipy.optimizer   Zsklearnr   Zsklearn.exceptionsr   Zsklearn.utilsr   Zsklearn.datasetsr   r	   r
   Zsklearn.neighborsr   Zsklearn.metricsr   Zsklearn.preprocessingr   r?   ZirisZpermutationÚtargetr™   ÚpermÚdatar{   r|   ZfinfoÚfloatZepsZEPSr    r@   rM   rb   re   rh   rp   ÚmarkZparametrizerx   rz   r~   r�   r�   r“   r”   r—   r›   rž   Zint32Zfloat32r¢   r©   r   r   r   r   Ú<module>   sh   

*#@  ÿ
,	$ýþ
