
    Ug˅              	       z   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mZ d d	lmZ d d
lmZmZ ej                             ddgeddigeddigei gg          d             Z!d Z"ej        #                    dd          d             Z$d Z%d Z& ee'          ej                             ddgeddigeddigei gg          ej                             dd          ej                             dd          ej                             dd          d                                                             Z(ej                             ddgeddigeddigei gg          d             Z)d Z*ej                             dddg          d              Z+d! Z,ej                             ddgeddigeddigei gg          d"             Z-ej                             dd#          d$             Z.ej        #                    d          d%             Z/ej                             deeg          d&             Z0ej                             ddgeddigeddigei gg          ej                             d'eez             ej                             dd          ej                             dd          d(                                                 Z1ej                             ddgeddigeddigei gg          ej                             d)e          d*                         Z2ej        #                    d          ej                             dd+d,g          ej                             dd#          ej                             dd          ej                             dd          d-                                                             Z3d. Z4d/ Z5ej                             d0e          d1             Z6ej                             d0e          d2             Z7 ee          ej                             d0e          d3                         Z8ej                             d0e          d4             Z9ej        #                    d          ej                             d5d6d7g          d8                         Z:ej                             ddgeddigeddigei gg          d9             Z; ee          ej                             dd#          d:                         Z<d; Z=ej        #                    d          ej                             d<ej>        ej>        fej?        ej?        fej@        ej?        fejA        ej?        fg          ej                             ddgeddigeddigei gg          d=                                     ZBej        #                    d          ej                             ddgeddigeddigei gg          d>                         ZCej        #                    d          ej                             deeg          d?                         ZDej                             d5g d@          dA             ZEdB ZFdC ZGej        #                    d          dD             ZHej                             deeg          dE             ZIej                             deeg          dF             ZJdG ZKdH ZLdI ZMdJ ZNdK ZOdS )L    N)StringIO)linalg)clone)NMFMiniBatchNMFnon_negative_factorization)_nmf)ConvergenceWarning)assert_allcloseassert_almost_equalassert_array_almost_equalassert_array_equalignore_warnings)squared_norm)CSC_CONTAINERSCSR_CONTAINERS	Estimatorsolvercdmuc                     d}t          j        d          }t          j        t          |          5   | dddd|                    |           d d d            d S # 1 swxY w Y   d S )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       c/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/sklearn/decomposition/tests/test_nmf.pytest_convergence_warningr)      s     	V  	A	(0C	D	D	D D D	<16<<V<<@@CCCD D D D D D D D D D D D D D D D D Ds   AA"%A"c                  B   t           j        j                            d          } t          j        |                     dd                    }dD ]O}t          j        |d|d          \  }}|dk                                     s|dk                                     rJ Pd S )N*   
   )randomnndsvdnndsvdanndsvdarr   initrandom_state)	r!   r-   mtrandRandomStateabsrandnnmf_initialize_nmfany)rngdatar2   WHs        r(   test_initialize_nn_outputr?   &   s    
)

&
&r
*
*C6#))B##$$D; 4 4"4$QGGG1UKKMM3a!e[[]]33334 4    zbignore:The multiplicative update \('mu'\) solver cannot update zeros present in the initializationz6ignore:The default value of `n_components` will changec                  F   t          j        d          } d}t          j        t          |          5  t          dd                              |            d d d            n# 1 swxY w Y   d}t          j        t          |          5  t                                          |             d d d            n# 1 swxY w Y   t          dd	
                              |           }t          j        t          |          5  |                    |             d d d            n# 1 swxY w Y   t          j        t          |          5  t          j	        |  dd           d d d            n# 1 swxY w Y   dD ]!}t          j        d                    |                    }t          j        t          |          5  t          d|                              |            d d d            n# 1 swxY w Y   t          j        t          |          5  t          d|                              |            d d d            n# 1 swxY w Y   t          j        t          |          5  t          j	        | d|           d d d            n# 1 swxY w Y   #d S )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/   r0   zLinit = '{}' can only be used when n_components <= min(n_samples, n_features)   r2   )r!   r"   r#   raises
