
    _nd4              
          d dl 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	 d dl
mZmZmZ d dlmZ d&dZd	 Zd
 Ze	d             Zd Zd Zd Zd Zej                            dd          d             Zd Zd Zej                            deeg          ej                            dddg          d                         Zej                            deef          ej                            dd          ej                            dej        ej        fej         ej         fej!        ej         fej"        ej         ff          d                                     Z#ej                            deef          ej                            dd          d                         Z$ej                            deeg          d             Z%d  Z&d! Z'd" Z(d# Z)d$ Z*ej                            deeg          d%             Z+dS )'    N)assert_array_equal)assert_array_almost_equal)assert_allclose)!if_safe_multiprocessing_with_blas)	SparsePCAMiniBatchSparsePCAPCA)check_random_statec                    |d         |d         z  }t          |          }|                    ||           }|                    | |          }g d}g d}	t          |           D ]}
t          j        |          }||
         d         |	|
         z
  ||
         d         |	|
         z   }}||
         d         |	|
         z
  ||
         d         |	|
         z   }}d|||         d d ||f<   |                                ||
d d f<   t          j        ||          }|d|                    |j        d         |j        d                   z  z  }|||fS )Nr      ))   r   )      )   r   )r      r   g      ?g?)r
   randnrangenpzerosraveldotshape)n_components	n_samples
image_sizerandom_state
n_featuresrngUVcentersszkimgxminxmaxyminymaxYs                    Klib/python3.11/site-packages/sklearn/decomposition/tests/test_sparse_pca.pygenerate_toy_datar+      sU   AA.J
\
*
*C		)\**A		,
++A&&&G	B<    hz""QZ]RU*GAJqMBqE,AdQZ]RU*GAJqMBqE,Ad'*DIqqq$t)|$))++!QQQ$ 	q!AsyyQWQZ00	00Aa7N    c                     t           j                            d          } |                     dd          }t	          d|           }|                    |          }|j        j        dk    sJ |j        dk    sJ t	          d|           }|                    |          }|j        j        d	k    sJ |j        d
k    sJ d S Nr      
   r   r   r   )r   r0   )r/   r      )r2   r0   )r/   r2   )r   randomRandomStater   r   fit_transformcomponents_r   )r   Xspcar   s       r*   test_correct_shapesr9   ,   s    
)


"
"C		"bA!#666D1A!W,,,,7g"3777D1A!X----7hr,   c                  J   d} t           j                            d          }t          ddd|          \  }}}t	          dd| d          }|                    |           t	          dd	d| 
          }|                    |           t          |j        |j                   d S )Nr   r   r   r0   r   r   r   larsr   methodalphar   cd)r   r?   r   r@   )r   r3   r4   r+   r   fitr   r6   )r@   r   r)   _	spca_lars
spca_lassos         r*   test_fit_transformrF   :   s    E
)


"
"C2vC@@@GAq!quSTUUUIMM! $QeTTTJNN1j4i6KLLLLLr,   c                     d} t           j                            d          }t          ddd|          \  }}}t	          dd| d          }|                    |           |                    |          }t	          dd	d| d
                              |          }|                    |          }t          j        |j        dk              rJ t          ||           d S )Nr   r   r   r0   r;   r<   r=   r>   r   )r   n_jobsr?   r@   r   )
r   r3   r4   r+   r   rB   	transformallr6   r   )r@   r   r)   rC   rD   U1r8   U2s           r*   test_fit_transform_parallelrM   G   s    E
)


"
"C2vC@@@GAq!quSTUUUIMM!			Q		Bqu1  	c!ff 	 
		Bvi+q011111b"%%%%%r,   c                     t           j                            d          } t          ddd|           \  }}}d|d d df<   t	          d          }t          j        t          j        |                    |                              rJ d S )Nr   r   r0   r;   r<   r   r   )r   r3   r4   r+   r   anyisnanr5   )r   r)   rC   	estimators       r*   test_transform_nanrS   X   s     )


