o
    dTi.                     @   sV  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ddgeddigeddigei ggdd Z dd Z!ej"ddd Z#dd Z$dd Z%ej"d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 d! Z&ejddgeddigeddigei ggd"d# Z'd$d% Z(ejdddgd&d' Z)d(d) Z*ejddgeddigeddigei ggd*d+ Z+ejdd,d-d. Z,d/d0 Z-ejdeegd1d2 Z.ejddgeddigeddigei ggejd3ee ejddejddd4d5 Z/ejddgeddigeddigei ggejd6ed7d8 Z0ejdd9d:gejdd,ejddejddd;d< Z1d=d> Z2d?d@ Z3ejdAedBdC Z4ejdAedDdE Z5ej"dFejdAedGdH Z6ejdAedIdJ Z7ejdKdLdMgdNdO Z8ejddgeddigeddigei ggdPdQ Z9ej"dFejdd,dRdS Z:dTdU Z;ejdVej<ej<fej=ej=fej>ej=fej?ej=fgejddgeddigeddigei ggdWdX Z@ejddgeddigeddigei ggdYdZ ZAejdeegd[d\ ZBejdKg d]d^d_ ZCd`da ZDdbdc ZEddde ZFejdeegdfdg ZGejdeegdhdi ZHdjdk ZIdldm ZJdndo ZKdpdq ZLdS )r    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                 C   s\   d}t d}tjt|d | dddd|| W d    d S 1 s'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Ar   r   `/home/air/sos-pdf/back/venv/lib/python3.10/site-packages/sklearn/decomposition/tests/test_nmf.pytest_convergence_warning   s   
"r&   c                  C   s`   t jjd} t | dd}dD ]}tj|d|dd\}}|dk  s+|dk  r-J qd S )N*   
   )randomnndsvdnndsvdanndsvdarr   initrandom_state)	r   r)   mtrandRandomStateabsrandnnmf_initialize_nmfany)rngdatar.   WHr   r   r%   test_initialize_nn_output%   s   r;   zbignore:The multiplicative update \('mu'\) solver cannot update zeros present in the initializationc               	   C   s  t d} d}tjt|d tddd|  W d    n1 s"w   Y  d}tjt|d t |   W d    n1 sBw   Y  tdd	d
| }tjt|d ||   W d    n1 shw   Y  tjt|d t	|  dd W d    n1 sw   Y  dD ]h}t
d|}tjt|d td|d|  W d    n1 sw   Y  tjt|d td|d|  W d    n1 sw   Y  tjt|d t	| d| W d    n1 sw   Y  qd 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+   r,   zLinit = '{}' can only be used when n_components <= min(n_samples, n_features)   r.   )r   r   r    raises
ValueErrorr   r"   	transformr4   r5   reescapeformatr   )r$   msgclfr.   r   r   r%   test_parameter_checking.   s@   
rJ   c                  C   sl   t jjd} t | dd}tj|ddd\}}t	t 
||| }t	||  }||ks4J d S )Nr'   r(   r*   rA   )r   r)   r0   r1   r2   r3   r4   r5   r   normdotmean)r7   r$   r9   r:   errorsdevr   r   r%   test_initialize_closeQ   s   rP   c            
      C   s   t jjd} t | dd}tj|ddd\}}tj|ddd\}}tj|dddd\}}||f||f||f||ffD ]\}}	t|	|dk ||dk  q=d S )	Nr'   r(   r*   rA   r+   r,   r   r-   )	r   r)   r0   r1   r2   r3   r4   r5   r   )
r7   r8   W0H0WaHaWarHarrefevlr   r   r%   test_initialize_variants]   s   $rY   r.   )Nr*   r+   r,   r)   alpha_W)        r<   alpha_H)r[   r<   samec                 C   sl   t jdt dd dt dd f }| dd|||dd|}||}|jdk  s2|dk  r4J d S )Ng      @r      r   r   )r   r.   rZ   r\   r/   r   )r   c_arangefit_transformcomponents_r6   )r   r   r.   rZ   r\   r$   modeltransfr   r   r%   test_nmf_fit_nn_outputl   s   &
"re   c                 C   sP   t jjd}| 	d	dddd|}t |dd}||jdk s&J d S )
Nr'      r,   r   iX  )r.   r/   r   r^   r>   )rf   )r   r)   r0   r1   r2   r3   r"   reconstruction_err_)r   r   r7   pnmfXr   r   r%   test_nmf_fit_close   s   rj   c                  C   sF  d} d}d}d}d}d}t jjd}t | |g}t || }t|D ]}	||	|   ||	|  |	f< q&t ||g}
t ||}t|D ]}	||	|  |
|	| |	f< qHt ||
}t	|d||d	d
}|
|}t ||j}|jdk syJ t|| t|||d	|d}|
|}t ||j}|jdk sJ t||dd d S )N   r(   rf   r   r@     r'   r   r   )r   r   r=   r   r/   r>   )r   r=   
batch_sizer/   r   atol)r   r)   r0   r1   zerosr2   r3   rangerL   r   ra   rb   rg   r
   r   )	n_samples
