a
    h.                     @   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   sZ   d}t d}tjt|d* | f ddd|| W d    n1 sL0    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   Zconvergence_warningA r#   `/var/www/html/assistant/venv/lib/python3.9/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 ]6}tj|d|dd\}}|dk  sV|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 sD0    Y  d}tjt|d t |   W d    n1 s0    Y  tdd	d
| }tjt|d ||   W d    n1 s0    Y  tjt|d  t	|  dd W d    n1 s0    Y  dD ]}t
d|}tjt|d" td|d|  W d    n1 sj0    Y  tjt|d" td|d|  W d    n1 s0    Y  tjt|d t	| d| W d    n1 s0    Y  q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*   r+   zLinit = '{}' can only be used when n_components <= min(n_samples, n_features)   r-   )r   r   r   raises
ValueErrorr   r!   	transformr3   r4   reescapeformatr   )r"   msgZclfr-   r#   r#   r$   test_parameter_checking.   s0    
0,*022rH   c                  C   sl   t jjd} t | dd}tj|ddd\}}t	t 
||| }t	||  }||kshJ d S )Nr&   r'   r)   r@   )r   r(   r/   r0   r1   r2   r3   r4   r   normdotmean)r6   r"   r8   r9   errorZsdevr#   r#   r$   test_initialize_closeQ   s    rM   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  qzd S )	Nr&   r'   r)   r@   r*   r+   r   r,   )	r   r(   r/   r0   r1   r2   r3   r4   r   )
r6   r7   W0H0ZWaZHaZWarZHarrefZevlr#   r#   r$   test_initialize_variants]   s    $rQ   r-   )Nr)   r*   r+   r(   alpha_W)        r;   alpha_H)rS   r;   Zsamec                 C   sl   t jdt dd dt dd f }| f d|||dd|}||}|jdk  sd|dk  rhJ d S )Ng      @r      r   r   )r   r-   rR   rT   r.   )r   Zc_arangefit_transformcomponents_r5   )r   r   r-   rR   rT   r"   modeltransfr#   r#   r$   test_nmf_fit_nn_outputl   s    &
r[   c                 C   sN   t jjd}| d	dddd|}t |dd}||jdk sJJ d S )
Nr&      r+   r   iX  )r-   r.   r   rU   r=   )r\   )r   r(   r/   r0   r1   r2   r!   reconstruction_err_)r   r   r6   ZpnmfXr#   r#   r$   test_nmf_fit_close   s     r_   c                  C   sH  d} d}d}d}d}d}t jjd}t | |g}t || }t|D ]}	||	|   ||	|  |	f< qLt ||g}
t ||}t|D ]}	||	|  |
|	| |	f< qt ||
}t	|d||d	d
}|
|}t ||j}|jdk sJ t|| t|||d	|d}|
|}t ||j}|jdk s6J t||dd d S )N   r'   r\   r   r?     r&   r   r   )r   r   r<   r   r.   r=   )r   r<   
batch_sizer.   r   atol)r   r(   r/   r0   Zzerosr1   r2   rangerJ   r   rW   rX   r]   r
   r   )	n_samples
n_featuresr   r<   rb   r   r6   ZW_trueZW_arrayjH_trueZH_arrayr^   rY   rZ   ZX_calcZmbmodelr#   r#   r$   test_nmf_true_reconstruction   sL    


rj   c                 C   sX   t jjd}t |dd}t| ddddd}||}||}t	||d	d
 d S )Nr&   rU   r\   r?   r(   r   ư>)r   r   r-   r.   r>   r=   rc   )
r   r(   r/   r0   r1   r2   r   rW   rC   r
   )r   r6   r"   mfttr#   r#   r$   test_nmf_transform   s    

ro   c                  C   sR   t jjd} t | dd}tddddd}||}||}t	|| d S )	Nr&   rU   r\   r?   r   MbP?T)r   r.   r>   fresh_restarts)
r   r(   r/   r0   r1   r2   r   rW   rC   r
   )r6   r"   rl   rm   rn   r#   r#   r$   test_minibatch_nmf_transform   s    

