
    h$,fB2              
          d dl Z d dlZd dl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mZmZ d#dZd Zd Zed	        Zd
 Zd Zd Zd Zej0                  j3                  dd      d        Zd Zd Zej0                  j;                  de	eg      ej0                  j;                  dddg      d               Zej0                  j;                  de	ef      ej0                  j;                  dd      ej0                  j;                  dej>                  ej>                  fej@                  ej@                  fejB                  ej@                  fejD                  ej@                  ff      d                      Z#ej0                  j;                  de	ef      ej0                  j;                  dd      d               Z$ej0                  j;                  de	eg      d        Z%d Z&d Z'd  Z(d! Z)ej0                  j;                  de	eg      d"        Z*y)$    N)assert_array_equal)PCAMiniBatchSparsePCA	SparsePCA)check_random_state)assert_allcloseassert_array_almost_equal!if_safe_multiprocessing_with_blasc                 $   |d   |d   z  }t        |      }|j                  ||       }|j                  | |      }g d}g d}	t        |       D ]t  }
t        j                  |      }||
   d   |	|
   z
  ||
   d   |	|
   z   }}||
   d   |	|
   z
  ||
   d   |	|
   z   }}d||| d d ||f<   |j                         ||
d d f<   v t        j                  ||      }|d|j                  |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.12/site-packages/sklearn/decomposition/tests/test_sparse_pca.pygenerate_toy_datar+      s1   AA.J
\
*C		)\*A		,
+A&G	B<  hhz"QZ]RU*GAJqMBqE,AdQZ]RU*GAJqMBqE,Ad'*Dq$t)|$))+!Q$ 	q!AsyyQWWQZ0	00Aa7N    c                     t         j                  j                  d      } | j                  dd      }t	        d|       }|j                  |      }|j                  j                  dk(  sJ |j                  dk(  sJ t	        d|       }|j                  |      }|j                  j                  d	k(  sJ |j                  d
k(  sJ y )Nr      
   r   r   r   r   r/   r.   r      r3   r/   r.   r3   )r   randomRandomStater   r   fit_transformcomponents_r   )r   Xspcar   s       r*   test_correct_shapesr<   -   s    
))


"C		"bA!#6D1A!!W,,,77g"37D1A!!X---77hr,   c                  ,   d} t         j                  j                  d      }t        ddd|      \  }}}t	        dd| d      }|j                  |       t	        dd	d| 
      }|j                  |       t        |j                  |j                         y )Nr   r   r   r/   r   r   r   larsr   methodalphar   cd)r   rB   r   rC   )r   r6   r7   r+   r   fitr	   r9   )rC   r   r)   _	spca_lars
spca_lassos         r*   test_fit_transformrI   ;   s    E
))


"C2vC@GAq!quSTUIMM! $QeTJNN1j44i6K6KLr,   c                     d} t         j                  j                  d      }t        ddd|      \  }}}t	        dd| d      }|j                  |       |j                  |      }t	        dd	d| d
      j                  |      }|j                  |      }t        j                  |j                  dk(        rJ t        ||       y )Nr   r   r   r/   r>   r?   r@   rA   r   )r   n_jobsrB   rC   r   )
r   r6   r7   r+   r   rE   	transformallr9   r	   )rC   r   r)   rF   rG   U1r;   U2s           r*   test_fit_transform_parallelrP   H   s    E
))


"C2vC@GAq!quSTUIMM!			Q	Bqu1	c!f 	 
	Bvvi++q0111b"%r,   c                     t         j                  j                  d      } t        ddd|       \  }}}d|d d df<   t	        d      }t        j
                  t        j                  |j                  |                  rJ y )Nr   r   r/   r>   r?   r   r   )r   r6   r7   r+   r   anyisnanr8   )r   r)   rF   	estimators       r*   test_transform_nanrV   Y   sn     ))


"C2vC@GAq!AadGq)Ivvbhhy66q9:;;;;r,   c                     t         j                  j                  d      } t        ddd|       \  }}}t	        dd|       }|j                  |      }t	        dd|       }|j                  |      j                  |      }t        ||       y )	Nr   r   A   r>   r?   r@   )r   rB   r   rD   )	r   r6   r7   r+   r   r8   rE   rL   r	   )r   r)   rF   rG   rN   rH   rO   s          r*   test_fit_transform_tallrY   c   s{    
))


"C2vC@GAq!qcJI		 	 	#B$SIJ			$	$Q	'Bb"%r,   c                  j   t         j                  j                  d      } | j                  dd      }| j                  dd      }t	        d||d|       }|j                  | j                  dd             t        |j                  |t         j                  j                  |d      d d d f   z         y )Nr      r      )r   U_initV_initmax_iterr   r   )axis)
r   r6   r7   r   r   rE   r   r9   linalgnorm)r   r]   r^   models       r*   test_initializationrd   m   s    
))