n_featuresr   r=   rm   r   r7   W_trueW_arrayjH_trueH_arrayri   rc   rd   X_calcmbmodelr   r   r%   test_nmf_true_reconstruction   sL   


r{   c                 C   sX   t jjd}t |dd}t| ddddd}||}||}t	||d	d
 d S )Nr'   r^   rf   r@   r)   r   ư>)r   r   r.   r/   r?   r>   rn   )
r   r)   r0   r1   r2   r3   r   ra   rD   r
   )r   r7   r$   mfttr   r   r%   test_nmf_transform   s   

r   c                  C   sR   t jjd} t | dd}tddddd}||}||}t	|| d S )	Nr'   r^   rf   r@   r   MbP?T)r   r/   r?   fresh_restarts)
r   r)   r0   r1   r2   r3   r   ra   rD   r
   )r7   r$   r}   r~   r   r   r   r%   test_minibatch_nmf_transform   s   

r   c           	      C   s   t jd}t |dd}d}t | | }t |||d }t ||d| }| d	|dddd|}|j|||d || d S )
Nr   r^   rf      customr   r   r.   r/   r?   r9   r:   r   )	r   r)   r1   r2   r3   sqrtrM   ra   rD   )	r   r   r/   r$   r   avgH_initW_initr}   r   r   r%   test_nmf_transform_custom_init   s   r   )r   r   c                 C   sV   t jd}t |dd}t| ddddd}||}||}t||dd d S )	Nr   r^   r   r)   rl   )r   r   r.   r/   r   r   decimal)	r   r)   r1   r2   r3   r   ra   inverse_transformr   )r   r/   r$   r}   r~   A_newr   r   r%   test_nmf_inverse_transform   s   

r   c                  C   sV   t jd} t | dd}t| dddd}||}||}t||dd	d
 d S )Nr   r^   r     r,   T)r/   r   r.   r   r   {Gz?)rtolro   )	r   r)   r1   r2   r3   r   ra   r   r
   )r7   r$   r4   r~   r   r   r   r%   test_mbnmf_inverse_transform  s   

r   c                 C   s8   t jjd}t |dd}| dddd| d S )Nr'      r(   rk   r   r   )r   r/   r?   )r   r)   r0   r1   r2   r3   r"   )r   r7   r$   r   r   r%   $test_n_components_greater_n_features  s   r   sparse_containerc              
   C   s   t jjd}t |dd}d|d d dt d f< ||}| d	dd||dddd|}t|}	||}
|	|}|j	}|	j	}t
|
| t
|| d S )
Nr'   r(   r   r   rf   r)   d   )r   r.   rZ   r\   r/   r?   r   r   )r   r)   r0   r1   r2   r3   r`   r   ra   rb   r
   )r   r   r   rZ   r\   r7   r$   A_sparseest1est2W1W2H1H2r   r   r%   test_nmf_sparse_input'  s,   	



r   csc_containerc                 C   sl   t jjd}t |dd}d|d< ||}| d
dddd|}||}||}t||dd	 d S )Nr'   r@   r   r   )r   r   i  )r/   r   r   r>   rn   r   )	r   r)   r0   r1   r2   r3   ra   rD   r
   )r   r   r   r7   r$   rc   A_fit_trA_trr   r   r%   test_nmf_sparse_transformJ  s   

r   r)   r*   c                 C   s   d}t jjd}t |dd}d|d d dt d f< t|| ||||ddd	\}}}	t||d
| ||||ddd
\}
}}	t| ||||ddd	}|	|}|
|}t|| t|
| d S )Nr   r'   r(   r   r   rf   r   r   )r.   r   r   rZ   r\   r/   r?   F)	r:   update_Hr.   r   r   rZ   r\   r/   r?   )r   r)   r0   r1   r2   r3   r`   r   r   ra   rD   r
   )r.   r   rZ   r\   r   r7   r$   W_nmfr:   _W_nmf_2model_classW_clsW_cls_2r   r   r%   +test_non_negative_factorization_consistency\  sN   

	