rr   c           	      C   s   t jd}t |dd}d}t | | }t |||d }t ||d| }| f |dddd|}|j|||d || d S )	Nr   rU   r\      customrp   r   r-   r.   r>   r8   r9   )	r   r(   r0   r1   r2   sqrtrK   rW   rC   )	r   r   r.   r"   r   ZavgH_initW_initrl   r#   r#   r$   test_nmf_transform_custom_init   s    rz   )r   r   c                 C   sV   t jd}t |dd}t| ddddd}||}||}t||dd d S )	Nr   rU   rs   r(   ra   )r   r   r-   r.   r   r   decimal)	r   r(   r0   r1   r2   r   rW   inverse_transformr   )r   r.   r"   rl   rm   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   rU   rs     r+   T)r.   r   r-   rq   rp   {Gz?)Zrtolrd   )	r   r(   r0   r1   r2   r   rW   r}   r
   )r6   r"   r3   rm   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'   r`   r   r   )r   r.   r>   )r   r(   r/   r0   r1   r2   r!   )r   r6   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< ||}| f dd||dddd|}t|}	||}
|	|}|j	}|	j	}t
|
| t
|| d S )	Nr&   r'   r   r   r\   r(   d   )r   r-   rR   rT   r.   r>   r   )r   r(   r/   r0   r1   r2   rV   r   rW   rX   r
   )r   r   r   rR   rT   r6   r"   ZA_sparseZest1Z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< ||}| f dddd|}||}||}t||dd	 d S )
Nr&   r?   r   r   )r   r   i  )r.   r   r   r=   rc   )	r   r(   r/   r0   r1   r2   rW   rC   r
   )r   r   r   r6   r"   rY   ZA_fit_trZ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   r\   r   r   )r-   r   r   rR   rT   r.   r>   F)	r9   update_Hr-   r   r   rR   rT   r.   r>   )r   r(   r/   r0   r1   r2   rV   r   r   rW   rC   r
   )r-   r   rR   rT   r   r6   r"   ZW_nmfr9   _ZW_nmf_2Zmodel_classZW_clsZ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 sP0    Y  td}tjt|d$ || |  | ddd W d    n1 s0    Y  td}tjt|d& || | d	|  ddd W d    n1 s0    Y  d S )
Nr   z/Negative values in data passed to NMF (input H)r   r   rt   r@   z/Negative values in data passed to NMF (input W)z.Array passed to NMF (input H) is full of zerosr   )r   r   r   rD   rE   r   rA   rB   )r"   ZnnmfrG   r#   r#   r$   (test_non_negative_factorization_checking  s    

2
2
r   c           	      C   s  t ||}|dkr$t| | d S || dk }| | dk }t j|d|d |dkrt |t ||  }|| |   7 }n|dkr|| }t || j t t | }nP||  }||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   rJ   r   maximumsumlogsize)	r^   r8   r9   betaWHZWH_XnonzeroZ	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 ]N}
t|||	|
}t	|||	|
}t	|||	|
}t
||d
d t
||d
d qbd S )N   r'   r\   )rS         ?r;         ?       @g      @r&   r   r   r(   r,      r{   )r   r(   r/   r0   r2   clipr3   r4   r   _beta_divergencer   )r   rf   rg   r   Zbeta_lossesr6   r^   X_csrr8   r9   r   rP   lossZ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'   r\   r?   r&   r   r   r{   )r   r(   r/   r0   r2   r   r1   r3   Z_special_sparse_dotZnonzeroZasarrayZravelr   r   indicesZindptrshape)r   rf   rg   r   r6   r^   r   r8   r9   ZWH_safer   iiZjjZ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 ]}|
 |  }}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'   r\   r=   r   i9  r(   r&   r,   g333333r   皙?r;   r         @rt   Tr   )r-   r   r   r<   r   rR   l1_ratior.   gHz>rc   h㈵>g-C6?)r   r(   r/   r0   r2   r1   r3   r4   copyr   r
   )r   rf   rg   r   alphar   Zn_iterr6   r^   r   rN   rO   r<   r8   r9   r   r   r   r   r   ZW3Z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 ]J}tjt|d ||| W d    n1 s0    Y  ||d | qTdD ]}||| ||| qd S )NrU   r\   r?   r&   r   r   c              	      sH   t | d d|ddd\}}}tt|r0J tt|rDJ d S )Nr(   r   r   ra   )r-   r   r   r<   r.   r   )r   r   r5   isnan)r^   r<   r8   r9   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.)g333333rS   r   r   )r   r;   g333333?r   r   )	r   r(   r/   r0   r2   r   r   rA   rB   )	r   rf   rg   r6   r^   r   r   rG   r<   r#   r   r$   test_nmf_negative_beta_lossE  s     (
