
    rh                     J   d dl Z d dlZd dlZd dlZd dlZd dlZd dlm	Z	 d dl
mZ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mZ d dlmZmZmZmZ d d	lmZ d d
lm Z  d dl!m"Z"m#Z# d dl$m%Z% d dl&m'Z'm(Z(  ej                          Z)g dZ*d\  Z+Z, e-e+e,      Z.d}dZ/ej`                  jc                  de*      ej`                  jc                  d e2de)jf                  jh                  d               d               Z5ej`                  jc                  dg d      ej`                  jc                  dg d      ej`                  jc                  de(e'z         ej`                  jc                  dddg      ej`                  jc                  dg d      d                                    Z6ej`                  jc                  de(e'z         d        Z7ej`                  jc                  ddd g      ej`                  jc                  de(e'z         d!               Z8ej`                  jc                  de(e'z         d"        Z9d# Z:ej`                  jc                  d$d%d&g      ej`                  jc                  d'e*      d(               Z;ej`                  jc                  d) e< e= e>e*      d d*hz
                    ej`                  jc                  d+d,d-g      ej`                  jc                  d.d&d%g      ej`                  jc                  d/d&d%g      d0                             Z?ej`                  jc                  d1ej                  j                  d       j                  d2d3       ej"                  d2d3d4d 5      d    ej                  j                  d       j                  d6d2      gg d78      ej`                  jc                  de*      d9               ZCej`                  jc                  dddg      d:        ZDej`                  jc                  de*      d;        ZEej`                  jc                  de*      d<        ZFej`                  jc                  de*      d=        ZGej`                  jc                  dg d>      ej`                  jc                  d/d&d%g      d?               ZHej`                  jc                  d@ ej                  g dAg dBg       ej                  g dAg dBg      j                  g      ej`                  jc                  dCg dD      dE               ZKej`                  jc                  dFd  e-e)jf                  jh                        fd e-e)jf                  jh                        dz
  fd e-e)jf                  jh                        fg      ej`                  jc                  d@e)jf                  e)jf                  j                  g      dG               ZLej`                  jc                  dd*d g      dH        ZMej`                  jc                  dddg      dI        ZNdJ ZOdK ZPdL ZQdM ZRej`                  jc                  dNe)jf                  dOdPfe)jf                  dQdfej                  j                  d       j                  dRdS      dTdPfg      dU        ZTej`                  jc                  de*      dV        ZUdW ZVej`                  jc                  de*      dX        ZWej`                  jc                  dddg      dY        ZXej`                  jc                  dd dg      dZ        ZYej`                  jc                  d[g d\      d]        ZZej`                  jc                  de*      d^        Z[ej`                  jc                  de*      d_        Z\d` Z]da Z^db Z_dc Z`dd Zade Zbdf Zcdg Zddh Zedi Zfdj Zgej`                  jc                  d$d%d&g      dk        Zhdl Ziej`                  jc                  dm e       e8      ej`                  jc                  dne%eige 8      ej`                  jc                  do edPd p       edPd d%q       edrd d%q       edPdp       edPdd%q       edPddsd t      ge 8      du                      Zjej`                  jc                  dm e       e8      ej`                  jc                  dneige 8      ej`                  jc                  do edvd p      ge 8      dw                      Zkej`                  j                  e j                  j                  dx      dyk7  dz{      d|        Zoy)~    N)assert_array_equal)config_contextdatasets)clone)	load_irismake_classificationmake_low_rank_matrix)PCA)_assess_dimension_infer_dimension)_atol_for_type_convert_to_numpy_get_namespace_device_dtype_ids)yield_namespace_device_dtype_combinationsdevice)_get_check_estimator_ids)_array_api_for_testsassert_allclose) check_array_api_input_and_values)CSC_CONTAINERSCSR_CONTAINERS)fullcovariance_eigharpack
randomizedauto)  i,  c                    t        | j                  |j                  ||       t        | j                  |j                  ||       t        | j                  |j                  ||       t        | j                  |j                  ||       t        | j
                  |j
                  ||       | j                  |j                  k(  sJ | j                  |j                  k(  sJ | j                  |j                  k(  sJ y )Nrtolatol)	r   components_explained_variance_singular_values_mean_noise_variance_n_components_
n_samples_n_features_in_)pca1pca2r!   r"   s       w/var/www/html/ai-insurance-compliance-backend/venv/lib/python3.12/site-packages/sklearn/decomposition/tests/test_pca.py_check_fitted_pca_closer.   '   s    D$$d&6&6TM  $":":D D))4+@+@tRVWDJJ

DAD(($*>*>TPTU!3!3333??doo---$"5"5555    
svd_solvern_components   c                    t         j                  }t        ||       }|j                  |      j	                  |      }|j
                  d   |k(  sJ |j                  |      }t        ||       |j	                  |      }t        ||       |j                         }|j                         }t        t        j                  ||      t        j                  |j
                  d         d       y )Nr1   r0   r2   -q=r"   )irisdatar
   fit	transformshapefit_transformr   get_covarianceget_precisionnpdoteye)r0   r1   XpcaX_rX_r2cov	precisions           r-   test_pcarH   5   s     			A
<J
?C ''!*

q
!C99Q<<''' QDC
--
CC 


C!!#IBFF3	*BFF1771:,>UKr/   density){Gz?皙?g333333?)r2      
   sparse_containerr   r   scale)r2   rM   d   c                    d}d}t         j                  j                  |       } |t        j                  j                  t
        t        ||            }	|j                  |	j                  d         |z  }
|	j                  |
      }	t        |||       }|j                  |	       |	j                         }t        |||       }|j                  |       t        |||        |t        j                  j                  t
        t        ||            }|j                         }t        |j                  |      |j                  |      |       t        |j                  |      |j                  |      |       y)z?Check that the results are the same for sparse and dense input.r5   绽|=random_staterI   r2   r1   r0   rT   r6   N)r?   randomdefault_rngspsparseSPARSE_MSPARSE_Nr;   multiplyr
   r9   toarrayr.   r   r:   )global_random_seedr0   rN   r1   rI   rO   r"   transform_atolrT   rB   scale_vectorrC   XdpcadX2X2ds                   r-   test_pca_sparsere   K   sN    DN99(();<L
		%	 	 	
	A  &&qwwqz2U:L	

< A
!'C
 GGAJ	
B!'D
 	HHRL CD1 

		%	 	 	

B **,CCMM"%s}}S'9OCMM"%t~~c':Pr/   c                 Z   t         j                  j                  |       } |t        j                  j                  t
        t        |d            } |t        j                  j                  t
        t        |d            }t        dd|       }t        dd|       }|j                  |       |j                  |      }t        ||       t        ||j                  |             t        ||j                  |             t        |j                  |      |j                  |             y )NrJ   rS   rM   r   rU   )r?   rV   rW   rX   rY   rZ   r[   r
   r9   r<   r.   r   r:   )r^   rN   rT   rB   rc   pca_fitpca_fit_transformtransformed_Xs           r-   test_pca_sparse_fit_transformrj      s   99(();<L
		%	 	 	
	A 

		%	 	 	

B rhEWXGH;M KKN%33A6MG%67M#4#>#>q#ABM7#4#4Q#78G%%b)+<+F+Fr+JKr/   r   r   c                 J   t         j                  j                  |       } |t        j                  j                  t
        t        |            }t        d|      }d| d}t        j                  t        |      5  |j                  |       d d d        y # 1 sw Y   y xY w)NrT      r4   zWPCA only support sparse inputs with the "arpack" and "covariance_eigh" solvers, while "z" was passedmatch)r?   rV   RandomStaterX   rY   rZ   r[   r
   pytestraises	TypeErrorr9   )r^   r0   rN   rT   rB   rC   error_msg_patterns          r-   test_sparse_pca_solver_errorru      s     99(();<L
		% 	 	
	A 2*
5C	&<|	5  
y(9	: 
  s   >BB"c                 V   t         j                  j                  |       } |t        j                  j                  t
        t        |            }t        dd      j                  |      }t        dd      j                  |      }t        |j                  |j                  d       y)	zHCheck that "auto" and "arpack" solvers are equivalent for sparse inputs.rl   rM   r   r4   r   {Gzt?r!   N)r?   rV   rp   rX   rY   rZ   r[   r
   r9   r   r%   )r^   rN   rT   rB   
pca_arpackpca_autos         r-   7test_sparse_pca_auto_arpack_singluar_values_consistencyr{      s    
 99(();<L
		% 	 	
	A ":>>qAJv6::1=HJ//1J1JQUVr/   c                     d} | dz   }t         j                  j                  dd| |f      }t        |       }t	        j
                         5  t	        j                  dt               |j                  |       d d d        y # 1 sw Y   y xY w)NrM   rL   r2   sizer1   error)	r?   rV   uniformr
   warningscatch_warningssimplefilterRuntimeWarningr9   )r1   
n_featuresrB   rC   s       r-   test_no_empty_slice_warningr      sw    L!J
		"a|Z&@AA
<
(C		 	 	" g~6
  s   ,BB
copyTFsolverc                    t         j                  j                  d      }d}d}d}d}t        j                  |j	                  ||      t        j                  t        j
                  t        j                  dd|            |j	                  ||                  }|d d d dfxx   dz  cc<   |j                  ||fk(  sJ |j                  d	      j                         d
kD  sJ |j                         }t        |d|| dd      }	|	j                  |j                               }
|
j                  ||fk(  sJ |	j                  |      }t        |
|d       t        |
j                  dd      t        j                  |             t        |
j                  d	      t        j                   |      d       |j                         }t        |d||       j#                  |j                               }	|	j                  |      }|j                  ||fk(  sJ |j                  d	      j                         t%        j&                  dd      k(  sJ y )Nr   rP   P   rm   2   g      $@      ?   axisgfffffE@T   )r1   whitenr   r0   rT   iterated_powergMb@?rx   r2   ddofr   r5   r6   F)r1   r   r   r0   gfffffR@rK   )rel)r?   rV   rp   r@   randndiaglinspacer;   stdr   r
   r<   r:   r   onesmeanzerosr9   rq   approx)r   r   rng	n_samplesr   r1   rankrB   X_rC   
X_whitenedX_whitened2X_unwhiteneds                r-   test_whiteningr      s	    ))


"CIJLD 			)T"
rwwr{{4d34ciij6QR	A a"fINI77y*---- 55a5=%%% 
B
!C ""2779-J	<8888--#KJ$7JNNN2BGGL4IJJOOO+RXXl-C%P	
B
!%dv	c"'')n  ==$L)\!:::: #'')V]]4T-JJJJr/   other_svd_solverr   
data_shapetallwiderank_deficientr   c                 	   |dk(  rd\  }}nd\  }}d}|r[t         j                  j                  |      }	t        ||      dz  }
|	j	                  ||z   |
f      |	j	                  |
|f      z  }nt        ||z   |d|      }t        ||      }
|j                  |d	
      }|d | ||d  }}|t         j                  k(  rt        dd      }d}nt        dd      }d}i }| dk(  rd}ddi}n!| dk(  rt        j                  ||      dz
  }nd }t        |d|      }t        d|| ||d|}|j                  |      }t        j                  |      j                         sJ |j                  |k(  sJ |j                  |      }t        j                  |      j                         sJ |j                  |k(  sJ |j                  dk\  j                         sJ t!        |j                  |j                  fi | t!        |j"                  |j"                  fi | |j$                  }t        j                  |      j                         sJ |j$                  }t        j                  |      j                         sJ |j                  |kD  }|j'                         dkD  sJ t!        ||   ||   fi | t!        |d d |f   |d d |f   fi | |j)                  |      }t        j                  |      j                         sJ |j                  |k(  sJ |j)                  |      }t        j                  |      j                         sJ |j                  |k(  sJ t!        |d d |f   |d d |f   fi | |j+                  |      }t        j                  |      j                         sJ |j                  |k(  sJ |j+                  |      }t        j                  |      j                         sJ |j                  |k(  sJ |j$                  j,                  d   |j$                  j,                  d   k(  rt!        ||fi | t!        ||fi | y |j$                  j,                  d   |
k  r-|j                  j                         |kD  sJ t!        ||fi | y t!        |j)                  |      d d |f   |j)                  |      d d |f   fi | y )Nr   )rP   rm   )rm   rP   rM   rL   r~         ?)r   r   tail_strengthrT   Fr   gQ?h㈵>)r"   r!   rR   r5   r   r   r   r   r2   r   r1   r0   r   )r1   r0   r   rT   r    )r?   rV   rW   minstandard_normalr	   astypefloat32dictminimumr
   r<   isfinitealldtyper$   r   explained_variance_ratio_r#   sumr:   inverse_transformr;   )r   r   r   r   r^   global_dtyper   r   n_samples_testr   r   rB   X_trainX_testtolsvariance_thresholdextra_other_kwargsr1   pca_full	pca_otherX_trans_full_trainX_trans_other_trainreference_componentsother_componentsstableX_trans_full_testX_trans_other_testX_recons_full_testX_recons_other_tests                                r-   test_pca_solver_equivalencer     s-    V '	: '	:Nii##$679j)Q.n,d3   
dJ%789 !.0!+	
 9j)	E*A
mQyz]VGrzz!D)!U+"<' .3	X	% zz)Z81< OH !#'	
 I "//8;;)*..000##|333#11':;;*+//111$$444((A-22444H00)2O2OXSWX**++ 
 $//;;+,00222 ,,;;'(,,... )),>>F::<!(02B62JSdS AvI&(:1f9(EIM !**62;;()--///""l222",,V4;;)*..000##|333&q&y13DQY3OXSWX "334EF;;)*..000##|333#556HI;;*+//111$$444!!!$(<(<(B(B1(EE 	*F;d;+V<t<				#	#A	&	- ++//14FFFF*,?H4H 	121f9= 34QY?	
 	
r/   rB   rP   r   N   )n_informativerT   rM   )zrandom-tallzcorrelated-tallzrandom-wide)idsc                 X   t        d|d      }|j                  |       }t        |j                  t	        j
                  |dd             t        j                  j                  t	        j                  | d            d   }t        |d	      d d }t        |j                  |d
       y )NrL   r   rU   r2   r   F)rowvarT)reverserw   rx   )
r
   r<   r   r$   r?   varlinalgeigrF   sorted)rB   r0   rC   X_pcaexpected_results        r-   %test_pca_explained_variance_empiricalr     s     1!
DCa EC++RVVE-JKiimmBFF1U$;<Q?O_d;BQ?OC++_4Hr/   c                 0   t         j                  j                  d      }d\  }}|j                  ||      }t	        dd|      }t	        d| |      }|j                  |       |j                  |       t        |j                  |j                  d       y )Nr   rP   r   rL   r   rU   rw   rx   )r?   rV   rp   r   r
   r9   r   r%   )r0   r   r   r   rB   r   r   s          r-   $test_pca_singular_values_consistencyr     s|    
))


"C#Iz		)Z(Af3GHzLILLOMM!H--y/I/IPTUr/   c           	      l   t         j                  j                  d      }d\  }}|j                  ||      }t	        d| |      }|j                  |      }t        t        j                  |j                  dz        t         j                  j                  |d      dz         t        |j                  t        j                  t        j                  |dz  d                   d\  }}|j                  ||      }t	        d| |      }|j                  |      }|t        j                  t        j                  |dz  d            z  }|d d dfxx   d	z  cc<   |d d d
fxx   dz  cc<   t        j                  ||j                        }|j                  |       t        |j                  g d       y )Nr   r   rL   rU   fror   )rP   n   r   A`"	@r2   X9v@)r   r   r   )r?   rV   rp   r   r
   r<   r   r   r%   r   normsqrtr@   r#   r9   )r0   r   r   r   rB   rC   X_transX_hats           r-   test_pca_singular_valuesr     s_   
))


