U
    ½mœdÊ8  ã                   @   sì  d dl Z d dlZd dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlZd dlmZ d dlmZmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Z ej! "dd¡dd„ ƒZ#d d!„ Z$d"d#„ Z%eej! "dd¡d$d%„ ƒƒZ&ed&d'„ ƒZ'd(d)„ Z(ej! "dd¡d*d+„ ƒZ)ej! "dd¡d,d-„ ƒZ*d.d/„ Z+d0d1„ Z,d2d3„ Z-d4d5„ Z.d6d7„ Z/d8d9„ Z0ej! "d:d;d<d=d>d?g¡d@dA„ ƒZ1dBdC„ Z2ej! "dDdE¡dFdG„ ƒZ3ej! "dDdE¡dHdI„ ƒZ4dS )Jé    N)Ú
block_diag)Ú
csr_matrix)Úpsi)Úassert_array_equal)ÚLatentDirichletAllocation)Ú_dirichlet_expectation_1dÚ_dirichlet_expectation_2d)Úassert_allclose)Úassert_array_almost_equal)Úassert_almost_equal)Ú!if_safe_multiprocessing_with_blas)ÚNotFittedError)ÚStringIOc                  C   s6   d} t jd| td�}|g|  }t|Ž }t|ƒ}| |fS )Né   )r   r   )Údtype)ÚnpÚfullÚintr   r   )Ún_componentsÚblockÚblocksÚX© r   úd/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/sklearn/decomposition/tests/test_online_lda.pyÚ_build_sparse_mtx   s    
r   c                  C   sP   t ƒ \} }d|  }t| ||dd�}t| dd�}| |¡}| |¡}t||ƒ d S )Ng      ð?r   )r   Zdoc_topic_priorZtopic_word_priorÚrandom_state©r   r   )r   r   Úfit_transformr   )r   r   ZpriorÚlda_1Úlda_2Ztopic_distr_1Ztopic_distr_2r   r   r   Útest_lda_default_prior_params%   s    
ü

r    c                  C   s|   t j d¡} tƒ \}}t|dd| d�}| |¡ dddg}|jD ]6}t| ¡ dd … d d d	… ƒ}t	t
|ƒƒ|ks@t‚q@d S )
Nr   é   Úbatch)r   Úevaluate_everyÚlearning_methodr   ©r   r!   é   ©r   é   é   ©é   é   é   éýÿÿÿéÿÿÿÿ©r   ÚrandomÚRandomStater   r   ÚfitÚcomponents_ÚsetÚargsortÚtupleÚsortedÚAssertionError©Úrngr   r   ÚldaÚcorrect_idx_grpsÚ	componentÚtop_idxr   r   r   Útest_lda_fit_batch6   s    
ü


r@   c                  C   s~   t j d¡} tƒ \}}t|ddd| d�}| |¡ dddg}|jD ]6}t| ¡ d	d … d d d
… ƒ}t	t
|ƒƒ|ksBt‚qBd S )Nr   ç      $@r!   Úonline)r   Úlearning_offsetr#   r$   r   r%   r'   r*   r.   r/   r0   r:   r   r   r   Útest_lda_fit_onlineI   s    
û


rD   c                  C   sŠ   t j d¡} tƒ \}}t|dd| d�}tdƒD ]}| |¡ q.dddg}|jD ]6}t| 	¡ d	d … d d d
… ƒ}t
t|ƒƒ|ksNt‚qNd S )Nr   rA   éd   ©r   rC   Útotal_samplesr   r   r%   r'   r*   r.   r/   ©r   r1   r2   r   r   ÚrangeZpartial_fitr4   r5   r6   r7   r8   r9   ©r;   r   r   r<   Úir=   Úcr?   r   r   r   Útest_lda_partial_fit]   s    
ü

rM   c                  C   s~   t j d¡} tƒ \}}t|d| d�}| | ¡ ¡ dddg}|jD ]6}t| 	¡ dd … d d d… ƒ}t
t|ƒƒ|ksBt‚qBd S )	Nr   r"   ©r   r$   r   r%   r'   r*   r.   r/   )r   r1   r2   r   r   r3   Útoarrayr4   r5   r6   r7   r8   r9   r:   r   r   r   Útest_lda_dense_inputq   s    
  ÿ

rP   c                  C   sh   t j d¡} | jddd�}d}t|| d�}| |¡}|dk ¡ sDt‚tt j	|dd	�t  
|jd ¡ƒ d S )
Nr   r)   ©é   é
   ©Úsizer   r   g        r!   ©Zaxis)r   r1   r2   Úrandintr   r   Úanyr9   r
   ÚsumÚonesÚshape)r;   r   r   r<   ÚX_transr   r   r   Útest_lda_transform�   s    