r   r<         rS   c                 C   sp   t jd}|jdd}d||dk < t| dd}d}tjt|d || W d   n1 sb0    Y  dS )zDCheck that an error is raised if beta_loss < 0 and X contains zeros.r   rU   r\   )r   )r<   r.   r   r   N)	r   r(   r0   normalr   r   rA   rB   r!   )r<   r6   r^   r3   rG   r#   r#   r$   %test_minibatch_nmf_negative_beta_lossj  s    r   c                 C   st  d}d}d}t jjd}t |||}d}| f |d|dd|}| f |d|dd|}	||}
|	|}|j}|	j}t t j	j
}|
|
|k j}|||k j}|||k j}|||k j}||ksJ ||ksJ d}| f |d|dd|}| f |d|dd|}	||}
|	|}|j}|	j}t|d	 t|d	  t|
d	 t|d	  kspJ d S )
NrU   r\   r?   r&   r;   r   )r   rR   r   r.   rS   r   )r   r(   r/   r0   r1   r2   rW   rX   Zfinfofloat64epsr   r   rI   )r   r   rf   rg   r   r6   r^   r   ZregulrY   ZW_regulZW_modelZH_regulZH_modelr   ZW_regul_n_zerosZW_model_n_zerosZH_regul_n_zerosZH_model_n_zerosr#   r#   r$   test_nmf_regularizationx  sx    



r   c                 C   sN  d}d}d}d}d}d}t jjd}|||}t || tj||ddd	\}	}
d
D ]}| dkrn|dkrnqX|	 |
  }}d }t	dD ]}t
||||d|d|| ||dddd\}}}t|||||| | |   || | |   |d|  | |d    |d|  | |d    }|d urB||ksBJ |}qqXd S )Nr   r`   r'   r=   r   rS   r&   r(   r,   r   r   r   r   rt   r   r   T)r<   r-   r   r   rR   r   r>   r   verboser.   r   )r   r(   r/   r0   r2   r1   r3   r4   r   re   r   r   r   )r   rf   rg   r   r   r   r>   r6   r^   rN   rO   r<   r8   r9   Zprevious_lossr   r   r#   r#   r$   test_nmf_decreasing  sZ    
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(   r0   r1   r2   r3   r   r   )	r6   rf   rg   r   r^   r8   r9   rP   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 | f ddddd	|}|||j|ks^J |	|j|ksrJ |j
j|ksJ d S )
Nr   r   r`   F)r   r   r;   r   )rR   rT   r>   r.   )r   r(   r0   r2   astyper1   r!   rC   ZdtyperW   rX   )r   r   Zdtype_inZ	dtype_outr^   r3   r#   r#   r$   test_nmf_dtype_match  s    r   c                 C   sx   t jddd}t j||d | f ddd|}||t j}| f ddd|}||}t||dd d S )	Nr   2   r   r   rp   )r.   r>   r   rc   )	r   r(   r0   r2   r1   rW   r   float32r
   )r   r   r^   Znmf32ZW32Znmf64Z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 sl0    Y  tjtdd t
