
    sg.                        d dl Z d dlZd dlZd dlmZ d dlZd dlZd dlm	Z	 d dl
mZ d dlmZmZmZ d dlmZ d dlmZ d dlmZmZmZmZ d d	lmZ d d
lmZmZ ej<                  j?                  ddgeddigeddigei gg      d        Z d Z!ej<                  jE                  d      d        Z#d Z$d Z%ej<                  jE                  d      ej<                  j?                  ddgeddigeddigei gg      ej<                  j?                  dd      ej<                  j?                  dd      ej<                  j?                  dd      d                                    Z&ej<                  j?                  ddgeddigeddigei gg      d        Z'd Z(ej<                  j?                  dddg      d        Z)d Z*ej<                  j?                  ddgeddigeddigei gg      d         Z+ej<                  j?                  dd!      d"        Z,d# Z-ej<                  j?                  deeg      d$        Z.ej<                  j?                  ddgeddigeddigei gg      ej<                  j?                  d%eez         ej<                  j?                  dd      ej<                  j?                  dd      d&                             Z/ej<                  j?                  ddgeddigeddigei gg      ej<                  j?                  d'e      d(               Z0ej<                  j?                  dd)d*g      ej<                  j?                  dd!      ej<                  j?                  dd      ej<                  j?                  dd      d+                             Z1d, Z2d- Z3ej<                  j?                  d.e      d/        Z4ej<                  j?                  d.e      d0        Z5ej<                  jE                  d1      ej<                  j?                  d.e      d2               Z6ej<                  j?                  d.e      d3        Z7ej<                  j?                  d4d5d6g      d7        Z8ej<                  j?                  ddgeddigeddigei gg      d8        Z9ej<                  jE                  d1      ej<                  j?                  dd!      d9               Z:d: Z;ej<                  j?                  d;ejx                  ejx                  fejz                  ejz                  fej|                  ejz                  fej~                  ejz                  fg      ej<                  j?                  ddgeddigeddigei gg      d<               Z@ej<                  j?                  ddgeddigeddigei gg      d=        ZAej<                  j?                  deeg      d>        ZBej<                  j?                  d4g d?      d@        ZCdA ZDdB ZEdC ZFej<                  j?                  deeg      dD        ZGej<                  j?                  deeg      dE        ZHdF ZIdG ZJdH ZKdI ZLy)J    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                     d}t        j                  d      }t        j                  t        |      5   | dddd|j                  |       d d d        y # 1 sw Y   y xY w)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.12/site-packages/sklearn/decomposition/tests/test_nmf.pytest_convergence_warningr(      sb     	V  	A	(0C	D D<16<V<@@CD D Ds   AA c                  6   t         j                  j                  j                  d      } t        j                  | j                  dd            }dD ]F  }t        j                  |d|d      \  }}|dk  j                         s|dk  j                         sFJ  y )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>   %   s}    
))


&
&r
*C66#))B#$D; 4""4$QG1UKKMa!e[[]334    zbignore:The multiplicative update \('mu'\) solver cannot update zeros present in the initializationc                     t        j                  d      } d}t        j                  t        |      5  t        dd      j                  |        d d d        d}t        j                  t        |      5  t               j                  |         d d d        t        dd	
      j                  |       }t        j                  t        |      5  |j                  |         d d d        t        j                  t        |      5  t        j                  |  dd       d d d        dD ]  }t        j                  dj                  |            }t        j                  t        |      5  t        d|      j                  |        d d d        t        j                  t        |      5  t        d|      j                  |        d d d        t        j                  t        |      5  t        j                  | d|       d d d         y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   Gx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   ;xY w)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 	%!!!$	%]]:S1 	.&**1-	.]]:S1 	,1d+	, 	,
,/ /  - -	% 	%	. 	.	, 	,sS   H5HH'H4*I*I*IHH$'H14H>I
	I	I#	c                     t         j                  j                  j                  d      } t        j                  | j                  dd            }t        j                  |dd      \  }}t        j                  t        j                  ||      |z
        }t        j                  ||j                         z
        }||k  sJ y )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   Q   s     ))


