o
    i}                     @   s4  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 Z/ejdd9d:gejdd,ejddejddd;d< Z0d=d> Z1d?d@ Z2ejdAedBdC Z3ejdAedDdE Z4ej!dFejdAedGdH Z5ejdAedIdJ Z6ejdKdLdMgdNdO Z7ejddgeddigeddigei ggdPdQ Z8ej!dFejdd,dRdS Z9dTdU 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 Z@ejdeegd[d\ ZAejdKg d]d^d_ ZBd`da ZCdbdc ZDddde ZEejdeegdfdg ZFdhdi ZGdjdk ZHdldm ZIdndo ZJdS )p    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   Zconvergence_warningAr   r   s/var/www/html/eduruby.in/lip-sync/lip-sync-env/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"   	transformr3   r4   reescapeformatr   )r#   msgZclfr-   r   r   r$   test_parameter_checking-   s@   
rH   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)   r@   )r   r(   r/   r0   r1   r2   r3   r4   r   normdotmean)r6   r#   r8   r9   errorZsdevr   r   r$   test_initialize_closeP   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  q=d 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 }| dd|||dd|}||}|jdk  s2|dk  r4J d S )Ng      @r      r   r   )r   r-   rR   rT   r.   r   )r   Zc_arangefit_transformcomponents_r5   )r   r   r-   rR   rT   r#   modeltransfr   r   r$   test_nmf_fit_nn_outputk   s   &
"r[   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   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   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'   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| }| d	|dddd|}|j|||d || d S )
Nr   rU   r\      customrp   r   r-   r.   r>   r8   r9   r   )	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< ||}| d	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(   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< ||}| d
dddd|}||}||}t||dd	 d S )Nr&   r?   r   r   )r   r   i  )r.   r   r   r=   rc   r   )	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_transformI  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 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   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   



"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   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 ]'}
t|||	|
}t	|||	|
}t	|||	|
}t
||d
d t
||d
d q1d 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 ]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'   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 ]%}tjt|d ||| W d    n1 sCw   Y  ||d | q*dD ]}||| ||| qRd S )NrU   r\   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   ra   )r-   r   r   r<   r.   r   )r   r   r5   isnan)r^   r<   r8   r9   r   r   r   r$   _assert_nmf_no_nanQ  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_lossD  s$   
r   r<         rS   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   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_lossi  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 )NrU   r\   r?   r&   r;   r   )r   rR   r   r.   rS   r   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_regularizationw  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   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  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(   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 | d
ddddd	|}|||j|ks/J |	|j|ks9J |j
j|ksAJ d S )Nr   r   r`   F)r   r   r;   r   )rR   rT   r>   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 | d	ddd|}||t j}| d	ddd|}||}t||dd d S )
Nr   2   r   r   rp   )r.   r>   r   rc   r   )	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 s6w   Y  tjtdd t
||d	d
 W d    d S 1 sUw   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_error4  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   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_equivalenceD  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   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_fit`  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'   rs   r?   r   c                 S   s   g | ]}d | qS )r3   r   ).0r   r   r   r$   
<listcomp>  s    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   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(   r0   r   r   sysstdoutr   r"   )r#   r3   Z
old_stdoutr   r   r$   test_minibatch_nmf_verbose  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   Zestr   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   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/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   )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  s2   




"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 s4w   Y  tjtdd |j||| dd
 W d    d S 1 sWw   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   

"r   )KrD   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$   <module>   s    
		

0



/


N
$


E4



	


#

