U
    ½mœd4A  ã                	   @   sê  U d dl Z d dlmZmZ d dlZd dlZd dlm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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lmZ egZee ed< egZee ed< ee ZegZee ed< egZ ee ed< ee  Z!dUdd„Z"dd„ Z#d\Z$Z%e&e$e% d ƒZ'e"e$e%e'ƒ\Z(Z)e
j* +dddddg¡dd„ ƒZ,d d!„ Z-d"d#„ Z.d$d%„ Z/d&d'„ Z0d(d)„ Z1e
j* +d*e¡d+d,„ ƒZ2e
j* +d*e¡d-d.„ ƒZ3d/d0„ Z4d1d2„ Z5d3d4„ Z6d5d6„ Z7d7d8„ Z8d9d:„ Z9d;d<„ Z:d=d>„ Z;d?d@„ Z<dAdB„ Z=dCdD„ Z>e
j* +dEe!¡dFdG„ ƒZ?e
j* +dHdI¡e
j* +dJdI¡e
j* +dEe!¡e
j* +dKdLdMg¡dNdO„ ƒƒƒƒZ@e
j* +dEe!¡e
j* +dPejAejAfejBejBfejCejBfejDejBff¡dQdR„ ƒƒZEe
j* +dEe!¡dSdT„ ƒZFdS )Vé    N)ÚListÚAny)Úeuclidean_distances)Újohnson_lindenstrauss_min_dim)Ú_gaussian_random_matrix)Ú_sparse_random_matrix)ÚSparseRandomProjection)ÚGaussianRandomProjection)Úassert_allclose)Úassert_allclose_dense_sparse)Úassert_array_equal)Úassert_almost_equal)Úassert_array_almost_equal)ÚDataDimensionalityWarningÚall_sparse_random_matrixÚall_dense_random_matrixÚall_SparseRandomProjectionÚall_DenseRandomProjectionc                 C   sP   t j |¡}tj| |¡|j| |d�|j||d�ff| |fd�}| ¡ | ¡ fS )N©Úsize)Úshape)	ÚnpÚrandomÚRandomStateÚspZ
coo_matrixZrandnÚrandintÚtoarrayZtocsr)Ú	n_samplesÚ
n_featuresÚ
n_nonzerosÚrandom_stateÚrngZdata_coo© r"   ú]/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/sklearn/tests/test_random_projection.pyÚmake_sparse_random_data#   s    þþø
r$   c                 C   s   t  | ¡s| S |  ¡ S d S ©N)r   Úissparser   )Úmatrixr"   r"   r#   Údensify2   s    
r(   )é
   éè  g      Y@zn_samples, eps)éd   çš™™™™™ñ?)r+   ç        )r+   gš™™™™™¹¿)r   ç      à?c              	   C   s&   t  t¡� t| |d� W 5 Q R X d S )N©Úeps)ÚpytestÚraisesÚ
ValueErrorr   )r   r0   r"   r"   r#   Útest_invalid_jl_domainC   s    r4   c                	   C   sT   t  t¡� tddg ddg d� W 5 Q R X ttjjdddd	�t dd
¡d� d S )Né   r+   é   gÍÌÌÌÌÌì?r/   é   r)   )r)   r)   r   r.   )r1   r2   r3   r   r   r   r   Úfullr"   r"   r"   r#   Útest_input_size_jl_min_dimK   s    " 
ÿr9   c              
   C   s@   dddddg}|D ](\}}t  t¡� | ||ƒ W 5 Q R X qd S )N)r   r   )éÿÿÿÿr7   )r7   r:   )r7   r   )r:   r   ©r1   r2   r3   ©Úrandom_matrixÚinputsÚn_componentsr   r"   r"   r#   Úcheck_input_size_random_matrixW   s    r@   c                 C   s6   ddddg}|D ] \}}| ||ƒj ||fkst‚qd S )N)r7   é   )rA   r7   )rA   rA   )r7   r7   )r   ÚAssertionErrorr<   r"   r"   r#   Úcheck_size_generated^   s    
þrC   c                 C   s<   t | dddd�ƒ}tdt |¡dƒ tdtj |¡dƒ d S )Ni'  r7   r   ©r    r5   ç      ð?)r(   r   r   ÚmeanZlinalgZnorm)r=   ÚAr"   r"   r#   Úcheck_zero_mean_and_unit_normg   s    rH   c              
   C   s:   d\}}dD ](}t  t¡� | |||d� W 5 Q R X qd S )N)rA   r)   )g      ð¿r-   r,   ©Údensityr;   )r=   r?   r   rJ   r"   r"   r#   Ú%check_input_with_sparse_random_matrixq   s    rK   r=   c                 C   s   t | ƒ t| ƒ t| ƒ d S r%   )r@   rC   rH   )r=   r"   r"   r#   Ú$test_basic_property_of_random_matrixy   s    rL   c                 C   s"   t | ƒ tj| dd�}t|ƒ d S )NrE   rI   )rK   Ú	functoolsÚpartialrH   )r=   Zrandom_matrix_denser"   r"   r#   Ú+test_basic_property_of_sparse_random_matrix�   s    rO   c                  C   sF   d} d}t | |dd�}tdt |¡dƒ ttj|dd�d|  dƒ d S )	Nr+   r*   r   rD   r-   r6   r7   ©Zddof)r   r   r   rF   Úvar)r?   r   rG   r"   r"   r#   Útest_gaussian_random_matrixŠ   s
    rR   c               	   C   sî  d} d}dD �]Ú}d| }t | ||dd�}t|ƒ}t |¡}t |¡t | ¡ |ksXt‚t |¡ t | ¡ |ksvt‚|dkr’t |¡dks°t‚nd	|ksžt‚t |¡d
