o
    \i2L                  	   @   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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 ddlmZ edZe Zeejj Z!ej"e! Z#eje! Z$de#j%_&de$j%_&e'e(j)Z*dd Z+dd Z,dd Z-dd Z.dd Z/dd Z0dd Z1ej23dg dej23dg dej23dg d ej23d!g dd"d# Z4d$d% Z5d&d' Z6ej23d(g d)d*d+ Z7d,d- Z8d.d/ Z9d0d1 Z:d2d3 Z;d4d5 Z<d6d7 Z=ej23d8d!e>d9fd:e>d;fd<e?d=fgd>d? Z@ej23d!dd@gdAdB ZAdS )CzL
Testing for Neighborhood Component Analysis module (sklearn.neighbors.nca)
    N)assert_array_almost_equalassert_array_equal)
check_grad)clone)	load_iris
make_blobsmake_classification)ConvergenceWarning)pairwise_distances)NeighborhoodComponentsAnalysis)LabelEncoder)check_random_state)validate_dataFc                  C   s   t ddgddgddgddgg} t g d}tdddd}|| | || }tt| dddf t g d	 dS )
zTest 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         )r   r   r   r   identity*   )n_componentsinitrandom_stateN)r      r   r   )nparrayr   fit	transformr   r
   argsort)XyncaX_t r    /var/www/www-root/data/www/176.119.141.140/sports-predictor/venv/lib/python3.10/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}g d}G dd	 d	}|||}td|jd
}|	||}t
| t||d  d t|jd dk sUJ 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   )axisN)r   r   r   c                   @      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_t| j||dd\| _}t 	|}|d d t j
f |t j
d d f k| _d S Nr   )ensure_min_samples)r   inflossr   fake_ncan_iter_r   r   r   fit_transformnewaxissame_class_maskselfr   r   r    r    r!   __init__H   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)   )r0   transformationn_iter_r    r    r!   callbackQ   s   z=test_toy_example_collapse_points.<locals>.LossStorer.callbackN__name__
__module____qualname__r1   r6   r    r    r    r!   
LossStorerG       	r;   )r   r6           r   g|=)r   randomRandomStaterandnvstackmeanr-   r   r6   r,   printr   absr)   )	rng	input_dim
two_pointsr   r   r;   loss_storerr   r   r    r    r!    test_toy_example_collapse_points6   s   $
rI   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sZJ dS )z~Test gradient of loss function

    Assert that the gradient is almost equal to its finite differences
    approximation.
    )r   r   r   Nc                        |  d S )Nr   r2   Mr   maskr   r    r!   funn      z$test_finite_differences.<locals>.func                    rJ   )Nr   rK   rL   rN   r    r!   gradq   rQ   z%test_finite_differences.<locals>.gradr=   -C6?)rD   )r   r>   r?   r   r@   randintshaper   r+   r-   r   ravelpytestapprox)global_random_seedrE   r   rM   rP   rR   diffr    rN   r!   test_finite_differences`   s   $$r[   c                  C   s  t ddd} g d}t}t jd}|dd}d|jd  d	|jd
  d}tj	t
t|d ||d| | W d    n1 sHw   Y  d}d| d| jd
  d}tj	t
t|d ||d| | W d    d S 1 szw   Y  d S )N      r   r   r   r   r   r   r#   The output dimensionality (r   ]) of the given linear transformation `init` cannot be greater than its input dimensionality (r   ).matchr   
   DThe preferred dimensionality of the projected space `n_components` (8) cannot be greater than the given data dimensionality ()!r   )r   arangereshaper   r>   r?   randrU   rW   raises
ValueErrorreescaper   )r   r   NCArE   r   msgr   r    r    r!   test_params_validationy   s,   "rs   c                  C   s   t ddd} g d}t ddgddgg}tt t|d| | W d    n1 s1w   Y  t ddgddgdd	gg}tt t|d| | W d    n1 s]w   Y  t d
dd}t|d| | d S )Nr\   r]   r   r^   r   r   rd   r#      	   )	r   rj   rk   r   rW   rm   rn   r   r   )r   r   r3   r    r    r!   test_transformation_dimensions   s   rv   c                  C   s8  t jd} t ddd}g d}| |jd d d}|jd }t||d}d| d	|jd
  d}tj	t
t|d ||| W d    n1 sPw   Y  |jd d }t||d}d| d|jd  d}tj	t
t|d ||| W d    n1 sw   Y  tddd}||| d S )Nr   r\   r]   r   r^   r   r   r   rf   V) does not match the output dimensionality of the given linear transformation `init` (r   rh   rb   r   rg   r   )r   r   )r   r>   r?   rj   rk   rl   rU   r   rW   rm   rn   ro   rp   r   )rE   r   r   r   r   r   rr   r    r    r!   test_n_components   s8   
ry   c                  C   sV  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 d    n1 sw   Y  | |jd d |jd }t|d}d|jd  d|jd  d}	tj	t
t|	d ||| W d    n1 sw   Y  | |jd |jd }|jd d }
t||
d}d|
 d|jd  d}	tj	t
t|	d ||| W d    d S 1 s$w   Y  d S )Nr      rt   r#   r   	n_samplescenters
n_featuresr   r   rd   r>   autopcaldar   zThe input dimensionality (zc) of the given linear transformation `init` must match the dimensionality of the given inputs `X` (ra   rb   r_   r`   r   rw   rf   rx   rh   )r   r>   r?   r   r   r   rl   rU   rW   rm   rn   ro   rp   )rE   r   r   r   
nca_randomnca_autonca_pcanca_ldar   rr   r   r    r    r!   test_init_transformation   sZ   







