
    -i}                     h   S SK r S SKrS SKJr  S SKrS SKrS SKJr  S SK	J
r
  S SKJrJrJr  S SKJr  S SKJr  S SKJrJrJrJr  S S	KJr  S S
KJrJr  \R:                  R=                  SS/\SS0/\SS0/\0 //5      S 5       rS r \R:                  RC                  S5      S 5       r"S r#S r$\R:                  RC                  S5      \R:                  R=                  SS/\SS0/\SS0/\0 //5      \R:                  R=                  SS5      \R:                  R=                  SS5      \R:                  R=                  SS5      S 5       5       5       5       5       r%\R:                  R=                  SS/\SS0/\SS0/\0 //5      S 5       r&S r'\R:                  R=                  SSS/5      S 5       r(S r)\R:                  R=                  SS/\SS0/\SS0/\0 //5      S  5       r*\R:                  R=                  SS!5      S" 5       r+S# r,\R:                  R=                  S\\/5      S$ 5       r-\R:                  R=                  SS/\SS0/\SS0/\0 //5      \R:                  R=                  S%\\-   5      \R:                  R=                  SS5      \R:                  R=                  SS5      S& 5       5       5       5       r.\R:                  R=                  SS/\SS0/\SS0/\0 //5      \R:                  R=                  S'\5      S( 5       5       r/\R:                  R=                  SS)S*/5      \R:                  R=                  SS!5      \R:                  R=                  SS5      \R:                  R=                  SS5      S+ 5       5       5       5       r0S, r1S- r2\R:                  R=                  S.\5      S/ 5       r3\R:                  R=                  S.\5      S0 5       r4\R:                  RC                  S15      \R:                  R=                  S.\5      S2 5       5       r5\R:                  R=                  S.\5      S3 5       r6\R:                  R=                  S4S5S6/5      S7 5       r7\R:                  R=                  SS/\SS0/\SS0/\0 //5      S8 5       r8\R:                  RC                  S15      \R:                  R=                  SS!5      S9 5       5       r9S: r:\R:                  R=                  S;\Rv                  \Rv                  4\Rx                  \Rx                  4\Rz                  \Rx                  4\R|                  \Rx                  4/5      \R:                  R=                  SS/\SS0/\SS0/\0 //5      S< 5       5       r?\R:                  R=                  SS/\SS0/\SS0/\0 //5      S= 5       r@\R:                  R=                  S\\/5      S> 5       rA\R:                  R=                  S4/ S?Q5      S@ 5       rBSA rCSB rDSC rE\R:                  R=                  S\\/5      SD 5       rFSE rGSF rHSG rISH rJg)I    N)StringIO)linalg)clone)NMFMiniBatchNMFnon_negative_factorization)_nmf)ConvergenceWarning)assert_allcloseassert_almost_equalassert_array_almost_equalassert_array_equal)squared_norm)CSC_CONTAINERSCSR_CONTAINERS	Estimatorsolvercdmuc                     Sn[         R                  " S5      n[        R                  " [        US9   U " SSSS.UD6R                  U5        S S S 5        g ! , (       d  f       g = f)NzKMaximum number of iterations 1 reached. Increase it to improve convergence.   r   match   auto)max_itern_components )nponespytestwarnsr
   fit)r   r   convergence_warningAs       W/var/www/html/venv/lib/python3.13/site-packages/sklearn/decomposition/tests/test_nmf.pytest_convergence_warningr(      sV     	V  	A	(0C	D<16<V<@@C 
E	D	Ds   A
A$c                  J   [         R                  R                  R                  S5      n [         R                  " U R                  SS5      5      nS HN  n[        R                  " USUSS9u  p4US:  R                  5       (       d  US:  R                  5       (       d  MN   e   g )N*   
   )randomnndsvdnndsvdanndsvdarr   initrandom_state)	r    r,   mtrandRandomStateabsrandnnmf_initialize_nmfany)rngdatar1   WHs        r'   test_initialize_nn_outputr>   $   sz    
))