||d	d
 W d    n1 s0    Y  d S )Nr   )r   r`   )r`   r`   zshould have the same dtype as Xr   rt   r@   r9   r8   F)r9   r   )r   r(   r0   random_sampler   r   r   rA   	TypeErrorr!   r   )r   r6   r^   r9   r8   r#   r#   r$    test_nmf_custom_init_dtype_error5  s    

4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   r\   r   r   )r   r<   r   r.   r>   rS   )r   r<   r.   r>   max_no_improvementrb   Zforget_factor)r   r(   r/   r0   r1   r2   r   r   r   rW   r
   )r<   r6   r^   r3   Zmbnmfr8   Z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 ]6}	t
|D ](}
|j||
|
|  |d | |d qq|j|jksJ t|j|j d S )Nr&   r   r\   r'   r   rt   r   F)r   r-   r.   r   rb   r>   r   rq   r   r-   r.   r(   rv   )r   r(   r/   r0   r1   r2   r   r3   r4   r!   re   Zpartial_fitZn_steps_r
   rX   )r6   r^   r   rb   r   Zmbnmf1Zmbnmf2r8   r9   irh   r#   r#   r$   test_minibatch_nmf_partial_fita  s2    

(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'   rs   r?   r   c                 S   s   g | ]}d | qS )r3   r#   ).0r   r#   r#   r$   
<listcomp>      z*test_feature_names_out.<locals>.<listcomp>N)
r   r(   r0   r1   r2   r   r!   Zget_feature_names_outr   re   )r.   r^   r3   namesr#   r#   r$   test_feature_names_out  s
    r   c                  C   sP   t jdd} tdddd}tj}t t_z||  W |t_n|t_0 d S )Nr   )r   r'   r   r   )r>   r.   r   )	r   r(   r0   r   r   sysstdoutr   r!   )r"   r3   Z
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 sd0    Y  tjtdd
 |j	||d W d    n1 s0    Y  t
jdd$ t
d |	| W d    n1 s0    Y  tjtdd
 |j	|d W d    n1 s0    Y  d S )Nr&   rU   r\   r?   r(   r   rk   ru   z$Missing required positional argumentr   z$Cannot use both X and Xt. Use X only)r^   XtT)recordrL   zXt was renamed X in version 1.5)r   )r   r(   r0   r1   r2   rW   r   rA   r   r}   warningscatch_warningssimplefilterr    FutureWarning)r   r6   r"   estr^   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   rU   r   r   r\   r   rt   rk   ru   rv   )r   r(   r0   r   rW   Z_n_componentsr   )r   r6   r^   r8   r9   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sRJ |j|jksbJ d S )Nr   r   r   r   rt   r   )r8   r9   r-   r   )r   r(   r0   r   r   r   )r6   r^   ry   rx   r8   r9   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)r9   r   r   )r   r(   r0   r   r   r
   r   )r6   r^   ri   r8   r9   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^0    Y  tjtdd" t|||ddd
 W d    n1 s0    Y  tjtdd" t|||ddd
 W d    n1 s0    Y  d S )Nr   r   r   r   z0When init!='custom', provided W or H are ignoredr   Tr   )r9   r   r   )r8   r9   r   r   z8When update_H=False, the provided initial W is not used.F)r   r(   r0   r   r   r    RuntimeWarningr   )r6   r^   ry   rx   r#   r#   r$   test_nmf_w_h_not_used_warning  s,    


.
$
r   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 sh0    Y  tjtdd& |j||| dd
 W d    n1 s0    Y  d S )Nr   r   r   r   rt   r   z'Array with wrong first dimension passedr   )r\   r   r   z(Array with wrong second dimension passed)rU   r?   )	r   r(   r0   r   r   r   rA   rB   r!   )r6   r^   r9   r3   r#   r#   r$    test_nmf_custom_init_shape_error  s    

4r   )MrD   r   r   ior   numpyr   r   Zscipyr   Zsklearn.baser   Zsklearn.decompositionr   r   r   r   r3   Zsklearn.exceptionsr	   Zsklearn.utils._testingr
   r   r   r   Zsklearn.utils.extmathr   Zsklearn.utils.fixesr   r   markZparametrizer%   r:   filterwarningsrH   rM   rQ   r[   r_   rj   ro   rr   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zint32Zint64r   r   r   r   r   r   r   r   r   r   r   r   r   r#   r#   r#   r$   <module>   s  
		

0



/


N
$

E
4



	


#