&
&r
*C
syyR !Aq"84DAqKKq!q()E;;q1668|$DD==r?   c                     t         j                  j                  j                  d      } t        j                  | j                  dd            }t        j                  |dd      \  }}t        j                  |dd      \  }}t        j                  |ddd      \  }}||f||f||f||ffD ]  \  }}	t        |	|dk7     ||dk7             y )	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Cy2r(RI> :SCqM3sax=9:r?   r1   )Nr-   r.   r/   r,   alpha_W)        rA   alpha_H)rb   rA   samec           	      ,   t         j                  dt        j                  dd      z
  dt        j                  dd      z   f   } | dd|||dd|}|j                  |      }|j                  dk  j                         s|dk  j                         rJ y )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   l   s     	cBIIaO#S299Q?%::;A  E   #F""Q&++-&1*1A1A1CDD1Cr?   c                     t         j                  j                  j                  d      } | 	 d	dddd|}t        j                  |j                  dd            }|j                  |      j                  dk  sJ y )
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                     d} d}d}d}d}d}t         j                  j                  j                  d      }t        j                  | |g      }t        j
                  |j                  |             }t        |      D ]  }	||	| z     ||	| z  |	f<    t        j                  ||g      }
t        j
                  |j                  |            }t        |      D ]  }	||	|z     |
|	|z  |	f<    t        j                  ||
      }t        |d||d	
      }|j                  |      }t        j                  ||j                        }|j                  dk  sJ t        ||       t        |||d	|      }|j                  |      }t        j                  ||j                        }|j                  dk  sJ t        ||d       y )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<  :#*1y=#9q9}a :XX|Z01FffSYY|,-G: @&-a,.>&?q<"#@
vvA!E   #FVVFE--.F$$s***Av!G ""1%FVVFG//0F&&,,,AvA&r?   c                     t         j                  j                  j                  d      }t        j                  |j                  dd            }t        | dddd      }|j                  |      }|j                  |      }t        ||d	
       y )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      sx     ))


&
&r
*C
syyAA	A 
	B	AAB%r?   c                     t         j                  j                  j                  d      } t        j                  | j                  dd            }t        dddd      }|j                  |      }|j                  |      }t        ||       y )	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      ss     ))


&
&r
*C
syyAA		A 
	B	AABr?   c                    t         j                  j                  d      }t        j                  |j	                  dd            }d}t        j
                  |j                         |z        }t        j                  ||j	                  |d      z        }t        j                  ||j	                  d|      z        } | d	|dddd|}|j                  |||       |j                  |       y )
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 OOA6O*KKNr?   )r   r   c                    t         j                  j                  d      }t        j                  |j	                  dd            }t        | dddd      }|j                  |      }|j                  |      }t        ||d       y )	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      sx     99((+L
|!!!Q'(A	A 
	B#Ea2r?   c                     t         j                  j                  d      } t        j                  | j	                  dd            }t        | ddd      } |j                  |      } |j                  |      }t        ||dd	
       y )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     sz     ))


"C
syyAA
	C 
		1	B!C!!"%EAu4d3r?   c                     t         j                  j                  j                  d      }t        j                  |j                  dd            } | ddd      j                  |       y )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                    t         j                  j                  j                  d      }t        j                  |j                  dd            }d|d d dt        j                  d      z  f<    ||      } | d	dd||dddd|}t        |      }	|j                  |      }
|	j                  |      }|j                  }|	j                  }t        |
|       t        ||       y )
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                 2   t         j                  j                  j                  d      }t        j                  |j                  dd            }d|d<    ||      } | d
dddd|}|j                  |      }|j                  |      }t        ||d	       y )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   J  s     ))