&
&r
*C66#))B#$D;""4$QGUKKMMa!e[[]]33 <    zbignore:The multiplicative update \('mu'\) solver cannot update zeros present in the initializationc                     [         R                  " S5      n Sn[        R                  " [        US9   [        SSS9R                  U 5        S S S 5        Sn[        R                  " [        US9   [        5       R                  U * 5        S S S 5        [        SS	S
9R                  U 5      n[        R                  " [        US9   UR                  U * 5        S S S 5        [        R                  " [        US9   [        R                  " U * SS5        S S S 5        S H  n[        R                  " SR                  U5      5      n[        R                  " [        US9   [        SUS9R                  U 5        S S S 5        [        R                  " [        US9   [        SUS9R                  U 5        S S S 5        [        R                  " [        US9   [        R                  " U SU5        S S S 5        M     g ! , (       d  f       GN= f! , (       d  f       GN= f! , (       d  f       GNM= f! , (       d  f       GN$= f! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       GMW  = f)Nr   zHInvalid beta_loss parameter: solver 'cd' does not handle beta_loss = 1.0r   r         ?)r   	beta_lossz!Negative values in data passed tor   皙?)tolr-   )r-   r.   r/   zLinit = '{}' can only be used when n_components <= min(n_samples, n_features)   r1   )r    r!   r"   raises
ValueErrorr   r$   	transformr7   r8   reescapeformatr   )r&   msgclfr1   s       r'   test_parameter_checkingrO   -   s    	A
TC	z	-43'++A. 
.
-C	z	-		1" 
.
aS/

a
 C	z	-qb 
.	z	-QB8, 
. 2ii99?
 ]]:S1!!!$ 2]]:S1&**1- 2]]:S11d+ 21 2 
.	- 
.	- 
.	-	-	- 211111sS   G9/HH8H/III#9
H
H
H,/
H>
I	
I 	#
I3	c                     [         R                  R                  R                  S5      n [         R                  " U R                  SS5      5      n[        R                  " USSS9u  p#[        R                  " [         R                  " X#5      U-
  5      n[        R                  " XR                  5       -
  5      nXE::  d   eg )Nr*   r+   r-   rF   )r    r,   r3   r4   r5   r6   r7   r8   r   normdotmean)r:   r&   r<   r=   errorsdevs         r'   test_initialize_closerV   P   s     ))


&
&r
*C
syyR !Aq"84DAKKqq()E;;q668|$D==r?   c                     [         R                  R                  R                  S5      n [         R                  " U R                  SS5      5      n[        R                  " USSS9u  p#[        R                  " USSS9u  pE[        R                  " USSSS9u  pgX$4X&4X54X744 H  u  p[        XS:g     XS:g     5        M     g )	Nr*   r+   r-   rF   r.   r/   r   r0   )	r    r,   r3   r4   r5   r6   r7   r8   r   )
r:   r;   W0H0WaHaWarHarrefevls
             r'   test_initialize_variantsr`   \   s     ))


&
&r
*C66#))B#$D  r9FB  r	:FB""4*1MHCXy2(RI>CqM3ax=9 ?r?   r1   )Nr-   r.   r/   r,   alpha_W)        rA   alpha_H)rb   rA   samec           	      D   [         R                  S[         R                  " SS5      -
  S[         R                  " SS5      -   4   nU " SSUUUSS.UD6nUR                  U5      nUR                  S:  R                  5       (       d  US:  R                  5       (       a   eg )Ng      @r      r   r   )r   r1   ra   rc   r2   r   )r    c_arangefit_transformcomponents_r9   )r   r   r1   ra   rc   r&   modeltransfs           r'   test_nmf_fit_nn_outputrm   k   s     	cBIIaO#S299Q?%::;A  E   #F""Q&++--&1*1A1A1C1CDD1Cr?   c                     [         R                  R                  R                  S5      nU "  S	SSSS.UD6n[         R                  " UR                  SS5      5      nUR                  U5      R                  S:  d   eg )
Nr*      r/   r   iX  )r1   r2   r   rf   rC   )ro   )r    r,   r3   r4   r5   r6   r$   reconstruction_err_)r   r   r:   pnmfXs        r'   test_nmf_fit_closers      sy    
 ))


&
&r
*C		
 D 	syyAA88A;**S000r?   c                  v   Sn SnSnSnSnSn[         R                  R                  R                  S5      n[         R                  " X/5      n[         R
                  " UR                  U 5      5      n[        U5       H  n	XU -     XyU -  U	4'   M     [         R                  " X!/5      n
[         R
                  " UR                  U5      5      n[        U5       H  n	XU-     XU-  U	4'   M     [         R                  " Xz5      n[        USUUS	S
9nUR                  U5      n[         R                  " XR                  5      nUR                  S:  d   e[        X5        [        UUUS	US9nUR                  U5      n[         R                  " UUR                  5      nUR                  S:  d   e[        XSS9  g )N   r+   ro   r   rE     r*   r   r   )r   r   rB   r   r2   rC   )r   rB   
batch_sizer2   r   atol)r    r,   r3   r4   zerosr5   r6   rangerR   r   ri   rj   rp   r   r   )	n_samples
n_featuresr   rB   rw   r   r:   W_trueW_arrayjH_trueH_arrayrr   rk   rl   X_calcmbmodels                    r'   test_nmf_true_reconstructionr      s    IJLIJH
))