ks°t‚tt |d	k¡dd|  dd� tt |t |¡t | ¡ k¡dd|  dd� tt |t |¡ t | ¡ k¡dd|  dd� ttj	|d	kdd�dd|  d | dd� ttj	|t |¡t | ¡ kdd�ddd|   d d|  dd� ttj	|t |¡ t | ¡ kdd�ddd|   d d|  dd� qd S )Nr+   iô  )g333333Ó?rE   r7   r   )rJ   r    rE   r6   r-   r5   )ÚdecimalrP   )
r   r(   r   ÚuniqueÚsqrtrB   r   r   rF   rQ   )r?   r   rJ   ÚsrG   Úvaluesr"   r"   r#   Útest_sparse_random_matrix˜   sP    
   ÿ
	  
 ÿ 
 ÿ, ý"ýrX   c               
   C   sD   d} dddgg}t D ]*}t t¡� || d� |¡ W 5 Q R X qd S )NÚautor   r7   r6   ©r?   )Úall_RandomProjectionr1   r2   r3   Úfit)r?   Zfit_dataÚRandomProjectionr"   r"   r#   Ú0test_random_projection_transformer_invalid_inputÑ   s
    r^   c               
   C   s4   t D ]*} t t¡� | dd� t¡ W 5 Q R X qd S )NrY   rZ   )r[   r1   r2   r3   Ú	transformÚdata)r]   r"   r"   r#   Ú test_try_to_transform_before_fitÙ   s    ra   c               
   C   sR   t dddƒ\} }tD ]8}|ddd�}d}tjt|d�� | | ¡ W 5 Q R X qd S )Nr*   r+   rY   gš™™™™™¹?)r?   r0   z~eps=0.100000 and n_samples=1000 lead to a target dimension of 5920 which is larger than the original space with n_features=100)Úmatch)r$   r[   r1   r2   r3   r\   )r`   Ú_r]   ÚrpZexpected_msgr"   r"   r#   Ú.test_too_many_samples_to_find_a_safe_embeddingß   s    ÿre   c            
      C   sª   t dddƒ\} }d}t| dd�}| ¡ }|dk}|| }tD ]h}|d|d	d
�}| | ¡}t|dd�}| ¡ }|| }|| }	|	 ¡ d| k s�t‚d| |	 ¡ k s<t‚q<d S )Né   iˆ  i˜:  gš™™™™™É?T)Zsquaredr-   rY   r   )r?   r0   r    r7   )r$   r   Zravelr[   Úfit_transformÚmaxrB   Úmin)
r`   rc   r0   Zoriginal_distancesZnon_identicalr]   rd   Ú	projectedZprojected_distancesZdistances_ratior"   r"   r#   Ú(test_random_projection_embedding_qualityí   s    
rk   c                  C   sž   t D ]”} | dddd�}| t¡ t| t¡tjƒs6t‚t 	t¡}t| |¡tjƒsVt‚| dddd�}| t¡}t| t¡tjƒs„t‚t 
| |¡¡st‚qd S )Nr)   Tr   )r?   Zdense_outputr    F)r   r\   r`   Ú
isinstancer_   r   ZndarrayrB   r   Ú
csr_matrixr&   )ZSparseRandomProjrd   Zsparse_datar"   r"   r#   Ú+test_SparseRandomProj_output_representation  s    


rn   c               
   C   sd  t D �]X} | dddd� t¡}|jdks,t‚|jdks:t‚| tkr^|jdksPt‚t|j	ddƒ |j
jdtfksrt‚| t¡}|jtdfksŽt‚| t¡}t||ƒ | ddd�}| t¡}t||ƒ t t¡�  | td d …d	d
…f ¡ W 5 Q R X | tkr| dddd�}| t¡}|jtdfk�s&t‚|j
jdtfk�s<t‚|j
jdk �sNt‚d|j
jk st‚qd S )NrY   r   r.   )r?   r    r0   én   g¸…ëQ¸ž?r6   )r    r0   r7   rA   r+   gü©ñÒMbP?)r?   rJ   r    és   éU   )r[   r\   r`   r?   rB   Ún_components_r   rJ   r   Zdensity_Úcomponents_r   r   r_   r   r   rg   r1   r2   r3   Znnz)r]   rd   Zprojected_1Zprojected_2Zrp2Zprojected_3rj   r"   r"   r#   Ú2test_correct_RandomProjection_dimensions_embedding   s0    