r]   Úmethod)rB   r"   c                 C   sL   t j d¡}|jddd�}td| |d�}| |¡}| |¡}t||dƒ d S )Nr   rS   )é2   rR   rT   r)   rN   r(   )r   r1   r2   rW   r   r   Ú	transformr
   )r^   r;   r   r<   ZX_fitr\   r   r   r   Útest_lda_fit_transform�   s      ÿ

ra   c               	   C   s>   t  dd¡} tƒ }d}tjt|d�� | | ¡ W 5 Q R X d S )N)r)   rS   ç      ð¿z^Negative values in data passed©Úmatch)r   r   r   ÚpytestÚraisesÚ
ValueErrorr3   )r   r<   Úregexr   r   r   Útest_lda_negative_input›   s
    ri   c               	   C   sL   t j d¡} | jddd�}tƒ }d}tjt|d�� | |¡ W 5 Q R X d S )Nr   r(   rQ   rT   z}This LatentDirichletAllocation instance is not fitted yet. Call 'fit' with appropriate arguments before using this estimator.rc   )	r   r1   r2   rW   r   re   rf   r   Ú
perplexity)r;   r   r<   rh   r   r   r   Útest_lda_no_component_error¤   s    ÿrk   c                 C   s~   t ƒ \}}tj d¡}t|d| d|d�}| |¡ dddg}|jD ]6}t| ¡ dd … d d d	… ƒ}t	t
|ƒƒ|ksBt‚qBd S )
Nr   r&   r!   )r   Ún_jobsr$   r#   r   r%   r'   r*   r.   r/   )r   r   r1   r2   r   r3   r4   r5   r6   r7   r8   r9   )r^   r   r   r;   r<   r=   rL   r?   r   r   r   Útest_lda_multi_jobs²   s    
û


rm   c                  C   sŒ   t j d¡} tƒ \}}t|ddd| d�}tdƒD ]}| |¡ q0dddg}|jD ]6}t| 	¡ d	d … d d d
… ƒ}t
t|ƒƒ|ksPt‚qPd S )Nr   r&   ç      @é   )r   rl   rC   rG   r   r%   r'   r*   r.   r/   rH   rJ   r   r   r   Útest_lda_partial_fit_multi_jobsÇ   s    
û

rp   c               	   C   sÎ   t j d¡} |  dd¡}|  dd¡}t jjd|dfd�}t|dd| d	�}| |¡ | jd|d
 |fd�}tjtdd�� | 	||¡ W 5 Q R X | jd||d
 fd�}tjtdd�� | 	||¡ W 5 Q R X d S )Nr   r   r+   rS   r(   rT   rn   rR   rF   r!   zNumber of samplesrc   zNumber of topics)
r   r1   r2   rW   r   r3   re   rf   rg   Z_perplexity_precomp_distr)r;   r   Z	n_samplesr   r<   Zinvalid_n_samplesZinvalid_n_componentsr   r   r   Útest_lda_preplexity_mismatchÜ   s"    ü
rq   c           	      C   s–   t ƒ \}}t|d| ddd�}t|d| ddd�}| |¡ |j|dd�}| |¡ |j|dd�}||ksjt‚|j|dd�}|j|dd�}||ks’t‚d S )	Nr!   rE   r   ©r   Úmax_iterr$   rG   r   rS   F©Zsub_samplingT)r   r   r3   rj   r9   )	r^   r   r   r   r   Úperp_1Úperp_2Zperp_1_subsamplingZperp_2_subsamplingr   r   r   Útest_lda_perplexityó   s.    
ûû

rw   c                 C   sf   t ƒ \}}t|d| ddd�}t|d| ddd�}| |¡ | |¡}| |¡ | |¡}||ksbt‚d S )Nr!   rE   r   rr   rS   )r   r   r   Úscorer9   )r^   r   r   r   r   Zscore_1Zscore_2r   r   r   Útest_lda_score  s(    
ûû



ry   c                  C   sL   t ƒ \} }t| ddddd�}| |¡ | |¡}| | ¡ ¡}t||ƒ d S )Nr!   r"   rE   r   rr   )r   r   r3   rj   rO   r   )r   r   r<   ru   rv   r   r   r   Útest_perplexity_input_format-  s    
û

rz   c                  C   sb   t ƒ \} }t| ddd�}| |¡ |j|dd�}| |¡}t d|t |j¡  ¡}t	||ƒ d S )NrS   r   )r   rs   r   Frt   rb   )
r   r   r3   rj   rx   r   ÚexprY   Údatar   )r   r   r<   Zperplexity_1rx   Zperplexity_2r   r   r   Útest_lda_score_perplexity>  s    
  ÿ