&
&r
*CXXy/0FffSYYy)*G< #*y=#99}a  !XX|01FffSYY|,-G:&-,.>&?<"# 
vA!E   #FVVF--.F$$s***A!G ""1%FVVFG//0F&&,,,AA&r?   c                    [         R                  R                  R                  S5      n[         R                  " UR                  SS5      5      n[        U SSSSS9nUR                  U5      nUR                  U5      n[        XES	S
9  g )Nr*   rf   ro   rE   r,   r   ư>)r   r   r1   r2   rD   rC   rx   )
r    r,   r3   r4   r5   r6   r   ri   rI   r   )r   r:   r&   mftts         r'   test_nmf_transformr      sv     ))


&
&r
*C
syyAA	A 
	B	AAB%r?   c                     [         R                  R                  R                  S5      n [         R                  " U R                  SS5      5      n[        SSSSS9nUR                  U5      nUR                  U5      n[        X45        g )	Nr*   rf   ro   rE   r   MbP?T)r   r2   rD   fresh_restarts)
r    r,   r3   r4   r5   r6   r   ri   rI   r   )r:   r&   r   r   r   s        r'   test_minibatch_nmf_transformr      sq     ))


&
&r
*C
syyAA		A 
	B	AABr?   c                    [         R                  R                  S5      n[         R                  " UR	                  SS5      5      nSn[         R
                  " UR                  5       U-  5      n[         R                  " XRR	                  US5      -  5      n[         R                  " XRR	                  SU5      -  5      nU " S	USSSS.UD6nUR                  X7US9  UR                  U5        g )
Nr   rf   ro      customr   r   r1   r2   rD   r<   r=   r   )	r    r,   r4   r5   r6   sqrtrS   ri   rI   )	r   r   r2   r&   r   avgH_initW_initr   s	            r'   test_nmf_transform_custom_initr      s     99((+L
|!!!Q'(AL
''!&&(\)
*CVVC,,\1==>FVVC,,Q==>F 	!qd	NT	A OOA6O*KKNr?   )r   r   c                     [         R                  R                  S5      n[         R                  " UR	                  SS5      5      n[        U SSSSS9nUR                  U5      nUR                  U5      n[        X%SS9  g )	Nr   rf   r   r,   rv   )r   r   r1   r2   r   r   decimal)	r    r,   r4   r5   r6   r   ri   inverse_transformr   )r   r2   r&   r   r   A_news         r'   test_nmf_inverse_transformr      sv     99((+L
|!!!Q'(A	A 
	B#Ea2r?   c                     [         R                  R                  S5      n [         R                  " U R	                  SS5      5      n[        U SSSS9nUR                  " U5      nUR                  " U5      n[        XSS	S
9  g )Nr   rf   r     r/   T)r2   r   r1   r   r   {Gz?)rtolry   )	r    r,   r4   r5   r6   r   ri   r   r   )r:   r&   r7   r   r   s        r'   test_mbnmf_inverse_transformr     st     ))


"C
syyAA
	C 
		1	B!!"%EA4d3r?   c                     [         R                  R                  R                  S5      n[         R                  " UR                  SS5      5      nU " SSSS9R                  U5        g )Nr*      r+   ru   r   r   )r   r2   rD   )r    r,   r3   r4   r5   r6   r$   )r   r:   r&   s      r'   $test_n_components_greater_n_featuresr     sN     ))


&
&r
*C
syyR !A2A48<<Q?r?   sparse_containerc                    [         R                  R                  R                  S5      n[         R                  " UR                  SS5      5      nSUS S 2S[         R                  " S5      -  4'   U" U5      nU " S	SSUUSSSS.UD6n[        U5      n	UR                  U5      n
U	R                  U5      nUR                  nU	R                  n[        X5        [        X5        g )
Nr*   r+   r   r   ro   r,   d   )r   r1   ra   rc   r2   rD   r   r   )r    r,   r3   r4   r5   r6   rh   r   ri   rj   r   )r   r   r   ra   rc   r:   r&   A_sparseest1est2W1W2H1H2s                 r'   test_nmf_sparse_inputr   &  s     ))