$
rt   c               
   C   sT   d} t d| t| d ƒƒ\}}tD ].}t t¡� || d d� |¡ W 5 Q R X q d S )Né   rA   é   r7   rZ   )r$   Úintr[   r1   Zwarnsr   r\   )r   r`   rc   r]   r"   r"   r#   Ú1test_warning_n_components_greater_than_n_featuresJ  s
    rx   c                  C   sj   d} t d| t| d ƒƒ\}}tD ]D}|ddd� |¡}|ddd� t |¡¡}tt|jƒt|jƒƒ q d S )Nru   rA   rv   r5   r7   )r?   r    )	r$   rw   r[   r\   r   rm   r   r(   rs   )r   r`   rc   r]   Zrp_denseZ	rp_sparser"   r"   r#   Útest_works_with_sparse_dataS  s    ÿ ÿry   c                   C   s   t ddd�dkst‚dS )zyTest Johnson-Lindenstrauss for small eps.

    Regression test for #17111: before #19374, 32-bit systems would fail.
    r+   çñhãˆµøä>r/   l   JžWN)r   rB   r"   r"   r"   r#   Ú"test_johnson_lindenstrauss_min_dima  s    r{   Úrandom_projection_clsc                    sV   | dd�}|  t¡ | ¡ }| j ¡ ‰ tj‡ fdd„t|jƒD ƒt	d�}t
||ƒ d S )Nr6   rZ   c                    s   g | ]}ˆ › |› �‘qS r"   r"   )Ú.0Úi©Zclass_name_lowerr"   r#   Ú
<listcomp>p  s     z<test_random_projection_feature_names_out.<locals>.<listcomp>)Údtype)r\   r`   Zget_feature_names_outÚ__name__Úlowerr   ÚarrayÚrangerr   Úobjectr   )r|   Úrandom_projectionZ	names_outZexpected_names_outr"   r   r#   Ú(test_random_projection_feature_names_outi  s    


þrˆ   r   )r6   é	   r)   é   r*   r   Úcompute_inverse_componentsTFc              
   C   sâ   d}||||d�}t | || | d d |d�\}}||fD ]¢}	t ¡ �  tjddtd� | |	¡}
W 5 Q R X |r–t|d	ƒs~t‚|j}|j	||fks–t‚| 
|
¡}|j	|	j	ks°t‚| |¡}t|
d
ƒrÌ|
 ¡ }
t|
|ddd� q:d S )Nr)   )r?   r‹   r    r+   r7   rD   Úignorez>The number of components is higher than the number of features)ÚmessageÚcategoryÚinverse_components_r   gH¯¼šò×z>g»½×Ùß|Û=)ZrtolÚatol)r$   ÚwarningsÚcatch_warningsÚfilterwarningsr   rg   ÚhasattrrB   r�   r   Zinverse_transformr_   r   r
   )r   r   r|   r‹   Zglobal_random_seedr?   r‡   ZX_denseZX_csrÚXrj   Zinv_componentsZprojected_backZprojected_againr"   r"   r#   Útest_inverse_transformw  s<    ýü

û


r–   zinput_dtype, expected_dtypec                 C   sT   t j d¡}| dd¡}| dd�}| | |¡¡}|jj|ksBt‚|j|ksPt‚d S )Né*   é   é¸  r   rD   )	r   r   r   Úrandrg   Úastypers   r�   rB   )r|   Zinput_dtypeZexpected_dtyper!   r•   rd   Ztransformedr"   r"   r#   Ú"test_random_projection_dtype_matchª  s    
rœ   c                 C   st   d}t j d¡}| dd¡}| dd�}| dd�}| | t j¡¡}| | t j¡¡}t|||d� t	|j
|j
ƒ d S )Nrz   r—   r˜   r™   r   rD   )r�   )r   r   r   rš   rg   r›   Úfloat32Úfloat64r
   r   rs   )r|   r�   r!   r•   Zrp_32Zrp_64Zprojection_32Zprojection_64r"   r"   r#   Ú,test_random_projection_numerical_consistencyÁ  s    

rŸ   )r   )GrM   Útypingr   r   r‘   Únumpyr   Zscipy.sparseÚsparser   r1   Zsklearn.metricsr   Zsklearn.random_projectionr   r   r   r   r	   Zsklearn.utils._testingr
   r   r   r   r   Zsklearn.exceptionsr   r   Ú__annotations__r   Zall_random_matrixr   r   r[   r$   r(   r   r   rw   r   r`   Zdata_csrÚmarkZparametrizer4   r9   r@   rC   rH   rK   rL   rO   rR   rX   r^   ra   re   rk   rn   rt   rx   ry   r{   rˆ   r–   r�   rž   Zint32Zint64rœ   rŸ   r"   r"   r"   r#   Ú<module>   s’    
 
ÿ
	


9*	
/



üþ	