"C#Iz		)Z(A
1#
FC"G 
s##Q&')G1)L C(("''"&&!!2L*MN %Iz		)Z(A
1#
FC"Grwwrvvgqjq122GAqDMUMAqDMUMFF7COO,EGGENC((*=>r/   c                    t         j                  j                  d      }d\  }}|j                  ||      dz  }|d dxxx t        j                  g d      z  ccc d|j                  d|      z  t        j                  g d      z   }t        d|       j                  |      j                  |      }|t        j                  |dz  j                               z  }t        t        j                  |d   d         d	d
       y )Nr   rP   r   rK   rM   r         r2   rL   r4   r   rw   rx   )r?   rV   rp   r   arrayr
   r9   r:   r   r   r   abs)r0   r   nprB   XtYts          r-   test_pca_check_projectionr     s     ))


"CDAq		!Q#AcrFbhhy!!F	syyA	)!4	4B	!
	3	7	7	:	D	DR	HB"''2q5++-
  BBFF2a58$c5r/   c                     ddgddgg}t        d| d      }|j                  |      }|j                  sJ d       t        |j	                         dd       t        |j                         d	d
       y )Nr   g        r2   r   rU   )rL   r2   r5   r6   gQ?rw   rx   )r
   r<   r;   r   r   r   )r0   rB   rC   r   s       r-   test_pca_check_projection_listr     si     sc3Z A