r   c                  C   s   t d} t}td}tjt|d || | |  ddd W d    n1 s(w   Y  td}tjt|d || |  | ddd W d    n1 sNw   Y  td}tjt|d || | d	|  ddd W d    d S 1 svw   Y  d S )
Nr   z/Negative values in data passed to NMF (input H)r   r   r   rA   z/Negative values in data passed to NMF (input W)z.Array passed to NMF (input H) is full of zerosr   )r   r   r   rE   rF   r    rB   rC   )r$   nnmfrH   r   r   r%   (test_non_negative_factorization_checking  s   



"r   c           	      C   s  t ||}|dkrt| | d S || dk }| | dk }t j|d|d |dkrBt |t ||  }|| |   7 }|S |dkr\|| }t || j t t | }|S ||  }||d ||   7 }|||||d     8 }|||d   }|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   rL   r   maximumsumlogsize)	ri   r9   r:   betaWHWH_Xnonzero	X_nonzeroresdivr   r   r%   _beta_divergence_dense  s&    r   csr_containerc                 C   s   d}d}d}g d}t jjd}|||}t j|dd |d | |}tj||ddd	\}}	|D ]'}
t|||	|
}t	|||	|
}t	|||	|
}t
||d
d t
||d
d q1d S )N   r(   rf   )r[         ?r<         ?       @g      @r'   r   r   r)   r-      r   )r   r)   r0   r1   r3   clipr4   r5   r   _beta_divergencer   )r   rr   rs   r   beta_lossesr7   ri   X_csrr9   r:   r   rW   lossloss_csrr   r   r%   test_beta_divergence  s    r   c                 C   s   d}d}d}t jjd}|||}t j|dd |d | |}t |||}t |||}t|||}	t|||}
|	 \}}t 
|	||f  }t||
||f dd t|	j|j t|	j|j t|	j|j d S )Nr(   rf   r@   r'   r   r   r   )r   r)   r0   r1   r3   r   r2   r4   _special_sparse_dotnonzeroasarrayravelr   r   indicesindptrshape)r   rr   rs   r   r7   ri   r   r9   r:   WH_safer   iijjWH_safe_datar   r   r%   test_special_sparse_dot  s"   r   z-ignore::sklearn.exceptions.ConvergenceWarningc                 C   sP  d}d}d}d}d}d}t jjd}|||}t |}| |}	tj||ddd	\}
}d
D ]v}|
 | }}t	||||ddd||||dd\}}}|
 | }}t	|	|||ddd||||dd\}}}t
||dd t
||dd |d8 }|
 | }}t	|	|||ddd||||dd\}}}t
||dd t
||dd q/d S )Nr   r(   rf   r>   r   i9  r)   r'   r-   g333333r   皙?r<   r         @r   Tr   )r.   r   r   r=   r   rZ   l1_ratior/   gHz>rn   h㈵>g-C6?)r   r)   r0   r1   r3   r2   r4   r5   copyr   r
   )r   rr   rs   r   alphar   n_iterr7   ri   r   rQ   rR   r=   r9   r:   r   r   r   r   r   W3H3r   r   r%   %test_nmf_multiplicative_update_sparse  s~   
r   c           	   	      s   d}d}d t jjd}|||}t j|dd |d | |} fdd}d	}d
D ]%}tjt|d ||| W d    n1 sCw   Y  ||d | q*dD ]}||| ||| qRd S )Nr^   rf   r@   r'   r   r   c              	      sH   t | d d|ddd\}}}tt|rJ tt|r"J d S )Nr)   r   r   rl   )r.   r   r   r=   r/   r   )r   r   r6   isnan)ri   r=   r9   r:   r   r   r   r%   _assert_nmf_no_nanR  s   	z7test_nmf_negative_beta_loss.<locals>._assert_nmf_no_nanAWhen beta_loss <= 0 and X contains zeros, the solver may diverge.)g333333r[   r   r   )r   r<   g333333?r   r   )	r   r)   r0   r1   r3   r   r    rB   rC   )	r   rr   rs   r7   ri   r   r   rH   r=   r   r   r%   test_nmf_negative_beta_lossE  s$   
r   r=         r[   c                 C   sr   t jd}|jdd}d||dk < t| dd}d}tjt|d || W d   dS 1 s2w   Y  dS )zDCheck that an error is raised if beta_loss < 0 and X contains zeros.r   r^   rf   )r   )r=   r/   r   r   N)	r   r)   r1   normalr   r    rB   rC   r"   )r=   r7   ri   r4   rH   r   r   r%   %test_minibatch_nmf_negative_beta_lossj  s   "r   c                 C   sr  d}d}d}t jjd}t |||}d}| d
|d|dd|}| d
|d|dd|}	||}
|	|}|j}|	j}t t j	j
}|
|
|k j}|||k j}|||k j}|||k j}||ksiJ ||ksoJ d}| d
|d|dd|}| d
|d|dd|}	||}
|	|}|j}|	j}t|d	 t|d	  t|
d	 t|d	  ksJ d S )Nr^   rf   r@   r'   r<   r   )r   rZ   r   r/   r[   r   r   )r   r)   r0   r1   r2   r3   ra   rb   finfofloat64epsr   r   rK   )r   r   rr   rs   r   r7   ri   r   regulrc   W_regulW_modelH_regulH_modelr   W_regul_n_zerosW_model_n_zerosH_regul_n_zerosH_model_n_zerosr   r   r%   test_nmf_regularizationx  sx   