&
&r
*C
syyAAAdGaAM11sMfME""1%H??1DHd.r?   r,   r-   c                    d}t         j                  j                  j                  d      }t        j                  |j                  dd            }d|d d dt        j                  d      z  f<   t        || ||||dd	      \  }}}	t        ||d
| ||||dd
      \  }
}}	t        | ||||dd	      }|j                  |      }|j                  |      }t        ||       t        |
|       y )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\	,		KE1a /	
MGQ K %%a(E##A&GE5!GW%r?   c                  0   t        j                  d      } t        }t        j                  d      }t        j                  t        |      5   || | |  dd       d d d        t        j                  d      }t        j                  t        |      5   || |  | dd       d d d        t        j                  d      }t        j                  t        |      5   || | d	| z  dd       d d d        y # 1 sw Y   xY w# 1 sw Y   _xY w# 1 sw Y   y xY w)
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	- )QA2qx()
))E
FC	z	- )QAqx()
))D
EC	z	- ,Q1q5!(+, ,) )) ), ,s$   C4D D4C= D	Dc                    t        j                  ||      }|dk(  rt        | |z
        dz  S || dk7     }| | dk7     }t        j                  |d|       |dk(  rTt        j                  |t        j
                  ||z        z        }||j	                         | j	                         z
  z  }|S |dk(  rR||z  }t        j                  |      | j                  z
  t        j                  t        j
                  |            z
  }|S ||z  j	                         }||dz
  ||z  j	                         z  z  }|||||dz
  z  z  j	                         z  z  }|||dz
  z  z  }|S )z~Compute 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     sX   
 
1BqyAF#a''Q!V*K!q&	IJJ{Dk2qyffY	K(?!@@Arvvx!%%'!! J 
+%ffSkAFF"RVVBFF3K%88 J $##%qRXNN,,,tyKD1H$=>CCEEEttax  Jr?   csr_containerc                    d}d}d}g d}t         j                  j                  j                  d      }|j	                  ||      }t        j
                  |dd |        | |      }t        j                  ||dd	      \  }}	|D ]\  }
t        |||	|
      }t        j                  |||	|
      }t        j                  |||	|
      }t        ||d
       t        ||d
       ^ y )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		)Z(AGGAq$A!Eq,XBODAq 6$Q1d3##Aq!T2''q!T:Cq1C156r?   c                    d}d}d}t         j                  j                  j                  d      }|j	                  ||      }t        j
                  |dd |        | |      }t        j                  |j	                  ||            }t        j                  |j	                  ||            }t        j                  |||      }	t        j                  |||      }
|j                         \  }}t        j                  |	||f         j                         }t        ||
||f   d       t        |	j                  |j                         t        |	j                  |j                         t        |	j                   |j                          y )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		)Z(AGGAq$A!E
syyL12A
syyz23A%%aE2G		 	 Aq	)B ]]_FB::gb"fo.446LlBr2vJC w6w~~u||4w}}ekk2r?   z-ignore::sklearn.exceptions.ConvergenceWarningc                    d}d}d}d}d}d}t         j                  j                  j                  d      }|j	                  ||      }t        j
                  |      } | |      }	t        j                  ||dd	      \  }
}d
D ]  }|
j                         |j                         }}t        ||||ddd||||d      \  }}}|
j                         |j                         }}t        |	|||ddd||||d      \  }}}t        ||d       t        ||d       |dz  }|
j                         |j                         }}t        |	|||ddd||||d      \  }}}t        ||d       t        ||d        y )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		)Z(A
q	A!E  LxbQFB2 :+	wwy"'')1.
	B  wwy"'')1.
	B 	BT*BT* 	V	wwy"'')1.
	B 	BT*BT*u:+r?   c                   	 d}d}d	t         j                  j                  j                  d      }|j	                  ||      }t        j
                  |dd |        | |      }	fd}d}d	D ];  }t        j                  t        |
      5   |||       d d d         ||dz   |       = dD ]  } |||        |||        y # 1 sw Y   1xY w)Nrf   ro   rE   r*   r   r   c           	          t        | dd|dd      \  }}}t        j                  t        j                  |            rJ t        j                  t        j                  |            rJ y )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_nanz7test_nmf_negative_beta_loss.<locals>._assert_nmf_no_nanR  sa    ,%
1a 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   E  s     IJL
))


&
&r
*C		)Z(AGGAq$A!E' NC  0	]]:S1 	-q),	-1t8Y/0
 / -	1i(5),-		- 	-s   
CC	rB         rb   c                    t         j                  j                  d      }|j                  d      }d||dk  <   t	        | d      }d}t        j                  t        |      5   |j                  |       ddd       y# 1 sw Y   yxY w)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  j  sv     ))


"C


AAa!eH

;C
MC	z	- 
  s   $B  B	c                    d}d}d}t         j                  j                  j                  d      }t        j                  |j                  ||            }d} | d