&
&r
*C
syyR !AAaRYYq\	"H 		 	D ;D			A	B			H	%B			B			BBBr?   csc_containerc                 ,   [         R                  R                  R                  S5      n[         R                  " UR                  SS5      5      nSUS'   U" U5      nU " S
SSSS.UD6nUR                  U5      nUR                  U5      n[        XgSS	9  g )Nr*   rE   r   r   )r   r   i  )r2   r   r   rC   rx   r   )	r    r,   r3   r4   r5   r6   ri   rI   r   )r   r   r   r:   r&   rk   A_fit_trA_trs           r'   test_nmf_sparse_transformr   I  s     ))


&
&r
*C
syyAAAdGaAM11sMfME""1%H??1DH.r?   r,   r-   c                    Sn[         R                  R                  R                  S5      n[         R                  " UR                  SS5      5      nSUS S 2S[         R                  " S5      -  4'   [        UU UUUUSSS	9u  pxn	[        UUS
U UUUUSSS9
u  pn	[        U UUUUSSS	9nUR                  U5      nUR                  U5      n[        X|5        [        X5        g )Nr   r*   r+   r   r   ro   r   r   )r1   r   r   ra   rc   r2   rD   F)	r=   update_Hr1   r   r   ra   rc   r2   rD   )r    r,   r3   r4   r5   r6   rh   r   r   ri   rI   r   )r1   r   ra   rc   r   r:   r&   W_nmfr=   _W_nmf_2model_classW_clsW_cls_2s                 r'   +test_non_negative_factorization_consistencyr   [  s     H
))