ValueErrorr   r%   	transformr8   r9   reescapeformatr   )r'   msgclfr2   s       r(   test_parameter_checkingrP   0   s    	A
TC	z	-	-	- / /43'''++A.../ / / / / / / / / / / / / / /
-C	z	-	-	-  		1"              
aS///

a
 
 C	z	-	-	-  qb              	z	-	-	- - -QB8,,,- - - - - - - - - - - - - - - 2 
, 
,i99?
 
 ]:S111 	% 	%!!!$$$	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	%]:S111 	. 	.&&&**1---	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	.]:S111 	, 	,1d+++	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	,
, 
,s}   %A##A'*A'#B::B>B>D''D+.D+E11E58E5%G44G8	;G8	%II	I	1JJ	J	c                     t           j        j                            d          } t          j        |                     dd                    }t          j        |dd          \  }}t          j	        t          j
        ||          |z
            }t          j	        ||                                z
            }||k    sJ d S )Nr+   r,   r.   rG   )r!   r-   r4   r5   r6   r7   r8   r9   r   normdotmean)r;   r'   r=   r>   errorsdevs         r(   test_initialize_closerW   T   s     )

&
&r
*
*C
syyR  !!Aq"8444DAqKq!q())E;q16688|$$DD======r@   c                     t           j        j                            d          } t          j        |                     dd                    }t          j        |dd          \  }}t          j        |dd          \  }}t          j        |ddd          \  }}||f||f||f||ffD ])\  }}	t          |	|dk             ||dk                        *d S )	Nr+   r,   r.   rG   r/   r0   r   r1   )	r!   r-   r4   r5   r6   r7   r8   r9   r   )
r;   r<   W0H0WaHaWarHarrefevls
             r(   test_initialize_variantsra   `   s     )

&
&r
*
*C6#))B##$$D r999FB r	:::FB"4*1MMMHC"XCy2r(RI> : :SCqM3sax=9999: :r@   )categoryr2   )Nr.   r/   r0   r-   alpha_W)        rB   alpha_H)rd   rB   samec           	      :   t           j        dt          j        dd          z
  dt          j        dd          z   f         } | dd|||dd|}|                    |          }|j        dk                                     s|dk                                     rJ d S )Ng      @r      r   r   )r   r2   rc   re   r3   r    )r!   c_arangefit_transformcomponents_r:   )r   r   r2   rc   re   r'   modeltransfs           r(   test_nmf_fit_nn_outputro   o   s     	cBIaOO#S29Q??%::;AI    E   ##F"Q&++--D&1*1A1A1C1CDDDDDr@   c                     t           j        j                            d          } | 	 d	dddd|}t          j        |                    dd                    }|                    |          j        dk     sJ d S )
Nr+      r0   r   iX  )r2   r3   r   rh   rD   )rq   )r!   r-   r4   r5   r6   r7   r%   reconstruction_err_)r   r   r;   pnmfXs        r(   test_nmf_fit_closeru      s    
 )

&
&r
*
*C9		 
  D 	syyAA88A;;*S000000r@   c                     d} d}d}d}d}d}t           j        j                            d          }t          j        | |g          }t          j        |                    |                     }t          |          D ]}	||	| z           ||	| z  |	f<   t          j        ||g          }
t          j        |                    |                    }t          |          D ]}	||	|z           |
|	|z  |	f<   t          j        ||
          }t          |d||d	
          }|
                    |          }t          j        ||j                  }|j        dk     sJ t          ||           t          |||d	|          }|
                    |          }t          j        ||j                  }|j        dk     sJ t          ||d           d S )N   r,   rq   r   rF     r+   r   r   )r   r   rC   r   r3   rD   )r   rC   
batch_sizer3   r   atol)r!   r-   r4   r5   zerosr6   r7   rangerS   r   rk   rl   rr   r   r   )	n_samples
n_featuresr   rC   ry   r   r;   W_trueW_arrayjH_trueH_arrayrt   rm   rn   X_calcmbmodels                    r(   test_nmf_true_reconstructionr      s    IJLIJH
)

&
&r
*
*CXy,/00FfSYYy))**G<   : :#*1y=#9q9}a  X|Z011FfSYY|,,--G: @ @&-a,.>&?q<"##
vvA!  E   ##FVFE-..F$s****Av!  G ""1%%FVFG/00F&,,,,AvA&&&&&&r@   c                 >   t           j        j                            d          }t          j        |                    dd                    }t          | dddd          }|                    |          }|                    |          }t          ||d	
           d S )Nr+   rh   rq   rF   r-   r   ư>)r   r   r2   r3   rE   rD   rz   )
r!   r-   r4   r5   r6   r7   r   rk   rJ   r   )r   r;   r'   mftts         r(   test_nmf_transformr      s     )

&
&r
*
*C
syyAA	 	 	A 
		B	AAB%%%%%%r@   c                  8   t           j        j                            d          } t          j        |                     dd                    }t          dddd          }|                    |          }|                    |          }t          ||           d S )	Nr+   rh   rq   rF   r   MbP?T)r   r3   rE   fresh_restarts)
r!   r-   r4   r5   r6   r7   r   rk   rJ   r   )r;   r'   r   r   r   s        r(   test_minibatch_nmf_transformr      s     )

&
&r
*
*C
syyAA		 	 	A 
		B	AABr@   c                 
   t           j                            d          }t          j        |                    dd                    }d}t          j        |                                |z            }t          j        ||                    |d          z            }t          j        ||                    d|          z            } | d	|dddd|}|                    |||           |                    |           d S )
Nr   rh   rq      customr   r   r2   r3   rE   r=   r>   r    )	r!   r-   r5   r6   r7   sqrtrT   rk   rJ   )	r   r   r3   r'   r   avgH_initW_initr   s	            r(   test_nmf_transform_custom_initr      s     9((++L
|!!!Q''((AL
'!&&((\)
*
*CVC,,,\1===>>FVC,,,Q===>>F	 	!qd	 	NT	 	A OOA6O***KKNNNNNr@   )r   r   c                 4   t           j                            d          }t          j        |                    dd                    }t          | dddd          }|                    |          }|                    |          }t          ||d           d S )	Nr   rh   r   r-   rx   )r   r   r2   r3   r   r   decimal)	r!   r-   r5   r6   r7   r   rk   inverse_transformr   )r   r3   r'   r   r   A_news         r(   test_nmf_inverse_transformr      s     9((++L
|!!!Q''((A	 	 	A 
		B##Ea222222r@   c                      t           j                            d          } t          j        |                     dd                    }t          | ddd          } |j        |          } |j        |          }t          ||dd	
           d S )Nr   rh   r     r0   T)r3   r   r2   r   r   {Gz?)rtolr{   )	r!   r-   r5   r6   r7   r   rk   r   r   )r;   r'   r8   r   r   s        r(   test_mbnmf_inverse_transformr     s     )


"
"C
syyAA
	  C 
	1		B!C!"%%EAu4d333333r@   c                     t           j        j                            d          }t          j        |                    dd                    } | ddd                              |           d S )Nr+      r,   rw   r   r   )r   r3   rE   )r!   r-   r4   r5   r6   r7   r%   )r   r;   r'   s      r(   $test_n_components_greater_n_featuresr   !  sd     )

&
&r
*
*C
syyR  !!AI2A4888<<Q?????r@   sparse_containerc                    t           j        j                            d          }t          j        |                    dd                    }d|d d dt          j        d          z  f<    ||          } | d	dd||dddd|}t          |          }	|                    |          }
|	                    |          }|j	        }|	j	        }t          |
|           t          ||           d S )
Nr+   r,   r   r   rq   r-   d   )r   r2   rc   re   r3   rE   r   r    )r!   r-   r4   r5   r6   r7   rj   r   rk   rl   r   )r   r   r   rc   re   r;   r'   A_sparseest1est2W1W2H1H2s                 r(   test_nmf_sparse_inputr   )  s    )

&
&r
*
*C
syyR  !!AAaaaRYq\\	""H9 		 	 	 	D ;;D			A		B			H	%	%B		B		BBBr@   csc_containerc                 N   t           j        j                            d          }t          j        |                    dd                    }d|d<    ||          } | d
dddd|}|                    |          }|                    |          }t          ||d	           d S )Nr+   rF   r   r   )r   r   i  )r3   r   r   rD   rz   r    )	r!   r-   r4   r5   r6   r7   rk   rJ   r   )r   r   r   r;   r'   rm   A_fit_trA_trs           r(   test_nmf_sparse_transformr   L  s     )

&
&r
*
*C
syyAAAdGaAIM11sMMfMME""1%%H??1DHd......r@   r-   r.   c                    d}t           j        j                            d          }t          j        |                    dd                    }d|d d dt          j        d          z  f<   t          || ||||dd	          \  }}}	t          ||d
| ||||dd
  
        \  }
}}	t          | ||||dd	          }|	                    |          }|
                    |          }t          ||           t          |
|           d S )Nr   r+   r,   r   r   rq   r   r   )r2   r   r   rc   re   r3   rE   F)	r>   update_Hr2   r   r   rc   re   r3   rE   )r!   r-   r4   r5   r6   r7   rj   r   r   rk   rJ   r   )r2   r   rc   re   r   r;   r'   W_nmfr>   _W_nmf_2model_classW_clsW_cls_2s                 r(   +test_non_negative_factorization_consistencyr   _  sC    H
)

&
&r
*
*C
syyR  !!AAaaaRYq\\	,		 	 	KE1a /	
  MGQ   K %%a((E##A&&GE5!!!GW%%%%%r@   c                  R   t          j        d          } t          }t          j        d          }t          j        t          |          5   || | |  dd           d d d            n# 1 swxY w Y   t          j        d          }t          j        t          |          5   || |  | dd           d d d            n# 1 swxY w Y   t          j        d          }t          j        t          |          5   || | d	| z  dd           d d d            d S # 1 swxY w Y   d S )
Nr   z/Negative values in data passed to NMF (input H)r   r   r   rG   z/Negative values in data passed to NMF (input W)z.Array passed to NMF (input H) is full of zerosr   )r!   r"   r   rK   rL   r#   rH   rI   )r'   nnmfrN   s      r(   (test_non_negative_factorization_checkingr     s    	A%D
)E
F
FC	z	-	-	- ) )QA2qx(((() ) ) ) ) ) ) ) ) ) ) ) ) ) )
)E
F
FC	z	-	-	- ) )QAqx(((() ) ) ) ) ) ) ) ) ) ) ) ) ) )
)D
E
EC	z	-	-	- , ,Q1q5!(++++, , , , , , , , , , , , , , , , , ,s6   A))A-0A-#CCC;DD #D c                    t          j        ||          }|dk    rt          | |z
            dz  S || dk             }| | dk             }t          j        |d|           |dk    rYt          j        |t          j        ||z            z            }||                                |                                 z
  z  }n|dk    rI||z  }t          j        |          | j        z
  t          j        t          j        |                    z
  }ne||z                                  }||dz
  ||z                                  z  z  }|||||dz
  z  z                                  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!   rS   r   maximumsumlogsize)	rt   r=   r>   betaWHWH_Xnonzero	X_nonzeroresdivs	            r(   _beta_divergence_denser     sh   
 
1BqyyAF##a''Q!V*K!q&	IJ{Dk2222qyyfY	K(?!@!@@AArvvxx!%%''!!	+%fSkkAF"RVBF3KK%8%88$##%%qRXNN,,,,tyKD1H$=>CCEEEEttax  Jr@   csr_containerc                    d}d}d}g d}t           j        j                            d          }|                    ||          }t          j        |dd |            | |          }t          j        ||dd	          \  }}	|D ]f}
t          |||	|
          }t          j	        |||	|
          }t          j	        |||	|
          }t          ||d
           t          ||d
           gd S )N   r,   rq   )rd         ?rB         ?       @g      @r+   r   r   r-   r1      r   )r!   r-   r4   r5   r7   clipr8   r9   r   _beta_divergencer   )r   r~   r   r   beta_lossesr;   rt   X_csrr=   r>   r   r_   lossloss_csrs                 r(   test_beta_divergencer     s    IJL000K )

&
&r
*
*C		)Z((AGAq$AM!Eq,XBOOODAq 6 6$Q1d33#Aq!T22'q!T::Cq1111C1555556 6r@   c                    d}d}d}t           j        j                            d          }|                    ||          }t          j        |dd |            | |          }t          j        |                    ||                    }t          j        |                    ||                    }t          j        |||          }	t          j        |||          }
|	                                \  }}t          j
        |	||f                                                   }t          ||
||f         d           t          |	j        |j                   t          |	j        |j                   t          |	j        |j                   d S )Nr,   rq   rF   r+   r   r   r   )r!   r-   r4   r5   r7   r   r6   r8   _special_sparse_dotnonzeroasarrayravelr   r   indicesindptrshape)r   r~   r   r   r;   rt   r   r=   r>   WH_safer   iijjWH_safe_datas                 r(   test_special_sparse_dotr     s_    IJL
)

&
&r
*
*C		)Z((AGAq$AM!E
syyL1122A
syyz2233A%aE22G		 Aq	)	)B ]]__FB:gb"fo..4466LlBr2vJCCCC w666w~u|444w}ek22222r@   c                 X   d}d}d}d}d}d}t           j        j                            d          }|                    ||          }t          j        |          } | |          }	t          j        ||dd	          \  }
}d
D ]%}|
                                |                                }}t          ||||ddd||||d          \  }}}|
                                |                                }}t          |	|||ddd||||d          \  }}}t          ||d           t          ||d           |dz  }|
                                |                                }}t          |	|||ddd||||d          \  }}}t          ||d           t          ||d           'd S )Nr   r,   rq   rD   r   i9  r-   r+   r1   g333333r   皙?rB   r         @r   Tr   )r2   r   r   rC   r   rc   l1_ratior3   gHz>rz   h㈵>g-C6?)r!   r-   r4   r5   r7   r6   r8   r9   copyr   r   )r   r~   r   r   alphar   n_iterr;   rt   r   rY   rZ   rC   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M!E LxbQQQFB2 :+ :+	wwyy"''))1.
 
 
	B  wwyy"''))1.
 
 
	B 	BT****BT**** 	V	wwyy"''))1.
 
 
	B 	BT****BT*****u:+ :+r@   c                   	 d}d}d	t           j        j                            d          }|                    ||          }t          j        |dd |            | |          }	fd}d}d	D ]P}t          j        t          |
          5   |||           d d d            n# 1 swxY w Y    ||dz   |           QdD ]} |||            |||           d S )Nrh   rq   rF   r+   r   r   c           	          t          | dd|dd          \  }}}t          j        t          j        |                    rJ t          j        t          j        |                    rJ d S )Nr-   r   r   rx   )r2   r   r   rC   r3   r   )r   r!   r:   isnan)rt   rC   r=   r>   r   r   s        r(   _assert_nmf_no_nanz7test_nmf_negative_beta_loss.<locals>._assert_nmf_no_nanV  sv    ,%
 
 
1a 6"(1++&&&&&6"(1++&&&&&&&r@   AWhen beta_loss <= 0 and X contains zeros, the solver may diverge.)g333333rd   r   r   )r   rB   g333333?r   r   )	r!   r-   r4   r5   r7   r   r#   rH   rI   )
r   r~   r   r;   rt   r   r   rN   rC   r   s
            @r(   test_nmf_negative_beta_lossr  I  sp    IJL
)

&
&r
*
*C		)Z((AGAq$AM!E' ' ' ' ' NC  0 0	]:S111 	- 	-q),,,	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	-1t8Y////. - -	1i(((5),,,,- -s   B$$B(	+B(	rC         rd   c                 0   t           j                            d          }|                    d          }d||dk     <   t	          | d          }d}t          j        t          |          5   |j        |           ddd           dS # 1 swxY w Y   dS )zDCheck that an error is raised if beta_loss < 0 and X contains zeros.r   rh   rq   )r   )rC   r3   r   r   N)	r!   r-   r5   normalr   r#   rH   rI   r%   )rC   r;   rt   r8   rN   s        r(   %test_minibatch_nmf_negative_beta_lossr  o  s     )


"
"C


AAa!eH

;
;
;C
MC	z	-	-	-  


                 s   -BBBc                    d}d}d}t           j        j                            d          }t          j        |                    ||                    }d} | d
|d|dd|} | d
|d|dd|}	|                    |          }
|	                    |          }|j        }|	j        }t          j        t           j	                  j
        }|
|
|k             j        }|||k             j        }|||k             j        }|||k             j        }||k    sJ ||k    sJ d} | d
|d|dd|} | d
|d|dd|}	|                    |          }
|	                    |          }|j        }|	j        }t          j        |          d	z  t          j        |          d	z  z   t          j        |
          d	z  t          j        |          d	z  z   k    sJ d S )Nrh   rq   rF   r+   rB   r   )r   rc   r   r3   rd   r   r    )r!   r-   r4   r5   r6   r7   rk   rl   finfofloat64epsr   r   rR   )r   r   r~   r   r   r;   rt   r   regulrm   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  ~  sz    IJL
)

&
&r
*
*C
syyJ//00A HI !	 
  E I !	 
  E !!!$$G!!!$$GGG
(2:


"Cgn-2Ogn-2Ogn-2Ogn-2O_,,,,_,,,, HI !	 
  E I !	 
  E !!!$$G!!!$$GGGK  S(FK,@,@S+HHG	LG$$,L- - - - - - -r@   c                 "   d}d}d}d}d}d}t           j        j                            d          }|                    ||          }t          j        ||           t          j        ||dd	          \  }	}
d
D ]}| dk    r|dk    r|	                                |
                                }}d }t          d          D ]}t          ||||d|d|| ||ddd          \  }}}t          j        ||||          ||z  |z  |                                z  z   ||z  |z  |                                z  z   |d|z
  z  |z  |dz                                  z  z   |d|z
  z  |z  |dz                                  z  z   }|||k    sJ |}ːd S )Nr   rw   r,   rD   r   rd   r+   r-   r1   r   r   r   r   r   r   r   T)rC   r2   r   r   rc   r   rE   r   verboser3   r   )r!   r-   r4   r5   r7   r6   r8   r9   r   r}   r   r   r   )r   r~   r   r   r   r   rE   r;   rt   rY   rZ   rC   r=   r>   previous_lossr   r   s                    r(   test_nmf_decreasingr    s    IJLEH
C )

&
&r
*
*C		)Z((AF1aLLL LxbQQQFB2 "! "!	T>>i1nnwwyy"''))1r 	! 	!A0#)!  GAq!$ $Q1i88("Z/!%%''9:("Y.89 1x<(:5A

DE 1x<(941zz||C	D  ($t++++ MM9	!"! "!r@   c                     t           j                            d          } d\  }}}t          j        |                     ||                    dz  }t          j        |                     ||                    dz  }t          j        |                     ||                    }d|d<   t          j        |||d          }d|d<   t          j        |||d          }t          ||           d S )Nr   )r,   r   r   r,   )r   r   rB   )r   g       )r!   r-   r5   r6   r7   r8   r   r   )	r;   r~   r   r   rt   r=   r>   r_   r   s	            r(   test_nmf_underflowr    s    
)


"
"C*2'Iz<
syyJ//0025A
syyL1122R7A
syyz2233AAdG

q!QS
1
1
1CAdG

q!QS
1
1
1CS!!!!!r@   zdtype_in, dtype_outc                    t           j                            d                              dd                              |d          }t          j        ||            | d
ddddd	|} |j        |                              |          j        |k    sJ  |j	        |          j        |k    sJ |j
        j        |k    sJ d S )Nr   r   rw   F)r   r   rB   r   )rc   re   rE   r3   r    )r!   r-   r5   r7   astyper6   r%   rJ   dtyperk   rl   )r   r   dtype_in	dtype_outrt   r8   s         r(   test_nmf_dtype_matchr     s      		a  &&r2..55hU5KKAF1!
) 	 
  C 371::""(I55553Q%2222? I------r@   c                 v   t           j                            d                              dd          }t          j        ||            | d	ddd|}|                    |                    t           j                            } | d	ddd|}|                    |          }t          ||d           d S )
Nr   2   r   r   r   )r3   rE   r   rz   r    )	r!   r-   r5   r7   r6   rk   r  float32r   )r   r   rt   nmf32W32nmf64W64s          r(   $test_nmf_float32_float64_consistencyr(  .  s     		a  &&r1--AF1!I91$99&99E


ahhrz22
3
3CI91$99&99E


a
 
 CC4((((((r@   c                 2   t           j                            d          }|                    d          }|                    d                              t           j                  }|                    d          }t          j        t          d          5   | d          	                    |||           d d d            n# 1 swxY w Y   t          j        t          d          5  t          ||d	
           d d d            d S # 1 swxY w Y   d S )Nr   )r   rw   )rw   rw   zshould have the same dtype as Xr   r   rG   r>   r=   F)r>   r   )r!   r-   r5   random_sampler  r#  r#   rH   	TypeErrorr%   r   )r   r;   rt   r>   r=   s        r(    test_nmf_custom_init_dtype_errorr-  @  s   
 )


"
"C(##A(##**2:66A(##A	y(I	J	J	J 2 2	x   $$Q!q$1112 2 2 2 2 2 2 2 2 2 2 2 2 2 2 
y(I	J	J	J ; ;"1E::::; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;s$   #CC
C
,DDD)r  r   r   r   r   r   r   c           	      r   t           j        j                            d          }t          j        |                    dd                    }t          d| ddd          }t          d| ddd |j        d         d          } |j	        |          }|	                    |          }t          ||           d S )	Nr+   0   rq   r   r   )r   rC   r   r3   rE   rd   )r   rC   r3   rE   max_no_improvementry   forget_factor)r!   r-   r4   r5   r6   r7   r   r   r   rk   r   )rC   r;   rt   r8   mbnmfr=   mbWs          r(   !test_nmf_minibatchnmf_equivalencer4  Q  s     )

&
&r
*
*C
syyQ  A
  C 71:  E 	!A


a
 
 CAsr@   c            
      X   t           j        j                            d          } t          j        |                     dd                    }d}d}d}t          |dd||dd d	          }t          |dd
          }t          j        ||dd
          \  }}|	                    |||           t          |          D ]?}	t          |          D ]-}
|                    ||
|
|z            |d |         |           .@|j        |j        k    sJ t          |j        |j                   d S )Nr+   r   rq   r,   r   r   r   F)r   r2   r3   r   ry   rE   r0  r   r   r2   r3   r-   r   )r!   r-   r4   r5   r6   r7   r   r8   r9   r%   r}   partial_fitn_steps_r   rl   )r;   rt   r   ry   r   mbnmf1mbnmf2r=   r>   ir   s              r(   test_minibatch_nmf_partial_fitr<  m  sf   
)

&
&r
*
*C
syya  !!ALJH!	 	 	F |(QRSSSF 	8!  DAq JJqAJ8__ M Mz"" 	M 	MAqQ^!34+:+!LLLL	M ?fo----F&(:;;;;;r@   c                  F   t           j                            d          } t          j        |                     dd                    }t          d                              |          } |j                    }t          d t          d          D             |           dS )z Check feature names out for NMF.r   r,   r   rF   )r   c                     g | ]}d | S )r8   r    ).0r;  s     r(   
<listcomp>z*test_feature_names_out.<locals>.<listcomp>  s    444a	a		444r@   N)
r!   r-   r5   r6   r7   r   r%   get_feature_names_outr   r}   )r3   rt   r8   namess       r(   test_feature_names_outrC    s    9((++L
|!!"a(())A
1



!
!!
$
$C%C%''E44588444e<<<<<r@   c                  2   t           j                            d                              d          } t	          ddd          }t
          j        }t                      t
          _        	  |j        |            |t
          _        d S # |t
          _        w xY w)Nr   )r   r,   r   r   )rE   r3   r  )	r!   r-   r5   r+  r   sysstdoutr   r%   )r'   r8   
old_stdouts      r(   test_minibatch_nmf_verboserH    s     		a  ..y99A
4a
;
;
;CJCJ 





Z
s   *B Bc                 >   t           j                            d          }t          j        |                    dd                    } | dddd          }|                    |          }t          j        t          d	
          5  |	                                 d d d            n# 1 swxY w Y   t          j        t          d
          5  |	                    ||           d d d            n# 1 swxY w Y   t          j        d          5  t          j        d           |	                    |           d d d            n# 1 swxY w Y   t          j        t          d
          5  |	                    |           d d d            d S # 1 swxY w Y   d S )Nr+   rh   rq   rF   r-   r   r   r   z$Missing required positional argumentr   z$Cannot use both X and Xt. Use X only)rt   XtT)recordrU   zXt was renamed X in version 1.5)rJ  )r!   r-   r5   r6   r7   rk   r#   rH   r,  r   warningscatch_warningssimplefilterr$   FutureWarning)r   r;   r'   estrt   s        r(   )test_NMF_inverse_transform_Xt_deprecationrQ    s   
)


#
#C
syyAA
)	  C 	!A	y(N	O	O	O                                  
y(N	O	O	O ) )a((() ) ) ) ) ) ) ) ) ) ) ) ) ) ) 
	 	-	-	- ! !g&&&a   ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! 
m+L	M	M	M $ $###$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $sH   B((B,/B,C22C69C6*EEE.FFFc                 @   t           j                            d          }|                    d          }|                    d          }|                    d          } | dddd          }|                    |||	           |j        |j        d         k    sJ d S )
Nr   r  rh   r   r   rq   r   r   r   r   r   )r!   r-   r5   r+  rk   _n_componentsr   )r   r;   rt   r=   r>   rP  s         r(   test_nmf_n_components_autorV    s     )


"
"C&!!A&!!A&!!A
)	  C a1"""
******r@   c                  :   t           j                            d          } |                     d          }|                     d          }|                     d          }t	          |||dd          \  }}}|j        |j        k    sJ |j        |j        k    sJ d S )Nr   r  rS  rT  r   r   )r=   r>   r2   r   )r!   r-   r5   r+  r   r   )r;   rt   r   r   r=   r>   r   s          r(   5test_nmf_non_negative_factorization_n_components_autorX    s     )


"
"C&!!Av&&Fv&&F(	VvH6  GAq! 7fl""""7fl""""""r@   c                  "   t           j                            d          } |                     d          }|                     d          }t	          j        t          d          5  t          ||           d d d            d S # 1 swxY w Y   d S )Nr   r  rT  z4The default value of `n_components` will change fromr   )r>   )r!   r-   r5   r+  r#   r$   rO  r   )r;   rt   r>   s      r(   +test_nmf_n_components_default_value_warningrZ    s    
)


"
"C&!!A&!!A	S
 
 
 + + 	#1****+ + + + + + + + + + + + + + + + + +s   %BBBc                  0   t           j                            d          } |                     d          }|                     d          }t	          ||dd          \  }}}t          ||           |j        |j        d         |j        d         fk    sJ d S )Nr   r  rT  r   F)r>   r   r   )r!   r-   r5   r+  r   r   r   )r;   rt   r   r=   r>   r   s         r(   &test_nmf_n_components_auto_no_h_updater\    s     )


"
"C&!!Av&&F(	V&5  GAq! Av7qwqz6<?3333333r@   c                  l   t           j                            d          } |                     d          }|                     d          }|                     d          }t	          j        t          d          5  t          ||dd	           d d d            n# 1 swxY w Y   t	          j        t          d          5  t          |||dd
           d d d            n# 1 swxY w Y   t	          j        t          d          5  t          |||dd
           d d d            d S # 1 swxY w Y   d S )Nr   r  rS  rT  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-   r5   r+  r#   r$   RuntimeWarningr   )r;   rt   r   r   s       r(   test_nmf_w_h_not_used_warningr_    s-    )


"
"C&!!Av&&Fv&&F	@
 
 
 T T 	#1FSSSS	T T T T T T T T T T T T T T T 
@
 
 
 
 
 	#6Dv	
 	
 	
 	
	
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
X
 
 
 
 

 	#6E	
 	
 	
 	

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
s6   :BB!B C!!C%(C%D))D-0D-c                  "   t           j                            d          } |                     d          }|                     d          }t	          ddd          }t          j        t          d          5   |j        |||                     d	          
           d d d            n# 1 swxY w Y   t          j        t          d          5   |j        |||                     d          
           d d d            d S # 1 swxY w Y   d S )Nr   r  rT  r   r   r6  z'Array with wrong first dimension passedr   )rq   r   r*  z(Array with wrong second dimension passed)rh   rF   )	r!   r-   r5   r+  r   r#   rH   rI   r%   )r;   rt   r>   r8   s       r(    test_nmf_custom_init_shape_errorra    s    )


"
"C&!!A&!!A
18!
<
<
<C	z)R	S	S	S 5 5Q#++F3344445 5 5 5 5 5 5 5 5 5 5 5 5 5 5 
z)S	T	T	T 5 5Q#++F3344445 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5s$   7'B**B.1B.'DDD)PrK   rE  rL  ior   numpyr!   r#   scipyr   sklearn.baser   sklearn.decompositionr   r   r   r	   r8   sklearn.exceptionsr
   sklearn.utils._testingr   r   r   r   r   sklearn.utils.extmathr   sklearn.utils.fixesr   r   markparametrizer)   r?   filterwarningsrP   rW   ra   UserWarningro   ru   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-  r4  r<  rC  rH  rQ  rV  rX  rZ  r\  r_  ra  r    r@   r(   <module>rq     s
   				 



                         O O O O O O O O O O - - - - - - 1 1 1 1 1 1              / . . . . . > > > > > > > > (	HdsXt$45b7IJ D D	 D4 4 4 < 
, , 
,>	 	 	: : : +&&&(	HdsXt$45b7IJ  !RSSJ//$677E E 87 0/ TS	  '&E (	HdsXt$45b7IJ 1 1	 1-' -' -'` D$<00& & 10&"    (	HdsXt$45b7IJ  	   <003 3 103" TUU4 4 VU4  sL&9::@ @ ;:@ (	HdsXt$45b7IJ  +^n-LMMJ//$677  87 0/ NM	 8 (	HdsXt$45b7IJ  .99
/ 
/ :9	 

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