|d|dd|} | d
|d|dd|}	|j                  |      }
|	j                  |      }|j                  }|	j                  }t        j                  t         j                        j                  }|
|
|k     j                  }|||k     j                  }|||k     j                  }|||k     j                  }||kD  sJ ||kD  sJ d} | d
|d|dd|} | d
|d|dd|}	|j                  |      }
|	j                  |      }|j                  }|	j                  }t        j                  |      d	z  t        j                  |      d	z  z   t        j                  |
      d	z  t        j                  |      d	z  z   kD  sJ y )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  x  s?    IJL
))


&
&r
*C
syyJ/0A H !	
 E  !	
 E !!!$G!!!$GGG
((2::

"
"Cgn-22Ogn-22Ogn-22Ogn-22O_,,,_,,, H !	
 E  !	
 E !!!$G!!!$GGGKK S(FKK,@S+HHG	LG$,L- - - -r?   c                    d}d}d}d}d}d}t         j                  j                  j                  d      }|j	                  ||      }t        j
                  ||       t        j                  ||dd	      \  }	}
d
D ]  }| dk7  r|dk7  r|	j                         |
j                         }}d }t        d      D ]  }t        ||||d|d|| ||ddd      \  }}}t        j                  ||||      ||z  |z  |j                         z  z   ||z  |z  |j                         z  z   |d|z
  z  |z  |dz  j                         z  z   |d|z
  z  |z  |dz  j                         z  z   }|||kD  sJ |}  y )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		)Z(AFF1aL  LxbQFB2 "!	T>i1nwwy"'')1r 	!A0#)!GAq!$ $$Q1i8("Z/!%%'9:("Y.89 1x<(:5A

DE 1x<(941zz|C	D  ($t+++ M9	!"!r?   c                     t         j                  j                  d      } d\  }}}t        j                  | j	                  ||            dz  }t        j                  | j	                  ||            dz  }t        j                  | j	                  ||            }d|d<   t        j                  |||d      }d|d<   t        j                  |||d      }t        ||       y )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'Iz<
syyJ/025A
syyL12R7A
syyz23AAdG


q!QS
1CAdG


q!QS
1CS!r?   zdtype_in, dtype_outc                    t         j                  j                  d      j                  dd      j	                  |d      }t        j
                  ||        | d
ddddd	|} |j                  |      j                  |      j                  |k(  sJ  |j                  |      j                  |k(  sJ |j                  j                  |k(  sJ y )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 3771:"((I5553Q%%222??  I---r?   c                 V   t         j                  j                  d      j                  dd      }t        j                  ||        | d	ddd|}|j                  |j                  t         j                              } | d	ddd|}|j                  |      }t        ||d       y )
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C4(r?   c                    t         j                  j                  d      }|j                  d      }|j                  d      j	                  t         j
                        }|j                  d      }t        j                  t        d      5   | d      j                  |||       d d d        t        j                  t        d      5  t        ||d	
       d d d        y # 1 sw Y   <xY w# 1 sw Y   y xY w)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+  5  s     ))


"C(#A(#**2::6A(#A	y(I	J 2x $$Q!q$12 
y(I	J ;"1E:; ;2 2; ;s   C"
C."C+.C7)r   r   r   r   r   r   r   c           	      \   t         j                  j                  j                  d      }t        j                  |j                  dd            }t        d| ddd      }t        d| ddd |j                  d   d      } |j                  |      }|j                  |      }t        ||       y )	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_equivalencer2  E  s     ))


&
&r
*C
syyQ A
C 771:E 	!A


a
 CAsr?   c            
      >   t         j                  j                  j                  d      } t        j                  | j                  dd            }d}d}d}t        |dd||dd d	      }t        |dd
      }t        j                  ||dd
      \  }}|j                  |||       t        |      D ]/  }	t        |      D ]  }
|j                  ||
|
|z    |d | |       ! 1 |j                  |j                  k(  sJ t        |j                  |j                         y )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:  a  s)   
))


