
    0Ph6L              	       Z   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j'        e(          j)        Z*d Z+d Z,d Z-d Z.d Z/d Z0d Z1ej2        3                    dg d          ej2        3                    dg d          ej2        3                    dg d          ej2        3                    dg d          d                                                 Z4d Z5d Z6ej2        3                    dg d          d              Z7d! Z8d" Z9d# Z:d$ Z;d% Z<d& Z=ej2        3                    d'd ej>        d(          fd) ej>        d*          fd+ ej?        d,          fg          d-             Z@ej2        3                    ddd.g          d/             ZAdS )0zL
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                     t          j        ddgddgddgddgg          } t          j        g d          }t          ddd          }|                    | |           |                    |           }t          t          |                                          dddf         t          j        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_ts       `/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/sklearn/neighbors/tests/test_nca.pytest_simple_exampler#   $   s     	1a&1a&1a&1a&122A
A
(Zb  C GGAqMMM
--

C)#..6688A>@V@VWWWWW    c                     t           j                            d          } d}|                     d|          }t          j        ||                    d          t           j        ddf         g          }g d} G d d	          } |||          }t          d|j        
          }|	                    ||          }t          |           t          ||d         z
  d           t          |j        dz             dk     sJ 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 Zd ZdS )4test_toy_example_collapse_points.<locals>.LossStorerc                 b   t           j        | _        t                      | _        t           j        | j        _        t          | j        ||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   s      r"   __init__z=test_toy_example_collapse_points.<locals>.LossStorer.__init__H   s    DI:<<DM$&FDM!%dmQaPPPIDFA,,Q//A#$QQQ
]#3qQQQ7G#GD   r$   c                 d    | j                             || j        | j        d          \  | _        }dS )z*Stores the last value of the loss functiong      N)r/   _loss_grad_lbfgsr   r3   r.   )r5   transformationn_iter_s       r"   callbackz=test_toy_example_collapse_points.<locals>.LossStorer.callbackQ   s1    =99(<d LDIqqqr$   N__name__
__module____qualname__r6   r<    r$   r"   
LossStorerr)   G   s5        	H 	H 	H	 	 	 	 	r$   rB   )r   r<           r   g|=)r   randomRandomStaterandnvstackmeanr2   r   r<   r1   printr   absr.   )	rng	input_dim
two_pointsr   r   rB   loss_storerr    r!   s	            r"    test_toy_example_collapse_pointsrO   6   s    )


#
#CI1i((J
	:zA66rz111}EFGGA		A         *Q""K
(b;CW
X
X
XC


Aq
!
!C	#JJJcCFlC000{!#$$u,,,,,,r$   c                   	 t           j                            |           }t          |           \  }|                    |                    dj        d         dz             j        d                   }t                      	d	_        |ddt           j	        f         |t           j	        ddf         k    	fd}	fd}t          |||                                          }|t          j        dd	          k    sJ 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   r8   Mr   maskr    s    r"   funz$test_finite_differences.<locals>.funn        ##Aq$//22r$   c                 >                         |           d         S )Nr   rR   rS   s    r"   gradz%test_finite_differences.<locals>.gradq   rW   r$   rC   -C6?)rJ   )r   rD   rE   r	   rF   randintshaper   r0   r2   r   ravelpytestapprox)
global_random_seedrK   r   rT   rV   rY   diffr   rU   r    s
          @@@r"   test_finite_differencesrb   `   s$    )

 2
3
3C,>???DAq		#++aa00!'!*==A
(
*
*CCKQQQ
]qQQQ//D3 3 3 3 3 3 33 3 3 3 3 3 3 c4++D6=$/////////r$   c                     t          j        d                              dd          } g d}t          }t           j                            d          }|                    dd          }d|j        d          d	|j        d
          d}t          j	        t          t          j        |                    5   ||                              | |           d d d            n# 1 swxY w Y   d}d| d| j        d
          d}t          j	        t          t          j        |                    5   ||                              | |           d d d            d S # 1 swxY w 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   rD   rE   randr\   r^   raises
ValueErrorreescaper   )r   r   NCArK   r   msgr   s          r"   test_params_validationr{   y   s   
	"a##AA
(C
)


#
#C88Aq>>D	Ddjm 	D 	D26*Q-	D 	D 	D 
 
z3	8	8	8 ! !1a   ! ! ! ! ! ! ! ! ! ! ! ! ! ! !L	>'	> 	>/0wqz	> 	> 	> 
 