"
"C2vC@@@GAq!AaaadGq)))Ivbhy66q99::;;;;;;;r,   c                  T   t           j                            d          } t          ddd|           \  }}}t	          dd|           }|                    |          }t	          dd|           }|                    |                              |          }t          ||           d S )	Nr   r   A   r;   r<   r=   )r   r?   r   rA   )	r   r3   r4   r+   r   r5   rB   rI   r   )r   r)   rC   rD   rK   rE   rL   s          r*   test_fit_transform_tallrV   b   s    
)


"
"C2vC@@@GAq!qcJJJI		 	 	#	#B$SIIIJ				$	$Q	'	'Bb"%%%%%r,   c                     t           j                            d          } |                     dd          }|                     dd          }t	          d||d|           }|                    |                     dd                     t          |j        |t           j        	                    |d          d d d f         z             d S )Nr      r      )r   U_initV_initmax_iterr   r   )axis)
r   r3   r4   r   r   rB   r   r6   linalgnorm)r   rZ   r[   models       r*   test_initializationra   l   s    
)


"
"CYYq!__FYYq!__Fvfqs  E 
IIcii1ooE%v	vA0N0NqqqRVw0W'WXXXXXr,   c                     t           j                            d          } |                     dd          }t	          d|           }|                    |          }|j        j        dk    sJ |j        dk    sJ t	          d|           }|                    |          }|j        j        d	k    sJ |j        d
k    sJ d S r.   )r   r3   r4   r   r   r5   r6   r   )r   r7   pcar   s       r*   test_mini_batch_correct_shapesrd   w   s    
)


"
"C		"bA
!#
>
>
>C!A? G++++7g
"3
?
?
?C!A? H,,,,7hr,   Tz"skipping mini_batch_fit_transform.)reasonc                  J   d} t           j                            d          }t          ddd|          \  }}}t	          dd|                               |          }|                    |          }t          j        dk    rvdd l	}|j
        j        }d |j
        _        	 t	          dd	| d
          }|                    |                              |          }	||j
        _        nL# ||j
        _        w xY wt	          dd	| d
          }|                    |                              |          }	t          j        |j        dk              rJ t          ||	           t	          dd| d                              |          }
t          |
j        |j                   d S )Nr   r   r   r0   r;   r<   )r   r   r@   win32r   )r   rH   r@   r   rA   r>   )r   r3   r4   r+   r   rB   rI   sysplatformjoblibparallelmultiprocessingrJ   r6   r   )r@   r   r)   rC   rD   rK   rj   _mpr8   rL   rE   s              r*   test_mini_batch_fit_transformrn      s   E
)


"
"C2vC@@@GAq!"OOOSSTUVVI			Q		B
|wo-*.'	2%qA  D !&&q))B.1FO++cFO+1111!q%VWXXXXXa[[""1%%vi+q011111b"%%%#t5q  	c!ff  j4i6KLLLLLs    ;C( (C6c                  8   d} t           j                            d          }t          ddd|          \  }}}t	          dd| |          }|                    |          }|                    |d d	                   }t          |d         |d                    d S )
Nr   r   r     r;   r<   r=   r>   r0   )r   r3   r4   r+   r   r5   rI   r   )r@   r   r)   rC   rD   results_trainresults_tests          r*   test_scaling_fit_transformrs      s    E
)


"
"C4cBBBGAq!quSVWWWI++A..M&&q"v..LM!$l1o66666r,   c                     t           j                            d          } t          ddd|           \  }}}t          ddd|           \  }}}t	          ddd          }t          d	          }|                    |           |                    |           |                    |          }|                    |          }t          t          j	        |j
                            |j
        j                            t          j        d          d
           |t          j        |dd d f                   z  }|t          j        |dd d f                   z  }t          ||           d S )Nr   r   rp   r;   r<   r0   r   )r@   ridge_alphar   rO   gh㈵>)atol)r   r3   r4   r+   r   r	   rB   rI   r   absr6   r   Teyesign)r   r)   rC   Zr8   rc   results_test_pcaresults_test_spcas           r*   test_pca_vs_spcar~      s[   
)