"CYYq!_FYYq!_FvfqsE 
IIcii1oE%%v		vA0NqRVw0W'WXr,   c                     t         j                  j                  d      } | j                  dd      }t	        dd|       }|j                  |      }|j                  j                  dk(  sJ |j                  dk(  sJ t	        d	d|       }|j                  |      }|j                  j                  d
k(  sJ |j                  dk(  sJ y )Nr   r.   r/   r   r   )r   r_   r   r1   r2   r3   r4   r5   )r   r6   r7   r   r   r8   r9   r   )r   r:   pcar   s       r*   test_mini_batch_correct_shapesrg   x   s    
))


"C		"bA
!ac
JC!A??  G+++77g
"qs
KC!A??  H,,,77hr,   Tz"skipping mini_batch_fit_transform.)reasonc                  .   d} t         j                  j                  d      }t        ddd|      \  }}}t	        dd|       j                  |      }|j                  |      }t        j                  dk(  rmdd l	}|j                  j                  }d |j                  _        	 t	        dd	| d
      }|j                  |      j                  |      }	||j                  _        n/t	        dd	| d
      }|j                  |      j                  |      }	t        j                  |j                  dk(        rJ t        ||	       t	        dd| d      j                  |      }
t        |
j                  |j                         y # ||j                  _        w xY w)Nr   r   r   r/   r>   r?   )r   r   rC   win32r   )r   rK   rC   r   rD   rA   )r   r6   r7   r+   r   rE   rL   sysplatformjoblibparallelmultiprocessingrM   r9   r	   )rC   r   r)   rF   rG   rN   rm   _mpr;   rO   rH   s              r*   test_mini_batch_fit_transformrq      sZ   E
))


"C2vC@GAq!"OSSTUVI			Q	B
||woo--*.'	2%qAD !&&q)B.1FOO+!q%VWXXXa[""1%vvi++q0111b"%#t5q	c!f  j44i6K6KL /2FOO+s   "/F Fc                      d} t         j                  j                  d      }t        ddd|      \  }}}t	        dd| |      }|j                  |      }|j                  |d d	       }t        |d   |d          y )
Nr   r   r     r>   r?   r@   rA   r/   )r   r6   r7   r+   r   r8   rL   r   )rC   r   r)   rF   rG   results_trainresults_tests          r*   test_scaling_fit_transformrv      s{    E
))


"C4cBGAq!quSVWI++A.M&&q"v.LM!$l1o6r,   c                     t         j                  j                  d      } t        ddd|       \  }}}t        ddd|       \  }}}t	        ddd      }t        d	      }|j                  |       |j                  |       |j                  |      }|j                  |      }t        t        j                  |j                  j                  |j                  j                              t        j                  d      d
       |t        j                  |dd d f         z  }|t        j                  |dd d f         z  }t        ||       y )Nr   r   rs   r>   r?   r/   r   )rC   ridge_alphar   rR   gh㈵>)atol)r   r6   r7   r+   r   r   rE   rL   r   absr9   r   Teyesign)r   r)   rF   Zr;   rf   results_test_pcaresults_test_spcas           r*   test_pca_vs_spcar      s   
))


"C4cBGAq!2vC@GAq!1!!<D
1
CGGAJHHQK}}Q'q)
t##COO$5$567  0A 677!21a4!899$&78r,   SPCAr   r   c                     t         j                  j                  d      }d\  }}|j                  ||      } | |      j	                  |      }||j
                  |k(  sJ y |j
                  |k(  sJ y )Nr   r.   r/   rR   )r   r6   r7   r   rE   n_components_)r   r   r   r   r   r:   rc   s          r*   test_spca_n_components_r      su     ))


"C"Iz		)Z(Al+//2E""l222""j000r,   rB   )r@   rD   zdata_type, expected_typec                    d\  }}}t         j                  j                  d      }|j                  ||      j	                  |      } | ||      }	|	j                  |      }
|
j                  |k(  sJ |	j                  j                  |k(  sJ y )Nr.   r/   r   r   )r   rB   )r   r6   r7   r   astyper8   dtyper9   )r   rB   	data_typeexpected_typer   r   r   r   input_arrayrc   transformeds              r*   test_sparse_pca_dtype_matchr      s     +4'Iz<
))


"C))Iz299)DKl6:E%%k2K---""m333r,   c                    d}d}d\  }}}t         j                  j                  d      }|j                  ||      } | |||d      }	|	j	                  |j                  t         j                              }
 | |||d      }|j	                  |j                  t         j                              }t        ||