z3	8	8	8 1 1&&&**1a0001 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1s$   5!C""C&)C&0!EE"%E"c                     t          j        d                              dd          } g d}t          j        ddgddgg          }t	          j        t                    5  t          |                              | |           d d d            n# 1 swxY w Y   t          j        ddgddgdd	gg          }t	          j        t                    5  t          |                              | |           d d d            n# 1 swxY w Y   t          j        d
                              dd          }t          |                              | |           d S )Nrd   re   r   rf   r   r   rl   r&      	   )	r   rr   rs   r   r^   ru   rv   r   r   )r   r   r9   s      r"   test_transformation_dimensionsr      s   
	"a##AA X1v1v.//N	z	"	" F F&N;;;??1EEEF F F F F F F F F F F F F F F
 X1v1v1v677N	z	"	" F F&N;;;??1EEEF F F F F F F F F F F F F F F Yq\\))!Q//N"777;;AqAAAAAs$    %BBB%DD
Dc                  l   t           j                            d          } t          j        d                              dd          }g d}|                     |j        d         dz
  d          }|j        d         }t          ||          }d| d	|j        d
          d}t          j	        t          t          j        |                    5  |                    ||           d d d            n# 1 swxY w Y   |j        d         dz   }t          ||          }d| d|j        d          d}t          j	        t          t          j        |                    5  |                    ||           d d d            n# 1 swxY w Y   t          dd          }|                    ||           d S )Nr   rd   re   r   rf   r   r   r   rn   V) does not match the output dimensionality of the given linear transformation `init` (r   rp   rj   r   ro   r   )r   r   )r   rD   rE   rr   rs   rt   r\   r   r^   ru   rv   rw   rx   r   )rK   r   r   r   r   r    rz   s          r"   test_n_componentsr      s/   
)


#
#C
	"a##AA88AGAJNA&&D 71:L
(d
N
N
NC	%'	% 	% :a=	% 	% 	%  
z3	8	8	8  1               71:>L
(d
N
N
NC	9'	9 	9*+'!*	9 	9 	9 
 
z3	8	8	8  1               )aj
I
I
ICGGAqMMMMMs$   C22C69C6FF	Fc                     t           j                            d          } t          dddd          \  }}t	          d          }|                    ||           t	          d	          }|                    ||           t	          d
          }|                    ||           t	          d          }|                    ||           t	          d          }|                    ||           |                     |j        d         |j        d                   }t	          |          }|                    ||           |                     |j        d         |j        d         dz             }t	          |          }d|j        d          d|j        d          d}	t          j	        t          t          j        |	                    5  |                    ||           d d d            n# 1 swxY w Y   |                     |j        d         dz   |j        d                   }t	          |          }d|j        d          d|j        d          d}	t          j	        t          t          j        |	                    5  |                    ||           d d d            n# 1 swxY w Y   |                     |j        d         |j        d                   }|j        d         dz
  }
t	          ||
          }d|
 d|j        d          d}	t          j	        t          t          j        |	                    5  |                    ||           d d d            d S # 1 swxY w Y   d S )Nr      r}   r&   r   	n_samplescenters
n_featuresr   r   rl   rD   autopcaldar   zThe input dimensionality (zc) of the given linear transformation `init` must match the dimensionality of the given inputs `X` (ri   rj   rg   rh   r   r   rn   r   rp   )r   rD   rE   r   r   r   rt   r\   r^   ru   rv   rw   rx   )rK   r   r   r    
nca_randomnca_autonca_pcanca_ldar   rz   r   s              r"   test_init_transformationr      s   
)


#
#CA!!LLLDAq )j
9
9
9CGGAqMMM 0X>>>JNN1a .6:::HLLA -%888GKK1 -%888GKK188AGAJ
++D
(d
3
3
3CGGAqMMM 88AGAJ
Q//D
(d
3
3
3C	BTZ] 	B 	B3471:	B 	B 	B 
 
z3	8	8	8  1               88AGAJNAGAJ//D
(d
3
3
3C	Ddjm 	D 	D26*Q-	D 	D 	D 
 
z3	8	8	8  1               88AGAJ
++D71:>L
(d
N
N
NC	;+7	; 	; *.A	; 	; 	;  
z3	8	8	8  1                 s6   G44G8;G8
J--J14J1M**M.1M.r   )r   r&         r   	n_classes)r&   r   r   r   c                    t           j                            d          }t          d|d|          }|| k    rd S |                    | |          }t          j        t          |          | |z  dz             d |          }||k    rd S t          |          }|                    ||           |t          |dz
  |          k    r$t          |          
                    d          }	n[|t          ||           k     r$t          |          
                    d          }	n#t          |          
                    d          }	|	                    ||           t          |j        |	j                   d S )	Nr   r   r   )r   r   max_iterr   r   rl   r   r   )r   rD   rE   r   rF   tileranger   r   min
set_paramsr   components_)
r   r   r   r   rK   nca_baser   r   r    	nca_others
             r"   test_auto_initr   
  sl    )