"
"C4cBBBGAq!2vC@@@GAq!1!!<<<D
1


CGGAJJJHHQKKK}}Q''q))
t##CO$56677     0AAA 6777!21aaa4!8999$&788888r,   SPCAr   r   c                     t           j                            d          }d\  }}|                    ||          } | |                              |          }||j        |k    sJ d S |j        |k    sJ d S )Nr   r/   r0   rO   )r   r3   r4   r   rB   n_components_)r   r   r   r   r   r7   r`   s          r*   test_spca_n_components_r      s     )


"
"C"Iz		)Z((ADl+++//22E"l222222"j000000r,   r?   )r=   rA   zdata_type, expected_typec                 $   d\  }}}t           j                            d          }|                    ||                              |          } | ||          }	|	                    |          }
|
j        |k    sJ |	j        j        |k    sJ d S )Nr/   r0   r   r   )r   r?   )r   r3   r4   r   astyper5   dtyper6   )r   r?   	data_typeexpected_typer   r   r   r   input_arrayr`   transformeds              r*   test_sparse_pca_dtype_matchr      s     +4'Iz<
)


"
"C))Iz2299)DDKDl6:::E%%k22K----"m333333r,   c                    d}d}d\  }}}t           j                            d          }|                    ||          } | |||d          }	|	                    |                    t           j                            }
 | |||d          }|                    |                    t           j                            }t          ||
|           t          |j	        |	j	        |           d S )NMbP?r   r   r   )r   r@   r?   r   )rtol)
r   r3   r4   r   r5   r   float32float64r   r6   )r   r?   r   r@   r   r   r   r   r   model_32transformed_32model_64transformed_64s                r*   %test_sparse_pca_numerical_consistencyr      s     DE*3'Iz<
)


"
"C))Iz22Kt!vA  H ++K,>,>rz,J,JKKNt!vA  H ++K,>,>rz,J,JKKNNN>>>>H((*>TJJJJJJr,   c                 f   t           j                            d          }d\  }}|                    ||          } | d                              |          }|                                }| j                                        t          fdt          d          D             |           dS )z'Check feature names out for *SparsePCA.r   r   rY   rO   c                     g | ]} | 	S  r   ).0iestimator_names     r*   
<listcomp>z/test_spca_feature_names_out.<locals>.<listcomp>  s$    AAA1>.1..AAAr,   N)
r   r3   r4   r   rB   get_feature_names_out__name__lowerr   r   )r   r   r   r   r7   r`   namesr   s          @r*   test_spca_feature_names_outr      s     )


"
"C"Iz		)Z((ADa   $$Q''E''))E]((**NAAAAaAAA5IIIIIr,   c                     t           j                            d          } d\  }}|                     ||          }d}t	          j        t          |          5  t          d                              |           ddd           n# 1 swxY w Y   d\  }}t	          j        t          |          5  t          ||d	                              |          }ddd           n# 1 swxY w Y   |j	        d
k    sJ |j	        |k    sJ dS )zvCheck that we raise a warning for the deprecation of `n_iter` and it is ignored
    when `max_iter` is specified.
    r   r   z9'n_iter' is deprecated in version 1.1 and will be removedmatchr   )n_iterN)r   d   )r   r\   r   r   )