$r   r|   )r   r#         r~   	n_classes)r#   r   r   r   c           
      C   s   t jd}td|d|d}|| krd S || |}t t|| | d d |  }||kr0d S t|}||| |t	|d |krLt|j
dd}	n|t	|| k r\t|j
dd}	nt|j
dd}	|	|| t|j|	j d S )	Nr   r   r   )r   r   max_iterr   r   rd   r   r   )r   r>   r?   r   r@   tileranger   r   min
set_paramsr   components_)
r|   r~   r   r   rE   nca_baser   r   r   	nca_otherr    r    r!   test_auto_init
  s&    r   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 d    d S 1 sPw   Y  d S )Nrz   r#   r]   r   )r|   r~   r   n_redundantn_informativer   T)
warm_startr   zThe new inputs dimensionality (r   zT) does not match the input dimensionality of the previously learned transformation (ra   rb   )
r   r   r   rU   r   rW   rm   rn   ro   rp   )r   r   r   X_less_featuresrr   r    r    r!   test_warm_start_validation-  s2   
	
	
"r   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 sRJ d||ksZJ dd S )	NTr   )r   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_targetr   r   r   sumrD   )nca_warmtransformation_warmtransformation_warm_plus_onenca_coldtransformation_coldtransformation_cold_plus_one	diff_warm	diff_coldr    r    r!   test_warm_start_effectivenessK  s(   

r   	init_name)r   r   r   r>   precomputedc                 C   sT  t jd}tddddd\}}d}d| d	| d
}| dkr,||jd |jd }n| }td|d}||| | \}	}
t	
d|	}| d
v r\t	||  |d sVJ |dd  }|d dksdJ dddd}|d d|ksvJ |d ddt| ksJ |dd D ]
}t	d|sJ qt	d|d sJ |d dksJ d S )Nr   rz   rt   r#   r   r{   z... done in \ *\d+\.\d{2}szFinding principal componentsz&Finding most discriminative components)r   r   r   r   )verboser   z
+z [NeighborhoodComponentsAnalysis]z{:>10} {:>20} {:>10}	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   r>   r?   r   r@   rU   r   r   
readouterrro   splitrc   formatlen)r   capsysrE   r   r   regexp_initmsgsr   r   outr5   linesheaderliner    r    r!   test_verbosek  s<   
r   c                 C   s.   t  }|tt |  \}}|dksJ d S )Nr   )r   r   r   r   r   )r   r   r   r5   r    r    r!   test_no_verbose  s   r   c                  C   s<  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   rz   r   r   )r   r   )	r   copyr   r   wherer   r   r   r   )r   r   singleton_classind_singletonr   ind_1ind_2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   rz   r   r   )r   r   r   )r   r   r   rU   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 |v s&J d S )Nre   c                    s4   | j tj d d fksJ  | }td| d S )Nr   r   {} iterations remaining...)rU   r   rC   r   )r3   r4   rem_iterr   r    r!   my_cb  s   ztest_callback.<locals>.my_cbr   )r   r6   r   r   )r   r   r   r   r   r   )r   r   r   r   r5   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s,J dS )z4Test that the transformation has the expected shape.c                   @   r%   )z@test_expected_transformation_shape.<locals>.TransformationStorerc                 S   s`   t  | _tj| j_t| 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!   r1     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)r3   )r0   r3   r4   r    r    r!   r6     s   
zItest_expected_transformation_shape.<locals>.TransformationStorer.callbackNr7   r    r    r    r!   TransformationStorer  r<   r   r#   )r   r6   r   r   N)r   r   r6   r   r   r3   sizerU   )r   r   r   transformation_storercbr   r    r    r!   "test_expected_transformation_shape  s   
r   c                  C   sd   t ddd} | jj}d|}tjtt|d | 	t
t W d    d S 1 s+w   Y  d S )Nr   r   )r   r   z[{}] NCA did not convergerb   )r   	__class__r8   r   rW   warnsr	   ro   rp   r   r   r   )r   cls_namerr   r    r    r!   test_convergence_warning  s   
"r   zparam, valuer   r   d   tolrS   c                 C   s*   t di | |i}t}t}||| d S )Nr    )r   r   r   r   )paramvaluer   r   r   r    r    r!   test_parameters_valid_types  s   r   r   c                    st   t }t}t| d||}| }|jj  | dur| }n|jd }t	j
 fddt|D td}t|| dS )zCheck `get_feature_names_out` for `NeighborhoodComponentsAnalysis`.

    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/28293
    ri   Nr   c                    s   g | ]}  | qS r    r    ).0iclass_name_lowerr    r!   
<listcomp>/  s    z.test_nca_feature_names_out.<locals>.<listcomp>)dtype)r   r   r   r   get_feature_names_outr   r8   lowerrU   r   r   r   objectr   )r   r   r   est	names_outexpected_n_featuresexpected_names_outr    r   r!   test_nca_feature_names_out  s   
r   )B__doc__ro   numpyr   rW   numpy.testingr   r   scipy.optimizer   sklearnr   sklearn.datasetsr   r   r   sklearn.exceptionsr	   sklearn.metricsr
   sklearn.neighborsr   sklearn.preprocessingr   sklearn.utilsr   sklearn.utils.validationr   rE   irispermutationtargetr   permdatar   r   flags	writeablefinfofloatepsEPSr"   rI   r[   rs   rv   ry   r   markparametrizer   r   r   r   r   r   r   r   r   r   int32float32r   r   r    r    r    r!   <module>   sp    

*#@ 
,	$