#
#C-,  H I IIi,,GE)$$i9&<q&@AA*9*M*$$ D//CGGAqMMMs9q=*====!(OO66E6BB		J	 : :::!(OO66E6BB		!(OO66J6GG	MM!Q%coy7LMMMMMr$   c                     t          dddddd          \  } }t          dd          }|                    | |           t          dddddd          \  }}d|j        d	          d
|j        j        d	          d}t          j        t          t          j	        |                    5  |                    ||           d d d            d S # 1 swxY w Y   d S )Nr   r&   re   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 (ri   rj   )
r	   r   r   r\   r   r^   ru   rv   rw   rx   )r   r   r    X_less_featuresrz   s        r"   test_warm_start_validationr   -  sM     DAq )D1
E
E
ECGGAqMMM,  OQ	8/*?*B 	8 	8?03	8 	8 	8 
 
z3	8	8	8 $ $###$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $s   )CCCc                     t          dd          } |                     t          t                     | j        }d| _        |                     t          t                     | j        }t          dd          }|                    t          t                     |j        }d|_        |                    t          t                     |j        }t          j        t          j        ||z
                      }t          j        t          j        ||z
                      }|dk     s
J d            ||k    s
J 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   sumrJ   )nca_warmtransformation_warmtransformation_warm_plus_onenca_coldtransformation_coldtransformation_cold_plus_one	diff_warm	diff_colds           r"   test_warm_start_effectivenessr   K  s+    .ANNNHLLK(((".HLLK(((#+#7 -QOOOHLLK(((".HLLK(((#+#7 rv:=PPQQRRIrv:=PPQQRRIs???	5 ??
 y   	+ !    r$   	init_name)r   r   r   rD   precomputedc                    t           j                            d          }t          dddd          \  }}d}d|z   d	|z   d
}| dk    r-|                    |j        d         |j        d                   }n| }t          d|          }|                    ||           |                                \  }	}
t          j
        d|	          }| d
v r-t          j        ||          |d                   sJ |dd          }|d         dk    sJ d                    ddd          }|d         d                    |          k    sJ |d         d                    dt          |          z            k    sJ |dd         D ]}t          j        d|          sJ t          j        d|d                   sJ |d         dk    sJ d S )Nr   r   r}   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   rD   rE   r   rF   r\   r   r   
readouterrrw   splitrk   formatlen)r   capsysrK   r   r   regexp_initmsgsr   r    outr;   linesheaderlines                 r"   test_verboser   k  s    )


#
#CA!!LLLDAq/K-;7+E D M!!yyQWQZ00
(
>
>
>CGGAqMMM  FC HUC  E N""xYq22222abb	899999#**;8I9UUF8<CCFKKKKKK8<CCC#f++DUVVVVVVad 
 
 x%
 
 	
 	
 	
 	

 8Ob	     9??????r$   c                     t                      }|                    t          t                     |                                 \  }}|dk    sJ d S )Nr   )r   r   r   r   r   )r   r    r   r;   s       r"   test_no_verboser     sG    
(
*
*CGGI{###  FC"999999r$   c                     t                                           } t                                          }d}t          j        ||k              \  }d||<   |||d         <   t          d          }|                    | |           t          j        |dk              \  }t          j        |dk              \  }d||<   d||d         <   d||<   d||d         <   t          d          }|                    | |           t          j        |dk              \  }t          j        |dk              \  }t          j        |dk              \  }| |d         |d         |d         g         } ||d         |d         |d         g         }t          dd          }|                    | |           t          | |                    |                      d S )Nr   r   r   r   )r   r   )r   r   )	r   copyr   r   wherer   r   r   r   )r   r   singleton_classind_singletonr    ind_1ind_2ind_0s           r"   test_singleton_classr     s   AA Ox_ 455]Am)AmA
("
5
5
5CGGAqMMM xQHUxQHUAeHAeAhKAeHAeAhK
("
5
5
5CGGAqMMM xQHUxQHUxQHU	58U1XuQx
()A	58U1XuQx
()A
(j2
F
F
FCGGAqMMMq#--**+++++r$   c                  
   t           t          dk             } t          t          dk             }t          d| j        d         d          }|                    | |           t          | |                    |                      d S )Nr   r   r   r   )r   r   r   )r   r   r   r\   r   r   r   )r   r   r    s      r"   test_one_classr     sv    +"#AK1$%A
(!'!*:  C GGAqMMMq#--**+++++r$   c                     dfd}t          |d          }|                    t          t                     |                                 \  }}d                    dz
            |v sJ d S )Nrm   c                     | j         t          j         d         dz  fk    sJ |z
  }t          d                    |                     d S )Nr   r   {} iterations remaining...)r\   r   rI   r   )r9   r:   rem_iterr   s      r"   my_cbztest_callback.<locals>.my_cb  sS    #	(:a(?'AAAAAf$*11(;;<<<<<r$   r   )r   r<   r   r   )r   r   r   r   r   r   )r   r   r    r   r;   r   s        @r"   test_callbackr     s    H= = = = = )(UTU
V
V
VCGGI{###  FC (..x!|<<CCCCCCr$   c                      t           } t          } G d d          } || |          }|j        }t          d|          }|                    | |           |j        j        | j        d         dz  k    sJ dS )z4Test that the transformation has the expected shape.c                       e Zd Zd Zd ZdS )@test_expected_transformation_shape.<locals>.TransformationStorerc                 @   t                      | _        t          j        | j        _        t          | j        ||d          \  | _        }t                                          |          }|d d t          j	        f         |t          j	        d d f         k    | _
        d S r+   )r   r/   r   r-   r0   r   r   r   r1   r2   r3   r4   s      r"   r6   zItest_expected_transformation_shape.<locals>.TransformationStorer.__init__  s     ;<<DM$&FDM!%dmQaPPPIDFA,,Q//A#$QQQ
]#3qQQQ7G#GD   r$   c                     || _         dS )zWStores the last value of the transformation taken as input by
            the optimizerN)r9   )r5   r9   r:   s      r"   r<   zItest_expected_transformation_shape.<locals>.TransformationStorer.callback  s     #1Dr$   Nr=   rA   r$   r"   TransformationStorerr     s5        	H 	H 	H	1 	1 	1 	1 	1r$   r   r&   )r   r<   r   r   N)r   r   r<   r   r   r9   sizer\   )r   r   r   transformation_storercbr    s         r"   "test_expected_transformation_shaper     s    AA1 1 1 1 1 1 1 1 10A66		'B
(!b
A
A
ACGGAqMMM /4
aGGGGGGr$   c                  6   t          dd          } | j        j        }d                    |          }t	          j        t          t          j        |                    5  | 	                    t          t                     d d d            d S # 1 swxY w Y   d S )Nr   r   )r   r   z[{}] NCA did not convergerj   )r   	__class__r>   r   r^   warnsr
   rw   rx   r   r   r   )r    cls_namerz   s      r"   test_convergence_warningr     s    
(!Q
?
?
?C}%H
%
,
,X
6
6C	(	#	?	?	? ( (	;'''( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (s    !BBBzparam, valuer   r   d   tolrZ   c                 j    t          di | |i}t          }t          }|                    ||           d S )NrA   )r   r   r   r   )paramvaluer    r   r   s        r"   test_parameters_valid_typesr     s:     )
:
:E5>
:
:CAAGGAqMMMMMr$   r   c                 |   t           }t          }t          |                               ||          }|                                }|j        j                                        | | }n|j        d         }t          j
        fdt          |          D             t                    }t          ||           dS )zCheck `get_feature_names_out` for `NeighborhoodComponentsAnalysis`.

    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/28293
    rq   Nr   c                     g | ]} | 	S rA   rA   ).0iclass_name_lowers     r"   
<listcomp>z.test_nca_feature_names_out.<locals>.<listcomp>/  s%    FFFa	!a	!	!FFFr$   )dtype)r   r   r   r   get_feature_names_outr   r>   lowerr\   r   r   r   objectr   )r   r   r   est	names_outexpected_n_featuresexpected_names_outr   s          @r"   test_nca_feature_names_outr     s     	AA
(l
C
C
C
G
G1
M
MC))++I}-3355*gajFFFF51D+E+EFFF  
 y"455555r$   )B__doc__rw   numpyr   r^   numpy.testingr   r   scipy.optimizer   sklearnr   sklearn.datasetsr   r   r	   sklearn.exceptionsr
   sklearn.metricsr   sklearn.neighborsr   sklearn.preprocessingr   sklearn.utilsr   sklearn.utils.validationr   rK   irispermutationtargetr   permdatar   r   flags	writeablefinfofloatepsEPSr#   rO   rb   r{   r   r   r   markparametrizer   r   r   r   r   r   r   r   r   r   int32float32r   r   rA   r$   r"   <module>r     s    
			      G G G G G G G G % % % % % %       G G G G G G G G G G 1 1 1 1 1 1 . . . . . . < < < < < < . . . . . . , , , , , , 2 2 2 2 2 2y{{
t{'((IdO	k$!	 #  bhuooX X X$'- '- '-T0 0 021 1 12B B B*     F= = =@ mmm44}}}55jjj1177N N 87 21 65 54N>$ $ $<  @ DDD ) ) )X  !, !, !,H, , ,D D D"H H H6( ( ( 	!%	XRXc]]#	

6""#    $336 6 436 6 6r$   