r   r3   r4   r   pytestwarnsFutureWarningr   rB   n_iter_)r   r   r   r7   warn_msgr   r\   r`   s           r*   test_spca_n_iter_deprecationr     s    )


"
"C"Iz		)Z((AJH	m8	4	4	4 , ,!$$$((+++, , , , , , , , , , , , , , , FH	m8	4	4	4  "H1
 
 

#a&& 	               =1=H$$$$$$s$   $BBB3&C%%C),C)c            	         t          j        ddgddgddgddgddgddgg          } t          d                              |           }t	          j        t          d	          5  |j         d d d            d S # 1 swxY w Y   d S )
Nr   r   r   rO   z`n_features_` was deprecatedr   )r   arrayr	   rB   r   r   r   n_features_)r7   rc   s     r*   test_pca_n_features_deprecationr   $  s    
2r(RHr2hAAAGHHA
1



!
!!
$
$C	m+I	J	J	J                   s   %A::A>A>c                    t           j                            |           }d\  }}|                    ||          }t	          dd|                               |          }t	          dd|                               |          }|j        |j        k     sJ t	          ddd|                               |          }t	          ddd|                               |          }|j        |j        k     sJ d	S )
z@Check that `tol` and `max_no_improvement` act as early stopping.)2   r0   r   g      ?)r\   tolr   r   gư>r   )r\   r   max_no_improvementr   N)r   r3   r4   r   r   rB   r   )global_random_seedr   r   r   r7   model_early_stoppedmodel_not_early_stoppeds          r*   test_spca_early_stoppingr   +  s#   
)

 2
3
3C"Iz		)Z((A -#,>  	c!ff  1$-?  	c!ff  &)@)HHHHH -$1CU  	c!ff  1$3EW  	c!ff  &)@)HHHHHHHr,   c                 @   t           j                            |           }|                    dd          }d}t	          |dd                              |          }t          |dddd                              |          }t          |j        |j                   d	S )
zCheck the equivalence of the components found by PCA and SparsePCA.

    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/23932
    r   rY   r   
randomizedr   )r   
svd_solverr   r=   )r   r?   ru   r@   r   N)	r   r3   r4   r   r	   rB   r   r   r6   )r   r   r7   r   rc   r8   s         r*   $test_equivalence_components_pca_spcar   E  s     )

 2
3
3C		"aAL
!   
c!ff	 
 !   
c!ff 	 COT%566666r,   c                     t           j                            d          } d\  }}|                     ||          }d}t	          |ddd          }t          |d          }|                    |          }|                    |          }t          |                    |          |                    |                     dS )zDCheck that `inverse_transform` in `SparsePCA` and `PCA` are similar.r   r0   rX   r   -q=r   r@   ru   r   r1   N)	r   r3   r4   r   r   r	   r5   r   inverse_transform)	r   r   r   r7   r   r8   rc   X_trans_spcaX_trans_pcas	            r*   !test_sparse_pca_inverse_transformr   _  s    
)


"
"C!Iz		)Z((AL!EPQ  D <a
8
8
8C%%a((L##A&&K|,,c.C.CK.P.P    r,   c                    t           j                            d          }d\  }}|                    ||          }|} | |ddd          }|                    |          }t          |                    |          |           dS )z^Check the `transform` and `inverse_transform` round trip with no loss of
    information.
    r   r   r   r   N)r   r3   r4   r   r5   r   r   )r   r   r   r   r7   r   r8   r   s           r*   +test_transform_inverse_transform_round_tripr   q  s    
 )


"
"C!Iz		)Z((AL4!EPQ  D %%a((LD**<88!<<<<<r,   )N),rh   r   numpyr   numpy.testingr   sklearn.utils._testingr   r   r   sklearn.decompositionr   r   r	   sklearn.utilsr
   r+   r9   rF   rM   rS   rV   ra   rd   markskipifrn   rs   r~   parametrizer   r   r   int32int64r   r   r   r   r   r   r   r   r   r   r,   r*   <module>r      s   


      , , , , , , < < < < < < 2 2 2 2 2 2 D D D D D D D D D D D D D D D D , , , , , ,   4  
M 
M 
M #& & #"& < < <& & &Y Y Y   D!EFFM M GFM>7 7 79 9 9$ )-?!@AA$33
1 
1 43 BA
1 )-?!@AA>22	RZ 	RZ 	2:	2:	 	4 	4  32 BA	4 )-?!@AA>22K K 32 BAK, )-?!@AA
J 
J BA
J% % %*  I I I47 7 74  $ )-?!@AA= = BA= = =r,   