&
&r
*C
syya !ALJH!	F |(QRSF 	8!DAq JJqAJ8_ Mz" 	MAqQ^4+:!L	MM ??foo---F&&(:(:;r?   c                  :   t         j                  j                  d      } t        j                  | j	                  dd            }t        d      j                  |      } |j                         }t        t        d      D cg c]  }d| 	 c}|       yc c}w )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   namesr9  s        r'   test_feature_names_outr>    sx    99((+L
|!!"a()A
1

!
!!
$C%C%%'E584a#aS	4e<4s   Bc                     t         j                  j                  d      j                  d      } t	        ddd      }t
        j                  }t               t
        _        	  |j                  |        |t
        _        y # |t
        _        w xY w)Nr   )r   r+   r   r   )rD   r2   r  )	r    r,   r4   r)  r   sysstdoutr   r$   )r&   r7   
old_stdouts      r'   test_minibatch_nmf_verboserC    sb    
		a ..y9A
4a
;CJCJ 

Z
s   !A? ?Bc                    t         j                  j                  d      }t        j                  |j	                  dd            } | dddd      }|j                  |      }t        j                  t        d	
      5  |j                          d d d        t        j                  t        d
      5  |j                  ||       d d d        t        j                  d      5  t        j                  d       |j                  |       d d d        t        j                  t        d
      5  |j                  |       d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   XxY w# 1 sw Y   y xY w)Nr*   rf   ro   rE   r,   r   r   r   z$Missing required positional argumentr   z$Cannot use both X and Xt. Use X only)rr   XtT)recordrT   zXt was renamed X in version 1.5)rE  )r    r,   r4   r5   r6   ri   r"   rG   r*  r   warningscatch_warningssimplefilterr#   FutureWarning)r   r:   r&   estrr   s        r'   )test_NMF_inverse_transform_Xt_deprecationrL    s<   
))


#C
syyAA
	C 	!A	y(N	O    
y(N	O )a() 
	 	 	- !g&a ! 
m+L	M $#$ $   ) )! !$ $s0   =E	1E#'E!-E-	EE!E*-E6c                 $   t         j                  j                  d      }|j                  d      }|j                  d      }|j                  d      } | dddd      }|j	                  |||	       |j
                  |j                  d   k(  sJ y )
Nr   r  rf   r   r   ro   r   r   r   r   r   )r    r,   r4   r)  ri   _n_componentsr   )r   r:   rr   r<   r=   rK  s         r'   test_nmf_n_components_autorQ    s     ))


"C&!A&!A&!A
	C a1"
***r?   c                  <   t         j                  j                  d      } | j                  d      }| j                  d      }| j                  d      }t	        |||dd      \  }}}|j
                  |j
                  k(  sJ |j
                  |j
                  k(  sJ y )Nr   r  rN  rO  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_autorS    s     ))


"C&!Av&Fv&F(	VvH6GAq! 77fll"""77fll"""r?   c                     t         j                  j                  d      } | j                  d      }| j                  d      }t	        ||dd      \  }}}t        ||       |j                  |j                  d   |j                  d   fk(  sJ y )Nr   r  rO  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_updaterU    s     ))


"C&!Av&F(	V&5GAq! Av77qwwqz6<<?3333r?   c                  &   t         j                  j                  d      } | j                  d      }| j                  d      }| j                  d      }t	        j
                  t        d      5  t        ||dd	       d d d        t	        j
                  t        d      5  t        |||dd
       d d d        t	        j
                  t        d      5  t        |||dd
       d d d        y # 1 sw Y   rxY w# 1 sw Y   JxY w# 1 sw Y   y xY w)Nr   r  rN  rO  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_warningrX    s    ))


"C&!Av&Fv&F	@
 T 	#1FS	T 
@
 
 	#6Dv	
	
 
X
 

 	#6E	

 
T T
 

 
s$   .C/!C;D/C8;DDc                     t         j                  j                  d      } | j                  d      }| j                  d      }t	        ddd      }t        j                  t        d      5   |j                  ||| j                  d	      
       d d d        t        j                  t        d      5   |j                  ||| j                  d      
       d d d        y # 1 sw Y   RxY w# 1 sw Y   y xY w)Nr   r  rO  r   r   r4  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_errorrZ    s     ))


"C&!A&!A
18!
<C	z)R	S 5Q#++F345 
z)S	T 5Q#++F345 55 55 5s   +%C!3%C-!C*-C6)MrJ   r@  rG  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+  r2  r:  r>  rC  rL  rQ  rS  rU  rX  rZ  r   r?   r'   <module>ri     sh   	 
       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:$ ;$2 sL&9:+ ;+"#4
>5r?   