1!
DC"G== & =GLLNDu5GKKM4d3r/   )r   r   r   c                 :   t         j                  j                  d      }d\  }}|j                  ||      }|d d dfxx   dz  cc<   |g dz  }t	        d| |      j                  |      }|j                  |      }|j                  |      }t        ||d	       y )
Nr   )r   r   r2   r   )r   r   r   rL   r   h㈵>rx   )	r?   rV   rp   r   r
   r9   r:   r   r   )	r0   r   r   r   r   rB   rC   Y	Y_inverses	            r-   test_pca_inverser     s     ))


"CDAq		!QAadGwGNA 1F
C
G
G
JCaA%%a(IAyt,r/   r8   )r   r2   r   )r2   r   r   z!svd_solver, n_components, err_msg))r   r   2must be between 1 and min\(n_samples, n_features\))r   r   r   )r   rL   zmust be strictly less than min)r   r   zZn_components=3 must be between 0 and min\(n_samples, n_features\)=2 with svd_solver='full'c                 p   d}t        ||       }t        j                  t        |      5  |j	                  |       d d d        | dk(  rU|}dj                  ||      }t        j                  t        |      5  t        ||       j	                  |       d d d        y y # 1 sw Y   dxY w# 1 sw Y   y xY w)NrL   r0   rn   r   zgn_components={}L? must be strictly less than min\(n_samples, n_features\)={}L? with svd_solver='arpack')r
   rq   rr   