r   c                 C   sJ  d}d}d}d}d}d}t jjd}|||}t || tj||ddd	\}	}
d
D ]v}| dkr7|dkr7q,|	 |
 }}d }t	dD ][}t
||||d|d|| ||dddd\}}}t|||||| | |   || | |   |d|  | |d    |d|  | |d    }|d ur||ksJ |}qFq,d S )Nr   rk   r(   r>   r   r[   r'   r)   r-   r   r   r   r   r   r   r   T)r=   r.   r   r   rZ   r   r?   r   verboser/   r   )r   r)   r0   r1   r3   r2   r4   r5   r   rq   r   r   r   )r   rr   rs   r   r   r   r?   r7   ri   rQ   rR   r=   r9   r:   previous_lossr   r   r   r   r%   test_nmf_decreasing  s^   r   c            	      C   s   t jd} d\}}}t | ||d }t | ||d }t | ||}d|d< tj|||dd}d|d< tj|||dd}t|| d S )Nr   )r(   r   r   r(   )r   r   r<   )r   g       )r   r)   r1   r2   r3   r4   r   r   )	r7   rr   rs   r   ri   r9   r:   rW   r   r   r   r%   test_nmf_underflow  s   
r   zdtype_in, dtype_outc                 C   s   t jdddj|dd}t j||d | d
ddddd	|}|||j|ks/J |	|j|ks9J |j
j|ksAJ d S )Nr   r   rk   F)r   r   r<   r   )rZ   r\   r?   r/   r   )r   r)   r1   r3   astyper2   r"   rD   dtypera   rb   )r   r   dtype_in	dtype_outri   r4   r   r   r%   test_nmf_dtype_match  s   r   c                 C   sx   t jddd}t j||d | d	ddd|}||t j}| d	ddd|}||}t||dd d S )
Nr   2   r   r   r   )r/   r?   r   rn   r   )	r   r)   r1   r3   r2   ra   r   float32r
   )r   r   ri   nmf32W32nmf64W64r   r   r%   $test_nmf_float32_float64_consistency%  s   
r  c                 C   s   t jd}|d}|dt j}|d}tjtdd | ddj	|||d W d    n1 s6w   Y  tjtdd t
||d	d
 W d    d S 1 sUw   Y  d S )Nr   )r   rk   )rk   rk   zshould have the same dtype as Xr   r   rA   r:   r9   F)r:   r   )r   r)   r1   random_sampler   r  r    rB   	TypeErrorr"   r   )r   r7   ri   r:   r9   r   r   r%    test_nmf_custom_init_dtype_error5  s   

"r  )r   r   r   r   r   r   r   c              	   C   sp   t jjd}t |dd}td| dddd}td| ddd |jd dd}|	|}|	|}t
|| d S )	Nr'   0   rf   r   r   )r   r=   r   r/   r?   r[   )r   r=   r/   r?   max_no_improvementrm   forget_factor)r   r)   r0   r1   r2   r3   r   r   r   ra   r
   )r=   r7   ri   r4   mbnmfr9   mbWr   r   r%   !test_nmf_minibatchnmf_equivalenceE  s*   
	
r  c               
   C   s   t jjd} t | dd}d}d}d}t|dd||dd dd	}t|ddd
}tj||ddd
\}}|j	|||d t
|D ]}	t
|D ]}
|j||
|
|  |d | |d qFq@|j|jksdJ t|j|j d S )Nr'   r   rf   r(   r   r   r   F)r   r.   r/   r   rm   r?   r  r   r   r.   r/   r)   r   )r   r)   r0   r1   r2   r3   r   r4   r5   r"   rq   partial_fitn_steps_r
   rb   )r7   ri   r   rm   r   mbnmf1mbnmf2r9   r:   irv   r   r   r%   test_minibatch_nmf_partial_fita  s4   