&
&r
*C
syyR !AAaRYYq\	,		KEa /	
MG K %%a(E##A&GE!G%r?   c            	      2   [         R                  " S5      n [        n[        R                  " S5      n[
        R                  " [        US9   U" X U * SSS9  S S S 5        [        R                  " S5      n[
        R                  " [        US9   U" X * U SSS9  S S S 5        [        R                  " S5      n[
        R                  " [        US9   U" X S	U -  SSS9  S S S 5        g ! , (       d  f       N= f! , (       d  f       Nd= f! , (       d  f       g = f)
Nr   z/Negative values in data passed to NMF (input H)r   r   r   rF   z/Negative values in data passed to NMF (input W)z.Array passed to NMF (input H) is full of zerosr   )r    r!   r   rJ   rK   r"   rG   rH   )r&   nnmfrM   s      r'   (test_non_negative_factorization_checkingr     s     	A%D
))E
FC	z	-QA2qx( 
.
))E
FC	z	-QAqx( 
.
))D
EC	z	-Q1q5!(+ 
.	- 
.	- 
.	- 
.	-s$   C&C7D&
C47
D
Dc                    [         R                  " X5      nUS:X  a  [        X-
  5      S-  $ X@S:g     nX S:g     n[         R                  " USUS9  US:X  aT  [         R                  " U[         R
                  " Xe-  5      -  5      nXtR	                  5       U R	                  5       -
  -  nU$ US:X  aT  Xe-  n[         R                  " U5      U R                  -
  [         R                  " [         R
                  " U5      5      -
  nU$ Xc-  R	                  5       nXsS-
  XC-  R	                  5       -  -  nXsXeUS-
  -  -  R	                  5       -  -  nXsUS-
  -  -  nU$ )zvCompute the beta-divergence of X and W.H for dense array only.

Used as a reference for testing nmf._beta_divergence.
r   r   &.>outr   )r    rR   r   maximumsumlogsize)	rr   r<   r=   betaWHWH_Xnonzero	X_nonzeroresdivs	            r'   _beta_divergence_denser     s>   
 
BqyAF#a''!V*Kq&	IJJ{Dk2qyffY	(?!@@Avvx!%%'!! J 
%ffSkAFF"RVVBFF3K%88 J ##%qRXNN,,,yD1H$=>CCEEEtax  Jr?   csr_containerc                    SnSnSn/ SQn[         R                  R                  R                  S5      nUR	                  X5      n[         R
                  " USS US9  U " U5      n[        R                  " XcSSS	9u  pU HQ  n
[        XhX5      n[        R                  " XhX5      n[        R                  " XxX5      n[        XS
S9  [        XS
S9  MS     g )N   r+   ro   )rb         ?rA         ?       @g      @r*   r   r   r,   r0      r   )r    r,   r3   r4   r6   clipr7   r8   r   _beta_divergencer   )r   r|   r}   r   beta_lossesr:   rr   X_csrr<   r=   r   r^   lossloss_csrs                 r'   test_beta_divergencer     s     IJL0K ))


&
&r
*C		)(AGGAq$A!EqXBODA$Q13##A!2''!:Cq1C15 r?   c                    SnSnSn[         R                  R                  R                  S5      nUR	                  X5      n[         R
                  " USS US9  U " U5      n[         R                  " UR	                  X5      5      n[         R                  " UR	                  X25      5      n[        R                  " XxU5      n	[        R                  " XxU5      n
UR                  5       u  p[         R                  " XU4   5      R                  5       n[        XX4   SS9  [        U	R                  UR                  5        [        U	R                  UR                  5        [        U	R                   UR                   5        g )Nr+   ro   rE   r*   r   r   r   )r    r,   r3   r4   r6   r   r5   r7   _special_sparse_dotnonzeroasarrayravelr   r   indicesindptrshape)r   r|   r}   r   r:   rr   r   r<   r=   WH_safer   iijjWH_safe_datas                 r'   test_special_sparse_dotr     s    IJL
))


&
&r
*C		)(AGGAq$A!E
syy12A
syy23A%%aE2G		 	 q	)B ]]_FB::g"fo.446LlrvJC w6w~~u||4w}}ekk2r?   z-ignore::sklearn.exceptions.ConvergenceWarningc                    SnSnSnSnSnSn[         R                  R                  R                  S5      nUR	                  X5      n[         R
                  " U5      nU " U5      n	[        R                  " XSSS	9u  pS
 H  nU
R                  5       UR                  5       p[        UUUUSSSUUUUSS9u  nnnU
R                  5       UR                  5       p[        U	UUUSSSUUUUSS9u  nnn[        UUSS9  [        UUSS9  US-  nU
R                  5       UR                  5       p[        U	UUUSSSUUUUSS9u  nnn[        UUSS9  [        UUSS9  M     g )Nr   r+   ro   rC   r   i9  r,   r*   r0   g333333r   皙?rA   r         @r   Tr   )r1   r   r   rB   r   ra   l1_ratior2   gHz>rx   h㈵>g-C6?)r    r,   r3   r4   r6   r5   r7   r8   copyr   r   )r   r|   r}   r   alphar   n_iterr:   rr   r   rX   rY   rB   r<   r=   r   r   r   r   r   W3H3s                         r'   %test_nmf_multiplicative_update_sparser     s   
 IJLEHF ))


&
&t
,C		)(A
q	A!E  xbQFB2	wwy"'')1.
	B  wwy"'')1.
	B 	BT*BT* 	V	wwy"'')1.
	B 	BT*BT*u 3r?   c                   ^	 SnSnSm	[         R                  R                  R                  S5      nUR	                  X5      n[         R
                  " USS US9  U " U5      nU	4S jnSnS	 H9  n[        R                  " [        US
9   U" XH5        S S S 5        U" US-   U5        M;     S H  nU" XH5        U" XX5        M     g ! , (       d  f       N8= f)Nrf   ro   rE   r*   r   r   c           
         > [        U STSUSSS9u  p#n[        R                  " [        R                  " U5      5      (       a   e[        R                  " [        R                  " U5      5      (       a   eg )Nr,   r   r   rv   )r1   r   r   rB   r2   r   )r   r    r9   isnan)rr   rB   r<   r=   r   r   s        r'   _assert_nmf_no_nan7test_nmf_negative_beta_loss.<locals>._assert_nmf_no_nanQ  se    ,%
a 66"((1+&&&&66"((1+&&&&&r?   AWhen beta_loss <= 0 and X contains zeros, the solver may diverge.)g333333rb   r   r   )r   rA   g333333?r   r   )	r    r,   r3   r4   r6   r   r"   rG   rH   )
r   r|   r}   r:   rr   r   r   rM   rB   r   s
            @r'   test_nmf_negative_beta_lossr   D  s     IJL
))


&
&r
*C		)(AGGAq$A!E' NC 	]]:S1q, 21t8Y/ !
 /	1(5, /	 21s   	C
C	rB         rb   c                    [         R                  R                  S5      nUR                  SS9nSX"S:  '   [	        U SS9nSn[
        R                  " [        US9   UR                  " U5        SSS5        g! , (       d  f       g= f)zDCheck that an error is raised if beta_loss < 0 and X contains zeros.r   rf   ro   )r   )rB   r2   r   r   N)	r    r,   r4   normalr   r"   rG   rH   r$   )rB   r:   rr   r7   rM   s        r'   %test_minibatch_nmf_negative_beta_lossr  i  si     ))


"C


AA!eH

;C
MC	z	-
 
.	-	-s   A77
Bc                    SnSnSn[         R                  R                  R                  S5      n[         R                  " UR                  X#5      5      nSnU " S
USUSS.UD6nU " S
USUSS.UD6n	UR                  U5      n
U	R                  U5      nUR                  nU	R                  n[         R                  " [         R                  5      R                  nXU:*     R                  nXU:*     R                  nXU:*     R                  nXU:*     R                  nUU:  d   eUU:  d   eSnU " S
USUSS.UD6nU " S
USUSS.UD6n	UR                  U5      n
U	R                  U5      nUR                  nU	R                  n[        R                  " U5      S	-  [        R                  " U5      S	-  -   [        R                  " U
5      S	-  [        R                  " U5      S	-  -   :  d   eg )Nrf   ro   rE   r*   rA   r   )r   ra   r   r2   rb   r   r   )r    r,   r3   r4   r5   r6   ri   rj   finfofloat64epsr   r   rQ   )r   r   r|   r}   r   r:   rr   r   regulrk   W_regulW_modelH_regulH_modelr	  W_regul_n_zerosW_model_n_zerosH_regul_n_zerosH_model_n_zeross                      r'   test_nmf_regularizationr  w  s5    IJL
))


&
&r
*C
syy/0A H !	
 E  !	
 E !!!$G!!!$GGG
((2::

"
"Cn-22On-22On-22On-22O_,,,_,,, H !	
 E  !	
 E !!!$G!!!$GGGKK S(FKK,@S+HHG	LG$,L- - - -r?   c                    SnSnSnSnSnSn[         R                  R                  R                  S5      nUR	                  X5      n[         R
                  " X5        [        R                  " XSSS	9u  pS
 H  nU S:w  a  US:w  a  M  U	R                  5       U
R                  5       pS n[        S5       H  n[        UUUUSUSUU UUSSSS9u  pn[        R                  " XX5      XE-  U-  UR                  5       -  -   XE-  U-  UR                  5       -  -   USU-
  -  U-  US-  R                  5       -  -   USU-
  -  U-  US-  R                  5       -  -   nUb  UU:  d   eUnM     M     g )Nr   ru   r+   rC   r   rb   r*   r,   r0   r   r   r   r   r   r   r   T)rB   r1   r   r   ra   r   rD   r   verboser2   r   )r    r,   r3   r4   r6   r5   r7   r8   r   r{   r   r   r   )r   r|   r}   r   r   r   rD   r:   rr   rX   rY   rB   r<   r=   previous_lossr   r   s                    r'   test_nmf_decreasingr    s    IJLEH
C ))


&
&r
*C		)(AFF1L  xbQFB2	T>i1nwwy"'')1rA0#)!GA!$ $$Q18"Z/!%%'9:"Y.89 1x<(:5A

DE 1x<(941zz|C	D  ($t+++ M9  3r?   c                     [         R                  R                  S5      n Su  pn[         R                  " U R	                  X5      5      S-  n[         R                  " U R	                  X5      5      S-  n[         R                  " U R	                  X25      5      nSUS'   [
        R                  " XEUSS9nSUS'   [
        R                  " XEUSS9n[        X5        g )Nr   )r+   r   r   r+   )r   r   rA   )r   g       )r    r,   r4   r5   r6   r7   r   r   )	r:   r|   r}   r   rr   r<   r=   r^   r   s	            r'   test_nmf_underflowr    s    
))


"C*2'I<
syy/025A
syy12R7A
syy23AAdG


qQS
1CAdG


qQS
1C!r?   zdtype_in, dtype_outc                    [         R                  R                  S5      R                  SS5      R	                  USS9n[         R
                  " XDS9  U " S
SSSSS	.UD6nUR                  " U5      R                  U5      R                  U:X  d   eUR                  " U5      R                  U:X  d   eUR                  R                  U:X  d   eg )Nr   r   ru   F)r   r   rA   r   )ra   rc   rD   r2   r   )r    r,   r4   r6   astyper5   r$   rI   dtyperi   rj   )r   r   dtype_in	dtype_outrr   r7   s         r'   test_nmf_dtype_matchr    s     			a &&r2.55hU5KAFF1
 	
 C 771:"((I555Q%%222??  I---r?   c                 H   [         R                  R                  S5      R                  SS5      n[         R                  " X"S9  U " S	SSS.UD6nUR                  UR                  [         R                  5      5      nU " S	SSS.UD6nUR                  U5      n[        XFSS9  g )
Nr   2   r   r   r   )r2   rD   r   rx   r   )	r    r,   r4   r6   r5   ri   r  float32r   )r   r   rr   nmf32W32nmf64W64s          r'   $test_nmf_float32_float64_consistencyr'  $  s     			a &&r1-AFF191$9&9E


ahhrzz2
3C91$9&9E


a
 CC4(r?   c                    [         R                  R                  S5      nUR                  S5      nUR                  S5      R	                  [         R
                  5      nUR                  S5      n[        R                  " [        SS9   U " SS9R                  X#US9  S S S 5        [        R                  " [        SS9   [        X#S	S
9  S S S 5        g ! , (       d  f       N;= f! , (       d  f       g = f)Nr   )r   ru   )ru   ru   zshould have the same dtype as Xr   r   rF   r=   r<   F)r=   r   )r    r,   r4   random_sampler  r"  r"   rG   	TypeErrorr$   r   )r   r:   rr   r=   r<   s        r'    test_nmf_custom_init_dtype_errorr,  4  s     ))


"C(#A(#**2::6A(#A	y(I	Jx $$Qq$1 
K 
y(I	J"1E: 
K	J 
K	J 
K	Js   	C?C$
C!$
C2)r  r   r   r   r   r   r   c           
      P   [         R                  R                  R                  S5      n[         R                  " UR                  SS5      5      n[        SU SSSS9n[        SU SSS UR                  S   SS9nUR                  " U5      nUR                  U5      n[        XV5        g )	Nr*   0   ro   r   r   )r   rB   r   r2   rD   rb   )r   rB   r2   rD   max_no_improvementrw   forget_factor)r    r,   r3   r4   r5   r6   r   r   r   ri   r   )rB   r:   rr   r7   mbnmfr<   mbWs          r'   !test_nmf_minibatchnmf_equivalencer3  D  s     ))


&
&r
*C
syyQ A
C 771:E 	!A


a
 CAr?   c                  $   [         R                  R                  R                  S5      n [         R                  " U R                  SS5      5      nSnSnSn[        USSUUSS SS	9n[        USSS
9n[        R                  " XSSS
9u  pxUR                  XUS9  [        U5       H-  n	[        U5       H  n
UR                  XX-    US U US9  M     M/     UR                  UR                  :X  d   e[        UR                  UR                  5        g )Nr*   r   ro   r+   r   r   r   F)r   r1   r2   r   rw   rD   r/  r   r   r1   r2   r,   r   )r    r,   r3   r4   r5   r6   r   r7   r8   r$   r{   partial_fitn_steps_r   rj   )r:   rr   r   rw   r   mbnmf1mbnmf2r<   r=   ir   s              r'   test_minibatch_nmf_partial_fitr;  `  s   
))


&
&r
*C
syya !ALJH!	F |(QRSF 	8!DA JJqJ8_z"AqQ^4+:!L #  ??foo---F&&(:(:;r?   c                  <   [         R                  R                  S5      n [         R                  " U R	                  SS5      5      n[        SS9R                  U5      nUR                  " 5       n[        [        S5       Vs/ s H  nSU 3PM
     snU5        gs  snf )z Check feature names out for NMF.r   r+   r   rE   )r   r7   N)
r    r,   r4   r5   r6   r   r$   get_feature_names_outr   r{   )r2   rr   r7   namesr:  s        r'   test_feature_names_outr?    sz    99((+L
|!!"a()A
1

!
!!
$C%%'E5848a#aS	84e<4s   Bc                     [         R                  R                  S5      R                  S5      n [	        SSSS9n[
        R                  n[        5       [
        l         UR                  " U 5        U[
        l        g ! U[
        l        f = f)Nr   )r   r+   r   r   )rD   r2   r  )	r    r,   r4   r*  r   sysstdoutr   r$   )r&   r7   
old_stdouts      r'   test_minibatch_nmf_verboserD    s`    
		a ..y9A
4a
;CJCJ 

Z
s   A< <B	c                    [         R                  R                  S5      nUR                  S5      nUR                  S5      nUR                  S5      nU " SSSSS9nUR	                  X#US	9  UR
                  UR                  S   :X  d   eg )
Nr   r  rf   r   r   ro   r   r   r   r   r   )r    r,   r4   r*  ri   _n_componentsr   )r   r:   rr   r<   r=   ests         r'   test_nmf_n_components_autorJ    s     ))