|       t        |j                  |	j                  |       y )NMbP?r   r   r   )r   rC   rB   r   )rtol)
r   r6   r7   r   r8   r   float32float64r   r9   )r   rB   r   rC   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2K!vAH ++K,>,>rzz,JKN!vAH ++K,>,>rzz,JKNNN>H(((*>*>TJr,   c                 L   t         j                  j                  d      }d\  }}|j                  ||      } | d      j	                  |      }|j                         }| j                  j                         }t        t        d      D cg c]  }| | 
 c}|       yc c}w )z'Check feature names out for *SparsePCA.r   r   r\   rR   N)
r   r6   r7   r   rE   get_feature_names_out__name__lowerr   r   )	r   r   r   r   r:   rc   namesestimator_nameis	            r*   test_spca_feature_names_outr     s     ))


"C"Iz		)Z(Aa $$Q'E'')E]]((*NaA1>*1#.A5IAs   B!c                  
   t         j                  j                  d      } d\  }}| j                  ||      }d}t	        j
                  t        |      5  t        d      j                  |       ddd       y# 1 sw Y   yxY w)zECheck that we raise a warning for the deprecation of `max_iter=None`.r   r   z@`max_iter=None` is deprecated in version 1.4 and will be removed)matchN)r_   )	r   r6   r7   r   pytestwarnsFutureWarningr   rE   )r   r   r   r:   warn_msgs        r*   #test_spca_max_iter_None_deprecationr     sk    
))


"C"Iz		)Z(AQH	m8	4 1D)--a01 1 1s   A99Bc                    t         j                  j                  |       }d\  }}|j                  ||      }t	        dd|       j                  |      }t	        dd|       j                  |      }|j                  |j                  k  sJ t	        ddd|       j                  |      }t	        ddd|       j                  |      }|j                  |j                  k  sJ y	)
z@Check that `tol` and `max_no_improvement` act as early stopping.)2   r/   d   g      ?)r_   tolr   r   gư>r   )r_   r   max_no_improvementr   N)r   r6   r7   r   r   rE   n_iter_)global_random_seedr   r   r   r:   model_early_stoppedmodel_not_early_stoppeds          r*   test_spca_early_stoppingr     s    
))

 2
3C"Iz		)Z(A -#,>	c!f  1$-?	c!f  &&)@)H)HHHH -$1CU	c!f  1$3EW	c!f  &&)@)H)HHHHr,   c                 "   t         j                  j                  |       }|j                  dd      }d}t	        |dd      j                  |      }t        |dddd      j                  |      }t        |j                  |j                         y	)
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   r\   r   
randomizedr   )r   
svd_solverr   r@   )r   rB   rx   rC   r   N)	r   r6   r7   r   r   rE   r   r   r9   )r   r   r:   r   rf   r;   s         r*   $test_equivalence_components_pca_spcar   5  s     ))

 2
3C		"aAL
! 
c!f	 
 ! 
c!f 	 COOT%5%56r,   c                  D   t         j                  j                  d      } d\  }}| j                  ||      }d}t	        |ddd      }t        |d      }|j                  |      }|j                  |      }t        |j                  |      |j                  |             y)zDCheck that `inverse_transform` in `SparsePCA` and `PCA` are similar.r   r/   r[   r   -q=r   rC   rx   r   r0   N)	r   r6   r7   r   r   r   r8   r   inverse_transform)	r   r   r   r:   r   r;   rf   X_trans_spcaX_trans_pcas	            r*   !test_sparse_pca_inverse_transformr   O  s    
))


"C!Iz		)Z(AL!EPQD <a
8C%%a(L##A&K|,c.C.CK.Pr,   c                     t         j                  j                  d      }d\  }}|j                  ||      }|} | |ddd      }|j	                  |      }t        |j                  |      |       y)z^Check the `transform` and `inverse_transform` round trip with no loss of
    information.
    r   r   r   r   N)r   r6   r7   r   r8   r   r   )r   r   r   r   r:   r   r;   r   s           r*   +test_transform_inverse_transform_round_tripr   a  sr    
 ))


"C!Iz		)Z(AL!EPQD %%a(LD**<8!<r,   )N)+rk   numpyr   r   numpy.testingr   sklearn.decompositionr   r   r   sklearn.utilsr   sklearn.utils._testingr   r	   r
   r+   r<   rI   rP   rV   rY   rd   rg   markskipifrq   rv   r   parametrizer   r   r   int32int64r   r   r   r   r   r   r   r    r,   r*   <module>r      s8      , D D , 4
M #& #& <&Y D!EFM GM>79$ )-?!@A$3
1 4 B
1 )-?!@A>2	RZZ 	RZZ 	2::	2::		4 3 B	4 )-?!@A>2K 3 BK, )-?!@A
J B
J1I474$ )-?!@A= B=r,   