ValueErrorr9   format)r0   r8   r1   err_msg
smallest_d
pca_fitteds         r-   test_pca_validationr    s    , J\j9J	z	1 t X!""(&z"B 	
 ]]:W5 	?488>	? 	? 	 	? 	?s   B 9B, B),B5zsolver, n_components_c                 `    t        |      }|j                  |        |j                  |k(  sJ y )Nr  )r
   r9   r(   )r8   r   r(   rC   s       r-   test_n_components_noner
  4  s-     
 CGGDM---r/   c                     t         j                  j                  d      }d\  }}|j                  ||      }t	        d|       }|j                  |       |j                  dk(  sJ y )Nr   iX  rM   mler4   r2   )r?   rV   rp   r   r
   r9   r(   )r0   r   r   r   rB   rC   s         r-   test_n_components_mler  C  s]     ))


"C#Iz		)Z(A
5Z
8CGGAJ!!!r/   c                 .   t         j                  j                  d      }d\  }}|j                  ||      }t	        d|       }dj                  |       }t        j                  t        |      5  |j                  |       d d d        y # 1 sw Y   y xY w)Nr   r  r  r4   z:n_components='mle' cannot be a string with svd_solver='{}'rn   )
r?   rV   rp   r   r
   r  rq   rr   r  r9   )r0   r   r   r   rB   rC   r  s          r-   test_n_components_mle_errorr  N  s     ))


"C#Iz		)Z(A
5Z
8CJQQG 
z	1 
  s   0BBc                  8   t         j                  j                  d      } d\  }}| j                  ||      dz  }|d dxxx t        j                  g d      z  ccc t        dd      j                  |      }|j                  dk(  sJ |j                  d	k(  sJ y )
Nr   rP   r   rK   rM   r   r   r   r2   rL   r  r   r4   r2   )	r?   rV   rp   r   r   r
   r9   r1   r(   )r   r   r   rB   rC   s        r-   test_pca_dimr  ]  s    
))


"CDAq		!Q#AcrFbhh''F
5V
4
8
8
;Cu$$$!!!r/   c            
         d\  } }t         j                  j                  d      }|j                  | |      dz  |j                  | d      t        j                  g d      z  z   t        j                  g d      z   }t        |d      }|j                  |       |j                  }t        j                  t        d|      D cg c]  }t        |||        c}      }|d   |j                         d	| z  z
  kD  sJ y c c}w )
Nr   r   r   rK   r2   r  )r2   r   r   r      r   r4   rJ   )r?   rV   rp   r   r   r
   r9   r$   ranger   max)r   r   r   rB   rC   spectklls           r-   test_infer_dim_1r  h  s     DAq
))


"C		!Q#
))Aq/BHH_5
5	6
((?
#	$ 
 1
0CGGAJ##E	5A;Ga$UAq1G	HBa52668dQh&&&& Hs   C>c                  x   d\  } }t         j                  j                  d      }|j                  | |      dz  }|d dxxx t        j                  g d      z  ccc |ddxxx t        j                  g d      z  ccc t        |d	      }|j                  |       |j                  }t        ||       d
kD  sJ y )Nr  r   rK   rM   r     r  r   r   rL   r}   r   r4   r2   	r?   rV   rp   r   r   r
   r9   r$   r   r   r   r   rB   rC   r  s         r-   test_infer_dim_2r#  y  s     DAq
))


"C		!Q#AcrFbhh''FbH)**H
1
0CGGAJ##EE1%)))r/   c            	         d\  } }t         j                  j                  d      }|j                  | |      dz  }|d dxxx t        j                  g d      z  ccc |ddxxx t        j                  g d      z  ccc |dd	xxx d
t        j                  g d      z  z  ccc t        |d      }|j                  |       |j                  }t        ||       d
kD  sJ y )Nr  r   rK   rM   r  r  r   rm   (   rL   )r}   r2   r}   r2   r}   r   r4   r!  r"  s         r-   test_infer_dim_3r&    s    DAq
))


"C		!Q#AcrFbhh''FbH)**HbHBHH/000H
1
0CGGAJ##EE1%)))r/   z'X, n_components, n_components_validatedgffffff?rL   rJ   r   r  r   c                     t        |d      }|j                  |        |j                  t        j                  |      k(  sJ |j
                  |k(  sJ y )Nr   r4   )r
   r9   r1   rq   r   r(   )rB   r1   n_components_validatedrC   s       r-   $test_infer_dim_by_explained_variancer)    sM     <F
;CGGAJv}}\:::: 6666r/   c                    d\  }}t         j                  j                  d      }|j                  ||      dz  t        j                  g d      z   }t        d|       }|j                  |       |j                  |      }dt        j                  dt         j                  z  t        j                  d      z  d	z        z  |z  }t        ||z  dd
       |j                  |j                  ||      dz  t        j                  g d      z         }||kD  sJ t        dd|       }|j                  |       |j                  |      }||kD  sJ y )N)r   r   r   rK   r   rL   r4   g      r2   g|Gz?g?rx   g?T)r1   r   r0   )r?   rV   rp   r   r   r
   r9   scorelogpiexpr   )	r0   r   r   r   rB   rC   ll1hll2s	            r-   test_pca_scorer2    s    DAq
))


"C		!Q# 33A
1
4CGGAJ
))A,Crvva"%%i"&&)+f4559AC!GQT*
))CIIaOc)BHHY,??
@C99
1Tj
ACGGAJ
))A,C99r/   c                  x   d\  } }t         j                  j                  d      }|j                  | |      |j                  | d      t        j                  g d      z  z   t        j                  g d      z   }|j                  | |      |j                  | d      t        j                  g d      z  z   t        j                  g d      z   }t        j
                  |      }t        |      D ]4  }t        |d      }|j                  |       |j                  |      ||<   6 |j                         dk(  sJ y )N)   r   r   r2   r   )r2   r   r   r   r4   )r?   rV   rp   r   r   r   r  r
   r9   r+  argmax)r   r   r   Xlr   r  r  rC   s           r-   test_pca_score3r7    s    DAq
))


"C	1a399Q?RXXi-@@	@288ICV	VB	1a399Q?RXXi-@@	@288ICV	VB	!B1X qV4		"1
 99;!r/   c                     t        j                  d      \  }}t        d| d      }|j                  |       t	        j
                  |j                  |j                  z
  dk\        sJ y )NT
return_X_yrm   r   rU   )r   load_digitsr
   r9   r?   r   r$   r'   )r0   rB   _rC   s       r-   test_pca_sanity_noise_variancer=    sY     40DAq
2*1
ECGGAJ663**S-@-@@QFGGGr/   c                 
   t        j                  d      \  }}t        ddd      }t        d| d      }|j                  |       |j                  |       t	        |j                  |      |j                  |      d       y )	NTr9  rm   r   r   rU   r   rx   )r   r;  r
   r9   r   r+  )r0   rB   r<  r   r   s        r-   "test_pca_score_consistency_solversr?    si     40DAqvAFH
KILLOMM!HNN1%yq'9Er/   c                    d\  }}t         j                  j                  d      }|j                  ||      dz  t        j                  g d      z   }t        ||       }|j                  |       |j                  dk(  sJ |j                  |       |j                  |j                         |j                  dk(  sJ |j                  |j                         y )Nr   r   rK   r   r4   )
r?   rV   rp   r   r   r
   r9   r'   r+  T)r0   r   r   r   rB   rC   s         r-   'test_pca_zero_noise_variance_edge_casesrB    s     DAq
))


"C		!Q# 33A
1
4CGGAJ!### IIaLGGACCL!### IIaccNr/   z4n_samples, n_features, n_components, expected_solver))rM   r   r   r   )r   r   r   r   )r     i  r   )r   rC  rM   r   )r   rC  r   r   c                 B   t         j                  j                  d      j                  | |f      }t	        |d      }t	        ||d      }|j                  |       |j                  |k(  sJ |j                  |       t        |j                  |j                         y )Nr   r~   )r1   rT   rU   )	r?   rV   rp   r   r
   r9   _fit_svd_solverr   r#   )r   r   r1   expected_solverr8   rz   pca_tests          r-   test_pca_svd_solver_autorH    s      99  #++)Z1H+ID1=H!oAH LL##666LLH(((*>*>?r/   c           	      p   t         j                  j                  d      }|j                  dd      }t        j                  d      }t        d      D ]+  }t        d| |      }|j                  |      d   ||d d f<   - t        |t        j                  |dd d f   d      j                  dd             y )Nr   rM   )r  rL   r  rL   rU   )r?   rV   rp   randr   r  r
   r<   r   tilereshape)r0   r   rB   ri   irC   s         r-   test_pca_deterministic_outputrN    s    
))


"CRAHHW%M2Y 6qZcJ!//215ad6 M277=A+>#C#K#KBPQ#RSr/   c                 2    t        | |       t        |        y )N)"check_pca_float_dtype_preservation$check_pca_int_dtype_upcast_to_double)r0   r^   s     r-   test_pca_dtype_preservationrR    s    &z3EF(4r/   c                    t         j                  j                  |      j                  dd      }|j	                  t         j
                  d      }|j	                  t         j                        }t        d| |      j                  |      }t        d| |      j                  |      }|j                  j                  t         j
                  k(  sJ |j                  j                  t         j                  k(  sJ |j                  |      j                  t         j
                  k(  sJ |j                  |      j                  t         j                  k(  sJ t        |j                  |j                  dd       y )	Nr   r   Fr   r   rU   gMbP?r    )r?   rV   rp   rJ  r   float64r   r
   r9   r#   r   r:   r   )r0   seedrB   	X_float64	X_float32pca_64pca_32s          r-   rP  rP  #  s%   
		d#((q1A%0I$IaJTJNNF aJTJNNF ##rzz111##rzz111I&,,

:::I&,,

:::
 F&&(:(:DQr/   c                    t         j                  j                  d      j                  ddd      }|j	                  t         j
                  d      }|j	                  t         j                  d      }t        d| d      j                  |      }t        d| d      j                  |      }|j                  j                  t         j                  k(  sJ |j                  j                  t         j                  k(  sJ |j                  |      j                  t         j                  k(  sJ |j                  |      j                  t         j                  k(  sJ t        |j                  |j                  d	       y )
Nr   r   )r   r   Fr   r   rU   g-C6?rx   )r?   rV   rp   randintr   int64int32r
   r9   r#   r   rT  r:   r   )r0   X_i64X_i32rX  rY  s        r-   rQ  rQ  ;  s   II!!!$,,Qi@ELLL.ELLL.EaJQGKKERFaJQGKKERF##rzz111##rzz111E"((BJJ666E"((BJJ666F&&(:(:Fr/   c                     t        d      \  } }t               j                  | |      }|j                  j	                         d   }t        |      j                  | |      }|j
                  | j                  d   k(  sJ y )NTr9  r   r2   )r   r
   r9   r   cumsumr(   r;   )rB   yr+   r1   r,   s        r-   5test_pca_n_components_mostly_explained_variance_ratiord  L  so     %DAq599Q?D1188:2>LL)--a3D+++r/   c                      t        j                  g d      } d}dD ]3  }t        j                  t        d      5  t        | ||       d d d        5 y # 1 sw Y   @xY w)Nr2   KH9rg  rg  rM   )r   r   z"should be in \[1, n_features - 1\]rn   )r?   r   rq   rr   r  r   )spectrumr   r   s      r-   test_assess_dimension_bad_rankri  X  sZ    xx01HI 9]]:-RS 	9hi8	9 	99	9 	9s   AA	c                      t        j                  g d      } t        | dd      t         j                   kD  sJ dD ]#  }t        | |d      t         j                   k(  r#J  t	        | d      dk(  sJ y )Nrf  r2   rM   r   r   )rL   r   )r?   r   r   infr   )rh  r   s     r-   test_small_eigenvalues_mlerm  a  su     xx01HXA<wFFF @ 44???@ Hb)Q...r/   c                      t        j                  dddddd      \  } }t        d      j                  |       }|j                  dk(  sJ y )Nr  r2      *   )r   r   
n_repeatedn_redundantn_clusters_per_classrT   r  r   )r   r   r
   r9   r(   rB   r<  rC   s      r-   test_mle_redundant_dataru  n  sU     ''DAq 5
!
%
%a
(C!!!r/   c                      t        j                  ddd      \  } }t        dd      }t        j                  t
        d	      5  |j                  |        d d d        y # 1 sw Y   y xY w)
Nr     rp  )r   r   rT   r  r   r4   z?n_components='mle' is only supported if n_samples >= n_featuresrn   )r   r   r
   rq   rr   r  r9   rt  s      r-   test_fit_mle_too_few_samplesrx  }  s]     ''"RTUDAq
5V
4C	O
  	
	  s   AA(c                     d\  } }t         j                  j                  d      j                  | |      }t        j                  |d d d df   d      |d d df<   t        dd      }|j                  |       |j                  |dz
  k(  sJ y )	N)r   rM   r   r}   r   r  r   r  r2   )r?   rV   rp   r   r   r
   r9   r(   )r   n_dimrB   pca_skls       r-   test_mle_simple_caser|    s      Iu
		a &&y%8AwwqCRCyr*AaeH%F+GKKN  EAI---r/   c                  ~   d\  } }t        j                  | |f      }t         j                  j                  |d      \  }}}t	        |dd  t        j
                  |dz
        d       t        j                  t        |d|             sJ t        d|      D ]#  }t        |||       t         j                   k(  r#J  y )	N)	   r  T)full_matricesr2   r5   r6   rk  rL   )
r?   r   r   svdr   r   r   r   r  rl  )r   r   rB   r<  sr   s         r-   test_assess_dimesion_rank_oner    s     Iz
J'(AiimmATm2GAq!AabE288JN3%@;;(iHIIIa$ @ D)4???@r/   c                  0   t         j                  j                  d      } d}| j                  d|      }t	        dd|d      j                  |      }t	        dd      j                  |      }t	        dd	d
      j                  |      }t        t        j                  |j                        t        j                  |j                               t        t        j                  |j                        t        j                  |j                               y)zCheck that exposing and setting `n_oversamples` will provide accurate results
    even when `X` as a large number of features.

    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/20589
    r   rP   r   r2   r   )r1   r0   n_oversamplesrT   r   r4   r   rU   N)	r?   rV   rp   r   r
   r9   r   r   r#   )r   r   rB   pca_randomizedr   ry   s         r-   %test_pca_randomized_svd_n_oversamplesr    s     ))


"CJ		%$A  	
 
c!f  f599!<H!qIMMaPJBFF8//0"&&9O9O2PQBFF>556z?U?U8VWr/   c                      t        d      j                  t        j                        } | j	                         }t        t        d      D cg c]  }d| 	 c}|       yc c}w )z Check feature names out for PCA.rL   r   rC   N)r
   r9   r7   r8   get_feature_names_outr   r  )rC   namesrM  s      r-   test_feature_names_outr    sK    
1

!
!$))
,C%%'E584a#aS	4e<4s   A!c                 V   t         j                  j                  d      }|j                  dd      }t	               j                  |      }|j                  |j                  z  }t        j                  |dd      j                         }t         j                  j                  ||       y)z9Check the accuracy of PCA's internal variance calculationr   r   r4  r2   r   N)r?   rV   rp   r   r
   r9   r$   r   r   r   testingr   )r   r   rB   rC   pca_vartrue_vars         r-   test_variance_correctnessr    s|     ))


"C		$A
%))A,C%%(E(EEGvvaaa(,,.HJJw1r/   c           	         t        ||      }t        j                  j                  |      }|j	                  ||      }|j                  |       |j                         }|j                         }	|j                  dk(  rdnd}
t        d      5  t        |      j                  |      }|j                         }|j                  dk(  sJ |j                  |j                  k(  sJ t        t        ||      ||
t        |      	       |j                         }|j                  dk(  sJ |j                  |j                  k(  sJ t        t        ||      |	|
t        |      	       d d d        y # 1 sw Y   y xY w)
Nr   r   g-C6*?gH׊>Tarray_api_dispatch)r   r   xpr    )r   r7   r8   r   asarrayr9   r>   r=   r   r   r   r;   r   r   r   )name	estimatorarray_namespacer   
dtype_namer  iris_npiris_xpprecision_npcovariance_npr!   estimator_xpprecision_xpcovariance_xps                 r-   check_array_api_get_precisionr    sV   	ov	6Biiz*Gjjj0GMM'**,L,,.M==I-44D	4	0 
Y'++G4#113!!V+++!!W]]222lr2
+		
 %335""f,,,""gmm333m3
+		
!
 
 
s   CE11E:z#array_namespace, device, dtype_namecheckr  r4   r   rK   QR)r1   r0   power_iteration_normalizerrT   c                 J    | j                   j                  } ||| |||       y )Nr   r  )	__class____name__)r  r  r  r   r  r  s         r-   test_pca_array_api_compliancer    s%    < ''D	$	?6jQr/   r  c                    | j                   j                  } ||| |||       t        ||      }t        d      \  }}|j	                  |d      }t        |j                        }	t        |       }
|j                  ||      }|j                  ||      }|
j                  ||       |
j                  }|
j                  }t        |
      }t        d      5  |j                  ||       |j                  }t        |      t        |      k(  sJ t        ||	      }|j                  }t        |      t        |      k(  sJ t        ||	      }d d d        j                  |j                  k(  sJ |j                  d
   |j                  d
   k(  sJ j                  |j                  k(  sJ t!        |j                  d   |j                  d         }t#        |d | |d | |	       |j                  d   |j                  d   k7  r\|d   }||d  }||d  }t%        t'        j(                  ||z
        |	k        sJ t%        t'        j(                  ||z
        |	k        sJ y y # 1 sw Y   xY w)Nr  rp  rl   Fr   r   Tr  r  r2   r   r6   r}   )r  r  r   r   r   r   r   r   r  r9   r#   r$   r   array_devicer   r;   r   r   r   r?   r   )r  r  r  r   r  r  r  rB   rc  r"   estX_xpy_xpcomponents_npexplained_variance_npest_xpcomponents_xpcomponents_xp_npexplained_variance_xpexplained_variance_xp_npmin_componentsreference_varianceextra_variance_npextra_variance_xp_nps                           r-   !test_pca_mle_array_api_compliancer    s{   2 ''D	$	?6jQ 
ov	6BB/DAq	%(A!''"D
	
C::a:'D::a:'DGGAqMOOM333ZF	4	0 S

4**M*l4.@@@@,]rB & : :12l46HHHH#45Jr#R S !!]%8%8888!!!$(;(;A(>>>>#))-B-H-HHHH )//2M4G4G4JKN .1o~. a M$7$7$::2261./B7H266+.@@ADHIII266.1CCDtKLLL ;3S Ss   A7I%%I/SCIPY_ARRAY_API1zSCIPY_ARRAY_API not set to 1.)reasonc                     t        j                  d      } | j                  t        j                        }t        ddd      }t        j                  d      }t        j                  t        |      5  t        d	      5  |j                  |       d d d        d d d        |j                  d
d       t        j                  d      }t        j                  t        |      5  t        d	      5  |j                  |       d d d        d d d        |j                  d
d       t        j                  d      }t        j                  t        |      5  t        d	      5  |j                  |       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   BxY w# 1 sw Y   y xY w)Narray_api_strictrL   r   r   rU   zCPCA with svd_solver='arpack' is not supported for Array API inputs.rn   Tr  r   LU)r0   r  z[Array API does not support LU factorization. Set `power_iteration_normalizer='QR'` instead.r   zArray API does not support LU factorization, falling back to QR instead. Set `power_iteration_normalizer='QR'` explicitly to silence this warning.)rq   importorskipr  r7   r8   r
   reescaperr   r  r   r9   
set_paramswarnsUserWarning)r  r  rC   expected_msgs       r-   7test_array_api_error_and_warnings_on_unsupported_paramsr  c  s    
		/	0Bjj#G
1
BC99ML 
z	6 t4 	GGG	 NNltNL99	6L 
z	6 t4 	GGG	 NNlvNN99	QL 
k	6 t4 	GGG	 #	 	 	 	 	 	 sl   3F FF%F+2FF+G$F76GF	FFF(	$F++F47G 	<GG)gHz>r5   )posr  r   numpyr?   rq   scipyrX   numpy.testingr   sklearnr   r   sklearn.baser   sklearn.datasetsr   r   r	   sklearn.decompositionr
   sklearn.decomposition._pcar   r   sklearn.utils._array_apir   r   r   r   r   r  -sklearn.utils._test_common.instance_generatorr   sklearn.utils._testingr   r   sklearn.utils.estimator_checksr   sklearn.utils.fixesr   r   r7   PCA_SOLVERSrZ   r[   r   SPARSE_MAX_COMPONENTSr.   markparametrizer  r8   r;   rH   re   rj   ru   r{   r   r   r   listsetr   rV   rp   r   r   r   r   r   r   r   r   rA  r  r
  r  r  r  r  r#  r&  rJ  r)  r2  r7  r=  r?  rB  rH  rN  rR  rP  rQ  rd  ri  rm  ru  rx  r|  r  r  r  r  r  r  r  skipifenvirongetr  r   r/   r-   <module>r     s	   	 	     , ,  Q Q % J  < R H ?xI
  (Hh/ 6 {3q$))//!2D)EFL G 4L( $564+^n-LM2C'DE,/5Q 0 F N 5 7
5Qp +^n-LML NLB f'=>+^n-LM N ?$ +^n-LMW NW" $/;/1K 0 01Kj tC$47G$GHI '78)E4=9E4=1C
 2 : 9C
L 
		a &&sB/$$$S"BQOPQR
		a &&r3/
 	:   {3I 4I ,'?@V AV {3? 4?: {36 46 {34 44 'GHE4=1- 2 I-  
XRXXy),-xrxxI8N/O/Q/QR ' ?!&?, 	TYY__%&	3tyy'!+,	s499??+, $))TYY[[!9:. ;. '78" 9" ,'?@ A"'"*
* -	D!	D!			q	!	&	&q"	-sA677 {3 4* {3H 4H ,'?@F AF '=> ?* :	@	@ {3T 4T {35 45
R0G"	,9
/"
.
@X4= $/2 02
D )-/'  
 %'DE   
 v.vd;='89'8F#'+		
 	!  "R#6R )-/'  
 "#   
  	62 	!  7M,7Mt JJNN$%,5T  r/   