"C&!A&!A&!A
	C a"
***r?   c                  6   [         R                  R                  S5      n U R                  S5      nU R                  S5      nU R                  S5      n[	        XUSSS9u  pEnUR
                  UR
                  :X  d   eUR
                  UR
                  :X  d   eg )Nr   r  rF  rG  r   r   )r<   r=   r1   r   )r    r,   r4   r*  r   r   )r:   rr   r   r   r<   r=   r   s          r'   5test_nmf_non_negative_factorization_n_components_autorL    s     ))


"C&!Av&Fv&F(	vH6GA! 77fll"""77fll"""r?   c                     [         R                  R                  S5      n U R                  S5      nU R                  S5      n[	        XSSS9u  p4n[        XB5        UR                  UR                  S   UR                  S   4:X  d   eg )Nr   r  rG  r   F)r=   r   r   )r    r,   r4   r*  r   r   r   )r:   rr   r   r<   r=   r   s         r'   &test_nmf_n_components_auto_no_h_updaterN    s~     ))


"C&!Av&F(	&5GA! A77qwwqz6<<?3333r?   c            	          [         R                  R                  S5      n U R                  S5      nU R                  S5      nU R                  S5      n[        R
                  " [        SS9   [        XSSS	9  S S S 5        [        R
                  " [        SS9   [        XUSSS
9  S S S 5        [        R
                  " [        SS9   [        XUSSS
9  S S S 5        g ! , (       d  f       Nk= f! , (       d  f       NN= f! , (       d  f       g = f)Nr   r  rF  rG  z0When init!='custom', provided W or H are ignoredr   Tr   )r=   r   r   )r<   r=   r   r   z8When update_H=False, the provided initial W is not used.F)r    r,   r4   r*  r"   r#   RuntimeWarningr   )r:   rr   r   r   s       r'   test_nmf_w_h_not_used_warningrQ    s     ))


"C&!Av&Fv&F	@
 	#1FS	
 
@
 	#6Dv	
	
 
X

 	#6E	

 

 

 

 
s$   ,CC.C?
C+.
C<?
Dc                     [         R                  R                  S5      n U R                  S5      nU R                  S5      n[	        SSSS9n[
        R                  " [        SS9   UR                  " XU R                  S	5      S
9  S S S 5        [
        R                  " [        SS9   UR                  " XU R                  S5      S
9  S S S 5        g ! , (       d  f       NQ= f! , (       d  f       g = f)Nr   r  rG  r   r   r5  z'Array with wrong first dimension passedr   )ro   r   r)  z(Array with wrong second dimension passed)rf   rE   )	r    r,   r4   r*  r   r"   rG   rH   r$   )r:   rr   r=   r7   s       r'    test_nmf_custom_init_shape_errorrS    s     ))


"C&!A&!A
18!
<C	z)R	S#++F34 
T 
z)S	T#++F34 
U	T 
T	S 
U	Ts   &!C(!C#
C #
C1)KrJ   rA  ior   numpyr    r"   scipyr   sklearn.baser   sklearn.decompositionr   r   r   r	   r7   sklearn.exceptionsr
   sklearn.utils._testingr   r   r   r   sklearn.utils.extmathr   sklearn.utils.fixesr   r   markparametrizer(   r>   filterwarningsrO   rV   r`   rm   rs   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r"  r  int32int64r  r'  r,  r3  r;  r?  rD  rJ  rL  rN  rQ  rS  r   r?   r'   <module>rb     s;   	 
      O O - 1  / > (	HdsXt$45b7IJD	D4 ,	,>	:  (	HdsXt$45b7IJ !RSJ/$67E 8 0 T		E (	HdsXt$45b7IJ1	1-'` D$<0& 1&"  (	HdsXt$45b7IJ	  <03 13 4  sL&9:@ ;@ (	HdsXt$45b7IJ +^n-LMJ/$67 8 0 N	8 (	HdsXt$45b7IJ .9
/ :	

/ (H!56<0J/$67,& 8 0 1 7,&^,(< .96 :6. .93 :36 KL.9K+ : MK+\ .9!- :!-H tSk2
 3
 (	HdsXt$45b7IJB-	B-J KL<01! 1 M1!h" 	RZZ 	RZZ 	2::	2::	 (	HdsXt$45b7IJ.	.$ (	HdsXt$45b7IJ	)		) sL&9:; ;; &DE F6 <F=	  sL&9:+ ;+"#4
>5r?   