r}   c                  C   sD   t ƒ \} }t| ddddd�}| |¡ |j}| |¡}t||ƒ d S )Nr!   r"   r   )r   rs   r$   r   r#   )r   r   r3   Zbound_rj   r   )r   r   r<   Zperplexity1Zperplexity2r   r   r   Útest_lda_fit_perplexityL  s    
û

r~   c                  C   sR   t  d¡} | t| ƒfD ]6}tdd� |¡}t|jjdd�t  |jj	d ¡ƒ qdS )z+Test LDA on empty document (all-zero rows).)r)   r(   iî  )rs   r   rV   r!   N)
r   Zzerosr   r   r3   r   r4   rY   rZ   r[   )ÚZr   r<   r   r   r   Útest_lda_empty_docsb  s    
 ÿr€   c               	   C   s’   t  ddd¡} t  | ¡}t| d|ƒ t|t  t| ƒtt  | ¡ƒ ¡dd� |  dd¡} tt	| ƒt| ƒtt j| dd	�d
d
…t j
f ƒ ddd� d
S )z9Test Cython version of Dirichlet expectation calculation.iœÿÿÿrS   i'  r   g¬Ò¶OÉƒý;)ÚatolrE   r!   rV   Ng•dyáý¥=gßA:ÜÅ)>)Zrtolr�   )r   ZlogspaceZ
empty_liker   r	   r{   r   rY   Zreshaper   Znewaxis)ÚxZexpectationr   r   r   Útest_dirichlet_expectationl  s    
&&ürƒ   c                 C   s‚   t ƒ \}}t|dd| |dd�}tƒ }tj| }t_z| |¡ W 5 |t_X | ¡  d¡}	| ¡  d¡}
||	ksrt‚||
ks~t‚d S )Nr   r"   r   )r   rs   r$   Úverboser#   r   Ú
rj   )	r   r   r   ÚsysÚstdoutr3   ÚgetvalueÚcountr9   )r„   r#   Úexpected_linesÚexpected_perplexitiesr   r   r<   ÚoutZold_outZn_linesZn_perplexityr   r   r   Úcheck_verbosity|  s$    
úr�   z;verbose,evaluate_every,expected_lines,expected_perplexities)Fr!   r   r   )Fr   r   r   )Tr   r   r   )Tr!   r   r   )Tr&   r   r!   c                 C   s   t | |||ƒ d S )N)r�   )r„   r#   rŠ   r‹   r   r   r   Útest_verbosity“  s    rŽ   c                  C   s>   t ƒ \} }t| d� |¡}| ¡ }tdd„ t| ƒD ƒ|ƒ dS )z6Check feature names out for LatentDirichletAllocation.)r   c                 S   s   g | ]}d |› �‘qS )Zlatentdirichletallocationr   )Ú.0rK   r   r   r   Ú
<listcomp>¨  s     z.test_lda_feature_names_out.<locals>.<listcomp>N)r   r   r3   Zget_feature_names_outr   rI   )r   r   r<   Únamesr   r   r   Útest_lda_feature_names_out¡  s    
 ÿr’   r$   )r"   rB   c                 C   s^   t j d¡}|jdd�j|dd�}tdd| d�}| |¡ |jj|ksJt	‚|j
j|ksZt	‚dS )	z2Check data type preservation of fitted attributes.r   rQ   rT   F)Úcopyr)   ©r   r   r$   N)r   r1   r2   ÚuniformÚastyper   r3   r4   r   r9   Zexp_dirichlet_component_)r$   Zglobal_dtyper;   r   r<   r   r   r   Útest_lda_dtype_match¬  s      ÿ
r—   c                 C   st   t j |¡}|jdd�}| t j¡}td|| d� |¡}td|| d� |¡}t|j	|j	ƒ t| 
|¡| 
|¡ƒ dS )z>Check numerical consistency between np.float32 and np.float64.rQ   rT   r)   r”   N)r   r1   r2   r•   r–   Zfloat32r   r3   r	   r4   r`   )r$   Zglobal_random_seedr;   ZX64ZX32Zlda_64Zlda_32r   r   r   Útest_lda_numerical_consistencyº  s&      ÿþ  ÿþr˜   )5r†   Únumpyr   Zscipy.linalgr   Zscipy.sparser   Zscipy.specialr   Znumpy.testingr   re   Zsklearn.decompositionr   Z&sklearn.decomposition._online_lda_fastr   r   Zsklearn.utils._testingr	   r
   r   r   Zsklearn.exceptionsr   Úior   r   r    r@   rD   rM   rP   r]   ÚmarkZparametrizera   ri   rk   rm   rp   rq   rw   ry   rz   r}   r~   r€   rƒ   r�   rŽ   r’   r—   r˜   r   r   r   r   Ú<module>   sp   
	



ûþ