&r  c                  C   sR   t jd} t | dd}tdd|}| }tdd t	dD | dS )	z Check feature names out for NMF.r   r(   r   r@   r   c                 S   s   g | ]}d | qS )r4   r   ).0r  r   r   r%   
<listcomp>  s    z*test_feature_names_out.<locals>.<listcomp>N)
r   r)   r1   r2   r3   r   r"   get_feature_names_outr   rq   )r/   ri   r4   namesr   r   r%   test_feature_names_out  s
   r  c                  C   sN   t jdd} tdddd}tj}t t_z||  W |t_d S |t_w )Nr   )r   r(   r   r   )r?   r/   r   )	r   r)   r1   r	  r   sysstdoutr   r"   )r$   r4   
old_stdoutr   r   r%   test_minibatch_nmf_verbose  s   r!  c                 C   s*  t jd}t |dd}| ddddd}||}tjtd	d
 |	  W d    n1 s2w   Y  tjtdd
 |j	||d W d    n1 sPw   Y  t
jdd t
d |	| W d    n1 spw   Y  tjtdd
 |j	|d W d    d S 1 sw   Y  d S )Nr'   r^   rf   r@   r)   r   r|   r   z$Missing required positional argumentr   z$Cannot use both X and Xt. Use X only)ri   XtT)recordrN   zXt was renamed X in version 1.5)r"  )r   r)   r1   r2   r3   ra   r    rB   r
  r   warningscatch_warningssimplefilterr!   FutureWarning)r   r7   r$   estri   r   r   r%   )test_NMF_inverse_transform_Xt_deprecation  s,   


"r)  c                 C   sb   t jd}|d}|d}|d}| ddddd}|j|||d	 |j|jd ks/J d S )
Nr   r   r^   r   r   rf   r   r   r|   r   r   )r   r)   r1   r	  ra   _n_componentsr   )r   r7   ri   r9   r:   r(  r   r   r%   test_nmf_n_components_auto  s   


r-  c                  C   sf   t jd} | d}| d}| d}t|||ddd\}}}|j|jks)J |j|jks1J d S )Nr   r   r*  r+  r   r   )r9   r:   r.   r   )r   r)   r1   r	  r   r   )r7   ri   r   r   r9   r:   r   r   r   r%   5test_nmf_non_negative_factorization_n_components_auto  s   



r.  c                  C   sb   t jd} | d}| d}t||ddd\}}}t|| |j|jd |jd fks/J d S )Nr   r   r+  r   F)r:   r   r   )r   r)   r1   r	  r   r
   r   )r7   ri   rw   r9   r:   r   r   r   r%   &test_nmf_n_components_auto_no_h_update  s   


"r/  c                  C   s   t jd} | d}| d}| d}tjtdd t||ddd	 W d    n1 s/w   Y  tjtdd t|||ddd
 W d    n1 sOw   Y  tjtdd t|||ddd
 W d    d S 1 spw   Y  d S )Nr   r   r*  r+  z0When init!='custom', provided W or H are ignoredr   Tr   )r:   r   r   )r9   r:   r   r   z8When update_H=False, the provided initial W is not used.F)r   r)   r1   r	  r    r!   RuntimeWarningr   )r7   ri   r   r   r   r   r%   test_nmf_w_h_not_used_warning  s2   




"r1  c                  C   s   t jd} | d}| d}tdddd}tjtdd |j||| d	d
 W d    n1 s4w   Y  tjtdd |j||| dd
 W d    d S 1 sWw   Y  d S )Nr   r   r+  r   r   r  z'Array with wrong first dimension passedr   )rf   r   r  z(Array with wrong second dimension passed)r^   r@   )	r   r)   r1   r	  r   r    rB   rC   r"   )r7   ri   r:   r4   r   r   r%    test_nmf_custom_init_shape_error  s   

"r2  )MrE   r  r$  ior   numpyr   r    scipyr   sklearn.baser   sklearn.decompositionr   r   r   r   r4   sklearn.exceptionsr	   sklearn.utils._testingr
   r   r   r   sklearn.utils.extmathr   sklearn.utils.fixesr   r   markparametrizer&   r;   filterwarningsrJ   rP   rY   re   rj   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  r  r  r  r!  r)  r-  r.  r/  r1  r2  r   r   r   r%   <module>   s   
		

0



/


N
$


E4



	


#


